@krizaka/ui 3.21.0 → 3.23.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 (494) hide show
  1. package/README.md +5 -0
  2. package/dist/achievement.js +1 -1
  3. package/dist/action-bar.js +4 -4
  4. package/dist/app-header.d.ts +79 -0
  5. package/dist/app-header.js +32 -0
  6. package/dist/app-header.js.map +1 -0
  7. package/dist/app-shell.d.ts +20 -2
  8. package/dist/app-shell.js +35 -20
  9. package/dist/app-shell.js.map +1 -1
  10. package/dist/argument-card.d.ts +4 -1
  11. package/dist/argument-card.js +8 -5
  12. package/dist/argument-card.js.map +1 -1
  13. package/dist/audio-player.d.ts +3 -2
  14. package/dist/audio-player.js +14 -10
  15. package/dist/audio-player.js.map +1 -1
  16. package/dist/blocks.css +28 -0
  17. package/dist/button.js +2 -1
  18. package/dist/captcha.d.ts +81 -0
  19. package/dist/captcha.js +162 -0
  20. package/dist/captcha.js.map +1 -0
  21. package/dist/card-grid.d.ts +10 -1
  22. package/dist/card-grid.js +3 -2
  23. package/dist/card-grid.js.map +1 -1
  24. package/dist/card.js +3 -3
  25. package/dist/changelog-page.d.ts +57 -3
  26. package/dist/changelog-page.js +117 -1
  27. package/dist/changelog-page.js.map +1 -1
  28. package/dist/choice-grid.js +1 -1
  29. package/dist/{chunk-5MH64NIL.js → chunk-2L67YTNV.js} +2 -2
  30. package/dist/{chunk-3IN6TOPM.js → chunk-6ZYRUOTA.js} +6 -3
  31. package/dist/chunk-6ZYRUOTA.js.map +1 -0
  32. package/dist/chunk-APNIVNIX.js +54 -0
  33. package/dist/chunk-APNIVNIX.js.map +1 -0
  34. package/dist/{chunk-FKBHWS4N.js → chunk-CEJDH6SA.js} +2 -2
  35. package/dist/{chunk-OWC2LZD2.js → chunk-CHOJUCVE.js} +6 -3
  36. package/dist/chunk-CHOJUCVE.js.map +1 -0
  37. package/dist/{chunk-3BC4XQ6C.js → chunk-DZU6RMYD.js} +6 -3
  38. package/dist/chunk-DZU6RMYD.js.map +1 -0
  39. package/dist/chunk-F7FVPPBB.js +1080 -0
  40. package/dist/chunk-F7FVPPBB.js.map +1 -0
  41. package/dist/{chunk-5Z7FWCV2.js → chunk-HBZPJ3EP.js} +2 -2
  42. package/dist/{chunk-C2BRIFJG.js → chunk-HJFRHYCI.js} +2 -2
  43. package/dist/{chunk-ZNMFG62E.js → chunk-KH3JOEPY.js} +3 -2
  44. package/dist/chunk-KH3JOEPY.js.map +1 -0
  45. package/dist/{chunk-BTMFZ66D.js → chunk-KM6VAKIE.js} +2 -2
  46. package/dist/{chunk-DGQMDJXK.js → chunk-LZNZLCOE.js} +2 -2
  47. package/dist/chunk-MQPC3P4T.js +126 -0
  48. package/dist/chunk-MQPC3P4T.js.map +1 -0
  49. package/dist/{chunk-2FRWNSRO.js → chunk-NSLXEDIS.js} +3 -2
  50. package/dist/chunk-NSLXEDIS.js.map +1 -0
  51. package/dist/{chunk-3GODX3D6.js → chunk-QDXV544C.js} +2 -2
  52. package/dist/chunk-QDXV544C.js.map +1 -0
  53. package/dist/{chunk-4LOMIQVX.js → chunk-W675RFOA.js} +3 -2
  54. package/dist/chunk-W675RFOA.js.map +1 -0
  55. package/dist/{chunk-G3ETON2A.js → chunk-WU4VLSEA.js} +3 -2
  56. package/dist/chunk-WU4VLSEA.js.map +1 -0
  57. package/dist/{chunk-IZ7MV6HM.js → chunk-XVFQZ3ZG.js} +3 -2
  58. package/dist/chunk-XVFQZ3ZG.js.map +1 -0
  59. package/dist/{chunk-LIPK4UCS.js → chunk-YCIBJ6OQ.js} +140 -209
  60. package/dist/chunk-YCIBJ6OQ.js.map +1 -0
  61. package/dist/cn.js +1 -1
  62. package/dist/code-block.js +2 -2
  63. package/dist/code-block.js.map +1 -1
  64. package/dist/command.js +3 -3
  65. package/dist/comparison-table.d.ts +44 -0
  66. package/dist/comparison-table.js +84 -0
  67. package/dist/comparison-table.js.map +1 -0
  68. package/dist/confirm-button.js +2 -2
  69. package/dist/continue-prompt.js +3 -3
  70. package/dist/continue-prompt.js.map +1 -1
  71. package/dist/cta-panel.js +1 -1
  72. package/dist/data-table.js +19 -1066
  73. package/dist/data-table.js.map +1 -1
  74. package/dist/date-picker.js +4 -4
  75. package/dist/decision-list.js +1 -1
  76. package/dist/dialog.js +3 -2
  77. package/dist/dialog.js.map +1 -1
  78. package/dist/docs-nav.d.ts +36 -0
  79. package/dist/docs-nav.js +44 -0
  80. package/dist/docs-nav.js.map +1 -0
  81. package/dist/dropdown-menu.js +1 -1
  82. package/dist/error-page.js +1 -1
  83. package/dist/field.js +1 -1
  84. package/dist/filter-bar.js +2 -2
  85. package/dist/force-update-screen.js +2 -1
  86. package/dist/force-update-screen.js.map +1 -1
  87. package/dist/gallery-page.js +1 -1
  88. package/dist/genui.d.ts +221 -0
  89. package/dist/genui.js +533 -0
  90. package/dist/genui.js.map +1 -0
  91. package/dist/glow-card.js +1 -1
  92. package/dist/goal-gauge.js +1 -1
  93. package/dist/how-it-works-page.js +1 -1
  94. package/dist/image-cropper.js +3 -3
  95. package/dist/index.d.ts +17 -24
  96. package/dist/index.js +4 -4
  97. package/dist/landscape.js +1 -1
  98. package/dist/link-card.d.ts +9 -2
  99. package/dist/link-card.js +5 -44
  100. package/dist/link-card.js.map +1 -1
  101. package/dist/longform-page.js +1 -1
  102. package/dist/maintenance-screen.js +2 -1
  103. package/dist/maintenance-screen.js.map +1 -1
  104. package/dist/map.js +3 -3
  105. package/dist/map.js.map +1 -1
  106. package/dist/markdown.js +2 -1
  107. package/dist/markdown.js.map +1 -1
  108. package/dist/marketing-layout.js +1 -1
  109. package/dist/marketing-layout.js.map +1 -1
  110. package/dist/marquee.js +1 -1
  111. package/dist/mascot-quote.js +1 -1
  112. package/dist/match-dialog.js +2 -1
  113. package/dist/match-dialog.js.map +1 -1
  114. package/dist/media-grid.d.ts +26 -4
  115. package/dist/media-grid.js +122 -163
  116. package/dist/media-grid.js.map +1 -1
  117. package/dist/meta-row.d.ts +54 -0
  118. package/dist/meta-row.js +35 -0
  119. package/dist/meta-row.js.map +1 -0
  120. package/dist/native/map.js +3 -3
  121. package/dist/native/map.js.map +1 -1
  122. package/dist/native.d.ts +42 -16
  123. package/dist/native.js +591 -537
  124. package/dist/native.js.map +1 -1
  125. package/dist/nav-bar.js +3 -3
  126. package/dist/page-hero.js +5 -5
  127. package/dist/page.js +2 -2
  128. package/dist/popover.js +1 -1
  129. package/dist/pricing-page.js +1 -1
  130. package/dist/product-page.js +1 -1
  131. package/dist/profile-card.js +1 -1
  132. package/dist/promise-card.js +1 -1
  133. package/dist/radio-group.js +2 -2
  134. package/dist/rail-nav.d.ts +149 -0
  135. package/dist/rail-nav.js +177 -0
  136. package/dist/rail-nav.js.map +1 -0
  137. package/dist/scroll-stage.js +1 -1
  138. package/dist/settings-layout.d.ts +75 -62
  139. package/dist/settings-layout.js +39 -6
  140. package/dist/settings-layout.js.map +1 -1
  141. package/dist/showcase.js +1 -1
  142. package/dist/site-footer.d.ts +48 -67
  143. package/dist/site-footer.js +36 -12
  144. package/dist/site-footer.js.map +1 -1
  145. package/dist/skip-link.js +1 -1
  146. package/dist/slider.js +2 -2
  147. package/dist/stage-banner.js +1 -1
  148. package/dist/step-showcase.d.ts +62 -0
  149. package/dist/step-showcase.js +227 -0
  150. package/dist/step-showcase.js.map +1 -0
  151. package/dist/tabs.js +1 -1
  152. package/dist/tabs.js.map +1 -1
  153. package/dist/terminal-replay.js +1 -1
  154. package/dist/theme.js +2 -1
  155. package/dist/theme.js.map +1 -1
  156. package/dist/toast.js +1 -1
  157. package/dist/toc.js +1 -1
  158. package/dist/tooltip.js +1 -1
  159. package/dist/update-prompt.js +2 -1
  160. package/dist/update-prompt.js.map +1 -1
  161. package/dist/vertical-video.js +2 -2
  162. package/dist/video-player.js +3 -3
  163. package/dist/waveform.d.ts +93 -0
  164. package/dist/waveform.js +95 -0
  165. package/dist/waveform.js.map +1 -0
  166. package/package.json +138 -10
  167. package/registry/achievement.json +1 -1
  168. package/registry/action-bar.json +1 -1
  169. package/registry/activity-feed.json +1 -1
  170. package/registry/alert.json +1 -1
  171. package/registry/app-header.json +202 -0
  172. package/registry/app-shell.json +33 -9
  173. package/registry/argument-card.json +37 -5
  174. package/registry/audio-player.json +5 -3
  175. package/registry/auth-layout.json +1 -1
  176. package/registry/avatar.json +1 -1
  177. package/registry/badge.json +1 -1
  178. package/registry/button.json +3 -2
  179. package/registry/captcha.json +300 -0
  180. package/registry/card-grid.json +27 -3
  181. package/registry/card.json +1 -1
  182. package/registry/catalogue-page.json +1 -1
  183. package/registry/changelog-page.json +11 -7
  184. package/registry/chat.json +1 -1
  185. package/registry/checkbox.json +1 -1
  186. package/registry/chip-link.json +1 -1
  187. package/registry/chip.json +1 -1
  188. package/registry/choice-grid.json +1 -1
  189. package/registry/cn.json +1 -1
  190. package/registry/code-block.json +1 -1
  191. package/registry/combobox.json +1 -1
  192. package/registry/command.json +1 -1
  193. package/registry/comparison-table.json +207 -0
  194. package/registry/component-page.json +1 -1
  195. package/registry/confirm-button.json +1 -1
  196. package/registry/contact-page.json +1 -1
  197. package/registry/continue-prompt.json +1 -1
  198. package/registry/countdown.json +1 -1
  199. package/registry/cta-panel.json +1 -1
  200. package/registry/dashboard-layout.json +1 -1
  201. package/registry/data-table.json +1 -1
  202. package/registry/date-picker.json +1 -1
  203. package/registry/decision-list.json +1 -1
  204. package/registry/description-list.json +1 -1
  205. package/registry/detail-layout.json +1 -1
  206. package/registry/dialog.json +1 -1
  207. package/registry/docs-article-page.json +1 -1
  208. package/registry/docs-hub-page.json +1 -1
  209. package/registry/docs-layout.json +1 -1
  210. package/registry/docs-nav.json +177 -0
  211. package/registry/document-viewer.json +1 -1
  212. package/registry/dropdown-menu.json +1 -1
  213. package/registry/empty-state.json +1 -1
  214. package/registry/error-page.json +1 -1
  215. package/registry/examples/activity-feed/native/notifications.light.png +0 -0
  216. package/registry/examples/app-header/basic.d.ts +4 -0
  217. package/registry/examples/app-header/basic.js +23 -0
  218. package/registry/examples/app-header/basic.tsx +17 -0
  219. package/registry/examples/app-shell/desktop.d.ts +4 -0
  220. package/registry/examples/app-shell/desktop.js +41 -0
  221. package/registry/examples/app-shell/desktop.tsx +37 -0
  222. package/registry/examples/argument-card/hover-light.d.ts +4 -0
  223. package/registry/examples/argument-card/hover-light.js +17 -0
  224. package/registry/examples/argument-card/hover-light.tsx +19 -0
  225. package/registry/examples/argument-card/hover-quiet.d.ts +4 -0
  226. package/registry/examples/argument-card/hover-quiet.js +17 -0
  227. package/registry/examples/argument-card/hover-quiet.tsx +19 -0
  228. package/registry/examples/avatar/native/group.light.png +0 -0
  229. package/registry/examples/avatar/native/presence.light.png +0 -0
  230. package/registry/examples/avatar/native/sizes.light.png +0 -0
  231. package/registry/examples/badge/native/tones.light.png +0 -0
  232. package/registry/examples/button/native/ghost.light.png +0 -0
  233. package/registry/examples/captcha/disclosure.d.ts +4 -0
  234. package/registry/examples/captcha/disclosure.js +14 -0
  235. package/registry/examples/captcha/disclosure.tsx +11 -0
  236. package/registry/examples/captcha/form.d.ts +4 -0
  237. package/registry/examples/captcha/form.js +18 -0
  238. package/registry/examples/captcha/form.tsx +17 -0
  239. package/registry/examples/card/native/body.light.png +0 -0
  240. package/registry/examples/card/native/default.light.png +0 -0
  241. package/registry/examples/card/native/elevated.light.png +0 -0
  242. package/registry/examples/card/native/pressable.light.png +0 -0
  243. package/registry/examples/card-grid/hover-quiet.d.ts +4 -0
  244. package/registry/examples/card-grid/hover-quiet.js +18 -0
  245. package/registry/examples/card-grid/hover-quiet.tsx +20 -0
  246. package/registry/examples/changelog-page/releases.js +1 -1
  247. package/registry/examples/changelog-page/releases.tsx +1 -1
  248. package/registry/examples/chat/native/conversation.light.png +0 -0
  249. package/registry/examples/chat/native/inbox.light.png +0 -0
  250. package/registry/examples/chip/native/multiple.light.png +0 -0
  251. package/registry/examples/chip/native/removable.light.png +0 -0
  252. package/registry/examples/chip/native/single.light.png +0 -0
  253. package/registry/examples/chip/native/toggle.light.png +0 -0
  254. package/registry/examples/combobox/native/multiple.light.png +0 -0
  255. package/registry/examples/combobox/native/search.light.png +0 -0
  256. package/registry/examples/comparison-table/versus.d.ts +4 -0
  257. package/registry/examples/comparison-table/versus.js +28 -0
  258. package/registry/examples/comparison-table/versus.tsx +20 -0
  259. package/registry/examples/countdown/native/days.light.png +0 -0
  260. package/registry/examples/countdown/native/hours.light.png +0 -0
  261. package/registry/examples/countdown/native/sizes.light.png +0 -0
  262. package/registry/examples/countdown/native/urgent.light.png +0 -0
  263. package/registry/examples/countdown/native/with-label.light.png +0 -0
  264. package/registry/examples/date-picker/native/birth-date-wheel.light.png +0 -0
  265. package/registry/examples/date-picker/native/birth-date.light.png +0 -0
  266. package/registry/examples/date-picker/native/calendar.dark.png +0 -0
  267. package/registry/examples/date-picker/native/calendar.light.png +0 -0
  268. package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
  269. package/registry/examples/date-picker/native/day-strip.light.png +0 -0
  270. package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
  271. package/registry/examples/date-picker/native/time-slots.light.png +0 -0
  272. package/registry/examples/date-picker/native/time-wheel.light.png +0 -0
  273. package/registry/examples/description-list/native/job-details.light.png +0 -0
  274. package/registry/examples/dialog/native/sheet.dark.png +0 -0
  275. package/registry/examples/dialog/native/sheet.light.png +0 -0
  276. package/registry/examples/docs-nav/groups.d.ts +4 -0
  277. package/registry/examples/docs-nav/groups.js +21 -0
  278. package/registry/examples/docs-nav/groups.tsx +15 -0
  279. package/registry/examples/empty-state/native/default.light.png +0 -0
  280. package/registry/examples/field/native/default.light.png +0 -0
  281. package/registry/examples/field/native/select.light.png +0 -0
  282. package/registry/examples/force-update-screen/native/default.light.png +0 -0
  283. package/registry/examples/form/native/amount.light.png +0 -0
  284. package/registry/examples/form/native/audience.light.png +0 -0
  285. package/registry/examples/form/native/profile.light.png +0 -0
  286. package/registry/examples/form/native/settings.light.png +0 -0
  287. package/registry/examples/form/native/sign-up.light.png +0 -0
  288. package/registry/examples/form/native/upload.dark.png +0 -0
  289. package/registry/examples/form/native/upload.light.png +0 -0
  290. package/registry/examples/genui/streaming.d.ts +4 -0
  291. package/registry/examples/genui/streaming.js +18 -0
  292. package/registry/examples/genui/streaming.tsx +14 -0
  293. package/registry/examples/genui/table.d.ts +4 -0
  294. package/registry/examples/genui/table.js +19 -0
  295. package/registry/examples/genui/table.tsx +14 -0
  296. package/registry/examples/goal-gauge/native/default.light.png +0 -0
  297. package/registry/examples/header/native/large-title.light.png +0 -0
  298. package/registry/examples/link-card/hover-light.d.ts +4 -0
  299. package/registry/examples/link-card/hover-light.js +18 -0
  300. package/registry/examples/link-card/hover-light.tsx +20 -0
  301. package/registry/examples/link-card/hover-quiet.d.ts +4 -0
  302. package/registry/examples/link-card/hover-quiet.js +18 -0
  303. package/registry/examples/link-card/hover-quiet.tsx +20 -0
  304. package/registry/examples/loader/native/job-wait.light.png +0 -0
  305. package/registry/examples/maintenance-screen/native/default.light.png +0 -0
  306. package/registry/examples/map/native/places.light.png +0 -0
  307. package/registry/examples/markdown/native/basic.light.png +0 -0
  308. package/registry/examples/mascot-state/native/default.light.png +0 -0
  309. package/registry/examples/media-picker/native/story.light.png +0 -0
  310. package/registry/examples/meta-row/native/video.d.ts +4 -0
  311. package/registry/examples/meta-row/native/video.dark.png +0 -0
  312. package/registry/examples/meta-row/native/video.js +11 -0
  313. package/registry/examples/meta-row/native/video.light.png +0 -0
  314. package/registry/examples/meta-row/native/video.tsx +5 -0
  315. package/registry/examples/meta-row/status.d.ts +4 -0
  316. package/registry/examples/meta-row/status.js +12 -0
  317. package/registry/examples/meta-row/status.tsx +7 -0
  318. package/registry/examples/meta-row/video.d.ts +4 -0
  319. package/registry/examples/meta-row/video.js +12 -0
  320. package/registry/examples/meta-row/video.tsx +7 -0
  321. package/registry/examples/meter/native/credits.light.png +0 -0
  322. package/registry/examples/meter/native/split-ring.light.png +0 -0
  323. package/registry/examples/number-ticker/native/balance.light.png +0 -0
  324. package/registry/examples/onboarding/native/first-launch.light.png +0 -0
  325. package/registry/examples/otp-input/native/verify.light.png +0 -0
  326. package/registry/examples/pagination/native/cursor.light.png +0 -0
  327. package/registry/examples/pagination/native/pages.light.png +0 -0
  328. package/registry/examples/permission-prompt/native/blocked.light.png +0 -0
  329. package/registry/examples/permission-prompt/native/camera.light.png +0 -0
  330. package/registry/examples/profile-card/native/default.light.png +0 -0
  331. package/registry/examples/radio-group/native/buttons.light.png +0 -0
  332. package/registry/examples/radio-group/native/cards.light.png +0 -0
  333. package/registry/examples/radio-group/native/list.light.png +0 -0
  334. package/registry/examples/radio-group/native/segmented.light.png +0 -0
  335. package/registry/examples/rail-nav/expandable.d.ts +4 -0
  336. package/registry/examples/rail-nav/expandable.js +34 -0
  337. package/registry/examples/rail-nav/expandable.tsx +28 -0
  338. package/registry/examples/rail-nav/studio.d.ts +4 -0
  339. package/registry/examples/rail-nav/studio.js +43 -0
  340. package/registry/examples/rail-nav/studio.tsx +38 -0
  341. package/registry/examples/screen/native/app-shell.light.png +0 -0
  342. package/registry/examples/screen/native/auth.light.png +0 -0
  343. package/registry/examples/screen/native/map.light.png +0 -0
  344. package/registry/examples/screen/native/notifications.light.png +0 -0
  345. package/registry/examples/screen/native/profile.light.png +0 -0
  346. package/registry/examples/segmented/native/default.light.png +0 -0
  347. package/registry/examples/segmented/native/small.light.png +0 -0
  348. package/registry/examples/settings-layout/flat.d.ts +4 -0
  349. package/registry/examples/settings-layout/flat.js +26 -0
  350. package/registry/examples/settings-layout/flat.tsx +30 -0
  351. package/registry/examples/showcase/native/slides.light.png +0 -0
  352. package/registry/examples/site-footer/app.d.ts +4 -0
  353. package/registry/examples/site-footer/app.js +25 -0
  354. package/registry/examples/site-footer/app.tsx +22 -0
  355. package/registry/examples/site-footer/docs.d.ts +4 -0
  356. package/registry/examples/site-footer/docs.js +31 -0
  357. package/registry/examples/site-footer/docs.tsx +24 -0
  358. package/registry/examples/slider/native/default.light.png +0 -0
  359. package/registry/examples/slider/native/stepped.light.png +0 -0
  360. package/registry/examples/step-progress/native/sign-up.light.png +0 -0
  361. package/registry/examples/step-showcase/desktop.d.ts +4 -0
  362. package/registry/examples/step-showcase/desktop.js +24 -0
  363. package/registry/examples/step-showcase/desktop.tsx +19 -0
  364. package/registry/examples/step-showcase/phone.d.ts +4 -0
  365. package/registry/examples/step-showcase/phone.js +24 -0
  366. package/registry/examples/step-showcase/phone.tsx +19 -0
  367. package/registry/examples/stepper/native/run.light.png +0 -0
  368. package/registry/examples/swipeable-row/native/conversation.light.png +0 -0
  369. package/registry/examples/switch/native/settings.light.png +0 -0
  370. package/registry/examples/tab-bar/native/main-sections.light.png +0 -0
  371. package/registry/examples/tabs/native/sections.light.png +0 -0
  372. package/registry/examples/tabs/native/segmented.light.png +0 -0
  373. package/registry/examples/tag-selector/native/interests.light.png +0 -0
  374. package/registry/examples/toast/native/tones.light.png +0 -0
  375. package/registry/examples/txt/native/tones.dark.png +0 -0
  376. package/registry/examples/txt/native/tones.light.png +0 -0
  377. package/registry/examples/update-prompt/native/default.light.png +0 -0
  378. package/registry/examples/waveform/card.d.ts +4 -0
  379. package/registry/examples/waveform/card.js +18 -0
  380. package/registry/examples/waveform/card.tsx +16 -0
  381. package/registry/examples/waveform/native/card.d.ts +4 -0
  382. package/registry/examples/waveform/native/card.dark.png +0 -0
  383. package/registry/examples/waveform/native/card.js +19 -0
  384. package/registry/examples/waveform/native/card.light.png +0 -0
  385. package/registry/examples/waveform/native/card.tsx +19 -0
  386. package/registry/examples/waveform/sizes.d.ts +4 -0
  387. package/registry/examples/waveform/sizes.js +16 -0
  388. package/registry/examples/waveform/sizes.tsx +14 -0
  389. package/registry/field.json +1 -1
  390. package/registry/file-upload.json +1 -1
  391. package/registry/filter-bar.json +1 -1
  392. package/registry/force-update-screen.json +1 -1
  393. package/registry/form.json +1 -1
  394. package/registry/gallery-page.json +1 -1
  395. package/registry/genui.json +409 -0
  396. package/registry/glow-card.json +1 -1
  397. package/registry/goal-gauge.json +1 -1
  398. package/registry/how-it-works-page.json +1 -1
  399. package/registry/image-cropper.json +1 -1
  400. package/registry/index.json +323 -14
  401. package/registry/iso.json +1 -1
  402. package/registry/kanban.json +1 -1
  403. package/registry/kbd.json +1 -1
  404. package/registry/landing-page.json +1 -1
  405. package/registry/landscape.json +1 -1
  406. package/registry/legal-page.json +1 -1
  407. package/registry/link-card.json +38 -6
  408. package/registry/list.json +1 -1
  409. package/registry/loader.json +1 -1
  410. package/registry/longform-page.json +1 -1
  411. package/registry/maintenance-screen.json +1 -1
  412. package/registry/map.json +2 -2
  413. package/registry/markdown.json +1 -1
  414. package/registry/marketing-layout.json +1 -1
  415. package/registry/marquee.json +1 -1
  416. package/registry/mascot-quote.json +1 -1
  417. package/registry/mascot-state.json +1 -1
  418. package/registry/mascots.json +1 -1
  419. package/registry/match-dialog.json +1 -1
  420. package/registry/media-capture.json +1 -1
  421. package/registry/media-grid.json +92 -6
  422. package/registry/meta-row.json +215 -0
  423. package/registry/meter.json +1 -1
  424. package/registry/nav-bar.json +13 -13
  425. package/registry/number-ticker.json +1 -1
  426. package/registry/page-header.json +1 -1
  427. package/registry/page-hero.json +1 -1
  428. package/registry/page.json +1 -1
  429. package/registry/pagination.json +1 -1
  430. package/registry/photo-grid.json +1 -1
  431. package/registry/pointer-light.json +1 -1
  432. package/registry/popover.json +1 -1
  433. package/registry/pricing-page.json +1 -1
  434. package/registry/product-page.json +1 -1
  435. package/registry/profile-card.json +1 -1
  436. package/registry/progress.json +1 -1
  437. package/registry/promise-card.json +1 -1
  438. package/registry/radio-group.json +1 -1
  439. package/registry/rail-nav.json +493 -0
  440. package/registry/recipes.json +1 -1
  441. package/registry/scroll-stage.json +1 -1
  442. package/registry/search-field.json +1 -1
  443. package/registry/section-backdrop.json +1 -1
  444. package/registry/separator.json +1 -1
  445. package/registry/settings-layout.json +104 -9
  446. package/registry/showcase.json +1 -1
  447. package/registry/site-footer.json +49 -17
  448. package/registry/sites.json +1 -1
  449. package/registry/skeleton.json +1 -1
  450. package/registry/skip-link.json +2 -2
  451. package/registry/slider.json +1 -1
  452. package/registry/slot.json +1 -1
  453. package/registry/spinner.json +1 -1
  454. package/registry/split-view.json +1 -1
  455. package/registry/stage-banner.json +1 -1
  456. package/registry/stat.json +1 -1
  457. package/registry/status-page.json +1 -1
  458. package/registry/step-progress.json +1 -1
  459. package/registry/step-showcase.json +296 -0
  460. package/registry/stepper.json +1 -1
  461. package/registry/swipe-deck.json +1 -1
  462. package/registry/switch.json +1 -1
  463. package/registry/tabs.json +2 -2
  464. package/registry/tag-input.json +1 -1
  465. package/registry/tag-selector.json +1 -1
  466. package/registry/terminal-replay.json +1 -1
  467. package/registry/theme.json +1 -1
  468. package/registry/toast.json +1 -1
  469. package/registry/toc.json +1 -1
  470. package/registry/tooltip.json +1 -1
  471. package/registry/tree-view.json +1 -1
  472. package/registry/update-prompt.json +1 -1
  473. package/registry/verified-badge.json +1 -1
  474. package/registry/vertical-video.json +1 -1
  475. package/registry/video-player.json +1 -1
  476. package/registry/video-trimmer.json +1 -1
  477. package/registry/virtual.json +1 -1
  478. package/registry/waveform.json +296 -0
  479. package/dist/chunk-2FRWNSRO.js.map +0 -1
  480. package/dist/chunk-3BC4XQ6C.js.map +0 -1
  481. package/dist/chunk-3GODX3D6.js.map +0 -1
  482. package/dist/chunk-3IN6TOPM.js.map +0 -1
  483. package/dist/chunk-4LOMIQVX.js.map +0 -1
  484. package/dist/chunk-G3ETON2A.js.map +0 -1
  485. package/dist/chunk-IZ7MV6HM.js.map +0 -1
  486. package/dist/chunk-LIPK4UCS.js.map +0 -1
  487. package/dist/chunk-OWC2LZD2.js.map +0 -1
  488. package/dist/chunk-ZNMFG62E.js.map +0 -1
  489. /package/dist/{chunk-5MH64NIL.js.map → chunk-2L67YTNV.js.map} +0 -0
  490. /package/dist/{chunk-FKBHWS4N.js.map → chunk-CEJDH6SA.js.map} +0 -0
  491. /package/dist/{chunk-5Z7FWCV2.js.map → chunk-HBZPJ3EP.js.map} +0 -0
  492. /package/dist/{chunk-C2BRIFJG.js.map → chunk-HJFRHYCI.js.map} +0 -0
  493. /package/dist/{chunk-BTMFZ66D.js.map → chunk-KM6VAKIE.js.map} +0 -0
  494. /package/dist/{chunk-DGQMDJXK.js.map → chunk-LZNZLCOE.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/genui/catalog.tsx","../src/alert/alert.tsx","../src/genui/spec.ts","../src/genui/store.ts","../src/genui/surface.tsx"],"sourcesContent":["// The base catalog of `krizaka:genui/v1` (ADR-082): layout, text, card, callout and table — what a model may draw with\n// @krizaka/ui alone. `KpiStat` and `ChartCard` come from @krizaka/charts (`chartsGenUiCatalog`), which depends on this\n// package, never the reverse.\nimport { formatCompact, formatMoney, formatNumber, formatPercent } from \"@krizaka/intl\";\nimport type * as React from \"react\";\n\nimport { Alert } from \"../alert\";\nimport { CardBody, CardRoot, CardTitle } from \"../card\";\nimport { DataTable, type DataTableColumn } from \"../data-table\";\nimport {\n allowKeys,\n checkBinding,\n checkChildren,\n checkCurrency,\n checkEnum,\n checkId,\n checkText,\n GENUI_FORMATS,\n GENUI_LIMITS,\n type GenUiComponent,\n type GenUiFormat,\n} from \"./spec\";\nimport type { GenUiCatalog, GenUiEntry, GenUiRenderContext } from \"./surface\";\n\nconst first = (...problems: (string | null)[]) => problems.find((p) => p !== null) ?? null;\n\n/** A resolved value as text — strings and numbers only; anything else is not drawn. */\nfunction asText(value: unknown): string {\n if (typeof value === \"string\") return value.slice(0, GENUI_LIMITS.string);\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\n/** A number written in one of the closed formats. */\nexport function formatGenUiValue(value: unknown, format: GenUiFormat | undefined, locale: string, currency?: string): string {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return asText(value);\n switch (format) {\n case \"integer\":\n return formatNumber(Math.round(value), { locale, maximumFractionDigits: 0 });\n case \"compact\":\n return formatCompact(value, { locale });\n case \"percent\":\n return formatPercent(value, { locale, maximumFractionDigits: 1 });\n case \"money\":\n return currency ? formatMoney(Math.round(value), { currency, locale }) : formatNumber(value, { locale });\n default:\n return formatNumber(value, { locale, maximumFractionDigits: 2 });\n }\n}\n\nconst TONES = [\"info\", \"success\", \"warning\", \"danger\"] as const;\nconst VARIANTS = [\"body\", \"heading\", \"caption\"] as const;\n\nconst column: GenUiEntry = {\n check: (c) => first(allowKeys(c, [\"children\"]), checkChildren(c.children)),\n render: (c, ctx) => <div className=\"flex min-w-0 flex-col gap-4\">{ctx.children(c.children)}</div>,\n};\n\nconst row: GenUiEntry = {\n check: (c) => first(allowKeys(c, [\"children\"]), checkChildren(c.children)),\n render: (c, ctx) => <div className=\"grid min-w-0 gap-4 [grid-template-columns:repeat(auto-fit,minmax(12rem,1fr))]\">{ctx.children(c.children)}</div>,\n};\n\nconst text: GenUiEntry = {\n check: (c) => first(allowKeys(c, [\"text\", \"variant\"]), checkText(c.text, \"text\", true), checkEnum(c.variant, \"variant\", VARIANTS)),\n render: (c, ctx) => {\n const value = asText(ctx.resolve(c.text));\n if (c.variant === \"heading\") return <h3 className=\"text-base font-semibold text-fg\">{value}</h3>;\n if (c.variant === \"caption\") return <p className=\"text-xs text-fg-muted\">{value}</p>;\n return <p className=\"text-sm text-fg\">{value}</p>;\n },\n};\n\nconst card: GenUiEntry = {\n check: (c) => first(allowKeys(c, [\"title\", \"child\"]), checkText(c.title, \"title\", false), c.child === undefined ? null : checkId(c.child, \"child\")),\n render: (c, ctx) => (\n <CardRoot>\n <CardBody>\n {c.title !== undefined && <CardTitle>{asText(ctx.resolve(c.title))}</CardTitle>}\n {c.child !== undefined && <div className=\"mt-3\">{ctx.child(c.child)}</div>}\n </CardBody>\n </CardRoot>\n ),\n};\n\nconst callout: GenUiEntry = {\n check: (c) => first(allowKeys(c, [\"tone\", \"title\", \"text\"]), checkEnum(c.tone, \"tone\", TONES), checkText(c.title, \"title\", false), checkText(c.text, \"text\", false)),\n render: (c, ctx) => (\n <Alert tone={(c.tone as (typeof TONES)[number] | undefined) ?? \"info\"} title={c.title === undefined ? undefined : asText(ctx.resolve(c.title))}>\n {c.text === undefined ? undefined : asText(ctx.resolve(c.text))}\n </Alert>\n ),\n};\n\ntype Column = { key: string; label: string; format?: GenUiFormat; currency?: string };\n\nfunction checkColumns(value: unknown): string | null {\n if (!Array.isArray(value) || value.length === 0 || value.length > 12) return \"columns is an array of 1 to 12\";\n for (const raw of value) {\n if (raw === null || typeof raw !== \"object\" || Array.isArray(raw)) return \"a column is an object\";\n const col = raw as Record<string, unknown>;\n const keys = Object.keys(col).find((k) => ![\"key\", \"label\", \"format\", \"currency\"].includes(k));\n if (keys) return `a column has no key \"${keys}\"`;\n if (typeof col.key !== \"string\" || !/^[A-Za-z0-9_]{1,64}$/.test(col.key)) return \"a column key is 1-64 characters of [A-Za-z0-9_]\";\n if (typeof col.label !== \"string\" || col.label.length > 120) return \"a column label is a string\";\n const problem = first(checkEnum(col.format, \"format\", GENUI_FORMATS), checkCurrency(col.currency, col.format === \"money\"));\n if (problem) return problem;\n }\n return null;\n}\n\ntype Row = Record<string, unknown> & { __genuiRow: string };\n\nfunction TableView({ c, ctx }: { c: GenUiComponent; ctx: GenUiRenderContext }) {\n const columns = c.columns as readonly Column[];\n const raw = ctx.resolve(c.rows);\n const rows: Row[] = Array.isArray(raw)\n ? raw.slice(0, GENUI_LIMITS.array).flatMap((r, i) => (r !== null && typeof r === \"object\" && !Array.isArray(r) ? [{ ...(r as Record<string, unknown>), __genuiRow: String(i) }] : []))\n : [];\n const cols: DataTableColumn<Row>[] = columns.map((col) => ({\n id: col.key,\n header: col.label,\n sortable: true,\n type: col.format ? \"number\" : \"text\",\n value: (r) => {\n const v = r[col.key];\n return typeof v === \"number\" || typeof v === \"string\" ? v : null;\n },\n cell: (r) => formatGenUiValue(r[col.key], col.format, ctx.locale, col.currency),\n }));\n if (rows.length === 0) return <p className=\"text-sm text-fg-muted\">{ctx.labels.noData}</p>;\n return <DataTable rows={rows} columns={cols} getRowId={(r) => r.__genuiRow} caption={c.caption === undefined ? ctx.labels.surface : asText(ctx.resolve(c.caption))} showCaption={c.caption !== undefined} />;\n}\n\nconst table: GenUiEntry = {\n check: (c) => first(allowKeys(c, [\"caption\", \"columns\", \"rows\"]), checkText(c.caption, \"caption\", false), checkColumns(c.columns), checkBinding(c.rows, \"rows\")),\n render: (c, ctx): React.ReactNode => <TableView c={c} ctx={ctx} />,\n};\n\n/** `Column`, `Row`, `Text`, `Card`, `Callout`, `Table` — the catalog @krizaka/ui draws on its own. */\nexport const baseGenUiCatalog: GenUiCatalog = { Column: column, Row: row, Text: text, Card: card, Callout: callout, Table: table };\n","// Server-safe. A message in the flow of the page (not a toast): a tone, an icon, a title, a text, an action.\n// danger and warning are announced at once (role=\"alert\"); info and success politely (role=\"status\").\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\n// Soft tones (a tint, a tinted border, a coloured icon): the text stays a text role — the invariant status tokens are\n// too light for small text on a light surface (WCAG AA).\nexport const alertVariants = tv({\n slots: {\n root: \"relative flex w-full items-start gap-3 rounded-xl border p-4 text-sm text-fg\",\n icon: \"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center [&>svg]:h-5 [&>svg]:w-5\",\n content: \"flex min-w-0 flex-1 flex-col gap-1\",\n title: \"font-semibold text-fg\",\n description: \"text-fg-secondary\",\n action: \"flex shrink-0 items-center gap-2 self-center\",\n },\n variants: {\n tone: {\n info: { root: \"border-info/40 bg-info/10\", icon: \"text-info\" },\n success: { root: \"border-success/40 bg-success/10\", icon: \"text-success\" },\n warning: { root: \"border-warning/50 bg-warning/10\", icon: \"text-warning\" },\n danger: { root: \"border-danger/50 bg-danger/10\", icon: \"text-danger\" },\n },\n },\n defaultVariants: { tone: \"info\" },\n});\n\nexport type AlertTone = NonNullable<VariantProps<typeof alertVariants>[\"tone\"]>;\n\nexport type AlertProps = Omit<React.ComponentProps<\"div\">, \"title\"> & {\n /** The tone: `danger` and `warning` are announced at once (`role=\"alert\"`), `info` and `success` politely. */\n tone?: AlertTone;\n /** A decorative icon (hidden from assistive technology). */\n icon?: React.ReactNode;\n /** The headline, in bold above the text. */\n title?: React.ReactNode;\n /** What to do: a Button, a link. */\n action?: React.ReactNode;\n};\n\nexport function Alert({ tone = \"info\", icon, title, action, className, children, ...props }: AlertProps) {\n const s = alertVariants({ tone });\n return (\n <div role={tone === \"danger\" || tone === \"warning\" ? \"alert\" : \"status\"} data-tone={tone} className={s.root({ className })} {...props}>\n {icon && (\n <span aria-hidden className={s.icon()}>\n {icon}\n </span>\n )}\n <div className={s.content()}>\n {title && <p className={s.title()}>{title}</p>}\n {children && <div className={s.description()}>{children}</div>}\n </div>\n {action && <div className={s.action()}>{action}</div>}\n </div>\n );\n}\n","// The data-driven UI spec: a strict subset of A2UI v0.9 (ADR-082, krizaka/orazaka-packs). A model describes an interface\n// as data — never code — and only with the components of a catalog the client declares. Everything here is a pure\n// function over JSON: parse, validate, apply. Nothing is evaluated, nothing is trusted.\n\n/** The protocol version every message carries. */\nexport const GENUI_VERSION = \"v0.9\";\n\n/** The catalog a surface must name: the Krizaka components, version 1. */\nexport const GENUI_CATALOG_ID = \"krizaka:genui/v1\";\n\n/** The bounds of a surface — what a model may ask for, at most. */\nexport const GENUI_LIMITS = {\n /** Components per surface. */\n components: 300,\n /** Nesting depth from the root. */\n depth: 12,\n /** Characters in one string. */\n string: 4000,\n /** Items in one array of the data model. */\n array: 1000,\n /** Nesting depth of a data model value. */\n dataDepth: 12,\n /** Values (objects, arrays, scalars) in one data model update. */\n dataNodes: 50_000,\n /** Segments of a data path. */\n pathSegments: 16,\n} as const;\n\n/** One component as the model writes it: an id, the catalog name, its properties. */\nexport type GenUiComponent = { readonly id: string; readonly component: string } & Readonly<Record<string, unknown>>;\n\n/** A value bound to the data model: `{ \"path\": \"/rows\" }`. */\nexport type GenUiBinding = { readonly path: string };\n\n/** The four messages of A2UI v0.9. */\nexport type GenUiMessage =\n | { readonly version: typeof GENUI_VERSION; readonly createSurface: { readonly surfaceId: string; readonly catalogId: string } }\n | { readonly version: typeof GENUI_VERSION; readonly updateComponents: { readonly surfaceId: string; readonly components: readonly GenUiComponent[] } }\n | { readonly version: typeof GENUI_VERSION; readonly updateDataModel: { readonly surfaceId: string; readonly path: string; readonly value?: unknown } }\n | { readonly version: typeof GENUI_VERSION; readonly deleteSurface: { readonly surfaceId: string } };\n\n/** What validating a message says. */\nexport type GenUiResult<T> = { readonly ok: true; readonly value: T } | { readonly ok: false; readonly error: string };\n\n/** How a catalog entry checks a component's own properties: `null` when they are fine, else why not. */\nexport type GenUiPropsCheck = (component: GenUiComponent) => string | null;\n\nconst ID = /^[A-Za-z0-9_-]{1,64}$/;\nconst MESSAGE_KEYS = [\"createSurface\", \"updateComponents\", \"updateDataModel\", \"deleteSurface\"] as const;\nconst FORBIDDEN_SEGMENTS = new Set([\"__proto__\", \"prototype\", \"constructor\"]);\n\nconst fail = (error: string): { ok: false; error: string } => ({ ok: false, error });\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction onlyKeys(value: Record<string, unknown>, allowed: readonly string[], where: string): string | null {\n for (const key of Object.keys(value)) if (!allowed.includes(key)) return `${where}: unknown key \"${key}\"`;\n return null;\n}\n\n/** An id of a surface or a component, or why not. */\nexport function checkId(value: unknown, where: string): string | null {\n return typeof value === \"string\" && ID.test(value) ? null : `${where}: an id is 1-64 characters of [A-Za-z0-9_-]`;\n}\n\n/** The segments of a JSON pointer (`/a/b/0`), or why it is refused — `__proto__` and friends never pass. */\nexport function parsePath(path: unknown): GenUiResult<readonly string[]> {\n if (typeof path !== \"string\" || (path !== \"/\" && !path.startsWith(\"/\")) || path.length > 512) return fail(\"a path is a JSON pointer: /a/b\");\n if (path === \"/\") return { ok: true, value: [] };\n const segments = path\n .slice(1)\n .split(\"/\")\n .map((s) => s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n if (segments.length > GENUI_LIMITS.pathSegments) return fail(`a path has at most ${GENUI_LIMITS.pathSegments} segments`);\n for (const s of segments) {\n if (s === \"\" || FORBIDDEN_SEGMENTS.has(s)) return fail(`a path may not hold the segment \"${s}\"`);\n }\n return { ok: true, value: segments };\n}\n\n/** `true` when the value is a binding `{ path }` (and only that). */\nexport function isBinding(value: unknown): value is GenUiBinding {\n return isPlainObject(value) && Object.keys(value).length === 1 && typeof value.path === \"string\";\n}\n\n/**\n * A copy of a data model value that is plain JSON within the limits — strings, finite numbers, booleans, null, arrays\n * and plain objects — or why it is refused. The copy has a null prototype for every object: nothing it holds can\n * reach `Object.prototype`.\n */\nexport function sanitizeData(value: unknown): GenUiResult<unknown> {\n let nodes = 0;\n const walk = (v: unknown, depth: number): GenUiResult<unknown> => {\n if (++nodes > GENUI_LIMITS.dataNodes) return fail(`the data holds more than ${GENUI_LIMITS.dataNodes} values`);\n if (depth > GENUI_LIMITS.dataDepth) return fail(`the data nests deeper than ${GENUI_LIMITS.dataDepth}`);\n if (v === null || typeof v === \"boolean\") return { ok: true, value: v };\n if (typeof v === \"number\") return Number.isFinite(v) ? { ok: true, value: v } : fail(\"a number must be finite\");\n if (typeof v === \"string\") return v.length <= GENUI_LIMITS.string ? { ok: true, value: v } : fail(`a string has at most ${GENUI_LIMITS.string} characters`);\n if (Array.isArray(v)) {\n if (v.length > GENUI_LIMITS.array) return fail(`an array has at most ${GENUI_LIMITS.array} items`);\n const out: unknown[] = [];\n for (const item of v) {\n const r = walk(item, depth + 1);\n if (!r.ok) return r;\n out.push(r.value);\n }\n return { ok: true, value: out };\n }\n if (isPlainObject(v)) {\n const out: Record<string, unknown> = Object.create(null);\n for (const [key, item] of Object.entries(v)) {\n if (FORBIDDEN_SEGMENTS.has(key)) return fail(`a key may not be \"${key}\"`);\n const r = walk(item, depth + 1);\n if (!r.ok) return r;\n out[key] = r.value;\n }\n return { ok: true, value: out };\n }\n return fail(\"the data is plain JSON only\");\n };\n return walk(value, 0);\n}\n\n/**\n * A message as the model sent it — parsed and checked against the spec and the catalog, or why it is refused. A\n * component's own properties are checked by its catalog entry; a component the catalog does not hold is refused.\n */\nexport function validateMessage(input: unknown, catalog: Readonly<Record<string, { readonly check: GenUiPropsCheck }>>): GenUiResult<GenUiMessage> {\n if (!isPlainObject(input)) return fail(\"a message is a JSON object\");\n if (input.version !== GENUI_VERSION) return fail(`version must be \"${GENUI_VERSION}\"`);\n const present = MESSAGE_KEYS.filter((k) => k in input);\n if (present.length !== 1) return fail(\"a message holds exactly one of createSurface, updateComponents, updateDataModel, deleteSurface\");\n const kind = present[0];\n const extra = onlyKeys(input, [\"version\", kind], \"message\");\n if (extra) return fail(extra);\n const body = input[kind];\n if (!isPlainObject(body)) return fail(`${kind} is an object`);\n const surface = checkId(body.surfaceId, `${kind}.surfaceId`);\n if (surface) return fail(surface);\n\n switch (kind) {\n case \"createSurface\": {\n const keys = onlyKeys(body, [\"surfaceId\", \"catalogId\", \"theme\", \"sendDataModel\"], kind);\n if (keys) return fail(keys);\n if (body.catalogId !== GENUI_CATALOG_ID) return fail(`catalogId must be \"${GENUI_CATALOG_ID}\"`);\n return { ok: true, value: { version: GENUI_VERSION, createSurface: { surfaceId: body.surfaceId as string, catalogId: GENUI_CATALOG_ID } } };\n }\n case \"updateComponents\": {\n const keys = onlyKeys(body, [\"surfaceId\", \"components\"], kind);\n if (keys) return fail(keys);\n if (!Array.isArray(body.components) || body.components.length > GENUI_LIMITS.components) {\n return fail(`components is an array of at most ${GENUI_LIMITS.components}`);\n }\n const components: GenUiComponent[] = [];\n for (const raw of body.components) {\n if (!isPlainObject(raw)) return fail(\"a component is an object\");\n const id = checkId(raw.id, \"component.id\");\n if (id) return fail(id);\n if (typeof raw.component !== \"string\" || !Object.hasOwn(catalog, raw.component)) {\n return fail(`component \"${String(raw.id)}\": \"${String(raw.component)}\" is not in the catalog`);\n }\n const clean = sanitizeData(raw);\n if (!clean.ok) return fail(`component \"${raw.id}\": ${clean.error}`);\n const component = { ...(clean.value as Record<string, unknown>) } as GenUiComponent;\n const problem = catalog[raw.component].check(component);\n if (problem) return fail(`component \"${raw.id}\" (${raw.component}): ${problem}`);\n components.push(component);\n }\n return { ok: true, value: { version: GENUI_VERSION, updateComponents: { surfaceId: body.surfaceId as string, components } } };\n }\n case \"updateDataModel\": {\n const keys = onlyKeys(body, [\"surfaceId\", \"path\", \"value\"], kind);\n if (keys) return fail(keys);\n const path = body.path === undefined ? \"/\" : body.path;\n const parsed = parsePath(path);\n if (!parsed.ok) return parsed;\n if (!(\"value\" in body)) return { ok: true, value: { version: GENUI_VERSION, updateDataModel: { surfaceId: body.surfaceId as string, path: path as string } } };\n const clean = sanitizeData(body.value);\n if (!clean.ok) return clean;\n return { ok: true, value: { version: GENUI_VERSION, updateDataModel: { surfaceId: body.surfaceId as string, path: path as string, value: clean.value } } };\n }\n default: {\n const keys = onlyKeys(body, [\"surfaceId\"], kind);\n if (keys) return fail(keys);\n return { ok: true, value: { version: GENUI_VERSION, deleteSurface: { surfaceId: body.surfaceId as string } } };\n }\n }\n}\n\n// ── checks the catalog entries share ─────────────────────────────────────────────────────────────────────────────\n\n/** Why the component's keys are refused, or null: only `id`, `component` and the entry's own keys. */\nexport function allowKeys(component: GenUiComponent, keys: readonly string[]): string | null {\n return onlyKeys(component, [\"id\", \"component\", ...keys], \"properties\");\n}\n\n/** A short text (or a binding to one), required or not. */\nexport function checkText(value: unknown, name: string, required: boolean): string | null {\n if (value === undefined) return required ? `${name} is required` : null;\n if (isBinding(value)) return parsePath(value.path).ok ? null : `${name}: a bad path`;\n return typeof value === \"string\" ? null : `${name} is a string`;\n}\n\n/** A value among a closed list. */\nexport function checkEnum(value: unknown, name: string, allowed: readonly string[], required = false): string | null {\n if (value === undefined) return required ? `${name} is required` : null;\n return typeof value === \"string\" && allowed.includes(value) ? null : `${name} is one of ${allowed.join(\", \")}`;\n}\n\n/** A list of child ids. */\nexport function checkChildren(value: unknown, name = \"children\"): string | null {\n if (!Array.isArray(value) || value.length > GENUI_LIMITS.components) return `${name} is an array of component ids`;\n for (const id of value) if (checkId(id, name)) return `${name} holds ids only`;\n return null;\n}\n\n/** A binding to the data model (required). */\nexport function checkBinding(value: unknown, name: string): string | null {\n if (!isBinding(value)) return `${name} is a binding { \"path\": \"/…\" }`;\n return parsePath(value.path).ok ? null : `${name}: a bad path`;\n}\n\n/** A number, or a binding to one. */\nexport function checkNumber(value: unknown, name: string, required: boolean): string | null {\n if (value === undefined) return required ? `${name} is required` : null;\n if (isBinding(value)) return parsePath(value.path).ok ? null : `${name}: a bad path`;\n return typeof value === \"number\" && Number.isFinite(value) ? null : `${name} is a number`;\n}\n\n/** The value formats a model may name. */\nexport const GENUI_FORMATS = [\"number\", \"integer\", \"compact\", \"percent\", \"money\"] as const;\nexport type GenUiFormat = (typeof GENUI_FORMATS)[number];\n\n/** A three-letter currency code. */\nexport function checkCurrency(value: unknown, required: boolean): string | null {\n if (value === undefined) return required ? \"currency is required with the money format\" : null;\n return typeof value === \"string\" && /^[A-Z]{3}$/.test(value) ? null : \"currency is a three-letter code (CAD)\";\n}\n","// The surfaces a stream of A2UI messages builds — pure: `applyMessage` returns a new state, `readStream` turns a growing\n// text (a model's answer as it arrives) into the messages it holds so far. Nothing here renders.\nimport { GENUI_LIMITS, type GenUiComponent, type GenUiMessage, type GenUiPropsCheck, parsePath, validateMessage } from \"./spec\";\n\n/** One surface: its components by id, and its data model. */\nexport type GenUiSurfaceState = {\n readonly id: string;\n readonly components: ReadonlyMap<string, GenUiComponent>;\n readonly data: unknown;\n};\n\n/** Every surface of a stream, and what was refused on the way. */\nexport type GenUiState = {\n readonly surfaces: ReadonlyMap<string, GenUiSurfaceState>;\n /** The order surfaces were created in. */\n readonly order: readonly string[];\n /** Why messages were dropped, in order (a dropped message leaves the rest of the surface as it was). */\n readonly errors: readonly string[];\n};\n\nexport const emptyGenUiState: GenUiState = { surfaces: new Map(), order: [], errors: [] };\n\nconst withError = (state: GenUiState, error: string): GenUiState => ({ ...state, errors: [...state.errors, error] });\n\nfunction setAt(root: unknown, segments: readonly string[], value: unknown, remove: boolean): unknown {\n if (segments.length === 0) return remove ? Object.create(null) : value;\n const [head, ...rest] = segments;\n if (Array.isArray(root)) {\n const index = Number(head);\n if (!Number.isInteger(index) || index < 0 || index > root.length || index >= GENUI_LIMITS.array) return root;\n const copy = [...root];\n if (remove && rest.length === 0) copy.splice(index, 1);\n else copy[index] = setAt(root[index], rest, value, remove);\n return copy;\n }\n const base: Record<string, unknown> = Object.assign(Object.create(null), root !== null && typeof root === \"object\" ? root : {});\n if (remove && rest.length === 0) delete base[head];\n else base[head] = setAt(base[head], rest, value, remove);\n return base;\n}\n\n/** The value at a JSON pointer of the data model, `undefined` when there is none. */\nexport function readPath(data: unknown, path: string): unknown {\n const parsed = parsePath(path);\n if (!parsed.ok) return undefined;\n let cursor: unknown = data;\n for (const segment of parsed.value) {\n if (cursor === null || typeof cursor !== \"object\") return undefined;\n if (!Object.hasOwn(cursor, segment)) return undefined;\n cursor = (cursor as Record<string, unknown>)[segment];\n }\n return cursor;\n}\n\n/** The state after one validated message. */\nexport function applyMessage(state: GenUiState, message: GenUiMessage): GenUiState {\n if (\"createSurface\" in message) {\n const { surfaceId } = message.createSurface;\n if (state.surfaces.has(surfaceId)) return withError(state, `surface \"${surfaceId}\" already exists`);\n const surfaces = new Map(state.surfaces);\n surfaces.set(surfaceId, { id: surfaceId, components: new Map(), data: Object.create(null) });\n return { ...state, surfaces, order: [...state.order, surfaceId] };\n }\n if (\"deleteSurface\" in message) {\n const surfaces = new Map(state.surfaces);\n surfaces.delete(message.deleteSurface.surfaceId);\n return { ...state, surfaces, order: state.order.filter((id) => id !== message.deleteSurface.surfaceId) };\n }\n const surfaceId = \"updateComponents\" in message ? message.updateComponents.surfaceId : message.updateDataModel.surfaceId;\n const surface = state.surfaces.get(surfaceId);\n if (!surface) return withError(state, `surface \"${surfaceId}\" was not created`);\n const surfaces = new Map(state.surfaces);\n if (\"updateComponents\" in message) {\n const components = new Map(surface.components);\n for (const component of message.updateComponents.components) components.set(component.id, component);\n if (components.size > GENUI_LIMITS.components) return withError(state, `surface \"${surfaceId}\" holds more than ${GENUI_LIMITS.components} components`);\n surfaces.set(surfaceId, { ...surface, components });\n } else {\n const { path, value } = message.updateDataModel;\n const parsed = parsePath(path);\n if (!parsed.ok) return withError(state, parsed.error);\n surfaces.set(surfaceId, { ...surface, data: setAt(surface.data, parsed.value, value, !(\"value\" in message.updateDataModel)) });\n }\n return { ...state, surfaces };\n}\n\n/** The first complete JSON object of a line when only stray `}` / `]` follow it, else null. Strings are skipped. */\nexport function leadingObject(text: string): string | null {\n if (!text.startsWith(\"{\")) return null;\n let depth = 0;\n let inString = false;\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (inString) {\n if (c === \"\\\\\") i++;\n else if (c === '\"') inString = false;\n continue;\n }\n if (c === '\"') inString = true;\n else if (c === \"{\" || c === \"[\") depth++;\n else if (c === \"}\" || c === \"]\") {\n depth--;\n if (depth === 0) return /^[\\s}\\]]*$/.test(text.slice(i + 1)) ? text.slice(0, i + 1) : null;\n }\n }\n return null;\n}\n\n/** The state after a line of JSON (one message), the line refused with its reason when it is not valid. */\nexport function applyLine(state: GenUiState, line: string, catalog: Readonly<Record<string, { readonly check: GenUiPropsCheck }>>): GenUiState {\n const text = line.trim();\n if (!text) return state;\n let json: unknown;\n try {\n json = JSON.parse(text);\n } catch {\n // Models sometimes close one brace too many: the first complete object is kept when what follows it is only\n // stray closing brackets. Anything else is not JSON and is refused. (The object is still validated as any other.)\n const head = leadingObject(text);\n if (head === null) return withError(state, \"a line is not JSON\");\n try {\n json = JSON.parse(head);\n } catch {\n return withError(state, \"a line is not JSON\");\n }\n }\n const result = validateMessage(json, catalog);\n return result.ok ? applyMessage(state, result.value) : withError(state, result.error);\n}\n\n/** Where a fenced `a2ui` block sits in a text: its JSON Lines so far, whether it is closed, and the prose around it. */\nexport type GenUiExtract = { readonly lines: readonly string[]; readonly closed: boolean; readonly prose: string; readonly found: boolean };\n\nconst FENCE = /```a2ui[^\\n]*\\n/;\n\n/**\n * Splits a model's answer — complete or still arriving — into its prose and the complete lines of its `a2ui` fence.\n * A line still being written (no newline yet, the fence open) is left for the next call: the surface grows message by\n * message as the answer streams.\n */\nexport function extractGenUi(text: string): GenUiExtract {\n const open = FENCE.exec(text);\n if (!open) return { lines: [], closed: false, prose: text, found: false };\n const start = open.index + open[0].length;\n const end = text.indexOf(\"\\n```\", start - 1);\n const closed = end >= 0;\n const body = closed ? text.slice(start, end) : text.slice(start);\n const parts = body.split(\"\\n\");\n const lines = closed ? parts : parts.slice(0, -1);\n const after = closed ? text.slice(end + 4).replace(/^[^\\n]*\\n?/, \"\") : \"\";\n const prose = [text.slice(0, open.index).trim(), after.trim()].filter(Boolean).join(\"\\n\\n\");\n return { lines: lines.filter((l) => l.trim()), closed, prose, found: true };\n}\n\n/** The state of every surface a model's answer describes so far. */\nexport function readStream(text: string, catalog: Readonly<Record<string, { readonly check: GenUiPropsCheck }>>): GenUiState & { readonly prose: string; readonly found: boolean } {\n const { lines, prose, found } = extractGenUi(text);\n const state = lines.reduce((s, line) => applyLine(s, line, catalog), emptyGenUiState);\n return { ...state, prose, found };\n}\n","// Renders a surface from its root: each component through its catalog entry, children by id, bound values from the data\n// model. A tree only — a component met twice (a cycle, two parents) or beyond the depth is not drawn — and a child still\n// to come (the answer is streaming) is a skeleton. Text is text: React escapes it, nothing is ever parsed as HTML.\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Skeleton } from \"../skeleton\";\nimport { GENUI_LIMITS, type GenUiComponent, type GenUiPropsCheck, isBinding } from \"./spec\";\nimport { type GenUiState, type GenUiSurfaceState, readPath, readStream } from \"./store\";\n\n/** What an entry gets to draw a component. */\nexport type GenUiRenderContext = {\n /** A child by id: drawn, a skeleton while it has not arrived, nothing when refused. */\n child: (id: unknown) => React.ReactNode;\n /** Children by id, in order. */\n children: (ids: unknown) => React.ReactNode[];\n /** A literal, or the value a binding `{ path }` points at in the data model. */\n resolve: (value: unknown) => unknown;\n /** The words of the surface. */\n labels: GenUiLabels;\n /** The locale numbers and dates are written in. */\n locale: string;\n};\n\n/** One component of a catalog: how its properties are checked, how it is drawn. */\nexport type GenUiEntry = {\n /** `null` when the component's own properties are fine, else why not (the message is refused). */\n readonly check: GenUiPropsCheck;\n /** Draws the component. */\n readonly render: (component: GenUiComponent, context: GenUiRenderContext) => React.ReactNode;\n};\n\n/** The components a model may use, by name: `baseGenUiCatalog`, merged with `chartsGenUiCatalog` of @krizaka/charts. */\nexport type GenUiCatalog = Readonly<Record<string, GenUiEntry>>;\n\n/** The surface's own words (passed translated). */\nexport type GenUiLabels = {\n /** Announced while the surface is still arriving. */\n loading: string;\n /** The accessible name of the surface. */\n surface: string;\n /** Under a table whose data has not arrived or is not a list. */\n noData: string;\n};\n\nexport const genUiLabels: GenUiLabels = { loading: \"Building the view…\", surface: \"Generated view\", noData: \"No data\" };\n\nexport type GenUiSurfaceProps = {\n /** The surface to draw (from `readStream` or `applyMessage`). */\n surface: GenUiSurfaceState;\n /** The components it may use. */\n catalog: GenUiCatalog;\n /** The answer is still arriving: missing children are skeletons and the surface is busy. */\n streaming?: boolean;\n /** The surface's words. */\n labels?: Partial<GenUiLabels>;\n /** The locale numbers are written in. Default `en`. */\n locale?: string;\n /** Called with what could not be drawn (a cycle, a missing child once the answer is complete). */\n onError?: (error: string) => void;\n /** Extra classes on the frame. */\n className?: string;\n};\n\n/** One surface, drawn from its root. */\nexport function GenUiSurface({ surface, catalog, streaming = false, labels, locale = \"en\", onError, className }: GenUiSurfaceProps) {\n const words = { ...genUiLabels, ...labels };\n const problems: string[] = [];\n const seen = new Set<string>();\n\n const draw = (id: unknown, depth: number): React.ReactNode => {\n if (typeof id !== \"string\") return null;\n if (depth > GENUI_LIMITS.depth) {\n problems.push(`\"${id}\" is deeper than ${GENUI_LIMITS.depth}`);\n return null;\n }\n if (seen.has(id)) {\n problems.push(`\"${id}\" is drawn twice (a cycle or two parents)`);\n return null;\n }\n const component = surface.components.get(id);\n if (!component) {\n if (!streaming) problems.push(`\"${id}\" never arrived`);\n return streaming ? <Skeleton key={id} className=\"h-10 w-full rounded-lg\" /> : null;\n }\n const entry = Object.hasOwn(catalog, component.component) ? catalog[component.component] : undefined;\n if (!entry) return null;\n seen.add(id);\n const context: GenUiRenderContext = {\n child: (c) => draw(c, depth + 1),\n children: (ids) => (Array.isArray(ids) ? ids.map((c) => <React.Fragment key={String(c)}>{draw(c, depth + 1)}</React.Fragment>) : []),\n resolve: (value) => (isBinding(value) ? readPath(surface.data, value.path) : value),\n labels: words,\n locale,\n };\n return <React.Fragment key={id}>{entry.render(component, context)}</React.Fragment>;\n };\n\n const root = draw(\"root\", 0);\n React.useEffect(() => {\n if (onError) for (const problem of problems) onError(problem);\n // Reported once per drawn state.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [surface, streaming]);\n\n return (\n <section aria-label={words.surface} aria-busy={streaming || undefined} data-genui-surface={surface.id} className={cn(\"flex flex-col gap-4\", className)}>\n {root ?? (streaming ? <Skeleton className=\"h-24 w-full rounded-xl\" /> : null)}\n </section>\n );\n}\n\nexport type GenUiStreamProps = Omit<GenUiSurfaceProps, \"surface\"> & {\n /** A model's answer, complete or still arriving: its prose and its `a2ui` fence. */\n text: string;\n /** Draws the prose (markdown in a chat); default: paragraphs of text. */\n renderProse?: (prose: string) => React.ReactNode;\n /** What to show when the answer holds no valid surface: the answer itself, as text (the fallback). */\n fallback?: (text: string) => React.ReactNode;\n};\n\n/**\n * A model's answer with its generated view: the prose, then every surface of its `a2ui` fence, growing as the answer\n * streams. An answer without a valid surface falls back to its text.\n */\nexport function GenUiStream({ text, catalog, streaming, renderProse, fallback, onError, ...rest }: GenUiStreamProps) {\n const state = React.useMemo(() => readStream(text, catalog), [text, catalog]);\n const reported = React.useRef(0);\n React.useEffect(() => {\n if (!onError) return;\n for (const error of state.errors.slice(reported.current)) onError(error);\n reported.current = state.errors.length;\n }, [state, onError]);\n const prose = (value: string) => (renderProse ? renderProse(value) : value.split(/\\n{2,}/).map((p, i) => <p key={i}>{p}</p>));\n const surfaces = state.order.map((id) => state.surfaces.get(id)).filter((s): s is GenUiSurfaceState => !!s && s.components.has(\"root\"));\n if (!state.found || (!streaming && surfaces.length === 0)) return <>{fallback ? fallback(text) : prose(text)}</>;\n return (\n <div className=\"flex flex-col gap-4\" data-genui-stream=\"\">\n {state.prose && prose(state.prose)}\n {surfaces.map((surface) => (\n <GenUiSurface key={surface.id} surface={surface} catalog={catalog} streaming={streaming} onError={onError} {...rest} />\n ))}\n {streaming && surfaces.length === 0 && <Skeleton className=\"h-24 w-full rounded-xl\" />}\n </div>\n );\n}\n\n/** The state a list of messages builds — for a surface the app holds itself (not from a model's text). */\nexport type { GenUiState };\n"],"mappings":"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","names":["jsx","jsxs","surfaceId","surfaces","text","Fragment","jsx","jsxs","text"]}
package/dist/glow-card.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  cn
4
- } from "./chunk-2FRWNSRO.js";
4
+ } from "./chunk-NSLXEDIS.js";
5
5
 
