@krizaka/ui 2.2.0 → 2.4.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 (498) hide show
  1. package/README.md +33 -8
  2. package/dist/audio-player.d.ts +113 -0
  3. package/dist/audio-player.js +207 -0
  4. package/dist/audio-player.js.map +1 -0
  5. package/dist/{button-Cgfkg_3y.d.ts → button-BMAO7dKF.d.ts} +29 -2
  6. package/dist/button.d.ts +32 -5
  7. package/dist/button.js +62 -9
  8. package/dist/button.js.map +1 -1
  9. package/dist/chip-link.d.ts +53 -0
  10. package/dist/chip-link.js +32 -0
  11. package/dist/chip-link.js.map +1 -0
  12. package/dist/chunk-2USC2YT6.js +17 -0
  13. package/dist/chunk-2USC2YT6.js.map +1 -0
  14. package/dist/chunk-43PTCDTL.js +31 -0
  15. package/dist/chunk-43PTCDTL.js.map +1 -0
  16. package/dist/chunk-6ISW63JI.js +11 -0
  17. package/dist/chunk-6ISW63JI.js.map +1 -0
  18. package/dist/chunk-EUPTXKH7.js +95 -0
  19. package/dist/chunk-EUPTXKH7.js.map +1 -0
  20. package/dist/chunk-HAQWKORZ.js +117 -0
  21. package/dist/chunk-HAQWKORZ.js.map +1 -0
  22. package/dist/{chunk-FHYZSO2S.js → chunk-R6SDS7JM.js} +5 -3
  23. package/dist/chunk-R6SDS7JM.js.map +1 -0
  24. package/dist/chunk-RUPNPMP3.js +103 -0
  25. package/dist/chunk-RUPNPMP3.js.map +1 -0
  26. package/dist/chunk-RUPRYJ45.js +82 -0
  27. package/dist/chunk-RUPRYJ45.js.map +1 -0
  28. package/dist/chunk-VDR2EP6K.js +49 -0
  29. package/dist/chunk-VDR2EP6K.js.map +1 -0
  30. package/dist/chunk-WEVYKZIF.js +33 -0
  31. package/dist/chunk-WEVYKZIF.js.map +1 -0
  32. package/dist/chunk-XUMJA5ZI.js +283 -0
  33. package/dist/chunk-XUMJA5ZI.js.map +1 -0
  34. package/dist/chunk-YH4LMWRU.js +92 -0
  35. package/dist/chunk-YH4LMWRU.js.map +1 -0
  36. package/dist/chunk-YX6CNVJA.js +94 -0
  37. package/dist/chunk-YX6CNVJA.js.map +1 -0
  38. package/dist/chunk-ZIXB33X7.js +95 -0
  39. package/dist/chunk-ZIXB33X7.js.map +1 -0
  40. package/dist/combobox.d.ts +188 -0
  41. package/dist/combobox.js +16 -0
  42. package/dist/combobox.js.map +1 -0
  43. package/dist/command.d.ts +7 -7
  44. package/dist/command.js +3 -2
  45. package/dist/command.js.map +1 -1
  46. package/dist/confirm-button.d.ts +1 -1
  47. package/dist/confirm-button.js +2 -1
  48. package/dist/confirm-button.js.map +1 -1
  49. package/dist/data-table.d.ts +246 -0
  50. package/dist/data-table.js +290 -0
  51. package/dist/data-table.js.map +1 -0
  52. package/dist/date-picker.d.ts +288 -0
  53. package/dist/date-picker.js +364 -0
  54. package/dist/date-picker.js.map +1 -0
  55. package/dist/{dialog-GQ4Nvuyf.d.ts → dialog-D42QwYb_.d.ts} +11 -1
  56. package/dist/dialog.d.ts +1 -1
  57. package/dist/dialog.js +3 -2
  58. package/dist/dialog.js.map +1 -1
  59. package/dist/file-upload.d.ts +238 -0
  60. package/dist/file-upload.js +437 -0
  61. package/dist/file-upload.js.map +1 -0
  62. package/dist/filter-bar.d.ts +139 -0
  63. package/dist/filter-bar.js +155 -0
  64. package/dist/filter-bar.js.map +1 -0
  65. package/dist/glow-card.d.ts +20 -0
  66. package/dist/glow-card.js +30 -0
  67. package/dist/glow-card.js.map +1 -0
  68. package/dist/image-cropper.d.ts +115 -0
  69. package/dist/image-cropper.js +166 -0
  70. package/dist/image-cropper.js.map +1 -0
  71. package/dist/index.d.ts +2 -20
  72. package/dist/index.js +7 -64
  73. package/dist/index.js.map +1 -1
  74. package/dist/iso.d.ts +400 -0
  75. package/dist/iso.js +363 -0
  76. package/dist/iso.js.map +1 -0
  77. package/dist/loader.d.ts +206 -0
  78. package/dist/loader.js +138 -0
  79. package/dist/loader.js.map +1 -0
  80. package/dist/marquee.d.ts +33 -0
  81. package/dist/marquee.js +52 -0
  82. package/dist/marquee.js.map +1 -0
  83. package/dist/media-capture.d.ts +155 -0
  84. package/dist/media-capture.js +242 -0
  85. package/dist/media-capture.js.map +1 -0
  86. package/dist/meter.d.ts +146 -0
  87. package/dist/meter.js +107 -0
  88. package/dist/meter.js.map +1 -0
  89. package/dist/motion.css +394 -3
  90. package/dist/motion.d.ts +46 -0
  91. package/dist/motion.js +10 -0
  92. package/dist/motion.js.map +1 -0
  93. package/dist/native/media-capture.d.ts +49 -0
  94. package/dist/native/media-capture.js +113 -0
  95. package/dist/native/media-capture.js.map +1 -0
  96. package/dist/native/video-player.d.ts +50 -0
  97. package/dist/native/video-player.js +69 -0
  98. package/dist/native/video-player.js.map +1 -0
  99. package/dist/native.d.ts +66 -2
  100. package/dist/native.js +166 -68
  101. package/dist/native.js.map +1 -1
  102. package/dist/nav-bar.d.ts +178 -0
  103. package/dist/nav-bar.js +157 -0
  104. package/dist/nav-bar.js.map +1 -0
  105. package/dist/number-ticker.d.ts +32 -0
  106. package/dist/number-ticker.js +61 -0
  107. package/dist/number-ticker.js.map +1 -0
  108. package/dist/pagination.d.ts +141 -0
  109. package/dist/pagination.js +165 -0
  110. package/dist/pagination.js.map +1 -0
  111. package/dist/progress.d.ts +56 -1
  112. package/dist/progress.js +72 -25
  113. package/dist/progress.js.map +1 -1
  114. package/dist/search-field.d.ts +100 -0
  115. package/dist/search-field.js +167 -0
  116. package/dist/search-field.js.map +1 -0
  117. package/dist/skeleton.d.ts +18 -3
  118. package/dist/skeleton.js +9 -1
  119. package/dist/skeleton.js.map +1 -1
  120. package/dist/spinner.d.ts +21 -5
  121. package/dist/spinner.js +13 -12
  122. package/dist/spinner.js.map +1 -1
  123. package/dist/stepper.d.ts +112 -0
  124. package/dist/stepper.js +67 -0
  125. package/dist/stepper.js.map +1 -0
  126. package/dist/tabs.d.ts +1 -1
  127. package/dist/tabs.js +14 -8
  128. package/dist/tabs.js.map +1 -1
  129. package/dist/tag-input.d.ts +44 -0
  130. package/dist/tag-input.js +67 -0
  131. package/dist/tag-input.js.map +1 -0
  132. package/dist/theme.d.ts +1 -1
  133. package/dist/theme.js +2 -1
  134. package/dist/theme.js.map +1 -1
  135. package/dist/toast.d.ts +39 -4
  136. package/dist/toast.js +81 -7
  137. package/dist/toast.js.map +1 -1
  138. package/dist/video-player.d.ts +204 -0
  139. package/dist/video-player.js +371 -0
  140. package/dist/video-player.js.map +1 -0
  141. package/dist/video-trimmer.d.ts +142 -0
  142. package/dist/video-trimmer.js +193 -0
  143. package/dist/video-trimmer.js.map +1 -0
  144. package/package.json +375 -7
  145. package/registry/alert.json +1 -1
  146. package/registry/audio-player.json +282 -0
  147. package/registry/avatar.json +1 -1
  148. package/registry/badge.json +1 -1
  149. package/registry/button.json +232 -26
  150. package/registry/card.json +1 -1
  151. package/registry/checkbox.json +1 -1
  152. package/registry/chip-link.json +158 -0
  153. package/registry/chip.json +1 -1
  154. package/registry/combobox.json +475 -0
  155. package/registry/command.json +1 -1
  156. package/registry/confirm-button.json +91 -7
  157. package/registry/countdown.json +1 -1
  158. package/registry/data-table.json +500 -0
  159. package/registry/date-picker.json +978 -0
  160. package/registry/dialog.json +15 -7
  161. package/registry/dropdown-menu.json +1 -1
  162. package/registry/empty-state.json +1 -1
  163. package/registry/examples/audio-player/podcast.js +22 -0
  164. package/registry/examples/audio-player/podcast.tsx +19 -0
  165. package/registry/examples/audio-player/voice-note.d.ts +4 -0
  166. package/registry/examples/audio-player/voice-note.js +12 -0
  167. package/registry/examples/audio-player/voice-note.tsx +12 -0
  168. package/registry/examples/button/error.d.ts +4 -0
  169. package/registry/examples/button/error.js +11 -0
  170. package/registry/examples/button/error.tsx +10 -0
  171. package/registry/examples/button/loading.tsx +1 -1
  172. package/registry/examples/button/save-flow.d.ts +4 -0
  173. package/registry/examples/button/save-flow.js +28 -0
  174. package/registry/examples/button/save-flow.tsx +24 -0
  175. package/registry/examples/button/signature.d.ts +4 -0
  176. package/registry/examples/button/signature.js +17 -0
  177. package/registry/examples/button/signature.tsx +19 -0
  178. package/registry/examples/button/upload-progress.d.ts +4 -0
  179. package/registry/examples/button/upload-progress.js +23 -0
  180. package/registry/examples/button/upload-progress.tsx +26 -0
  181. package/registry/examples/chip-link/filters.d.ts +4 -0
  182. package/registry/examples/chip-link/filters.js +12 -0
  183. package/registry/examples/chip-link/filters.tsx +17 -0
  184. package/registry/examples/combobox/async.d.ts +4 -0
  185. package/registry/examples/combobox/async.js +23 -0
  186. package/registry/examples/combobox/async.tsx +22 -0
  187. package/registry/examples/combobox/creatable.d.ts +4 -0
  188. package/registry/examples/combobox/creatable.js +32 -0
  189. package/registry/examples/combobox/creatable.tsx +28 -0
  190. package/registry/examples/combobox/invalid.d.ts +4 -0
  191. package/registry/examples/combobox/invalid.js +23 -0
  192. package/registry/examples/combobox/invalid.tsx +17 -0
  193. package/registry/examples/combobox/multiple.d.ts +4 -0
  194. package/registry/examples/combobox/multiple.js +29 -0
  195. package/registry/examples/combobox/multiple.tsx +26 -0
  196. package/registry/examples/data-table/cards.d.ts +4 -0
  197. package/registry/examples/data-table/cards.js +21 -0
  198. package/registry/examples/data-table/cards.tsx +20 -0
  199. package/registry/examples/data-table/empty.d.ts +4 -0
  200. package/registry/examples/data-table/empty.js +26 -0
  201. package/registry/examples/data-table/empty.tsx +21 -0
  202. package/registry/examples/data-table/error.d.ts +4 -0
  203. package/registry/examples/data-table/error.js +28 -0
  204. package/registry/examples/data-table/error.tsx +29 -0
  205. package/registry/examples/data-table/jobs.d.ts +4 -0
  206. package/registry/examples/data-table/jobs.js +37 -0
  207. package/registry/examples/data-table/jobs.tsx +36 -0
  208. package/registry/examples/data-table/loading.d.ts +4 -0
  209. package/registry/examples/data-table/loading.js +16 -0
  210. package/registry/examples/data-table/loading.tsx +12 -0
  211. package/registry/examples/data-table/virtualized.d.ts +4 -0
  212. package/registry/examples/data-table/virtualized.js +21 -0
  213. package/registry/examples/data-table/virtualized.tsx +20 -0
  214. package/registry/examples/date-picker/calendar.d.ts +4 -0
  215. package/registry/examples/date-picker/calendar.js +14 -0
  216. package/registry/examples/date-picker/calendar.tsx +16 -0
  217. package/registry/examples/date-picker/french.d.ts +4 -0
  218. package/registry/examples/date-picker/french.js +20 -0
  219. package/registry/examples/date-picker/french.tsx +14 -0
  220. package/registry/examples/date-picker/open.d.ts +4 -0
  221. package/registry/examples/date-picker/open.js +11 -0
  222. package/registry/examples/date-picker/open.tsx +8 -0
  223. package/registry/examples/date-picker/range.d.ts +4 -0
  224. package/registry/examples/date-picker/range.js +29 -0
  225. package/registry/examples/date-picker/range.tsx +25 -0
  226. package/registry/examples/date-picker/schedule.d.ts +4 -0
  227. package/registry/examples/date-picker/schedule.js +26 -0
  228. package/registry/examples/date-picker/schedule.tsx +22 -0
  229. package/registry/examples/dialog/left.d.ts +4 -0
  230. package/registry/examples/dialog/left.js +22 -0
  231. package/registry/examples/dialog/left.tsx +32 -0
  232. package/registry/examples/file-upload/images.d.ts +4 -0
  233. package/registry/examples/file-upload/images.js +32 -0
  234. package/registry/examples/file-upload/images.tsx +25 -0
  235. package/registry/examples/file-upload/states.d.ts +4 -0
  236. package/registry/examples/file-upload/states.js +28 -0
  237. package/registry/examples/file-upload/states.tsx +23 -0
  238. package/registry/examples/file-upload/tus.d.ts +4 -0
  239. package/registry/examples/file-upload/tus.js +23 -0
  240. package/registry/examples/file-upload/tus.tsx +26 -0
  241. package/registry/examples/file-upload/video.d.ts +4 -0
  242. package/registry/examples/file-upload/video.js +39 -0
  243. package/registry/examples/file-upload/video.tsx +36 -0
  244. package/registry/examples/filter-bar/address.d.ts +4 -0
  245. package/registry/examples/filter-bar/address.js +29 -0
  246. package/registry/examples/filter-bar/address.tsx +27 -0
  247. package/registry/examples/filter-bar/jobs.d.ts +4 -0
  248. package/registry/examples/filter-bar/jobs.js +37 -0
  249. package/registry/examples/filter-bar/jobs.tsx +37 -0
  250. package/registry/examples/filter-bar/menu.d.ts +4 -0
  251. package/registry/examples/filter-bar/menu.js +27 -0
  252. package/registry/examples/filter-bar/menu.tsx +23 -0
  253. package/registry/examples/glow-card/link-card.d.ts +4 -0
  254. package/registry/examples/glow-card/link-card.js +14 -0
  255. package/registry/examples/glow-card/link-card.tsx +13 -0
  256. package/registry/examples/glow-card/plans.d.ts +4 -0
  257. package/registry/examples/glow-card/plans.js +25 -0
  258. package/registry/examples/glow-card/plans.tsx +26 -0
  259. package/registry/examples/glow-card/spotlight.d.ts +4 -0
  260. package/registry/examples/glow-card/spotlight.js +14 -0
  261. package/registry/examples/glow-card/spotlight.tsx +15 -0
  262. package/registry/examples/image-cropper/avatar.d.ts +4 -0
  263. package/registry/examples/image-cropper/avatar.js +13 -0
  264. package/registry/examples/image-cropper/avatar.tsx +14 -0
  265. package/registry/examples/image-cropper/banner.d.ts +4 -0
  266. package/registry/examples/image-cropper/banner.js +11 -0
  267. package/registry/examples/image-cropper/banner.tsx +10 -0
  268. package/registry/examples/image-cropper/vertical-video.d.ts +4 -0
  269. package/registry/examples/image-cropper/vertical-video.js +12 -0
  270. package/registry/examples/image-cropper/vertical-video.tsx +16 -0
  271. package/registry/examples/iso/compose.d.ts +4 -0
  272. package/registry/examples/iso/compose.js +22 -0
  273. package/registry/examples/iso/compose.tsx +19 -0
  274. package/registry/examples/iso/orazaka-hero.d.ts +4 -0
  275. package/registry/examples/iso/orazaka-hero.js +26 -0
  276. package/registry/examples/iso/orazaka-hero.tsx +21 -0
  277. package/registry/examples/iso/orochia-hero.d.ts +4 -0
  278. package/registry/examples/iso/orochia-hero.js +29 -0
  279. package/registry/examples/iso/orochia-hero.tsx +23 -0
  280. package/registry/examples/iso/still.d.ts +4 -0
  281. package/registry/examples/iso/still.js +21 -0
  282. package/registry/examples/iso/still.tsx +15 -0
  283. package/registry/examples/loader/endings.d.ts +4 -0
  284. package/registry/examples/loader/endings.js +14 -0
  285. package/registry/examples/loader/endings.tsx +11 -0
  286. package/registry/examples/loader/fetch-flow.d.ts +4 -0
  287. package/registry/examples/loader/fetch-flow.js +24 -0
  288. package/registry/examples/loader/fetch-flow.tsx +24 -0
  289. package/registry/examples/loader/minimal.d.ts +4 -0
  290. package/registry/examples/loader/minimal.js +11 -0
  291. package/registry/examples/loader/minimal.tsx +6 -0
  292. package/registry/examples/loader/overlay.d.ts +4 -0
  293. package/registry/examples/loader/overlay.js +16 -0
  294. package/registry/examples/loader/overlay.tsx +13 -0
  295. package/registry/examples/loader/region-handover.d.ts +4 -0
  296. package/registry/examples/loader/region-handover.js +42 -0
  297. package/registry/examples/loader/region-handover.tsx +29 -0
  298. package/registry/examples/loader/upload-eta.d.ts +4 -0
  299. package/registry/examples/loader/upload-eta.js +11 -0
  300. package/registry/examples/loader/upload-eta.tsx +10 -0
  301. package/registry/examples/marquee/cards.d.ts +4 -0
  302. package/registry/examples/marquee/cards.js +23 -0
  303. package/registry/examples/marquee/cards.tsx +21 -0
  304. package/registry/examples/marquee/logos.d.ts +4 -0
  305. package/registry/examples/marquee/logos.js +12 -0
  306. package/registry/examples/marquee/logos.tsx +17 -0
  307. package/registry/examples/media-capture/clip.d.ts +4 -0
  308. package/registry/examples/media-capture/clip.js +20 -0
  309. package/registry/examples/media-capture/clip.tsx +18 -0
  310. package/registry/examples/media-capture/native/photo.d.ts +4 -0
  311. package/registry/examples/media-capture/native/photo.dark.png +0 -0
  312. package/registry/examples/media-capture/native/photo.js +27 -0
  313. package/registry/examples/media-capture/native/photo.light.png +0 -0
  314. package/registry/examples/media-capture/native/photo.tsx +20 -0
  315. package/registry/examples/media-capture/profile-photo.d.ts +4 -0
  316. package/registry/examples/media-capture/profile-photo.js +24 -0
  317. package/registry/examples/media-capture/profile-photo.tsx +20 -0
  318. package/registry/examples/meter/balance.d.ts +4 -0
  319. package/registry/examples/meter/balance.js +14 -0
  320. package/registry/examples/meter/balance.tsx +15 -0
  321. package/registry/examples/meter/quota.d.ts +4 -0
  322. package/registry/examples/meter/quota.js +15 -0
  323. package/registry/examples/meter/quota.tsx +12 -0
  324. package/registry/examples/meter/split.d.ts +4 -0
  325. package/registry/examples/meter/split.js +18 -0
  326. package/registry/examples/meter/split.tsx +18 -0
  327. package/registry/examples/nav-bar/app-bar.d.ts +4 -0
  328. package/registry/examples/nav-bar/app-bar.js +22 -0
  329. package/registry/examples/nav-bar/app-bar.tsx +21 -0
  330. package/registry/examples/nav-bar/menu-open.d.ts +4 -0
  331. package/registry/examples/nav-bar/menu-open.js +26 -0
  332. package/registry/examples/nav-bar/menu-open.tsx +26 -0
  333. package/registry/examples/nav-bar/site.d.ts +4 -0
  334. package/registry/examples/nav-bar/site.js +31 -0
  335. package/registry/examples/nav-bar/site.tsx +36 -0
  336. package/registry/examples/number-ticker/gradient.d.ts +4 -0
  337. package/registry/examples/number-ticker/gradient.js +11 -0
  338. package/registry/examples/number-ticker/gradient.tsx +10 -0
  339. package/registry/examples/number-ticker/live-total.d.ts +4 -0
  340. package/registry/examples/number-ticker/live-total.js +17 -0
  341. package/registry/examples/number-ticker/live-total.tsx +21 -0
  342. package/registry/examples/number-ticker/stats.d.ts +4 -0
  343. package/registry/examples/number-ticker/stats.js +19 -0
  344. package/registry/examples/number-ticker/stats.tsx +23 -0
  345. package/registry/examples/pagination/cursor.d.ts +4 -0
  346. package/registry/examples/pagination/cursor.js +24 -0
  347. package/registry/examples/pagination/cursor.tsx +20 -0
  348. package/registry/examples/pagination/links.d.ts +4 -0
  349. package/registry/examples/pagination/links.js +11 -0
  350. package/registry/examples/pagination/links.tsx +6 -0
  351. package/registry/examples/pagination/native/cursor.d.ts +4 -0
  352. package/registry/examples/pagination/native/cursor.dark.png +0 -0
  353. package/registry/examples/pagination/native/cursor.js +19 -0
  354. package/registry/examples/pagination/native/cursor.light.png +0 -0
  355. package/registry/examples/pagination/native/cursor.tsx +13 -0
  356. package/registry/examples/pagination/native/pages.d.ts +4 -0
  357. package/registry/examples/pagination/native/pages.dark.png +0 -0
  358. package/registry/examples/pagination/native/pages.js +21 -0
  359. package/registry/examples/pagination/native/pages.light.png +0 -0
  360. package/registry/examples/pagination/native/pages.tsx +14 -0
  361. package/registry/examples/pagination/results.d.ts +4 -0
  362. package/registry/examples/pagination/results.js +23 -0
  363. package/registry/examples/pagination/results.tsx +19 -0
  364. package/registry/examples/pagination/table-footer.d.ts +4 -0
  365. package/registry/examples/pagination/table-footer.js +31 -0
  366. package/registry/examples/pagination/table-footer.tsx +27 -0
  367. package/registry/examples/progress/buffer.d.ts +4 -0
  368. package/registry/examples/progress/buffer.js +11 -0
  369. package/registry/examples/progress/buffer.tsx +10 -0
  370. package/registry/examples/progress/statuses.d.ts +4 -0
  371. package/registry/examples/progress/statuses.js +14 -0
  372. package/registry/examples/progress/statuses.tsx +11 -0
  373. package/registry/examples/progress/steps.d.ts +4 -0
  374. package/registry/examples/progress/steps.js +14 -0
  375. package/registry/examples/progress/steps.tsx +13 -0
  376. package/registry/examples/progress/upload.d.ts +4 -0
  377. package/registry/examples/progress/upload.js +11 -0
  378. package/registry/examples/progress/upload.tsx +10 -0
  379. package/registry/examples/search-field/global.d.ts +4 -0
  380. package/registry/examples/search-field/global.js +19 -0
  381. package/registry/examples/search-field/global.tsx +15 -0
  382. package/registry/examples/search-field/native/default.d.ts +4 -0
  383. package/registry/examples/search-field/native/default.dark.png +0 -0
  384. package/registry/examples/search-field/native/default.js +13 -0
  385. package/registry/examples/search-field/native/default.light.png +0 -0
  386. package/registry/examples/search-field/native/default.tsx +7 -0
  387. package/registry/examples/search-field/suggestions.d.ts +4 -0
  388. package/registry/examples/search-field/suggestions.js +30 -0
  389. package/registry/examples/search-field/suggestions.tsx +27 -0
  390. package/registry/examples/search-field/toolbar.d.ts +4 -0
  391. package/registry/examples/search-field/toolbar.js +17 -0
  392. package/registry/examples/search-field/toolbar.tsx +21 -0
  393. package/registry/examples/skeleton/paragraph.d.ts +4 -0
  394. package/registry/examples/skeleton/paragraph.js +14 -0
  395. package/registry/examples/skeleton/paragraph.tsx +12 -0
  396. package/registry/examples/skeleton/shape-of-content.d.ts +4 -0
  397. package/registry/examples/skeleton/shape-of-content.js +23 -0
  398. package/registry/examples/skeleton/shape-of-content.tsx +26 -0
  399. package/registry/examples/spinner/default.js +5 -2
  400. package/registry/examples/spinner/default.tsx +7 -1
  401. package/registry/examples/spinner/sizes.js +2 -1
  402. package/registry/examples/spinner/sizes.tsx +2 -0
  403. package/registry/examples/spinner/value.d.ts +4 -0
  404. package/registry/examples/spinner/value.js +11 -0
  405. package/registry/examples/spinner/value.tsx +12 -0
  406. package/registry/examples/stepper/checkout.d.ts +4 -0
  407. package/registry/examples/stepper/checkout.js +22 -0
  408. package/registry/examples/stepper/checkout.tsx +17 -0
  409. package/registry/examples/stepper/failed.d.ts +4 -0
  410. package/registry/examples/stepper/failed.js +26 -0
  411. package/registry/examples/stepper/failed.tsx +21 -0
  412. package/registry/examples/stepper/job.d.ts +4 -0
  413. package/registry/examples/stepper/job.js +32 -0
  414. package/registry/examples/stepper/job.tsx +28 -0
  415. package/registry/examples/tag-input/recipients.d.ts +4 -0
  416. package/registry/examples/tag-input/recipients.js +23 -0
  417. package/registry/examples/tag-input/recipients.tsx +20 -0
  418. package/registry/examples/tag-input/video-tags.d.ts +4 -0
  419. package/registry/examples/tag-input/video-tags.js +26 -0
  420. package/registry/examples/tag-input/video-tags.tsx +22 -0
  421. package/registry/examples/toast/grouped.d.ts +4 -0
  422. package/registry/examples/toast/grouped.js +21 -0
  423. package/registry/examples/toast/grouped.tsx +23 -0
  424. package/registry/examples/toast/undo.d.ts +4 -0
  425. package/registry/examples/toast/undo.js +29 -0
  426. package/registry/examples/toast/undo.tsx +30 -0
  427. package/registry/examples/toast/upload-progress.d.ts +4 -0
  428. package/registry/examples/toast/upload-progress.js +29 -0
  429. package/registry/examples/toast/upload-progress.tsx +31 -0
  430. package/registry/examples/video-player/default.d.ts +4 -0
  431. package/registry/examples/video-player/default.js +12 -0
  432. package/registry/examples/video-player/default.tsx +8 -0
  433. package/registry/examples/video-player/gated.d.ts +4 -0
  434. package/registry/examples/video-player/gated.js +26 -0
  435. package/registry/examples/video-player/gated.tsx +23 -0
  436. package/registry/examples/video-player/native/default.d.ts +4 -0
  437. package/registry/examples/video-player/native/default.dark.png +0 -0
  438. package/registry/examples/video-player/native/default.js +18 -0
  439. package/registry/examples/video-player/native/default.light.png +0 -0
  440. package/registry/examples/video-player/native/default.tsx +12 -0
  441. package/registry/examples/video-player/signed-source.d.ts +4 -0
  442. package/registry/examples/video-player/signed-source.js +16 -0
  443. package/registry/examples/video-player/signed-source.tsx +15 -0
  444. package/registry/examples/video-player/vertical.d.ts +4 -0
  445. package/registry/examples/video-player/vertical.js +12 -0
  446. package/registry/examples/video-player/vertical.tsx +12 -0
  447. package/registry/examples/video-trimmer/custom.d.ts +4 -0
  448. package/registry/examples/video-trimmer/custom.js +24 -0
  449. package/registry/examples/video-trimmer/custom.tsx +26 -0
  450. package/registry/examples/video-trimmer/filmstrip.d.ts +4 -0
  451. package/registry/examples/video-trimmer/filmstrip.js +15 -0
  452. package/registry/examples/video-trimmer/filmstrip.tsx +13 -0
  453. package/registry/examples/video-trimmer/playhead.d.ts +4 -0
  454. package/registry/examples/video-trimmer/playhead.js +15 -0
  455. package/registry/examples/video-trimmer/playhead.tsx +13 -0
  456. package/registry/field.json +1 -1
  457. package/registry/file-upload.json +471 -0
  458. package/registry/filter-bar.json +347 -0
  459. package/registry/glow-card.json +162 -0
  460. package/registry/image-cropper.json +313 -0
  461. package/registry/index.json +445 -20
  462. package/registry/iso.json +1355 -0
  463. package/registry/kbd.json +1 -1
  464. package/registry/loader.json +399 -0
  465. package/registry/marquee.json +225 -0
  466. package/registry/mascots.json +3 -3
  467. package/registry/media-capture.json +347 -0
  468. package/registry/meter.json +324 -0
  469. package/registry/nav-bar.json +480 -0
  470. package/registry/number-ticker.json +219 -0
  471. package/registry/page-header.json +1 -1
  472. package/registry/pagination.json +475 -0
  473. package/registry/popover.json +1 -1
  474. package/registry/progress.json +114 -9
  475. package/registry/radio-group.json +1 -1
  476. package/registry/search-field.json +436 -0
  477. package/registry/section-backdrop.json +1 -1
  478. package/registry/separator.json +1 -1
  479. package/registry/skeleton.json +69 -13
  480. package/registry/slider.json +1 -1
  481. package/registry/slot.json +1 -1
  482. package/registry/spinner.json +91 -27
  483. package/registry/stat.json +1 -1
  484. package/registry/stepper.json +174 -0
  485. package/registry/switch.json +1 -1
  486. package/registry/tabs.json +11 -7
  487. package/registry/tag-input.json +363 -0
  488. package/registry/theme.json +3 -3
  489. package/registry/toast.json +41 -13
  490. package/registry/tooltip.json +1 -1
  491. package/registry/video-player.json +598 -0
  492. package/registry/video-trimmer.json +385 -0
  493. package/dist/chunk-FHYZSO2S.js.map +0 -1
  494. package/dist/chunk-PESA2R4U.js +0 -51
  495. package/dist/chunk-PESA2R4U.js.map +0 -1
  496. package/registry/examples/spinner/muted.js +0 -11
  497. package/registry/examples/spinner/muted.tsx +0 -6
  498. /package/registry/examples/{spinner/muted.d.ts → audio-player/podcast.d.ts} +0 -0
