Branding
Make the widget look like part of your store — from picking a colour to full custom CSS.
The widget lives in its own Shadow DOM: your site's CSS cannot break it, and its CSS cannot touch your site. To make it look like yours, use one of three levels. Each builds on the previous one.
Level 1 — settings
Set these in the dashboard under Appearance, with a live preview of the chat, the results and the button. Colours are hex values like #1d4ed8.
| Setting | Values | Notes |
|---|---|---|
mode | light, dark, auto | auto follows the shopper's system theme |
accent | colour | Your brand colour. It marks AI actions, main buttons, active filters and the launcher. We never change it |
accentForeground | colour or empty | Text on the accent. Leave empty and we pick white or near-black, whichever is more readable |
background, foreground | colour or empty | Panel and text colours. Empty means our defaults for the mode. Tag, hover and border shades are derived from them |
radius | 0–32 px | Base corner radius; every other radius scales from it |
font.family | default, system, inherit, custom | default is our Manrope; inherit uses your page's font; custom loads font.url |
font.url | https:// URL of a .woff2 | For custom. https only: browsers do not load an http file on an https page. A variable font is best: one file covers every weight |
logoUrl | URL | The store's logo in the chat header in place of the AI mark: an https image, square, at least 80×80; allow its host in img-src when you have a CSP |
assistantName | text, up to 40 characters | Shown in the chat header |
launcher.enabled | true, false | false hides our button: open the chat from your own with lockstock('open') |
launcher.position | right, left | Which bottom corner |
launcher.offsetX, launcher.offsetY | 0–200 px | Distance from the side and the bottom |
launcher.style | field, pill | How the button looks on computers. field (default) looks like an input showing, one after another, your example queries — set them in the dashboard under Appearance, they also appear under your empty search box; write them the way shoppers ask («a stroller for the plane»). pill is a compact button with the label. On phones both are a round icon button |
launcher.label | text, up to 30 characters | The button's accessible name, the pill's text, and the field's text when you have no examples. Empty means «Спросить ИИ» |
customCss | CSS, up to 20,000 characters | See level 3 |
Level 2 — CSS variables
Override any of these variables from your own stylesheet. No !important is needed: your rules win over the widget's defaults.
The widget has three hosts on your page: [data-lockstock-root] holds suggestions, results, the full-screen search layer and the chat; [data-lockstock-launcher] is the chat button; lockstock-search is the embedded search box. Set brand variables on all three in one rule. Suggestions and results under an embedded box open in [data-lockstock-root], so a colour set only on lockstock-search would leave them in the old one.
[data-lockstock-root],
[data-lockstock-launcher],
lockstock-search {
--lockstock-accent: #0f766e;
--lockstock-accent-foreground: #ffffff;
}
/* Lift the button above a cookie banner */
[data-lockstock-launcher] {
--lockstock-launcher-y: 96px;
}| Variable | On | What it controls |
|---|---|---|
--lockstock-accent | all hosts | The brand colour; soft tints of it are derived automatically |
--lockstock-accent-foreground | all hosts | Text and icons on the brand colour |
--lockstock-background | root, search box | Panels and cards |
--lockstock-foreground | root, search box | Main text |
--lockstock-muted | root, search box | Tags, hover and secondary surfaces |
--lockstock-border | root, search box | Borders |
--lockstock-radius | root, search box | Base corner radius in px |
--lockstock-font | root, search box | Font family stack |
--lockstock-launcher-x | launcher | Distance from the side edge |
--lockstock-launcher-y | launcher | Distance from the bottom edge |
These names are a stable contract: we may add variables, but renaming or removing one is announced in advance.
Level 3 — custom CSS
customCss is applied last inside the widget's Shadow DOM — suggestions, results, the full-screen layers, the chat and every embedded search box — so it can restyle anything there. It does not reach the chat button: style that with levels 1 and 2. Limits: up to 20,000 characters and no @import. Invalid rules are ignored by the browser.
Select elements by these attributes. They are a stable contract, like the variables; class names and the rest of the markup are not.
/* Square product cards with a stronger border in results */
[data-lockstock-results] [data-lockstock-product] {
border-radius: 0;
border-color: var(--lockstock-foreground);
}
/* Hide the chips the AI added on its own */
[data-lockstock-chip="inferred"] {
display: none;
}| Attribute | Values | Element |
|---|---|---|
data-lockstock-suggest | Suggestions list | |
data-lockstock-results | fast, understanding, streaming, done | Search results: the panel on desktop, the list on phones |
data-lockstock-summary | skeleton, streaming, done | The AI's comment above the results |
data-lockstock-chip | active, inferred, removed | A filter chip |
data-lockstock-step | running, done | A step the AI is doing, shown while it understands the query |
data-lockstock-sort | Sort switch | |
data-lockstock-product | A product card, row or mini card. The value is internal: select by presence | |
data-lockstock-callout | reason, tradeoff | «Why it fits» or the honest drawback on a product |
data-lockstock-compare-bar | The «compare» bar | |
data-lockstock-search-overlay | The full-screen search layer on desktop | |
data-lockstock-mobile-search | The full-screen search layer on phones | |
data-lockstock-search-field | Our search input in the full-screen layers | |
data-lockstock-search-box | The content of <lockstock-search> | |
data-lockstock-toast | A confirmation such as «Добавлено в корзину» | |
data-lockstock-chat | The chat panel | |
data-lockstock-welcome | The chat welcome screen | |
data-lockstock-chat-mark | ai, logo | The brand tile in the chat header: the AI mark or your logo |
data-lockstock-message | user, assistant, operator | A chat message |
data-lockstock-chat-text | The consultant's answer text: paragraphs, bold (strong) and lists (ul, ol) | |
data-lockstock-steps | What the consultant did, above an answer | |
data-lockstock-comparison | A comparison table in the chat | |
data-lockstock-reservation | form, submitting, done | The reservation request form |
data-lockstock-handoff | open, taken, closed | The «passed to an operator» card |
data-lockstock-handoff-contact | form, submitting, done | The call-back phone form under the handoff card |
data-lockstock-operator-button | — | The «call an operator» button in the chat header |
data-lockstock-composer | The chat message box | |
data-lockstock-page-chip | «Смотрит: …» bar under the chat header on a product page; the shopper can remove it | |
data-lockstock-try | The «Try at home» entry on a product card, in search and in the chat | |
data-lockstock-visualize | The «Try at home» dialog: consent, photo, frame, result | |
data-lockstock-try-frame | The frame over the shopper's photo that marks where the product goes | |
data-lockstock-photo-input | The photo file input in that dialog |
Experimental
The chat attributes may still change until the consultant is released.