@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,475 @@
1
+ {
2
+ "name": "pagination",
3
+ "type": "primitive",
4
+ "title": "Pagination",
5
+ "summary": "Moves through a long list page by page: numbers with ellipses that fold into “Page 3 of 12” on a phone, or previous / next on a cursor.",
6
+ "description": "Moves through a long list page by page: numbers with ellipses that fold into “Page 3 of 12” on a phone, or previous / next on a cursor.",
7
+ "status": "beta",
8
+ "category": "navigation",
9
+ "platforms": "both",
10
+ "whenToUse": [
11
+ "Under a table or a grid of results the person reads page by page: an admin list, search results, invoices.",
12
+ "With `getHref` when the page belongs in the address — a search engine and a shared link reach page 4.",
13
+ "In cursor mode (`hasPrevious` / `hasNext`) when the API only knows the next page (a cursor, a `nextToken`)."
14
+ ],
15
+ "whenNotToUse": [
16
+ {
17
+ "when": "For a feed people scroll without a goal: load more at the end of the list instead (an infinite list)."
18
+ },
19
+ {
20
+ "when": "To switch between views of the same page: tabs.",
21
+ "use": "tabs"
22
+ }
23
+ ],
24
+ "bestPractices": [
25
+ "Say where the list stands with `status` (“61–80 of 392 videos”): it is read next to the controls.",
26
+ "Prefer links (`getHref`) for public lists; buttons (`onPageChange`) for a list inside an app screen.",
27
+ "Keep `siblings` at 1 on a list people browse; the container folds the numbers by itself under 28rem.",
28
+ "Disable the controls (`disabled`) while the next page loads, and move the focus to the top of the list after."
29
+ ],
30
+ "accessibility": {
31
+ "keyboard": [
32
+ {
33
+ "keys": "Tab",
34
+ "action": "Reaches the previous control, each page, then the next control."
35
+ }
36
+ ],
37
+ "notes": [
38
+ "A `nav` named by `labels.nav`; the current page carries `aria-current=\"page\"`.",
39
+ "Each number is named “Page 4” (`labels.page`); the ellipses are hidden from assistive technology.",
40
+ "A disabled link is `aria-disabled` with no `href`: it is skipped by the Tab key and read as unavailable."
41
+ ]
42
+ },
43
+ "related": [
44
+ "data-table",
45
+ "filter-bar",
46
+ "search-field"
47
+ ],
48
+ "web": {
49
+ "entry": "@krizaka/ui/pagination",
50
+ "import": "import { Pagination, pageRange } from \"@krizaka/ui/pagination\";",
51
+ "props": [
52
+ {
53
+ "component": "Pagination",
54
+ "description": "Moves through a long list: page numbers (folded on a narrow screen) or previous / next on a cursor.",
55
+ "props": [
56
+ {
57
+ "name": "boundaries",
58
+ "type": "number",
59
+ "default": "1",
60
+ "description": "Pages always shown at each end. Default 1.",
61
+ "required": false
62
+ },
63
+ {
64
+ "name": "disabled",
65
+ "type": "boolean",
66
+ "default": null,
67
+ "description": "Disables every control (a page is loading).",
68
+ "required": false
69
+ },
70
+ {
71
+ "name": "getHref",
72
+ "type": "((page: number) => string)",
73
+ "default": null,
74
+ "description": "The address of a page: the pages become links (crawlable, shareable, the state in the URL).",
75
+ "required": false
76
+ },
77
+ {
78
+ "name": "hasNext",
79
+ "type": "boolean",
80
+ "default": null,
81
+ "description": "Cursor mode: whether there is a next page.",
82
+ "required": false
83
+ },
84
+ {
85
+ "name": "hasPrevious",
86
+ "type": "boolean",
87
+ "default": null,
88
+ "description": "Cursor mode: whether there is a previous page.",
89
+ "required": false
90
+ },
91
+ {
92
+ "name": "labels",
93
+ "type": "Partial<PaginationLabels>",
94
+ "default": null,
95
+ "description": "The words, passed translated; English by default.",
96
+ "required": false
97
+ },
98
+ {
99
+ "name": "onNext",
100
+ "type": "(() => void)",
101
+ "default": null,
102
+ "description": "Cursor mode: called by the next control.",
103
+ "required": false
104
+ },
105
+ {
106
+ "name": "onPageChange",
107
+ "type": "((page: number) => void)",
108
+ "default": null,
109
+ "description": "Called with the page asked for (buttons). Ignored for the pages `getHref` turns into links.",
110
+ "required": false
111
+ },
112
+ {
113
+ "name": "onPageSizeChange",
114
+ "type": "((size: number) => void)",
115
+ "default": null,
116
+ "description": "Called with the size chosen.",
117
+ "required": false
118
+ },
119
+ {
120
+ "name": "onPrevious",
121
+ "type": "(() => void)",
122
+ "default": null,
123
+ "description": "Cursor mode: called by the previous control.",
124
+ "required": false
125
+ },
126
+ {
127
+ "name": "page",
128
+ "type": "number",
129
+ "default": "1",
130
+ "description": "Pages mode: the current page, from 1.",
131
+ "required": false
132
+ },
133
+ {
134
+ "name": "pageCount",
135
+ "type": "number",
136
+ "default": null,
137
+ "description": "Pages mode: how many pages there are. Without it, the pagination is in cursor mode.",
138
+ "required": false
139
+ },
140
+ {
141
+ "name": "pageSize",
142
+ "type": "number",
143
+ "default": null,
144
+ "description": "The page size, with `pageSizeOptions` and `onPageSizeChange`: a select of rows per page.",
145
+ "required": false
146
+ },
147
+ {
148
+ "name": "pageSizeOptions",
149
+ "type": "readonly number[]",
150
+ "default": null,
151
+ "description": "The sizes offered (`[10, 20, 50]`).",
152
+ "required": false
153
+ },
154
+ {
155
+ "name": "siblings",
156
+ "type": "number",
157
+ "default": "1",
158
+ "description": "Pages shown on each side of the current one. Default 1.",
159
+ "required": false
160
+ },
161
+ {
162
+ "name": "status",
163
+ "type": "ReactNode",
164
+ "default": null,
165
+ "description": "A text beside the controls, read as is: \"41–60 of 1,284\", \"12 results\".",
166
+ "required": false
167
+ }
168
+ ]
169
+ }
170
+ ],
171
+ "examples": [
172
+ {
173
+ "name": "results",
174
+ "title": "Search results",
175
+ "description": "Page numbers with ellipses and a status: the explore page of a video platform.",
176
+ "path": "examples/pagination/results.tsx",
177
+ "module": "@krizaka/ui/registry/examples/pagination/results",
178
+ "code": "\"use client\";\n\nimport { Pagination } from \"@krizaka/ui/pagination\";\nimport * as React from \"react\";\n\n// The explore page of a video platform: 392 results, 20 per page.\nexport default function PaginationResults() {\n const [page, setPage] = React.useState(4);\n const first = (page - 1) * 20 + 1;\n return (\n <Pagination\n page={page}\n pageCount={20}\n onPageChange={setPage}\n status={`${first}–${Math.min(first + 19, 392)} of 392 videos`}\n labels={{ nav: \"Pages of results\" }}\n />\n );\n}\n"
179
+ },
180
+ {
181
+ "name": "table-footer",
182
+ "title": "Table footer",
183
+ "description": "Under an admin table: the rows per page, the range shown, and the pages.",
184
+ "path": "examples/pagination/table-footer.tsx",
185
+ "module": "@krizaka/ui/registry/examples/pagination/table-footer",
186
+ "code": "\"use client\";\n\nimport { Pagination } from \"@krizaka/ui/pagination\";\nimport * as React from \"react\";\n\n// Under an admin table: rows per page, the range shown, the pages.\nexport default function PaginationTableFooter() {\n const [page, setPage] = React.useState(1);\n const [size, setSize] = React.useState(20);\n const total = 1284;\n const count = Math.ceil(total / size);\n const first = (page - 1) * size + 1;\n return (\n <Pagination\n page={page}\n pageCount={count}\n onPageChange={setPage}\n pageSize={size}\n pageSizeOptions={[10, 20, 50]}\n onPageSizeChange={(next) => {\n setSize(next);\n setPage(1);\n }}\n status={`${first.toLocaleString(\"en\")}–${Math.min(first + size - 1, total).toLocaleString(\"en\")} of ${total.toLocaleString(\"en\")}`}\n />\n );\n}\n"
187
+ },
188
+ {
189
+ "name": "cursor",
190
+ "title": "Cursor",
191
+ "description": "An API that only knows the next and previous pages: two buttons and the range.",
192
+ "path": "examples/pagination/cursor.tsx",
193
+ "module": "@krizaka/ui/registry/examples/pagination/cursor",
194
+ "code": "\"use client\";\n\nimport { Pagination } from \"@krizaka/ui/pagination\";\nimport * as React from \"react\";\n\n// An API that answers with a `nextCursor`: no total, previous and next only.\nexport default function PaginationCursor() {\n const [pages, setPages] = React.useState([\"start\"]);\n const index = pages.length - 1;\n return (\n <Pagination\n hasPrevious={index > 0}\n hasNext\n onPrevious={() => setPages((p) => p.slice(0, -1))}\n onNext={() => setPages((p) => [...p, `cursor-${p.length}`])}\n status={`Jobs ${index * 25 + 1}–${index * 25 + 25}`}\n labels={{ previous: \"Newer jobs\", next: \"Older jobs\" }}\n />\n );\n}\n"
195
+ },
196
+ {
197
+ "name": "links",
198
+ "title": "Links in the address",
199
+ "description": "`getHref`: every page is a link — crawlable, shareable, the state in the URL.",
200
+ "path": "examples/pagination/links.tsx",
201
+ "module": "@krizaka/ui/registry/examples/pagination/links",
202
+ "code": "import { Pagination } from \"@krizaka/ui/pagination\";\n\n// Server-rendered: every page is a link, the page lives in the address (`?q=sunset&page=7`).\nexport default function PaginationLinks() {\n return <Pagination page={7} pageCount={42} getHref={(page) => `/explore?q=sunset&page=${page}`} siblings={2} />;\n}\n"
203
+ }
204
+ ]
205
+ },
206
+ "native": {
207
+ "entry": "@krizaka/ui/native",
208
+ "import": "import { Pagination } from \"@krizaka/ui/native\";",
209
+ "differences": [
210
+ "Folded only: previous / next and “Page 3 of 12”, the form a thumb reaches; no numbers, no links, no page size.",
211
+ "`labels` is required (`previous`, `next`, `compact`)."
212
+ ],
213
+ "props": [
214
+ {
215
+ "component": "Pagination",
216
+ "description": "Previous / next with where the list stands (\"Page 3 of 12\"), or the two buttons of a cursor — the web\n`Pagination` folded, the form a phone's thumb reaches. On a feed, prefer loading more at the end of the list.",
217
+ "props": [
218
+ {
219
+ "name": "labels",
220
+ "type": "PaginationLabels",
221
+ "default": null,
222
+ "description": "The words, passed translated.",
223
+ "required": true
224
+ },
225
+ {
226
+ "name": "disabled",
227
+ "type": "boolean",
228
+ "default": null,
229
+ "description": "Disables both buttons (a page is loading).",
230
+ "required": false
231
+ },
232
+ {
233
+ "name": "hasNext",
234
+ "type": "boolean",
235
+ "default": null,
236
+ "description": "Cursor mode: whether there is a next page.",
237
+ "required": false
238
+ },
239
+ {
240
+ "name": "hasPrevious",
241
+ "type": "boolean",
242
+ "default": null,
243
+ "description": "Cursor mode: whether there is a previous page.",
244
+ "required": false
245
+ },
246
+ {
247
+ "name": "onNext",
248
+ "type": "(() => void)",
249
+ "default": null,
250
+ "description": "Cursor mode: called by the next button.",
251
+ "required": false
252
+ },
253
+ {
254
+ "name": "onPageChange",
255
+ "type": "((page: number) => void)",
256
+ "default": null,
257
+ "description": "Pages mode: called with the page asked for.",
258
+ "required": false
259
+ },
260
+ {
261
+ "name": "onPrevious",
262
+ "type": "(() => void)",
263
+ "default": null,
264
+ "description": "Cursor mode: called by the previous button.",
265
+ "required": false
266
+ },
267
+ {
268
+ "name": "page",
269
+ "type": "number",
270
+ "default": "1",
271
+ "description": "Pages mode: the current page, from 1.",
272
+ "required": false
273
+ },
274
+ {
275
+ "name": "pageCount",
276
+ "type": "number",
277
+ "default": null,
278
+ "description": "Pages mode: how many pages. Without it, the pagination is in cursor mode.",
279
+ "required": false
280
+ },
281
+ {
282
+ "name": "status",
283
+ "type": "string",
284
+ "default": null,
285
+ "description": "A text between the buttons in cursor mode (\"41–60\"), or instead of \"Page 3 of 12\".",
286
+ "required": false
287
+ },
288
+ {
289
+ "name": "style",
290
+ "type": "StyleProp<ViewStyle>",
291
+ "default": null,
292
+ "description": "Styles merged last.",
293
+ "required": false
294
+ }
295
+ ]
296
+ }
297
+ ],
298
+ "examples": [
299
+ {
300
+ "name": "pages",
301
+ "title": "Pages",
302
+ "description": "Previous / next around “Page 3 of 12”.",
303
+ "path": "examples/pagination/native/pages.tsx",
304
+ "module": "@krizaka/ui/registry/examples/pagination/native/pages",
305
+ "code": "import { Pagination } from \"@krizaka/ui/native\";\nimport * as React from \"react\";\n\nexport default function NativePaginationPages() {\n const [page, setPage] = React.useState(3);\n return (\n <Pagination\n page={page}\n pageCount={12}\n onPageChange={setPage}\n labels={{ previous: \"Previous page\", next: \"Next page\", compact: (p, count) => `Page ${p} of ${count}` }}\n />\n );\n}\n",
306
+ "screenshots": {
307
+ "dark": "examples/pagination/native/pages.dark.png",
308
+ "light": "examples/pagination/native/pages.light.png"
309
+ }
310
+ },
311
+ {
312
+ "name": "cursor",
313
+ "title": "Cursor",
314
+ "description": "Previous / next on a cursor, with the range in between.",
315
+ "path": "examples/pagination/native/cursor.tsx",
316
+ "module": "@krizaka/ui/registry/examples/pagination/native/cursor",
317
+ "code": "import { Pagination } from \"@krizaka/ui/native\";\n\n// A cursor: the range in between, no total.\nexport default function NativePaginationCursor() {\n return (\n <Pagination\n hasPrevious\n hasNext\n status=\"Payouts 21–40\"\n labels={{ previous: \"Newer payouts\", next: \"Older payouts\", compact: (p, count) => `${p} / ${count}` }}\n />\n );\n}\n",
318
+ "screenshots": {
319
+ "dark": "examples/pagination/native/cursor.dark.png",
320
+ "light": "examples/pagination/native/cursor.light.png"
321
+ }
322
+ }
323
+ ]
324
+ },
325
+ "files": [
326
+ {
327
+ "path": "glyphs.tsx",
328
+ "content": "// The small line glyphs the data and media primitives draw (play, volume, search, chevrons…): decorative, 24-unit\n// box, `currentColor`, sized by the caller's class. Shared by the entries that need them; never exported on its own —\n// a product draws its own icons with @krizaka/icons.\nimport type * as React from \"react\";\n\ntype GlyphProps = { className?: string };\n\nfunction Glyph({ className = \"h-4 w-4\", fill, children }: GlyphProps & { fill?: boolean; children: React.ReactNode }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n className={className}\n fill={fill ? \"currentColor\" : \"none\"}\n stroke={fill ? \"none\" : \"currentColor\"}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n focusable=\"false\"\n >\n {children}\n </svg>\n );\n}\n\nexport const PlayGlyph = (p: GlyphProps) => (\n <Glyph {...p} fill>\n <path d=\"M8 5.5v13a1 1 0 0 0 1.5.86l10.4-6.5a1 1 0 0 0 0-1.72L9.5 4.64A1 1 0 0 0 8 5.5Z\" />\n </Glyph>\n);\nexport const PauseGlyph = (p: GlyphProps) => (\n <Glyph {...p} fill>\n <rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n <rect x=\"14\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n </Glyph>\n);\nexport const VolumeGlyph = ({ muted, ...p }: GlyphProps & { muted?: boolean }) => (\n <Glyph {...p}>\n <path d=\"M11 5 6 9H3v6h3l5 4V5Z\" />\n {muted ? <path d=\"m22 9-6 6m0-6 6 6\" /> : <path d=\"M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13\" />}\n </Glyph>\n);\nexport const FullscreenGlyph = ({ exit, ...p }: GlyphProps & { exit?: boolean }) => (\n <Glyph {...p}>\n {exit ? <path d=\"M9 4v5H4m11-5v5h5M9 20v-5H4m11 5v-5h5\" /> : <path d=\"M4 9V4h5m6 0h5v5M4 15v5h5m11-5v5h-5\" />}\n </Glyph>\n);\nexport const CaptionsGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"M10 10.5a2 2 0 1 0 0 3M17 10.5a2 2 0 1 0 0 3\" />\n </Glyph>\n);\nexport const PipGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <rect x=\"12\" y=\"12\" width=\"6\" height=\"4\" rx=\"1\" />\n </Glyph>\n);\nexport const SearchGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m20 20-3.5-3.5\" />\n </Glyph>\n);\nexport const CloseGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </Glyph>\n);\nexport const ChevronGlyph = ({ direction = \"down\", ...p }: GlyphProps & { direction?: \"left\" | \"right\" | \"up\" | \"down\" }) => (\n <Glyph {...p}>\n <path d={{ left: \"m15 6-6 6 6 6\", right: \"m9 6 6 6-6 6\", up: \"m6 15 6-6 6 6\", down: \"m6 9 6 6 6-6\" }[direction]} />\n </Glyph>\n);\nexport const CheckGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M20 6 9 17l-5-5\" />\n </Glyph>\n);\nexport const PlusGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M12 5v14M5 12h14\" />\n </Glyph>\n);\nexport const CalendarGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" />\n <path d=\"M3 10h18M8 3v4M16 3v4\" />\n </Glyph>\n);\nexport const UploadGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M12 16V4m0 0L7 9m5-5 5 5\" />\n <path d=\"M4 16v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2\" />\n </Glyph>\n);\nexport const FileGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5Z\" />\n <path d=\"M14 3v5h5\" />\n </Glyph>\n);\nexport const CameraGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M4 8h3l2-3h6l2 3h3a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1Z\" />\n <circle cx=\"12\" cy=\"13.5\" r=\"3.5\" />\n </Glyph>\n);\nexport const FlipGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M4 12a8 8 0 0 1 14-5.3M20 12a8 8 0 0 1-14 5.3\" />\n <path d=\"M18 3v4h-4M6 21v-4h4\" />\n </Glyph>\n);\nexport const RetryGlyph = (p: GlyphProps) => (\n <Glyph {...p}>\n <path d=\"M4 12a8 8 0 1 0 2.3-5.7L4 8.5\" />\n <path d=\"M4 4v4.5h4.5\" />\n </Glyph>\n);\nexport const SortGlyph = ({ direction, ...p }: GlyphProps & { direction?: \"ascending\" | \"descending\" }) => (\n <Glyph {...p}>\n {direction === \"ascending\" ? <path d=\"m7 14 5-5 5 5\" /> : direction === \"descending\" ? <path d=\"m7 10 5 5 5-5\" /> : <path d=\"m8 9 4-4 4 4M8 15l4 4 4-4\" />}\n </Glyph>\n);\n"
329
+ },
330
+ {
331
+ "path": "meta.ts",
332
+ "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"
333
+ },
334
+ {
335
+ "path": "pagination/index.ts",
336
+ "content": "/** @krizaka/ui/pagination — `Pagination` (pages or cursor, folded on a narrow screen), `pageRange`, `pagination` (the slots). Server-safe. */\nexport { pageRange,Pagination, pagination, type PaginationLabels, paginationLabels, type PaginationProps } from \"./pagination\";\n"
337
+ },
338
+ {
339
+ "path": "pagination/meta.ts",
340
+ "content": "import type { ComponentMeta } from \"../meta\";\n\nexport const meta = {\n title: \"Pagination\",\n summary: \"Moves through a long list page by page: numbers with ellipses that fold into “Page 3 of 12” on a phone, or previous / next on a cursor.\",\n status: \"beta\",\n category: \"navigation\",\n platforms: \"both\",\n whenToUse: [\n \"Under a table or a grid of results the person reads page by page: an admin list, search results, invoices.\",\n \"With `getHref` when the page belongs in the address — a search engine and a shared link reach page 4.\",\n \"In cursor mode (`hasPrevious` / `hasNext`) when the API only knows the next page (a cursor, a `nextToken`).\",\n ],\n whenNotToUse: [\n { when: \"For a feed people scroll without a goal: load more at the end of the list instead (an infinite list).\" },\n { when: \"To switch between views of the same page: tabs.\", use: \"tabs\" },\n ],\n bestPractices: [\n \"Say where the list stands with `status` (“61–80 of 392 videos”): it is read next to the controls.\",\n \"Prefer links (`getHref`) for public lists; buttons (`onPageChange`) for a list inside an app screen.\",\n \"Keep `siblings` at 1 on a list people browse; the container folds the numbers by itself under 28rem.\",\n \"Disable the controls (`disabled`) while the next page loads, and move the focus to the top of the list after.\",\n ],\n accessibility: {\n keyboard: [{ keys: \"Tab\", action: \"Reaches the previous control, each page, then the next control.\" }],\n notes: [\n \"A `nav` named by `labels.nav`; the current page carries `aria-current=\\\"page\\\"`.\",\n \"Each number is named “Page 4” (`labels.page`); the ellipses are hidden from assistive technology.\",\n \"A disabled link is `aria-disabled` with no `href`: it is skipped by the Tab key and read as unavailable.\",\n ],\n },\n related: [\"data-table\", \"filter-bar\", \"search-field\"],\n web: {\n imports: [\"Pagination\", \"pageRange\"],\n examples: [\n { name: \"results\", title: \"Search results\", description: \"Page numbers with ellipses and a status: the explore page of a video platform.\" },\n { name: \"table-footer\", title: \"Table footer\", description: \"Under an admin table: the rows per page, the range shown, and the pages.\" },\n { name: \"cursor\", title: \"Cursor\", description: \"An API that only knows the next and previous pages: two buttons and the range.\" },\n { name: \"links\", title: \"Links in the address\", description: \"`getHref`: every page is a link — crawlable, shareable, the state in the URL.\" },\n ],\n },\n native: {\n imports: [\"Pagination\"],\n differences: [\n \"Folded only: previous / next and “Page 3 of 12”, the form a thumb reaches; no numbers, no links, no page size.\",\n \"`labels` is required (`previous`, `next`, `compact`).\",\n ],\n examples: [\n { name: \"pages\", title: \"Pages\", description: \"Previous / next around “Page 3 of 12”.\" },\n { name: \"cursor\", title: \"Cursor\", description: \"Previous / next on a cursor, with the range in between.\" },\n ],\n },\n} satisfies ComponentMeta;\n"
341
+ },
342
+ {
343
+ "path": "pagination/pagination.tsx",
344
+ "content": "// Server-safe: no hook, no context. A `<nav>` named by `labels.nav`; the current page is `aria-current=\"page\"`.\n// Two modes: pages (`page` + `pageCount`: numbers with ellipses, which fold into \"Page 3 of 12\" in a narrow container)\n// and cursor (`hasPrevious` / `hasNext`: an API that only knows the next and previous pages). Links (`getHref`) when\n// the page lives in the address — the right default for a list a search engine or a shared link should reach — or\n// buttons (`onPageChange`).\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { ChevronGlyph } from \"../glyphs\";\n\nexport const pagination = tv({\n slots: {\n root: \"@container flex w-full flex-wrap items-center justify-between gap-3 text-sm\",\n list: \"flex items-center gap-1\",\n pages: \"hidden items-center gap-1 @md:flex\",\n compact: \"px-2 text-xs font-semibold tabular-nums text-fg-secondary @md:hidden\",\n item:\n \"inline-flex h-9 min-w-9 select-none items-center justify-center gap-1.5 rounded-lg px-2.5 text-sm font-semibold tabular-nums text-fg-secondary \" +\n \"transition-colors hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring \" +\n \"aria-[current=page]:bg-accent aria-[current=page]:text-on-accent aria-[current=page]:hover:bg-accent \" +\n \"aria-disabled:pointer-events-none aria-disabled:opacity-40 disabled:pointer-events-none disabled:opacity-40\",\n edge: \"border border-border-default bg-surface-1 px-3\",\n ellipsis: \"inline-flex h-9 min-w-6 items-end justify-center pb-2 text-fg-muted\",\n status: \"text-xs text-fg-secondary tabular-nums\",\n size: \"flex items-center gap-2 text-xs text-fg-secondary\",\n select:\n \"h-9 rounded-lg border border-border-default bg-surface-2 px-2 text-sm text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n },\n});\n\nexport type PaginationLabels = {\n /** The accessible name of the navigation (\"Pagination\", \"Pages of results\"). */\n nav: string;\n /** The previous-page control. */\n previous: string;\n /** The next-page control. */\n next: string;\n /** The accessible name of a page number: `(3) => \"Page 3\"`. */\n page: (page: number) => string;\n /** The folded form, in a narrow container: `(3, 12) => \"Page 3 of 12\"`. */\n compact: (page: number, pageCount: number) => string;\n /** The label of the page-size select (\"Rows per page\"). */\n pageSize: string;\n};\n\n/** The English words, for a quick start — pass your translations through `labels`. */\nexport const paginationLabels: PaginationLabels = {\n nav: \"Pagination\",\n previous: \"Previous\",\n next: \"Next\",\n page: (page) => `Page ${page}`,\n compact: (page, count) => `Page ${page} of ${count}`,\n pageSize: \"Rows per page\",\n};\n\n/**\n * The pages to show: the first and last `boundaries`, the current page and its `siblings`, and `\"…\"` where pages are\n * skipped. A gap of a single page shows that page instead of an ellipsis; few pages are all shown.\n */\nexport function pageRange(page: number, pageCount: number, siblings = 1, boundaries = 1): (number | \"…\")[] {\n // Few enough pages to show them all in the room the folded form takes: no ellipsis.\n if (pageCount <= 2 * boundaries + 2 * siblings + 3) return Array.from({ length: Math.max(0, pageCount) }, (_, i) => i + 1);\n const pages = new Set<number>();\n for (let i = 1; i <= Math.min(boundaries, pageCount); i += 1) pages.add(i);\n for (let i = Math.max(1, pageCount - boundaries + 1); i <= pageCount; i += 1) pages.add(i);\n for (let i = Math.max(1, page - siblings); i <= Math.min(pageCount, page + siblings); i += 1) pages.add(i);\n const sorted = [...pages].sort((a, b) => a - b);\n const out: (number | \"…\")[] = [];\n sorted.forEach((n, i) => {\n const prev = sorted[i - 1];\n if (prev !== undefined && n - prev === 2) out.push(prev + 1);\n else if (prev !== undefined && n - prev > 2) out.push(\"…\");\n out.push(n);\n });\n return out;\n}\n\nexport type PaginationProps = Omit<React.ComponentProps<\"nav\">, \"children\"> & {\n /** Pages mode: the current page, from 1. */\n page?: number;\n /** Pages mode: how many pages there are. Without it, the pagination is in cursor mode. */\n pageCount?: number;\n /** Called with the page asked for (buttons). Ignored for the pages `getHref` turns into links. */\n onPageChange?: (page: number) => void;\n /** The address of a page: the pages become links (crawlable, shareable, the state in the URL). */\n getHref?: (page: number) => string;\n /** Cursor mode: whether there is a previous page. */\n hasPrevious?: boolean;\n /** Cursor mode: whether there is a next page. */\n hasNext?: boolean;\n /** Cursor mode: called by the previous control. */\n onPrevious?: () => void;\n /** Cursor mode: called by the next control. */\n onNext?: () => void;\n /** Pages shown on each side of the current one. Default 1. */\n siblings?: number;\n /** Pages always shown at each end. Default 1. */\n boundaries?: number;\n /** A text beside the controls, read as is: \"41–60 of 1,284\", \"12 results\". */\n status?: React.ReactNode;\n /** The page size, with `pageSizeOptions` and `onPageSizeChange`: a select of rows per page. */\n pageSize?: number;\n /** The sizes offered (`[10, 20, 50]`). */\n pageSizeOptions?: readonly number[];\n /** Called with the size chosen. */\n onPageSizeChange?: (size: number) => void;\n /** Disables every control (a page is loading). */\n disabled?: boolean;\n /** The words, passed translated; English by default. */\n labels?: Partial<PaginationLabels>;\n};\n\ntype ItemProps = {\n href?: string;\n onClick?: () => void;\n disabled?: boolean;\n current?: boolean;\n label: string;\n className: string;\n children: React.ReactNode;\n};\n\nfunction Item({ href, onClick, disabled, current, label, className, children }: ItemProps) {\n const common = { \"aria-label\": label, \"aria-current\": current ? (\"page\" as const) : undefined, className };\n if (href && !disabled) {\n return (\n <a href={href} onClick={onClick} {...common}>\n {children}\n </a>\n );\n }\n if (href) {\n return (\n <a role=\"link\" aria-disabled {...common}>\n {children}\n </a>\n );\n }\n return (\n <button type=\"button\" onClick={onClick} disabled={disabled} {...common}>\n {children}\n </button>\n );\n}\n\n/** Moves through a long list: page numbers (folded on a narrow screen) or previous / next on a cursor. */\nexport function Pagination({\n page = 1,\n pageCount,\n onPageChange,\n getHref,\n hasPrevious,\n hasNext,\n onPrevious,\n onNext,\n siblings = 1,\n boundaries = 1,\n status,\n pageSize,\n pageSizeOptions,\n onPageSizeChange,\n disabled,\n labels: given,\n className,\n ...props\n}: PaginationProps) {\n const s = pagination();\n const labels = { ...paginationLabels, ...given };\n const paged = pageCount !== undefined;\n const count = Math.max(1, pageCount ?? 1);\n const current = Math.min(Math.max(1, page), count);\n const canPrevious = paged ? current > 1 : Boolean(hasPrevious);\n const canNext = paged ? current < count : Boolean(hasNext);\n const go = (target: number) => () => onPageChange?.(target);\n const href = (target: number) => (paged && getHref ? getHref(target) : undefined);\n\n return (\n <nav aria-label={labels.nav} className={s.root({ className })} {...props}>\n {status !== undefined || pageSizeOptions ? (\n <div className=\"flex flex-wrap items-center gap-4\">\n {status !== undefined && <p className={s.status()}>{status}</p>}\n {pageSizeOptions && pageSize !== undefined && (\n <label className={s.size()}>\n {labels.pageSize}\n <select\n className={s.select()}\n value={pageSize}\n disabled={disabled}\n onChange={(event) => onPageSizeChange?.(Number(event.target.value))}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size}\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n ) : null}\n <ul className={s.list()}>\n <li>\n <Item\n href={href(current - 1)}\n onClick={paged ? go(current - 1) : onPrevious}\n disabled={disabled || !canPrevious}\n label={labels.previous}\n className={s.item({ className: s.edge() })}\n >\n <ChevronGlyph direction=\"left\" />\n <span className=\"hidden @lg:inline\">{labels.previous}</span>\n </Item>\n </li>\n {paged && (\n <>\n <li className={s.pages()}>\n <ul className=\"contents\">\n {pageRange(current, count, siblings, boundaries).map((n, i) =>\n n === \"…\" ? (\n <li key={`gap-${i}`} aria-hidden className={s.ellipsis()}>\n …\n </li>\n ) : (\n <li key={n}>\n <Item href={href(n)} onClick={go(n)} disabled={disabled} current={n === current} label={labels.page(n)} className={s.item()}>\n {n}\n </Item>\n </li>\n ),\n )}\n </ul>\n </li>\n <li className={s.compact()}>\n {labels.compact(current, count)}\n </li>\n </>\n )}\n <li>\n <Item\n href={href(current + 1)}\n onClick={paged ? go(current + 1) : onNext}\n disabled={disabled || !canNext}\n label={labels.next}\n className={s.item({ className: s.edge() })}\n >\n <span className=\"hidden @lg:inline\">{labels.next}</span>\n <ChevronGlyph direction=\"right\" />\n </Item>\n </li>\n </ul>\n </nav>\n );\n}\n"
345
+ }
346
+ ],
347
+ "dependencies": [
348
+ "tailwind-variants@^3.3.1"
349
+ ],
350
+ "registryDependencies": [],
351
+ "demo": {
352
+ "path": "examples/pagination/results.tsx",
353
+ "content": "\"use client\";\n\nimport { Pagination } from \"@krizaka/ui/pagination\";\nimport * as React from \"react\";\n\n// The explore page of a video platform: 392 results, 20 per page.\nexport default function PaginationResults() {\n const [page, setPage] = React.useState(4);\n const first = (page - 1) * 20 + 1;\n return (\n <Pagination\n page={page}\n pageCount={20}\n onPageChange={setPage}\n status={`${first}–${Math.min(first + 19, 392)} of 392 videos`}\n labels={{ nav: \"Pages of results\" }}\n />\n );\n}\n"
354
+ },
355
+ "props": [
356
+ {
357
+ "component": "Pagination",
358
+ "description": "Moves through a long list: page numbers (folded on a narrow screen) or previous / next on a cursor.",
359
+ "props": [
360
+ {
361
+ "name": "boundaries",
362
+ "type": "number",
363
+ "default": "1",
364
+ "description": "Pages always shown at each end. Default 1.",
365
+ "required": false
366
+ },
367
+ {
368
+ "name": "disabled",
369
+ "type": "boolean",
370
+ "default": null,
371
+ "description": "Disables every control (a page is loading).",
372
+ "required": false
373
+ },
374
+ {
375
+ "name": "getHref",
376
+ "type": "((page: number) => string)",
377
+ "default": null,
378
+ "description": "The address of a page: the pages become links (crawlable, shareable, the state in the URL).",
379
+ "required": false
380
+ },
381
+ {
382
+ "name": "hasNext",
383
+ "type": "boolean",
384
+ "default": null,
385
+ "description": "Cursor mode: whether there is a next page.",
386
+ "required": false
387
+ },
388
+ {
389
+ "name": "hasPrevious",
390
+ "type": "boolean",
391
+ "default": null,
392
+ "description": "Cursor mode: whether there is a previous page.",
393
+ "required": false
394
+ },
395
+ {
396
+ "name": "labels",
397
+ "type": "Partial<PaginationLabels>",
398
+ "default": null,
399
+ "description": "The words, passed translated; English by default.",
400
+ "required": false
401
+ },
402
+ {
403
+ "name": "onNext",
404
+ "type": "(() => void)",
405
+ "default": null,
406
+ "description": "Cursor mode: called by the next control.",
407
+ "required": false
408
+ },
409
+ {
410
+ "name": "onPageChange",
411
+ "type": "((page: number) => void)",
412
+ "default": null,
413
+ "description": "Called with the page asked for (buttons). Ignored for the pages `getHref` turns into links.",
414
+ "required": false
415
+ },
416
+ {
417
+ "name": "onPageSizeChange",
418
+ "type": "((size: number) => void)",
419
+ "default": null,
420
+ "description": "Called with the size chosen.",
421
+ "required": false
422
+ },
423
+ {
424
+ "name": "onPrevious",
425
+ "type": "(() => void)",
426
+ "default": null,
427
+ "description": "Cursor mode: called by the previous control.",
428
+ "required": false
429
+ },
430
+ {
431
+ "name": "page",
432
+ "type": "number",
433
+ "default": "1",
434
+ "description": "Pages mode: the current page, from 1.",
435
+ "required": false
436
+ },
437
+ {
438
+ "name": "pageCount",
439
+ "type": "number",
440
+ "default": null,
441
+ "description": "Pages mode: how many pages there are. Without it, the pagination is in cursor mode.",
442
+ "required": false
443
+ },
444
+ {
445
+ "name": "pageSize",
446
+ "type": "number",
447
+ "default": null,
448
+ "description": "The page size, with `pageSizeOptions` and `onPageSizeChange`: a select of rows per page.",
449
+ "required": false
450
+ },
451
+ {
452
+ "name": "pageSizeOptions",
453
+ "type": "readonly number[]",
454
+ "default": null,
455
+ "description": "The sizes offered (`[10, 20, 50]`).",
456
+ "required": false
457
+ },
458
+ {
459
+ "name": "siblings",
460
+ "type": "number",
461
+ "default": "1",
462
+ "description": "Pages shown on each side of the current one. Default 1.",
463
+ "required": false
464
+ },
465
+ {
466
+ "name": "status",
467
+ "type": "ReactNode",
468
+ "default": null,
469
+ "description": "A text beside the controls, read as is: \"41–60 of 1,284\", \"12 results\".",
470
+ "required": false
471
+ }
472
+ ]
473
+ }
474
+ ]
475
+ }
@@ -88,7 +88,7 @@
88
88
  },
89
89
  {
90
90
  "path": "meta.ts",
91
- "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 | \"mascots\"\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"
91
+ "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"
92
92
  },
93
93
  {
94
94
  "path": "popover/index.ts",