6
6
  // src/glow-card/glow-card.tsx
7
7
  import { Slot } from "radix-ui";
@@ -2,7 +2,7 @@ import {
2
2
  brandClass,
3
3
  cn,
4
4
  storyVariantClass
5
- } from "./chunk-IZ7MV6HM.js";
5
+ } from "./chunk-XVFQZ3ZG.js";
6
6
 
7
7
  // src/goal-gauge/goal-gauge.tsx
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-ZNMFG62E.js";
3
+ } from "./chunk-KH3JOEPY.js";
4
4
 
5
5
  // src/how-it-works-page/how-it-works-page.tsx
6
6
  import { CtaPanel } from "@krizaka/ui/cta-panel";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  Slider
4
- } from "./chunk-BTMFZ66D.js";
5
- import "./chunk-C2BRIFJG.js";
6
- import "./chunk-2FRWNSRO.js";
4
+ } from "./chunk-KM6VAKIE.js";
5
+ import "./chunk-HJFRHYCI.js";
6
+ import "./chunk-NSLXEDIS.js";
7
7
  import {
8
8
  clamp
9
9
  } from "./chunk-FZBWEDQI.js";
package/dist/index.d.ts CHANGED
@@ -15,18 +15,17 @@ interface MarkProps {
15
15
  }
