@krizaka/ui 2.2.0 → 2.3.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 (263) hide show
  1. package/README.md +17 -7
  2. package/dist/{button-Cgfkg_3y.d.ts → button-BMAO7dKF.d.ts} +29 -2
  3. package/dist/button.d.ts +32 -5
  4. package/dist/button.js +62 -9
  5. package/dist/button.js.map +1 -1
  6. package/dist/chip-link.d.ts +53 -0
  7. package/dist/chip-link.js +32 -0
  8. package/dist/chip-link.js.map +1 -0
  9. package/dist/chunk-43PTCDTL.js +31 -0
  10. package/dist/chunk-43PTCDTL.js.map +1 -0
  11. package/dist/chunk-6ISW63JI.js +11 -0
  12. package/dist/chunk-6ISW63JI.js.map +1 -0
  13. package/dist/chunk-HAQWKORZ.js +117 -0
  14. package/dist/chunk-HAQWKORZ.js.map +1 -0
  15. package/dist/{chunk-FHYZSO2S.js → chunk-R6SDS7JM.js} +5 -3
  16. package/dist/chunk-R6SDS7JM.js.map +1 -0
  17. package/dist/chunk-RUPNPMP3.js +103 -0
  18. package/dist/chunk-RUPNPMP3.js.map +1 -0
  19. package/dist/chunk-VDR2EP6K.js +49 -0
  20. package/dist/chunk-VDR2EP6K.js.map +1 -0
  21. package/dist/chunk-WEVYKZIF.js +33 -0
  22. package/dist/chunk-WEVYKZIF.js.map +1 -0
  23. package/dist/command.d.ts +7 -7
  24. package/dist/command.js +3 -2
  25. package/dist/command.js.map +1 -1
  26. package/dist/confirm-button.d.ts +1 -1
  27. package/dist/confirm-button.js +2 -1
  28. package/dist/confirm-button.js.map +1 -1
  29. package/dist/{dialog-GQ4Nvuyf.d.ts → dialog-D42QwYb_.d.ts} +11 -1
  30. package/dist/dialog.d.ts +1 -1
  31. package/dist/dialog.js +3 -2
  32. package/dist/dialog.js.map +1 -1
  33. package/dist/glow-card.d.ts +20 -0
  34. package/dist/glow-card.js +30 -0
  35. package/dist/glow-card.js.map +1 -0
  36. package/dist/index.d.ts +2 -20
  37. package/dist/index.js +7 -64
  38. package/dist/index.js.map +1 -1
  39. package/dist/iso.d.ts +400 -0
  40. package/dist/iso.js +363 -0
  41. package/dist/iso.js.map +1 -0
  42. package/dist/loader.d.ts +206 -0
  43. package/dist/loader.js +138 -0
  44. package/dist/loader.js.map +1 -0
  45. package/dist/marquee.d.ts +33 -0
  46. package/dist/marquee.js +52 -0
  47. package/dist/marquee.js.map +1 -0
  48. package/dist/meter.d.ts +146 -0
  49. package/dist/meter.js +107 -0
  50. package/dist/meter.js.map +1 -0
  51. package/dist/motion.css +394 -3
  52. package/dist/motion.d.ts +46 -0
  53. package/dist/motion.js +10 -0
  54. package/dist/motion.js.map +1 -0
  55. package/dist/nav-bar.d.ts +178 -0
  56. package/dist/nav-bar.js +157 -0
  57. package/dist/nav-bar.js.map +1 -0
  58. package/dist/number-ticker.d.ts +32 -0
  59. package/dist/number-ticker.js +61 -0
  60. package/dist/number-ticker.js.map +1 -0
  61. package/dist/progress.d.ts +56 -1
  62. package/dist/progress.js +72 -25
  63. package/dist/progress.js.map +1 -1
  64. package/dist/skeleton.d.ts +18 -3
  65. package/dist/skeleton.js +9 -1
  66. package/dist/skeleton.js.map +1 -1
  67. package/dist/spinner.d.ts +21 -5
  68. package/dist/spinner.js +13 -12
  69. package/dist/spinner.js.map +1 -1
  70. package/dist/stepper.d.ts +112 -0
  71. package/dist/stepper.js +67 -0
  72. package/dist/stepper.js.map +1 -0
  73. package/dist/tabs.d.ts +1 -1
  74. package/dist/tabs.js +14 -8
  75. package/dist/tabs.js.map +1 -1
  76. package/dist/theme.d.ts +1 -1
  77. package/dist/theme.js +2 -1
  78. package/dist/theme.js.map +1 -1
  79. package/dist/toast.d.ts +39 -4
  80. package/dist/toast.js +81 -7
  81. package/dist/toast.js.map +1 -1
  82. package/package.json +148 -8
  83. package/registry/alert.json +1 -1
  84. package/registry/avatar.json +1 -1
  85. package/registry/badge.json +1 -1
  86. package/registry/button.json +232 -26
  87. package/registry/card.json +1 -1
  88. package/registry/checkbox.json +1 -1
  89. package/registry/chip-link.json +158 -0
  90. package/registry/chip.json +1 -1
  91. package/registry/command.json +1 -1
  92. package/registry/confirm-button.json +91 -7
  93. package/registry/countdown.json +1 -1
  94. package/registry/dialog.json +15 -7
  95. package/registry/dropdown-menu.json +1 -1
  96. package/registry/empty-state.json +1 -1
  97. package/registry/examples/button/error.js +11 -0
  98. package/registry/examples/button/error.tsx +10 -0
  99. package/registry/examples/button/loading.tsx +1 -1
  100. package/registry/examples/button/save-flow.d.ts +4 -0
  101. package/registry/examples/button/save-flow.js +28 -0
  102. package/registry/examples/button/save-flow.tsx +24 -0
  103. package/registry/examples/button/signature.d.ts +4 -0
  104. package/registry/examples/button/signature.js +17 -0
  105. package/registry/examples/button/signature.tsx +19 -0
  106. package/registry/examples/button/upload-progress.d.ts +4 -0
  107. package/registry/examples/button/upload-progress.js +23 -0
  108. package/registry/examples/button/upload-progress.tsx +26 -0
  109. package/registry/examples/chip-link/filters.d.ts +4 -0
  110. package/registry/examples/chip-link/filters.js +12 -0
  111. package/registry/examples/chip-link/filters.tsx +17 -0
  112. package/registry/examples/dialog/left.d.ts +4 -0
  113. package/registry/examples/dialog/left.js +22 -0
  114. package/registry/examples/dialog/left.tsx +32 -0
  115. package/registry/examples/glow-card/link-card.d.ts +4 -0
  116. package/registry/examples/glow-card/link-card.js +14 -0
  117. package/registry/examples/glow-card/link-card.tsx +13 -0
  118. package/registry/examples/glow-card/plans.d.ts +4 -0
  119. package/registry/examples/glow-card/plans.js +25 -0
  120. package/registry/examples/glow-card/plans.tsx +26 -0
  121. package/registry/examples/glow-card/spotlight.d.ts +4 -0
  122. package/registry/examples/glow-card/spotlight.js +14 -0
  123. package/registry/examples/glow-card/spotlight.tsx +15 -0
  124. package/registry/examples/iso/compose.d.ts +4 -0
  125. package/registry/examples/iso/compose.js +22 -0
  126. package/registry/examples/iso/compose.tsx +19 -0
  127. package/registry/examples/iso/orazaka-hero.d.ts +4 -0
  128. package/registry/examples/iso/orazaka-hero.js +26 -0
  129. package/registry/examples/iso/orazaka-hero.tsx +21 -0
  130. package/registry/examples/iso/orochia-hero.d.ts +4 -0
  131. package/registry/examples/iso/orochia-hero.js +29 -0
  132. package/registry/examples/iso/orochia-hero.tsx +23 -0
  133. package/registry/examples/iso/still.d.ts +4 -0
  134. package/registry/examples/iso/still.js +21 -0
  135. package/registry/examples/iso/still.tsx +15 -0
  136. package/registry/examples/loader/endings.d.ts +4 -0
  137. package/registry/examples/loader/endings.js +14 -0
  138. package/registry/examples/loader/endings.tsx +11 -0
  139. package/registry/examples/loader/fetch-flow.d.ts +4 -0
  140. package/registry/examples/loader/fetch-flow.js +24 -0
  141. package/registry/examples/loader/fetch-flow.tsx +24 -0
  142. package/registry/examples/loader/minimal.d.ts +4 -0
  143. package/registry/examples/loader/minimal.js +11 -0
  144. package/registry/examples/loader/minimal.tsx +6 -0
  145. package/registry/examples/loader/overlay.d.ts +4 -0
  146. package/registry/examples/loader/overlay.js +16 -0
  147. package/registry/examples/loader/overlay.tsx +13 -0
  148. package/registry/examples/loader/region-handover.d.ts +4 -0
  149. package/registry/examples/loader/region-handover.js +42 -0
  150. package/registry/examples/loader/region-handover.tsx +29 -0
  151. package/registry/examples/loader/upload-eta.d.ts +4 -0
  152. package/registry/examples/loader/upload-eta.js +11 -0
  153. package/registry/examples/loader/upload-eta.tsx +10 -0
  154. package/registry/examples/marquee/cards.d.ts +4 -0
  155. package/registry/examples/marquee/cards.js +23 -0
  156. package/registry/examples/marquee/cards.tsx +21 -0
  157. package/registry/examples/marquee/logos.d.ts +4 -0
  158. package/registry/examples/marquee/logos.js +12 -0
  159. package/registry/examples/marquee/logos.tsx +17 -0
  160. package/registry/examples/meter/balance.d.ts +4 -0
  161. package/registry/examples/meter/balance.js +14 -0
  162. package/registry/examples/meter/balance.tsx +15 -0
  163. package/registry/examples/meter/quota.d.ts +4 -0
  164. package/registry/examples/meter/quota.js +15 -0
  165. package/registry/examples/meter/quota.tsx +12 -0
  166. package/registry/examples/meter/split.d.ts +4 -0
  167. package/registry/examples/meter/split.js +18 -0
  168. package/registry/examples/meter/split.tsx +18 -0
  169. package/registry/examples/nav-bar/app-bar.d.ts +4 -0
  170. package/registry/examples/nav-bar/app-bar.js +22 -0
  171. package/registry/examples/nav-bar/app-bar.tsx +21 -0
  172. package/registry/examples/nav-bar/menu-open.d.ts +4 -0
  173. package/registry/examples/nav-bar/menu-open.js +26 -0
  174. package/registry/examples/nav-bar/menu-open.tsx +26 -0
  175. package/registry/examples/nav-bar/site.d.ts +4 -0
  176. package/registry/examples/nav-bar/site.js +31 -0
  177. package/registry/examples/nav-bar/site.tsx +36 -0
  178. package/registry/examples/number-ticker/gradient.d.ts +4 -0
  179. package/registry/examples/number-ticker/gradient.js +11 -0
  180. package/registry/examples/number-ticker/gradient.tsx +10 -0
  181. package/registry/examples/number-ticker/live-total.d.ts +4 -0
  182. package/registry/examples/number-ticker/live-total.js +17 -0
  183. package/registry/examples/number-ticker/live-total.tsx +21 -0
  184. package/registry/examples/number-ticker/stats.d.ts +4 -0
  185. package/registry/examples/number-ticker/stats.js +19 -0
  186. package/registry/examples/number-ticker/stats.tsx +23 -0
  187. package/registry/examples/progress/buffer.d.ts +4 -0
  188. package/registry/examples/progress/buffer.js +11 -0
  189. package/registry/examples/progress/buffer.tsx +10 -0
  190. package/registry/examples/progress/statuses.d.ts +4 -0
  191. package/registry/examples/progress/statuses.js +14 -0
  192. package/registry/examples/progress/statuses.tsx +11 -0
  193. package/registry/examples/progress/steps.d.ts +4 -0
  194. package/registry/examples/progress/steps.js +14 -0
  195. package/registry/examples/progress/steps.tsx +13 -0
  196. package/registry/examples/progress/upload.d.ts +4 -0
  197. package/registry/examples/progress/upload.js +11 -0
  198. package/registry/examples/progress/upload.tsx +10 -0
  199. package/registry/examples/skeleton/paragraph.d.ts +4 -0
  200. package/registry/examples/skeleton/paragraph.js +14 -0
  201. package/registry/examples/skeleton/paragraph.tsx +12 -0
  202. package/registry/examples/skeleton/shape-of-content.d.ts +4 -0
  203. package/registry/examples/skeleton/shape-of-content.js +23 -0
  204. package/registry/examples/skeleton/shape-of-content.tsx +26 -0
  205. package/registry/examples/spinner/default.js +5 -2
  206. package/registry/examples/spinner/default.tsx +7 -1
  207. package/registry/examples/spinner/sizes.js +2 -1
  208. package/registry/examples/spinner/sizes.tsx +2 -0
  209. package/registry/examples/spinner/value.d.ts +4 -0
  210. package/registry/examples/spinner/value.js +11 -0
  211. package/registry/examples/spinner/value.tsx +12 -0
  212. package/registry/examples/stepper/checkout.d.ts +4 -0
  213. package/registry/examples/stepper/checkout.js +22 -0
  214. package/registry/examples/stepper/checkout.tsx +17 -0
  215. package/registry/examples/stepper/failed.d.ts +4 -0
  216. package/registry/examples/stepper/failed.js +26 -0
  217. package/registry/examples/stepper/failed.tsx +21 -0
  218. package/registry/examples/stepper/job.d.ts +4 -0
  219. package/registry/examples/stepper/job.js +32 -0
  220. package/registry/examples/stepper/job.tsx +28 -0
  221. package/registry/examples/toast/grouped.d.ts +4 -0
  222. package/registry/examples/toast/grouped.js +21 -0
  223. package/registry/examples/toast/grouped.tsx +23 -0
  224. package/registry/examples/toast/undo.d.ts +4 -0
  225. package/registry/examples/toast/undo.js +29 -0
  226. package/registry/examples/toast/undo.tsx +30 -0
  227. package/registry/examples/toast/upload-progress.d.ts +4 -0
  228. package/registry/examples/toast/upload-progress.js +29 -0
  229. package/registry/examples/toast/upload-progress.tsx +31 -0
  230. package/registry/field.json +1 -1
  231. package/registry/glow-card.json +162 -0
  232. package/registry/index.json +191 -20
  233. package/registry/iso.json +1355 -0
  234. package/registry/kbd.json +1 -1
  235. package/registry/loader.json +399 -0
  236. package/registry/marquee.json +225 -0
  237. package/registry/mascots.json +3 -3
  238. package/registry/meter.json +324 -0
  239. package/registry/nav-bar.json +480 -0
  240. package/registry/number-ticker.json +219 -0
  241. package/registry/page-header.json +1 -1
  242. package/registry/popover.json +1 -1
  243. package/registry/progress.json +116 -11
  244. package/registry/radio-group.json +1 -1
  245. package/registry/section-backdrop.json +1 -1
  246. package/registry/separator.json +1 -1
  247. package/registry/skeleton.json +69 -13
  248. package/registry/slider.json +1 -1
  249. package/registry/slot.json +1 -1
  250. package/registry/spinner.json +91 -27
  251. package/registry/stat.json +1 -1
  252. package/registry/stepper.json +174 -0
  253. package/registry/switch.json +1 -1
  254. package/registry/tabs.json +11 -7
  255. package/registry/theme.json +3 -3
  256. package/registry/toast.json +41 -13
  257. package/registry/tooltip.json +1 -1
  258. package/dist/chunk-FHYZSO2S.js.map +0 -1
  259. package/dist/chunk-PESA2R4U.js +0 -51
  260. package/dist/chunk-PESA2R4U.js.map +0 -1
  261. package/registry/examples/spinner/muted.js +0 -11
  262. package/registry/examples/spinner/muted.tsx +0 -6
  263. /package/registry/examples/{spinner/muted.d.ts → button/error.d.ts} +0 -0
