@krizaka/ui 2.9.0 → 2.10.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 (226) hide show
  1. package/README.md +41 -5
  2. package/dist/blocks.css +247 -0
  3. package/dist/catalogue-page.d.ts +34 -0
  4. package/dist/catalogue-page.js +26 -0
  5. package/dist/catalogue-page.js.map +1 -0
  6. package/dist/changelog-page.d.ts +50 -0
  7. package/dist/changelog-page.js +27 -0
  8. package/dist/changelog-page.js.map +1 -0
  9. package/dist/{chunk-NOVUREEC.js → chunk-JZPVUJIX.js} +25 -3
  10. package/dist/chunk-JZPVUJIX.js.map +1 -0
  11. package/dist/chunk-KNBYZGSQ.js +11 -0
  12. package/dist/chunk-KNBYZGSQ.js.map +1 -0
  13. package/dist/component-page.d.ts +41 -0
  14. package/dist/component-page.js +17 -0
  15. package/dist/component-page.js.map +1 -0
  16. package/dist/contact-page.d.ts +31 -0
  17. package/dist/contact-page.js +26 -0
  18. package/dist/contact-page.js.map +1 -0
  19. package/dist/docs-article-page.d.ts +54 -0
  20. package/dist/docs-article-page.js +29 -0
  21. package/dist/docs-article-page.js.map +1 -0
  22. package/dist/docs-hub-page.d.ts +72 -0
  23. package/dist/docs-hub-page.js +45 -0
  24. package/dist/docs-hub-page.js.map +1 -0
  25. package/dist/error-page.d.ts +22 -0
  26. package/dist/error-page.js +23 -0
  27. package/dist/error-page.js.map +1 -0
  28. package/dist/gallery-page.d.ts +50 -0
  29. package/dist/gallery-page.js +30 -0
  30. package/dist/gallery-page.js.map +1 -0
  31. package/dist/{geometry-CXrAW34x.d.ts → geometry-CbOU4rtL.d.ts} +4 -4
  32. package/dist/how-it-works-page.d.ts +48 -0
  33. package/dist/how-it-works-page.js +28 -0
  34. package/dist/how-it-works-page.js.map +1 -0
  35. package/dist/index.d.ts +11 -2
  36. package/dist/index.js +93 -5
  37. package/dist/index.js.map +1 -1
  38. package/dist/landing-page.d.ts +58 -0
  39. package/dist/landing-page.js +42 -0
  40. package/dist/landing-page.js.map +1 -0
  41. package/dist/legal-page.d.ts +34 -0
  42. package/dist/legal-page.js +18 -0
  43. package/dist/legal-page.js.map +1 -0
  44. package/dist/longform-page.d.ts +42 -0
  45. package/dist/longform-page.js +29 -0
  46. package/dist/longform-page.js.map +1 -0
  47. package/dist/mascot-quote.d.ts +4 -4
  48. package/dist/mascot-quote.js +23 -1
  49. package/dist/mascot-quote.js.map +1 -1
  50. package/dist/mascot-state.d.ts +2 -2
  51. package/dist/mascot-state.js +1 -1
  52. package/dist/mascot-state.js.map +1 -1
  53. package/dist/mascots.d.ts +4 -4
  54. package/dist/mascots.js +1 -1
  55. package/dist/native.d.ts +16 -9
  56. package/dist/native.js +183 -74
  57. package/dist/native.js.map +1 -1
  58. package/dist/pricing-page.d.ts +62 -0
  59. package/dist/pricing-page.js +71 -0
  60. package/dist/pricing-page.js.map +1 -0
  61. package/dist/product-page.d.ts +83 -0
  62. package/dist/product-page.js +60 -0
  63. package/dist/product-page.js.map +1 -0
  64. package/dist/status-page.d.ts +42 -0
  65. package/dist/status-page.js +28 -0
  66. package/dist/status-page.js.map +1 -0
  67. package/package.json +233 -7
  68. package/registry/achievement.json +1 -1
  69. package/registry/action-bar.json +1 -1
  70. package/registry/alert.json +1 -1
  71. package/registry/app-shell.json +1 -1
  72. package/registry/argument-card.json +1 -1
  73. package/registry/audio-player.json +1 -1
  74. package/registry/auth-layout.json +1 -1
  75. package/registry/avatar.json +1 -1
  76. package/registry/badge.json +1 -1
  77. package/registry/button.json +1 -1
  78. package/registry/card-grid.json +1 -1
  79. package/registry/card.json +1 -1
  80. package/registry/catalogue-page.json +240 -0
  81. package/registry/changelog-page.json +226 -0
  82. package/registry/checkbox.json +1 -1
  83. package/registry/chip-link.json +1 -1
  84. package/registry/chip.json +1 -1
  85. package/registry/choice-grid.json +1 -1
  86. package/registry/code-block.json +1 -1
  87. package/registry/combobox.json +1 -1
  88. package/registry/command.json +1 -1
  89. package/registry/component-page.json +227 -0
  90. package/registry/confirm-button.json +1 -1
  91. package/registry/contact-page.json +212 -0
  92. package/registry/continue-prompt.json +1 -1
  93. package/registry/countdown.json +1 -1
  94. package/registry/cta-panel.json +1 -1
  95. package/registry/dashboard-layout.json +1 -1
  96. package/registry/data-table.json +1 -1
  97. package/registry/date-picker.json +1 -1
  98. package/registry/decision-list.json +1 -1
  99. package/registry/detail-layout.json +1 -1
  100. package/registry/dialog.json +1 -1
  101. package/registry/docs-article-page.json +242 -0
  102. package/registry/docs-hub-page.json +270 -0
  103. package/registry/docs-layout.json +1 -1
  104. package/registry/dropdown-menu.json +1 -1
  105. package/registry/empty-state.json +1 -1
  106. package/registry/error-page.json +183 -0
  107. package/registry/examples/catalogue-page/components.d.ts +4 -0
  108. package/registry/examples/catalogue-page/components.js +33 -0
  109. package/registry/examples/catalogue-page/components.tsx +36 -0
  110. package/registry/examples/changelog-page/releases.d.ts +4 -0
  111. package/registry/examples/changelog-page/releases.js +44 -0
  112. package/registry/examples/changelog-page/releases.tsx +39 -0
  113. package/registry/examples/component-page/button.d.ts +4 -0
  114. package/registry/examples/component-page/button.js +33 -0
  115. package/registry/examples/component-page/button.tsx +30 -0
  116. package/registry/examples/contact-page/team.d.ts +4 -0
  117. package/registry/examples/contact-page/team.js +39 -0
  118. package/registry/examples/contact-page/team.tsx +38 -0
  119. package/registry/examples/docs-article-page/cli.d.ts +4 -0
  120. package/registry/examples/docs-article-page/cli.js +33 -0
  121. package/registry/examples/docs-article-page/cli.tsx +38 -0
  122. package/registry/examples/docs-hub-page/krizaka.d.ts +4 -0
  123. package/registry/examples/docs-hub-page/krizaka.js +46 -0
  124. package/registry/examples/docs-hub-page/krizaka.tsx +37 -0
  125. package/registry/examples/error-page/not-found.d.ts +4 -0
  126. package/registry/examples/error-page/not-found.js +24 -0
  127. package/registry/examples/error-page/not-found.tsx +19 -0
  128. package/registry/examples/gallery-page/made-here.d.ts +4 -0
  129. package/registry/examples/gallery-page/made-here.js +34 -0
  130. package/registry/examples/gallery-page/made-here.tsx +32 -0
  131. package/registry/examples/how-it-works-page/orazaka.d.ts +4 -0
  132. package/registry/examples/how-it-works-page/orazaka.js +30 -0
  133. package/registry/examples/how-it-works-page/orazaka.tsx +26 -0
  134. package/registry/examples/landing-page/krizaka.d.ts +4 -0
  135. package/registry/examples/landing-page/krizaka.js +44 -0
  136. package/registry/examples/landing-page/krizaka.tsx +44 -0
  137. package/registry/examples/legal-page/privacy.d.ts +4 -0
  138. package/registry/examples/legal-page/privacy.js +24 -0
  139. package/registry/examples/legal-page/privacy.tsx +19 -0
  140. package/registry/examples/longform-page/story.d.ts +4 -0
  141. package/registry/examples/longform-page/story.js +38 -0
  142. package/registry/examples/longform-page/story.tsx +35 -0
  143. package/registry/examples/mascots/crane.d.ts +4 -0
  144. package/registry/examples/mascots/crane.js +19 -0
  145. package/registry/examples/mascots/crane.tsx +18 -0
  146. package/registry/examples/mascots/flock.tsx +2 -1
  147. package/registry/examples/mascots/native/crane.d.ts +4 -0
  148. package/registry/examples/mascots/native/crane.dark.png +0 -0
  149. package/registry/examples/mascots/native/crane.js +21 -0
  150. package/registry/examples/mascots/native/crane.light.png +0 -0
  151. package/registry/examples/mascots/native/crane.tsx +18 -0
  152. package/registry/examples/pricing-page/credits.d.ts +4 -0
  153. package/registry/examples/pricing-page/credits.js +41 -0
  154. package/registry/examples/pricing-page/credits.tsx +33 -0
  155. package/registry/examples/product-page/orazaka.d.ts +4 -0
  156. package/registry/examples/product-page/orazaka.js +44 -0
  157. package/registry/examples/product-page/orazaka.tsx +36 -0
  158. package/registry/examples/status-page/building.d.ts +4 -0
  159. package/registry/examples/status-page/building.js +29 -0
  160. package/registry/examples/status-page/building.tsx +25 -0
  161. package/registry/examples/status-page/operational.d.ts +4 -0
  162. package/registry/examples/status-page/operational.js +26 -0
  163. package/registry/examples/status-page/operational.tsx +20 -0
  164. package/registry/field.json +1 -1
  165. package/registry/file-upload.json +1 -1
  166. package/registry/filter-bar.json +1 -1
  167. package/registry/gallery-page.json +256 -0
  168. package/registry/glow-card.json +1 -1
  169. package/registry/goal-gauge.json +1 -1
  170. package/registry/how-it-works-page.json +242 -0
  171. package/registry/image-cropper.json +1 -1
  172. package/registry/index.json +309 -5
  173. package/registry/iso.json +1 -1
  174. package/registry/kbd.json +1 -1
  175. package/registry/landing-page.json +242 -0
  176. package/registry/landscape.json +1 -1
  177. package/registry/legal-page.json +199 -0
  178. package/registry/link-card.json +1 -1
  179. package/registry/loader.json +1 -1
  180. package/registry/longform-page.json +213 -0
  181. package/registry/marketing-layout.json +1 -1
  182. package/registry/marquee.json +1 -1
  183. package/registry/mascot-quote.json +6 -6
  184. package/registry/mascot-state.json +34 -34
  185. package/registry/mascots.json +41 -21
  186. package/registry/media-capture.json +1 -1
  187. package/registry/meter.json +1 -1
  188. package/registry/nav-bar.json +1 -1
  189. package/registry/number-ticker.json +1 -1
  190. package/registry/page-header.json +1 -1
  191. package/registry/page-hero.json +1 -1
  192. package/registry/page.json +1 -1
  193. package/registry/pagination.json +1 -1
  194. package/registry/pointer-light.json +1 -1
  195. package/registry/popover.json +1 -1
  196. package/registry/pricing-page.json +245 -0
  197. package/registry/product-page.json +319 -0
  198. package/registry/profile-card.json +1 -1
  199. package/registry/progress.json +1 -1
  200. package/registry/promise-card.json +1 -1
  201. package/registry/radio-group.json +1 -1
  202. package/registry/scroll-stage.json +1 -1
  203. package/registry/search-field.json +1 -1
  204. package/registry/section-backdrop.json +1 -1
  205. package/registry/separator.json +1 -1
  206. package/registry/settings-layout.json +1 -1
  207. package/registry/skeleton.json +1 -1
  208. package/registry/slider.json +1 -1
  209. package/registry/slot.json +1 -1
  210. package/registry/spinner.json +1 -1
  211. package/registry/split-view.json +1 -1
  212. package/registry/stage-banner.json +1 -1
  213. package/registry/stat.json +1 -1
  214. package/registry/status-page.json +263 -0
  215. package/registry/stepper.json +1 -1
  216. package/registry/switch.json +1 -1
  217. package/registry/tabs.json +1 -1
  218. package/registry/tag-input.json +1 -1
  219. package/registry/terminal-replay.json +1 -1
  220. package/registry/theme.json +1 -1
  221. package/registry/toast.json +1 -1
  222. package/registry/toc.json +1 -1
  223. package/registry/tooltip.json +1 -1
  224. package/registry/video-player.json +1 -1
  225. package/registry/video-trimmer.json +1 -1
  226. package/dist/chunk-NOVUREEC.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-KNBYZGSQ.js";
