@jelinek/ui 0.5.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/components/OptionTile.svelte +5 -2
  2. package/dist/components/PageHero.svelte +37 -2
  3. package/dist/components/PageHero.svelte.d.ts +9 -0
  4. package/dist/components/commerce/Breadcrumbs.svelte +24 -0
  5. package/dist/components/commerce/Breadcrumbs.svelte.d.ts +11 -0
  6. package/dist/components/commerce/CartDrawer.svelte +128 -0
  7. package/dist/components/commerce/CartDrawer.svelte.d.ts +37 -0
  8. package/dist/components/commerce/CartLineItem.svelte +67 -0
  9. package/dist/components/commerce/CartLineItem.svelte.d.ts +14 -0
  10. package/dist/components/commerce/CheckoutProgress.svelte +49 -0
  11. package/dist/components/commerce/CheckoutProgress.svelte.d.ts +11 -0
  12. package/dist/components/commerce/ConfigSection.svelte +24 -0
  13. package/dist/components/commerce/ConfigSection.svelte.d.ts +11 -0
  14. package/dist/components/commerce/DimensionSlider.svelte +86 -0
  15. package/dist/components/commerce/DimensionSlider.svelte.d.ts +18 -0
  16. package/dist/components/commerce/Drawer.svelte +67 -0
  17. package/dist/components/commerce/Drawer.svelte.d.ts +14 -0
  18. package/dist/components/commerce/FreeShippingBar.svelte +63 -0
  19. package/dist/components/commerce/FreeShippingBar.svelte.d.ts +12 -0
  20. package/dist/components/commerce/Gallery.svelte +192 -0
  21. package/dist/components/commerce/Gallery.svelte.d.ts +27 -0
  22. package/dist/components/commerce/Modal.svelte +63 -0
  23. package/dist/components/commerce/Modal.svelte.d.ts +13 -0
  24. package/dist/components/commerce/OrderSummary.svelte +85 -0
  25. package/dist/components/commerce/OrderSummary.svelte.d.ts +25 -0
  26. package/dist/components/commerce/PriceDisplay.svelte +41 -0
  27. package/dist/components/commerce/PriceDisplay.svelte.d.ts +14 -0
  28. package/dist/components/commerce/ProductHeader.svelte +62 -0
  29. package/dist/components/commerce/ProductHeader.svelte.d.ts +21 -0
  30. package/dist/components/commerce/ProductStickyBar.svelte +42 -0
  31. package/dist/components/commerce/ProductStickyBar.svelte.d.ts +14 -0
  32. package/dist/components/commerce/ProductTabs.svelte +87 -0
  33. package/dist/components/commerce/ProductTabs.svelte.d.ts +18 -0
  34. package/dist/components/commerce/QuantityStepper.svelte +44 -0
  35. package/dist/components/commerce/QuantityStepper.svelte.d.ts +13 -0
  36. package/dist/components/commerce/RatingStars.svelte +39 -0
  37. package/dist/components/commerce/RatingStars.svelte.d.ts +9 -0
  38. package/dist/components/commerce/SideToggle.svelte +79 -0
  39. package/dist/components/commerce/SideToggle.svelte.d.ts +13 -0
  40. package/dist/components/commerce/Skeleton.svelte +10 -0
  41. package/dist/components/commerce/Skeleton.svelte.d.ts +7 -0
  42. package/dist/components/commerce/StickyBar.svelte +27 -0
  43. package/dist/components/commerce/StickyBar.svelte.d.ts +8 -0
  44. package/dist/components/commerce/StockBadge.svelte +45 -0
  45. package/dist/components/commerce/StockBadge.svelte.d.ts +9 -0
  46. package/dist/components/commerce/Toaster.svelte +34 -0
  47. package/dist/components/commerce/Toaster.svelte.d.ts +7 -0
  48. package/dist/components/commerce/TrustBadges.svelte +26 -0
  49. package/dist/components/commerce/TrustBadges.svelte.d.ts +16 -0
  50. package/dist/components/commerce/cart-types.d.ts +12 -0
  51. package/dist/components/commerce/cart-types.js +1 -0
  52. package/dist/components/commerce/money.d.ts +14 -0
  53. package/dist/components/commerce/money.js +26 -0
  54. package/dist/components/commerce/overlay.d.ts +12 -0
  55. package/dist/components/commerce/overlay.js +20 -0
  56. package/dist/components/commerce/toast.d.ts +26 -0
  57. package/dist/components/commerce/toast.js +44 -0
  58. package/dist/index.d.ts +27 -0
  59. package/dist/index.js +27 -0
  60. package/dist/theme/base.css +34 -7
  61. package/dist/theme/extras.css +19 -0
  62. package/package.json +6 -2
