@krizaka/ui 3.24.0 → 3.26.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 (236) hide show
  1. package/README.md +9 -1
  2. package/dist/account-menu.d.ts +163 -0
  3. package/dist/account-menu.js +211 -0
  4. package/dist/account-menu.js.map +1 -0
  5. package/dist/app-shell.js +4 -4
  6. package/dist/changelog-page.d.ts +13 -1
  7. package/dist/changelog-page.js +20 -0
  8. package/dist/changelog-page.js.map +1 -1
  9. package/dist/{chunk-CEJDH6SA.js → chunk-2PNLHZLT.js} +23 -3
  10. package/dist/chunk-2PNLHZLT.js.map +1 -0
  11. package/dist/chunk-3S4GHSPZ.js +109 -0
  12. package/dist/chunk-3S4GHSPZ.js.map +1 -0
  13. package/dist/{chunk-FTX66XZY.js → chunk-BCGJZ5PG.js} +3 -3
  14. package/dist/{chunk-FTX66XZY.js.map → chunk-BCGJZ5PG.js.map} +1 -1
  15. package/dist/chunk-C7LTF5CC.js +21 -0
  16. package/dist/chunk-C7LTF5CC.js.map +1 -0
  17. package/dist/{chunk-F7FVPPBB.js → chunk-LYOPPBMC.js} +2 -2
  18. package/dist/{chunk-AFY35UCB.js → chunk-P7GZR5CU.js} +3 -1
  19. package/dist/{chunk-AFY35UCB.js.map → chunk-P7GZR5CU.js.map} +1 -1
  20. package/dist/code-block.js +1 -1
  21. package/dist/cover-hero.d.ts +125 -0
  22. package/dist/cover-hero.js +82 -0
  23. package/dist/cover-hero.js.map +1 -0
  24. package/dist/data-table.js +2 -2
  25. package/dist/docs-nav.js +3 -16
  26. package/dist/docs-nav.js.map +1 -1
  27. package/dist/dropdown-menu.d.ts +12 -1
  28. package/dist/dropdown-menu.js +25 -2
  29. package/dist/dropdown-menu.js.map +1 -1
  30. package/dist/filter-bar.js +1 -1
  31. package/dist/genui.js +2 -2
  32. package/dist/language-switch.d.ts +120 -0
  33. package/dist/language-switch.js +32 -0
  34. package/dist/language-switch.js.map +1 -0
  35. package/dist/media-gallery.d.ts +73 -0
  36. package/dist/media-gallery.js +42 -0
  37. package/dist/media-gallery.js.map +1 -0
  38. package/dist/nav-bar.d.ts +40 -2
  39. package/dist/nav-bar.js +68 -12
  40. package/dist/nav-bar.js.map +1 -1
  41. package/dist/opening-hours.d.ts +124 -0
  42. package/dist/opening-hours.js +48 -0
  43. package/dist/opening-hours.js.map +1 -0
  44. package/dist/rail-nav.js +1 -1
  45. package/dist/service-card.d.ts +168 -0
  46. package/dist/service-card.js +112 -0
  47. package/dist/service-card.js.map +1 -0
  48. package/dist/site-footer.js +1 -1
  49. package/dist/sites.js +2 -2
  50. package/dist/sites.js.map +1 -1
  51. package/dist/slot-picker.d.ts +119 -0
  52. package/dist/slot-picker.js +46 -0
  53. package/dist/slot-picker.js.map +1 -0
  54. package/dist/sticky-action.d.ts +12 -0
  55. package/dist/sticky-action.js +14 -0
  56. package/dist/sticky-action.js.map +1 -0
  57. package/package.json +121 -7
  58. package/registry/account-menu.json +280 -0
  59. package/registry/achievement.json +1 -1
  60. package/registry/action-bar.json +1 -1
  61. package/registry/activity-feed.json +3 -3
  62. package/registry/alert.json +1 -1
  63. package/registry/app-header.json +1 -1
  64. package/registry/app-shell.json +1 -1
  65. package/registry/argument-card.json +1 -1
  66. package/registry/audio-player.json +1 -1
  67. package/registry/auth-layout.json +1 -1
  68. package/registry/avatar.json +1 -1
  69. package/registry/badge.json +1 -1
  70. package/registry/button.json +1 -1
  71. package/registry/captcha.json +1 -1
  72. package/registry/card-grid.json +1 -1
  73. package/registry/card.json +3 -3
  74. package/registry/catalogue-page.json +1 -1
  75. package/registry/changelog-page.json +3 -3
  76. package/registry/chat.json +1 -1
  77. package/registry/checkbox.json +1 -1
  78. package/registry/chip-link.json +1 -1
  79. package/registry/chip.json +1 -1
  80. package/registry/choice-grid.json +1 -1
  81. package/registry/code-block.json +1 -1
  82. package/registry/combobox.json +1 -1
  83. package/registry/command.json +1 -1
  84. package/registry/comparison-table.json +1 -1
  85. package/registry/component-page.json +1 -1
  86. package/registry/confirm-button.json +1 -1
  87. package/registry/contact-page.json +1 -1
  88. package/registry/continue-prompt.json +1 -1
  89. package/registry/countdown.json +1 -1
  90. package/registry/cover-hero.json +246 -0
  91. package/registry/cta-panel.json +1 -1
  92. package/registry/dashboard-layout.json +1 -1
  93. package/registry/data-table.json +1 -1
  94. package/registry/date-picker.json +1 -1
  95. package/registry/decision-list.json +1 -1
  96. package/registry/description-list.json +1 -1
  97. package/registry/detail-layout.json +1 -1
  98. package/registry/dialog.json +1 -1
  99. package/registry/docs-article-page.json +1 -1
  100. package/registry/docs-hub-page.json +1 -1
  101. package/registry/docs-layout.json +1 -1
  102. package/registry/docs-nav.json +1 -1
  103. package/registry/document-viewer.json +1 -1
  104. package/registry/dropdown-menu.json +33 -3
  105. package/registry/empty-state.json +1 -1
  106. package/registry/error-page.json +1 -1
  107. package/registry/examples/account-menu/default.d.ts +4 -0
  108. package/registry/examples/account-menu/default.js +28 -0
  109. package/registry/examples/account-menu/default.tsx +22 -0
  110. package/registry/examples/cover-hero/plain.d.ts +4 -0
  111. package/registry/examples/cover-hero/plain.js +12 -0
  112. package/registry/examples/cover-hero/plain.tsx +7 -0
  113. package/registry/examples/cover-hero/shop.d.ts +4 -0
  114. package/registry/examples/cover-hero/shop.js +27 -0
  115. package/registry/examples/cover-hero/shop.tsx +20 -0
  116. package/registry/examples/language-switch/inline.d.ts +4 -0
  117. package/registry/examples/language-switch/inline.js +11 -0
  118. package/registry/examples/language-switch/inline.tsx +6 -0
  119. package/registry/examples/language-switch/menu.d.ts +4 -0
  120. package/registry/examples/language-switch/menu.js +11 -0
  121. package/registry/examples/language-switch/menu.tsx +6 -0
  122. package/registry/examples/media-gallery/shop.d.ts +4 -0
  123. package/registry/examples/media-gallery/shop.js +22 -0
  124. package/registry/examples/media-gallery/shop.tsx +18 -0
  125. package/registry/examples/nav-bar/family-product.js +18 -10
  126. package/registry/examples/nav-bar/family-product.tsx +28 -27
  127. package/registry/examples/opening-hours/week.d.ts +4 -0
  128. package/registry/examples/opening-hours/week.js +28 -0
  129. package/registry/examples/opening-hours/week.tsx +22 -0
  130. package/registry/examples/service-card/services.d.ts +4 -0
  131. package/registry/examples/service-card/services.js +15 -0
  132. package/registry/examples/service-card/services.tsx +12 -0
  133. package/registry/examples/slot-picker/times.d.ts +4 -0
  134. package/registry/examples/slot-picker/times.js +27 -0
  135. package/registry/examples/slot-picker/times.tsx +23 -0
  136. package/registry/examples/sticky-action/phone.d.ts +4 -0
  137. package/registry/examples/sticky-action/phone.js +15 -0
  138. package/registry/examples/sticky-action/phone.tsx +14 -0
  139. package/registry/field.json +1 -1
  140. package/registry/file-upload.json +1 -1
  141. package/registry/filter-bar.json +1 -1
  142. package/registry/force-update-screen.json +1 -1
  143. package/registry/form.json +3 -3
  144. package/registry/gallery-page.json +1 -1
  145. package/registry/genui.json +1 -1
  146. package/registry/glow-card.json +1 -1
  147. package/registry/goal-gauge.json +1 -1
  148. package/registry/how-it-works-page.json +1 -1
  149. package/registry/image-cropper.json +1 -1
  150. package/registry/index.json +258 -5
  151. package/registry/iso.json +1 -1
  152. package/registry/kanban.json +1 -1
  153. package/registry/kbd.json +1 -1
  154. package/registry/landing-page.json +1 -1
  155. package/registry/landscape.json +1 -1
  156. package/registry/language-switch.json +246 -0
  157. package/registry/legal-page.json +1 -1
  158. package/registry/link-card.json +3 -3
  159. package/registry/list.json +1 -1
  160. package/registry/loader.json +1 -1
  161. package/registry/longform-page.json +1 -1
  162. package/registry/maintenance-screen.json +1 -1
  163. package/registry/map.json +2 -2
  164. package/registry/markdown.json +1 -1
  165. package/registry/marketing-layout.json +1 -1
  166. package/registry/marquee.json +1 -1
  167. package/registry/mascot-quote.json +1 -1
  168. package/registry/mascot-state.json +1 -1
  169. package/registry/mascots.json +1 -1
  170. package/registry/match-dialog.json +1 -1
  171. package/registry/media-capture.json +3 -3
  172. package/registry/media-gallery.json +144 -0
  173. package/registry/media-grid.json +3 -3
  174. package/registry/meta-row.json +1 -1
  175. package/registry/meter.json +1 -1
  176. package/registry/nav-bar.json +138 -8
  177. package/registry/number-ticker.json +1 -1
  178. package/registry/opening-hours.json +178 -0
  179. package/registry/page-header.json +1 -1
  180. package/registry/page-hero.json +3 -3
  181. package/registry/page.json +7 -7
  182. package/registry/pagination.json +1 -1
  183. package/registry/photo-grid.json +1 -1
  184. package/registry/pointer-light.json +1 -1
  185. package/registry/popover.json +1 -1
  186. package/registry/pricing-page.json +1 -1
  187. package/registry/product-page.json +1 -1
  188. package/registry/profile-card.json +1 -1
  189. package/registry/progress.json +1 -1
  190. package/registry/promise-card.json +1 -1
  191. package/registry/radio-group.json +1 -1
  192. package/registry/rail-nav.json +2 -2
  193. package/registry/recipes.json +1 -1
  194. package/registry/scroll-stage.json +1 -1
  195. package/registry/search-field.json +1 -1
  196. package/registry/section-backdrop.json +1 -1
  197. package/registry/separator.json +1 -1
  198. package/registry/service-card.json +358 -0
  199. package/registry/settings-layout.json +1 -1
  200. package/registry/showcase.json +1 -1
  201. package/registry/site-footer.json +2 -2
  202. package/registry/sites.json +2 -2
  203. package/registry/skeleton.json +3 -3
  204. package/registry/skip-link.json +1 -1
  205. package/registry/slider.json +1 -1
  206. package/registry/slot-picker.json +222 -0
  207. package/registry/slot.json +1 -1
  208. package/registry/spinner.json +1 -1
  209. package/registry/split-view.json +1 -1
  210. package/registry/stage-banner.json +1 -1
  211. package/registry/stat.json +1 -1
  212. package/registry/status-page.json +1 -1
  213. package/registry/step-progress.json +1 -1
  214. package/registry/step-showcase.json +1 -1
  215. package/registry/stepper.json +1 -1
  216. package/registry/sticky-action.json +108 -0
  217. package/registry/swipe-deck.json +1 -1
  218. package/registry/switch.json +1 -1
  219. package/registry/tabs.json +1 -1
  220. package/registry/tag-input.json +1 -1
  221. package/registry/tag-selector.json +1 -1
  222. package/registry/terminal-replay.json +1 -1
  223. package/registry/theme.json +1 -1
  224. package/registry/toast.json +1 -1
  225. package/registry/toc.json +1 -1
  226. package/registry/tooltip.json +1 -1
  227. package/registry/tree-view.json +1 -1
  228. package/registry/update-prompt.json +1 -1
  229. package/registry/verified-badge.json +1 -1
  230. package/registry/vertical-video.json +5 -5
  231. package/registry/video-player.json +3 -3
  232. package/registry/video-trimmer.json +1 -1
  233. package/registry/virtual.json +1 -1
  234. package/registry/waveform.json +1 -1
  235. package/dist/chunk-CEJDH6SA.js.map +0 -1
  236. /package/dist/{chunk-F7FVPPBB.js.map → chunk-LYOPPBMC.js.map} +0 -0