16
16
 
17
17
  /**
18
- * The Akinaza mark, "the open shop": a filled awning with the Krizaka cut at its corner, scalloped, its stripes in
19
- * light; under it the shop front, two windows and the open door — a warm light that breathes. In the Akinaza gradient
20
- * (forest → copper, the brand's mark gradient of @krizaka/tokens, the same in dark and light); one node, a coin, rides
21
- * the dashed orbit. The family's grammar (orbit, ring, bold emblem, bright core). Below 48 px it crops to the emblem.
18
+ * The Akinaza mark, "the cut log": a log seen end-on in forest green, its year rings in light, cut at 45° by the beaver
19
+ * (the Krizaka chamfer) with the fresh face in copper, and a copper heart that breathes — a shop built ring by ring.
20
+ * One node, a coin, rides the dashed orbit. Below 48 px it crops to the emblem.
22
21
  */
23
22
  declare function AkinazaLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
24
23
 
25
24
  /**
26
- * The Kachizaka mark, "the sealed cup": a filled trophy whose rim wears the Krizaka cut, two handles, a stem and a
27
- * base, in the Kachizaka gradient (cobalt → gold, the brand's mark gradient of @krizaka/tokens, the same in dark and
28
- * light); on the bowl a star in light — the seal of the rules, locked at kick-off — breathes; one node, the ball, rides
29
- * the dashed orbit. The family's grammar (orbit, ring, bold emblem, bright core). Below 48 px it crops to the emblem.
25
+ * The Kachizaka mark, "the podium": three steps cut at their outer corners, the winner in gold and the others in cobalt
26
+ * (the brand's two colours, kept apart), under a gold diamond — the family's lit node — that breathes: a friendly
27
+ * leaderboard where only points change hands. One node, the ball, rides the dashed orbit. Below 48 px it crops to the
28
+ * emblem.
30
29
  */