4
+
5
+ // src/gallery-page/gallery-page.tsx
6
+ import { CtaPanel } from "@krizaka/ui/cta-panel";
7
+ import { Section } from "@krizaka/ui/page";
8
+ import { PageHero } from "@krizaka/ui/page-hero";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ function GalleryPage({ brand, back, eyebrow, title, lead, actions, filters, galleryLabel, items, closing, linkAs, className, children, ...props }) {
11
+ return /* @__PURE__ */ jsxs("div", { className: cn(brand && "brand-" + brand, className), ...props, children: [
12
+ /* @__PURE__ */ jsx(PageHero, { back, linkAs, eyebrow, title, lead, align: "center", backdrop: "plain", children: actions }),
13
+ /* @__PURE__ */ jsxs(Section, { "aria-label": galleryLabel, spacing: "sm", children: [
14
+ filters && /* @__PURE__ */ jsx("div", { className: "kz-tpl-filters", children: filters }),
15
+ /* @__PURE__ */ jsx("ul", { className: "kz-tpl-gallery", children: items.map((item) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("figure", { className: "kz-tpl-figure", children: [
16
+ /* @__PURE__ */ jsx("div", { className: "kz-tpl-figure-media", children: item.media }),
17
+ /* @__PURE__ */ jsxs("figcaption", { children: [
18
+ /* @__PURE__ */ jsx("strong", { children: item.title }),
19
+ item.caption && /* @__PURE__ */ jsx("span", { children: item.caption })
20
+ ] })
21
+ ] }) }, item.id)) })
22
+ ] }),
23
+ children,
24
+ closing && /* @__PURE__ */ jsx(Section, { spacing: "sm", "aria-labelledby": "gallery-closing", children: /* @__PURE__ */ jsx(CtaPanel, { id: "gallery-closing", title: closing.title, body: closing.body, reveal: true, children: closing.actions }) })
25
+ ] });
26
+ }
27
+ export {
28
+ GalleryPage
29
+ };
30
+ //# sourceMappingURL=gallery-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/gallery-page/gallery-page.tsx"],"sourcesContent":["// Server-safe. A demo or a gallery (blocks.css `.kz-tpl-gallery`): the hero, the filters as chips, then the pieces in\n// columns of different heights — each a framed media with its title and caption (a recording of the real product, an\n// image it generated, with its prompt) — and the closing call.\nimport { CtaPanel } from \"@krizaka/ui/cta-panel\";\nimport { Section } from \"@krizaka/ui/page\";\nimport type { LinkComponent } from \"@krizaka/ui/page-hero\";\nimport { PageHero } from \"@krizaka/ui/page-hero\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport interface GalleryItem {\n /** A stable key. */\n id: string;\n /** The media: an `<img>` with its `alt`, a `<video>` with its label, a VideoPlayer. */\n media: React.ReactNode;\n /** Its title. */\n title: React.ReactNode;\n /** One line: what it shows, how it was made (a prompt, a seed). */\n caption?: React.ReactNode;\n}\n\nexport type GalleryPageProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The brand the page wears (`.brand-<id>`). */\n brand?: string;\n /** The way back. */\n back?: { href: string; label: string };\n /** A mono line above the title. */\n eyebrow?: React.ReactNode;\n /** The page's `h1`. */\n title: React.ReactNode;\n /** One or two sentences under it. */\n lead?: React.ReactNode;\n /** The hero's actions. */\n actions?: React.ReactNode;\n /** Above the pieces: the filters (ChipLink, a Chip group) — the address says which one is on. */\n filters?: React.ReactNode;\n /** The gallery's accessible name. */\n galleryLabel: string;\n /** The pieces, featured first. */\n items: readonly GalleryItem[];\n /** After the gallery: how it was made, the facts. */\n children?: React.ReactNode;\n /** The closing call. */\n closing?: { title: React.ReactNode; body?: React.ReactNode; actions: React.ReactNode };\n /** The app's link component (Next's `Link`). */\n linkAs?: LinkComponent;\n};\n\n/** A demo or a gallery: hero, filters, media in staggered columns, closing call. */\nexport function GalleryPage({ brand, back, eyebrow, title, lead, actions, filters, galleryLabel, items, closing, linkAs, className, children, ...props }: GalleryPageProps) {\n return (\n <div className={cn(brand && \"brand-\" + brand, className)} {...props}>\n <PageHero back={back} linkAs={linkAs} eyebrow={eyebrow} title={title} lead={lead} align=\"center\" backdrop=\"plain\">\n {actions}\n </PageHero>\n <Section aria-label={galleryLabel} spacing=\"sm\">\n {filters && <div className=\"kz-tpl-filters\">{filters}</div>}\n <ul className=\"kz-tpl-gallery\">\n {items.map((item) => (\n <li key={item.id}>\n <figure className=\"kz-tpl-figure\">\n <div className=\"kz-tpl-figure-media\">{item.media}</div>\n <figcaption>\n <strong>{item.title}</strong>\n {item.caption && <span>{item.caption}</span>}\n </figcaption>\n </figure>\n </li>\n ))}\n </ul>\n </Section>\n {children}\n {closing && (\n <Section spacing=\"sm\" aria-labelledby=\"gallery-closing\">\n <CtaPanel id=\"gallery-closing\" title={closing.title} body={closing.body} reveal>\n {closing.actions}\n </CtaPanel>\n </Section>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AAGA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,gBAAgB;AA+CnB,cAUU,YAVV;AAHC,SAAS,YAAY,EAAE,OAAO,MAAM,SAAS,OAAO,MAAM,SAAS,SAAS,cAAc,OAAO,SAAS,QAAQ,WAAW,UAAU,GAAG,MAAM,GAAqB;AAC1K,SACE,qBAAC,SAAI,WAAW,GAAG,SAAS,WAAW,OAAO,SAAS,GAAI,GAAG,OAC5D;AAAA,wBAAC,YAAS,MAAY,QAAgB,SAAkB,OAAc,MAAY,OAAM,UAAS,UAAS,SACvG,mBACH;AAAA,IACA,qBAAC,WAAQ,cAAY,cAAc,SAAQ,MACxC;AAAA,iBAAW,oBAAC,SAAI,WAAU,kBAAkB,mBAAQ;AAAA,MACrD,oBAAC,QAAG,WAAU,kBACX,gBAAM,IAAI,CAAC,SACV,oBAAC,QACC,+BAAC,YAAO,WAAU,iBAChB;AAAA,4BAAC,SAAI,WAAU,uBAAuB,eAAK,OAAM;AAAA,QACjD,qBAAC,gBACC;AAAA,8BAAC,YAAQ,eAAK,OAAM;AAAA,UACnB,KAAK,WAAW,oBAAC,UAAM,eAAK,SAAQ;AAAA,WACvC;AAAA,SACF,KAPO,KAAK,EAQd,CACD,GACH;AAAA,OACF;AAAA,IACC;AAAA,IACA,WACC,oBAAC,WAAQ,SAAQ,MAAK,mBAAgB,mBACpC,8BAAC,YAAS,IAAG,mBAAkB,OAAO,QAAQ,OAAO,MAAM,QAAQ,MAAM,QAAM,MAC5E,kBAAQ,SACX,GACF;AAAA,KAEJ;AAEJ;","names":[]}
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * The Krizaka flock — the geometry of the mascots, drawn by the web `Mascot` (`./mascot.tsx`) and the native one
3
3
  * (`../native/mascots.tsx`). Five birds that have carried the Krizaka story since the first site (the sentry falcon,
4
- * the owl that reads, the developer duck, the flamingo that answers, the carrier pigeon) and the lovebird that
5
- * introduces (2026-10, with Yazakia: "l'inséparable présente"), redrawn on one 120 × 120 grid so that any bird can
6
- * wear any mood.
4
+ * the owl that reads, the developer duck, the flamingo that answers, the carrier pigeon), the lovebird that
5
+ * introduces (2026-10, with Yazakia: "l'inséparable présente") and the crane that listens (2026-10, with Yororis:
6
+ * "la grue écoute"), redrawn on one 120 × 120 grid so that any bird can wear any mood.
7
7
  *
