Repository navigation
Customize
The design lives in Senso's own components and style sheets, over the components it shares with other Layouts built on Kalio (the shared base in components/kalio/). Selldone's commerce logic underneath stays untouched.
-
Name:
BRAND.nameincomponents/kalio/kalio-brand.ts(one line). The browser tab's title and every line that names the shop follow.nullshows the shop's own title. -
Wordmark:
components/senso/SensoWordmark.vuedraws the mark (a rounded square with a soft wave, in the palette's decoration colour) and the name in bold rounded lower case. -
Mark file:
assets/brand/senso-mark.svg(64 × 64): the browser tab's icon, the chat avatar on the order page and the compare page's badge. If you change the mark, change it in both places. Selldone accepts only plain SVG attributes (nostyle).
The header, its panels, the hero slides, the phone menu, the footer's first column and some photo slots are built from families: groups of your categories.
- They are in
FAMILIESincomponents/senso/senso-families.ts. Each family has:-
key: a short id, used in photo file names (hero-audio.webp); -
title: the name in the header ("Audio"); -
line: the hero's second line ("Made to be heard."); -
story: the heading and text of the home's wide card when it tells this family's story; -
match: the words that put a category in this family.
-
- A category joins the first family whose words match its name or title. A category no family claims goes to More. A family with no category is not shown.
-
To rename a family or change its line, edit
FAMILIES. To move a category, add a word from its name to the right family'smatch. - A shop where no category fits any family gets one family per category (up to five) and "More" for the rest.
Each category gets a thin line icon picked by its name and title ("TVs", "Earbuds", "Power station"…), never by its id. The rules are RULES in components/senso/senso-icons.ts; the drawings are KINDS in the same file. An unknown kind gets a generic device. To give a new kind its own icon, add a drawing to KINDS (48 × 48 grid) and a rule to RULES.
Senso has 19 photo slots, listed in one file, components/senso/senso-photos.ts:
| Slots | Size | Where |
|---|---|---|
hero-<family>.webp (5) |
2400 × 1350 | the home's carousel, one slide per family |
feature-wide.webp, lifestyle-wide.webp
|
2400 × 1000 | the home's FEATURED and LIFESTYLE cards |
listing-<family>.webp (5) |
1600 × 900 | the category banner, for every category of the family |
highlight-<family>.webp (5) |
1600 × 1200 | the product page's first Highlights band |
about-hero.webp |
2400 × 1000 | the About banner |
support-hero.webp |
2400 × 800 | the support centre and Contact banners |
<family> is the family's key: tv-display, audio, computing, cameras, storage-power.
-
To add photos: drop the files in
assets/senso/photos/with these exact names (WebP, JPG or PNG with the same base name). Build and release. No code change. - Until a file exists, the slot shows a designed placeholder: a calm tinted panel of the slot's exact shape, a small photo icon and the file name. So you can see where each photo goes.
-
Meanwhile, the hero and About use your wide category photos,
assets/senso/wide-<category name>.webp, when they exist. - Words sit on most photos. Keep the calm side of each photo (the left, for most) dark and quiet. No text, logos or faces.
-
New family? Add its key to
FAMILY_KEYSinsenso-photos.tsto give it its three slots.
-
Your colour or dark mode: one file,
components/senso/senso-theme.settings.ts. See Theme and colours. -
Senso's tokens: the
--sn-*variables at the top ofstyle/senso-skin.scss. A "token" is a named value used everywhere: the teal, the mint tile, the ink, the sale red, the grey ground, the corners (--sn-r18px,--sn-r-tile20px), the font. -
Senso's shapes:
style/senso-brand.scss, loaded last: buttons and chips, the header, photo slots, the hero, the home's tiles, rails, the card, the footer, listing pages, the product page, the support centre and the 404. -
Shared tokens:
style/kalio-tokens.scss: the teal action colour#00736f(named--k-green, the base's name, so every shared component follows), the white page, the grey#f3f5f5listing ground, lines and radii. Vuetify's primary colour (--v-theme-primary) follows the palette, so Selldone's own parts don't show another colour. -
Typeface: Poppins, loaded in
components/kalio/kalio-fonts.ts(from the app, notindex.html). -
Icons: Senso's own thin line icons, in
components/senso/senso-icons.ts. A name with no line icon falls back to Material Symbols Rounded. Only the names in theICONSlist inkalio-fonts.tsare loaded: add a new fallback icon there, or it shows as its name.
| Part | Files |
|---|---|
| Home sections |
components/senso/SensoHome.vue (the order), SensoHero.vue (carousel), SensoShowcase.vue (FEATURED, LIFESTYLE), SensoCollections.vue (tag tabs), SensoRail.vue (DEALS, NEW, "You may also like"), SensoShelf.vue ("Shop the latest"), SensoBlog.vue (STORIES), SensoNewsletter.vue; shared reads and the showcase product rule in senso-home.ts
|
| Families and photo slots |
senso-families.ts, senso-photos.ts, SensoSlot.vue
|
| The product card (home and every listing) |
components/senso/SensoCard.vue; senso-card.ts puts it in place of Selldone's card; deal clocks in senso-clock.ts
|
| The quick-buy sheet (capacities) |
senso-quick.ts, SensoQuickHost.vue, components/kalio/KalioQuickBuy.vue
|
| Header, family panels, footer, drawers, sign-in |
components/kalio/shell/ (KalioHeader.vue, KalioFooter.vue, KalioBasketDrawer.vue, KalioSignIn.vue), components/senso/SensoMegaMenu.vue, SensoWordmark.vue
|
| Category, catalogue, search, offers |
pages/products/StorefrontPageProducts.vue, components/senso/SensoShopTop.vue (banner, kinds chips, toolbar), SensoFilterPanel.vue, senso-listing-loading.ts
|
| Product page |
components/senso/SensoProductOverview.vue, SensoHighlights.vue, SensoSimilar.vue, SensoFbt.vue, pages/product/StorefrontPageProduct.vue
|
| Support centre, Contact, About, Terms, Privacy |
pages/faq/, pages/official/
|
| 404, blog |
pages/errors/404/, pages/blog/
|
| Cart, address sheet, delivery, payment window |
pages/basket/cart/, components/kalio/checkout/, components/kalio/shell/KalioBasketDrawer.vue
|
| Order page |
pages/basket/order/, components/kalio/order/
|
| Buyer account |
components/kalio/account/, pages/user/
|
| Compare |
components/kalio/compare/ (words in compare-skin.ts), pages/comparison/
|
| Styles |
style/senso-skin.scss (tokens and the base dress), style/senso-pages.scss (the pages after the home), style/senso-brand.scss (Senso's own shapes, loaded last, so it wins) |
| Theme |
Your choice: components/senso/senso-theme.settings.ts (see Theme and colours). The palettes, which variables each colour feeds and the dark values are in components/senso/senso-theme.ts. The switcher itself is components/theme-switcher/; its button is in KalioHeader.vue. Dark values for fixed colours come from the build step in vite.config.ts (postcss-dark-tokens). |
SENSO.md explains what Senso changed and why. KALIO.md explains every shared behaviour and each workaround.
- Re-skin, don't replace. Keep Selldone's scripts for the cart, bill, checkout, variants and orders. Change templates and styles.
-
Prefix every class (
sn-…). Short names collide with Selldone's. - Live data only. Never hard-code product names, prices, categories or URLs.
-
No line under any word or icon (only links inside an article's text). Put
text-decoration: noneon the clickable element itself: a card is a link, and its hover line reaches every word inside. - Flat buttons, hover = colour only. No lift, no shadow.
-
Rings and edges inside the box. Draw a selection ring or edge with an inset
box-shadow, never anoutlinethat sits outside. - No half-empty rows. Tile rows hold three or four, wrap two to a row on a phone, or scroll sideways. An odd grid gets an "All products" tile.
-
Icons: Senso's line icons are
<svg class="sn-i">; fallback icons are<span class="sn-ms">. A rule that hidesspanhides those icons too: writespan:not(.sn-ms). -
Sticky needs
overflow: clip..v-applicationhasoverflow: hidden. -
Fixed panels: teleport them to
body. Inside a Vuetify overlay they land off-screen on a phone. -
Never commit inside
modules/*. Keep a fix there as a patch inpatches/.
- Check the phone first: 360 and 390 px wide. Then tablet (768, 1024), laptop (1366, 1440) and desktop (1920).
- Walk through as a shopper: open a family panel, add products from cards (a colour, a capacity), open the drawer and the cart, add an address on the map, fill the checkout up to Pay.
- Hover every link and button: no underline anywhere.
- Check light and dark.
- Look for overlapping or clipped text, off-centre icons, empty boxes, half-empty rows, anything under a fixed bar, and Selldone's default look showing through.
- After the release, run the checks in Build and Upload.