31
30
  declare function KachizakaLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
32
31
 
@@ -57,32 +56,26 @@ declare function ProductLogo({ id, ...props }: MarkProps & {
57
56
  }): React.JSX.Element;
58
57
 
59
58
  /**
60
- * The Yasakia mark: two voices — two solid speech bubbles that overlap, the left a shade deeper — in the Yasakia
61
- * gradient (emerald → turquoise, the brand's mark gradient of @krizaka/tokens, the same in dark and light). Where they
62
- * overlap, what the two share, is the bright core: a lens lit from above that breathes. The pair, two nodes on the
63
- * dashed orbit, turns slowly around it — the family's grammar (orbit, ring, bold emblem, bright core). Below 48 px it
64
- * crops to the emblem.
59
+ * The Yasakia mark, "one conversation": one speech bubble with a tail on each side (turned 180°, never mirrored, so it
60
+ * can never read as a face) in the Yasakia gradient (emerald → turquoise, the same in dark and light), and the spark
61
+ * inside it — the family's lit node — that breathes: talk first, both ways. One node rides the dashed orbit. Below 48 px
62
+ * it crops to the emblem.
65
63
  */
66
64
  declare function YasakiaLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
67
65
  /** @deprecated Yazakia was renamed Yasakia (2026-10): use `YasakiaLogo`. Kept for one minor version. */