@@ -0,0 +1,124 @@
1
+ import * as tailwind_variants from 'tailwind-variants';
2
+ import * as React from 'react';
3
+
4
+ declare const openingHours: tailwind_variants.TVReturnType<{
5
+ [key: string]: {
6
+ [key: string]: tailwind_variants.ClassValue | {
7
+ root?: tailwind_variants.ClassValue;
8
+ summary?: tailwind_variants.ClassValue;
9
+ dot?: tailwind_variants.ClassValue;
10
+ status?: tailwind_variants.ClassValue;
11
+ state?: tailwind_variants.ClassValue;
12
+ detail?: tailwind_variants.ClassValue;
13
+ today?: tailwind_variants.ClassValue;
14
+ chevron?: tailwind_variants.ClassValue;
15
+ list?: tailwind_variants.ClassValue;
16
+ row?: tailwind_variants.ClassValue;
17
+ day?: tailwind_variants.ClassValue;
18
+ hours?: tailwind_variants.ClassValue;
19
+ };
20
+ };
21
+ } | {
22
+ [x: string]: {
23
+ [x: string]: tailwind_variants.ClassValue | {
24
+ root?: tailwind_variants.ClassValue;
25
+ summary?: tailwind_variants.ClassValue;
26
+ dot?: tailwind_variants.ClassValue;
27
+ status?: tailwind_variants.ClassValue;
28
+ state?: tailwind_variants.ClassValue;
29
+ detail?: tailwind_variants.ClassValue;
30
+ today?: tailwind_variants.ClassValue;
31
+ chevron?: tailwind_variants.ClassValue;
32
+ list?: tailwind_variants.ClassValue;
33
+ row?: tailwind_variants.ClassValue;
34
+ day?: tailwind_variants.ClassValue;
35
+ hours?: tailwind_variants.ClassValue;
36
+ };
37
+ };
38
+ } | {}, {
39
+ root: string;
40
+ summary: string;
41
+ dot: string;
42
+ status: string;
43
+ state: string;
44
+ detail: string;
45
+ today: string;
46
+ chevron: string;
47
+ list: string;
48
+ row: string;
49
+ day: string;
50
+ hours: string;
51
+ }, undefined, {
52
+ [key: string]: {
53
+ [key: string]: tailwind_variants.ClassValue | {
54
+ root?: tailwind_variants.ClassValue;
55
+ summary?: tailwind_variants.ClassValue;
56
+ dot?: tailwind_variants.ClassValue;
57
+ status?: tailwind_variants.ClassValue;
58
+ state?: tailwind_variants.ClassValue;
59
+ detail?: tailwind_variants.ClassValue;
60
+ today?: tailwind_variants.ClassValue;
61
+ chevron?: tailwind_variants.ClassValue;
62
+ list?: tailwind_variants.ClassValue;
63
+ row?: tailwind_variants.ClassValue;
64
+ day?: tailwind_variants.ClassValue;
65
+ hours?: tailwind_variants.ClassValue;
66
+ };
67
+ };
68
+ } | {}, {
69
+ root: string;
70
+ summary: string;
71
+ dot: string;
72
+ status: string;
73
+ state: string;
74
+ detail: string;
75
+ today: string;
76
+ chevron: string;
77
+ list: string;
78
+ row: string;
79
+ day: string;
80
+ hours: string;
81
+ }, tailwind_variants.TVReturnTypeLike<unknown, {
82
+ root: string;
83
+ summary: string;
84
+ dot: string;
85
+ status: string;
86
+ state: string;
87
+ detail: string;
88
+ today: string;
89
+ chevron: string;
90
+ list: string;
91
+ row: string;
92
+ day: string;
93
+ hours: string;
94
+ }>>;
95
+ type OpeningDay = {
96
+ /** A stable id (`mon`, `1`). */
97
+ id: string;
98
+ /** The day's name, translated (`Lundi`). */
99
+ label: string;
100
+ /** The day's hours, formatted by the app (`8 h – 12 h, 13 h – 17 h`); the app's word for closed when there are none. */
101
+ hours: string;
102
+ };
103
+ type OpeningStatus = {
104
+ /** Open at this moment. */
105
+ open: boolean;
106
+ /** The state in words (`Open now`, `Closed`). */
107
+ label: string;
108
+ /** What follows (`closes at 5 pm`, `opens tomorrow at 8 am`). */
109
+ detail?: string;
110
+ };
111
+ type OpeningHoursProps = Omit<React.ComponentProps<"details">, "children"> & {
112
+ /** The week, in reading order. */
113
+ days: readonly OpeningDay[];
114
+ /** The id of today's day: its row is marked (`aria-current="date"`) and its hours show on the closed row. */
115
+ today?: string;
116
+ /** Open or closed right now, in words. */
117
+ status: OpeningStatus;
118
+ /** The name of the list (`Hours`), passed translated. */
119
+ label: string;
120
+ };
121
+ /** The weekly hours in one row — open now, closes at… — that unfolds into the week, today highlighted. */
122
+ declare function OpeningHours({ days, today, status, label, className, ...props }: OpeningHoursProps): React.JSX.Element;
123
+
124
+ export { type OpeningDay, OpeningHours, type OpeningHoursProps, type OpeningStatus, openingHours };
@@ -0,0 +1,48 @@
1
+ import {
2
+ ChevronGlyph
3
+ } from "./chunk-XCBVFMNV.js";
4
+
5
+ // src/opening-hours/opening-hours.tsx
6
+ import { tv } from "tailwind-variants";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var openingHours = tv({
9
+ slots: {
10
+ root: "group/hours rounded-xl border border-border-default bg-surface-1 text-fg",
11
+ summary: "flex min-h-14 cursor-pointer list-none items-center gap-3 rounded-xl px-4 py-3 outline-hidden marker:hidden focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden",
12
+ dot: "h-2.5 w-2.5 shrink-0 rounded-full bg-fg-muted data-[open=true]:bg-success data-[open=true]:motion-safe:animate-pulse",
13
+ status: "flex min-w-0 flex-1 flex-col leading-tight",
14
+ state: "text-sm font-bold text-fg",
15
+ detail: "text-xs text-fg-secondary",
16
+ today: "hidden shrink-0 text-sm tabular-nums text-fg-secondary sm:block",
17
+ chevron: "h-4 w-4 shrink-0 text-fg-secondary transition-transform group-open/hours:rotate-180 motion-reduce:transition-none",
18
+ list: "m-0 flex list-none flex-col gap-0.5 border-t border-border-subtle p-2 sm:p-3",
19
+ row: "flex items-baseline justify-between gap-4 rounded-lg px-2 py-1.5 text-sm text-fg-secondary data-[today]:bg-accent-soft data-[today]:font-bold data-[today]:text-fg",
20
+ day: "shrink-0",
21
+ hours: "text-right tabular-nums"
22
+ }
23
+ });
24
+ var s = openingHours();
25
+ function OpeningHours({ days, today, status, label, className, ...props }) {
26
+ const todayHours = days.find((d) => d.id === today)?.hours;
27
+ return /* @__PURE__ */ jsxs("details", { className: s.root({ className }), ...props, children: [
28
+ /* @__PURE__ */ jsxs("summary", { className: s.summary(), children: [
29
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, "data-open": status.open, className: s.dot() }),
30
+ /* @__PURE__ */ jsxs("span", { className: s.status(), children: [
31
+ /* @__PURE__ */ jsx("span", { className: s.state(), children: status.label }),
32
+ status.detail && /* @__PURE__ */ jsx("span", { className: s.detail(), children: status.detail })
33
+ ] }),
34
+ todayHours && /* @__PURE__ */ jsx("span", { className: s.today(), children: todayHours }),
35
+ /* @__PURE__ */ jsx(ChevronGlyph, { className: s.chevron() }),
36
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
37
+ ] }),
38
+ /* @__PURE__ */ jsx("ul", { className: s.list(), "aria-label": label, children: days.map((day) => /* @__PURE__ */ jsxs("li", { className: s.row(), "data-today": day.id === today ? "" : void 0, "aria-current": day.id === today ? "date" : void 0, children: [
39
+ /* @__PURE__ */ jsx("span", { className: s.day(), children: day.label }),
40
+ /* @__PURE__ */ jsx("span", { className: s.hours(), children: day.hours })
41
+ ] }, day.id)) })
42
+ ] });
43
+ }
44
+ export {
45
+ OpeningHours,
46
+ openingHours
47
+ };
48
+ //# sourceMappingURL=opening-hours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/opening-hours/opening-hours.tsx"],"sourcesContent":["// Server-safe: no hook, no context (a native <details>). A shop's weekly hours in one quiet row — « Open now · closes at 5 pm »\n// and today's hours — that unfolds into the whole week with today marked. The app computes the status and formats the\n// times (the shop's zone and the reader's locale are its business); this block only lays them out.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronGlyph } from \"../glyphs\";\n\nexport const openingHours = tv({\n slots: {\n root: \"group/hours rounded-xl border border-border-default bg-surface-1 text-fg\",\n summary:\n \"flex min-h-14 cursor-pointer list-none items-center gap-3 rounded-xl px-4 py-3 outline-hidden marker:hidden focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden\",\n dot: \"h-2.5 w-2.5 shrink-0 rounded-full bg-fg-muted data-[open=true]:bg-success data-[open=true]:motion-safe:animate-pulse\",\n status: \"flex min-w-0 flex-1 flex-col leading-tight\",\n state: \"text-sm font-bold text-fg\",\n detail: \"text-xs text-fg-secondary\",\n today: \"hidden shrink-0 text-sm tabular-nums text-fg-secondary sm:block\",\n chevron: \"h-4 w-4 shrink-0 text-fg-secondary transition-transform group-open/hours:rotate-180 motion-reduce:transition-none\",\n list: \"m-0 flex list-none flex-col gap-0.5 border-t border-border-subtle p-2 sm:p-3\",\n row: \"flex items-baseline justify-between gap-4 rounded-lg px-2 py-1.5 text-sm text-fg-secondary data-[today]:bg-accent-soft data-[today]:font-bold data-[today]:text-fg\",\n day: \"shrink-0\",\n hours: \"text-right tabular-nums\",\n },\n});\nconst s = openingHours();\n\nexport type OpeningDay = {\n /** A stable id (`mon`, `1`). */\n id: string;\n /** The day's name, translated (`Lundi`). */\n label: string;\n /** The day's hours, formatted by the app (`8 h – 12 h, 13 h – 17 h`); the app's word for closed when there are none. */\n hours: string;\n};\n\nexport type OpeningStatus = {\n /** Open at this moment. */\n open: boolean;\n /** The state in words (`Open now`, `Closed`). */\n label: string;\n /** What follows (`closes at 5 pm`, `opens tomorrow at 8 am`). */\n detail?: string;\n};\n\nexport type OpeningHoursProps = Omit<React.ComponentProps<\"details\">, \"children\"> & {\n /** The week, in reading order. */\n days: readonly OpeningDay[];\n /** The id of today's day: its row is marked (`aria-current=\"date\"`) and its hours show on the closed row. */\n today?: string;\n /** Open or closed right now, in words. */\n status: OpeningStatus;\n /** The name of the list (`Hours`), passed translated. */\n label: string;\n};\n\n/** The weekly hours in one row — open now, closes at… — that unfolds into the week, today highlighted. */\nexport function OpeningHours({ days, today, status, label, className, ...props }: OpeningHoursProps) {\n const todayHours = days.find((d) => d.id === today)?.hours;\n return (\n <details className={s.root({ className })} {...props}>\n <summary className={s.summary()}>\n <span aria-hidden data-open={status.open} className={s.dot()} />\n <span className={s.status()}>\n <span className={s.state()}>{status.label}</span>\n {status.detail && <span className={s.detail()}>{status.detail}</span>}\n </span>\n {todayHours && <span className={s.today()}>{todayHours}</span>}\n <ChevronGlyph className={s.chevron()} />\n <span className=\"sr-only\">{label}</span>\n </summary>\n <ul className={s.list()} aria-label={label}>\n {days.map((day) => (\n <li key={day.id} className={s.row()} data-today={day.id === today ? \"\" : undefined} aria-current={day.id === today ? \"date\" : undefined}>\n <span className={s.day()}>{day.label}</span>\n <span className={s.hours()}>{day.hours}</span>\n </li>\n ))}\n </ul>\n </details>\n );\n}\n"],"mappings":";;;;;AAIA,SAAS,UAAU;AA0DX,cACA,YADA;AAtDD,IAAM,eAAe,GAAG;AAAA,EAC7B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SACE;AAAA,IACF,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,EACT;AACF,CAAC;AACD,IAAM,IAAI,aAAa;AAgChB,SAAS,aAAa,EAAE,MAAM,OAAO,QAAQ,OAAO,WAAW,GAAG,MAAM,GAAsB;AACnG,QAAM,aAAa,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,GAAG;AACrD,SACE,qBAAC,aAAQ,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC7C;AAAA,yBAAC,aAAQ,WAAW,EAAE,QAAQ,GAC5B;AAAA,0BAAC,UAAK,eAAW,MAAC,aAAW,OAAO,MAAM,WAAW,EAAE,IAAI,GAAG;AAAA,MAC9D,qBAAC,UAAK,WAAW,EAAE,OAAO,GACxB;AAAA,4BAAC,UAAK,WAAW,EAAE,MAAM,GAAI,iBAAO,OAAM;AAAA,QACzC,OAAO,UAAU,oBAAC,UAAK,WAAW,EAAE,OAAO,GAAI,iBAAO,QAAO;AAAA,SAChE;AAAA,MACC,cAAc,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAI,sBAAW;AAAA,MACvD,oBAAC,gBAAa,WAAW,EAAE,QAAQ,GAAG;AAAA,MACtC,oBAAC,UAAK,WAAU,WAAW,iBAAM;AAAA,OACnC;AAAA,IACA,oBAAC,QAAG,WAAW,EAAE,KAAK,GAAG,cAAY,OAClC,eAAK,IAAI,CAAC,QACT,qBAAC,QAAgB,WAAW,EAAE,IAAI,GAAG,cAAY,IAAI,OAAO,QAAQ,KAAK,QAAW,gBAAc,IAAI,OAAO,QAAQ,SAAS,QAC5H;AAAA,0BAAC,UAAK,WAAW,EAAE,IAAI,GAAI,cAAI,OAAM;AAAA,MACrC,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAI,cAAI,OAAM;AAAA,SAFhC,IAAI,EAGb,CACD,GACH;AAAA,KACF;AAEJ;","names":[]}
package/dist/rail-nav.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  ChevronGlyph
4
- } from "./chunk-AFY35UCB.js";
4
+ } from "./chunk-P7GZR5CU.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-WU4VLSEA.js";
@@ -0,0 +1,168 @@
1
+ import * as tailwind_variants from 'tailwind-variants';
2
+ import * as React from 'react';
3
+ import { L as LinkComponent } from './block-link-BAg4eoZk.js';
4
+
5
+ declare const serviceCard: tailwind_variants.TVReturnType<{
6
+ [key: string]: {
7
+ [key: string]: tailwind_variants.ClassValue | {
8
+ body?: tailwind_variants.ClassValue;
9
+ head?: tailwind_variants.ClassValue;
10
+ media?: tailwind_variants.ClassValue;
11
+ action?: tailwind_variants.ClassValue;
12
+ icon?: tailwind_variants.ClassValue;
13
+ titles?: tailwind_variants.ClassValue;
14
+ name?: tailwind_variants.ClassValue;
15
+ facts?: tailwind_variants.ClassValue;
16
+ tag?: tailwind_variants.ClassValue;
17
+ description?: tailwind_variants.ClassValue;
18
+ included?: tailwind_variants.ClassValue;
19
+ includedItem?: tailwind_variants.ClassValue;
20
+ foot?: tailwind_variants.ClassValue;
21
+ priceBlock?: tailwind_variants.ClassValue;
22
+ from?: tailwind_variants.ClassValue;
23
+ price?: tailwind_variants.ClassValue;
24
+ root?: tailwind_variants.ClassValue;
25
+ };
26
+ };
27
+ } | {
28
+ [x: string]: {
29
+ [x: string]: tailwind_variants.ClassValue | {
30
+ body?: tailwind_variants.ClassValue;
31
+ head?: tailwind_variants.ClassValue;
32
+ media?: tailwind_variants.ClassValue;
33
+ action?: tailwind_variants.ClassValue;
34
+ icon?: tailwind_variants.ClassValue;
35
+ titles?: tailwind_variants.ClassValue;
36
+ name?: tailwind_variants.ClassValue;
37
+ facts?: tailwind_variants.ClassValue;
38
+ tag?: tailwind_variants.ClassValue;
39
+ description?: tailwind_variants.ClassValue;
40
+ included?: tailwind_variants.ClassValue;
41
+ includedItem?: tailwind_variants.ClassValue;
42
+ foot?: tailwind_variants.ClassValue;
43
+ priceBlock?: tailwind_variants.ClassValue;
44
+ from?: tailwind_variants.ClassValue;
45
+ price?: tailwind_variants.ClassValue;
46
+ root?: tailwind_variants.ClassValue;
47
+ };
48
+ };
49
+ } | {}, {
50
+ root: string;
51
+ media: string;
52
+ body: string;
53
+ head: string;
54
+ icon: string;
55
+ titles: string;
56
+ name: string;
57
+ facts: string;
58
+ tag: string;
59
+ description: string;
60
+ included: string;
61
+ includedItem: string;
62
+ foot: string;
63
+ priceBlock: string;
64
+ from: string;
65
+ price: string;
66
+ action: string;
67
+ }, undefined, {
68
+ [key: string]: {
69
+ [key: string]: tailwind_variants.ClassValue | {
70
+ body?: tailwind_variants.ClassValue;
71
+ head?: tailwind_variants.ClassValue;
72
+ media?: tailwind_variants.ClassValue;
73
+ action?: tailwind_variants.ClassValue;
74
+ icon?: tailwind_variants.ClassValue;
75
+ titles?: tailwind_variants.ClassValue;
76
+ name?: tailwind_variants.ClassValue;
77
+ facts?: tailwind_variants.ClassValue;
78
+ tag?: tailwind_variants.ClassValue;
79
+ description?: tailwind_variants.ClassValue;
80
+ included?: tailwind_variants.ClassValue;
81
+ includedItem?: tailwind_variants.ClassValue;
82
+ foot?: tailwind_variants.ClassValue;
83
+ priceBlock?: tailwind_variants.ClassValue;
84
+ from?: tailwind_variants.ClassValue;
85
+ price?: tailwind_variants.ClassValue;
86
+ root?: tailwind_variants.ClassValue;
87
+ };
88
+ };
89
+ } | {}, {
90
+ root: string;
91
+ media: string;
92
+ body: string;
93
+ head: string;
94
+ icon: string;
95
+ titles: string;
96
+ name: string;
97
+ facts: string;
98
+ tag: string;
99
+ description: string;
100
+ included: string;
101
+ includedItem: string;
102
+ foot: string;
103
+ priceBlock: string;
104
+ from: string;
105
+ price: string;
106
+ action: string;
107
+ }, tailwind_variants.TVReturnTypeLike<unknown, {
108
+ root: string;
109
+ media: string;
110
+ body: string;
111
+ head: string;
112
+ icon: string;
113
+ titles: string;
114
+ name: string;
115
+ facts: string;
116
+ tag: string;
117
+ description: string;
118
+ included: string;
119
+ includedItem: string;
120
+ foot: string;
121
+ priceBlock: string;
122
+ from: string;
123
+ price: string;
124
+ action: string;
125
+ }>>;
126
+ type ServiceCardProps = Omit<React.ComponentProps<"article">, "title" | "children"> & {
127
+ /** The service's name (the heading). */
128
+ name: string;
129
+ /** Its price, formatted by the app (`22,00 $`): the card never formats money. */
130
+ price: string;
131
+ /** The words before the price when it varies (`From`, `À partir de`), passed translated. */
132
+ priceFrom?: string;
133
+ /** How long it takes (`30 min`) — the first fact. */
134
+ duration?: string;
135
+ /** How many it takes (`Up to 5 dogs`, `1 person`) — the second fact. */
136
+ capacity?: string;
137
+ /** One or two sentences: what it is. */
138
+ description?: string;
139
+ /** What is included, one short line each (a check precedes it). */
140
+ included?: readonly string[];
141
+ /** A tag on the top right (`Popular`): only from real data, never decoration. */
142
+ tag?: string;
143
+ /** An icon tile before the name (a signature icon): decorative. */
144
+ icon?: React.ReactNode;
145
+ /** A photo or a loop above the card (an `img`, a `video`): fills a 16:9 band. */
146
+ media?: React.ReactNode;
147
+ /** This service is the chosen one (the accent, `data-selected`). */
148
+ selected?: boolean;
149
+ /** The words of the way in (`Book`, `Choose`): the accessible name of the press. */
150
+ actionLabel: string;
151
+ /** The way in, as an address (the booking page with this service preselected). */
152
+ href?: string;
153
+ /** The app's link component for internal addresses (Next's `Link`). */
154
+ linkAs?: LinkComponent;
155
+ /** The way in, as a press (a client parent). Ignored when `href` is set. */
156
+ onSelect?: () => void;
157
+ /**
158
+ * The heading level of the name.
159
+ * @default "h3"
160
+ */
161
+ titleAs?: "h2" | "h3" | "h4";
162
+ /** Enters on scroll (MotionObserver): the index in the grid becomes the delay. */
163
+ reveal?: number;
164
+ };
165
+ /** A service as a card: icon or photo, duration, price, what is included, the capacity, a tag — one way in. */
166
+ declare function ServiceCard({ name, price, priceFrom, duration, capacity, description, included, tag, icon, media, selected, actionLabel, href, linkAs, onSelect, titleAs: Title, reveal, className, style, ...props }: ServiceCardProps): React.JSX.Element;
167
+
168
+ export { ServiceCard, type ServiceCardProps, serviceCard };
@@ -0,0 +1,112 @@
1
+ import {
2
+ BlockLink
3
+ } from "./chunk-2AGSO3WH.js";
4
+ import {
5
+ CheckGlyph
6
+ } from "./chunk-XCBVFMNV.js";
7
+
8
+ // src/service-card/service-card.tsx
9
+ import * as React from "react";
10
+ import { tv } from "tailwind-variants";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ var serviceCard = tv({
13
+ slots: {
14
+ root: "group kz-spotlight kz-lift relative flex h-full min-w-0 flex-col overflow-hidden rounded-xl border border-border-default bg-surface-1 text-fg transition-colors hover:border-accent/50 focus-within:ring-2 focus-within:ring-ring data-[selected]:border-accent data-[selected]:bg-accent-soft",
15
+ media: "relative aspect-[16/9] w-full overflow-hidden bg-media [&>img]:h-full [&>img]:w-full [&>img]:object-cover",
16
+ body: "flex flex-1 flex-col gap-3 p-4 sm:p-5",
17
+ head: "flex items-start gap-3",
18
+ icon: "inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-accent-soft text-fg-accent [&>svg]:h-5 [&>svg]:w-5",
19
+ titles: "flex min-w-0 flex-1 flex-col gap-1",
20
+ name: "m-0 font-display text-lg font-bold leading-tight tracking-tight text-fg",
21
+ facts: "m-0 flex list-none flex-wrap gap-x-2 gap-y-0.5 p-0 text-xs text-fg-secondary",
22
+ tag: "shrink-0 rounded-full bg-accent px-2 py-0.5 text-[10px] font-extrabold uppercase tracking-wide text-on-accent",
23
+ description: "m-0 text-sm leading-relaxed text-fg-secondary",
24
+ included: "m-0 flex list-none flex-col gap-1.5 p-0 text-sm text-fg-secondary",
25
+ includedItem: "flex items-start gap-2 [&>svg]:mt-0.5 [&>svg]:h-4 [&>svg]:w-4 [&>svg]:shrink-0 [&>svg]:text-fg-accent",
26
+ foot: "mt-auto flex items-end justify-between gap-3 border-t border-border-subtle pt-3",
27
+ priceBlock: "flex flex-col leading-none",
28
+ from: "mb-1 text-[11px] font-semibold uppercase tracking-wider text-fg-secondary",
29
+ price: "font-display text-2xl font-black tabular-nums text-fg",
30
+ action: "inline-flex min-h-9 items-center gap-1 rounded-full text-sm font-bold text-fg-accent no-underline after:absolute after:inset-0 after:content-[''] focus-visible:outline-hidden group-data-[selected]:text-fg"
31
+ }
32
+ });
33
+ var s = serviceCard();
34
+ function ServiceCard({
35
+ name,
36
+ price,
37
+ priceFrom,
38
+ duration,
39
+ capacity,
40
+ description,
41
+ included,
42
+ tag,
43
+ icon,
44
+ media,
45
+ selected,
46
+ actionLabel,
47
+ href,
48
+ linkAs,
49
+ onSelect,
50
+ titleAs: Title = "h3",
51
+ reveal,
52
+ className,
53
+ style,
54
+ ...props
55
+ }) {
56
+ const id = React.useId();
57
+ const facts = [duration, capacity].filter(Boolean);
58
+ const arrow = /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u2192" });
59
+ const revealStyle = reveal === void 0 ? style : { ...style, "--kz-delay": `${Math.min(Math.max(reveal, 0), 8) * 50}ms` };
60
+ return /* @__PURE__ */ jsxs(
61
+ "article",
62
+ {
63
+ "aria-labelledby": id,
64
+ "data-selected": selected ? "" : void 0,
65
+ "data-reveal": reveal === void 0 ? void 0 : "",
66
+ style: revealStyle,
67
+ className: s.root({ className }),
68
+ ...props,
69
+ children: [
70
+ media && /* @__PURE__ */ jsx("div", { className: s.media(), children: media }),
71
+ /* @__PURE__ */ jsxs("div", { className: s.body(), children: [
72
+ /* @__PURE__ */ jsxs("div", { className: s.head(), children: [
73
+ icon && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: s.icon(), children: icon }),
74
+ /* @__PURE__ */ jsxs("div", { className: s.titles(), children: [
75
+ /* @__PURE__ */ jsx(Title, { id, className: s.name(), children: name }),
76
+ facts.length > 0 && /* @__PURE__ */ jsx("ul", { className: s.facts(), children: facts.map((fact, i) => /* @__PURE__ */ jsxs("li", { children: [
77
+ i > 0 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\xB7 " }),
78
+ fact
79
+ ] }, i)) })
80
+ ] }),
81
+ tag && /* @__PURE__ */ jsx("span", { className: s.tag(), children: tag })
82
+ ] }),
83
+ description && /* @__PURE__ */ jsx("p", { className: s.description(), children: description }),
84
+ included && included.length > 0 && /* @__PURE__ */ jsx("ul", { className: s.included(), children: included.map((line) => /* @__PURE__ */ jsxs("li", { className: s.includedItem(), children: [
85
+ /* @__PURE__ */ jsx(CheckGlyph, {}),
86
+ /* @__PURE__ */ jsx("span", { children: line })
87
+ ] }, line)) }),
88
+ /* @__PURE__ */ jsxs("div", { className: s.foot(), children: [
89
+ /* @__PURE__ */ jsxs("p", { className: s.priceBlock(), children: [
90
+ priceFrom && /* @__PURE__ */ jsx("span", { className: s.from(), children: priceFrom }),
91
+ /* @__PURE__ */ jsx("span", { className: s.price(), children: price })
92
+ ] }),
93
+ href ? /* @__PURE__ */ jsxs(BlockLink, { href, linkAs, className: s.action(), "aria-describedby": id, children: [
94
+ actionLabel,
95
+ " ",
96
+ arrow
97
+ ] }) : onSelect ? /* @__PURE__ */ jsxs("button", { type: "button", onClick: onSelect, "aria-pressed": selected ?? false, "aria-describedby": id, className: s.action(), children: [
98
+ actionLabel,
99
+ " ",
100
+ arrow
101
+ ] }) : null
102
+ ] })
103
+ ] })
104
+ ]
105
+ }
106
+ );
107
+ }
108
+ export {
109
+ ServiceCard,
110
+ serviceCard
111
+ };
112
+ //# sourceMappingURL=service-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/service-card/service-card.tsx"],"sourcesContent":["// Server-safe: no hook, no context. A service a shop sells, as a card that argues: icon or photo, name, duration, price\n// (« from » when it varies), what is included, the capacity, a « Popular » tag — and one way in: a link (the booking page\n// with this service chosen) or a button (`onSelect`, from a client parent). The whole card takes the press.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { BlockLink, type LinkComponent } from \"../block-link\";\nimport { CheckGlyph } from \"../glyphs\";\n\nexport const serviceCard = tv({\n slots: {\n root:\n \"group kz-spotlight kz-lift relative flex h-full min-w-0 flex-col overflow-hidden rounded-xl border border-border-default bg-surface-1 text-fg transition-colors \" +\n \"hover:border-accent/50 focus-within:ring-2 focus-within:ring-ring data-[selected]:border-accent data-[selected]:bg-accent-soft\",\n media: \"relative aspect-[16/9] w-full overflow-hidden bg-media [&>img]:h-full [&>img]:w-full [&>img]:object-cover\",\n body: \"flex flex-1 flex-col gap-3 p-4 sm:p-5\",\n head: \"flex items-start gap-3\",\n icon: \"inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-accent-soft text-fg-accent [&>svg]:h-5 [&>svg]:w-5\",\n titles: \"flex min-w-0 flex-1 flex-col gap-1\",\n name: \"m-0 font-display text-lg font-bold leading-tight tracking-tight text-fg\",\n facts: \"m-0 flex list-none flex-wrap gap-x-2 gap-y-0.5 p-0 text-xs text-fg-secondary\",\n tag: \"shrink-0 rounded-full bg-accent px-2 py-0.5 text-[10px] font-extrabold uppercase tracking-wide text-on-accent\",\n description: \"m-0 text-sm leading-relaxed text-fg-secondary\",\n included: \"m-0 flex list-none flex-col gap-1.5 p-0 text-sm text-fg-secondary\",\n includedItem: \"flex items-start gap-2 [&>svg]:mt-0.5 [&>svg]:h-4 [&>svg]:w-4 [&>svg]:shrink-0 [&>svg]:text-fg-accent\",\n foot: \"mt-auto flex items-end justify-between gap-3 border-t border-border-subtle pt-3\",\n priceBlock: \"flex flex-col leading-none\",\n from: \"mb-1 text-[11px] font-semibold uppercase tracking-wider text-fg-secondary\",\n price: \"font-display text-2xl font-black tabular-nums text-fg\",\n action:\n \"inline-flex min-h-9 items-center gap-1 rounded-full text-sm font-bold text-fg-accent no-underline \" +\n \"after:absolute after:inset-0 after:content-[''] focus-visible:outline-hidden group-data-[selected]:text-fg\",\n },\n});\nconst s = serviceCard();\n\nexport type ServiceCardProps = Omit<React.ComponentProps<\"article\">, \"title\" | \"children\"> & {\n /** The service's name (the heading). */\n name: string;\n /** Its price, formatted by the app (`22,00 $`): the card never formats money. */\n price: string;\n /** The words before the price when it varies (`From`, `À partir de`), passed translated. */\n priceFrom?: string;\n /** How long it takes (`30 min`) — the first fact. */\n duration?: string;\n /** How many it takes (`Up to 5 dogs`, `1 person`) — the second fact. */\n capacity?: string;\n /** One or two sentences: what it is. */\n description?: string;\n /** What is included, one short line each (a check precedes it). */\n included?: readonly string[];\n /** A tag on the top right (`Popular`): only from real data, never decoration. */\n tag?: string;\n /** An icon tile before the name (a signature icon): decorative. */\n icon?: React.ReactNode;\n /** A photo or a loop above the card (an `img`, a `video`): fills a 16:9 band. */\n media?: React.ReactNode;\n /** This service is the chosen one (the accent, `data-selected`). */\n selected?: boolean;\n /** The words of the way in (`Book`, `Choose`): the accessible name of the press. */\n actionLabel: string;\n /** The way in, as an address (the booking page with this service preselected). */\n href?: string;\n /** The app's link component for internal addresses (Next's `Link`). */\n linkAs?: LinkComponent;\n /** The way in, as a press (a client parent). Ignored when `href` is set. */\n onSelect?: () => void;\n /**\n * The heading level of the name.\n * @default \"h3\"\n */\n titleAs?: \"h2\" | \"h3\" | \"h4\";\n /** Enters on scroll (MotionObserver): the index in the grid becomes the delay. */\n reveal?: number;\n};\n\n/** A service as a card: icon or photo, duration, price, what is included, the capacity, a tag — one way in. */\nexport function ServiceCard({\n name, price, priceFrom, duration, capacity, description, included, tag, icon, media, selected, actionLabel, href, linkAs, onSelect, titleAs: Title = \"h3\", reveal, className, style, ...props\n}: ServiceCardProps) {\n const id = React.useId();\n const facts = [duration, capacity].filter(Boolean);\n const arrow = <span aria-hidden>→</span>;\n const revealStyle = reveal === undefined ? style : ({ ...style, \"--kz-delay\": `${Math.min(Math.max(reveal, 0), 8) * 50}ms` } as React.CSSProperties);\n return (\n <article\n aria-labelledby={id}\n data-selected={selected ? \"\" : undefined}\n data-reveal={reveal === undefined ? undefined : \"\"}\n style={revealStyle}\n className={s.root({ className })}\n {...props}\n >\n {media && <div className={s.media()}>{media}</div>}\n <div className={s.body()}>\n <div className={s.head()}>\n {icon && <span aria-hidden className={s.icon()}>{icon}</span>}\n <div className={s.titles()}>\n <Title id={id} className={s.name()}>{name}</Title>\n {facts.length > 0 && (\n <ul className={s.facts()}>\n {facts.map((fact, i) => (\n <li key={i}>{i > 0 && <span aria-hidden>· </span>}{fact}</li>\n ))}\n </ul>\n )}\n </div>\n {tag && <span className={s.tag()}>{tag}</span>}\n </div>\n {description && <p className={s.description()}>{description}</p>}\n {included && included.length > 0 && (\n <ul className={s.included()}>\n {included.map((line) => (\n <li key={line} className={s.includedItem()}>\n <CheckGlyph />\n <span>{line}</span>\n </li>\n ))}\n </ul>\n )}\n <div className={s.foot()}>\n <p className={s.priceBlock()}>\n {priceFrom && <span className={s.from()}>{priceFrom}</span>}\n <span className={s.price()}>{price}</span>\n </p>\n {href ? (\n <BlockLink href={href} linkAs={linkAs} className={s.action()} aria-describedby={id}>\n {actionLabel} {arrow}\n </BlockLink>\n ) : onSelect ? (\n <button type=\"button\" onClick={onSelect} aria-pressed={selected ?? false} aria-describedby={id} className={s.action()}>\n {actionLabel} {arrow}\n </button>\n ) : null}\n </div>\n </div>\n </article>\n );\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  familyLabels,
5
5
  siteById,