@@ -0,0 +1,1355 @@
1
+ {
2
+ "name": "iso",
3
+ "type": "primitive",
4
+ "title": "Iso",
5
+ "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.",
6
+ "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.",
7
+ "status": "beta",
8
+ "category": "layout",
9
+ "platforms": "web",
10
+ "whenToUse": [
11
+ "The hero illustration of a product or marketing page: what the product is, drawn as one object with two to four satellites.",
12
+ "To show a flow toward or out of something (requests into a server, support toward a creator) with values written on it.",
13
+ "An architecture teaser where a diagram would be too much: one object per layer, named on hover and focus."
14
+ ],
15
+ "whenNotToUse": [
16
+ {
17
+ "when": "For a real architecture or data flow the reader must study: draw a schema with a text version."
18
+ },
19
+ {
20
+ "when": "As the background of a section: the light, the dome and the grid of a backdrop are lighter.",
21
+ "use": "section-backdrop"
22
+ },
23
+ {
24
+ "when": "More than one per screen: the hero object is unique, the rest of the page stays calm."
25
+ }
26
+ ],
27
+ "bestPractices": [
28
+ "Start with `IsoHub`: stages, satellites and a highlight are data; the hub places satellites on both sides (never in front of the hero, never hidden behind it) and frames exactly what it draws.",
29
+ "Name the scene (`label`) and say in `description` what it shows; name the objects (`label`) to make them explorable with the pointer and the keyboard — leave everything unnamed for a purely decorative scene.",
30
+ "Put the scene in a brand (`.brand-<id>`): the light, the core and the flows follow the accent, in both themes.",
31
+ "Composing by hand: paint back to front, and number the entrance with `index` so objects rise in a meaningful order.",
32
+ "Pass words translated: labels, values on links, the highlight."
33
+ ],
34
+ "accessibility": {
35
+ "keyboard": [
36
+ {
37
+ "keys": "Tab",
38
+ "action": "Visits each named object of the scene: it lifts and shows its label, as under the pointer."
39
+ }
40
+ ],
41
+ "notes": [
42
+ "A named scene is a `group` with its `label` and its `description` (`<desc>`); an unnamed one is decorative (`aria-hidden`).",
43
+ "Each named object is an image (`role=\"img\"`) named by its label and focusable; the drawn labels are decorative copies.",
44
+ "Under `prefers-reduced-motion` (and with `animated={false}`) the scene is a composed still frame: objects in place, light resting along the links — not an animation cut halfway.",
45
+ "Server-rendered static SVG, no client JavaScript; with `MotionObserver` mounted its loops pause off screen and wait for the page to settle."
46
+ ]
47
+ },
48
+ "related": [
49
+ "section-backdrop",
50
+ "number-ticker"
51
+ ],
52
+ "web": {
53
+ "entry": "@krizaka/ui/iso",
54
+ "import": "import { IsoHub, IsoScene, IsoPrism, IsoStack, IsoDome, IsoTile, IsoLink, IsoNode, IsoLabel } from \"@krizaka/ui/iso\";",
55
+ "props": [
56
+ {
57
+ "component": "IsoDome",
58
+ "description": "A dome of light over what it protects: a rim on the floor, a glass arc, a sheen that travels along it. Draw its rim\nbefore the objects it covers and the dome after them (`part=\"rim\"`, `part=\"arc\"`), or let `IsoHub` do it.",
59
+ "props": [
60
+ {
61
+ "name": "animated",
62
+ "type": "boolean",
63
+ "default": "true",
64
+ "description": "Motion: a sheen travels along the dome. `false` keeps it still.",
65
+ "required": false
66
+ },
67
+ {
68
+ "name": "at",
69
+ "type": "Vec2",
70
+ "default": "[0, 0]",
71
+ "description": "Its centre on the floor plan.",
72
+ "required": false
73
+ },
74
+ {
75
+ "name": "height",
76
+ "type": "number",
77
+ "default": "250",
78
+ "description": "Its height.",
79
+ "required": false
80
+ },
81
+ {
82
+ "name": "label",
83
+ "type": "string",
84
+ "default": null,
85
+ "description": "Its name (\"Your infrastructure\") — passed translated; shown at the top of the dome, always.",
86
+ "required": false
87
+ },
88
+ {
89
+ "name": "part",
90
+ "type": "\"both\" | \"rim\" | \"arc\"",
91
+ "default": "both",
92
+ "description": "`rim` (the floor ellipse, drawn first), `arc` (the glass, drawn last) or `both`.",
93
+ "required": false
94
+ },
95
+ {
96
+ "name": "radius",
97
+ "type": "number",
98
+ "default": "158",
99
+ "description": "The radius of its rim on the floor.",
100
+ "required": false
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "component": "IsoHub",
106
+ "description": "The hero, driven by data: a stack under an optional dome, satellites on both sides, a flow of light between each\nsatellite and the centre. Objects are painted back to front and the camera frames exactly what is drawn.",
107
+ "props": [
108
+ {
109
+ "name": "layers",
110
+ "type": "readonly IsoLayer[]",
111
+ "default": null,
112
+ "description": "The hero object in the centre: its stages, bottom first.",
113
+ "required": true
114
+ },
115
+ {
116
+ "name": "angles",
117
+ "type": "readonly number[]",
118
+ "default": null,
119
+ "description": "The angle of each satellite, in degrees (0: lower right, 90: lower left, 180: upper left, 270: upper right), to place them by hand.",
120
+ "required": false
121
+ },
122
+ {
123
+ "name": "animated",
124
+ "type": "boolean",
125
+ "default": "true",
126
+ "description": "Motion (entrance, breathing, flow, float). `false` draws the still frame — the one prefers-reduced-motion shows.",
127
+ "required": false
128
+ },
129
+ {
130
+ "name": "core",
131
+ "type": "string | boolean",
132
+ "default": "true",
133
+ "description": "A lit core on top of the stack; a string names it.",
134
+ "required": false
135
+ },
136
+ {
137
+ "name": "description",
138
+ "type": "string",
139
+ "default": null,
140
+ "description": "A longer text version of what the scene shows, read by assistive technology.",
141
+ "required": false
142
+ },
143
+ {
144
+ "name": "dome",
145
+ "type": "string | boolean",
146
+ "default": null,
147
+ "description": "A dome over the centre: `true`, or its name (\"Your servers\").",
148
+ "required": false
149
+ },
150
+ {
151
+ "name": "extent",
152
+ "type": "number",
153
+ "default": "240",
154
+ "description": "Half the size of the floor, in world units: what the camera frames.",
155
+ "required": false
156
+ },
157
+ {
158
+ "name": "grid",
159
+ "type": "boolean",
160
+ "default": "true",
161
+ "description": "The perspective grid on the floor, fading into the page.",
162
+ "required": false
163
+ },
164
+ {
165
+ "name": "highlight",
166
+ "type": "{ readonly strong?: string; readonly text: string; }",
167
+ "default": null,
168
+ "description": "A label pinned above the centre, its first part in the accent: `{ strong: \"90 %\", text: \"to the creator\" }`.",
169
+ "required": false
170
+ },
171
+ {
172
+ "name": "label",
173
+ "type": "string",
174
+ "default": null,
175
+ "description": "The accessible name of the scene (\"A server stack under a dome\") — passed translated. Without it the scene is decorative.",
176
+ "required": false
177
+ },
178
+ {
179
+ "name": "radius",
180
+ "type": "number",
181
+ "default": "210",
182
+ "description": "The distance of the satellites from the centre.",
183
+ "required": false
184
+ },
185
+ {
186
+ "name": "satellites",
187
+ "type": "readonly IsoSatellite[]",
188
+ "default": "[]",
189
+ "description": "The objects around the centre, joined to it by flows of light. The first half stands on the left, the rest on the\nright, top to bottom: never in front of the hero, never hidden behind it.",
190
+ "required": false
191
+ },
192
+ {
193
+ "name": "shape",
194
+ "type": "IsoShape",
195
+ "default": "cut",
196
+ "description": "The footprint of the stages.",
197
+ "required": false
198
+ },
199
+ {
200
+ "name": "size",
201
+ "type": "number",
202
+ "default": "120",
203
+ "description": "The width of the stages.",
204
+ "required": false
205
+ },
206
+ {
207
+ "name": "step",
208
+ "type": "number",
209
+ "default": "40",
210
+ "description": "The spacing of the grid's lines.",
211
+ "required": false
212
+ },
213
+ {
214
+ "name": "top",
215
+ "type": "number",
216
+ "default": "260",
217
+ "description": "Height above the floor the camera keeps in view, in world units.",
218
+ "required": false
219
+ }
220
+ ]
221
+ },
222
+ {
223
+ "component": "IsoLabel",
224
+ "description": "A label in a pill, always visible, pinned to a point of the scene (a share, a name).",
225
+ "props": [
226
+ {
227
+ "name": "at",
228
+ "type": "Vec2",
229
+ "default": null,
230
+ "description": "Where, on the floor plan.",
231
+ "required": true
232
+ },
233
+ {
234
+ "name": "text",
235
+ "type": "string",
236
+ "default": null,
237
+ "description": "The text — passed translated.",
238
+ "required": true
239
+ },
240
+ {
241
+ "name": "strong",
242
+ "type": "string",
243
+ "default": null,
244
+ "description": "A first part in the accent, bolder (\"90 %\" before \" to the creator\").",
245
+ "required": false
246
+ },
247
+ {
248
+ "name": "z",
249
+ "type": "number",
250
+ "default": "0",
251
+ "description": "Its height.",
252
+ "required": false
253
+ }
254
+ ]
255
+ },
256
+ {
257
+ "component": "IsoLink",
258
+ "description": "A dotted link on the floor, light flowing along it and particles crossing it — a flow between two objects.",
259
+ "props": [
260
+ {
261
+ "name": "from",
262
+ "type": "Vec2",
263
+ "default": null,
264
+ "description": "Where it starts, on the floor plan.",
265
+ "required": true
266
+ },
267
+ {
268
+ "name": "to",
269
+ "type": "Vec2",
270
+ "default": null,
271
+ "description": "Where it ends, on the floor plan.",
272
+ "required": true
273
+ },
274
+ {
275
+ "name": "animated",
276
+ "type": "boolean",
277
+ "default": "true",
278
+ "description": "Motion: the flow and the particles. `false` draws them still, resting along the link.",
279
+ "required": false
280
+ },
281
+ {
282
+ "name": "direction",
283
+ "type": "\"in\" | \"out\"",
284
+ "default": "out",
285
+ "description": "Which way the light flows: `out` from `from` to `to`, `in` back.",
286
+ "required": false
287
+ },
288
+ {
289
+ "name": "duration",
290
+ "type": "number",
291
+ "default": "3.6",
292
+ "description": "Seconds a particle takes to cross it.",
293
+ "required": false
294
+ },
295
+ {
296
+ "name": "label",
297
+ "type": "string",
298
+ "default": null,
299
+ "description": "A value written on it (\"90 %\", \"Tips\") — passed translated.",
300
+ "required": false
301
+ },
302
+ {
303
+ "name": "particles",
304
+ "type": "number",
305
+ "default": "2",
306
+ "description": "Particles of light travelling along it (0: only the dashes flow).",
307
+ "required": false
308
+ },
309
+ {
310
+ "name": "route",
311
+ "type": "\"elbow\" | \"straight\"",
312
+ "default": "elbow",
313
+ "description": "`elbow` follows the floor's axes, like a circuit; `straight` goes directly.",
314
+ "required": false
315
+ },
316
+ {
317
+ "name": "z",
318
+ "type": "number",
319
+ "default": "0",
320
+ "description": "The height it runs at.",
321
+ "required": false
322
+ }
323
+ ]
324
+ },
325
+ {
326
+ "component": "IsoNode",
327
+ "description": "The Krizaka node: a point of light in the accent, breathing in its glow.",
328
+ "props": [
329
+ {
330
+ "name": "animated",
331
+ "type": "boolean",
332
+ "default": "true",
333
+ "description": "Motion: the glow breathes. `false` keeps it still.",
334
+ "required": false
335
+ },
336
+ {
337
+ "name": "at",
338
+ "type": "Vec2",
339
+ "default": "[0, 0]",
340
+ "description": "Where, on the floor plan.",
341
+ "required": false
342
+ },
343
+ {
344
+ "name": "glow",
345
+ "type": "number",
346
+ "default": "70",
347
+ "description": "The radius of its glow (0: none).",
348
+ "required": false
349
+ },
350
+ {
351
+ "name": "index",
352
+ "type": "number",
353
+ "default": "0",
354
+ "description": "Its rank in the entrance.",
355
+ "required": false
356
+ },
357
+ {
358
+ "name": "r",
359
+ "type": "number",
360
+ "default": "7",
361
+ "description": "The radius of the node.",
362
+ "required": false
363
+ },
364
+ {
365
+ "name": "z",
366
+ "type": "number",
367
+ "default": "0",
368
+ "description": "Its height.",
369
+ "required": false
370
+ }
371
+ ]
372
+ },
373
+ {
374
+ "component": "IsoPrism",
375
+ "description": "A vertical prism — hexagonal, cut-corner or rectangular — that stacks with others on `z`.",
376
+ "props": [
377
+ {
378
+ "name": "height",
379
+ "type": "number",
380
+ "default": null,
381
+ "description": "Its height.",
382
+ "required": true
383
+ },
384
+ {
385
+ "name": "animated",
386
+ "type": "boolean",
387
+ "default": "true",
388
+ "description": "Motion: entrance and loops. `false` keeps this object still.",
389
+ "required": false
390
+ },
391
+ {
392
+ "name": "at",
393
+ "type": "Vec2",
394
+ "default": "[0, 0]",
395
+ "description": "The centre of its footprint on the floor plan (x, y).",
396
+ "required": false
397
+ },
398
+ {
399
+ "name": "className",
400
+ "type": "string",
401
+ "default": null,
402
+ "description": "Extra classes on the object's group.",
403
+ "required": false
404
+ },
405
+ {
406
+ "name": "cut",
407
+ "type": "number",
408
+ "default": null,
409
+ "description": "The size of the 45° cut (`shape=\"cut\"`); a sixth of the smaller side by default.",
410
+ "required": false
411
+ },
412
+ {
413
+ "name": "index",
414
+ "type": "number",
415
+ "default": "0",
416
+ "description": "Its rank in the entrance: objects rise into place one after the other.",
417
+ "required": false
418
+ },
419
+ {
420
+ "name": "label",
421
+ "type": "string",
422
+ "default": null,
423
+ "description": "The name shown when the pointer (or the focus) lifts the object — passed translated. It also makes it focusable.",
424
+ "required": false
425
+ },
426
+ {
427
+ "name": "material",
428
+ "type": "IsoMaterial",
429
+ "default": "base",
430
+ "description": "How it is lit.",
431
+ "required": false
432
+ },
433
+ {
434
+ "name": "shape",
435
+ "type": "IsoShape",
436
+ "default": "cut",
437
+ "description": "hex · cut (45° cut corners) · rect.",
438
+ "required": false
439
+ },
440
+ {
441
+ "name": "size",
442
+ "type": "number | Vec2",
443
+ "default": "120",
444
+ "description": "Its width (a number: square or hexagon's diameter) or width × depth.",
445
+ "required": false
446
+ },
447
+ {
448
+ "name": "strip",
449
+ "type": "boolean",
450
+ "default": null,
451
+ "description": "A dotted light strip around its front (the LEDs of a server), blinking slowly.",
452
+ "required": false
453
+ },
454
+ {
455
+ "name": "z",
456
+ "type": "number",
457
+ "default": "0",
458
+ "description": "The height of its base above the floor.",
459
+ "required": false
460
+ }
461
+ ]
462
+ },
463
+ {
464
+ "component": "IsoScene",
465
+ "description": "The stage: an isometric camera over a perspective grid that fades into the page. Its animations pause off screen and\nwait for the page to settle (MotionObserver); everything stops under prefers-reduced-motion.",
466
+ "props": [
467
+ {
468
+ "name": "animated",
469
+ "type": "boolean",
470
+ "default": "true",
471
+ "description": "Motion (entrance, breathing, flow, float). `false` draws the still frame — the one prefers-reduced-motion shows.",
472
+ "required": false
473
+ },
474
+ {
475
+ "name": "children",
476
+ "type": "ReactNode",
477
+ "default": null,
478
+ "description": "The objects, painted in order: put the farthest first (or use `IsoHub`, which sorts them).",
479
+ "required": false
480
+ },
481
+ {
482
+ "name": "description",
483
+ "type": "string",
484
+ "default": null,
485
+ "description": "A longer text version of what the scene shows, read by assistive technology.",
486
+ "required": false
487
+ },
488
+ {
489
+ "name": "extent",
490
+ "type": "number",
491
+ "default": "240",
492
+ "description": "Half the size of the floor, in world units: what the camera frames.",
493
+ "required": false
494
+ },
495
+ {
496
+ "name": "grid",
497
+ "type": "boolean",
498
+ "default": "true",
499
+ "description": "The perspective grid on the floor, fading into the page.",
500
+ "required": false
501
+ },
502
+ {
503
+ "name": "label",
504
+ "type": "string",
505
+ "default": null,
506
+ "description": "The accessible name of the scene (\"A server stack under a dome\") — passed translated. Without it the scene is decorative.",
507
+ "required": false
508
+ },
509
+ {
510
+ "name": "step",
511
+ "type": "number",
512
+ "default": "40",
513
+ "description": "The spacing of the grid's lines.",
514
+ "required": false
515
+ },
516
+ {
517
+ "name": "top",
518
+ "type": "number",
519
+ "default": "260",
520
+ "description": "Height above the floor the camera keeps in view, in world units.",
521
+ "required": false
522
+ }
523
+ ]
524
+ },
525
+ {
526
+ "component": "IsoStack",
527
+ "description": "A stack of stages on a plinth with a lit core on top — a server, a model, a pile of layers — driven by data.",
528
+ "props": [
529
+ {
530
+ "name": "layers",
531
+ "type": "readonly IsoLayer[]",
532
+ "default": null,
533
+ "description": "The stages, bottom first; they stack one after the other at the entrance.",
534
+ "required": true
535
+ },
536
+ {
537
+ "name": "animated",
538
+ "type": "boolean",
539
+ "default": "true",
540
+ "description": "Motion: entrance and loops. `false` keeps the stack still.",
541
+ "required": false
542
+ },
543
+ {
544
+ "name": "at",
545
+ "type": "Vec2",
546
+ "default": "[0, 0]",
547
+ "description": "The centre of the stack on the floor plan.",
548
+ "required": false
549
+ },
550
+ {
551
+ "name": "core",
552
+ "type": "string | boolean",
553
+ "default": "true",
554
+ "description": "A lit hexagonal core on top, its node glowing; a string names it.",
555
+ "required": false
556
+ },
557
+ {
558
+ "name": "gap",
559
+ "type": "number",
560
+ "default": "4",
561
+ "description": "The space between two stages.",
562
+ "required": false
563
+ },
564
+ {
565
+ "name": "index",
566
+ "type": "number",
567
+ "default": "0",
568
+ "description": "The rank of the first stage in the scene's entrance.",
569
+ "required": false
570
+ },
571
+ {
572
+ "name": "plinth",
573
+ "type": "boolean",
574
+ "default": "true",
575
+ "description": "A hexagonal plinth under the stack.",
576
+ "required": false
577
+ },
578
+ {
579
+ "name": "shape",
580
+ "type": "IsoShape",
581
+ "default": "cut",
582
+ "description": "The footprint of the stages.",
583
+ "required": false
584
+ },
585
+ {
586
+ "name": "size",
587
+ "type": "number",
588
+ "default": "120",
589
+ "description": "The width of the stages.",
590
+ "required": false
591
+ }
592
+ ]
593
+ },
594
+ {
595
+ "component": "IsoTile",
596
+ "description": "A satellite: a thin cut-corner tile that floats beside the hero object, a pictogram on its top.",
597
+ "props": [
598
+ {
599
+ "name": "at",
600
+ "type": "Vec2",
601
+ "default": null,
602
+ "description": "Its centre on the floor plan.",
603
+ "required": true
604
+ },
605
+ {
606
+ "name": "animated",
607
+ "type": "boolean",
608
+ "default": "true",
609
+ "description": "Motion: entrance and loops. `false` keeps this object still.",
610
+ "required": false
611
+ },
612
+ {
613
+ "name": "className",
614
+ "type": "string",
615
+ "default": null,
616
+ "description": "Extra classes on the object's group.",
617
+ "required": false
618
+ },
619
+ {
620
+ "name": "float",
621
+ "type": "boolean",
622
+ "default": "true",
623
+ "description": "It floats gently.",
624
+ "required": false
625
+ },
626
+ {
627
+ "name": "glyph",
628
+ "type": "IsoGlyph",
629
+ "default": "none",
630
+ "description": "The pictogram on its top.",
631
+ "required": false
632
+ },
633
+ {
634
+ "name": "index",
635
+ "type": "number",
636
+ "default": "0",
637
+ "description": "Its rank in the entrance: objects rise into place one after the other.",
638
+ "required": false
639
+ },
640
+ {
641
+ "name": "label",
642
+ "type": "string",
643
+ "default": null,
644
+ "description": "The name shown when the pointer (or the focus) lifts the object — passed translated. It also makes it focusable.",
645
+ "required": false
646
+ },
647
+ {
648
+ "name": "material",
649
+ "type": "IsoMaterial",
650
+ "default": "accent",
651
+ "description": "How it is lit.",
652
+ "required": false
653
+ },
654
+ {
655
+ "name": "size",
656
+ "type": "Vec2",
657
+ "default": "[76, 52]",
658
+ "description": "Width × depth.",
659
+ "required": false
660
+ },
661
+ {
662
+ "name": "z",
663
+ "type": "number",
664
+ "default": "90",
665
+ "description": "The height it floats at.",
666
+ "required": false
667
+ }
668
+ ]
669
+ }
670
+ ],
671
+ "examples": [
672
+ {
673
+ "name": "orazaka-hero",
674
+ "title": "Sovereign servers (Orazaka)",
675
+ "description": "Three named stages under a dome, a lit core; chats and documents flow in, answers flow out. Hover or tab to explore.",
676
+ "path": "examples/iso/orazaka-hero.tsx",
677
+ "module": "@krizaka/ui/registry/examples/iso/orazaka-hero",
678
+ "code": "import { IsoHub } from \"@krizaka/ui/iso\";\n\n// Sovereign servers under a dome: three stages, a lit core, requests and documents flowing in, answers flowing out.\n// Wrap it in `.brand-orazaka` (or any brand) and the light follows the brand's accent.\nexport default function IsoOrazakaHero() {\n return (\n <IsoHub\n label=\"Your AI runs on your own servers\"\n description=\"A stack of three servers — gateway, models, data — under a dome; chats and documents flow in, answers flow out.\"\n className=\"w-full max-w-xl\"\n dome=\"Your infrastructure\"\n layers={[{ label: \"Data\" }, { label: \"Models\" }, { label: \"Gateway\" }]}\n core=\"Orchestrator\"\n satellites={[\n { label: \"Chats\", glyph: \"dots\", flow: \"in\" },\n { label: \"Documents\", glyph: \"lines\", flow: \"in\", material: \"glass\" },\n { label: \"Answers\", glyph: \"arrow\", flow: \"out\" },\n ]}\n />\n );\n}\n"
679
+ },
680
+ {
681
+ "name": "orochia-hero",
682
+ "title": "Support toward a creator (Orochia)",
683
+ "description": "The creator in the centre, tips, unlocks, auctions and challenges flowing toward them, their amounts on the links, 90 % pinned above.",
684
+ "path": "examples/iso/orochia-hero.tsx",
685
+ "module": "@krizaka/ui/registry/examples/iso/orochia-hero",
686
+ "code": "import { IsoHub } from \"@krizaka/ui/iso\";\n\n// The creator at the centre; tips, unlocks, auctions and challenges flow toward them — and 90 % stays theirs.\nexport default function IsoOrochiaHero() {\n return (\n <IsoHub\n label=\"Every support flows to the creator\"\n description=\"A creator at the centre receives tips, unlocks, auction bids and challenge pledges; 90 % of each goes to them.\"\n className=\"w-full max-w-xl\"\n shape=\"hex\"\n size={110}\n layers={[{ label: \"Community\", height: 16 }, { label: \"Creator\", height: 44, material: \"accent2\" }]}\n core=\"Payouts\"\n highlight={{ strong: \"90 %\", text: \"to the creator\" }}\n satellites={[\n { label: \"Tips\", glyph: \"coin\", value: \"+ €5\" },\n { label: \"Unlocks\", glyph: \"lock\", value: \"+ €3\" },\n { label: \"Auctions\", glyph: \"arrow\", value: \"€120\" },\n { label: \"Challenges\", glyph: \"flag\", value: \"€40\" },\n ]}\n />\n );\n}\n"
687
+ },
688
+ {
689
+ "name": "compose",
690
+ "title": "Composed by hand",
691
+ "description": "The primitives — scene, links, dome, prisms, node, tiles — painted back to front with an entrance order.",
692
+ "path": "examples/iso/compose.tsx",
693
+ "module": "@krizaka/ui/registry/examples/iso/compose",
694
+ "code": "import { IsoDome, IsoLink, IsoNode, IsoPrism, IsoScene, IsoTile } from \"@krizaka/ui/iso\";\n\n// The primitives, composed by hand: painted back to front, each object rising in turn (`index`).\nexport default function IsoCompose() {\n return (\n <IsoScene label=\"A model served from one node\" className=\"w-full max-w-md\" extent={230} top={190} viewBox=\"-260 -250 520 360\">\n <IsoLink from={[-40, -190]} to={[-40, -60]} label=\"Prompt\" />\n <IsoLink from={[60, 0]} to={[190, 0]} direction=\"out\" label=\"Answer\" />\n <IsoDome radius={110} part=\"rim\" />\n <IsoTile at={[-40, -190]} z={70} glyph=\"dots\" label=\"Chat\" index={0} />\n <IsoPrism shape=\"hex\" size={170} height={12} index={1} />\n <IsoPrism size={92} z={16} height={34} strip label=\"Model\" index={2} />\n <IsoPrism shape=\"hex\" size={44} z={54} height={14} material=\"accent\" index={3} />\n <IsoNode z={78} index={4} />\n <IsoDome radius={110} height={170} part=\"arc\" />\n <IsoTile at={[190, 0]} z={56} glyph=\"lines\" material=\"glass\" label=\"Document\" index={5} />\n </IsoScene>\n );\n}\n"
695
+ },
696
+ {
697
+ "name": "still",
698
+ "title": "Still frame",
699
+ "description": "`animated={false}`: the composed picture prefers-reduced-motion shows.",
700
+ "path": "examples/iso/still.tsx",
701
+ "module": "@krizaka/ui/registry/examples/iso/still",
702
+ "code": "import { IsoHub } from \"@krizaka/ui/iso\";\n\n// `animated={false}`: the still frame — the picture prefers-reduced-motion shows, composed, never cut mid-way.\nexport default function IsoStill() {\n return (\n <IsoHub\n label=\"A server under a dome\"\n className=\"w-full max-w-sm\"\n animated={false}\n dome\n layers={[{}, {}]}\n satellites={[{ label: \"Requests\", glyph: \"dots\" }, { label: \"Files\", glyph: \"lines\", material: \"glass\" }]}\n />\n );\n}\n"
703
+ }
704
+ ]
705
+ },
706
+ "native": null,
707
+ "files": [
708
+ {
709
+ "path": "cx.ts",
710
+ "content": "/** Joins class names, skipping the falsy ones. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(\" \");\n}\n"
711
+ },
712
+ {
713
+ "path": "iso/geometry.ts",
714
+ "content": "// Isometric projection, pure geometry (no React): the iso components compute their faces at render time — on the\n// server, as static markup. World: x to the lower right, y to the lower left, z up.\n// Screen: X = (x − y)·cos 30°, Y = (x + y)·sin 30° − z.\n\n/** A point in plan (x, y) or on screen (X, Y). */\nexport type Vec2 = readonly [number, number];\n/** A point in the world: x, y on the floor, z up. */\nexport type Vec3 = readonly [number, number, number];\n\nconst COS = Math.cos(Math.PI / 6);\nconst SIN = 0.5;\nconst f = (n: number) => (Math.round(n * 10) / 10).toString();\n\n/** The screen point of a world point. */\nexport function project([x, y, z]: Vec3): Vec2 {\n return [(x - y) * COS, (x + y) * SIN - z];\n}\n\n/** SVG `points` of screen points. */\nexport const pts = (points: readonly Vec2[]) => points.map(([x, y]) => `${f(x)},${f(y)}`).join(\" \");\n\n/** An SVG path through screen points. */\nexport const pathOf = (points: readonly Vec2[], close = false) =>\n points.map(([x, y], i) => `${i ? \"L\" : \"M\"}${f(x)} ${f(y)}`).join(\"\") + (close ? \"Z\" : \"\");\n\n/** A regular hexagon footprint (flat top in plan), centre (cx, cy), radius r. */\nexport function hexagon(cx: number, cy: number, r: number): Vec2[] {\n return Array.from({ length: 6 }, (_, k) => {\n const a = (Math.PI / 3) * k;\n return [cx + r * Math.cos(a), cy + r * Math.sin(a)] as const;\n });\n}\n\n/** A rectangle with 45° cut corners (the Krizaka chamfer), centre (cx, cy), size w × d, cut c (0: a plain rectangle). */\nexport function cutRect(cx: number, cy: number, w: number, d: number, c: number): Vec2[] {\n const x0 = cx - w / 2;\n const x1 = cx + w / 2;\n const y0 = cy - d / 2;\n const y1 = cy + d / 2;\n if (c <= 0) return [[x0, y0], [x1, y0], [x1, y1], [x0, y1]];\n return [[x0 + c, y0], [x1 - c, y0], [x1, y0 + c], [x1, y1 - c], [x1 - c, y1], [x0 + c, y1], [x0, y1 - c], [x0, y0 + c]];\n}\n\nexport interface Face {\n /** SVG `points`. */\n readonly points: string;\n /** The top, or a side facing the left or the right light. */\n readonly kind: \"top\" | \"left\" | \"right\";\n}\n\n/** The visible faces of a vertical prism over a footprint, painted back to front. */\nexport function prism(footprint: readonly Vec2[], z0: number, h: number): Face[] {\n const n = footprint.length;\n // The winding (shoelace) gives the outward normals whatever the order of the points.\n const area = footprint.reduce((s, [x, y], i) => {\n const [x2, y2] = footprint[(i + 1) % n]!;\n return s + (x * y2 - x2 * y);\n }, 0);\n const sign = area > 0 ? 1 : -1;\n const sides: { depth: number; face: Face }[] = [];\n for (let i = 0; i < n; i++) {\n const [ax, ay] = footprint[i]!;\n const [bx, by] = footprint[(i + 1) % n]!;\n const nx = sign * (by - ay);\n const ny = sign * -(bx - ax);\n if (nx + ny <= 1e-6) continue; // faces away from the viewer\n const quad: Vec2[] = [project([ax, ay, z0]), project([bx, by, z0]), project([bx, by, z0 + h]), project([ax, ay, z0 + h])];\n sides.push({ depth: ax + ay + bx + by, face: { points: pts(quad), kind: nx >= ny ? \"right\" : \"left\" } });\n }\n sides.sort((a, b) => a.depth - b.depth);\n const top: Face = { points: pts(footprint.map(([x, y]) => project([x, y, z0 + h]))), kind: \"top\" };\n return [...sides.map((s) => s.face), top];\n}\n\n/** The screen ellipse of a horizontal circle of radius r at height z: centre and radii. */\nexport function isoCircle(cx: number, cy: number, z: number, r: number) {\n const [x, y] = project([cx, cy, z]);\n return { cx: x, cy: y, rx: r * COS * Math.SQRT2, ry: r * SIN * Math.SQRT2 };\n}\n\n/** A point on a circle of the floor plan: angle in degrees, 0 toward the lower right (+x), clockwise on screen. */\nexport function onCircle(r: number, deg: number, [cx, cy]: Vec2 = [0, 0]): Vec2 {\n const a = (deg * Math.PI) / 180;\n return [cx + r * Math.cos(a), cy + r * Math.sin(a)];\n}\n\n/** Depth for the painter: larger is nearer the viewer. */\nexport const depthOf = ([x, y]: Vec2) => x + y;\n\n/** The view box that frames a floor of half-size `extent` and `top` units of height above it. */\nexport function viewBoxOf(extent: number, top: number, margin = 24): string {\n const w = 2 * extent * COS + margin * 2;\n return [-w / 2, -extent * SIN * 1.2 - top, w, extent * SIN * 2.4 + top].map(f).join(\" \");\n}\n"
715
+ },
716
+ {
717
+ "path": "iso/index.ts",
718
+ "content": "/**\n * @krizaka/ui/iso — the isometric kit: `IsoScene`, `IsoPrism`, `IsoStack`, `IsoDome`, `IsoTile`, `IsoLink`, `IsoNode`,\n * `IsoLabel`, and `IsoHub` (a hero driven by data). Server-safe: static SVG animated by motion.css.\n */\nexport { cutRect, hexagon, isoCircle, onCircle, project, type Vec2, type Vec3 } from \"./geometry\";\nexport {\n IsoDome,\n type IsoDomeProps,\n type IsoGlyph,\n IsoHub,\n type IsoHubProps,\n IsoLabel,\n type IsoLabelProps,\n type IsoLayer,\n IsoLink,\n type IsoLinkProps,\n type IsoMaterial,\n IsoNode,\n type IsoNodeProps,\n IsoPrism,\n type IsoPrismProps,\n type IsoSatellite,\n IsoScene,\n type IsoSceneProps,\n type IsoShape,\n IsoStack,\n type IsoStackProps,\n IsoTile,\n type IsoTileProps,\n} from \"./iso\";\n"
719
+ },
720
+ {
721
+ "path": "iso/iso.tsx",
722
+ "content": "// Server-safe: no state, no effect, no context — static SVG computed at render time, animated by motion.css (`kz-iso-*`,\n// shipped by the preset), so a hero costs no client JavaScript. `useId` only (allowed in Server Components): every scene\n// owns its gradient and mask ids. Classes are joined with `cx`: no tailwind-variants in this entry.\nimport * as React from \"react\";\n\nimport { cx as cn } from \"../cx\";\nimport { cutRect, depthOf, type Face, hexagon, isoCircle, onCircle, pathOf, prism, project, pts, type Vec2, viewBoxOf } from \"./geometry\";\n\n/** How a solid is lit: the page's surfaces (`base`), the brand accent, accent → accent-2, or frosted glass. */\nexport type IsoMaterial = \"base\" | \"accent\" | \"accent2\" | \"glass\";\n/** The footprint of a prism: a hexagon (the marks), a rectangle with 45° cut corners (the icons) or a plain one. */\nexport type IsoShape = \"hex\" | \"cut\" | \"rect\";\n/** A pictogram drawn on the top of a tile. */\nexport type IsoGlyph = \"dots\" | \"lines\" | \"play\" | \"coin\" | \"lock\" | \"arrow\" | \"flag\" | \"heart\" | \"node\" | \"none\";\n\ntype Style = React.CSSProperties & Record<`--${string}`, string | number>;\n\nconst uid = (raw: string) => raw.replace(/[^a-zA-Z0-9_-]/g, \"\");\nconst footprint = (shape: IsoShape, [x, y]: Vec2, size: number | Vec2, cut?: number): Vec2[] => {\n const [w, d] = typeof size === \"number\" ? [size, size] : size;\n if (shape === \"hex\") return hexagon(x, y, w / 2);\n return cutRect(x, y, w, d, shape === \"rect\" ? 0 : (cut ?? Math.min(w, d) / 6));\n};\n\nexport interface IsoSceneProps extends Omit<React.ComponentProps<\"svg\">, \"children\"> {\n /** The accessible name of the scene (\"A server stack under a dome\") — passed translated. Without it the scene is decorative. */\n label?: string;\n /** A longer text version of what the scene shows, read by assistive technology. */\n description?: string;\n /**\n * Half the size of the floor, in world units: what the camera frames.\n * @default 240\n */\n extent?: number;\n /**\n * Height above the floor the camera keeps in view, in world units.\n * @default 260\n */\n top?: number;\n /**\n * The perspective grid on the floor, fading into the page.\n * @default true\n */\n grid?: boolean;\n /**\n * The spacing of the grid's lines.\n * @default 40\n */\n step?: number;\n /**\n * Motion (entrance, breathing, flow, float). `false` draws the still frame — the one prefers-reduced-motion shows.\n * @default true\n */\n animated?: boolean;\n /** The objects, painted in order: put the farthest first (or use `IsoHub`, which sorts them). */\n children?: React.ReactNode;\n}\n\n/**\n * The stage: an isometric camera over a perspective grid that fades into the page. Its animations pause off screen and\n * wait for the page to settle (MotionObserver); everything stops under prefers-reduced-motion.\n */\nexport function IsoScene({ label, description, extent = 240, top = 260, grid = true, step = 40, animated = true, viewBox, className, children, ...props }: IsoSceneProps) {\n const id = uid(React.useId());\n const lines: string[] = [];\n for (let v = -extent; v <= extent; v += step) {\n lines.push(pathOf([project([v, -extent, 0]), project([v, extent, 0])]), pathOf([project([-extent, v, 0]), project([extent, v, 0])]));\n }\n const fade = isoCircle(0, 0, 0, extent * 0.9);\n const named = label ? { role: \"group\" as const, \"aria-label\": label } : { \"aria-hidden\": true as const };\n return (\n <svg\n viewBox={viewBox ?? viewBoxOf(extent, top)}\n focusable=\"false\"\n data-motion-scope=\"\"\n data-animated={animated}\n className={cn(\"kz-iso\", className)}\n {...named}\n {...props}\n >\n {description && <desc>{description}</desc>}\n {grid && (\n <>\n <defs>\n <radialGradient id={`${id}-fade`}>\n <stop offset=\"0%\" stopColor=\"white\" stopOpacity=\"1\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity=\"0\" />\n </radialGradient>\n <mask id={`${id}-floor`}>\n <ellipse cx={fade.cx} cy={fade.cy} rx={fade.rx} ry={fade.ry} fill={`url(#${id}-fade)`} />\n </mask>\n </defs>\n <path d={lines.join(\"\")} className=\"kz-iso-floor\" mask={`url(#${id}-floor)`} />\n </>\n )}\n {children}\n </svg>\n );\n}\n\n/** A loop only when the scene moves: `animated={false}` on the item keeps it still. */\nconst loop = (animated: boolean | undefined) => (animated === false ? undefined : \"kz-loop\");\n\ninterface ItemProps {\n /** The name shown when the pointer (or the focus) lifts the object — passed translated. It also makes it focusable. */\n label?: string;\n /**\n * Its rank in the entrance: objects rise into place one after the other.\n * @default 0\n */\n index?: number;\n /**\n * Motion: entrance and loops. `false` keeps this object still.\n * @default true\n */\n animated?: boolean;\n /** Extra classes on the object's group. */\n className?: string;\n}\n\n/** An object of the scene: rises at the entrance, lifts under the pointer or the focus and shows its label. */\nfunction Item({ label, index = 0, animated, anchor, align = \"center\", className, children }: ItemProps & { anchor: Vec2; align?: \"center\" | \"start\"; children: React.ReactNode }) {\n const named = label ? { role: \"img\" as const, \"aria-label\": label, tabIndex: 0 } : {};\n return (\n <g className={cn(\"kz-iso-item\", className)} style={{ \"--kz-iso-i\": index } as Style} {...named}>\n <g className={cn(\"kz-iso-lift\", animated !== false && \"kz-iso-rise\")}>{children}</g>\n {label && <Tip at={anchor} text={label} align={align} />}\n </g>\n );\n}\n\n/**\n * A label in a pill (decorative: the object carries the name). `center`: above the point (a floating tile). `start`:\n * beside it, to the right, with a leader — for a stage of a stack, whose upper stages would cover a label above it.\n */\nfunction Tip({ at: [x, y], text, align }: { at: Vec2; text: string; align: \"center\" | \"start\" }) {\n const w = Math.max(40, text.length * 6.6 + 20);\n if (align === \"start\") {\n return (\n <g className=\"kz-iso-tip\" aria-hidden>\n <path d={`M${Math.round(x + 3)} ${Math.round(y)}h18`} className=\"kz-iso-leader\" />\n <rect x={x + 21} y={y - 11} width={w} height={22} rx={7} strokeWidth={1} />\n <text x={x + 21 + w / 2} y={y + 4} textAnchor=\"middle\">\n {text}\n </text>\n </g>\n );\n }\n return (\n <g className=\"kz-iso-tip\" aria-hidden>\n <rect x={x - w / 2} y={y - 34} width={w} height={22} rx={7} strokeWidth={1} />\n <text x={x} y={y - 19} textAnchor=\"middle\">\n {text}\n </text>\n </g>\n );\n}\n\nfunction Solid({ faces, material }: { faces: Face[]; material: IsoMaterial }) {\n return (\n <g className={\"kz-iso-\" + material}>\n {faces.map((face, i) => (\n <polygon key={i} points={face.points} className={\"kz-iso-face kz-iso-\" + face.kind} />\n ))}\n </g>\n );\n}\n\nexport interface IsoPrismProps extends ItemProps {\n /**\n * The centre of its footprint on the floor plan (x, y).\n * @default [0, 0]\n */\n at?: Vec2;\n /**\n * The height of its base above the floor.\n * @default 0\n */\n z?: number;\n /** Its height. */\n height: number;\n /**\n * hex · cut (45° cut corners) · rect.\n * @default \"cut\"\n */\n shape?: IsoShape;\n /**\n * Its width (a number: square or hexagon's diameter) or width × depth.\n * @default 120\n */\n size?: number | Vec2;\n /** The size of the 45° cut (`shape=\"cut\"`); a sixth of the smaller side by default. */\n cut?: number;\n /**\n * How it is lit.\n * @default \"base\"\n */\n material?: IsoMaterial;\n /** A dotted light strip around its front (the LEDs of a server), blinking slowly. */\n strip?: boolean;\n}\n\n/** A vertical prism — hexagonal, cut-corner or rectangular — that stacks with others on `z`. */\nexport function IsoPrism({ at = [0, 0], z = 0, height, shape = \"cut\", size = 120, cut, material = \"base\", strip, animated, ...item }: IsoPrismProps) {\n const foot = footprint(shape, at, size, cut);\n const [w, d] = typeof size === \"number\" ? [size, size] : size;\n return (\n <Item {...item} animated={animated} anchor={project(shape === \"hex\" ? [at[0] + w / 4, at[1] - w * 0.433, z + height / 2] : [at[0] + w / 2, at[1] - d / 2, z + height / 2])} align=\"start\">\n <Solid faces={prism(foot, z, height)} material={material} />\n {strip && <Strip at={at} w={w} d={d} c={shape === \"rect\" ? 0 : (cut ?? Math.min(w, d) / 6)} z={z + height / 2 + 1} animated={animated} hex={shape === \"hex\"} />}\n </Item>\n );\n}\n\nfunction Strip({ at: [cx, cy], w, d, c, z, hex, animated }: { at: Vec2; w: number; d: number; c: number; z: number; hex: boolean; animated?: boolean }) {\n const front: Vec2[] = hex\n ? [0, 1, 2].map((k) => onCircle(w / 2, k * 60 - 60, [cx, cy]))\n : [[cx + w / 2, cy - d / 2 + c], [cx + w / 2, cy + d / 2 - c], [cx + w / 2 - c, cy + d / 2], [cx - w / 2 + c, cy + d / 2]];\n return <polyline points={pts(front.map(([x, y]) => project([x, y, z])))} className={cn(\"kz-iso-strip\", loop(animated))} />;\n}\n\n/** One stage of an `IsoStack`. */\nexport interface IsoLayer {\n /** The stage's name, shown when it is lifted — passed translated. */\n label?: string;\n /**\n * Its height.\n * @default 22\n */\n height?: number;\n /**\n * How it is lit.\n * @default \"base\"\n */\n material?: IsoMaterial;\n}\n\nexport interface IsoStackProps {\n /** The stages, bottom first; they stack one after the other at the entrance. */\n layers: readonly IsoLayer[];\n /**\n * The centre of the stack on the floor plan.\n * @default [0, 0]\n */\n at?: Vec2;\n /**\n * The footprint of the stages.\n * @default \"cut\"\n */\n shape?: IsoShape;\n /**\n * The width of the stages.\n * @default 120\n */\n size?: number;\n /**\n * The space between two stages.\n * @default 4\n */\n gap?: number;\n /**\n * A hexagonal plinth under the stack.\n * @default true\n */\n plinth?: boolean;\n /**\n * A lit hexagonal core on top, its node glowing; a string names it.\n * @default true\n */\n core?: boolean | string;\n /**\n * The rank of the first stage in the scene's entrance.\n * @default 0\n */\n index?: number;\n /**\n * Motion: entrance and loops. `false` keeps the stack still.\n * @default true\n */\n animated?: boolean;\n}\n\n/** A stack of stages on a plinth with a lit core on top — a server, a model, a pile of layers — driven by data. */\nexport function IsoStack({ layers, at = [0, 0], shape = \"cut\", size = 120, gap = 4, plinth = true, core = true, index = 0, animated }: IsoStackProps) {\n const base = plinth ? 12 + gap : 0;\n const heights = layers.map((layer) => layer.height ?? 22);\n const stages = layers.map((layer, k) => ({ ...layer, k, height: heights[k]!, z: base + heights.slice(0, k).reduce((sum, h) => sum + h + gap, 0) }));\n const top = base + heights.reduce((sum, h) => sum + h + gap, 0);\n return (\n <g>\n {plinth && <IsoPrism at={at} height={12} shape=\"hex\" size={size * 1.86} index={index} animated={animated} />}\n {stages.map((s) => (\n <IsoPrism\n key={s.k}\n at={at}\n z={s.z}\n height={s.height}\n shape={shape}\n size={size}\n material={s.material ?? \"base\"}\n strip={(s.material ?? \"base\") === \"base\"}\n label={s.label}\n index={index + 1 + s.k}\n animated={animated}\n />\n ))}\n {core && (\n <>\n <IsoPrism at={at} z={top} height={16} shape=\"hex\" size={size / 2} material=\"accent\" index={index + 1 + stages.length} animated={animated} label={typeof core === \"string\" ? core : undefined} />\n <IsoNode at={at} z={top + 22} index={index + 2 + stages.length} animated={animated} />\n </>\n )}\n </g>\n );\n}\n\nexport interface IsoNodeProps {\n /**\n * Where, on the floor plan.\n * @default [0, 0]\n */\n at?: Vec2;\n /**\n * Its height.\n * @default 0\n */\n z?: number;\n /**\n * The radius of the node.\n * @default 7\n */\n r?: number;\n /**\n * The radius of its glow (0: none).\n * @default 70\n */\n glow?: number;\n /**\n * Its rank in the entrance.\n * @default 0\n */\n index?: number;\n /**\n * Motion: the glow breathes. `false` keeps it still.\n * @default true\n */\n animated?: boolean;\n}\n\n/** The Krizaka node: a point of light in the accent, breathing in its glow. */\nexport function IsoNode({ at = [0, 0], z = 0, r = 7, glow = 70, index = 0, animated }: IsoNodeProps) {\n const id = uid(React.useId());\n const [x, y] = project([at[0], at[1], z]);\n return (\n <g className={cn(animated !== false && \"kz-iso-rise\")} style={{ \"--kz-iso-i\": index } as Style}>\n {glow > 0 && (\n <>\n <defs>\n <radialGradient id={`${id}-glow`}>\n <stop offset=\"0%\" className=\"kz-iso-glow-stop\" stopOpacity=\"0.55\" />\n <stop offset=\"100%\" className=\"kz-iso-glow-stop\" stopOpacity=\"0\" />\n </radialGradient>\n </defs>\n <circle cx={x} cy={y} r={glow} fill={`url(#${id}-glow)`} className={cn(\"kz-iso-breathe\", loop(animated))} />\n </>\n )}\n <circle cx={x} cy={y} r={r} className={cn(\"kz-iso-node kz-iso-breathe\", loop(animated))} />\n </g>\n );\n}\n\nexport interface IsoDomeProps {\n /**\n * Its centre on the floor plan.\n * @default [0, 0]\n */\n at?: Vec2;\n /**\n * The radius of its rim on the floor.\n * @default 158\n */\n radius?: number;\n /**\n * Its height.\n * @default 250\n */\n height?: number;\n /** Its name (\"Your infrastructure\") — passed translated; shown at the top of the dome, always. */\n label?: string;\n /**\n * Motion: a sheen travels along the dome. `false` keeps it still.\n * @default true\n */\n animated?: boolean;\n}\n\n/**\n * A dome of light over what it protects: a rim on the floor, a glass arc, a sheen that travels along it. Draw its rim\n * before the objects it covers and the dome after them (`part=\"rim\"`, `part=\"arc\"`), or let `IsoHub` do it.\n */\nexport function IsoDome({ at = [0, 0], radius = 158, height = 250, label, animated, part = \"both\" }: IsoDomeProps & {\n /**\n * `rim` (the floor ellipse, drawn first), `arc` (the glass, drawn last) or `both`.\n * @default \"both\"\n */\n part?: \"rim\" | \"arc\" | \"both\";\n}) {\n const e = isoCircle(at[0], at[1], 0, radius);\n const arc = `M${e.cx - e.rx} ${e.cy} A ${e.rx} ${height} 0 0 1 ${e.cx + e.rx} ${e.cy}`;\n return (\n <>\n {part !== \"arc\" && <ellipse cx={e.cx} cy={e.cy} rx={e.rx} ry={e.ry} className=\"kz-iso-rim\" />}\n {part !== \"rim\" && (\n <g>\n <path d={arc} className=\"kz-iso-dome\" />\n <path d={arc} className={cn(\"kz-iso-dome-sheen\", loop(animated))} pathLength={440} />\n {label && <IsoLabel at={at} z={height + 10} text={label} />}\n </g>\n )}\n </>\n );\n}\n\nexport interface IsoTileProps extends ItemProps {\n /** Its centre on the floor plan. */\n at: Vec2;\n /**\n * The height it floats at.\n * @default 90\n */\n z?: number;\n /**\n * Width × depth.\n * @default [76, 52]\n */\n size?: Vec2;\n /**\n * The pictogram on its top.\n * @default \"none\"\n */\n glyph?: IsoGlyph;\n /**\n * How it is lit.\n * @default \"accent\"\n */\n material?: IsoMaterial;\n /**\n * It floats gently.\n * @default true\n */\n float?: boolean;\n}\n\n/** A satellite: a thin cut-corner tile that floats beside the hero object, a pictogram on its top. */\nexport function IsoTile({ at, z = 90, size = [76, 52], glyph = \"none\", material = \"accent\", float = true, animated, ...item }: IsoTileProps) {\n const [w, d] = size;\n const top = z + 9;\n const shadow = isoCircle(at[0], at[1], 0, Math.min(w, d) * 0.55);\n const foot = project([at[0], at[1], 0]);\n return (\n <Item {...item} animated={animated} anchor={project([at[0], at[1], top])}>\n {z > 0 && (\n <>\n <ellipse cx={shadow.cx} cy={shadow.cy} rx={shadow.rx} ry={shadow.ry} className=\"kz-iso-shadow\" />\n <path d={pathOf([foot, project([at[0], at[1], z])])} className=\"kz-iso-tether\" />\n </>\n )}\n <g className={cn(float && \"kz-iso-float\", float && loop(animated))}>\n <Solid faces={prism(cutRect(at[0], at[1], w, d, Math.min(w, d) / 4), z, 9)} material={material} />\n <Glyph glyph={glyph} at={at} z={top} s={Math.min(w, d) * 0.3} />\n </g>\n </Item>\n );\n}\n\nfunction Glyph({ glyph, at: [cx, cy], z, s }: { glyph: IsoGlyph; at: Vec2; z: number; s: number }) {\n const p = (u: number, v: number) => project([cx + u * s, cy + v * s, z]);\n const line = (points: [number, number][], close = false) => <path d={pathOf(points.map(([u, v]) => p(u, v)), close)} className=\"kz-iso-glyph\" />;\n switch (glyph) {\n case \"dots\":\n return <>{[-0.8, 0, 0.8].map((u) => <circle key={u} cx={p(u, 0)[0]} cy={p(u, 0)[1]} r={s * 0.16} className=\"kz-iso-glyph-fill\" />)}</>;\n case \"lines\":\n return <>{[-0.6, 0, 0.6].map((v) => <React.Fragment key={v}>{line([[-0.9, v], [0.7, v]])}</React.Fragment>)}</>;\n case \"play\":\n return line([[-0.5, -0.7], [0.8, 0], [-0.5, 0.7]], true);\n case \"coin\":\n return (\n <>\n <path d={pathOf(hexagon(0, 0, 0.9).map(([u, v]) => p(u, v)), true)} className=\"kz-iso-glyph\" />\n <circle cx={p(0, 0)[0]} cy={p(0, 0)[1]} r={s * 0.18} className=\"kz-iso-glyph-fill\" />\n </>\n );\n case \"lock\":\n return (\n <>\n {line([[-0.6, -0.1], [0.6, -0.1], [0.6, 0.8], [-0.6, 0.8]], true)}\n {line([[-0.35, -0.1], [-0.35, -0.5], [-0.15, -0.75], [0.15, -0.75], [0.35, -0.5], [0.35, -0.1]])}\n </>\n );\n case \"arrow\":\n return (\n <>\n {line([[0.8, 0.8], [-0.6, -0.6]])}\n {line([[-0.6, 0.1], [-0.6, -0.6], [0.1, -0.6]])}\n </>\n );\n case \"flag\":\n return (\n <>\n {line([[-0.7, 0.9], [-0.7, -0.9]])}\n {line([[-0.7, -0.9], [0.8, -0.55], [-0.7, -0.1]], true)}\n </>\n );\n case \"heart\":\n return line([[0, 0.85], [-0.85, 0], [-0.85, -0.45], [-0.45, -0.8], [0, -0.45], [0.45, -0.8], [0.85, -0.45], [0.85, 0]], true);\n case \"node\":\n return <circle cx={p(0, 0)[0]} cy={p(0, 0)[1]} r={s * 0.3} className=\"kz-iso-glyph-fill\" />;\n default:\n return null;\n }\n}\n\nexport interface IsoLinkProps {\n /** Where it starts, on the floor plan. */\n from: Vec2;\n /** Where it ends, on the floor plan. */\n to: Vec2;\n /**\n * The height it runs at.\n * @default 0\n */\n z?: number;\n /**\n * `elbow` follows the floor's axes, like a circuit; `straight` goes directly.\n * @default \"elbow\"\n */\n route?: \"elbow\" | \"straight\";\n /**\n * Which way the light flows: `out` from `from` to `to`, `in` back.\n * @default \"out\"\n */\n direction?: \"out\" | \"in\";\n /**\n * Particles of light travelling along it (0: only the dashes flow).\n * @default 2\n */\n particles?: number;\n /**\n * Seconds a particle takes to cross it.\n * @default 3.6\n */\n duration?: number;\n /** A value written on it (\"90 %\", \"Tips\") — passed translated. */\n label?: string;\n /**\n * Motion: the flow and the particles. `false` draws them still, resting along the link.\n * @default true\n */\n animated?: boolean;\n}\n\n/** A dotted link on the floor, light flowing along it and particles crossing it — a flow between two objects. */\nexport function IsoLink({ from, to, z = 0, route = \"elbow\", direction = \"out\", particles = 2, duration = 3.6, label, animated }: IsoLinkProps) {\n const corner: Vec2 = [to[0], from[1]];\n const plan = route === \"elbow\" && from[0] !== to[0] && from[1] !== to[1] ? [from, corner, to] : [from, to];\n const ordered = direction === \"in\" ? [...plan].reverse() : plan;\n const d = pathOf(ordered.map(([x, y]) => project([x, y, z])));\n const mid = plan.length === 3 ? corner : ([(from[0] + to[0]) / 2, (from[1] + to[1]) / 2] as Vec2);\n return (\n <g>\n <path d={d} className={cn(\"kz-iso-link\", loop(animated))} />\n {Array.from({ length: particles }, (_, k) => (\n <circle\n key={k}\n r={3.2}\n className={cn(\"kz-iso-particle\", loop(animated))}\n style={\n {\n offsetPath: `path(\"${d}\")`,\n \"--kz-iso-at\": `${Math.round(((k + 0.5) / particles) * 100)}%`,\n \"--kz-iso-dur\": `${duration}s`,\n \"--kz-iso-delay\": `${(-duration * k) / particles}s`,\n } as Style\n }\n />\n ))}\n {label && <IsoLabel at={mid} z={z} text={label} />}\n </g>\n );\n}\n\nexport interface IsoLabelProps {\n /** Where, on the floor plan. */\n at: Vec2;\n /**\n * Its height.\n * @default 0\n */\n z?: number;\n /** The text — passed translated. */\n text: string;\n /** A first part in the accent, bolder (\"90 %\" before \" to the creator\"). */\n strong?: string;\n}\n\n/** A label in a pill, always visible, pinned to a point of the scene (a share, a name). */\nexport function IsoLabel({ at, z = 0, text, strong }: IsoLabelProps) {\n const [x, y] = project([at[0], at[1], z]);\n const chars = text.length + (strong ? strong.length + 1 : 0);\n const w = chars * 6.8 + 22;\n return (\n <g className=\"kz-iso-link-label\" aria-hidden>\n <rect x={x - w / 2} y={y - 12} width={w} height={24} rx={8} strokeWidth={1} />\n <text x={x} y={y + 4} textAnchor=\"middle\">\n {strong && <tspan className=\"kz-iso-strong\">{strong} </tspan>}\n {text}\n </text>\n </g>\n );\n}\n\n/** A satellite of an `IsoHub`. */\nexport interface IsoSatellite {\n /** Its name, shown when lifted — passed translated. */\n label: string;\n /**\n * Its pictogram.\n * @default \"none\"\n */\n glyph?: IsoGlyph;\n /**\n * The flow on its link: `in` toward the centre, `out` from it, `none` without a link.\n * @default \"in\"\n */\n flow?: \"in\" | \"out\" | \"none\";\n /** A value written on its link (\"+ €5\") — passed translated. */\n value?: string;\n /**\n * How it is lit.\n * @default \"accent\"\n */\n material?: IsoMaterial;\n}\n\nexport interface IsoHubProps extends Omit<IsoSceneProps, \"children\"> {\n /** The hero object in the centre: its stages, bottom first. */\n layers: readonly IsoLayer[];\n /**\n * The footprint of the stages.\n * @default \"cut\"\n */\n shape?: IsoShape;\n /**\n * The width of the stages.\n * @default 120\n */\n size?: number;\n /**\n * A lit core on top of the stack; a string names it.\n * @default true\n */\n core?: boolean | string;\n /** A dome over the centre: `true`, or its name (\"Your servers\"). */\n dome?: boolean | string;\n /**\n * The objects around the centre, joined to it by flows of light. The first half stands on the left, the rest on the\n * right, top to bottom: never in front of the hero, never hidden behind it.\n */\n satellites?: readonly IsoSatellite[];\n /**\n * The distance of the satellites from the centre.\n * @default 210\n */\n radius?: number;\n /** The angle of each satellite, in degrees (0: lower right, 90: lower left, 180: upper left, 270: upper right), to place them by hand. */\n angles?: readonly number[];\n /** A label pinned above the centre, its first part in the accent: `{ strong: \"90 %\", text: \"to the creator\" }`. */\n highlight?: { readonly strong?: string; readonly text: string };\n}\n\n/** Left side (centred on 135°) then right side (centred on −45°), top to bottom, 64° apart. */\nfunction sideAngles(n: number): number[] {\n const left = Math.ceil(n / 2);\n const right = n - left;\n const spread = (m: number, centre: number, sign: 1 | -1) => Array.from({ length: m }, (_, i) => centre + sign * ((m - 1) / 2 - i) * 64);\n return [...spread(left, 135, 1), ...spread(right, -45, -1)];\n}\n\n/**\n * The hero, driven by data: a stack under an optional dome, satellites on both sides, a flow of light between each\n * satellite and the centre. Objects are painted back to front and the camera frames exactly what is drawn.\n */\nexport function IsoHub({ layers, shape, size = 120, core, dome, satellites = [], radius = 210, angles, highlight, animated, viewBox, extent, ...scene }: IsoHubProps) {\n const auto = sideAngles(satellites.length);\n const placed = satellites.map((s, k) => {\n const angle = angles?.[k] ?? auto[k] ?? 0;\n const at = onCircle(radius, angle);\n // The farther back, the higher it floats: two tiles of a side never cover each other.\n return { ...s, angle, at, z: Math.round(78 - (depthOf(at) / radius) * 26), k };\n });\n const back = placed.filter((s) => depthOf(s.at) < 0);\n const front = placed.filter((s) => depthOf(s.at) >= 0);\n const stackHeight = layers.reduce((h, l) => h + (l.height ?? 22) + 4, 16) + (core === false ? 0 : 38);\n const domeR = size * 1.32;\n const domeH = Math.max(stackHeight + 80, 200);\n const crown = dome ? domeH + 24 : stackHeight + (highlight ? 62 : 12);\n // The frame: every object's screen extent (tiles with room for their label, the plinth, the dome or the crown).\n const points: Vec2[] = [\n ...placed.flatMap(({ at: [x, y], z }) => [project([x - 46, y - 46, z + 52]), project([x + 46, y + 46, z]), project([x + 46, y - 46, z]), project([x - 46, y + 46, z])]),\n ...hexagon(0, 0, size * (dome ? 1.4 : 0.95)).map(([x, y]) => project([x, y, 0])),\n project([0, 0, crown + 20]),\n ];\n const xs = points.map(([x]) => x);\n const ys = points.map(([, y]) => y);\n const half = Math.max(...xs.map(Math.abs)) + 20;\n const box = [-half, Math.min(...ys) - 12, half * 2, Math.max(...ys) - Math.min(...ys) + 40].map((n) => Math.round(n)).join(\" \");\n const tile = (s: (typeof placed)[number]) => (\n <IsoTile key={s.k} at={s.at} z={s.z} glyph={s.glyph} material={s.material} label={s.label} index={layers.length + 3 + s.k} animated={animated} />\n );\n const link = (s: (typeof placed)[number]) =>\n s.flow === \"none\" ? null : (\n <IsoLink\n key={`l${s.k}`}\n from={s.at}\n to={onCircle(size * (dome ? 1.32 : 0.8), s.angle)}\n route=\"straight\"\n direction={s.flow === \"out\" ? \"in\" : \"out\"}\n label={s.value}\n animated={animated}\n />\n );\n return (\n <IsoScene animated={animated} extent={extent ?? Math.round(radius * 1.45 + 60)} viewBox={viewBox ?? box} {...scene}>\n {placed.map(link)}\n {dome && <IsoDome radius={domeR} part=\"rim\" animated={animated} />}\n {back.map(tile)}\n <IsoStack layers={layers} shape={shape} size={size} core={core} animated={animated} />\n {dome && <IsoDome radius={domeR} height={domeH} part=\"arc\" animated={animated} label={typeof dome === \"string\" ? dome : undefined} />}\n {highlight && <IsoLabel at={[0, 0]} z={stackHeight + (dome ? 24 : 46)} strong={highlight.strong} text={highlight.text} />}\n {front.map(tile)}\n </IsoScene>\n );\n}\n"
723
+ },
724
+ {
725
+ "path": "iso/meta.ts",
726
+ "content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Iso\",\n summary:\n \"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.\",\n status: \"beta\",\n category: \"layout\",\n platforms: \"web\",\n whenToUse: [\n \"The hero illustration of a product or marketing page: what the product is, drawn as one object with two to four satellites.\",\n \"To show a flow toward or out of something (requests into a server, support toward a creator) with values written on it.\",\n \"An architecture teaser where a diagram would be too much: one object per layer, named on hover and focus.\",\n ],\n whenNotToUse: [\n { when: \"For a real architecture or data flow the reader must study: draw a schema with a text version.\" },\n { when: \"As the background of a section: the light, the dome and the grid of a backdrop are lighter.\", use: \"section-backdrop\" },\n { when: \"More than one per screen: the hero object is unique, the rest of the page stays calm.\" },\n ],\n bestPractices: [\n \"Start with `IsoHub`: stages, satellites and a highlight are data; the hub places satellites on both sides (never in front of the hero, never hidden behind it) and frames exactly what it draws.\",\n \"Name the scene (`label`) and say in `description` what it shows; name the objects (`label`) to make them explorable with the pointer and the keyboard — leave everything unnamed for a purely decorative scene.\",\n \"Put the scene in a brand (`.brand-<id>`): the light, the core and the flows follow the accent, in both themes.\",\n \"Composing by hand: paint back to front, and number the entrance with `index` so objects rise in a meaningful order.\",\n \"Pass words translated: labels, values on links, the highlight.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Tab\", action: \"Visits each named object of the scene: it lifts and shows its label, as under the pointer.\" }],\n notes: [\n \"A named scene is a `group` with its `label` and its `description` (`<desc>`); an unnamed one is decorative (`aria-hidden`).\",\n \"Each named object is an image (`role=\\\"img\\\"`) named by its label and focusable; the drawn labels are decorative copies.\",\n \"Under `prefers-reduced-motion` (and with `animated={false}`) the scene is a composed still frame: objects in place, light resting along the links — not an animation cut halfway.\",\n \"Server-rendered static SVG, no client JavaScript; with `MotionObserver` mounted its loops pause off screen and wait for the page to settle.\",\n ],\n },\n related: [\"section-backdrop\", \"number-ticker\"],\n web: {\n imports: [\"IsoHub\", \"IsoScene\", \"IsoPrism\", \"IsoStack\", \"IsoDome\", \"IsoTile\", \"IsoLink\", \"IsoNode\", \"IsoLabel\"],\n examples: [\n {\n name: \"orazaka-hero\",\n title: \"Sovereign servers (Orazaka)\",\n description: \"Three named stages under a dome, a lit core; chats and documents flow in, answers flow out. Hover or tab to explore.\",\n },\n {\n name: \"orochia-hero\",\n title: \"Support toward a creator (Orochia)\",\n description: \"The creator in the centre, tips, unlocks, auctions and challenges flowing toward them, their amounts on the links, 90 % pinned above.\",\n },\n { name: \"compose\", title: \"Composed by hand\", description: \"The primitives — scene, links, dome, prisms, node, tiles — painted back to front with an entrance order.\" },\n { name: \"still\", title: \"Still frame\", description: \"`animated={false}`: the composed picture prefers-reduced-motion shows.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
727
+ },
728
+ {
729
+ "path": "meta.ts",
730
+ "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 | \"audio-player\"\n | \"avatar\"\n | \"badge\"\n | \"button\"\n | \"card\"\n | \"checkbox\"\n | \"chip\"\n | \"chip-link\"\n | \"cn\"\n | \"combobox\"\n | \"command\"\n | \"confirm-button\"\n | \"countdown\"\n | \"data-table\"\n | \"date-picker\"\n | \"dialog\"\n | \"dropdown-menu\"\n | \"empty-state\"\n | \"field\"\n | \"file-upload\"\n | \"filter-bar\"\n | \"glow-card\"\n | \"image-cropper\"\n | \"iso\"\n | \"kbd\"\n | \"loader\"\n | \"marquee\"\n | \"mascots\"\n | \"media-capture\"\n | \"meter\"\n | \"nav-bar\"\n | \"number-ticker\"\n | \"page-header\"\n | \"pagination\"\n | \"popover\"\n | \"progress\"\n | \"radio-group\"\n | \"search-field\"\n | \"section-backdrop\"\n | \"segmented\"\n | \"separator\"\n | \"skeleton\"\n | \"slider\"\n | \"slot\"\n | \"spinner\"\n | \"stat\"\n | \"stepper\"\n | \"switch\"\n | \"tabs\"\n | \"tag-input\"\n | \"theme\"\n | \"toast\"\n | \"tooltip\"\n | \"txt\"\n | \"video-player\"\n | \"video-trimmer\";\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. `media`: video, sound, camera, files, cropping. */\nexport type Category = \"actions\" | \"forms\" | \"navigation\" | \"overlays\" | \"feedback\" | \"data-display\" | \"media\" | \"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 /**\n * The entry to import from when it is not `@krizaka/ui/native`: a component that needs an Expo module (an optional\n * peer) has its own, `@krizaka/ui/native/<name>`, so an app that does not use it never installs the module.\n */\n readonly entry?: string;\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"
731
+ }
732
+ ],
733
+ "dependencies": [],
734
+ "registryDependencies": [],
735
+ "demo": {
736
+ "path": "examples/iso/orazaka-hero.tsx",
737
+ "content": "import { IsoHub } from \"@krizaka/ui/iso\";\n\n// Sovereign servers under a dome: three stages, a lit core, requests and documents flowing in, answers flowing out.\n// Wrap it in `.brand-orazaka` (or any brand) and the light follows the brand's accent.\nexport default function IsoOrazakaHero() {\n return (\n <IsoHub\n label=\"Your AI runs on your own servers\"\n description=\"A stack of three servers — gateway, models, data — under a dome; chats and documents flow in, answers flow out.\"\n className=\"w-full max-w-xl\"\n dome=\"Your infrastructure\"\n layers={[{ label: \"Data\" }, { label: \"Models\" }, { label: \"Gateway\" }]}\n core=\"Orchestrator\"\n satellites={[\n { label: \"Chats\", glyph: \"dots\", flow: \"in\" },\n { label: \"Documents\", glyph: \"lines\", flow: \"in\", material: \"glass\" },\n { label: \"Answers\", glyph: \"arrow\", flow: \"out\" },\n ]}\n />\n );\n}\n"
738
+ },
739
+ "props": [
740
+ {
741
+ "component": "IsoDome",
742
+ "description": "A dome of light over what it protects: a rim on the floor, a glass arc, a sheen that travels along it. Draw its rim\nbefore the objects it covers and the dome after them (`part=\"rim\"`, `part=\"arc\"`), or let `IsoHub` do it.",
743
+ "props": [
744
+ {
745
+ "name": "animated",
746
+ "type": "boolean",
747
+ "default": "true",
748
+ "description": "Motion: a sheen travels along the dome. `false` keeps it still.",
749
+ "required": false
750
+ },
751
+ {
752
+ "name": "at",
753
+ "type": "Vec2",
754
+ "default": "[0, 0]",
755
+ "description": "Its centre on the floor plan.",
756
+ "required": false
757
+ },
758
+ {
759
+ "name": "height",
760
+ "type": "number",
761
+ "default": "250",
762
+ "description": "Its height.",
763
+ "required": false
764
+ },
765
+ {
766
+ "name": "label",
767
+ "type": "string",
768
+ "default": null,
769
+ "description": "Its name (\"Your infrastructure\") — passed translated; shown at the top of the dome, always.",
770
+ "required": false
771
+ },
772
+ {
773
+ "name": "part",
774
+ "type": "\"both\" | \"rim\" | \"arc\"",
775
+ "default": "both",
776
+ "description": "`rim` (the floor ellipse, drawn first), `arc` (the glass, drawn last) or `both`.",
777
+ "required": false
778
+ },
779
+ {
780
+ "name": "radius",
781
+ "type": "number",
782
+ "default": "158",
783
+ "description": "The radius of its rim on the floor.",
784
+ "required": false
785
+ }
786
+ ]
787
+ },
788
+ {
789
+ "component": "IsoHub",
790
+ "description": "The hero, driven by data: a stack under an optional dome, satellites on both sides, a flow of light between each\nsatellite and the centre. Objects are painted back to front and the camera frames exactly what is drawn.",
791
+ "props": [
792
+ {
793
+ "name": "layers",
794
+ "type": "readonly IsoLayer[]",
795
+ "default": null,
796
+ "description": "The hero object in the centre: its stages, bottom first.",
797
+ "required": true
798
+ },
799
+ {
800
+ "name": "angles",
801
+ "type": "readonly number[]",
802
+ "default": null,
803
+ "description": "The angle of each satellite, in degrees (0: lower right, 90: lower left, 180: upper left, 270: upper right), to place them by hand.",
804
+ "required": false
805
+ },
806
+ {
807
+ "name": "animated",
808
+ "type": "boolean",
809
+ "default": "true",
810
+ "description": "Motion (entrance, breathing, flow, float). `false` draws the still frame — the one prefers-reduced-motion shows.",
811
+ "required": false
812
+ },
813
+ {
814
+ "name": "core",
815
+ "type": "string | boolean",
816
+ "default": "true",
817
+ "description": "A lit core on top of the stack; a string names it.",
818
+ "required": false
819
+ },
820
+ {
821
+ "name": "description",
822
+ "type": "string",
823
+ "default": null,
824
+ "description": "A longer text version of what the scene shows, read by assistive technology.",
825
+ "required": false
826
+ },
827
+ {
828
+ "name": "dome",
829
+ "type": "string | boolean",
830
+ "default": null,
831
+ "description": "A dome over the centre: `true`, or its name (\"Your servers\").",
832
+ "required": false
833
+ },
834
+ {
835
+ "name": "extent",
836
+ "type": "number",
837
+ "default": "240",
838
+ "description": "Half the size of the floor, in world units: what the camera frames.",
839
+ "required": false
840
+ },
841
+ {
842
+ "name": "grid",
843
+ "type": "boolean",
844
+ "default": "true",
845
+ "description": "The perspective grid on the floor, fading into the page.",
846
+ "required": false
847
+ },
848
+ {
849
+ "name": "highlight",
850
+ "type": "{ readonly strong?: string; readonly text: string; }",
851
+ "default": null,
852
+ "description": "A label pinned above the centre, its first part in the accent: `{ strong: \"90 %\", text: \"to the creator\" }`.",
853
+ "required": false
854
+ },
855
+ {
856
+ "name": "label",
857
+ "type": "string",
858
+ "default": null,
859
+ "description": "The accessible name of the scene (\"A server stack under a dome\") — passed translated. Without it the scene is decorative.",
860
+ "required": false
861
+ },
862
+ {
863
+ "name": "radius",
864
+ "type": "number",
865
+ "default": "210",
866
+ "description": "The distance of the satellites from the centre.",
867
+ "required": false
868
+ },
869
+ {
870
+ "name": "satellites",
871
+ "type": "readonly IsoSatellite[]",
872
+ "default": "[]",
873
+ "description": "The objects around the centre, joined to it by flows of light. The first half stands on the left, the rest on the\nright, top to bottom: never in front of the hero, never hidden behind it.",
874
+ "required": false
875
+ },
876
+ {
877
+ "name": "shape",
878
+ "type": "IsoShape",
879
+ "default": "cut",
880
+ "description": "The footprint of the stages.",
881
+ "required": false
882
+ },
883
+ {
884
+ "name": "size",
885
+ "type": "number",
886
+ "default": "120",
887
+ "description": "The width of the stages.",
888
+ "required": false
889
+ },
890
+ {
891
+ "name": "step",
892
+ "type": "number",
893
+ "default": "40",
894
+ "description": "The spacing of the grid's lines.",
895
+ "required": false
896
+ },
897
+ {
898
+ "name": "top",
899
+ "type": "number",
900
+ "default": "260",
901
+ "description": "Height above the floor the camera keeps in view, in world units.",
902
+ "required": false
903
+ }
904
+ ]
905
+ },
906
+ {
907
+ "component": "IsoLabel",
908
+ "description": "A label in a pill, always visible, pinned to a point of the scene (a share, a name).",
909
+ "props": [
910
+ {
911
+ "name": "at",
912
+ "type": "Vec2",
913
+ "default": null,
914
+ "description": "Where, on the floor plan.",
915
+ "required": true
916
+ },
917
+ {
918
+ "name": "text",
919
+ "type": "string",
920
+ "default": null,
921
+ "description": "The text — passed translated.",
922
+ "required": true
923
+ },
924
+ {
925
+ "name": "strong",
926
+ "type": "string",
927
+ "default": null,
928
+ "description": "A first part in the accent, bolder (\"90 %\" before \" to the creator\").",
929
+ "required": false
930
+ },
931
+ {
932
+ "name": "z",
933
+ "type": "number",
934
+ "default": "0",
935
+ "description": "Its height.",
936
+ "required": false
937
+ }
938
+ ]
939
+ },
940
+ {
941
+ "component": "IsoLink",
942
+ "description": "A dotted link on the floor, light flowing along it and particles crossing it — a flow between two objects.",
943
+ "props": [
944
+ {
945
+ "name": "from",
946
+ "type": "Vec2",
947
+ "default": null,
948
+ "description": "Where it starts, on the floor plan.",
949
+ "required": true
950
+ },
951
+ {
952
+ "name": "to",
953
+ "type": "Vec2",
954
+ "default": null,
955
+ "description": "Where it ends, on the floor plan.",
956
+ "required": true
957
+ },
958
+ {
959
+ "name": "animated",
960
+ "type": "boolean",
961
+ "default": "true",
962
+ "description": "Motion: the flow and the particles. `false` draws them still, resting along the link.",
963
+ "required": false
964
+ },
965
+ {
966
+ "name": "direction",
967
+ "type": "\"in\" | \"out\"",
968
+ "default": "out",
969
+ "description": "Which way the light flows: `out` from `from` to `to`, `in` back.",
970
+ "required": false
971
+ },
972
+ {
973
+ "name": "duration",
974
+ "type": "number",
975
+ "default": "3.6",
976
+ "description": "Seconds a particle takes to cross it.",
977
+ "required": false
978
+ },
979
+ {
980
+ "name": "label",
981
+ "type": "string",
982
+ "default": null,
983
+ "description": "A value written on it (\"90 %\", \"Tips\") — passed translated.",
984
+ "required": false
985
+ },
986
+ {
987
+ "name": "particles",
988
+ "type": "number",
989
+ "default": "2",
990
+ "description": "Particles of light travelling along it (0: only the dashes flow).",
991
+ "required": false
992
+ },
993
+ {
994
+ "name": "route",
995
+ "type": "\"elbow\" | \"straight\"",
996
+ "default": "elbow",
997
+ "description": "`elbow` follows the floor's axes, like a circuit; `straight` goes directly.",
998
+ "required": false
999
+ },
1000
+ {
1001
+ "name": "z",
1002
+ "type": "number",
1003
+ "default": "0",
1004
+ "description": "The height it runs at.",
1005
+ "required": false
1006
+ }
1007
+ ]
1008
+ },
1009
+ {
1010
+ "component": "IsoNode",
1011
+ "description": "The Krizaka node: a point of light in the accent, breathing in its glow.",
1012
+ "props": [
1013
+ {
1014
+ "name": "animated",
1015
+ "type": "boolean",
1016
+ "default": "true",
1017
+ "description": "Motion: the glow breathes. `false` keeps it still.",
1018
+ "required": false
1019
+ },
1020
+ {
1021
+ "name": "at",
1022
+ "type": "Vec2",
1023
+ "default": "[0, 0]",
1024
+ "description": "Where, on the floor plan.",
1025
+ "required": false
1026
+ },
1027
+ {
1028
+ "name": "glow",
1029
+ "type": "number",
1030
+ "default": "70",
1031
+ "description": "The radius of its glow (0: none).",
1032
+ "required": false
1033
+ },
1034
+ {
1035
+ "name": "index",
1036
+ "type": "number",
1037
+ "default": "0",
1038
+ "description": "Its rank in the entrance.",
1039
+ "required": false
1040
+ },
1041
+ {
1042
+ "name": "r",
1043
+ "type": "number",
1044
+ "default": "7",
1045
+ "description": "The radius of the node.",
1046
+ "required": false
1047
+ },
1048
+ {
1049
+ "name": "z",
1050
+ "type": "number",
1051
+ "default": "0",
1052
+ "description": "Its height.",
1053
+ "required": false
1054
+ }
1055
+ ]
1056
+ },
1057
+ {
1058
+ "component": "IsoPrism",
1059
+ "description": "A vertical prism — hexagonal, cut-corner or rectangular — that stacks with others on `z`.",
1060
+ "props": [
1061
+ {
1062
+ "name": "height",
1063
+ "type": "number",
1064
+ "default": null,
1065
+ "description": "Its height.",
1066
+ "required": true
1067
+ },
1068
+ {
1069
+ "name": "animated",
1070
+ "type": "boolean",
1071
+ "default": "true",
1072
+ "description": "Motion: entrance and loops. `false` keeps this object still.",
1073
+ "required": false
1074
+ },
1075
+ {
1076
+ "name": "at",
1077
+ "type": "Vec2",
1078
+ "default": "[0, 0]",
1079
+ "description": "The centre of its footprint on the floor plan (x, y).",
1080
+ "required": false
1081
+ },
1082
+ {
1083
+ "name": "className",
1084
+ "type": "string",
1085
+ "default": null,
1086
+ "description": "Extra classes on the object's group.",
1087
+ "required": false
1088
+ },
1089
+ {
1090
+ "name": "cut",
1091
+ "type": "number",
1092
+ "default": null,
1093
+ "description": "The size of the 45° cut (`shape=\"cut\"`); a sixth of the smaller side by default.",
1094
+ "required": false
1095
+ },
1096
+ {
1097
+ "name": "index",
1098
+ "type": "number",
1099
+ "default": "0",
1100
+ "description": "Its rank in the entrance: objects rise into place one after the other.",
1101
+ "required": false
1102
+ },
1103
+ {
1104
+ "name": "label",
1105
+ "type": "string",
1106
+ "default": null,
1107
+ "description": "The name shown when the pointer (or the focus) lifts the object — passed translated. It also makes it focusable.",
1108
+ "required": false
1109
+ },
1110
+ {
1111
+ "name": "material",
1112
+ "type": "IsoMaterial",
1113
+ "default": "base",
1114
+ "description": "How it is lit.",
1115
+ "required": false
1116
+ },
1117
+ {
1118
+ "name": "shape",
1119
+ "type": "IsoShape",
1120
+ "default": "cut",
1121
+ "description": "hex · cut (45° cut corners) · rect.",
1122
+ "required": false
1123
+ },
1124
+ {
1125
+ "name": "size",
1126
+ "type": "number | Vec2",
1127
+ "default": "120",
1128
+ "description": "Its width (a number: square or hexagon's diameter) or width × depth.",
1129
+ "required": false
1130
+ },
1131
+ {
1132
+ "name": "strip",
1133
+ "type": "boolean",
1134
+ "default": null,
1135
+ "description": "A dotted light strip around its front (the LEDs of a server), blinking slowly.",
1136
+ "required": false
1137
+ },
1138
+ {
1139
+ "name": "z",
1140
+ "type": "number",
1141
+ "default": "0",
1142
+ "description": "The height of its base above the floor.",
1143
+ "required": false
1144
+ }
1145
+ ]
1146
+ },
1147
+ {
1148
+ "component": "IsoScene",
1149
+ "description": "The stage: an isometric camera over a perspective grid that fades into the page. Its animations pause off screen and\nwait for the page to settle (MotionObserver); everything stops under prefers-reduced-motion.",
1150
+ "props": [
1151
+ {
1152
+ "name": "animated",
1153
+ "type": "boolean",
1154
+ "default": "true",
1155
+ "description": "Motion (entrance, breathing, flow, float). `false` draws the still frame — the one prefers-reduced-motion shows.",
1156
+ "required": false
1157
+ },
1158
+ {
1159
+ "name": "children",
1160
+ "type": "ReactNode",
1161
+ "default": null,
1162
+ "description": "The objects, painted in order: put the farthest first (or use `IsoHub`, which sorts them).",
1163
+ "required": false
1164
+ },
1165
+ {
1166
+ "name": "description",
1167
+ "type": "string",
1168
+ "default": null,
1169
+ "description": "A longer text version of what the scene shows, read by assistive technology.",
1170
+ "required": false
1171
+ },
1172
+ {
1173
+ "name": "extent",
1174
+ "type": "number",
1175
+ "default": "240",
1176
+ "description": "Half the size of the floor, in world units: what the camera frames.",
1177
+ "required": false
1178
+ },
1179
+ {
1180
+ "name": "grid",
1181
+ "type": "boolean",
1182
+ "default": "true",
1183
+ "description": "The perspective grid on the floor, fading into the page.",
1184
+ "required": false
1185
+ },
1186
+ {
1187
+ "name": "label",
1188
+ "type": "string",
1189
+ "default": null,
1190
+ "description": "The accessible name of the scene (\"A server stack under a dome\") — passed translated. Without it the scene is decorative.",
1191
+ "required": false
1192
+ },
1193
+ {
1194
+ "name": "step",
1195
+ "type": "number",
1196
+ "default": "40",
1197
+ "description": "The spacing of the grid's lines.",
1198
+ "required": false
1199
+ },
1200
+ {
1201
+ "name": "top",
1202
+ "type": "number",
1203
+ "default": "260",
1204
+ "description": "Height above the floor the camera keeps in view, in world units.",
1205
+ "required": false
1206
+ }
1207
+ ]
1208
+ },
1209
+ {
1210
+ "component": "IsoStack",
1211
+ "description": "A stack of stages on a plinth with a lit core on top — a server, a model, a pile of layers — driven by data.",
1212
+ "props": [
1213
+ {
1214
+ "name": "layers",
1215
+ "type": "readonly IsoLayer[]",
1216
+ "default": null,
1217
+ "description": "The stages, bottom first; they stack one after the other at the entrance.",
1218
+ "required": true
1219
+ },
1220
+ {
1221
+ "name": "animated",
1222
+ "type": "boolean",
1223
+ "default": "true",
1224
+ "description": "Motion: entrance and loops. `false` keeps the stack still.",
1225
+ "required": false
1226
+ },
1227
+ {
1228
+ "name": "at",
1229
+ "type": "Vec2",
1230
+ "default": "[0, 0]",
1231
+ "description": "The centre of the stack on the floor plan.",
1232
+ "required": false
1233
+ },
1234
+ {
1235
+ "name": "core",
1236
+ "type": "string | boolean",
1237
+ "default": "true",
1238
+ "description": "A lit hexagonal core on top, its node glowing; a string names it.",
1239
+ "required": false
1240
+ },
1241
+ {
1242
+ "name": "gap",
1243
+ "type": "number",
1244
+ "default": "4",
1245
+ "description": "The space between two stages.",
1246
+ "required": false
1247
+ },
1248
+ {
1249
+ "name": "index",
1250
+ "type": "number",
1251
+ "default": "0",
1252
+ "description": "The rank of the first stage in the scene's entrance.",
1253
+ "required": false
1254
+ },
1255
+ {
1256
+ "name": "plinth",
1257
+ "type": "boolean",
1258
+ "default": "true",
1259
+ "description": "A hexagonal plinth under the stack.",
1260
+ "required": false
1261
+ },
1262
+ {
1263
+ "name": "shape",
1264
+ "type": "IsoShape",
1265
+ "default": "cut",
1266
+ "description": "The footprint of the stages.",
1267
+ "required": false
1268
+ },
1269
+ {
1270
+ "name": "size",
1271
+ "type": "number",
1272
+ "default": "120",
1273
+ "description": "The width of the stages.",
1274
+ "required": false
1275
+ }
1276
+ ]
1277
+ },
1278
+ {
1279
+ "component": "IsoTile",
1280
+ "description": "A satellite: a thin cut-corner tile that floats beside the hero object, a pictogram on its top.",
1281
+ "props": [
1282
+ {
1283
+ "name": "at",
1284
+ "type": "Vec2",
1285
+ "default": null,
1286
+ "description": "Its centre on the floor plan.",
1287
+ "required": true
1288
+ },
1289
+ {
1290
+ "name": "animated",
1291
+ "type": "boolean",
1292
+ "default": "true",
1293
+ "description": "Motion: entrance and loops. `false` keeps this object still.",
1294
+ "required": false
1295
+ },
1296
+ {
1297
+ "name": "className",
1298
+ "type": "string",
1299
+ "default": null,
1300
+ "description": "Extra classes on the object's group.",
1301
+ "required": false
1302
+ },
1303
+ {
1304
+ "name": "float",
1305
+ "type": "boolean",
1306
+ "default": "true",
1307
+ "description": "It floats gently.",
1308
+ "required": false
1309
+ },
1310
+ {
1311
+ "name": "glyph",
1312
+ "type": "IsoGlyph",
1313
+ "default": "none",
1314
+ "description": "The pictogram on its top.",
1315
+ "required": false
1316
+ },
1317
+ {
1318
+ "name": "index",
1319
+ "type": "number",
1320
+ "default": "0",
1321
+ "description": "Its rank in the entrance: objects rise into place one after the other.",
1322
+ "required": false
1323
+ },
1324
+ {
1325
+ "name": "label",
1326
+ "type": "string",
1327
+ "default": null,
1328
+ "description": "The name shown when the pointer (or the focus) lifts the object — passed translated. It also makes it focusable.",
1329
+ "required": false
1330
+ },
1331
+ {
1332
+ "name": "material",
1333
+ "type": "IsoMaterial",
1334
+ "default": "accent",
1335
+ "description": "How it is lit.",
1336
+ "required": false
1337
+ },
1338
+ {
1339
+ "name": "size",
1340
+ "type": "Vec2",
1341
+ "default": "[76, 52]",
1342
+ "description": "Width × depth.",
1343
+ "required": false
1344
+ },
1345
+ {
1346
+ "name": "z",
1347
+ "type": "number",
1348
+ "default": "90",
1349
+ "description": "The height it floats at.",
1350
+ "required": false
1351
+ }
1352
+ ]
1353
+ }
1354
+ ]
1355
+ }