@krizaka/ui 2.0.0-beta.4 → 2.0.0-beta.6

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 (667) hide show
  1. package/README.md +40 -23
  2. package/dist/{button-8La7l0V4.d.ts → button-D5aSsmxX.d.ts} +3 -3
  3. package/dist/button.d.ts +3 -3
  4. package/dist/button.js +1 -1
  5. package/dist/button.js.map +1 -1
  6. package/dist/card.js +1 -1
  7. package/dist/card.js.map +1 -1
  8. package/dist/{chunk-ZUD4U22H.js → chunk-6DJ6SQY3.js} +2 -2
  9. package/dist/chunk-6DJ6SQY3.js.map +1 -0
  10. package/dist/{chunk-3X5MVH54.js → chunk-IUGBKMJC.js} +2 -2
  11. package/dist/command.js +2 -2
  12. package/dist/confirm-button.d.ts +1 -1
  13. package/dist/confirm-button.js +1 -1
  14. package/dist/dialog.js +2 -2
  15. package/dist/dropdown-menu.js +1 -1
  16. package/dist/dropdown-menu.js.map +1 -1
  17. package/dist/index.d.ts +9 -2
  18. package/dist/index.js +90 -65
  19. package/dist/index.js.map +1 -1
  20. package/dist/motion.css +52 -2
  21. package/dist/native.d.ts +67 -4
  22. package/dist/native.js +359 -92
  23. package/dist/native.js.map +1 -1
  24. package/dist/section-backdrop.d.ts +75 -0
  25. package/dist/section-backdrop.js +27 -0
  26. package/dist/section-backdrop.js.map +1 -0
  27. package/dist/theme.d.ts +1 -1
  28. package/dist/theme.js +1 -1
  29. package/package.json +26 -12
  30. package/registry/alert.json +141 -3
  31. package/registry/avatar.json +299 -3
  32. package/registry/badge.json +233 -3
  33. package/registry/button.json +497 -4
  34. package/registry/card.json +412 -4
  35. package/registry/checkbox.json +127 -3
  36. package/registry/chip.json +394 -3
  37. package/registry/cn.json +51 -3
  38. package/registry/command.json +222 -3
  39. package/registry/confirm-button.json +170 -3
  40. package/registry/countdown.json +273 -3
  41. package/registry/dialog.json +310 -3
  42. package/registry/dropdown-menu.json +117 -4
  43. package/registry/empty-state.json +170 -3
  44. package/registry/examples/alert/danger.d.ts +4 -0
  45. package/registry/examples/alert/danger.js +22 -0
  46. package/registry/examples/alert/danger.tsx +25 -0
  47. package/registry/examples/alert/info.d.ts +4 -0
  48. package/registry/{demos/alert.js → examples/alert/info.js} +3 -3
  49. package/registry/{demos/alert.tsx → examples/alert/info.tsx} +1 -1
  50. package/registry/examples/alert/success.d.ts +4 -0
  51. package/registry/examples/alert/success.js +12 -0
  52. package/registry/examples/alert/success.tsx +15 -0
  53. package/registry/examples/alert/title-only.d.ts +4 -0
  54. package/registry/examples/alert/title-only.js +11 -0
  55. package/registry/examples/alert/title-only.tsx +5 -0
  56. package/registry/examples/alert/warning.d.ts +4 -0
  57. package/registry/examples/alert/warning.js +13 -0
  58. package/registry/examples/alert/warning.tsx +17 -0
  59. package/registry/examples/avatar/fallback.d.ts +4 -0
  60. package/registry/examples/avatar/fallback.js +11 -0
  61. package/registry/examples/avatar/fallback.tsx +6 -0
  62. package/registry/examples/avatar/group.d.ts +4 -0
  63. package/registry/examples/avatar/group.js +20 -0
  64. package/registry/examples/avatar/group.tsx +21 -0
  65. package/registry/examples/avatar/native/group.d.ts +4 -0
  66. package/registry/examples/avatar/native/group.dark.png +0 -0
  67. package/registry/examples/avatar/native/group.js +17 -0
  68. package/registry/examples/avatar/native/group.light.png +0 -0
  69. package/registry/examples/avatar/native/group.tsx +13 -0
  70. package/registry/examples/avatar/native/sizes.d.ts +4 -0
  71. package/registry/examples/avatar/native/sizes.dark.png +0 -0
  72. package/registry/examples/avatar/native/sizes.js +18 -0
  73. package/registry/examples/avatar/native/sizes.light.png +0 -0
  74. package/registry/examples/avatar/native/sizes.tsx +15 -0
  75. package/registry/examples/avatar/sizes.d.ts +4 -0
  76. package/registry/examples/avatar/sizes.js +17 -0
  77. package/registry/examples/avatar/sizes.tsx +13 -0
  78. package/registry/examples/avatar/with-image.d.ts +4 -0
  79. package/registry/{demos/avatar.js → examples/avatar/with-image.js} +3 -3
  80. package/registry/{demos/avatar.tsx → examples/avatar/with-image.tsx} +1 -1
  81. package/registry/examples/badge/accent.d.ts +4 -0
  82. package/registry/examples/badge/accent.js +11 -0
  83. package/registry/examples/badge/accent.tsx +9 -0
  84. package/registry/examples/badge/danger.d.ts +4 -0
  85. package/registry/examples/badge/danger.js +11 -0
  86. package/registry/examples/badge/danger.tsx +9 -0
  87. package/registry/examples/badge/medium.d.ts +4 -0
  88. package/registry/examples/badge/medium.js +11 -0
  89. package/registry/examples/badge/medium.tsx +9 -0
  90. package/registry/examples/badge/native/dot.d.ts +4 -0
  91. package/registry/examples/badge/native/dot.dark.png +0 -0
  92. package/registry/examples/badge/native/dot.js +15 -0
  93. package/registry/examples/badge/native/dot.light.png +0 -0
  94. package/registry/examples/badge/native/dot.tsx +16 -0
  95. package/registry/examples/badge/native/scrim.d.ts +4 -0
  96. package/registry/examples/badge/native/scrim.dark.png +0 -0
  97. package/registry/examples/badge/native/scrim.js +13 -0
  98. package/registry/examples/badge/native/scrim.light.png +0 -0
  99. package/registry/examples/badge/native/scrim.tsx +14 -0
  100. package/registry/examples/badge/native/tones.d.ts +4 -0
  101. package/registry/examples/badge/native/tones.dark.png +0 -0
  102. package/registry/examples/badge/native/tones.js +18 -0
  103. package/registry/examples/badge/native/tones.light.png +0 -0
  104. package/registry/examples/badge/native/tones.tsx +14 -0
  105. package/registry/examples/badge/neutral.d.ts +4 -0
  106. package/registry/{demos/badge.js → examples/badge/neutral.js} +3 -3
  107. package/registry/{demos/badge.tsx → examples/badge/neutral.tsx} +1 -1
  108. package/registry/examples/badge/scrim.d.ts +4 -0
  109. package/registry/examples/badge/scrim.js +11 -0
  110. package/registry/examples/badge/scrim.tsx +10 -0
  111. package/registry/examples/badge/success.d.ts +4 -0
  112. package/registry/examples/badge/success.js +11 -0
  113. package/registry/examples/badge/success.tsx +9 -0
  114. package/registry/examples/badge/warning.d.ts +4 -0
  115. package/registry/examples/badge/warning.js +11 -0
  116. package/registry/examples/badge/warning.tsx +9 -0
  117. package/registry/examples/button/as-child-link.d.ts +4 -0
  118. package/registry/examples/button/as-child-link.js +11 -0
  119. package/registry/examples/button/as-child-link.tsx +10 -0
  120. package/registry/examples/button/danger.d.ts +4 -0
  121. package/registry/examples/button/danger.js +11 -0
  122. package/registry/examples/button/danger.tsx +5 -0
  123. package/registry/examples/button/disabled.d.ts +4 -0
  124. package/registry/examples/button/disabled.js +11 -0
  125. package/registry/examples/button/disabled.tsx +9 -0
  126. package/registry/examples/button/ghost.d.ts +4 -0
  127. package/registry/examples/button/ghost.js +11 -0
  128. package/registry/examples/button/ghost.tsx +5 -0
  129. package/registry/examples/button/icon.d.ts +4 -0
  130. package/registry/examples/button/icon.js +14 -0
  131. package/registry/examples/button/icon.tsx +18 -0
  132. package/registry/examples/button/loading.d.ts +4 -0
  133. package/registry/examples/button/loading.js +11 -0
  134. package/registry/examples/button/loading.tsx +10 -0
  135. package/registry/examples/button/native/danger.d.ts +4 -0
  136. package/registry/examples/button/native/danger.dark.png +0 -0
  137. package/registry/examples/button/native/danger.js +12 -0
  138. package/registry/examples/button/native/danger.light.png +0 -0
  139. package/registry/examples/button/native/danger.tsx +5 -0
  140. package/registry/examples/button/native/disabled.d.ts +4 -0
  141. package/registry/examples/button/native/disabled.dark.png +0 -0
  142. package/registry/examples/button/native/disabled.js +11 -0
  143. package/registry/examples/button/native/disabled.light.png +0 -0
  144. package/registry/examples/button/native/disabled.tsx +5 -0
  145. package/registry/examples/button/native/ghost.d.ts +4 -0
  146. package/registry/examples/button/native/ghost.dark.png +0 -0
  147. package/registry/examples/button/native/ghost.js +12 -0
  148. package/registry/examples/button/native/ghost.light.png +0 -0
  149. package/registry/examples/button/native/ghost.tsx +5 -0
  150. package/registry/examples/button/native/icon-only.d.ts +4 -0
  151. package/registry/examples/button/native/icon-only.dark.png +0 -0
  152. package/registry/examples/button/native/icon-only.js +19 -0
  153. package/registry/examples/button/native/icon-only.light.png +0 -0
  154. package/registry/examples/button/native/icon-only.tsx +21 -0
  155. package/registry/examples/button/native/icon.d.ts +4 -0
  156. package/registry/examples/button/native/icon.dark.png +0 -0
  157. package/registry/examples/button/native/icon.js +16 -0
  158. package/registry/examples/button/native/icon.light.png +0 -0
  159. package/registry/examples/button/native/icon.tsx +15 -0
  160. package/registry/examples/button/native/loading.d.ts +4 -0
  161. package/registry/examples/button/native/loading.dark.png +0 -0
  162. package/registry/examples/button/native/loading.js +11 -0
  163. package/registry/examples/button/native/loading.light.png +0 -0
  164. package/registry/examples/button/native/loading.tsx +6 -0
  165. package/registry/examples/button/native/outline.d.ts +4 -0
  166. package/registry/examples/button/native/outline.dark.png +0 -0
  167. package/registry/examples/button/native/outline.js +12 -0
  168. package/registry/examples/button/native/outline.light.png +0 -0
  169. package/registry/examples/button/native/outline.tsx +5 -0
  170. package/registry/examples/button/native/primary.d.ts +4 -0
  171. package/registry/examples/button/native/primary.dark.png +0 -0
  172. package/registry/examples/button/native/primary.js +12 -0
  173. package/registry/examples/button/native/primary.light.png +0 -0
  174. package/registry/examples/button/native/primary.tsx +5 -0
  175. package/registry/examples/button/native/secondary.d.ts +4 -0
  176. package/registry/examples/button/native/secondary.dark.png +0 -0
  177. package/registry/examples/button/native/secondary.js +12 -0
  178. package/registry/examples/button/native/secondary.light.png +0 -0
  179. package/registry/examples/button/native/secondary.tsx +6 -0
  180. package/registry/examples/button/native/sizes.d.ts +4 -0
  181. package/registry/examples/button/native/sizes.dark.png +0 -0
  182. package/registry/examples/button/native/sizes.js +15 -0
  183. package/registry/examples/button/native/sizes.light.png +0 -0
  184. package/registry/examples/button/native/sizes.tsx +11 -0
  185. package/registry/examples/button/outline.d.ts +4 -0
  186. package/registry/examples/button/outline.js +11 -0
  187. package/registry/examples/button/outline.tsx +5 -0
  188. package/registry/examples/button/pill.d.ts +4 -0
  189. package/registry/examples/button/pill.js +11 -0
  190. package/registry/examples/button/pill.tsx +9 -0
  191. package/registry/examples/button/primary.d.ts +4 -0
  192. package/registry/{demos/button.js → examples/button/primary.js} +3 -3
  193. package/registry/{demos/button.tsx → examples/button/primary.tsx} +1 -1
  194. package/registry/examples/button/secondary.d.ts +4 -0
  195. package/registry/examples/button/secondary.js +11 -0
  196. package/registry/examples/button/secondary.tsx +6 -0
  197. package/registry/examples/button/sizes.d.ts +4 -0
  198. package/registry/examples/button/sizes.js +15 -0
  199. package/registry/examples/button/sizes.tsx +17 -0
  200. package/registry/examples/card/interactive-link.d.ts +4 -0
  201. package/registry/examples/card/interactive-link.js +15 -0
  202. package/registry/examples/card/interactive-link.tsx +16 -0
  203. package/registry/examples/card/media-card.d.ts +4 -0
  204. package/registry/{demos/card.js → examples/card/media-card.js} +3 -3
  205. package/registry/{demos/card.tsx → examples/card/media-card.tsx} +1 -1
  206. package/registry/examples/card/media-fallback.d.ts +4 -0
  207. package/registry/examples/card/media-fallback.js +18 -0
  208. package/registry/examples/card/media-fallback.tsx +22 -0
  209. package/registry/examples/card/native/body.d.ts +4 -0
  210. package/registry/examples/card/native/body.dark.png +0 -0
  211. package/registry/examples/card/native/body.js +15 -0
  212. package/registry/examples/card/native/body.light.png +0 -0
  213. package/registry/examples/card/native/body.tsx +13 -0
  214. package/registry/examples/card/native/default.d.ts +4 -0
  215. package/registry/examples/card/native/default.dark.png +0 -0
  216. package/registry/examples/card/native/default.js +24 -0
  217. package/registry/examples/card/native/default.light.png +0 -0
  218. package/registry/examples/card/native/default.tsx +28 -0
  219. package/registry/examples/card/native/elevated.d.ts +4 -0
  220. package/registry/examples/card/native/elevated.dark.png +0 -0
  221. package/registry/examples/card/native/elevated.js +24 -0
  222. package/registry/examples/card/native/elevated.light.png +0 -0
  223. package/registry/examples/card/native/elevated.tsx +28 -0
  224. package/registry/examples/card/native/pressable.d.ts +4 -0
  225. package/registry/examples/card/native/pressable.dark.png +0 -0
  226. package/registry/examples/card/native/pressable.js +15 -0
  227. package/registry/examples/card/native/pressable.light.png +0 -0
  228. package/registry/examples/card/native/pressable.tsx +13 -0
  229. package/registry/examples/card/reveal-grid.d.ts +4 -0
  230. package/registry/examples/card/reveal-grid.js +28 -0
  231. package/registry/examples/card/reveal-grid.tsx +31 -0
  232. package/registry/examples/card/stat-card.d.ts +4 -0
  233. package/registry/examples/card/stat-card.js +18 -0
  234. package/registry/examples/card/stat-card.tsx +17 -0
  235. package/registry/examples/checkbox/checked.d.ts +4 -0
  236. package/registry/examples/checkbox/checked.js +11 -0
  237. package/registry/examples/checkbox/checked.tsx +5 -0
  238. package/registry/examples/checkbox/disabled.d.ts +4 -0
  239. package/registry/examples/checkbox/disabled.js +14 -0
  240. package/registry/examples/checkbox/disabled.tsx +12 -0
  241. package/registry/examples/checkbox/indeterminate.d.ts +4 -0
  242. package/registry/examples/checkbox/indeterminate.js +11 -0
  243. package/registry/examples/checkbox/indeterminate.tsx +6 -0
  244. package/registry/examples/checkbox/invalid.d.ts +4 -0
  245. package/registry/examples/checkbox/invalid.js +15 -0
  246. package/registry/examples/checkbox/invalid.tsx +14 -0
  247. package/registry/examples/checkbox/unchecked.d.ts +4 -0
  248. package/registry/{demos/checkbox.js → examples/checkbox/unchecked.js} +3 -3
  249. package/registry/{demos/checkbox.tsx → examples/checkbox/unchecked.tsx} +2 -1
  250. package/registry/examples/chip/multiple.d.ts +4 -0
  251. package/registry/examples/chip/multiple.js +16 -0
  252. package/registry/examples/chip/multiple.tsx +12 -0
  253. package/registry/examples/chip/native/multiple.d.ts +4 -0
  254. package/registry/examples/chip/native/multiple.dark.png +0 -0
  255. package/registry/examples/chip/native/multiple.js +18 -0
  256. package/registry/examples/chip/native/multiple.light.png +0 -0
  257. package/registry/examples/chip/native/multiple.tsx +17 -0
  258. package/registry/examples/chip/native/removable.d.ts +4 -0
  259. package/registry/examples/chip/native/removable.dark.png +0 -0
  260. package/registry/examples/chip/native/removable.js +17 -0
  261. package/registry/examples/chip/native/removable.light.png +0 -0
  262. package/registry/examples/chip/native/removable.tsx +15 -0
  263. package/registry/examples/chip/native/single.d.ts +4 -0
  264. package/registry/examples/chip/native/single.dark.png +0 -0
  265. package/registry/examples/chip/native/single.js +15 -0
  266. package/registry/examples/chip/native/single.light.png +0 -0
  267. package/registry/examples/chip/native/single.tsx +11 -0
  268. package/registry/examples/chip/native/toggle.d.ts +4 -0
  269. package/registry/examples/chip/native/toggle.dark.png +0 -0
  270. package/registry/examples/chip/native/toggle.js +17 -0
  271. package/registry/examples/chip/native/toggle.light.png +0 -0
  272. package/registry/examples/chip/native/toggle.tsx +16 -0
  273. package/registry/examples/chip/removable.d.ts +4 -0
  274. package/registry/examples/chip/removable.js +16 -0
  275. package/registry/examples/chip/removable.tsx +15 -0
  276. package/registry/examples/chip/single.d.ts +4 -0
  277. package/registry/examples/chip/single.js +16 -0
  278. package/registry/examples/chip/single.tsx +13 -0
  279. package/registry/examples/chip/small.d.ts +4 -0
  280. package/registry/examples/chip/small.js +16 -0
  281. package/registry/examples/chip/small.tsx +12 -0
  282. package/registry/examples/chip/toggle.d.ts +4 -0
  283. package/registry/{demos/chip.js → examples/chip/toggle.js} +3 -3
  284. package/registry/{demos/chip.tsx → examples/chip/toggle.tsx} +2 -1
  285. package/registry/examples/cn/merge.d.ts +4 -0
  286. package/registry/{demos/cn.js → examples/cn/merge.js} +3 -3
  287. package/registry/{demos/cn.tsx → examples/cn/merge.tsx} +1 -1
  288. package/registry/examples/command/dialog.d.ts +4 -0
  289. package/registry/examples/command/dialog.js +40 -0
  290. package/registry/examples/command/dialog.tsx +36 -0
  291. package/registry/examples/command/inline.d.ts +4 -0
  292. package/registry/{demos/command.js → examples/command/inline.js} +3 -3
  293. package/registry/{demos/command.tsx → examples/command/inline.tsx} +1 -1
  294. package/registry/examples/confirm-button/armed.d.ts +4 -0
  295. package/registry/examples/confirm-button/armed.js +12 -0
  296. package/registry/examples/confirm-button/armed.tsx +14 -0
  297. package/registry/examples/confirm-button/idle.d.ts +4 -0
  298. package/registry/{demos/confirm-button.js → examples/confirm-button/idle.js} +3 -3
  299. package/registry/{demos/confirm-button.tsx → examples/confirm-button/idle.tsx} +1 -1
  300. package/registry/examples/confirm-button/with-text.d.ts +4 -0
  301. package/registry/examples/confirm-button/with-text.js +12 -0
  302. package/registry/examples/confirm-button/with-text.tsx +12 -0
  303. package/registry/examples/countdown/days.d.ts +4 -0
  304. package/registry/examples/countdown/days.js +13 -0
  305. package/registry/examples/countdown/days.tsx +10 -0
  306. package/registry/examples/countdown/ended.d.ts +4 -0
  307. package/registry/examples/countdown/ended.js +13 -0
  308. package/registry/examples/countdown/ended.tsx +10 -0
  309. package/registry/examples/countdown/hours.d.ts +4 -0
  310. package/registry/{demos/countdown.js → examples/countdown/hours.js} +3 -3
  311. package/registry/{demos/countdown.tsx → examples/countdown/hours.tsx} +1 -1
  312. package/registry/examples/countdown/native/days.d.ts +4 -0
  313. package/registry/examples/countdown/native/days.dark.png +0 -0
  314. package/registry/examples/countdown/native/days.js +13 -0
  315. package/registry/examples/countdown/native/days.light.png +0 -0
  316. package/registry/examples/countdown/native/days.tsx +7 -0
  317. package/registry/examples/countdown/native/hours.d.ts +4 -0
  318. package/registry/examples/countdown/native/hours.dark.png +0 -0
  319. package/registry/examples/countdown/native/hours.js +13 -0
  320. package/registry/examples/countdown/native/hours.light.png +0 -0
  321. package/registry/examples/countdown/native/hours.tsx +7 -0
  322. package/registry/examples/countdown/native/sizes.d.ts +4 -0
  323. package/registry/examples/countdown/native/sizes.dark.png +0 -0
  324. package/registry/examples/countdown/native/sizes.js +18 -0
  325. package/registry/examples/countdown/native/sizes.light.png +0 -0
  326. package/registry/examples/countdown/native/sizes.tsx +15 -0
  327. package/registry/examples/countdown/native/urgent.d.ts +4 -0
  328. package/registry/examples/countdown/native/urgent.dark.png +0 -0
  329. package/registry/examples/countdown/native/urgent.js +13 -0
  330. package/registry/examples/countdown/native/urgent.light.png +0 -0
  331. package/registry/examples/countdown/native/urgent.tsx +7 -0
  332. package/registry/examples/countdown/sizes.d.ts +4 -0
  333. package/registry/examples/countdown/sizes.js +18 -0
  334. package/registry/examples/countdown/sizes.tsx +17 -0
  335. package/registry/examples/countdown/urgent.d.ts +4 -0
  336. package/registry/examples/countdown/urgent.js +13 -0
  337. package/registry/examples/countdown/urgent.tsx +10 -0
  338. package/registry/examples/dialog/alert-destructive.d.ts +4 -0
  339. package/registry/examples/dialog/alert-destructive.js +24 -0
  340. package/registry/examples/dialog/alert-destructive.tsx +20 -0
  341. package/registry/examples/dialog/bottom.d.ts +4 -0
  342. package/registry/examples/dialog/bottom.js +29 -0
  343. package/registry/examples/dialog/bottom.tsx +32 -0
  344. package/registry/examples/dialog/center.d.ts +4 -0
  345. package/registry/{demos/dialog.js → examples/dialog/center.js} +3 -3
  346. package/registry/{demos/dialog.tsx → examples/dialog/center.tsx} +1 -1
  347. package/registry/examples/dialog/gate.d.ts +4 -0
  348. package/registry/examples/dialog/gate.js +24 -0
  349. package/registry/examples/dialog/gate.tsx +27 -0
  350. package/registry/examples/dialog/right.d.ts +4 -0
  351. package/registry/examples/dialog/right.js +29 -0
  352. package/registry/examples/dialog/right.tsx +32 -0
  353. package/registry/examples/dialog/sheet-form.d.ts +4 -0
  354. package/registry/examples/dialog/sheet-form.js +35 -0
  355. package/registry/examples/dialog/sheet-form.tsx +36 -0
  356. package/registry/examples/dropdown-menu/actions.d.ts +4 -0
  357. package/registry/{demos/dropdown-menu.js → examples/dropdown-menu/actions.js} +3 -3
  358. package/registry/{demos/dropdown-menu.tsx → examples/dropdown-menu/actions.tsx} +1 -1
  359. package/registry/examples/empty-state/default.d.ts +4 -0
  360. package/registry/{demos/empty-state.js → examples/empty-state/default.js} +3 -3
  361. package/registry/{demos/empty-state.tsx → examples/empty-state/default.tsx} +1 -1
  362. package/registry/examples/empty-state/native/default.d.ts +4 -0
  363. package/registry/examples/empty-state/native/default.dark.png +0 -0
  364. package/registry/examples/empty-state/native/default.js +25 -0
  365. package/registry/examples/empty-state/native/default.light.png +0 -0
  366. package/registry/examples/empty-state/native/default.tsx +25 -0
  367. package/registry/examples/empty-state/title-only.d.ts +4 -0
  368. package/registry/examples/empty-state/title-only.js +11 -0
  369. package/registry/examples/empty-state/title-only.tsx +5 -0
  370. package/registry/examples/empty-state/with-action.d.ts +4 -0
  371. package/registry/examples/empty-state/with-action.js +24 -0
  372. package/registry/examples/empty-state/with-action.tsx +25 -0
  373. package/registry/examples/field/default.d.ts +4 -0
  374. package/registry/{demos/field.js → examples/field/default.js} +3 -3
  375. package/registry/{demos/field.tsx → examples/field/default.tsx} +1 -1
  376. package/registry/examples/field/disabled.d.ts +4 -0
  377. package/registry/examples/field/disabled.js +14 -0
  378. package/registry/examples/field/disabled.tsx +10 -0
  379. package/registry/examples/field/invalid.d.ts +4 -0
  380. package/registry/examples/field/invalid.js +15 -0
  381. package/registry/examples/field/invalid.tsx +12 -0
  382. package/registry/examples/field/select.d.ts +4 -0
  383. package/registry/examples/field/select.js +18 -0
  384. package/registry/examples/field/select.tsx +15 -0
  385. package/registry/examples/field/textarea.d.ts +4 -0
  386. package/registry/examples/field/textarea.js +14 -0
  387. package/registry/examples/field/textarea.tsx +10 -0
  388. package/registry/examples/kbd/key.d.ts +4 -0
  389. package/registry/{demos/kbd.js → examples/kbd/key.js} +3 -3
  390. package/registry/{demos/kbd.tsx → examples/kbd/key.tsx} +1 -1
  391. package/registry/examples/kbd/shortcut.d.ts +4 -0
  392. package/registry/examples/kbd/shortcut.js +15 -0
  393. package/registry/examples/kbd/shortcut.tsx +11 -0
  394. package/registry/examples/kbd/small.d.ts +4 -0
  395. package/registry/examples/kbd/small.js +11 -0
  396. package/registry/examples/kbd/small.tsx +5 -0
  397. package/registry/examples/page-header/default.d.ts +4 -0
  398. package/registry/{demos/page-header.js → examples/page-header/default.js} +3 -3
  399. package/registry/{demos/page-header.tsx → examples/page-header/default.tsx} +1 -1
  400. package/registry/examples/page-header/with-actions.d.ts +4 -0
  401. package/registry/examples/page-header/with-actions.js +22 -0
  402. package/registry/examples/page-header/with-actions.tsx +17 -0
  403. package/registry/examples/page-header/with-breadcrumb.d.ts +4 -0
  404. package/registry/examples/page-header/with-breadcrumb.js +24 -0
  405. package/registry/examples/page-header/with-breadcrumb.tsx +26 -0
  406. package/registry/examples/popover/form.d.ts +4 -0
  407. package/registry/{demos/popover.js → examples/popover/form.js} +3 -3
  408. package/registry/{demos/popover.tsx → examples/popover/form.tsx} +1 -1
  409. package/registry/examples/progress/bar-indeterminate.d.ts +4 -0
  410. package/registry/examples/progress/bar-indeterminate.js +11 -0
  411. package/registry/examples/progress/bar-indeterminate.tsx +6 -0
  412. package/registry/examples/progress/bar-sizes.d.ts +4 -0
  413. package/registry/examples/progress/bar-sizes.js +15 -0
  414. package/registry/examples/progress/bar-sizes.tsx +11 -0
  415. package/registry/examples/progress/bar.d.ts +4 -0
  416. package/registry/{demos/progress.js → examples/progress/bar.js} +3 -3
  417. package/registry/{demos/progress.tsx → examples/progress/bar.tsx} +1 -1
  418. package/registry/examples/progress/native/bar.d.ts +4 -0
  419. package/registry/examples/progress/native/bar.dark.png +0 -0
  420. package/registry/examples/progress/native/bar.js +16 -0
  421. package/registry/examples/progress/native/bar.light.png +0 -0
  422. package/registry/examples/progress/native/bar.tsx +12 -0
  423. package/registry/examples/progress/native/indeterminate.d.ts +4 -0
  424. package/registry/examples/progress/native/indeterminate.dark.png +0 -0
  425. package/registry/examples/progress/native/indeterminate.js +15 -0
  426. package/registry/examples/progress/native/indeterminate.light.png +0 -0
  427. package/registry/examples/progress/native/indeterminate.tsx +12 -0
  428. package/registry/examples/progress/native/ring.d.ts +4 -0
  429. package/registry/examples/progress/native/ring.dark.png +0 -0
  430. package/registry/examples/progress/native/ring.js +19 -0
  431. package/registry/examples/progress/native/ring.light.png +0 -0
  432. package/registry/examples/progress/native/ring.tsx +19 -0
  433. package/registry/examples/progress/ring-indeterminate.d.ts +4 -0
  434. package/registry/examples/progress/ring-indeterminate.js +11 -0
  435. package/registry/examples/progress/ring-indeterminate.tsx +5 -0
  436. package/registry/examples/progress/ring.d.ts +4 -0
  437. package/registry/examples/progress/ring.js +18 -0
  438. package/registry/examples/progress/ring.tsx +17 -0
  439. package/registry/examples/radio-group/cards.d.ts +4 -0
  440. package/registry/examples/radio-group/cards.js +19 -0
  441. package/registry/examples/radio-group/cards.tsx +21 -0
  442. package/registry/examples/radio-group/horizontal.d.ts +4 -0
  443. package/registry/examples/radio-group/horizontal.js +15 -0
  444. package/registry/examples/radio-group/horizontal.tsx +12 -0
  445. package/registry/examples/radio-group/items.d.ts +4 -0
  446. package/registry/{demos/radio-group.js → examples/radio-group/items.js} +3 -3
  447. package/registry/{demos/radio-group.tsx → examples/radio-group/items.tsx} +1 -1
  448. package/registry/examples/section-backdrop/depth-of-field.d.ts +4 -0
  449. package/registry/examples/section-backdrop/depth-of-field.js +18 -0
  450. package/registry/examples/section-backdrop/depth-of-field.tsx +13 -0
  451. package/registry/examples/section-backdrop/hero.d.ts +4 -0
  452. package/registry/examples/section-backdrop/hero.js +14 -0
  453. package/registry/examples/section-backdrop/hero.tsx +10 -0
  454. package/registry/examples/section-backdrop/plain.d.ts +4 -0
  455. package/registry/examples/section-backdrop/plain.js +11 -0
  456. package/registry/examples/section-backdrop/plain.tsx +10 -0
  457. package/registry/examples/section-backdrop/sequence.d.ts +4 -0
  458. package/registry/examples/section-backdrop/sequence.js +14 -0
  459. package/registry/examples/section-backdrop/sequence.tsx +15 -0
  460. package/registry/examples/section-backdrop/up.d.ts +4 -0
  461. package/registry/examples/section-backdrop/up.js +11 -0
  462. package/registry/examples/section-backdrop/up.tsx +10 -0
  463. package/registry/examples/segmented/native/default.d.ts +4 -0
  464. package/registry/examples/segmented/native/default.dark.png +0 -0
  465. package/registry/examples/segmented/native/default.js +19 -0
  466. package/registry/examples/segmented/native/default.light.png +0 -0
  467. package/registry/examples/segmented/native/default.tsx +19 -0
  468. package/registry/examples/segmented/native/small.d.ts +4 -0
  469. package/registry/examples/segmented/native/small.dark.png +0 -0
  470. package/registry/examples/segmented/native/small.js +19 -0
  471. package/registry/examples/segmented/native/small.light.png +0 -0
  472. package/registry/examples/segmented/native/small.tsx +19 -0
  473. package/registry/examples/separator/horizontal.d.ts +4 -0
  474. package/registry/{demos/separator.js → examples/separator/horizontal.js} +3 -3
  475. package/registry/{demos/separator.tsx → examples/separator/horizontal.tsx} +1 -1
  476. package/registry/examples/separator/vertical.d.ts +4 -0
  477. package/registry/examples/separator/vertical.js +17 -0
  478. package/registry/examples/separator/vertical.tsx +14 -0
  479. package/registry/examples/skeleton/circle.d.ts +4 -0
  480. package/registry/examples/skeleton/circle.js +11 -0
  481. package/registry/examples/skeleton/circle.tsx +5 -0
  482. package/registry/examples/skeleton/composition.d.ts +4 -0
  483. package/registry/{demos/skeleton.js → examples/skeleton/composition.js} +3 -3
  484. package/registry/{demos/skeleton.tsx → examples/skeleton/composition.tsx} +1 -1
  485. package/registry/examples/skeleton/native/shapes.d.ts +4 -0
  486. package/registry/examples/skeleton/native/shapes.dark.png +0 -0
  487. package/registry/examples/skeleton/native/shapes.js +21 -0
  488. package/registry/examples/skeleton/native/shapes.light.png +0 -0
  489. package/registry/examples/skeleton/native/shapes.tsx +18 -0
  490. package/registry/examples/skeleton/rect.d.ts +4 -0
  491. package/registry/examples/skeleton/rect.js +11 -0
  492. package/registry/examples/skeleton/rect.tsx +5 -0
  493. package/registry/examples/skeleton/text.d.ts +4 -0
  494. package/registry/examples/skeleton/text.js +11 -0
  495. package/registry/examples/skeleton/text.tsx +5 -0
  496. package/registry/examples/slider/centred.d.ts +4 -0
  497. package/registry/examples/slider/centred.js +11 -0
  498. package/registry/examples/slider/centred.tsx +8 -0
  499. package/registry/examples/slider/default.d.ts +4 -0
  500. package/registry/{demos/slider.js → examples/slider/default.js} +3 -3
  501. package/registry/{demos/slider.tsx → examples/slider/default.tsx} +1 -1
  502. package/registry/examples/slider/disabled.d.ts +4 -0
  503. package/registry/examples/slider/disabled.js +11 -0
  504. package/registry/examples/slider/disabled.tsx +5 -0
  505. package/registry/examples/slider/range.d.ts +4 -0
  506. package/registry/examples/slider/range.js +22 -0
  507. package/registry/examples/slider/range.tsx +18 -0
  508. package/registry/examples/slider/with-label.d.ts +4 -0
  509. package/registry/examples/slider/with-label.js +11 -0
  510. package/registry/examples/slider/with-label.tsx +8 -0
  511. package/registry/examples/slot/as-child.d.ts +4 -0
  512. package/registry/{demos/slot.js → examples/slot/as-child.js} +3 -3
  513. package/registry/{demos/slot.tsx → examples/slot/as-child.tsx} +1 -1
  514. package/registry/examples/slot/visually-hidden.d.ts +4 -0
  515. package/registry/examples/slot/visually-hidden.js +14 -0
  516. package/registry/examples/slot/visually-hidden.tsx +13 -0
  517. package/registry/examples/spinner/default.d.ts +4 -0
  518. package/registry/{demos/spinner.js → examples/spinner/default.js} +3 -3
  519. package/registry/{demos/spinner.tsx → examples/spinner/default.tsx} +1 -1
  520. package/registry/examples/spinner/muted.d.ts +4 -0
  521. package/registry/examples/spinner/muted.js +11 -0
  522. package/registry/examples/spinner/muted.tsx +6 -0
  523. package/registry/examples/spinner/native/sizes.d.ts +4 -0
  524. package/registry/examples/spinner/native/sizes.dark.png +0 -0
  525. package/registry/examples/spinner/native/sizes.js +16 -0
  526. package/registry/examples/spinner/native/sizes.light.png +0 -0
  527. package/registry/examples/spinner/native/sizes.tsx +13 -0
  528. package/registry/examples/spinner/sizes.d.ts +4 -0
  529. package/registry/examples/spinner/sizes.js +15 -0
  530. package/registry/examples/spinner/sizes.tsx +11 -0
  531. package/registry/examples/stat/down.d.ts +4 -0
  532. package/registry/examples/stat/down.js +11 -0
  533. package/registry/examples/stat/down.tsx +5 -0
  534. package/registry/examples/stat/flat.d.ts +4 -0
  535. package/registry/examples/stat/flat.js +11 -0
  536. package/registry/examples/stat/flat.tsx +5 -0
  537. package/registry/examples/stat/plain.d.ts +4 -0
  538. package/registry/examples/stat/plain.js +11 -0
  539. package/registry/examples/stat/plain.tsx +5 -0
  540. package/registry/examples/stat/row.d.ts +4 -0
  541. package/registry/examples/stat/row.js +15 -0
  542. package/registry/examples/stat/row.tsx +12 -0
  543. package/registry/examples/stat/up.d.ts +4 -0
  544. package/registry/{demos/stat.js → examples/stat/up.js} +3 -3
  545. package/registry/{demos/stat.tsx → examples/stat/up.tsx} +1 -1
  546. package/registry/examples/switch/disabled.d.ts +4 -0
  547. package/registry/examples/switch/disabled.js +14 -0
  548. package/registry/examples/switch/disabled.tsx +10 -0
  549. package/registry/examples/switch/off.d.ts +4 -0
  550. package/registry/{demos/switch.js → examples/switch/off.js} +3 -3
  551. package/registry/{demos/switch.tsx → examples/switch/off.tsx} +1 -1
  552. package/registry/examples/switch/on.d.ts +4 -0
  553. package/registry/examples/switch/on.js +11 -0
  554. package/registry/examples/switch/on.tsx +5 -0
  555. package/registry/examples/switch/small.d.ts +4 -0
  556. package/registry/examples/switch/small.js +11 -0
  557. package/registry/examples/switch/small.tsx +5 -0
  558. package/registry/examples/switch/with-label.d.ts +4 -0
  559. package/registry/examples/switch/with-label.js +18 -0
  560. package/registry/examples/switch/with-label.tsx +17 -0
  561. package/registry/examples/tabs/pills.d.ts +4 -0
  562. package/registry/examples/tabs/pills.js +20 -0
  563. package/registry/examples/tabs/pills.tsx +23 -0
  564. package/registry/examples/tabs/segmented.d.ts +4 -0
  565. package/registry/examples/tabs/segmented.js +20 -0
  566. package/registry/examples/tabs/segmented.tsx +23 -0
  567. package/registry/examples/tabs/underline.d.ts +4 -0
  568. package/registry/{demos/tabs.js → examples/tabs/underline.js} +3 -3
  569. package/registry/{demos/tabs.tsx → examples/tabs/underline.tsx} +1 -1
  570. package/registry/examples/tabs/vertical.d.ts +4 -0
  571. package/registry/examples/tabs/vertical.js +20 -0
  572. package/registry/examples/tabs/vertical.tsx +23 -0
  573. package/registry/examples/theme/native/provider.d.ts +4 -0
  574. package/registry/examples/theme/native/provider.js +23 -0
  575. package/registry/examples/theme/native/provider.tsx +21 -0
  576. package/registry/examples/theme/secondary.d.ts +4 -0
  577. package/registry/examples/theme/secondary.js +11 -0
  578. package/registry/examples/theme/secondary.tsx +10 -0
  579. package/registry/examples/theme/toggle.d.ts +4 -0
  580. package/registry/{demos/theme.js → examples/theme/toggle.js} +3 -3
  581. package/registry/{demos/theme.tsx → examples/theme/toggle.tsx} +1 -1
  582. package/registry/examples/toast/custom.d.ts +4 -0
  583. package/registry/examples/toast/custom.js +30 -0
  584. package/registry/examples/toast/custom.tsx +35 -0
  585. package/registry/examples/toast/native/notification.d.ts +4 -0
  586. package/registry/examples/toast/native/notification.dark.png +0 -0
  587. package/registry/examples/toast/native/notification.js +29 -0
  588. package/registry/examples/toast/native/notification.light.png +0 -0
  589. package/registry/examples/toast/native/notification.tsx +30 -0
  590. package/registry/examples/toast/native/tones.d.ts +4 -0
  591. package/registry/examples/toast/native/tones.dark.png +0 -0
  592. package/registry/examples/toast/native/tones.js +28 -0
  593. package/registry/examples/toast/native/tones.light.png +0 -0
  594. package/registry/examples/toast/native/tones.tsx +25 -0
  595. package/registry/examples/toast/tones.d.ts +4 -0
  596. package/registry/{demos/toast.js → examples/toast/tones.js} +3 -3
  597. package/registry/{demos/toast.tsx → examples/toast/tones.tsx} +1 -1
  598. package/registry/examples/tooltip/right.d.ts +4 -0
  599. package/registry/examples/tooltip/right.js +15 -0
  600. package/registry/examples/tooltip/right.tsx +15 -0
  601. package/registry/examples/tooltip/top.d.ts +4 -0
  602. package/registry/{demos/tooltip.js → examples/tooltip/top.js} +3 -3
  603. package/registry/{demos/tooltip.tsx → examples/tooltip/top.tsx} +1 -1
  604. package/registry/examples/txt/native/tones.d.ts +4 -0
  605. package/registry/examples/txt/native/tones.dark.png +0 -0
  606. package/registry/examples/txt/native/tones.js +16 -0
  607. package/registry/examples/txt/native/tones.light.png +0 -0
  608. package/registry/examples/txt/native/tones.tsx +17 -0
  609. package/registry/examples/txt/native/variants.d.ts +4 -0
  610. package/registry/examples/txt/native/variants.dark.png +0 -0
  611. package/registry/examples/txt/native/variants.js +18 -0
  612. package/registry/examples/txt/native/variants.light.png +0 -0
  613. package/registry/examples/txt/native/variants.tsx +15 -0
  614. package/registry/field.json +141 -3
  615. package/registry/index.json +361 -32
  616. package/registry/kbd.json +90 -3
  617. package/registry/page-header.json +121 -3
  618. package/registry/popover.json +90 -3
  619. package/registry/progress.json +265 -3
  620. package/registry/radio-group.json +136 -3
  621. package/registry/section-backdrop.json +214 -0
  622. package/registry/segmented.json +125 -0
  623. package/registry/separator.json +67 -3
  624. package/registry/skeleton.json +166 -3
  625. package/registry/slider.json +177 -3
  626. package/registry/slot.json +79 -3
  627. package/registry/spinner.json +144 -3
  628. package/registry/stat.json +140 -3
  629. package/registry/switch.json +130 -3
  630. package/registry/tabs.json +117 -3
  631. package/registry/theme.json +189 -3
  632. package/registry/toast.json +190 -3
  633. package/registry/tooltip.json +143 -3
  634. package/registry/txt.json +97 -0
  635. package/dist/chunk-ZUD4U22H.js.map +0 -1
  636. package/registry/demos/alert.d.ts +0 -5
  637. package/registry/demos/avatar.d.ts +0 -5
  638. package/registry/demos/badge.d.ts +0 -5
  639. package/registry/demos/button.d.ts +0 -5
  640. package/registry/demos/card.d.ts +0 -5
  641. package/registry/demos/checkbox.d.ts +0 -5
  642. package/registry/demos/chip.d.ts +0 -5
  643. package/registry/demos/cn.d.ts +0 -7
  644. package/registry/demos/command.d.ts +0 -5
  645. package/registry/demos/confirm-button.d.ts +0 -5
  646. package/registry/demos/countdown.d.ts +0 -5
  647. package/registry/demos/dialog.d.ts +0 -7
  648. package/registry/demos/dropdown-menu.d.ts +0 -7
  649. package/registry/demos/empty-state.d.ts +0 -5
  650. package/registry/demos/field.d.ts +0 -5
  651. package/registry/demos/kbd.d.ts +0 -5
  652. package/registry/demos/page-header.d.ts +0 -5
  653. package/registry/demos/popover.d.ts +0 -7
  654. package/registry/demos/progress.d.ts +0 -5
  655. package/registry/demos/radio-group.d.ts +0 -5
  656. package/registry/demos/separator.d.ts +0 -5
  657. package/registry/demos/skeleton.d.ts +0 -5
  658. package/registry/demos/slider.d.ts +0 -5
  659. package/registry/demos/slot.d.ts +0 -5
  660. package/registry/demos/spinner.d.ts +0 -5
  661. package/registry/demos/stat.d.ts +0 -5
  662. package/registry/demos/switch.d.ts +0 -5
  663. package/registry/demos/tabs.d.ts +0 -5
  664. package/registry/demos/theme.d.ts +0 -5
  665. package/registry/demos/toast.d.ts +0 -8
  666. package/registry/demos/tooltip.d.ts +0 -7
  667. /package/dist/{chunk-3X5MVH54.js.map → chunk-IUGBKMJC.js.map} +0 -0