6
6
  sitesByGroup
7
- } from "./chunk-FTX66XZY.js";
7
+ } from "./chunk-BCGJZ5PG.js";
8
8
  import {
9
9
  KrizakaLogo
10
10
  } from "./chunk-4DH2HW3D.js";
package/dist/sites.js CHANGED
@@ -35,7 +35,7 @@ var familyLabels = {
35
35
  orochia: "A video platform for creators.",
36
36
  yasakia: "The dating app where you talk first.",
37
37
  yororis: "A listening space with a face and a voice.",
38
- yomizaka: "Your documents, read and checked by Orazaka.",
38
+ yomizaka: "Yomizaka reads your leases, contracts and invoices.",
39
39
  kachizaka: "Predictions among friends \u2014 live data, in real time.",
40
40
  akinaza: "Running a shop in Qu\xE9bec, for less \u2014 Loi 25 by design.",
41
41
  ui: "Components, tokens, icons and charts \u2014 web and React Native.",
@@ -57,7 +57,7 @@ var familyLabels = {
57
57
  orochia: "Une plateforme vid\xE9o pour les cr\xE9ateurs.",
58
58
  yasakia: "L\u2019app de rencontre o\xF9 l\u2019on se parle d\u2019abord.",
59
59
  yororis: "Un espace d\u2019\xE9coute avec un visage et une voix.",
60
- yomizaka: "Vos documents, lus et v\xE9rifi\xE9s par Orazaka.",
60
+ yomizaka: "Yomizaka lit vos baux, contrats et factures.",
61
61
  kachizaka: "Les pronostics entre amis \u2014 des donn\xE9es en direct.",
62
62
  akinaza: "Tenir une boutique au Qu\xE9bec, pour moins cher \u2014 Loi 25 d\xE8s la conception.",
63
63
  ui: "Composants, jetons, ic\xF4nes et graphiques \u2014 web et React Native.",
package/dist/sites.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sites/sites.ts"],"sourcesContent":["// Server-safe: plain data. The Krizaka family — every site Krizaka runs, once. The family switcher of the bar\n// (`NavBar.Family`) and the common footer (`SiteFooter`) both read it, so adding a site is one release of this package:\n// every bar and every footer of the family follow.\n//\n// The words of the family (a site's one line, the groups, the statuses, the footer's signature) are brand data, written\n// here in English and French (`familyLabels`) — a site passes the set of its locale, or its own translation.\n\n/** A site of the family. */\nexport type SiteId = \"krizaka\" | \"orazaka\" | \"orochia\" | \"yasakia\" | \"yororis\" | \"yomizaka\" | \"kachizaka\" | \"akinaza\" | \"ui\" | \"java\" | \"github\";\n\n/** What a site is: the company, a product, or an open-source project. It chooses the footer's signature line. */\nexport type SiteKind = \"company\" | \"product\" | \"open-source\";\n\n/**\n * `released`: open to visit. `upcoming`: announced, not released yet (said \"Coming soon\"). `construction`: under\n * construction — nothing deployed beyond its page, nothing offered. `development`: being built in the open, nothing\n * deployed yet — its address is its repository (said \"In development\").\n */\nexport type SiteStatus = \"released\" | \"upcoming\" | \"construction\" | \"development\";\n\n/** The groups of the family, in reading order: Krizaka · Products · Open source · GitHub. */\nexport type SiteGroup = \"krizaka\" | \"products\" | \"open-source\" | \"github\";\n\n/** The mark a site wears: a brand of `ProductLogo` (Krizaka UI and Krizaka Java wear Krizaka's), or GitHub's. */\nexport type SiteMark = \"krizaka\" | \"orazaka\" | \"orochia\" | \"yasakia\" | \"yororis\" | \"yomizaka\" | \"kachizaka\" | \"akinaza\" | \"github\";\n\nexport interface Site {\n readonly id: SiteId;\n /** The name, never translated. */\n readonly name: string;\n /** The address of the site (its home). */\n readonly url: string;\n /** The address without the scheme, as people say it (`ui.krizaka.com`). */\n readonly host: string;\n readonly kind: SiteKind;\n readonly group: SiteGroup;\n readonly status: SiteStatus;\n readonly mark: SiteMark;\n /** The repository the site is built from. */\n readonly repo: string;\n}\n\nconst site = (s: Omit<Site, \"host\">): Site => ({ ...s, host: s.url.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\") });\n\n/** Every site of the family, in reading order (the group order, then the order inside each group). */\nexport const sites: readonly Site[] = [\n site({ id: \"krizaka\", name: \"Krizaka\", url: \"https://www.krizaka.com\", kind: \"company\", group: \"krizaka\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-com\" }),\n site({ id: \"orazaka\", name: \"Orazaka\", url: \"https://dev.orazaka.com\", kind: \"product\", group: \"products\", status: \"released\", mark: \"orazaka\", repo: \"https://github.com/krizaka/orazaka\" }),\n site({ id: \"orochia\", name: \"Orochia\", url: \"https://dev.orochia.com\", kind: \"product\", group: \"products\", status: \"released\", mark: \"orochia\", repo: \"https://github.com/krizaka/orochia\" }),\n site({ id: \"yasakia\", name: \"Yasakia\", url: \"https://dev.yasakia.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"yasakia\", repo: \"https://github.com/krizaka/yasakia\" }),\n site({ id: \"yororis\", name: \"Yororis\", url: \"https://dev.yororis.com\", kind: \"product\", group: \"products\", status: \"construction\", mark: \"yororis\", repo: \"https://github.com/krizaka/yororis\" }),\n site({ id: \"yomizaka\", name: \"Yomizaka\", url: \"https://dev.yomizaka.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"yomizaka\", repo: \"https://github.com/krizaka/yomizaka\" }),\n // In development: nothing deployed yet, so the address is the repository (never a dead link to an unborn dev site).\n site({ id: \"kachizaka\", name: \"Kachizaka\", url: \"https://github.com/krizaka/kachizaka\", kind: \"product\", group: \"products\", status: \"development\", mark: \"kachizaka\", repo: \"https://github.com/krizaka/kachizaka\" }),\n site({ id: \"akinaza\", name: \"Akinaza\", url: \"https://github.com/krizaka/akinaza\", kind: \"product\", group: \"products\", status: \"development\", mark: \"akinaza\", repo: \"https://github.com/krizaka/akinaza\" }),\n site({ id: \"ui\", name: \"Krizaka UI\", url: \"https://ui.krizaka.com\", kind: \"open-source\", group: \"open-source\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-ui\" }),\n site({ id: \"java\", name: \"Krizaka Java\", url: \"https://java.krizaka.com\", kind: \"open-source\", group: \"open-source\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-build\" }),\n site({ id: \"github\", name: \"GitHub\", url: \"https://github.com/krizaka\", kind: \"open-source\", group: \"github\", status: \"released\", mark: \"github\", repo: \"https://github.com/krizaka\" }),\n];\n\n/** The groups, in reading order. */\nexport const siteGroups: readonly SiteGroup[] = [\"krizaka\", \"products\", \"open-source\", \"github\"];\n\n/** A site by id. */\nexport function siteById(id: SiteId): Site {\n const found = sites.find((s) => s.id === id);\n if (!found) throw new Error(`Unknown Krizaka site \"${id}\".`);\n return found;\n}\n\n/** The family grouped, in reading order: `[{ group, sites }]`, empty groups left out. */\nexport function sitesByGroup(): { group: SiteGroup; sites: Site[] }[] {\n return siteGroups.map((group) => ({ group, sites: sites.filter((s) => s.group === group) })).filter((g) => g.sites.length > 0);\n}\n\n/** The languages the family's words are written in. */\nexport type SiteLocale = \"en\" | \"fr\";\n\n/** The words of the family: the switcher, the footer, each site's one line. */\nexport interface FamilyLabels {\n /** The family's name: the switcher's navigation and its button, the footer's navigation (“Krizaka family”). */\n family: string;\n /** The heading of each group. */\n groups: Record<SiteGroup, string>;\n /** The badge of a site that is not released. */\n status: Record<Exclude<SiteStatus, \"released\">, string>;\n /** Says which site is the current one (“You are here”). */\n current: string;\n /** One line per site: what it is. */\n descriptions: Record<SiteId, string>;\n /** The footer's signature, by the kind of the current site (“A Krizaka product”). */\n signature: Record<SiteKind, string>;\n /** The footer's place line (“Made in Montréal”). */\n place: string;\n /** The accessible name of the version (“Version”). */\n version: string;\n}\n\n/** The family's words in English and French. Pass `familyLabels[locale]`, or your own translation of the same shape. */\nexport const familyLabels: Record<SiteLocale, FamilyLabels> = {\n en: {\n family: \"Krizaka family\",\n groups: { krizaka: \"Krizaka\", products: \"Products\", \"open-source\": \"Open source\", github: \"GitHub\" },\n status: { upcoming: \"Coming soon\", construction: \"Under construction\", development: \"In development\" },\n current: \"You are here\",\n descriptions: {\n krizaka: \"The company: our products, our open source, our story.\",\n orazaka: \"Sovereign AI, on your own servers.\",\n orochia: \"A video platform for creators.\",\n yasakia: \"The dating app where you talk first.\",\n yororis: \"A listening space with a face and a voice.\",\n yomizaka: \"Your documents, read and checked by Orazaka.\",\n kachizaka: \"Predictions among friends — live data, in real time.\",\n akinaza: \"Running a shop in Québec, for less — Loi 25 by design.\",\n ui: \"Components, tokens, icons and charts — web and React Native.\",\n java: \"Spring Boot building blocks on Maven Central.\",\n github: \"Every repository, in the open.\",\n },\n signature: { company: \"A Krizaka company\", product: \"A Krizaka product\", \"open-source\": \"A Krizaka open-source project\" },\n place: \"Made in Montréal\",\n version: \"Version\",\n },\n fr: {\n family: \"Famille Krizaka\",\n groups: { krizaka: \"Krizaka\", products: \"Produits\", \"open-source\": \"Open source\", github: \"GitHub\" },\n status: { upcoming: \"Bientôt\", construction: \"En construction\", development: \"En développement\" },\n current: \"Vous êtes ici\",\n descriptions: {\n krizaka: \"La compagnie : nos produits, notre open source, notre histoire.\",\n orazaka: \"L’IA souveraine, sur vos propres serveurs.\",\n orochia: \"Une plateforme vidéo pour les créateurs.\",\n yasakia: \"L’app de rencontre où l’on se parle d’abord.\",\n yororis: \"Un espace d’écoute avec un visage et une voix.\",\n yomizaka: \"Vos documents, lus et vérifiés par Orazaka.\",\n kachizaka: \"Les pronostics entre amis — des données en direct.\",\n akinaza: \"Tenir une boutique au Québec, pour moins cher — Loi 25 dès la conception.\",\n ui: \"Composants, jetons, icônes et graphiques — web et React Native.\",\n java: \"Des briques Spring Boot sur Maven Central.\",\n github: \"Tous les dépôts, au grand jour.\",\n },\n signature: { company: \"Une compagnie Krizaka\", product: \"Un produit Krizaka\", \"open-source\": \"Un projet open source de Krizaka\" },\n place: \"Fait à Montréal\",\n version: \"Version\",\n },\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/sites/sites.ts"],"sourcesContent":["// Server-safe: plain data. The Krizaka family — every site Krizaka runs, once. The family switcher of the bar\n// (`NavBar.Family`) and the common footer (`SiteFooter`) both read it, so adding a site is one release of this package:\n// every bar and every footer of the family follow.\n//\n// The words of the family (a site's one line, the groups, the statuses, the footer's signature) are brand data, written\n// here in English and French (`familyLabels`) — a site passes the set of its locale, or its own translation.\n\n/** A site of the family. */\nexport type SiteId = \"krizaka\" | \"orazaka\" | \"orochia\" | \"yasakia\" | \"yororis\" | \"yomizaka\" | \"kachizaka\" | \"akinaza\" | \"ui\" | \"java\" | \"github\";\n\n/** What a site is: the company, a product, or an open-source project. It chooses the footer's signature line. */\nexport type SiteKind = \"company\" | \"product\" | \"open-source\";\n\n/**\n * `released`: open to visit. `upcoming`: announced, not released yet (said \"Coming soon\"). `construction`: under\n * construction — nothing deployed beyond its page, nothing offered. `development`: being built in the open, nothing\n * deployed yet — its address is its repository (said \"In development\").\n */\nexport type SiteStatus = \"released\" | \"upcoming\" | \"construction\" | \"development\";\n\n/** The groups of the family, in reading order: Krizaka · Products · Open source · GitHub. */\nexport type SiteGroup = \"krizaka\" | \"products\" | \"open-source\" | \"github\";\n\n/** The mark a site wears: a brand of `ProductLogo` (Krizaka UI and Krizaka Java wear Krizaka's), or GitHub's. */\nexport type SiteMark = \"krizaka\" | \"orazaka\" | \"orochia\" | \"yasakia\" | \"yororis\" | \"yomizaka\" | \"kachizaka\" | \"akinaza\" | \"github\";\n\nexport interface Site {\n readonly id: SiteId;\n /** The name, never translated. */\n readonly name: string;\n /** The address of the site (its home). */\n readonly url: string;\n /** The address without the scheme, as people say it (`ui.krizaka.com`). */\n readonly host: string;\n readonly kind: SiteKind;\n readonly group: SiteGroup;\n readonly status: SiteStatus;\n readonly mark: SiteMark;\n /** The repository the site is built from. */\n readonly repo: string;\n}\n\nconst site = (s: Omit<Site, \"host\">): Site => ({ ...s, host: s.url.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\") });\n\n/** Every site of the family, in reading order (the group order, then the order inside each group). */\nexport const sites: readonly Site[] = [\n site({ id: \"krizaka\", name: \"Krizaka\", url: \"https://www.krizaka.com\", kind: \"company\", group: \"krizaka\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-com\" }),\n site({ id: \"orazaka\", name: \"Orazaka\", url: \"https://dev.orazaka.com\", kind: \"product\", group: \"products\", status: \"released\", mark: \"orazaka\", repo: \"https://github.com/krizaka/orazaka\" }),\n site({ id: \"orochia\", name: \"Orochia\", url: \"https://dev.orochia.com\", kind: \"product\", group: \"products\", status: \"released\", mark: \"orochia\", repo: \"https://github.com/krizaka/orochia\" }),\n site({ id: \"yasakia\", name: \"Yasakia\", url: \"https://dev.yasakia.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"yasakia\", repo: \"https://github.com/krizaka/yasakia\" }),\n site({ id: \"yororis\", name: \"Yororis\", url: \"https://dev.yororis.com\", kind: \"product\", group: \"products\", status: \"construction\", mark: \"yororis\", repo: \"https://github.com/krizaka/yororis\" }),\n site({ id: \"yomizaka\", name: \"Yomizaka\", url: \"https://dev.yomizaka.com\", kind: \"product\", group: \"products\", status: \"development\", mark: \"yomizaka\", repo: \"https://github.com/krizaka/yomizaka\" }),\n // In development: nothing deployed yet, so the address is the repository (never a dead link to an unborn dev site).\n site({ id: \"kachizaka\", name: \"Kachizaka\", url: \"https://github.com/krizaka/kachizaka\", kind: \"product\", group: \"products\", status: \"development\", mark: \"kachizaka\", repo: \"https://github.com/krizaka/kachizaka\" }),\n site({ id: \"akinaza\", name: \"Akinaza\", url: \"https://github.com/krizaka/akinaza\", kind: \"product\", group: \"products\", status: \"development\", mark: \"akinaza\", repo: \"https://github.com/krizaka/akinaza\" }),\n site({ id: \"ui\", name: \"Krizaka UI\", url: \"https://ui.krizaka.com\", kind: \"open-source\", group: \"open-source\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-ui\" }),\n site({ id: \"java\", name: \"Krizaka Java\", url: \"https://java.krizaka.com\", kind: \"open-source\", group: \"open-source\", status: \"released\", mark: \"krizaka\", repo: \"https://github.com/krizaka/krizaka-build\" }),\n site({ id: \"github\", name: \"GitHub\", url: \"https://github.com/krizaka\", kind: \"open-source\", group: \"github\", status: \"released\", mark: \"github\", repo: \"https://github.com/krizaka\" }),\n];\n\n/** The groups, in reading order. */\nexport const siteGroups: readonly SiteGroup[] = [\"krizaka\", \"products\", \"open-source\", \"github\"];\n\n/** A site by id. */\nexport function siteById(id: SiteId): Site {\n const found = sites.find((s) => s.id === id);\n if (!found) throw new Error(`Unknown Krizaka site \"${id}\".`);\n return found;\n}\n\n/** The family grouped, in reading order: `[{ group, sites }]`, empty groups left out. */\nexport function sitesByGroup(): { group: SiteGroup; sites: Site[] }[] {\n return siteGroups.map((group) => ({ group, sites: sites.filter((s) => s.group === group) })).filter((g) => g.sites.length > 0);\n}\n\n/** The languages the family's words are written in. */\nexport type SiteLocale = \"en\" | \"fr\";\n\n/** The words of the family: the switcher, the footer, each site's one line. */\nexport interface FamilyLabels {\n /** The family's name: the switcher's navigation and its button, the footer's navigation (“Krizaka family”). */\n family: string;\n /** The heading of each group. */\n groups: Record<SiteGroup, string>;\n /** The badge of a site that is not released. */\n status: Record<Exclude<SiteStatus, \"released\">, string>;\n /** Says which site is the current one (“You are here”). */\n current: string;\n /** One line per site: what it is. */\n descriptions: Record<SiteId, string>;\n /** The footer's signature, by the kind of the current site (“A Krizaka product”). */\n signature: Record<SiteKind, string>;\n /** The footer's place line (“Made in Montréal”). */\n place: string;\n /** The accessible name of the version (“Version”). */\n version: string;\n}\n\n/** The family's words in English and French. Pass `familyLabels[locale]`, or your own translation of the same shape. */\nexport const familyLabels: Record<SiteLocale, FamilyLabels> = {\n en: {\n family: \"Krizaka family\",\n groups: { krizaka: \"Krizaka\", products: \"Products\", \"open-source\": \"Open source\", github: \"GitHub\" },\n status: { upcoming: \"Coming soon\", construction: \"Under construction\", development: \"In development\" },\n current: \"You are here\",\n descriptions: {\n krizaka: \"The company: our products, our open source, our story.\",\n orazaka: \"Sovereign AI, on your own servers.\",\n orochia: \"A video platform for creators.\",\n yasakia: \"The dating app where you talk first.\",\n yororis: \"A listening space with a face and a voice.\",\n yomizaka: \"Yomizaka reads your leases, contracts and invoices.\",\n kachizaka: \"Predictions among friends — live data, in real time.\",\n akinaza: \"Running a shop in Québec, for less — Loi 25 by design.\",\n ui: \"Components, tokens, icons and charts — web and React Native.\",\n java: \"Spring Boot building blocks on Maven Central.\",\n github: \"Every repository, in the open.\",\n },\n signature: { company: \"A Krizaka company\", product: \"A Krizaka product\", \"open-source\": \"A Krizaka open-source project\" },\n place: \"Made in Montréal\",\n version: \"Version\",\n },\n fr: {\n family: \"Famille Krizaka\",\n groups: { krizaka: \"Krizaka\", products: \"Produits\", \"open-source\": \"Open source\", github: \"GitHub\" },\n status: { upcoming: \"Bientôt\", construction: \"En construction\", development: \"En développement\" },\n current: \"Vous êtes ici\",\n descriptions: {\n krizaka: \"La compagnie : nos produits, notre open source, notre histoire.\",\n orazaka: \"L’IA souveraine, sur vos propres serveurs.\",\n orochia: \"Une plateforme vidéo pour les créateurs.\",\n yasakia: \"L’app de rencontre où l’on se parle d’abord.\",\n yororis: \"Un espace d’écoute avec un visage et une voix.\",\n yomizaka: \"Yomizaka lit vos baux, contrats et factures.\",\n kachizaka: \"Les pronostics entre amis — des données en direct.\",\n akinaza: \"Tenir une boutique au Québec, pour moins cher — Loi 25 dès la conception.\",\n ui: \"Composants, jetons, icônes et graphiques — web et React Native.\",\n java: \"Des briques Spring Boot sur Maven Central.\",\n github: \"Tous les dépôts, au grand jour.\",\n },\n signature: { company: \"Une compagnie Krizaka\", product: \"Un produit Krizaka\", \"open-source\": \"Un projet open source de Krizaka\" },\n place: \"Fait à Montréal\",\n version: \"Version\",\n },\n};\n"],"mappings":"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","names":[]}