8
8
  * Colours are roles, never fixed: `brand` (the default) paints a bird in the host's accent (`--kz-accent`,
9
9
  * `--kz-accent-2`), so the same falcon is blue on krizaka.com, orange in Orazaka and violet in Orochia; `own` gives
10
10
  * each bird the signature palette it has in the Krizaka story (the brand layer's exception, like the marks). Shades
11
11
  * and highlights are black and white at a low opacity over the role, so they hold in both themes.
12
12
  */
13
- declare const MASCOT_BIRDS: readonly ["falcon", "owl", "duck", "flamingo", "pigeon", "lovebird"];
13
+ declare const MASCOT_BIRDS: readonly ["falcon", "owl", "duck", "flamingo", "pigeon", "lovebird", "crane"];
14
14
  type MascotBird = (typeof MASCOT_BIRDS)[number];
15
15
  declare const MASCOT_MOODS: readonly ["welcome", "thinking", "success", "empty", "error"];
16
16
  type MascotMood = (typeof MASCOT_MOODS)[number];
@@ -0,0 +1,48 @@
1
+ import { LinkComponent } from '@krizaka/ui/page-hero';
2
+ import * as React from 'react';
3
+
4
+ interface HowStep {
5
+ /** A stable key (the step's anchor). */
6
+ id: string;
7
+ /** What happens, in a few words. */
8
+ title: React.ReactNode;
9
+ /** How, in two or three sentences. */
10
+ text: React.ReactNode;
11
+ /** Beside the words: a code block, a schema, a screen. */
12
+ visual?: React.ReactNode;
13
+ }
14
+ type HowItWorksPageProps = Omit<React.HTMLAttributes<HTMLElement>, "title"> & {
15
+ /** The brand the page wears (`.brand-<id>`). */
16
+ brand?: string;
17
+ /** The way back to the product. */
18
+ back?: {
19
+ href: string;
20
+ label: string;
21
+ };
22
+ /** A mono line above the title. */
23
+ eyebrow?: React.ReactNode;
24
+ /** The page's `h1`. */
25
+ title: React.ReactNode;
26
+ /** One or two sentences under it. */
27
+ lead?: React.ReactNode;
28
+ /** Beside the hero: the page's bird or an illustration. */
29
+ aside?: React.ReactNode;
30
+ /** The steps' accessible name (`The steps`). */
31
+ stepsLabel: string;
32
+ /** The steps, in order. */
33
+ steps: readonly HowStep[];
34
+ /** After the steps: architecture, guarantees, a module map. */
35
+ children?: React.ReactNode;
36
+ /** The closing call. */
37
+ closing?: {
38
+ title: React.ReactNode;
39
+ body?: React.ReactNode;
40
+ actions: React.ReactNode;
41
+ };
42
+ /** The app's link component (Next's `Link`). */
43
+ linkAs?: LinkComponent;
44
+ };
45
+ /** How a product works: the hero, a numbered timeline of steps with their visuals, then the details. */
46
+ declare function HowItWorksPage({ brand, back, eyebrow, title, lead, aside, stepsLabel, steps, closing, linkAs, className, children, ...props }: HowItWorksPageProps): React.JSX.Element;
47
+
48
+ export { HowItWorksPage, type HowItWorksPageProps, type HowStep };
@@ -0,0 +1,28 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-KNBYZGSQ.js";
4
+
5
+ // src/how-it-works-page/how-it-works-page.tsx
6
+ import { CtaPanel } from "@krizaka/ui/cta-panel";
7
+ import { Section } from "@krizaka/ui/page";
8
+ import { PageHero } from "@krizaka/ui/page-hero";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ function HowItWorksPage({ brand, back, eyebrow, title, lead, aside, stepsLabel, steps, closing, linkAs, className, children, ...props }) {
11
+ return /* @__PURE__ */ jsxs("div", { className: cn(brand && "brand-" + brand, className), ...props, children: [
12
+ /* @__PURE__ */ jsx(PageHero, { back, linkAs, eyebrow, title, lead, aside }),
13
+ /* @__PURE__ */ jsx(Section, { "aria-label": stepsLabel, children: /* @__PURE__ */ jsx("ol", { className: "kz-tpl-timeline", children: steps.map((step, i) => /* @__PURE__ */ jsxs("li", { id: step.id, className: "kz-tpl-step", "data-reveal": "", children: [
14
+ /* @__PURE__ */ jsx("span", { className: "kz-tpl-step-n", "aria-hidden": true, children: i + 1 }),
15
+ /* @__PURE__ */ jsxs("div", { className: "kz-tpl-step-text", children: [
16
+ /* @__PURE__ */ jsx("h2", { children: step.title }),
17
+ /* @__PURE__ */ jsx("p", { children: step.text })
18
+ ] }),
19
+ step.visual && /* @__PURE__ */ jsx("div", { className: "kz-tpl-step-visual", children: step.visual })
20
+ ] }, step.id)) }) }),
21
+ children,
22
+ closing && /* @__PURE__ */ jsx(Section, { spacing: "sm", "aria-labelledby": "how-closing", children: /* @__PURE__ */ jsx(CtaPanel, { id: "how-closing", title: closing.title, body: closing.body, reveal: true, children: closing.actions }) })
23
+ ] });
24
+ }
25
+ export {
26
+ HowItWorksPage
27
+ };
28
+ //# sourceMappingURL=how-it-works-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/how-it-works-page/how-it-works-page.tsx"],"sourcesContent":["// Server-safe. How a product works, told in steps (blocks.css `.kz-tpl-timeline`): the hero, then a numbered line\n// down the page — each step its words beside its visual (a command, a schema, a screen), the sides alternating on a\n// wide screen, one column on a phone — then what is under the hood and the closing call.\nimport { CtaPanel } from \"@krizaka/ui/cta-panel\";\nimport { Section } from \"@krizaka/ui/page\";\nimport type { LinkComponent } from \"@krizaka/ui/page-hero\";\nimport { PageHero } from \"@krizaka/ui/page-hero\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport interface HowStep {\n /** A stable key (the step's anchor). */\n id: string;\n /** What happens, in a few words. */\n title: React.ReactNode;\n /** How, in two or three sentences. */\n text: React.ReactNode;\n /** Beside the words: a code block, a schema, a screen. */\n visual?: React.ReactNode;\n}\n\nexport type HowItWorksPageProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The brand the page wears (`.brand-<id>`). */\n brand?: string;\n /** The way back to the product. */\n back?: { href: string; label: string };\n /** A mono line above the title. */\n eyebrow?: React.ReactNode;\n /** The page's `h1`. */\n title: React.ReactNode;\n /** One or two sentences under it. */\n lead?: React.ReactNode;\n /** Beside the hero: the page's bird or an illustration. */\n aside?: React.ReactNode;\n /** The steps' accessible name (`The steps`). */\n stepsLabel: string;\n /** The steps, in order. */\n steps: readonly HowStep[];\n /** After the steps: architecture, guarantees, a module map. */\n children?: React.ReactNode;\n /** The closing call. */\n closing?: { title: React.ReactNode; body?: React.ReactNode; actions: React.ReactNode };\n /** The app's link component (Next's `Link`). */\n linkAs?: LinkComponent;\n};\n\n/** How a product works: the hero, a numbered timeline of steps with their visuals, then the details. */\nexport function HowItWorksPage({ brand, back, eyebrow, title, lead, aside, stepsLabel, steps, closing, linkAs, className, children, ...props }: HowItWorksPageProps) {\n return (\n <div className={cn(brand && \"brand-\" + brand, className)} {...props}>\n <PageHero back={back} linkAs={linkAs} eyebrow={eyebrow} title={title} lead={lead} aside={aside} />\n <Section aria-label={stepsLabel}>\n <ol className=\"kz-tpl-timeline\">\n {steps.map((step, i) => (\n <li key={step.id} id={step.id} className=\"kz-tpl-step\" data-reveal=\"\">\n <span className=\"kz-tpl-step-n\" aria-hidden>\n {i + 1}\n </span>\n <div className=\"kz-tpl-step-text\">\n <h2>{step.title}</h2>\n <p>{step.text}</p>\n </div>\n {step.visual && <div className=\"kz-tpl-step-visual\">{step.visual}</div>}\n </li>\n ))}\n </ol>\n </Section>\n {children}\n {closing && (\n <Section spacing=\"sm\" aria-labelledby=\"how-closing\">\n <CtaPanel id=\"how-closing\" title={closing.title} body={closing.body} reveal>\n {closing.actions}\n </CtaPanel>\n </Section>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AAGA,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,gBAAgB;AA6CnB,cAQQ,YARR;AAHC,SAAS,eAAe,EAAE,OAAO,MAAM,SAAS,OAAO,MAAM,OAAO,YAAY,OAAO,SAAS,QAAQ,WAAW,UAAU,GAAG,MAAM,GAAwB;AACnK,SACE,qBAAC,SAAI,WAAW,GAAG,SAAS,WAAW,OAAO,SAAS,GAAI,GAAG,OAC5D;AAAA,wBAAC,YAAS,MAAY,QAAgB,SAAkB,OAAc,MAAY,OAAc;AAAA,IAChG,oBAAC,WAAQ,cAAY,YACnB,8BAAC,QAAG,WAAU,mBACX,gBAAM,IAAI,CAAC,MAAM,MAChB,qBAAC,QAAiB,IAAI,KAAK,IAAI,WAAU,eAAc,eAAY,IACjE;AAAA,0BAAC,UAAK,WAAU,iBAAgB,eAAW,MACxC,cAAI,GACP;AAAA,MACA,qBAAC,SAAI,WAAU,oBACb;AAAA,4BAAC,QAAI,eAAK,OAAM;AAAA,QAChB,oBAAC,OAAG,eAAK,MAAK;AAAA,SAChB;AAAA,MACC,KAAK,UAAU,oBAAC,SAAI,WAAU,sBAAsB,eAAK,QAAO;AAAA,SAR1D,KAAK,EASd,CACD,GACH,GACF;AAAA,IACC;AAAA,IACA,WACC,oBAAC,WAAQ,SAAQ,MAAK,mBAAgB,eACpC,8BAAC,YAAS,IAAG,eAAc,OAAO,QAAQ,OAAO,MAAM,QAAQ,MAAM,QAAM,MACxE,kBAAQ,SACX,GACF;AAAA,KAEJ;AAEJ;","names":[]}
package/dist/index.d.ts CHANGED
@@ -34,7 +34,7 @@ declare function OrazakaLogo({ size, animated, title, className }: MarkProps): R
34
34
  */
35
35
  declare function OrochiaLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
36
36
 
37
- type BrandId = "krizaka" | "orazaka" | "orochia" | "yazakia";
37
+ type BrandId = "krizaka" | "orazaka" | "orochia" | "yazakia" | "yororis";
38
38
  /** The mark of a Krizaka brand by id — for navigation, cards and lists driven by data. */
39
39
  declare function ProductLogo({ id, ...props }: MarkProps & {
40
40
  id: BrandId;
@@ -49,4 +49,13 @@ declare function ProductLogo({ id, ...props }: MarkProps & {
49
49
  */
50
50
  declare function YazakiaLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
51
51
 
52
- export { type BrandId, KrizakaLogo, type MarkProps, OrazakaLogo, OrochiaLogo, ProductLogo, YazakiaLogo, cx };
52
+ /**
53
+ * The Yororis mark, "the hold": a "Y" whose arms are two filled leaves — open hands — rising from one stem and cupping
54
+ * a warm core that breathes: held, given room, listened to. Leaves in the Yororis gradient (sand → sage, the brand's
55
+ * mark gradient of @krizaka/tokens, the same in dark and light), a vein of light along each, the core in a warm sand
56
+ * light; the moment, one node on the dashed orbit, comes round slowly. The family's grammar (orbit, ring, bold emblem,
57
+ * bright core) with the slowest breath of the family. Below 48 px it crops to the emblem.
58
+ */
59
+ declare function YororisLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
60
+
61
+ export { type BrandId, KrizakaLogo, type MarkProps, OrazakaLogo, OrochiaLogo, ProductLogo, YazakiaLogo, YororisLogo, cx };
package/dist/index.js CHANGED
@@ -52,6 +52,16 @@ var marks = /* @__PURE__ */ Object.freeze({
52
52
  "100%",
53
53
  "#089b96"
54
54
  ]
55
+ ],
56
+ "yororis": [
57
+ [
58
+ "0%",
59
+ "#a4773d"
60
+ ],
61
+ [
62
+ "100%",
63
+ "#5d894d"
64
+ ]
55
65
  ]
56
66
  });
57
67
 
@@ -330,13 +340,90 @@ function YazakiaLogo({ size = 32, animated = true, title, className }) {
330
340
  ] });
331
341
  }