@@ -1,12 +1,126 @@
1
1
  {
2
2
  "name": "tabs",
3
3
  "type": "primitive",
4
- "description": "`Tabs.Root/List/Trigger/Content` (variant underline · segmented · pills), `tabs` (the slots). Client (\"use client\").",
4
+ "title": "Tabs",
5
+ "summary": "Views of the same page, one at a time: underlined sections, a segmented switch or pills.",
6
+ "description": "Views of the same page, one at a time: underlined sections, a segmented switch or pills.",
7
+ "status": "beta",
8
+ "category": "navigation",
9
+ "platforms": "web",
10
+ "whenToUse": [
11
+ "To split a page into sections the user switches between without leaving it: videos, stories, about.",
12
+ "`variant=\"segmented\"` for a view switch (grid, list); `pills` for a feed's sections."
13
+ ],
14
+ "whenNotToUse": [
15
+ {
16
+ "when": "For a filter that narrows a list.",
17
+ "use": "chip"
18
+ },
19
+ {
20
+ "when": "To go to other pages: use links in the navigation."
21
+ },
22
+ {
23
+ "when": "For a choice in a form.",
24
+ "use": "radio-group"
25
+ }
26
+ ],
27
+ "bestPractices": [
28
+ "Short labels of one or two words; the active one should be clear without colour.",
29
+ "Keep the URL in sync with the active tab when a tab is worth sharing."
30
+ ],
31
+ "accessibility": {
32
+ "keyboard": [
33
+ {
34
+ "keys": "Tab",
35
+ "action": "Moves to the active tab, then into its panel."
36
+ },
37
+ {
38
+ "keys": "Arrow keys / Home / End",
39
+ "action": "Move between tabs and activate them."
40
+ }
41
+ ],
42
+ "notes": [
43
+ "Radix Tabs: `tablist`, `tab` with `aria-selected` and `aria-controls`, `tabpanel`; name the list with `aria-label`.",
44
+ "A disabled tab is skipped."
45
+ ]
46
+ },
47
+ "related": [
48
+ "chip",
49
+ "segmented",
50
+ "radio-group"
51
+ ],
52
+ "web": {
53
+ "entry": "@krizaka/ui/tabs",
54
+ "import": "import { Tabs } from \"@krizaka/ui/tabs\";",
55
+ "props": [
56
+ {
57
+ "component": "TabsRoot",
58
+ "description": "`value`/`defaultValue` + `onValueChange`, `orientation` (horizontal by default), `variant` for the list.",
59
+ "props": [
60
+ {
61
+ "name": "variant",
62
+ "type": "\"underline\" | \"segmented\" | \"pills\"",
63
+ "default": "underline",
64
+ "description": "underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections).",
65
+ "required": false
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "component": "TabsList",
71
+ "description": "The tabs. Name it (`aria-label`) when no heading says what it switches.",
72
+ "props": []
73
+ }
74
+ ],
75
+ "examples": [
76
+ {
77
+ "name": "underline",
78
+ "title": "Underline",
79
+ "description": "The sections of a page; a disabled tab is skipped.",
80
+ "path": "examples/tabs/underline.tsx",
81
+ "module": "@krizaka/ui/registry/examples/tabs/underline",
82
+ "code": "import { Tabs } from \"@krizaka/ui/tabs\";\n\nexport default function TabsUnderline() {\n return (\n <Tabs.Root defaultValue=\"videos\">\n <Tabs.List aria-label=\"Profile\">\n <Tabs.Trigger value=\"videos\">Videos</Tabs.Trigger>\n <Tabs.Trigger value=\"stories\">Stories</Tabs.Trigger>\n <Tabs.Trigger value=\"collections\">Collections</Tabs.Trigger>\n <Tabs.Trigger value=\"about\" disabled>\n About\n </Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"videos\" className=\"text-sm text-fg-secondary\">\n Twelve videos, newest first.\n </Tabs.Content>\n <Tabs.Content value=\"stories\" className=\"text-sm text-fg-secondary\">\n Stories of the last 24 hours.\n </Tabs.Content>\n <Tabs.Content value=\"collections\" className=\"text-sm text-fg-secondary\">\n Three public collections.\n </Tabs.Content>\n <Tabs.Content value=\"about\" className=\"text-sm text-fg-secondary\">\n About this channel.\n </Tabs.Content>\n </Tabs.Root>\n );\n}\n"
83
+ },
84
+ {
85
+ "name": "segmented",
86
+ "title": "Segmented",
87
+ "description": "A view switch: equal segments in a track.",
88
+ "path": "examples/tabs/segmented.tsx",
89
+ "module": "@krizaka/ui/registry/examples/tabs/segmented",
90
+ "code": "import { Tabs } from \"@krizaka/ui/tabs\";\n\n// A view switch: equal segments in a track, the active one filled.\nexport default function TabsSegmented() {\n return (\n <Tabs.Root variant=\"segmented\" defaultValue=\"grid\">\n <Tabs.List aria-label=\"View\">\n <Tabs.Trigger value=\"grid\">Grid</Tabs.Trigger>\n <Tabs.Trigger value=\"list\">List</Tabs.Trigger>\n <Tabs.Trigger value=\"cinema\">Cinema</Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"grid\" className=\"text-sm text-fg-secondary\">\n Four columns of cards.\n </Tabs.Content>\n <Tabs.Content value=\"list\" className=\"text-sm text-fg-secondary\">\n One line per video.\n </Tabs.Content>\n <Tabs.Content value=\"cinema\" className=\"text-sm text-fg-secondary\">\n One large player per video.\n </Tabs.Content>\n </Tabs.Root>\n );\n}\n"
91
+ },
92
+ {
93
+ "name": "pills",
94
+ "title": "Pills",
95
+ "description": "A feed's sections, scrolling sideways on a phone.",
96
+ "path": "examples/tabs/pills.tsx",
97
+ "module": "@krizaka/ui/registry/examples/tabs/pills",
98
+ "code": "import { Tabs } from \"@krizaka/ui/tabs\";\n\n// A feed's sections: pills that scroll sideways on a phone.\nexport default function TabsPills() {\n return (\n <Tabs.Root variant=\"pills\" defaultValue=\"videos\">\n <Tabs.List aria-label=\"Profile\">\n <Tabs.Trigger value=\"videos\">Videos</Tabs.Trigger>\n <Tabs.Trigger value=\"stories\">Stories</Tabs.Trigger>\n <Tabs.Trigger value=\"collections\">Collections</Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"videos\" className=\"text-sm text-fg-secondary\">\n Twelve videos, newest first.\n </Tabs.Content>\n <Tabs.Content value=\"stories\" className=\"text-sm text-fg-secondary\">\n Stories of the last 24 hours.\n </Tabs.Content>\n <Tabs.Content value=\"collections\" className=\"text-sm text-fg-secondary\">\n Three public collections.\n </Tabs.Content>\n </Tabs.Root>\n );\n}\n"
99
+ },
100
+ {
101
+ "name": "vertical",
102
+ "title": "Vertical",
103
+ "description": "`orientation=\"vertical\"`: the list on the side.",
104
+ "path": "examples/tabs/vertical.tsx",
105
+ "module": "@krizaka/ui/registry/examples/tabs/vertical",
106
+ "code": "import { Tabs } from \"@krizaka/ui/tabs\";\n\n// `orientation=\"vertical\"`: up and down arrows, the list on the side.\nexport default function TabsVertical() {\n return (\n <Tabs.Root orientation=\"vertical\" defaultValue=\"videos\">\n <Tabs.List aria-label=\"Profile\">\n <Tabs.Trigger value=\"videos\">Videos</Tabs.Trigger>\n <Tabs.Trigger value=\"stories\">Stories</Tabs.Trigger>\n <Tabs.Trigger value=\"collections\">Collections</Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"videos\" className=\"text-sm text-fg-secondary\">\n Twelve videos, newest first.\n </Tabs.Content>\n <Tabs.Content value=\"stories\" className=\"text-sm text-fg-secondary\">\n Stories of the last 24 hours.\n </Tabs.Content>\n <Tabs.Content value=\"collections\" className=\"text-sm text-fg-secondary\">\n Three public collections.\n </Tabs.Content>\n </Tabs.Root>\n );\n}\n"
107
+ }
108
+ ]
109
+ },
110
+ "native": null,
5
111
  "files": [
112
+ {
113
+ "path": "meta.ts",
114
+ "content": "// The documentation of a component, carried by its code: each primitive has a `meta.ts` beside its source\n// (`src/<name>/meta.ts`; a component that exists only in React Native: `src/native/meta/<name>.ts`). Never built into\n// the package: `scripts/build-registry.mjs` reads them into `registry/<name>.json`, which krizaka.com renders as\n// /docs/ui/<name>, and `scripts/registry.test.mjs` fails when one is missing or incomplete.\n//\n// Why a typed module and not JSDoc tags: the fields are lists and links (`related`, `whenNotToUse[].use`, examples),\n// which a type checks and a comment does not; the file is plain data (erasable TypeScript), so Node reads it without a\n// compiler, and an editor completes it.\n\n/** Every documented component: the web primitives (one entry of the package each) and the native-only ones. */\nexport type ComponentName =\n | \"alert\"\n | \"avatar\"\n | \"badge\"\n | \"button\"\n | \"card\"\n | \"checkbox\"\n | \"chip\"\n | \"cn\"\n | \"command\"\n | \"confirm-button\"\n | \"countdown\"\n | \"dialog\"\n | \"dropdown-menu\"\n | \"empty-state\"\n | \"field\"\n | \"kbd\"\n | \"page-header\"\n | \"popover\"\n | \"progress\"\n | \"radio-group\"\n | \"section-backdrop\"\n | \"segmented\"\n | \"separator\"\n | \"skeleton\"\n | \"slider\"\n | \"slot\"\n | \"spinner\"\n | \"stat\"\n | \"switch\"\n | \"tabs\"\n | \"theme\"\n | \"toast\"\n | \"tooltip\"\n | \"txt\";\n\n/** Where a component exists: `@krizaka/ui/<name>` (web), `@krizaka/ui/native` (React Native), or both. */\nexport type Platform = \"web\" | \"native\" | \"both\";\n\n/** `stable`: its API only changes in a major. `beta`: it may still change in a minor. */\nexport type Status = \"stable\" | \"beta\";\n\n/** The group of the catalogue. */\nexport type Category = \"actions\" | \"forms\" | \"navigation\" | \"overlays\" | \"feedback\" | \"data-display\" | \"layout\" | \"foundations\";\n\n/**\n * A named example: the file `registry/examples/<component>/<name>.tsx` (web) or\n * `registry/examples/<component>/native/<name>.tsx` (React Native) — at most 40 lines, imported by the stories and\n * shown (live, with its code) by the documentation.\n */\nexport interface Example {\n /** The file name, kebab-case (`primary`, `icon-button`). */\n readonly name: string;\n /** A short title (`Primary`, `Icon button`). */\n readonly title: string;\n /** One or two sentences: when this variant is the right one. */\n readonly description: string;\n}\n\n/** One platform's side of a component. */\nexport interface PlatformDocs {\n /** The names to import (`[\"Button\", \"IconButton\"]`): from `@krizaka/ui/<name>` on the web, `@krizaka/ui/native` in React Native. */\n readonly imports: readonly string[];\n /** The examples, in reading order; the first one is the component's preview. */\n readonly examples: readonly Example[];\n}\n\n/** The React Native side: the same concept, and what differs from the web API. */\nexport interface NativeDocs extends PlatformDocs {\n /** What differs from the web API (`label` instead of children…); empty for a native-only component. */\n readonly differences: readonly string[];\n}\n\nexport interface KeyboardInteraction {\n /** The keys, as written on a keyboard: `Space`, `Enter`, `Arrow keys`, `Esc`, `Tab`. */\n readonly keys: string;\n /** What they do. */\n readonly action: string;\n}\n\nexport interface ComponentMeta {\n /** The display name: `Button`, `Dropdown menu`. */\n readonly title: string;\n /** One sentence: what it is. */\n readonly summary: string;\n readonly status: Status;\n readonly category: Category;\n /** Must match the sides below: `both` ⇔ `web` and `native`. */\n readonly platforms: Platform;\n /** When to reach for it: concrete situations, one per item. */\n readonly whenToUse: readonly string[];\n /** When not to — and what to use instead (`use`), when another component is the answer. */\n readonly whenNotToUse: readonly { readonly when: string; readonly use?: ComponentName }[];\n /** How to use it well: wording, placement, composition. */\n readonly bestPractices: readonly string[];\n readonly accessibility: {\n /** The keyboard, when it does more than Tab and Enter. */\n readonly keyboard: readonly KeyboardInteraction[];\n /** Roles, names and announcements: what the component does, what the app must provide. */\n readonly notes: readonly string[];\n };\n /** The components a reader of this page should know about. */\n readonly related: readonly ComponentName[];\n readonly web?: PlatformDocs;\n readonly native?: NativeDocs;\n}\n"
115
+ },
6
116
  {
7
117
  "path": "tabs/index.ts",
8
118
  "content": "/** @krizaka/ui/tabs — `Tabs.Root/List/Trigger/Content` (variant underline · segmented · pills), `tabs` (the slots). Client (\"use client\"). */\nexport { Tabs, tabs, TabsContent, TabsList, TabsRoot, type TabsRootProps, TabsTrigger, type TabsVariants } from \"./tabs\";\n"
9
119
  },
120
+ {
121
+ "path": "tabs/meta.ts",
122
+ "content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Tabs\",\n summary: \"Views of the same page, one at a time: underlined sections, a segmented switch or pills.\",\n status: \"beta\",\n category: \"navigation\",\n platforms: \"web\",\n whenToUse: [\n \"To split a page into sections the user switches between without leaving it: videos, stories, about.\",\n \"`variant=\\\"segmented\\\"` for a view switch (grid, list); `pills` for a feed's sections.\",\n ],\n whenNotToUse: [\n { when: \"For a filter that narrows a list.\", use: \"chip\" },\n { when: \"To go to other pages: use links in the navigation.\" },\n { when: \"For a choice in a form.\", use: \"radio-group\" },\n ],\n bestPractices: [\n \"Short labels of one or two words; the active one should be clear without colour.\",\n \"Keep the URL in sync with the active tab when a tab is worth sharing.\",\n ],\n accessibility: {\n keyboard: [\n { keys: \"Tab\", action: \"Moves to the active tab, then into its panel.\" },\n { keys: \"Arrow keys / Home / End\", action: \"Move between tabs and activate them.\" },\n ],\n notes: [\n \"Radix Tabs: `tablist`, `tab` with `aria-selected` and `aria-controls`, `tabpanel`; name the list with `aria-label`.\",\n \"A disabled tab is skipped.\",\n ],\n },\n related: [\"chip\", \"segmented\", \"radio-group\"],\n web: {\n imports: [\"Tabs\"],\n examples: [\n { name: \"underline\", title: \"Underline\", description: \"The sections of a page; a disabled tab is skipped.\" },\n { name: \"segmented\", title: \"Segmented\", description: \"A view switch: equal segments in a track.\" },\n { name: \"pills\", title: \"Pills\", description: \"A feed's sections, scrolling sideways on a phone.\" },\n { name: \"vertical\", title: \"Vertical\", description: \"`orientation=\\\"vertical\\\"`: the list on the side.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
123
+ },
10
124
  {
11
125
  "path": "tabs/tabs.tsx",
12
126
  "content": "// Client (a context). Radix Tabs does the roles (tablist, tab, tabpanel), the aria-selected / aria-controls wiring,\n// the roving focus (arrows, Home, End) and automatic activation: this file only holds the three looks.\nimport { Tabs as TabsPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const tabs = tv({\n slots: {\n root: \"flex gap-4 data-[orientation=horizontal]:flex-col data-[orientation=vertical]:flex-row\",\n list: \"flex shrink-0 data-[orientation=vertical]:flex-col\",\n trigger:\n \"inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap font-semibold transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40\",\n content: \"kz-fade min-w-0 flex-1 rounded-lg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n },\n variants: {\n variant: {\n /* The section of a page: a line under the list, the active tab underlined in the accent. */\n underline: {\n list: \"gap-1 border-border-default data-[orientation=horizontal]:border-b data-[orientation=vertical]:border-r\",\n trigger:\n \"relative rounded-md px-3 py-2.5 text-sm text-fg-secondary hover:text-fg data-[state=active]:text-fg \" +\n \"after:absolute after:rounded-full after:bg-transparent data-[state=active]:after:bg-accent \" +\n \"data-[orientation=horizontal]:after:inset-x-2 data-[orientation=horizontal]:after:-bottom-px data-[orientation=horizontal]:after:h-0.5 \" +\n \"data-[orientation=vertical]:justify-start data-[orientation=vertical]:after:inset-y-1.5 data-[orientation=vertical]:after:-right-px data-[orientation=vertical]:after:w-0.5\",\n },\n /* A view switch: equal segments in a track, the active one filled. */\n segmented: {\n list: \"inline-grid auto-cols-fr grid-flow-col gap-1 self-start rounded-xl border border-border-default bg-surface-1 p-1 data-[orientation=vertical]:grid-flow-row\",\n trigger:\n \"min-h-8 rounded-lg px-3 py-1.5 text-xs text-fg-secondary hover:bg-surface-2 hover:text-fg \" +\n \"data-[state=active]:bg-accent data-[state=active]:text-on-accent data-[state=active]:shadow-sm data-[state=active]:hover:bg-accent\",\n },\n /* Pills that scroll sideways on a phone: a feed's sections. */\n pills: {\n list: \"gap-1.5 overflow-x-auto overscroll-x-contain [scrollbar-width:none] data-[orientation=horizontal]:pb-1\",\n trigger:\n \"h-9 rounded-full border border-border-default bg-surface-1 px-4 text-xs text-fg-secondary hover:border-border-strong hover:text-fg \" +\n \"data-[state=active]:border-accent data-[state=active]:bg-accent-soft data-[state=active]:text-fg\",\n },\n },\n },\n defaultVariants: { variant: \"underline\" },\n});\n\nexport type TabsVariants = VariantProps<typeof tabs>;\ntype Variant = NonNullable<TabsVariants[\"variant\"]>;\n\nconst VariantContext = React.createContext<Variant>(\"underline\");\n\nexport type TabsRootProps = React.ComponentProps<typeof TabsPrimitive.Root> & {\n /** underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections). */\n variant?: TabsVariants[\"variant\"];\n};\n\n/** `value`/`defaultValue` + `onValueChange`, `orientation` (horizontal by default), `variant` for the list. */\nexport function TabsRoot({ variant = \"underline\", className, ...props }: TabsRootProps) {\n return (\n <VariantContext.Provider value={variant}>\n <TabsPrimitive.Root data-variant={variant} className={tabs({ variant }).root({ className })} {...props} />\n </VariantContext.Provider>\n );\n}\n\n/** The tabs. Name it (`aria-label`) when no heading says what it switches. */\nexport function TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {\n const variant = React.useContext(VariantContext);\n return <TabsPrimitive.List data-variant={variant} className={tabs({ variant }).list({ className })} {...props} />;\n}\n\nexport function TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n const variant = React.useContext(VariantContext);\n return <TabsPrimitive.Trigger className={tabs({ variant }).trigger({ className })} {...props} />;\n}\n\nexport function TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content className={tabs().content({ className })} {...props} />;\n}\n\n/** `Tabs.Root/List/Trigger/Content` — `variant` underline · segmented · pills on the root. */\nexport const Tabs = { Root: TabsRoot, List: TabsList, Trigger: TabsTrigger, Content: TabsContent };\n"
@@ -18,8 +132,8 @@
18
132
  ],
19
133
  "registryDependencies": [],
20
134
  "demo": {
21
- "path": "demos/tabs.tsx",
22
- "content": "import { Tabs } from \"@krizaka/ui/tabs\";\n\nexport default function TabsDemo() {\n return (\n <Tabs.Root defaultValue=\"videos\">\n <Tabs.List aria-label=\"Profile\">\n <Tabs.Trigger value=\"videos\">Videos</Tabs.Trigger>\n <Tabs.Trigger value=\"stories\">Stories</Tabs.Trigger>\n <Tabs.Trigger value=\"collections\">Collections</Tabs.Trigger>\n <Tabs.Trigger value=\"about\" disabled>\n About\n </Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"videos\" className=\"text-sm text-fg-secondary\">\n Twelve videos, newest first.\n </Tabs.Content>\n <Tabs.Content value=\"stories\" className=\"text-sm text-fg-secondary\">\n Stories of the last 24 hours.\n </Tabs.Content>\n <Tabs.Content value=\"collections\" className=\"text-sm text-fg-secondary\">\n Three public collections.\n </Tabs.Content>\n <Tabs.Content value=\"about\" className=\"text-sm text-fg-secondary\">\n About this channel.\n </Tabs.Content>\n </Tabs.Root>\n );\n}\n"
135
+ "path": "examples/tabs/underline.tsx",
136
+ "content": "import { Tabs } from \"@krizaka/ui/tabs\";\n\nexport default function TabsUnderline() {\n return (\n <Tabs.Root defaultValue=\"videos\">\n <Tabs.List aria-label=\"Profile\">\n <Tabs.Trigger value=\"videos\">Videos</Tabs.Trigger>\n <Tabs.Trigger value=\"stories\">Stories</Tabs.Trigger>\n <Tabs.Trigger value=\"collections\">Collections</Tabs.Trigger>\n <Tabs.Trigger value=\"about\" disabled>\n About\n </Tabs.Trigger>\n </Tabs.List>\n <Tabs.Content value=\"videos\" className=\"text-sm text-fg-secondary\">\n Twelve videos, newest first.\n </Tabs.Content>\n <Tabs.Content value=\"stories\" className=\"text-sm text-fg-secondary\">\n Stories of the last 24 hours.\n </Tabs.Content>\n <Tabs.Content value=\"collections\" className=\"text-sm text-fg-secondary\">\n Three public collections.\n </Tabs.Content>\n <Tabs.Content value=\"about\" className=\"text-sm text-fg-secondary\">\n About this channel.\n </Tabs.Content>\n </Tabs.Root>\n );\n}\n"
23
137
  },
24
138
  "props": [
25
139
  {
@@ -1,12 +1,198 @@
1
1
  {
2
2
  "name": "theme",
3
3
  "type": "primitive",
4
- "description": "`ThemeScript`, `ThemeProvider`, `useTheme`, `ThemeToggle`. Client (\"use client\").",
4
+ "title": "Theme",
5
+ "summary": "Dark, light or the system's: `ThemeProvider`, `ThemeScript` against the flash, and `ThemeToggle`.",
6
+ "description": "Dark, light or the system's: `ThemeProvider`, `ThemeScript` against the flash, and `ThemeToggle`.",
7
+ "status": "stable",
8
+ "category": "foundations",
9
+ "platforms": "both",
10
+ "whenToUse": [
11
+ "Once per app, in the root layout: `ThemeScript` in `<head>`, `ThemeProvider` around the app.",
12
+ "`ThemeToggle` in the header or the settings, to cycle dark → light → system.",
13
+ "`useTheme()` to read or set the mode from your own control."
14
+ ],
15
+ "whenNotToUse": [
16
+ {
17
+ "when": "To theme one area differently: put `.theme-light` or `.theme-dark` on the subtree instead."
18
+ },
19
+ {
20
+ "when": "To change a product's colours: override the `--kz-*` tokens in its design system."
21
+ }
22
+ ],
23
+ "bestPractices": [
24
+ "Put `<ThemeScript />` in `<head>` and `suppressHydrationWarning` on `<html>`: the right theme is applied before the first paint.",
25
+ "The choice is persisted as `kz-theme` and applied as `html.light`: every Krizaka app reads the same switch.",
26
+ "Check every screen in both themes."
27
+ ],
28
+ "accessibility": {
29
+ "keyboard": [
30
+ {
31
+ "keys": "Enter / Space",
32
+ "action": "The toggle cycles to the next mode."
33
+ }
34
+ ],
35
+ "notes": [
36
+ "`ThemeToggle` is a button named by `label` (translated); its icon shows the current mode.",
37
+ "`color-scheme` follows the theme, so native controls and scrollbars match."
38
+ ]
39
+ },
40
+ "related": [
41
+ "button",
42
+ "cn"
43
+ ],
44
+ "web": {
45
+ "entry": "@krizaka/ui/theme",
46
+ "import": "import { ThemeProvider, ThemeScript, ThemeToggle, useTheme } from \"@krizaka/ui/theme\";",
47
+ "props": [
48
+ {
49
+ "component": "ThemeProvider",
50
+ "description": "",
51
+ "props": [
52
+ {
53
+ "name": "defaultMode",
54
+ "type": "Mode",
55
+ "default": "system",
56
+ "description": "The mode before anything is persisted.",
57
+ "required": false
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ "component": "ThemeScript",
63
+ "description": "In <head>, before anything renders: applies the persisted mode and named theme, so the page never flashes.\n`nonce` for a strict Content-Security-Policy.",
64
+ "props": [
65
+ {
66
+ "name": "nonce",
67
+ "type": "string",
68
+ "default": null,
69
+ "description": "The nonce of a strict Content-Security-Policy (`script-src 'nonce-…'`).",
70
+ "required": false
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ "component": "ThemeToggle",
76
+ "description": "An icon button (styled as `IconButton`, without its Slot) that cycles dark → light → system. Needs a\n<ThemeProvider> above it. State: `data-mode`.",
77
+ "props": [
78
+ {
79
+ "name": "label",
80
+ "type": "string | ((mode: Mode) => string)",
81
+ "default": null,
82
+ "description": "The accessible name — a string, or one per current mode (e.g. `(mode) => t(\"theme.\" + mode)`).",
83
+ "required": true
84
+ },
85
+ {
86
+ "name": "shape",
87
+ "type": "\"rounded\" | \"pill\"",
88
+ "default": "rounded",
89
+ "description": "rounded · pill.",
90
+ "required": false
91
+ },
92
+ {
93
+ "name": "variant",
94
+ "type": "\"danger\" | \"primary\" | \"secondary\" | \"outline\" | \"ghost\"",
95
+ "default": "ghost",
96
+ "description": "Any `Button` variant.",
97
+ "required": false
98
+ }
99
+ ]
100
+ }
101
+ ],
102
+ "examples": [
103
+ {
104
+ "name": "toggle",
105
+ "title": "Toggle",
106
+ "description": "A ghost icon button in its provider.",
107
+ "path": "examples/theme/toggle.tsx",
108
+ "module": "@krizaka/ui/registry/examples/theme/toggle",
109
+ "code": "import { ThemeProvider, ThemeToggle } from \"@krizaka/ui/theme\";\n\nexport default function ThemeToggleExample() {\n return (\n <ThemeProvider>\n <ThemeToggle label=\"Change the theme\" />\n </ThemeProvider>\n );\n}\n"
110
+ },
111
+ {
112
+ "name": "secondary",
113
+ "title": "Another look",
114
+ "description": "Any button variant and shape.",
115
+ "path": "examples/theme/secondary.tsx",
116
+ "module": "@krizaka/ui/registry/examples/theme/secondary",
117
+ "code": "import { ThemeProvider, ThemeToggle } from \"@krizaka/ui/theme\";\n\n// The toggle takes any button variant and shape.\nexport default function ThemeToggleSecondary() {\n return (\n <ThemeProvider>\n <ThemeToggle label=\"Change the theme\" variant=\"secondary\" shape=\"pill\" />\n </ThemeProvider>\n );\n}\n"
118
+ }
119
+ ]
120
+ },
121
+ "native": {
122
+ "entry": "@krizaka/ui/native",
123
+ "import": "import { ThemeProvider, useTheme } from \"@krizaka/ui/native\";",
124
+ "differences": [
125
+ "`ThemeProvider` takes the product's colour roles (`overrides`) and fonts; there is no `ThemeScript` and no toggle.",
126
+ "`useTheme()` returns the resolved `theme` (colour roles), `scheme`, `radius` and `motion` for `StyleSheet`.",
127
+ "The mode is not persisted: the app stores it from `onModeChange`."
128
+ ],
129
+ "props": [
130
+ {
131
+ "component": "ThemeProvider",
132
+ "description": "Once, at the root of the app. Without it, `useTheme()` follows the system with the platform's roles.",
133
+ "props": [
134
+ {
135
+ "name": "defaultMode",
136
+ "type": "Mode",
137
+ "default": "system",
138
+ "description": "Uncontrolled: the mode before the user picks one. Default: follow the system.",
139
+ "required": false
140
+ },
141
+ {
142
+ "name": "fonts",
143
+ "type": "ThemeFonts",
144
+ "default": null,
145
+ "description": "Font families the app has loaded (`expo-font`…); absent: the system font.",
146
+ "required": false
147
+ },
148
+ {
149
+ "name": "mode",
150
+ "type": "Mode",
151
+ "default": null,
152
+ "description": "Controlled mode (with `onModeChange`).",
153
+ "required": false
154
+ },
155
+ {
156
+ "name": "onModeChange",
157
+ "type": "((mode: Mode) => void)",
158
+ "default": null,
159
+ "description": "Every change of mode — the app persists it (no storage dependency here).",
160
+ "required": false
161
+ },
162
+ {
163
+ "name": "overrides",
164
+ "type": "ThemeOverrides",
165
+ "default": null,
166
+ "description": "The product's roles over the platform's, per theme.",
167
+ "required": false
168
+ }
169
+ ]
170
+ }
171
+ ],
172
+ "examples": [
173
+ {
174
+ "name": "provider",
175
+ "title": "Provider",
176
+ "description": "Once at the root; `useTheme()` reads the roles in any component.",
177
+ "path": "examples/theme/native/provider.tsx",
178
+ "module": "@krizaka/ui/registry/examples/theme/native/provider",
179
+ "code": "import { ThemeProvider, Txt, useTheme } from \"@krizaka/ui/native\";\nimport { View } from \"react-native\";\n\nfunction Screen() {\n const { theme, scheme } = useTheme();\n return (\n <View style={{ backgroundColor: theme.surface1, padding: 16, borderRadius: 12 }}>\n <Txt variant=\"title\">Every night, a new set.</Txt>\n <Txt tone=\"secondary\">The {scheme} theme, from the system.</Txt>\n </View>\n );\n}\n\n// Once, at the root of the app: the roles of @krizaka/tokens, the system's scheme, a product's overrides.\nexport default function NativeThemeProvider() {\n return (\n <ThemeProvider defaultMode=\"system\">\n <Screen />\n </ThemeProvider>\n );\n}\n"
180
+ }
181
+ ]
182
+ },
5
183
  "files": [
184
+ {
185
+ "path": "meta.ts",
186
+ "content": "// The documentation of a component, carried by its code: each primitive has a `meta.ts` beside its source\n// (`src/<name>/meta.ts`; a component that exists only in React Native: `src/native/meta/<name>.ts`). Never built into\n// the package: `scripts/build-registry.mjs` reads them into `registry/<name>.json`, which krizaka.com renders as\n// /docs/ui/<name>, and `scripts/registry.test.mjs` fails when one is missing or incomplete.\n//\n// Why a typed module and not JSDoc tags: the fields are lists and links (`related`, `whenNotToUse[].use`, examples),\n// which a type checks and a comment does not; the file is plain data (erasable TypeScript), so Node reads it without a\n// compiler, and an editor completes it.\n\n/** Every documented component: the web primitives (one entry of the package each) and the native-only ones. */\nexport type ComponentName =\n | \"alert\"\n | \"avatar\"\n | \"badge\"\n | \"button\"\n | \"card\"\n | \"checkbox\"\n | \"chip\"\n | \"cn\"\n | \"command\"\n | \"confirm-button\"\n | \"countdown\"\n | \"dialog\"\n | \"dropdown-menu\"\n | \"empty-state\"\n | \"field\"\n | \"kbd\"\n | \"page-header\"\n | \"popover\"\n | \"progress\"\n | \"radio-group\"\n | \"section-backdrop\"\n | \"segmented\"\n | \"separator\"\n | \"skeleton\"\n | \"slider\"\n | \"slot\"\n | \"spinner\"\n | \"stat\"\n | \"switch\"\n | \"tabs\"\n | \"theme\"\n | \"toast\"\n | \"tooltip\"\n | \"txt\";\n\n/** Where a component exists: `@krizaka/ui/<name>` (web), `@krizaka/ui/native` (React Native), or both. */\nexport type Platform = \"web\" | \"native\" | \"both\";\n\n/** `stable`: its API only changes in a major. `beta`: it may still change in a minor. */\nexport type Status = \"stable\" | \"beta\";\n\n/** The group of the catalogue. */\nexport type Category = \"actions\" | \"forms\" | \"navigation\" | \"overlays\" | \"feedback\" | \"data-display\" | \"layout\" | \"foundations\";\n\n/**\n * A named example: the file `registry/examples/<component>/<name>.tsx` (web) or\n * `registry/examples/<component>/native/<name>.tsx` (React Native) — at most 40 lines, imported by the stories and\n * shown (live, with its code) by the documentation.\n */\nexport interface Example {\n /** The file name, kebab-case (`primary`, `icon-button`). */\n readonly name: string;\n /** A short title (`Primary`, `Icon button`). */\n readonly title: string;\n /** One or two sentences: when this variant is the right one. */\n readonly description: string;\n}\n\n/** One platform's side of a component. */\nexport interface PlatformDocs {\n /** The names to import (`[\"Button\", \"IconButton\"]`): from `@krizaka/ui/<name>` on the web, `@krizaka/ui/native` in React Native. */\n readonly imports: readonly string[];\n /** The examples, in reading order; the first one is the component's preview. */\n readonly examples: readonly Example[];\n}\n\n/** The React Native side: the same concept, and what differs from the web API. */\nexport interface NativeDocs extends PlatformDocs {\n /** What differs from the web API (`label` instead of children…); empty for a native-only component. */\n readonly differences: readonly string[];\n}\n\nexport interface KeyboardInteraction {\n /** The keys, as written on a keyboard: `Space`, `Enter`, `Arrow keys`, `Esc`, `Tab`. */\n readonly keys: string;\n /** What they do. */\n readonly action: string;\n}\n\nexport interface ComponentMeta {\n /** The display name: `Button`, `Dropdown menu`. */\n readonly title: string;\n /** One sentence: what it is. */\n readonly summary: string;\n readonly status: Status;\n readonly category: Category;\n /** Must match the sides below: `both` ⇔ `web` and `native`. */\n readonly platforms: Platform;\n /** When to reach for it: concrete situations, one per item. */\n readonly whenToUse: readonly string[];\n /** When not to — and what to use instead (`use`), when another component is the answer. */\n readonly whenNotToUse: readonly { readonly when: string; readonly use?: ComponentName }[];\n /** How to use it well: wording, placement, composition. */\n readonly bestPractices: readonly string[];\n readonly accessibility: {\n /** The keyboard, when it does more than Tab and Enter. */\n readonly keyboard: readonly KeyboardInteraction[];\n /** Roles, names and announcements: what the component does, what the app must provide. */\n readonly notes: readonly string[];\n };\n /** The components a reader of this page should know about. */\n readonly related: readonly ComponentName[];\n readonly web?: PlatformDocs;\n readonly native?: NativeDocs;\n}\n"
187
+ },
6
188
  {
7
189
  "path": "theme/index.ts",
8
190
  "content": "/** @krizaka/ui/theme — `ThemeScript`, `ThemeProvider`, `useTheme`, `ThemeToggle`. Client (\"use client\"). */\nexport {\n type Mode,\n type ThemeContextValue,\n ThemeProvider,\n type ThemeProviderProps,\n ThemeScript,\n ThemeToggle,\n type ThemeToggleProps,\n useTheme,\n} from \"./theme\";\n"
9
191
  },
192
+ {
193
+ "path": "theme/meta.ts",
194
+ "content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Theme\",\n summary: \"Dark, light or the system's: `ThemeProvider`, `ThemeScript` against the flash, and `ThemeToggle`.\",\n status: \"stable\",\n category: \"foundations\",\n platforms: \"both\",\n whenToUse: [\n \"Once per app, in the root layout: `ThemeScript` in `<head>`, `ThemeProvider` around the app.\",\n \"`ThemeToggle` in the header or the settings, to cycle dark → light → system.\",\n \"`useTheme()` to read or set the mode from your own control.\",\n ],\n whenNotToUse: [\n { when: \"To theme one area differently: put `.theme-light` or `.theme-dark` on the subtree instead.\" },\n { when: \"To change a product's colours: override the `--kz-*` tokens in its design system.\" },\n ],\n bestPractices: [\n \"Put `<ThemeScript />` in `<head>` and `suppressHydrationWarning` on `<html>`: the right theme is applied before the first paint.\",\n \"The choice is persisted as `kz-theme` and applied as `html.light`: every Krizaka app reads the same switch.\",\n \"Check every screen in both themes.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Enter / Space\", action: \"The toggle cycles to the next mode.\" }],\n notes: [\"`ThemeToggle` is a button named by `label` (translated); its icon shows the current mode.\", \"`color-scheme` follows the theme, so native controls and scrollbars match.\"],\n },\n related: [\"button\", \"cn\"],\n web: {\n imports: [\"ThemeProvider\", \"ThemeScript\", \"ThemeToggle\", \"useTheme\"],\n examples: [\n { name: \"toggle\", title: \"Toggle\", description: \"A ghost icon button in its provider.\" },\n { name: \"secondary\", title: \"Another look\", description: \"Any button variant and shape.\" },\n ],\n },\n native: {\n imports: [\"ThemeProvider\", \"useTheme\"],\n differences: [\n \"`ThemeProvider` takes the product's colour roles (`overrides`) and fonts; there is no `ThemeScript` and no toggle.\",\n \"`useTheme()` returns the resolved `theme` (colour roles), `scheme`, `radius` and `motion` for `StyleSheet`.\",\n \"The mode is not persisted: the app stores it from `onModeChange`.\",\n ],\n examples: [{ name: \"provider\", title: \"Provider\", description: \"Once at the root; `useTheme()` reads the roles in any component.\" }],\n },\n} satisfies ComponentMeta;\n"
195
+ },
10
196
  {
11
197
  "path": "theme/theme.tsx",
12
198
  "content": "// Client. ONE mechanism for the whole organisation: dark by default, `html.light` for light, `html.theme-<name>` for a\n// named theme, persisted in localStorage (`kz-theme` for the mode, `kz-theme-name` for the named theme).\nimport * as React from \"react\";\n\nimport { type ButtonVariants, buttonVariants } from \"../button/button\";\n\nexport type Mode = \"dark\" | \"light\" | \"system\";\n\nconst MODE_KEY = \"kz-theme\";\nconst NAME_KEY = \"kz-theme-name\";\nconst MODES: readonly Mode[] = [\"dark\", \"light\", \"system\"];\nconst DARK_QUERY = \"(prefers-color-scheme: dark)\";\n\nconst isMode = (value: unknown): value is Mode => MODES.includes(value as Mode);\n\n// Storage blocked (private mode, sandbox): the choice lives in memory for the page.\nconst memory = new Map<string, string>();\n\nfunction read(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return memory.get(key) ?? null;\n }\n}\n\nfunction write(key: string, value: string | null) {\n if (value === null) memory.delete(key);\n else memory.set(key, value);\n try {\n if (value === null) localStorage.removeItem(key);\n else localStorage.setItem(key, value);\n } catch {\n // storage blocked: memory holds it\n }\n}\n\n// The persisted choice is an external store: every provider and tab reads the same value, the server reads none.\nconst listeners = new Set<() => void>();\nconst notify = () => listeners.forEach((listener) => listener());\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n window.addEventListener(\"storage\", listener);\n return () => {\n listeners.delete(listener);\n window.removeEventListener(\"storage\", listener);\n };\n}\n\nfunction applyMode(mode: Mode) {\n const dark = window.matchMedia(DARK_QUERY).matches;\n document.documentElement.classList.toggle(\"light\", mode === \"light\" || (mode === \"system\" && !dark));\n}\n\nfunction applyName(previous: string | null, next: string | null) {\n const classes = document.documentElement.classList;\n if (previous) classes.remove(`theme-${previous}`);\n if (next) classes.add(`theme-${next}`);\n}\n\n/**\n * In <head>, before anything renders: applies the persisted mode and named theme, so the page never flashes.\n * `nonce` for a strict Content-Security-Policy.\n */\nexport function ThemeScript({\n nonce,\n}: {\n /** The nonce of a strict Content-Security-Policy (`script-src 'nonce-…'`). */\n nonce?: string;\n}) {\n const js =\n `(function(){try{var m=localStorage.getItem(\"${MODE_KEY}\")||\"system\";var n=localStorage.getItem(\"${NAME_KEY}\");` +\n `var d=matchMedia(\"${DARK_QUERY}\").matches;var c=document.documentElement.classList;` +\n `c.toggle(\"light\",m===\"light\"||(m===\"system\"&&!d));if(n)c.add(\"theme-\"+n)}catch(e){}})()`;\n return <script nonce={nonce} dangerouslySetInnerHTML={{ __html: js }} />;\n}\n\nexport type ThemeContextValue = {\n /** The chosen mode: dark, light or follow the system. */\n mode: Mode;\n setMode: (mode: Mode) => void;\n /** The named theme (`html.theme-<name>`), or null. */\n theme: string | null;\n setTheme: (theme: string | null) => void;\n};\n\nconst ThemeContext = React.createContext<ThemeContextValue | null>(null);\n\nexport type ThemeProviderProps = {\n children: React.ReactNode;\n /** The mode before anything is persisted. */\n defaultMode?: Mode;\n};\n\nexport function ThemeProvider({ children, defaultMode = \"system\" }: ThemeProviderProps) {\n // Before hydration the server knows nothing persisted (ThemeScript has already applied it to <html>).\n const stored = React.useSyncExternalStore(subscribe, () => read(MODE_KEY), () => null);\n const mode: Mode = isMode(stored) ? stored : defaultMode;\n const theme = React.useSyncExternalStore(subscribe, () => read(NAME_KEY), () => null);\n\n // \"system\" follows the operating system while the page is open.\n React.useEffect(() => {\n if (mode !== \"system\") return;\n const query = window.matchMedia(DARK_QUERY);\n const onChange = () => applyMode(\"system\");\n query.addEventListener?.(\"change\", onChange);\n return () => query.removeEventListener?.(\"change\", onChange);\n }, [mode]);\n\n const setMode = React.useCallback((next: Mode) => {\n write(MODE_KEY, next);\n applyMode(next);\n notify();\n }, []);\n\n const setTheme = React.useCallback((next: string | null) => {\n applyName(read(NAME_KEY), next);\n write(NAME_KEY, next);\n notify();\n }, []);\n\n const value = React.useMemo(() => ({ mode, setMode, theme, setTheme }), [mode, setMode, theme, setTheme]);\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): ThemeContextValue {\n const context = React.useContext(ThemeContext);\n if (!context) throw new Error(\"useTheme: wrap the app in <ThemeProvider>\");\n return context;\n}\n\nconst ICONS: Record<Mode, React.ReactNode> = {\n dark: <path d=\"M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5Z\" />,\n light: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </>\n ),\n system: (\n <>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\" />\n <path d=\"M8 20h8M12 16v4\" />\n </>\n ),\n};\n\nexport type ThemeToggleProps = Omit<React.ComponentProps<\"button\">, \"onClick\" | \"children\"> &\n Pick<ButtonVariants, \"variant\" | \"shape\"> & {\n /** Any `Button` variant. */\n variant?: ButtonVariants[\"variant\"];\n /**\n * rounded · pill.\n * @default \"rounded\"\n */\n shape?: ButtonVariants[\"shape\"];\n /** The accessible name — a string, or one per current mode (e.g. `(mode) => t(\"theme.\" + mode)`). */\n label: string | ((mode: Mode) => string);\n };\n\n/**\n * An icon button (styled as `IconButton`, without its Slot) that cycles dark → light → system. Needs a\n * <ThemeProvider> above it. State: `data-mode`.\n */\nexport function ThemeToggle({ label, variant = \"ghost\", shape, className, ...props }: ThemeToggleProps) {\n const { mode, setMode } = useTheme();\n const next = MODES[(MODES.indexOf(mode) + 1) % MODES.length] as Mode;\n const name = typeof label === \"function\" ? label(mode) : label;\n return (\n <button\n type=\"button\"\n aria-label={name}\n title={name}\n data-mode={mode}\n onClick={() => setMode(next)}\n className={buttonVariants({ variant, shape, size: \"icon\", className })}\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {ICONS[mode]}\n </svg>\n </button>\n );\n}\n"
@@ -17,8 +203,8 @@
17
203
  "button"
18
204
  ],
19
205
  "demo": {
20
- "path": "demos/theme.tsx",
21
- "content": "import { ThemeProvider, ThemeToggle } from \"@krizaka/ui/theme\";\n\nexport default function ThemeDemo() {\n return (\n <ThemeProvider>\n <ThemeToggle label=\"Change the theme\" />\n </ThemeProvider>\n );\n}\n"
206
+ "path": "examples/theme/toggle.tsx",
207
+ "content": "import { ThemeProvider, ThemeToggle } from \"@krizaka/ui/theme\";\n\nexport default function ThemeToggleExample() {\n return (\n <ThemeProvider>\n <ThemeToggle label=\"Change the theme\" />\n </ThemeProvider>\n );\n}\n"
22
208
  },
23
209
  "props": [
24
210
  {