68
66
  declare const YazakiaLogo: typeof YasakiaLogo;
69
67
 
70
68
  /**
71
- * The Yomizaka mark, "the reading": a filled page with the Krizaka cut at its corner, three lines of text in light, and
72
- * a lens — the eye that reads — resting on its lower half, its handle running out of the page. Page and lens in the
73
- * Yomizaka gradient (ink → indigo, the brand's mark gradient of @krizaka/tokens, the same in dark and light); the
74
- * lens' core is a pale indigo light that breathes; a line of light scans the page from top to bottom; one node, a
75
- * page, rides the dashed orbit. The family's grammar (orbit, ring, bold emblem, bright core). Below 48 px it crops to
76
- * the emblem.
69
+ * The Yomizaka mark, "the watch": the owl — two lenses at the family stroke under one calm brow, its pupils glancing
70
+ * down the line it reads — in the Yomizaka gradient (ink → indigo, the same in dark and light). The pupils are the lit
71
+ * cores and breathe; one node, a page, rides the dashed orbit. Below 48 px it crops to the emblem.
77
72
  */
78
73
  declare function YomizakaLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
79
74
 
80
75
  /**
81
- * The Yororis mark, "the hold": a "Y" whose arms are two filled leaves — open hands — rising from one stem and cupping
82
- * a warm core that breathes: held, given room, listened to. Leaves in the Yororis gradient (sand → sage, the brand's
83
- * mark gradient of @krizaka/tokens, the same in dark and light), a vein of light along each, the core in a warm sand
84
- * light; the moment, one node on the dashed orbit, comes round slowly. The family's grammar (orbit, ring, bold emblem,
85
- * bright core) with the slowest breath of the family. Below 48 px it crops to the emblem.
76
+ * The Yororis mark, "held": two open hands, two sage arcs of one circle, cup a warm sand core without closing on it —
77
+ * held, given room, free to go. The core breathes, the slowest breath of the family; one node, the moment, rides the
78
+ * dashed orbit. Below 48 px it crops to the emblem.
86
79
  */