@@ -0,0 +1,162 @@
1
+ {
2
+ "name": "glow-card",
3
+ "type": "primitive",
4
+ "title": "Glow card",
5
+ "summary": "A card lit by the brand: a bloom of the accent follows the pointer across it, and its border is a ring of the brand gradient that turns and brightens under the pointer or the focus.",
6
+ "description": "A card lit by the brand: a bloom of the accent follows the pointer across it, and its border is a ring of the brand gradient that turns and brightens under the pointer or the focus.",
7
+ "status": "beta",
8
+ "category": "layout",
9
+ "platforms": "web",
10
+ "whenToUse": [
11
+ "Cards that invite a choice: plans, products, the entry points of a landing page.",
12
+ "One featured card among others (`alive`): its ring turns at rest."
13
+ ],
14
+ "whenNotToUse": [
15
+ {
16
+ "when": "For the cards of an app's lists and feeds: a calm card reads better there.",
17
+ "use": "card"
18
+ },
19
+ {
20
+ "when": "Around content the reader studies (a form, a table): light that moves distracts."
21
+ }
22
+ ],
23
+ "bestPractices": [
24
+ "One grid of glowing cards per page; `alive` on one card at most.",
25
+ "Make the whole card the link with `asChild` when it leads somewhere — the focus lights it like the pointer.",
26
+ "Colours come from the brand (`.brand-<id>`): never pass one."
27
+ ],
28
+ "accessibility": {
29
+ "keyboard": [
30
+ {
31
+ "keys": "Tab",
32
+ "action": "Focusing the card (or a control inside it) lights its ring, as the pointer does."
33
+ }
34
+ ],
35
+ "notes": [
36
+ "Decorative light only (pseudo-elements): nothing is added to the accessibility tree; the card's semantics are yours.",
37
+ "Under `prefers-reduced-motion` the ring rests at a fixed angle — still lit on hover and focus, never turning.",
38
+ "Its loops pause off screen and while the page settles (MotionObserver)."
39
+ ]
40
+ },
41
+ "related": [
42
+ "card",
43
+ "button"
44
+ ],
45
+ "web": {
46
+ "entry": "@krizaka/ui/glow-card",
47
+ "import": "import { GlowCard } from \"@krizaka/ui/glow-card\";",
48
+ "props": [
49
+ {
50
+ "component": "GlowCard",
51
+ "description": "A card lit by the brand: a bloom that follows the pointer, a gradient ring that turns. Content is yours.",
52
+ "props": [
53
+ {
54
+ "name": "alive",
55
+ "type": "boolean",
56
+ "default": "false",
57
+ "description": "The ring turns slowly even at rest (a featured card). Otherwise it rests until hovered or focused.",
58
+ "required": false
59
+ },
60
+ {
61
+ "name": "asChild",
62
+ "type": "boolean",
63
+ "default": null,
64
+ "description": "Renders your element (a link, an article) with the card's look and behaviour.",
65
+ "required": false
66
+ },
67
+ {
68
+ "name": "glow",
69
+ "type": "\"both\" | \"border\" | \"spotlight\"",
70
+ "default": "both",
71
+ "description": "What answers: `border` (the turning gradient ring), `spotlight` (the bloom under the pointer), or `both`.",
72
+ "required": false
73
+ }
74
+ ]
75
+ }
76
+ ],
77
+ "examples": [
78
+ {
79
+ "name": "plans",
80
+ "title": "Plans",
81
+ "description": "Three plans: the light follows the pointer across them; the featured one's ring turns at rest.",
82
+ "path": "examples/glow-card/plans.tsx",
83
+ "module": "@krizaka/ui/registry/examples/glow-card/plans",
84
+ "code": "import { Button } from \"@krizaka/ui/button\";\nimport { GlowCard } from \"@krizaka/ui/glow-card\";\n\nconst plans = [\n { name: \"Community\", price: \"Free\", line: \"Self-hosted, every feature.\" },\n { name: \"Team\", price: \"€19\", line: \"Shared workspaces and roles.\", featured: true },\n { name: \"Sovereign\", price: \"Custom\", line: \"Your servers, our support.\" },\n];\n\n// Plans: move the pointer across them — the light follows, the ring brightens. The featured plan's ring turns at rest.\nexport default function GlowCardPlans() {\n return (\n <div className=\"grid w-full max-w-3xl gap-4 sm:grid-cols-3\">\n {plans.map((p) => (\n <GlowCard key={p.name} alive={p.featured} className=\"flex flex-col gap-3\">\n <h3 className=\"font-display text-lg font-semibold text-fg\">{p.name}</h3>\n <p className=\"font-display text-3xl font-bold text-fg\">{p.price}</p>\n <p className=\"text-sm text-fg-secondary\">{p.line}</p>\n <Button variant={p.featured ? \"gradient\" : \"outline\"} size=\"sm\" className=\"mt-auto\">\n Choose {p.name}\n </Button>\n </GlowCard>\n ))}\n </div>\n );\n}\n"
85
+ },
86
+ {
87
+ "name": "link-card",
88
+ "title": "A card that is a link",
89
+ "description": "`asChild` on an `<a>`, `glow=\"border\"`: the focus lights the ring.",
90
+ "path": "examples/glow-card/link-card.tsx",
91
+ "module": "@krizaka/ui/registry/examples/glow-card/link-card",
92
+ "code": "import { GlowCard } from \"@krizaka/ui/glow-card\";\n\n// `asChild`: the card is the link. The focus lights the ring as the pointer does — keyboard readers get the same answer.\nexport default function GlowCardLink() {\n return (\n <GlowCard asChild glow=\"border\" className=\"block max-w-sm no-underline focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\">\n <a href=\"#docs\">\n <span className=\"block font-display text-lg font-semibold text-fg\">Read the documentation</span>\n <span className=\"mt-1 block text-sm text-fg-secondary\">Every component, its examples and its props — generated from the code.</span>\n </a>\n </GlowCard>\n );\n}\n"
93
+ },
94
+ {
95
+ "name": "spotlight",
96
+ "title": "Spotlight only",
97
+ "description": "`glow=\"spotlight\"`: the bloom alone, for a dense grid.",
98
+ "path": "examples/glow-card/spotlight.tsx",
99
+ "module": "@krizaka/ui/registry/examples/glow-card/spotlight",
100
+ "code": "import { GlowCard } from \"@krizaka/ui/glow-card\";\n\n// `glow=\"spotlight\"`: only the bloom under the pointer, for a dense grid where rings would be too much.\nexport default function GlowCardSpotlight() {\n return (\n <div className=\"grid w-full max-w-lg grid-cols-2 gap-3\">\n {[\"Tips\", \"Unlocks\", \"Auctions\", \"Challenges\"].map((name) => (\n <GlowCard key={name} glow=\"spotlight\" className=\"p-4\">\n <p className=\"font-semibold text-fg\">{name}</p>\n <p className=\"text-xs text-fg-secondary\">90 % to the creator</p>\n </GlowCard>\n ))}\n </div>\n );\n}\n"
101
+ }
102
+ ]
103
+ },
104
+ "native": null,
105
+ "files": [
106
+ {
107
+ "path": "glow-card/glow-card.tsx",
108
+ "content": "// Client (the pointer). A card that answers light: a soft bloom of the brand accent follows the pointer across it, and\n// its border is a ring of the brand gradient that turns slowly and brightens under the pointer or the focus. Composited\n// properties only (CSS variables, opacity); no animation frame — the pointer writes two variables. Under reduced motion\n// the ring rests at a fixed angle and the light stays where it is: a designed still frame, not a switched-off one.\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport type GlowCardProps = React.ComponentProps<\"div\"> & {\n /**\n * What answers: `border` (the turning gradient ring), `spotlight` (the bloom under the pointer), or `both`.\n * @default \"both\"\n */\n glow?: \"border\" | \"spotlight\" | \"both\";\n /** Renders your element (a link, an article) with the card's look and behaviour. */\n asChild?: boolean;\n /**\n * The ring turns slowly even at rest (a featured card). Otherwise it rests until hovered or focused.\n * @default false\n */\n alive?: boolean;\n};\n\n/** A card lit by the brand: a bloom that follows the pointer, a gradient ring that turns. Content is yours. */\nexport function GlowCard({ glow = \"both\", asChild, alive, className, onPointerMove, ...props }: GlowCardProps) {\n const Comp = asChild ? Slot.Root : \"div\";\n return (\n <Comp\n data-glow={glow}\n data-alive={alive ? \"\" : undefined}\n className={cn(\"kz-glow kz-loop relative isolate rounded-2xl border border-border-default bg-surface-1 p-6\", className)}\n onPointerMove={(e: React.PointerEvent<HTMLDivElement>) => {\n const box = e.currentTarget.getBoundingClientRect();\n e.currentTarget.style.setProperty(\"--kz-glow-x\", `${e.clientX - box.left}px`);\n e.currentTarget.style.setProperty(\"--kz-glow-y\", `${e.clientY - box.top}px`);\n onPointerMove?.(e);\n }}\n {...props}\n />\n );\n}\n"
109
+ },
110
+ {
111
+ "path": "glow-card/index.ts",
112
+ "content": "/** @krizaka/ui/glow-card — `GlowCard`: a bloom of the brand light under the pointer, a turning gradient ring. Client. */\nexport { GlowCard, type GlowCardProps } from \"./glow-card\";\n"
113
+ },
114
+ {
115
+ "path": "glow-card/meta.ts",
116
+ "content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Glow card\",\n summary:\n \"A card lit by the brand: a bloom of the accent follows the pointer across it, and its border is a ring of the brand gradient that turns and brightens under the pointer or the focus.\",\n status: \"beta\",\n category: \"layout\",\n platforms: \"web\",\n whenToUse: [\n \"Cards that invite a choice: plans, products, the entry points of a landing page.\",\n \"One featured card among others (`alive`): its ring turns at rest.\",\n ],\n whenNotToUse: [\n { when: \"For the cards of an app's lists and feeds: a calm card reads better there.\", use: \"card\" },\n { when: \"Around content the reader studies (a form, a table): light that moves distracts.\" },\n ],\n bestPractices: [\n \"One grid of glowing cards per page; `alive` on one card at most.\",\n \"Make the whole card the link with `asChild` when it leads somewhere — the focus lights it like the pointer.\",\n \"Colours come from the brand (`.brand-<id>`): never pass one.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Tab\", action: \"Focusing the card (or a control inside it) lights its ring, as the pointer does.\" }],\n notes: [\n \"Decorative light only (pseudo-elements): nothing is added to the accessibility tree; the card's semantics are yours.\",\n \"Under `prefers-reduced-motion` the ring rests at a fixed angle — still lit on hover and focus, never turning.\",\n \"Its loops pause off screen and while the page settles (MotionObserver).\",\n ],\n },\n related: [\"card\", \"button\"],\n web: {\n imports: [\"GlowCard\"],\n examples: [\n { name: \"plans\", title: \"Plans\", description: \"Three plans: the light follows the pointer across them; the featured one's ring turns at rest.\" },\n { name: \"link-card\", title: \"A card that is a link\", description: \"`asChild` on an `<a>`, `glow=\\\"border\\\"`: the focus lights the ring.\" },\n { name: \"spotlight\", title: \"Spotlight only\", description: \"`glow=\\\"spotlight\\\"`: the bloom alone, for a dense grid.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
117
+ },
118
+ {
119
+ "path": "meta.ts",
120
+ "content": "// The documentation of a component, carried by its code: each primitive has a `meta.ts` beside its source\n// (`src/<name>/meta.ts`; a component that exists only in React Native: `src/native/meta/<name>.ts`). Never built into\n// the package: `scripts/build-registry.mjs` reads them into `registry/<name>.json`, which krizaka.com renders as\n// /docs/ui/<name>, and `scripts/registry.test.mjs` fails when one is missing or incomplete.\n//\n// Why a typed module and not JSDoc tags: the fields are lists and links (`related`, `whenNotToUse[].use`, examples),\n// which a type checks and a comment does not; the file is plain data (erasable TypeScript), so Node reads it without a\n// compiler, and an editor completes it.\n\n/** Every documented component: the web primitives (one entry of the package each) and the native-only ones. */\nexport type ComponentName =\n | \"alert\"\n | \"avatar\"\n | \"badge\"\n | \"button\"\n | \"card\"\n | \"checkbox\"\n | \"chip\"\n | \"chip-link\"\n | \"cn\"\n | \"command\"\n | \"confirm-button\"\n | \"countdown\"\n | \"dialog\"\n | \"dropdown-menu\"\n | \"empty-state\"\n | \"field\"\n | \"glow-card\"\n | \"iso\"\n | \"kbd\"\n | \"loader\"\n | \"marquee\"\n | \"mascots\"\n | \"meter\"\n | \"nav-bar\"\n | \"number-ticker\"\n | \"page-header\"\n | \"popover\"\n | \"progress\"\n | \"radio-group\"\n | \"section-backdrop\"\n | \"segmented\"\n | \"separator\"\n | \"skeleton\"\n | \"slider\"\n | \"slot\"\n | \"spinner\"\n | \"stat\"\n | \"stepper\"\n | \"switch\"\n | \"tabs\"\n | \"theme\"\n | \"toast\"\n | \"tooltip\"\n | \"txt\";\n\n/** Where a component exists: `@krizaka/ui/<name>` (web), `@krizaka/ui/native` (React Native), or both. */\nexport type Platform = \"web\" | \"native\" | \"both\";\n\n/** `stable`: its API only changes in a major. `beta`: it may still change in a minor. */\nexport type Status = \"stable\" | \"beta\";\n\n/** The group of the catalogue. */\nexport type Category = \"actions\" | \"forms\" | \"navigation\" | \"overlays\" | \"feedback\" | \"data-display\" | \"layout\" | \"foundations\";\n\n/**\n * A named example: the file `registry/examples/<component>/<name>.tsx` (web) or\n * `registry/examples/<component>/native/<name>.tsx` (React Native) — at most 40 lines, imported by the stories and\n * shown (live, with its code) by the documentation.\n */\nexport interface Example {\n /** The file name, kebab-case (`primary`, `icon-button`). */\n readonly name: string;\n /** A short title (`Primary`, `Icon button`). */\n readonly title: string;\n /** One or two sentences: when this variant is the right one. */\n readonly description: string;\n}\n\n/** One platform's side of a component. */\nexport interface PlatformDocs {\n /** The names to import (`[\"Button\", \"IconButton\"]`): from `@krizaka/ui/<name>` on the web, `@krizaka/ui/native` in React Native. */\n readonly imports: readonly string[];\n /** The examples, in reading order; the first one is the component's preview. */\n readonly examples: readonly Example[];\n}\n\n/** The React Native side: the same concept, and what differs from the web API. */\nexport interface NativeDocs extends PlatformDocs {\n /** What differs from the web API (`label` instead of children…); empty for a native-only component. */\n readonly differences: readonly string[];\n}\n\nexport interface KeyboardInteraction {\n /** The keys, as written on a keyboard: `Space`, `Enter`, `Arrow keys`, `Esc`, `Tab`. */\n readonly keys: string;\n /** What they do. */\n readonly action: string;\n}\n\nexport interface ComponentMeta {\n /** The display name: `Button`, `Dropdown menu`. */\n readonly title: string;\n /** One sentence: what it is. */\n readonly summary: string;\n readonly status: Status;\n readonly category: Category;\n /** Must match the sides below: `both` ⇔ `web` and `native`. */\n readonly platforms: Platform;\n /** When to reach for it: concrete situations, one per item. */\n readonly whenToUse: readonly string[];\n /** When not to — and what to use instead (`use`), when another component is the answer. */\n readonly whenNotToUse: readonly { readonly when: string; readonly use?: ComponentName }[];\n /** How to use it well: wording, placement, composition. */\n readonly bestPractices: readonly string[];\n readonly accessibility: {\n /** The keyboard, when it does more than Tab and Enter. */\n readonly keyboard: readonly KeyboardInteraction[];\n /** Roles, names and announcements: what the component does, what the app must provide. */\n readonly notes: readonly string[];\n };\n /** The components a reader of this page should know about. */\n readonly related: readonly ComponentName[];\n readonly web?: PlatformDocs;\n readonly native?: NativeDocs;\n}\n"
121
+ }
122
+ ],
123
+ "dependencies": [
124
+ "radix-ui@^1.7.0"
125
+ ],
126
+ "registryDependencies": [
127
+ "cn"
128
+ ],
129
+ "demo": {
130
+ "path": "examples/glow-card/plans.tsx",
131
+ "content": "import { Button } from \"@krizaka/ui/button\";\nimport { GlowCard } from \"@krizaka/ui/glow-card\";\n\nconst plans = [\n { name: \"Community\", price: \"Free\", line: \"Self-hosted, every feature.\" },\n { name: \"Team\", price: \"€19\", line: \"Shared workspaces and roles.\", featured: true },\n { name: \"Sovereign\", price: \"Custom\", line: \"Your servers, our support.\" },\n];\n\n// Plans: move the pointer across them — the light follows, the ring brightens. The featured plan's ring turns at rest.\nexport default function GlowCardPlans() {\n return (\n <div className=\"grid w-full max-w-3xl gap-4 sm:grid-cols-3\">\n {plans.map((p) => (\n <GlowCard key={p.name} alive={p.featured} className=\"flex flex-col gap-3\">\n <h3 className=\"font-display text-lg font-semibold text-fg\">{p.name}</h3>\n <p className=\"font-display text-3xl font-bold text-fg\">{p.price}</p>\n <p className=\"text-sm text-fg-secondary\">{p.line}</p>\n <Button variant={p.featured ? \"gradient\" : \"outline\"} size=\"sm\" className=\"mt-auto\">\n Choose {p.name}\n </Button>\n </GlowCard>\n ))}\n </div>\n );\n}\n"
132
+ },
133
+ "props": [
134
+ {
135
+ "component": "GlowCard",
136
+ "description": "A card lit by the brand: a bloom that follows the pointer, a gradient ring that turns. Content is yours.",
137
+ "props": [
138
+ {
139
+ "name": "alive",
140
+ "type": "boolean",
141
+ "default": "false",
142
+ "description": "The ring turns slowly even at rest (a featured card). Otherwise it rests until hovered or focused.",
143
+ "required": false
144
+ },
145
+ {
146
+ "name": "asChild",
147
+ "type": "boolean",
148
+ "default": null,
149
+ "description": "Renders your element (a link, an article) with the card's look and behaviour.",
150
+ "required": false
151
+ },
152
+ {
153
+ "name": "glow",
154
+ "type": "\"both\" | \"border\" | \"spotlight\"",
155
+ "default": "both",
156
+ "description": "What answers: `border` (the turning gradient ring), `spotlight` (the bloom under the pointer), or `both`.",
157
+ "required": false
158
+ }
159
+ ]
160
+ }
161
+ ]
162
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krizaka/ui",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "items": [
5
5
  {
6
6
  "name": "alert",
@@ -61,20 +61,22 @@
61
61
  "name": "button",
62
62
  "type": "primitive",
63
63
  "title": "Button",
64
- "summary": "The action: a button in six looks (primary, gradient, secondary, outline, ghost, danger), three sizes and two shapes.",
65
- "description": "The action: a button in six looks (primary, gradient, secondary, outline, ghost, danger), three sizes and two shapes.",
64
+ "summary": "The action: six looks, three sizes, three shapes (rounded, pill, the Krizaka cut corners) — and the whole life of an action built in: a wait traced by the loader glyph, its progress, a success or a failure drawn and announced.",
65
+ "description": "The action: six looks, three sizes, three shapes (rounded, pill, the Krizaka cut corners) — and the whole life of an action built in: a wait traced by the loader glyph, its progress, a success or a failure drawn and announced.",
66
66
  "status": "stable",
67
67
  "category": "actions",
68
68
  "platforms": "both",
69
69
  "examples": {
70
- "web": 12,
70
+ "web": 16,
71
71
  "native": 11
72
72
  },
73
73
  "dependencies": [
74
74
  "radix-ui@^1.7.0",
75
75
  "tailwind-variants@^3.3.1"
76
76
  ],
77
- "registryDependencies": []
77
+ "registryDependencies": [
78
+ "spinner"
79
+ ]
78
80
  },
79
81
  {
80
82
  "name": "card",
@@ -135,6 +137,25 @@
135
137
  ],
136
138
  "registryDependencies": []
137
139
  },