332
342
 
343
+ // src/marks/yororis-geometry.ts
344
+ var sand = marks.yororis[0][1];
345
+ var sage = marks.yororis[marks.yororis.length - 1][1];
346
+ var YORORIS = {
347
+ viewBox: "0 0 400 400",
348
+ croppedViewBox: "80 80 240 240",
349
+ center: 200,
350
+ /** The two leaves — open hands, mirrored around x = 200 — filled, rising from the stem. */
351
+ leaves: [
352
+ "M200 262 C142 256 104 206 110 122 C138 130 154 152 160 180 C168 218 182 238 204 246 Z",
353
+ "M200 262 C258 256 296 206 290 122 C262 130 246 152 240 180 C232 218 218 238 196 246 Z"
354
+ ],
355
+ /** A vein of light along each leaf (dashed, it drifts slowly when animated). */
356
+ veins: "M122 142 C128 196 156 232 192 248 M278 142 C272 196 244 232 208 248",
357
+ vein: { color: "#fbf6ea", opacity: 0.45, width: 3, dash: "2 14" },
358
+ /** The stem, from the junction down. */
359
+ stem: "M200 244 L200 312",
360
+ stroke: 30,
361
+ gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yororis },
362
+ /** The core's warm light: from the mark's sand (below) to a light sand (above). */
363
+ coreGradient: { stops: [["0%", sand], ["100%", "#e6c993"]] },
364
+ /** The core, held in the hollow of the leaves (not on the junction): the one who is listened to. It breathes. */
365
+ core: { cx: 200, cy: 184, r: 32, inner: 11 },
366
+ highlight: "#fbf6ea",
367
+ /** The moment: one node on the orbit, that turns with it. */
368
+ moment: { r: 9, at: [200, 40] },
369
+ glow: { color: sage, opacity: 0.18 },
370
+ /** The core's breathing shadow (web), in the core's warm sand. */
371
+ pulse: { color: sand, low: 0.3, high: 0.6 },
372
+ orbit: { r: 160, dash: "8 8", width: 1.5 },
373
+ ring: { r: 134, width: 1 }
374
+ };
375
+
376
+ // src/marks/YororisLogo.tsx
377
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
378
+ var CSS5 = `
379
+ .yrm-orbit { transform-origin: 200px 200px; animation: yrm-orbit 36s linear infinite; }
380
+ .yrm-vein { animation: yrm-vein 4.8s linear infinite; }
381
+ .yrm-core { transform-box: fill-box; transform-origin: center; animation: yrm-core 4.2s ease-in-out infinite; }
382
+ @keyframes yrm-orbit { to { transform: rotate(360deg); } }
383
+ @keyframes yrm-vein { to { stroke-dashoffset: 64; } }
384
+ @keyframes yrm-core {
385
+ 0%, 100% { filter: drop-shadow(0 0 6px ${withAlpha(YORORIS.pulse.color, YORORIS.pulse.low)}); opacity: .9; }
386
+ 50% { filter: drop-shadow(0 0 16px ${withAlpha(YORORIS.pulse.color, YORORIS.pulse.high)}); opacity: 1; }
387
+ }
388
+ @media (prefers-reduced-motion: reduce) { .yrm-orbit, .yrm-vein, .yrm-core { animation: none; } }
389
+ `;
390
+ function YororisLogo({ size = 32, animated = true, title, className }) {
391
+ const id = useIds("yrm", ["gradient", "core", "glow"]);
392
+ const fill = `url(#${id.gradient})`;
393
+ return /* @__PURE__ */ jsxs5("svg", { width: size, height: size, viewBox: size < 48 ? YORORIS.croppedViewBox : YORORIS.viewBox, fill: "none", xmlns: "http://www.w3.org/2000/svg", className, ...a11y(title), children: [
394
+ /* @__PURE__ */ jsx5("style", { children: CSS5 }),
395
+ /* @__PURE__ */ jsxs5("defs", { children: [
396
+ /* @__PURE__ */ jsx5("linearGradient", { id: id.gradient, gradientUnits: "userSpaceOnUse", x1: YORORIS.gradient.x1, y1: YORORIS.gradient.y1, x2: YORORIS.gradient.x2, y2: YORORIS.gradient.y2, children: YORORIS.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx5("stop", { offset, stopColor: color }, offset)) }),
397
+ /* @__PURE__ */ jsx5("linearGradient", { id: id.core, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YORORIS.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx5("stop", { offset, stopColor: color }, offset)) }),
398
+ /* @__PURE__ */ jsxs5("radialGradient", { id: id.glow, cx: "50%", cy: "50%", r: "50%", children: [
399
+ /* @__PURE__ */ jsx5("stop", { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
400
+ /* @__PURE__ */ jsx5("stop", { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: "0" })
401
+ ] })
402
+ ] }),
403
+ size >= 48 ? /* @__PURE__ */ jsx5("circle", { cx: YORORIS.center, cy: YORORIS.center, r: "190", fill: `url(#${id.glow})` }) : null,
404
+ /* @__PURE__ */ jsx5("circle", { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke: neutral("--kz-border-default", 30), strokeWidth: YORORIS.ring.width, opacity: ".35" }),
405
+ /* @__PURE__ */ jsxs5("g", { className: animated ? "yrm-orbit" : void 0, children: [
406
+ /* @__PURE__ */ jsx5("circle", { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.orbit.r, stroke: neutral("--kz-border-strong", 40), strokeWidth: YORORIS.orbit.width, strokeDasharray: YORORIS.orbit.dash, opacity: ".6" }),
407
+ /* @__PURE__ */ jsx5("circle", { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
408
+ ] }),
409
+ /* @__PURE__ */ jsx5("path", { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round" }),
410
+ YORORIS.leaves.map((d) => /* @__PURE__ */ jsx5("path", { d, fill }, d)),
411
+ /* @__PURE__ */ jsx5("path", { className: animated ? "yrm-vein" : void 0, d: YORORIS.veins, stroke: YORORIS.vein.color, strokeOpacity: YORORIS.vein.opacity, strokeWidth: YORORIS.vein.width, strokeLinecap: "round", strokeDasharray: YORORIS.vein.dash }),
412
+ /* @__PURE__ */ jsxs5("g", { className: animated ? "yrm-core" : void 0, children: [
413
+ /* @__PURE__ */ jsx5("circle", { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id.core})` }),
414
+ /* @__PURE__ */ jsx5("circle", { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
415
+ ] })
416
+ ] });
417
+ }
418
+
333
419
  // src/marks/ProductLogo.tsx
334
- import { jsx as jsx5 } from "react/jsx-runtime";
420
+ import { jsx as jsx6 } from "react/jsx-runtime";
335
421
  function ProductLogo({ id, ...props }) {
336
- if (id === "krizaka") return /* @__PURE__ */ jsx5(KrizakaLogo, { ...props });
337
- if (id === "orazaka") return /* @__PURE__ */ jsx5(OrazakaLogo, { ...props });
338
- if (id === "yazakia") return /* @__PURE__ */ jsx5(YazakiaLogo, { ...props });
339
- return /* @__PURE__ */ jsx5(OrochiaLogo, { ...props });
422
+ if (id === "krizaka") return /* @__PURE__ */ jsx6(KrizakaLogo, { ...props });
423
+ if (id === "orazaka") return /* @__PURE__ */ jsx6(OrazakaLogo, { ...props });
424
+ if (id === "yazakia") return /* @__PURE__ */ jsx6(YazakiaLogo, { ...props });
425
+ if (id === "yororis") return /* @__PURE__ */ jsx6(YororisLogo, { ...props });
426
+ return /* @__PURE__ */ jsx6(OrochiaLogo, { ...props });
340
427
  }
341
428
  export {
342
429
  KrizakaLogo,
@@ -346,6 +433,7 @@ export {
346
433
  ProductLogo,
347
434
  RotatingWord,
348
435
  YazakiaLogo,
436
+ YororisLogo,
349
437
  cx
350
438
  };
351
439
  //# sourceMappingURL=index.js.map