87
80
  declare function YororisLogo({ size, animated, title, className }: MarkProps): React.JSX.Element;
88
81
 
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
1
  "use client";
2
+ import {
3
+ cx
4
+ } from "./chunk-6ISW63JI.js";
2
5
  import {
3
6
  MotionObserver,
4
7
  RotatingWord
@@ -14,10 +17,7 @@ import {
14
17
  YazakiaLogo,
15
18
  YomizakaLogo,
16
19
  YororisLogo
17
- } from "./chunk-LIPK4UCS.js";
18
- import {
19
- cx
20
- } from "./chunk-6ISW63JI.js";
20
+ } from "./chunk-YCIBJ6OQ.js";
21
21
  export {
22
22
  AkinazaLogo,
23
23
  KachizakaLogo,
package/dist/landscape.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  cn
4
- } from "./chunk-G3ETON2A.js";
4
+ } from "./chunk-WU4VLSEA.js";
5
5
 
6
6
  // src/landscape/landscape.tsx
7
7
  import { useId } from "react";
@@ -34,8 +34,15 @@ type LinkCardProps = Omit<React.ComponentProps<"a">, "title" | "href"> & {
34
34
  footerAlign?: "bottom" | "top";
35
35
  /** The app's link component for internal addresses (Next's `Link`); an `<a>` otherwise. */
36
36
  linkAs?: LinkComponent;
37
+ /**
38
+ * The hover of the card: `light` (the pointer's light, a coloured lift — the default) or `quiet` (no glow, a 2 px lift,
39
+ * one step of surface and border, the focus as a ring). Unset, a card follows its grid (`CardGrid hover`).
40
+ */
41
+ hover?: CardHover;
37
42
  };