140
+ {
141
+ "name": "chip-link",
142
+ "type": "primitive",
143
+ "title": "Chip link",
144
+ "summary": "A chip that is a link — a filter that is an address — with the look of `Chip`, the current one marked, and `chipVariants` to style anything else; server-safe.",
145
+ "description": "A chip that is a link — a filter that is an address — with the look of `Chip`, the current one marked, and `chipVariants` to style anything else; server-safe.",
146
+ "status": "beta",
147
+ "category": "navigation",
148
+ "platforms": "web",
149
+ "examples": {
150
+ "web": 1,
151
+ "native": 0
152
+ },
153
+ "dependencies": [
154
+ "radix-ui@^1.7.0",
155
+ "tailwind-variants@^3.3.1"
156
+ ],
157
+ "registryDependencies": []
158
+ },
138
159
  {
139
160
  "name": "cn",
140
161
  "type": "primitive",
@@ -226,7 +247,7 @@
226
247
  "category": "overlays",
227
248
  "platforms": "web",
228
249
  "examples": {
229
- "web": 6,
250
+ "web": 7,
230
251
  "native": 0
231
252
  },
232
253
  "dependencies": [
@@ -296,6 +317,42 @@
296
317
  "cn"
297
318
  ]
298
319
  },
320
+ {
321
+ "name": "glow-card",
322
+ "type": "primitive",
323
+ "title": "Glow card",
324
+ "summary": "A card lit by the brand: a bloom of the accent follows the pointer across it, and its border is a ring of the brand gradient that turns and brightens under the pointer or the focus.",
325
+ "description": "A card lit by the brand: a bloom of the accent follows the pointer across it, and its border is a ring of the brand gradient that turns and brightens under the pointer or the focus.",
326
+ "status": "beta",
327
+ "category": "layout",
328
+ "platforms": "web",
329
+ "examples": {
330
+ "web": 3,
331
+ "native": 0
332
+ },
333
+ "dependencies": [
334
+ "radix-ui@^1.7.0"
335
+ ],
336
+ "registryDependencies": [
337
+ "cn"
338
+ ]
339
+ },
340
+ {
341
+ "name": "iso",
342
+ "type": "primitive",
343
+ "title": "Iso",
344
+ "summary": "The isometric kit: luminous objects built from the Krizaka vocabulary (hexagons, cut corners, the node) on a perspective grid — a hero driven by data (`IsoHub`) or composed from primitives.",
345
+ "description": "The isometric kit: luminous objects built from the Krizaka vocabulary (hexagons, cut corners, the node) on a perspective grid — a hero driven by data (`IsoHub`) or composed from primitives.",
346
+ "status": "beta",
347
+ "category": "layout",
348
+ "platforms": "web",
349
+ "examples": {
350
+ "web": 4,
351
+ "native": 0
352
+ },
353
+ "dependencies": [],
354
+ "registryDependencies": []
355
+ },
299
356
  {
300
357
  "name": "kbd",
301
358
  "type": "primitive",
@@ -314,6 +371,44 @@
314
371
  ],