@@ -0,0 +1,44 @@
1
+ class ToastStore {
2
+ #items = [];
3
+ #timers = new Map();
4
+ #listeners = new Set();
5
+ /** Plain snapshot, not reactive — re-reading this getter after a mutation sees the update, but
6
+ * nothing re-renders automatically outside a `subscribe()` listener (see below). */
7
+ get items() {
8
+ return this.#items;
9
+ }
10
+ /** Show a toast. Passing an `id` that's already showing replaces its message and resets its timer. */
11
+ show(message, opts = {}) {
12
+ const id = opts.id ?? crypto.randomUUID();
13
+ const existing = this.#timers.get(id);
14
+ if (existing)
15
+ clearTimeout(existing);
16
+ this.#items = [...this.#items.filter((t) => t.id !== id), { id, message }];
17
+ this.#notify();
18
+ this.#timers.set(id, setTimeout(() => this.dismiss(id), opts.duration ?? 3000));
19
+ }
20
+ dismiss(id) {
21
+ const existing = this.#timers.get(id);
22
+ if (existing)
23
+ clearTimeout(existing);
24
+ this.#items = this.#items.filter((t) => t.id !== id);
25
+ this.#timers.delete(id);
26
+ this.#notify();
27
+ }
28
+ /**
29
+ * For Toaster.svelte to mirror `items` into its own reactive state. Returns an unsubscribe fn.
30
+ * Note: `items` is a plain getter, not a Svelte rune — it is NOT reactive outside a subscriber.
31
+ * Reading `toasts.items` directly from a component template will not update on show/dismiss;
32
+ * either call `subscribe()` yourself or route the UI through `<Toaster />`.
33
+ */
34
+ subscribe(listener) {
35
+ this.#listeners.add(listener);
36
+ listener(this.#items);
37
+ return () => this.#listeners.delete(listener);
38
+ }
39
+ #notify() {
40
+ for (const listener of this.#listeners)
41
+ listener(this.#items);
42
+ }
43
+ }
44
+ export const toasts = new ToastStore();
package/dist/index.d.ts CHANGED
@@ -1,33 +1,57 @@
1
1
  export { cn } from './utils/cn.js';
2
2
  export { createChapterNavDock } from './utils/chapter-nav-dock.svelte.js';
3
3
  export { default as Alert } from './components/Alert.svelte';
4
+ export { default as Breadcrumbs } from './components/commerce/Breadcrumbs.svelte';
4
5
  export { default as Button } from './components/Button.svelte';
5
6
  export { default as Card } from './components/Card.svelte';
7
+ export { default as CartDrawer } from './components/commerce/CartDrawer.svelte';
8
+ export { default as CartLineItem } from './components/commerce/CartLineItem.svelte';
9
+ export { type CartLine } from './components/commerce/cart-types.js';
6
10
  export { default as ChapterNav } from './components/ChapterNav.svelte';
7
11
  export { default as Checkbox } from './components/Checkbox.svelte';
12
+ export { default as CheckoutProgress } from './components/commerce/CheckoutProgress.svelte';
8
13
  export { default as CodeCopy } from './components/CodeCopy.svelte';
14
+ export { default as ConfigSection } from './components/commerce/ConfigSection.svelte';
9
15
  export { CONTAINER_CONTEXT } from './components/container-context.js';
10
16
  export { default as Container } from './components/Container.svelte';
11
17
  export { default as ContentLogo } from './components/ContentLogo.svelte';
12
18
  export { default as Demo } from './components/Demo.svelte';
19
+ export { default as DimensionSlider } from './components/commerce/DimensionSlider.svelte';
20
+ export { default as Drawer } from './components/commerce/Drawer.svelte';
13
21
  export { default as Eyebrow } from './components/Eyebrow.svelte';
22
+ export { formatMoney, formatPrice } from './components/commerce/money.js';
23
+ export { default as FreeShippingBar } from './components/commerce/FreeShippingBar.svelte';
24
+ export { default as Gallery } from './components/commerce/Gallery.svelte';
14
25
  export { default as Glass } from './components/Glass.svelte';
15
26
  export { default as Grid } from './components/Grid.svelte';
16
27
  export { default as Label } from './components/Label.svelte';
28
+ export { default as Modal } from './components/commerce/Modal.svelte';
17
29
  export { isActive, type NavItem, type NavGroup } from './components/nav.js';
18
30
  export { default as OptionTile } from './components/OptionTile.svelte';
31
+ export { default as OrderSummary } from './components/commerce/OrderSummary.svelte';
19
32
  export { default as PageHero } from './components/PageHero.svelte';
20
33
  export { default as Pager } from './components/Pager.svelte';
21
34
  export { default as Panel } from './components/Panel.svelte';
22
35
  export { default as PhotoTile } from './components/PhotoTile.svelte';
36
+ export { default as PriceDisplay } from './components/commerce/PriceDisplay.svelte';
23
37
  export { default as ProductCard } from './components/ProductCard.svelte';
38
+ export { default as ProductHeader } from './components/commerce/ProductHeader.svelte';
39
+ export { default as ProductStickyBar } from './components/commerce/ProductStickyBar.svelte';
40
+ export { default as ProductTabs } from './components/commerce/ProductTabs.svelte';
41
+ export { default as QuantityStepper } from './components/commerce/QuantityStepper.svelte';
24
42
  export { default as Radio } from './components/Radio.svelte';
43
+ export { default as RatingStars } from './components/commerce/RatingStars.svelte';
25
44
  export { RADIO_CONTEXT, type RadioContext } from './components/radio-context.js';
26
45
  export { default as RadioGroup } from './components/RadioGroup.svelte';
27
46
  export { default as Select } from './components/Select.svelte';
47
+ export { portal } from './components/commerce/overlay.js';
48
+ export { default as SideToggle } from './components/commerce/SideToggle.svelte';
28
49
  export { default as SiteFooter } from './components/SiteFooter.svelte';
29
50
  export { default as SiteHeader } from './components/SiteHeader.svelte';
51
+ export { default as Skeleton } from './components/commerce/Skeleton.svelte';
30
52
  export { default as Slider } from './components/Slider.svelte';
53
+ export { default as StickyBar } from './components/commerce/StickyBar.svelte';
54
+ export { default as StockBadge } from './components/commerce/StockBadge.svelte';
31
55
  export { default as Swatch } from './components/Swatch.svelte';
32
56
  export { default as Tab } from './components/Tab.svelte';
33
57
  export { default as Tabs } from './components/Tabs.svelte';
@@ -36,4 +60,7 @@ export { default as Tag } from './components/Tag.svelte';
36
60
  export { default as TextField } from './components/TextField.svelte';
37
61
  export { default as ThemeToggle } from './components/ThemeToggle.svelte';
38
62
  export { default as Tile } from './components/Tile.svelte';
63
+ export { toasts, type ToastItem } from './components/commerce/toast.js';
64
+ export { default as Toaster } from './components/commerce/Toaster.svelte';
65
+ export { default as TrustBadges } from './components/commerce/TrustBadges.svelte';
39
66
  export { default as TileScroller } from './components/TileScroller.svelte';
package/dist/index.js CHANGED
@@ -1,33 +1,57 @@
1
1
  export { cn } from './utils/cn.js';
2
2
  export { createChapterNavDock } from './utils/chapter-nav-dock.svelte.js';
3
3
  export { default as Alert } from './components/Alert.svelte';
4
+ export { default as Breadcrumbs } from './components/commerce/Breadcrumbs.svelte';
4
5
  export { default as Button } from './components/Button.svelte';
5
6
  export { default as Card } from './components/Card.svelte';
7
+ export { default as CartDrawer } from './components/commerce/CartDrawer.svelte';
8
+ export { default as CartLineItem } from './components/commerce/CartLineItem.svelte';
9
+ export {} from './components/commerce/cart-types.js';
6
10
  export { default as ChapterNav } from './components/ChapterNav.svelte';
7
11
  export { default as Checkbox } from './components/Checkbox.svelte';
12
+ export { default as CheckoutProgress } from './components/commerce/CheckoutProgress.svelte';
8
13
  export { default as CodeCopy } from './components/CodeCopy.svelte';
14
+ export { default as ConfigSection } from './components/commerce/ConfigSection.svelte';
9
15
  export { CONTAINER_CONTEXT } from './components/container-context.js';
10
16
  export { default as Container } from './components/Container.svelte';
11
17
  export { default as ContentLogo } from './components/ContentLogo.svelte';
12
18
  export { default as Demo } from './components/Demo.svelte';
19
+ export { default as DimensionSlider } from './components/commerce/DimensionSlider.svelte';
20
+ export { default as Drawer } from './components/commerce/Drawer.svelte';
13
21
  export { default as Eyebrow } from './components/Eyebrow.svelte';
22
+ export { formatMoney, formatPrice } from './components/commerce/money.js';
23
+ export { default as FreeShippingBar } from './components/commerce/FreeShippingBar.svelte';
24
+ export { default as Gallery } from './components/commerce/Gallery.svelte';
14
25
  export { default as Glass } from './components/Glass.svelte';
15
26
  export { default as Grid } from './components/Grid.svelte';
16
27
  export { default as Label } from './components/Label.svelte';
28
+ export { default as Modal } from './components/commerce/Modal.svelte';
17
29
  export { isActive } from './components/nav.js';
18
30
  export { default as OptionTile } from './components/OptionTile.svelte';
31
+ export { default as OrderSummary } from './components/commerce/OrderSummary.svelte';
19
32
  export { default as PageHero } from './components/PageHero.svelte';
20
33
  export { default as Pager } from './components/Pager.svelte';
21
34
  export { default as Panel } from './components/Panel.svelte';
22
35
  export { default as PhotoTile } from './components/PhotoTile.svelte';
36
+ export { default as PriceDisplay } from './components/commerce/PriceDisplay.svelte';
23
37
  export { default as ProductCard } from './components/ProductCard.svelte';
38
+ export { default as ProductHeader } from './components/commerce/ProductHeader.svelte';
39
+ export { default as ProductStickyBar } from './components/commerce/ProductStickyBar.svelte';
40
+ export { default as ProductTabs } from './components/commerce/ProductTabs.svelte';
41
+ export { default as QuantityStepper } from './components/commerce/QuantityStepper.svelte';
24
42
  export { default as Radio } from './components/Radio.svelte';
43
+ export { default as RatingStars } from './components/commerce/RatingStars.svelte';
25
44
  export { RADIO_CONTEXT } from './components/radio-context.js';
26
45
  export { default as RadioGroup } from './components/RadioGroup.svelte';
27
46
  export { default as Select } from './components/Select.svelte';
47
+ export { portal } from './components/commerce/overlay.js';
48
+ export { default as SideToggle } from './components/commerce/SideToggle.svelte';
28
49
  export { default as SiteFooter } from './components/SiteFooter.svelte';
29
50
  export { default as SiteHeader } from './components/SiteHeader.svelte';
51
+ export { default as Skeleton } from './components/commerce/Skeleton.svelte';
30
52
  export { default as Slider } from './components/Slider.svelte';
53
+ export { default as StickyBar } from './components/commerce/StickyBar.svelte';
54
+ export { default as StockBadge } from './components/commerce/StockBadge.svelte';
31
55
  export { default as Swatch } from './components/Swatch.svelte';
32
56
  export { default as Tab } from './components/Tab.svelte';
33
57
  export { default as Tabs } from './components/Tabs.svelte';
@@ -36,4 +60,7 @@ export { default as Tag } from './components/Tag.svelte';
36
60
  export { default as TextField } from './components/TextField.svelte';
37
61
  export { default as ThemeToggle } from './components/ThemeToggle.svelte';
38
62
  export { default as Tile } from './components/Tile.svelte';
63
+ export { toasts } from './components/commerce/toast.js';
64
+ export { default as Toaster } from './components/commerce/Toaster.svelte';
65
+ export { default as TrustBadges } from './components/commerce/TrustBadges.svelte';
39
66
  export { default as TileScroller } from './components/TileScroller.svelte';
@@ -404,21 +404,36 @@
404
404
  are for page content written in the guide's own markup.
405
405
 
406
406
  The margin shorthand is the guide's: 16px above the bar, 24px below
407
- (var(--space-2) / var(--space-3)). `:has(+ .rule)` also zeroes the
407
+ (var(--space-2) / var(--space-3)). `:has(+ .rule + p)` also zeroes the
408
408
  heading's own margin-bottom, so the bar's margins are the only spacing
409
- in play. */
409
+ in play.
410
+
411
+ Task 46 — UNDERLINE ONLY ABOVE TEXT (the owner's rule): the bar draws
412
+ only when TEXT begins under the heading — a paragraph directly after
413
+ the marker, or a grid whose first cell opens with one (the guide's
414
+ two-column text+photo sections). A heading above a tile, an image or
415
+ cards keeps no bar — the `<hr class="rule">` may stay in the markup,
416
+ it just stops mattering there. Mirrors jelinek.css. */
410
417
  .rule,
411
418
  .rule--magenta,
412
419
  .rule--black,
413
420
  .rule--white {
414
421
  display: none;
415
422
  }
416
- :is(h1, h2, h3):has(+ .rule) {
423
+ :is(h1, h2, h3):has(
424
+ + .rule + p,
425
+ + .rule + .grid > p:first-child,
426
+ + .rule + .grid > :first-child > p:first-child
427
+ ) {
417
428
  width: fit-content;
418
429
  max-width: 100%;
419
430
  margin-bottom: 0;
420
431
  }
421
- :is(h1, h2, h3):has(+ .rule)::after {
432
+ :is(h1, h2, h3):has(
433
+ + .rule + p,
434
+ + .rule + .grid > p:first-child,
435
+ + .rule + .grid > :first-child > p:first-child
436
+ )::after {
422
437
  content: '';
423
438
  display: block;
424
439
  height: 3px;
@@ -427,13 +442,25 @@
427
442
  margin: var(--space-2) 0 var(--space-3);
428
443
  background: var(--JELINEK-BROWN);
429
444
  }
430
- :is(h1, h2, h3):has(+ .rule--magenta)::after {
445
+ :is(h1, h2, h3):has(
446
+ + .rule--magenta + p,
447
+ + .rule--magenta + .grid > p:first-child,
448
+ + .rule--magenta + .grid > :first-child > p:first-child
449
+ )::after {
431
450
  background: var(--JELINEK-MAGENTA);
432
451
  }
433
- :is(h1, h2, h3):has(+ .rule--black)::after {
452
+ :is(h1, h2, h3):has(
453
+ + .rule--black + p,
454
+ + .rule--black + .grid > p:first-child,
455
+ + .rule--black + .grid > :first-child > p:first-child
456
+ )::after {
434
457
  background: var(--JELINEK-BLACK);
435
458
  }
436
- :is(h1, h2, h3):has(+ .rule--white)::after {
459
+ :is(h1, h2, h3):has(
460
+ + .rule--white + p,
461
+ + .rule--white + .grid > p:first-child,
462
+ + .rule--white + .grid > :first-child > p:first-child
463
+ )::after {
437
464
  background: var(--text-white);
438
465
  }
439
466
  }
@@ -1,2 +1,21 @@
1
1
  /* Hand-written theme additions. The generator never touches this file.
2
2
  Import after theme.css. */
3
+
4
+ :root {
5
+ /* WCAG AA text-on-white accents (docs/pro-designera.md): darker L than the
6
+ brand fills, for colored TEXT and links on white. Never replaces the
7
+ brand fills themselves. Upstreamed from the store, where the e-shop
8
+ components (Breadcrumbs, ConfigSection, CheckoutProgress, OrderSummary,
9
+ SideToggle, DimensionSlider) already leaned on them. */
10
+ --color-accent-text: hsl(29 44% 43%);
11
+ --color-accent-text-mattress: hsl(324 100% 44%);
12
+ /* Stock states beyond the semantic success token — StockBadge's
13
+ „na objednávku“/lead orange. */
14
+ --color-stock-order: hsl(35 85% 40%);
15
+ }
16
+
17
+ /* Accent text follows the division: the Zdravý spánek (mattress) subtree
18
+ flips it to magenta, the same way theme.css flips the brand fills. */
19
+ [data-division='mattress'] {
20
+ --color-accent-text: var(--color-accent-text-mattress);
21
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jelinek/ui",
3
- "version": "0.5.2",
3
+ "version": "0.9.0",
4
4
  "description": "JELÍNEK Svelte 5 component kit, generated from the brand guide",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -34,7 +34,11 @@
34
34
  "./theme.css": "./dist/theme/tokens.css",
35
35
  "./extras.css": "./dist/theme/extras.css",
36
36
  "./base.css": "./dist/theme/base.css",
37
- "./fonts.css": "./dist/theme/fonts.css"
37
+ "./fonts.css": "./dist/theme/fonts.css",
38
+ "./money": {
39
+ "types": "./dist/components/commerce/money.d.ts",
40
+ "default": "./dist/components/commerce/money.js"
41
+ }
38
42
  },
39
43
  "scripts": {
40
44
  "dev": "vite dev",