43
+ /** The hover of a card (blocks.css): the pointer's light (`light`) or the quiet hover (`quiet`). */
44
+ type CardHover = "light" | "quiet";
38
45
  /** An entry point: the whole card is one link — icon, title, sentence, the way in. Lifts and lights under the pointer. */
39
- declare function LinkCard({ href, title, description, icon, meta, cta, extra, titleAs: Title, layout, footerAlign, linkAs, className, ...props }: LinkCardProps): React.JSX.Element;
46
+ declare function LinkCard({ href, title, description, icon, meta, cta, extra, titleAs: Title, layout, footerAlign, linkAs, hover, className, ...props }: LinkCardProps): React.JSX.Element;
40
47
 
41
- export { LinkCard, type LinkCardProps, LinkComponent };
48
+ export { type CardHover, LinkCard, type LinkCardProps, LinkComponent };
package/dist/link-card.js CHANGED
@@ -1,48 +1,9 @@
1
1
  import {
2
- BlockLink,
3
- isExternal
4
- } from "./chunk-2AGSO3WH.js";
5
- import {
6
- ArrowGlyph,
7
- ExternalGlyph
8
- } from "./chunk-XCBVFMNV.js";
9
- import {
10
- cn
11
- } from "./chunk-4LOMIQVX.js";
12
-
13
- // src/link-card/link-card.tsx
14
- import { jsx, jsxs } from "react/jsx-runtime";
15
- function LinkCard({ href, title, description, icon, meta, cta, extra, titleAs: Title = "h3", layout = "row", footerAlign = "bottom", linkAs, className, ...props }) {
16
- const external = isExternal(href);
17
- return /* @__PURE__ */ jsxs(
18
- BlockLink,
19
- {
20
- href,
21
- linkAs,
22
- external,
23
- className: cn("kz-block-card kz-link-card", className),
24
- "data-kz-light": "",
25
- "data-layout": layout === "row" ? void 0 : layout,
26
- "data-footer": footerAlign === "top" ? "top" : void 0,
27
- ...props,
28
- children: [
29
- icon && /* @__PURE__ */ jsx("span", { className: "kz-block-icon", "aria-hidden": true, children: icon }),
30
- /* @__PURE__ */ jsxs("div", { className: "kz-link-card-body", children: [
31
- meta && /* @__PURE__ */ jsx("p", { className: "kz-link-card-meta", children: meta }),
32
- /* @__PURE__ */ jsx(Title, { className: "kz-link-card-title", children: title }),
33
- description && /* @__PURE__ */ jsx("p", { className: "kz-link-card-text", children: description }),
34
- (extra || cta || external) && /* @__PURE__ */ jsxs("div", { className: "kz-link-card-foot", children: [
35
- extra && /* @__PURE__ */ jsx("div", { className: "kz-link-card-extra", children: extra }),
36
- (cta || external) && /* @__PURE__ */ jsxs("span", { className: "kz-link-card-cta", children: [
37
- cta,
38
- external ? /* @__PURE__ */ jsx(ExternalGlyph, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(ArrowGlyph, { className: "h-3.5 w-3.5" })
39
- ] })
40
- ] })
41
- ] })
42
- ]
43
- }
44
- );
45
- }
2
+ LinkCard
3
+ } from "./chunk-APNIVNIX.js";
4
+ import "./chunk-2AGSO3WH.js";
5
+ import "./chunk-XCBVFMNV.js";
6
+ import "./chunk-W675RFOA.js";
46
7
  export {
47
8
  LinkCard
48
9
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/link-card/link-card.tsx"],"sourcesContent":["// Server-safe. A card that leads somewhere (blocks.css): the whole card is the link — an icon, a title, one sentence,\n// the way in. Compact, one look for every entry point of a page (a documentation hub, the products, the next step).\nimport type * as React from \"react\";\n\nimport { BlockLink, isExternal, type LinkComponent } from \"../block-link\";\nimport { cn } from \"../cn\";\nimport { ArrowGlyph, ExternalGlyph } from \"../glyphs\";\n\nexport type LinkCardProps = Omit<React.ComponentProps<\"a\">, \"title\" | \"href\"> & {\n /** Where the card leads. An absolute URL opens in a new tab, with the external mark. */\n href: string;\n /** The title: the name of the destination. */\n title: React.ReactNode;\n /** One sentence: what the reader finds there. */\n description?: React.ReactNode;\n /** The icon tile on the left (a product mark, a signature icon): decorative, the title names the link. */\n icon?: React.ReactNode;\n /** A short mono line above the title (a category, a version). */\n meta?: React.ReactNode;\n /** The way in, under the text, with an arrow: `Open`, `Read the guide`. */\n cta?: React.ReactNode;\n /** Under the text, before the way in: facts (`Facts`), badges. Never another link — the card is one. */\n extra?: React.ReactNode;\n /**\n * The title's element: a heading when the cards are the content of a section (a hub), `span` inside a list of links.\n * @default \"h3\"\n */\n titleAs?: \"h2\" | \"h3\" | \"h4\" | \"span\";\n /**\n * `row`: the icon beside the text (compact, the default); `stack`: the icon above it.\n * @default \"row\"\n */\n layout?: \"row\" | \"stack\";\n /**\n * Where the facts (`extra`) and the way in (`cta`) sit when the card is taller than its text — a row of cards at one\n * height: `bottom` pins them to the card's foot, so they share a line across the row; `top` leaves them under the text.\n * @default \"bottom\"\n */\n footerAlign?: \"bottom\" | \"top\";\n /** The app's link component for internal addresses (Next's `Link`); an `<a>` otherwise. */\n linkAs?: LinkComponent;\n};\n\n/** An entry point: the whole card is one link — icon, title, sentence, the way in. Lifts and lights under the pointer. */\nexport function LinkCard({ href, title, description, icon, meta, cta, extra, titleAs: Title = \"h3\", layout = \"row\", footerAlign = \"bottom\", linkAs, className, ...props }: LinkCardProps) {\n const external = isExternal(href);\n return (\n <BlockLink\n href={href}\n linkAs={linkAs}\n external={external}\n className={cn(\"kz-block-card kz-link-card\", className)}\n data-kz-light=\"\"\n data-layout={layout === \"row\" ? undefined : layout}\n data-footer={footerAlign === \"top\" ? \"top\" : undefined}\n {...props}\n >\n {icon && (\n <span className=\"kz-block-icon\" aria-hidden>\n {icon}\n </span>\n )}\n <div className=\"kz-link-card-body\">\n {meta && <p className=\"kz-link-card-meta\">{meta}</p>}\n <Title className=\"kz-link-card-title\">{title}</Title>\n {description && <p className=\"kz-link-card-text\">{description}</p>}\n {(extra || cta || external) && (\n <div className=\"kz-link-card-foot\">\n {extra && <div className=\"kz-link-card-extra\">{extra}</div>}\n {(cta || external) && (\n <span className=\"kz-link-card-cta\">\n {cta}\n {external ? <ExternalGlyph className=\"h-3.5 w-3.5\" /> : <ArrowGlyph className=\"h-3.5 w-3.5\" />}\n </span>\n )}\n </div>\n )}\n </div>\n </BlockLink>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA0DQ,cAYM,YAZN;AAdD,SAAS,SAAS,EAAE,MAAM,OAAO,aAAa,MAAM,MAAM,KAAK,OAAO,SAAS,QAAQ,MAAM,SAAS,OAAO,cAAc,UAAU,QAAQ,WAAW,GAAG,MAAM,GAAkB;AACxL,QAAM,WAAW,WAAW,IAAI;AAChC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,MACrD,iBAAc;AAAA,MACd,eAAa,WAAW,QAAQ,SAAY;AAAA,MAC5C,eAAa,gBAAgB,QAAQ,QAAQ;AAAA,MAC5C,GAAG;AAAA,MAEH;AAAA,gBACC,oBAAC,UAAK,WAAU,iBAAgB,eAAW,MACxC,gBACH;AAAA,QAEF,qBAAC,SAAI,WAAU,qBACZ;AAAA,kBAAQ,oBAAC,OAAE,WAAU,qBAAqB,gBAAK;AAAA,UAChD,oBAAC,SAAM,WAAU,sBAAsB,iBAAM;AAAA,UAC5C,eAAe,oBAAC,OAAE,WAAU,qBAAqB,uBAAY;AAAA,WAC5D,SAAS,OAAO,aAChB,qBAAC,SAAI,WAAU,qBACZ;AAAA,qBAAS,oBAAC,SAAI,WAAU,sBAAsB,iBAAM;AAAA,aACnD,OAAO,aACP,qBAAC,UAAK,WAAU,oBACb;AAAA;AAAA,cACA,WAAW,oBAAC,iBAAc,WAAU,eAAc,IAAK,oBAAC,cAAW,WAAU,eAAc;AAAA,eAC9F;AAAA,aAEJ;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-ZNMFG62E.js";
3
+ } from "./chunk-KH3JOEPY.js";
4
4
 