315
372
  "registryDependencies": []
316
373
  },
374
+ {
375
+ "name": "loader",
376
+ "type": "primitive",
377
+ "title": "Loader",
378
+ "summary": "A wait from start to end: nothing for the first instants, then the Krizaka glyph with its words, a percentage and an ETA, held long enough to read, ending on a check or a cross that is drawn and announced — and `LoadingRegion`, which hands a region over to a skeleton of its shape.",
379
+ "description": "A wait from start to end: nothing for the first instants, then the Krizaka glyph with its words, a percentage and an ETA, held long enough to read, ending on a check or a cross that is drawn and announced — and `LoadingRegion`, which hands a region over to a skeleton of its shape.",
380
+ "status": "beta",
381
+ "category": "feedback",
382
+ "platforms": "web",
383
+ "examples": {
384
+ "web": 6,
385
+ "native": 0
386
+ },
387
+ "dependencies": [
388
+ "tailwind-variants@^3.3.1"
389
+ ],
390
+ "registryDependencies": [
391
+ "spinner"
392
+ ]
393
+ },
394
+ {
395
+ "name": "marquee",
396
+ "type": "primitive",
397
+ "title": "Marquee",
398
+ "summary": "A band of items that slides forever — at a speed in pixels per second, paused by the pointer, the focus or its own pause button, read once by assistive technology, and a still row you scroll under reduced motion.",
399
+ "description": "A band of items that slides forever — at a speed in pixels per second, paused by the pointer, the focus or its own pause button, read once by assistive technology, and a still row you scroll under reduced motion.",
400
+ "status": "beta",
401
+ "category": "data-display",
402
+ "platforms": "web",
403
+ "examples": {
404
+ "web": 2,
405
+ "native": 0
406
+ },
407
+ "dependencies": [],
408
+ "registryDependencies": [
409
+ "cn"
410
+ ]
411
+ },
317
412
  {
318
413
  "name": "mascots",
319
414
  "type": "primitive",
@@ -330,6 +425,61 @@
330
425
  "dependencies": [],
331
426
  "registryDependencies": []
332
427
  },
428
+ {
429
+ "name": "meter",
430
+ "type": "primitive",
431
+ "title": "Meter",
432
+ "summary": "A measure within a known range — a quota, a balance, a share: thresholds turn it to warning then danger (or the reverse when high is good), and split into parts it becomes a stacked bar or ring with its legend.",
433
+ "description": "A measure within a known range — a quota, a balance, a share: thresholds turn it to warning then danger (or the reverse when high is good), and split into parts it becomes a stacked bar or ring with its legend.",
434
+ "status": "beta",
435
+ "category": "data-display",
436
+ "platforms": "web",
437
+ "examples": {
438
+ "web": 3,
439
+ "native": 0
440
+ },
441
+ "dependencies": [
442
+ "tailwind-variants@^3.3.1"
443
+ ],
444
+ "registryDependencies": []
445
+ },
446
+ {
447
+ "name": "nav-bar",
448
+ "type": "primitive",
449
+ "title": "Nav bar",
450
+ "summary": "The Krizaka navigation bar: a floating pill that tightens as the page scrolls, one light that glides to the item under the pointer or the focus and rests on the current page, accessible menus with rich links, and a mobile panel.",
451
+ "description": "The Krizaka navigation bar: a floating pill that tightens as the page scrolls, one light that glides to the item under the pointer or the focus and rests on the current page, accessible menus with rich links, and a mobile panel.",
452
+ "status": "beta",
453
+ "category": "navigation",
454
+ "platforms": "web",
455
+ "examples": {
456
+ "web": 3,
457
+ "native": 0
458
+ },
459
+ "dependencies": [
460
+ "radix-ui@^1.7.0",
461
+ "tailwind-variants@^3.3.1"
462
+ ],
463
+ "registryDependencies": [
464
+ "cn"
465
+ ]
466
+ },
467
+ {
468
+ "name": "number-ticker",
469
+ "type": "primitive",
470
+ "title": "Number ticker",
471
+ "summary": "A figure that climbs into view once, or rolls digit by digit to each new value — server-rendered at its final value, its width held from the first paint, read once by assistive technology.",
472
+ "description": "A figure that climbs into view once, or rolls digit by digit to each new value — server-rendered at its final value, its width held from the first paint, read once by assistive technology.",
473
+ "status": "beta",
474
+ "category": "data-display",
475
+ "platforms": "web",
476
+ "examples": {
477
+ "web": 3,
478
+ "native": 0
479
+ },
480
+ "dependencies": [],
481
+ "registryDependencies": []
482
+ },
333
483
  {
334
484
  "name": "page-header",
335
485
  "type": "primitive",
@@ -372,13 +522,13 @@
372
522
  "name": "progress",
373
523
  "type": "primitive",
374
524
  "title": "Progress",
375
- "summary": "How far a task or a goal has come: a bar or a ring, determinate or indeterminate.",
376
- "description": "How far a task or a goal has come: a bar or a ring, determinate or indeterminate.",
525
+ "summary": "How far a task or a goal has come: a bar or a ring — with its words and time left, what is buffered ahead, its steps as segments, and a paused or failed state that says where it stopped.",
526
+ "description": "How far a task or a goal has come: a bar or a ring — with its words and time left, what is buffered ahead, its steps as segments, and a paused or failed state that says where it stopped.",
377
527
  "status": "beta",
378
528
  "category": "feedback",
379
529
  "platforms": "both",
380
530
  "examples": {
381
- "web": 5,
531
+ "web": 9,
382
532
  "native": 3
383
533
  },
384
534
  "dependencies": [
@@ -462,13 +612,13 @@
462
612
  "name": "skeleton",
463
613
  "type": "primitive",
464
614
  "title": "Skeleton",
465
- "summary": "A placeholder the shape of what is loading: a line, a circle or a block.",
466
- "description": "A placeholder the shape of what is loading: a line, a circle or a block.",
615
+ "summary": "A placeholder the shape of what is loading — lines, circles, blocks, or the real component turned into its own skeleton (`SkeletonShape`) — crossed by one reflection of the brand light.",
616
+ "description": "A placeholder the shape of what is loading — lines, circles, blocks, or the real component turned into its own skeleton (`SkeletonShape`) — crossed by one reflection of the brand light.",
467
617
  "status": "stable",
468
618
  "category": "feedback",
469
619
  "platforms": "both",
470
620
  "examples": {
471
- "web": 4,
621
+ "web": 6,
472
622
  "native": 1
473
623
  },
474
624
  "dependencies": [
@@ -517,8 +667,8 @@
517
667
  "name": "spinner",
518
668
  "type": "primitive",
519
669
  "title": "Spinner",
520
- "summary": "An indeterminate wait: a turning ring named by `label`.",
521
- "description": "An indeterminate wait: a turning ring named by `label`.",
670
+ "summary": "The Krizaka spinner: light traced around a hexagon, its node breathing — indeterminate, or growing to a `value`; still and legible under reduced motion.",
671
+ "description": "The Krizaka spinner: light traced around a hexagon, its node breathing — indeterminate, or growing to a `value`; still and legible under reduced motion.",
522
672
  "status": "stable",
523
673
  "category": "feedback",
524
674
  "platforms": "both",
@@ -549,6 +699,26 @@
549
699
  ],
550
700
  "registryDependencies": []
551
701
  },
702
+ {
703
+ "name": "stepper",
704
+ "type": "primitive",
705
+ "title": "Stepper",
706
+ "summary": "The steps of a journey or a job: done steps checked, the current one traced by the Krizaka glyph (growing to its value), failures crossed, connectors that fill — and every state said in words.",
707
+ "description": "The steps of a journey or a job: done steps checked, the current one traced by the Krizaka glyph (growing to its value), failures crossed, connectors that fill — and every state said in words.",
708
+ "status": "beta",
709
+ "category": "navigation",
710
+ "platforms": "web",
711
+ "examples": {
712
+ "web": 3,
713
+ "native": 0
714
+ },
715
+ "dependencies": [
716
+ "tailwind-variants@^3.3.1"
717
+ ],
718
+ "registryDependencies": [
719
+ "spinner"
720
+ ]
721
+ },
552
722
  {
553
723
  "name": "switch",
554
724
  "type": "primitive",
@@ -572,8 +742,8 @@
572
742
  "name": "tabs",
573
743
  "type": "primitive",
574
744
  "title": "Tabs",
575
- "summary": "Views of the same page, one at a time: underlined sections, a segmented switch or pills.",
576
- "description": "Views of the same page, one at a time: underlined sections, a segmented switch or pills.",
745
+ "summary": "Views of the same page, one at a time: underlined sections, a segmented switch or pills — one light glides from the active tab to the next, in every variant.",
746
+ "description": "Views of the same page, one at a time: underlined sections, a segmented switch or pills — one light glides from the active tab to the next, in every variant.",
577
747
  "status": "beta",
578
748
  "category": "navigation",
579
749
  "platforms": "web",
@@ -609,20 +779,21 @@
609
779
  "name": "toast",
610
780
  "type": "primitive",
611
781
  "title": "Toast",
612
- "summary": "A short message that comes and goes: `toast()` from anywhere, one `Toaster` per app.",
613
- "description": "A short message that comes and goes: `toast()` from anywhere, one `Toaster` per app.",
782
+ "summary": "A short message that comes and goes — with the time it has left drawn and paused under the pointer, an undo that waits before an action is final, a long task updated in place, and repeats folded into one toast that counts.",
783
+ "description": "A short message that comes and goes — with the time it has left drawn and paused under the pointer, an undo that waits before an action is final, a long task updated in place, and repeats folded into one toast that counts.",
614
784
  "status": "stable",
615
785
  "category": "feedback",
616
786
  "platforms": "both",
617
787
  "examples": {
618
- "web": 2,
788
+ "web": 5,
619
789
  "native": 2
620
790
  },
621
791
  "dependencies": [
622
792
  "sonner@^2.0.8"
623
793
  ],
624
794
  "registryDependencies": [
625
- "cn"
795
+ "cn",
796
+ "spinner"
626
797
  ]
627
798
  },
628
799
  {