5
5
  // src/longform-page/longform-page.tsx
6
6
  import { Page } from "@krizaka/ui/page";
@@ -1,9 +1,10 @@
1
1
  import "./chunk-TDG7ED2W.js";
2
2
  import {
3
3
  Button
4
- } from "./chunk-3IN6TOPM.js";
4
+ } from "./chunk-6ZYRUOTA.js";
5
5
  import "./chunk-43PTCDTL.js";
6
6
  import "./chunk-2VNYHG4E.js";
7
+ import "./chunk-W675RFOA.js";
7
8
 
8
9
  // src/maintenance-screen/maintenance-screen.tsx
9
10
  import { tv } from "tailwind-variants";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/maintenance-screen/maintenance-screen.tsx"],"sourcesContent":["// Server-safe. The service is down on purpose (maintenance on, from the backend's parameters): say so, say when to\n// come back, and let the person check again. Replaces the app, like the forced update.\nimport { Button } from \"@krizaka/ui/button\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const maintenanceScreen = tv({\n slots: {\n root: \"mx-auto flex min-h-dvh w-full max-w-md flex-col items-center justify-center gap-4 px-6 py-12 text-center text-fg\",\n mark: \"flex h-24 w-24 items-center justify-center [&>svg]:h-24 [&>svg]:w-24\",\n title: \"text-2xl font-semibold text-fg\",\n message: \"text-fg-secondary\",\n actions: \"mt-2 flex w-full flex-col gap-2\",\n },\n});\n\nexport type MaintenanceScreenProps = Omit<React.ComponentProps<\"main\">, \"title\"> & {\n /** The headline (“Back in a few minutes”). */\n title: React.ReactNode;\n /** What is happening — the backend's localized maintenance `message`. */\n message?: React.ReactNode;\n /** The product's mark or mascot (decorative). */\n mark?: React.ReactNode;\n /** The button that checks again (“Try again”). */\n retryLabel?: string;\n /** Checks the backend again. */\n onRetry?: () => void;\n};\n\n/** The maintenance screen: announced politely, with one way to check again. */\nexport function MaintenanceScreen({ title, message, mark, retryLabel, onRetry, className, ...props }: MaintenanceScreenProps) {\n const s = maintenanceScreen();\n return (\n <main data-kind=\"maintenance\" className={s.root({ className })} {...props}>\n {mark && (\n <div aria-hidden className={s.mark()}>\n {mark}\n </div>\n )}\n <div role=\"status\" className=\"flex flex-col items-center gap-4\">\n <h1 className={s.title()}>{title}</h1>\n {message && <p className={s.message()}>{message}</p>}\n </div>\n {retryLabel && onRetry && (\n <div className={s.actions()}>\n <Button variant=\"secondary\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )}\n </main>\n );\n}\n"],"mappings":";;;;;;;;AAIA,SAAS,UAAU;AA+BX,cAIF,YAJE;AA7BD,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF,CAAC;AAgBM,SAAS,kBAAkB,EAAE,OAAO,SAAS,MAAM,YAAY,SAAS,WAAW,GAAG,MAAM,GAA2B;AAC5H,QAAM,IAAI,kBAAkB;AAC5B,SACE,qBAAC,UAAK,aAAU,eAAc,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OACjE;AAAA,YACC,oBAAC,SAAI,eAAW,MAAC,WAAW,EAAE,KAAK,GAChC,gBACH;AAAA,IAEF,qBAAC,SAAI,MAAK,UAAS,WAAU,oCAC3B;AAAA,0BAAC,QAAG,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,MAChC,WAAW,oBAAC,OAAE,WAAW,EAAE,QAAQ,GAAI,mBAAQ;AAAA,OAClD;AAAA,IACC,cAAc,WACb,oBAAC,SAAI,WAAW,EAAE,QAAQ,GACxB,8BAAC,UAAO,SAAQ,aAAY,SAAS,SAClC,sBACH,GACF;AAAA,KAEJ;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/maintenance-screen/maintenance-screen.tsx"],"sourcesContent":["// Server-safe. The service is down on purpose (maintenance on, from the backend's parameters): say so, say when to\n// come back, and let the person check again. Replaces the app, like the forced update.\nimport { Button } from \"@krizaka/ui/button\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const maintenanceScreen = tv({\n slots: {\n root: \"mx-auto flex min-h-dvh w-full max-w-md flex-col items-center justify-center gap-4 px-6 py-12 text-center text-fg\",\n mark: \"flex h-24 w-24 items-center justify-center [&>svg]:h-24 [&>svg]:w-24\",\n title: \"text-2xl font-semibold text-fg\",\n message: \"text-fg-secondary\",\n actions: \"mt-2 flex w-full flex-col gap-2\",\n },\n});\n\nexport type MaintenanceScreenProps = Omit<React.ComponentProps<\"main\">, \"title\"> & {\n /** The headline (“Back in a few minutes”). */\n title: React.ReactNode;\n /** What is happening — the backend's localized maintenance `message`. */\n message?: React.ReactNode;\n /** The product's mark or mascot (decorative). */\n mark?: React.ReactNode;\n /** The button that checks again (“Try again”). */\n retryLabel?: string;\n /** Checks the backend again. */\n onRetry?: () => void;\n};\n\n/** The maintenance screen: announced politely, with one way to check again. */\nexport function MaintenanceScreen({ title, message, mark, retryLabel, onRetry, className, ...props }: MaintenanceScreenProps) {\n const s = maintenanceScreen();\n return (\n <main data-kind=\"maintenance\" className={s.root({ className })} {...props}>\n {mark && (\n <div aria-hidden className={s.mark()}>\n {mark}\n </div>\n )}\n <div role=\"status\" className=\"flex flex-col items-center gap-4\">\n <h1 className={s.title()}>{title}</h1>\n {message && <p className={s.message()}>{message}</p>}\n </div>\n {retryLabel && onRetry && (\n <div className={s.actions()}>\n <Button variant=\"secondary\" onClick={onRetry}>\n {retryLabel}\n </Button>\n </div>\n )}\n </main>\n );\n}\n"],"mappings":";;;;;;;;;AAIA,SAAS,UAAU;AA+BX,cAIF,YAJE;AA7BD,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF,CAAC;AAgBM,SAAS,kBAAkB,EAAE,OAAO,SAAS,MAAM,YAAY,SAAS,WAAW,GAAG,MAAM,GAA2B;AAC5H,QAAM,IAAI,kBAAkB;AAC5B,SACE,qBAAC,UAAK,aAAU,eAAc,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OACjE;AAAA,YACC,oBAAC,SAAI,eAAW,MAAC,WAAW,EAAE,KAAK,GAChC,gBACH;AAAA,IAEF,qBAAC,SAAI,MAAK,UAAS,WAAU,oCAC3B;AAAA,0BAAC,QAAG,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,MAChC,WAAW,oBAAC,OAAE,WAAW,EAAE,QAAQ,GAAI,mBAAQ;AAAA,OAClD;AAAA,IACC,cAAc,WACb,oBAAC,SAAI,WAAW,EAAE,QAAQ,GACxB,8BAAC,UAAO,SAAQ,aAAY,SAAS,SAClC,sBACH,GACF;AAAA,KAEJ;AAEJ;","names":[]}
package/dist/map.js CHANGED
@@ -103,7 +103,7 @@ var themes = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Object.freeze
103
103
  "borderStrong": "rgba(255,255,255,0.16)",
104
104
  "textPrimary": "#f5f5f5",
105
105
  "textSecondary": "#a0a0a7",
106
- "textMuted": "#73737d",
106
+ "textMuted": "#92929b",
107
107
  "textOnMedia": "#ffffff",
108
108
  "accent": "#196df5",
109
109
  "accentHover": "#0e5bd8",
@@ -146,8 +146,8 @@ var themes = /* @__PURE__ */ Object.freeze({ dark: /* @__PURE__ */ Object.freeze
146
146
  "borderDefault": "rgba(0,0,0,0.1)",
147
147
  "borderStrong": "rgba(0,0,0,0.16)",
148
148
  "textPrimary": "#18181b",
149
- "textSecondary": "#64646d",
150
- "textMuted": "#808089",
149
+ "textSecondary": "#56565d",
150
+ "textMuted": "#64646d",
151
151
  "textOnMedia": "#ffffff",
152
152
  "accent": "#0a64f5",
153
153
  "accentHover": "#0d55c9",