@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 @@
1
+ {"version":3,"sources":["../src/combobox/combobox.tsx"],"sourcesContent":["// Client. The ARIA 1.2 combobox (`../listbox`): a text input that filters a listbox, the focus never leaves the input\n// (`aria-activedescendant`), the number of results announced in a polite live region. Static options filtered here,\n// or `onSearch` (debounced, the previous request aborted) for a server's; one value or several (chips, Backspace\n// removes the last), and new values created from the query when `creatable`.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { Chip } from \"../chip\";\nimport { CheckGlyph, ChevronGlyph, CloseGlyph, PlusGlyph } from \"../glyphs\";\nimport { useListbox } from \"../listbox\";\nimport { useControllable, useDebouncedCallback } from \"../media\";\n\nexport const combobox = tv({\n slots: {\n root: \"relative flex w-full flex-col gap-1.5\",\n label: \"text-xs font-semibold text-fg-secondary\",\n control:\n \"flex min-h-11 w-full flex-wrap items-center gap-1.5 rounded-lg border border-border-default bg-surface-2 py-1.5 pl-2 pr-1 text-sm text-fg \" +\n \"transition-[border-color,box-shadow] focus-within:border-accent focus-within:ring-2 focus-within:ring-ring \" +\n \"data-[invalid]:border-danger data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n input: \"h-8 min-w-24 flex-1 bg-transparent px-1 text-sm text-fg outline-hidden placeholder:text-fg-muted disabled:cursor-not-allowed\",\n icon:\n \"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-fg-secondary hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n list: \"absolute inset-x-0 top-full z-50 mt-1 max-h-64 overflow-y-auto rounded-lg border border-border-default bg-surface-2 p-1 shadow-lg\",\n option:\n \"flex cursor-pointer select-none items-center gap-2.5 rounded-md px-2.5 py-2 text-sm text-fg \" +\n \"data-[active]:bg-surface-3 aria-disabled:cursor-not-allowed aria-disabled:opacity-40\",\n check: \"h-4 w-4 shrink-0 text-fg-accent\",\n description: \"block text-xs text-fg-secondary\",\n status: \"px-2.5 py-3 text-sm text-fg-secondary\",\n hint: \"text-xs text-fg-secondary\",\n error: \"flex items-center gap-1.5 text-xs font-medium text-fg-danger before:h-1.5 before:w-1.5 before:shrink-0 before:rounded-full before:bg-danger\",\n },\n});\n\nexport type ComboboxOption = {\n /** What the app stores. */\n value: string;\n /** What the person reads, passed translated. */\n label: string;\n /** A second line under the label. */\n description?: string;\n /** Shown but not choosable. */\n disabled?: boolean;\n};\n\nexport type ComboboxLabels = {\n /** No option matches (\"No results\"). */\n empty: string;\n /** While `onSearch` runs (\"Searching…\"). */\n loading: string;\n /** `onSearch` failed (\"Search unavailable\"). */\n error: string;\n /** The option that creates a value: `(query) => \"Create “\" + query + \"”\"`. */\n create: (query: string) => string;\n /** A chip's remove button: `(label) => \"Remove \" + label`. */\n remove: (label: string) => string;\n /** The button that empties a single choice (\"Clear\"). */\n clear: string;\n /** The button that opens the list (\"Show options\"). */\n toggle: string;\n /** Announced when the results change: `(n) => n + \" results\"`. */\n results: (count: number) => string;\n};\n\nexport const comboboxLabels: ComboboxLabels = {\n empty: \"No results\",\n loading: \"Searching…\",\n error: \"Search unavailable\",\n create: (query) => `Create “${query}”`,\n remove: (label) => `Remove ${label}`,\n clear: \"Clear\",\n toggle: \"Show options\",\n results: (count) => (count === 1 ? \"1 result\" : `${count} results`),\n};\n\ntype BaseProps = {\n /** The visible label of the field, passed translated (also its accessible name). */\n label: string;\n /** Hides the label visually, keeping it as the accessible name (a search bar with its own context). */\n hideLabel?: boolean;\n /** The options, filtered as the person types (by `filter`). */\n options?: readonly ComboboxOption[];\n /** Fetches the options for a query (debounced by `debounce`); the `signal` aborts when a newer query starts. */\n onSearch?: (query: string, signal: AbortSignal) => Promise<readonly ComboboxOption[]>;\n /** The wait, in ms, between the last key and `onSearch`. Default 250. */\n debounce?: number;\n /** Whether an option matches a query. Default: its label contains the query, ignoring case and accents. */\n filter?: (option: ComboboxOption, query: string) => boolean;\n /** Offers to create the query as a new value when no option has that exact label. */\n creatable?: boolean;\n /** Turns a query into the created option (an id from the server…). Default `{ value: query, label: query }`. */\n onCreate?: (query: string) => ComboboxOption;\n /** Keys that create the query at once, as Enter does (`[\",\"]` for tags); a paste is split on them too. */\n separators?: readonly string[];\n /** The input's placeholder, passed translated. */\n placeholder?: string;\n /** A help text under the field. */\n hint?: string;\n /** An error under the field: marks it invalid and is read with it. */\n error?: string;\n /** Not available. */\n disabled?: boolean;\n /** The name of a hidden input holding the value(s), for a plain `<form>` post. */\n name?: string;\n /** The words, passed translated; English by default. */\n labels?: Partial<ComboboxLabels>;\n /** Classes merged on the root. */\n className?: string;\n /** The id of the text input (default: generated). */\n id?: string;\n};\n\ntype SingleProps = BaseProps & {\n /** One value (default) or several. */\n multiple?: false;\n /** The chosen option (controlled), `null` for none. */\n value?: ComboboxOption | null;\n /** The chosen option at first, uncontrolled. */\n defaultValue?: ComboboxOption | null;\n /** Called with the chosen option, or `null` when it is cleared. */\n onValueChange?: (value: ComboboxOption | null) => void;\n /** Most options that can be chosen (several values only). */\n maxSelected?: never;\n};\n\ntype MultipleProps = BaseProps & {\n /** Several values, shown as chips. */\n multiple: true;\n /** The chosen options (controlled). */\n value?: readonly ComboboxOption[];\n /** The chosen options at first, uncontrolled. */\n defaultValue?: readonly ComboboxOption[];\n /** Called with every chosen option. */\n onValueChange?: (value: ComboboxOption[]) => void;\n /** Most options that can be chosen; the list stops offering more past it. */\n maxSelected?: number;\n};\n\nexport type ComboboxProps = SingleProps | MultipleProps;\n\nconst fold = (text: string) => text.normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\").toLowerCase();\nconst defaultFilter = (option: ComboboxOption, query: string) => fold(option.label).includes(fold(query.trim()));\n\ntype Item = { kind: \"option\"; option: ComboboxOption } | { kind: \"create\"; query: string };\n\n/** A text field that suggests, filters and completes: one value or several (chips), static or fetched, creatable. */\nexport function Combobox(props: ComboboxProps) {\n const {\n label,\n hideLabel,\n options,\n onSearch,\n debounce = 250,\n filter = defaultFilter,\n creatable,\n onCreate = (query: string) => ({ value: query, label: query }),\n separators,\n placeholder,\n hint,\n error,\n disabled,\n name,\n labels: given,\n className,\n id: givenId,\n } = props;\n const labels = { ...comboboxLabels, ...given };\n const s = combobox();\n const autoId = React.useId();\n const inputId = givenId ?? `${autoId}-input`;\n const hintId = `${autoId}-hint`;\n const errorId = `${autoId}-error`;\n const multiple = props.multiple === true;\n\n const [values, setValues] = useControllable<readonly ComboboxOption[]>(\n props.value === undefined ? undefined : multiple ? (props.value as readonly ComboboxOption[]) : props.value ? [props.value as ComboboxOption] : [],\n multiple ? ((props.defaultValue as readonly ComboboxOption[]) ?? []) : props.defaultValue ? [props.defaultValue as ComboboxOption] : [],\n (next) => (multiple ? (props.onValueChange as ((v: ComboboxOption[]) => void) | undefined)?.([...next]) : (props.onValueChange as ((v: ComboboxOption | null) => void) | undefined)?.(next[0] ?? null)),\n );\n const single = multiple ? null : (values[0] ?? null);\n const [query, setQuery] = React.useState(single?.label ?? \"\");\n const [editing, setEditing] = React.useState(false);\n const [open, setOpenState] = React.useState(false);\n const [remote, setRemote] = React.useState<{ query: string; options: readonly ComboboxOption[]; state: \"idle\" | \"loading\" | \"error\" }>({ query: \"\", options: [], state: \"idle\" });\n const request = React.useRef<AbortController | null>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // The single choice's label shows in the input while the person is not typing.\n const shownQuery = !multiple && !editing ? (single?.label ?? \"\") : query;\n const searchQuery = editing ? query : \"\";\n\n const search = useDebouncedCallback((text: string) => {\n if (!onSearch) return;\n request.current?.abort();\n const controller = new AbortController();\n request.current = controller;\n onSearch(text, controller.signal).then(\n (found) => !controller.signal.aborted && setRemote({ query: text, options: found, state: \"idle\" }),\n () => !controller.signal.aborted && setRemote({ query: text, options: [], state: \"error\" }),\n );\n }, debounce);\n React.useEffect(() => () => request.current?.abort(), []);\n\n const setOpen = (next: boolean) => {\n if (next && onSearch && remote.state === \"idle\" && remote.query !== searchQuery) {\n setRemote((r) => ({ ...r, state: \"loading\" }));\n search(searchQuery);\n }\n setOpenState(next);\n };\n\n const chosen = new Set(values.map((v) => v.value));\n const source = onSearch ? remote.options : (options ?? []).filter((o) => !searchQuery.trim() || filter(o, searchQuery));\n const full = multiple && props.maxSelected !== undefined && values.length >= props.maxSelected;\n const trimmed = searchQuery.trim();\n const exact = [...source, ...values].some((o) => fold(o.label) === fold(trimmed));\n const items: Item[] = [\n ...source.map((option) => ({ kind: \"option\" as const, option })),\n ...(creatable && trimmed && !exact && !full ? [{ kind: \"create\" as const, query: trimmed }] : []),\n ];\n const isDisabled = (i: number) => {\n const item = items[i];\n if (!item) return true;\n if (item.kind === \"create\") return false;\n return Boolean(item.option.disabled) || (full && !chosen.has(item.option.value));\n };\n\n const commit = (option: ComboboxOption) => {\n if (multiple) {\n setValues(chosen.has(option.value) ? values.filter((v) => v.value !== option.value) : [...values, option]);\n setQuery(\"\");\n listbox.setActive(-1);\n } else {\n setValues([option]);\n setQuery(option.label);\n setEditing(false);\n setOpenState(false);\n }\n };\n const create = (text: string) => {\n const clean = text.trim();\n if (!clean || full) return;\n const existing = [...source, ...values].find((o) => fold(o.label) === fold(clean));\n if (multiple && existing && chosen.has(existing.value)) {\n setQuery(\"\");\n return;\n }\n commit(existing ?? onCreate(clean));\n };\n const pick = (i: number) => {\n const item = items[i];\n if (!item) return;\n if (item.kind === \"create\") create(item.query);\n else commit(item.option);\n };\n\n const listbox = useListbox({ count: items.length, isDisabled, onPick: pick, open, setOpen });\n\n const onChange = (text: string) => {\n setQuery(text);\n setEditing(true);\n listbox.setActive(-1);\n if (onSearch) {\n setRemote((r) => ({ ...r, state: \"loading\" }));\n search(text);\n }\n setOpenState(true);\n if (!multiple && text === \"\" && single) setValues([]);\n };\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (separators?.includes(event.key) && query.trim()) {\n event.preventDefault();\n create(query);\n return;\n }\n if (listbox.onKeyDown(event)) return;\n if (event.key === \"Enter\" && creatable && query.trim()) {\n event.preventDefault();\n create(query);\n } else if (event.key === \"Backspace\" && multiple && query === \"\" && values.length > 0) {\n setValues(values.slice(0, -1));\n } else if (event.key === \"Escape\" && !multiple && editing) {\n setEditing(false);\n setQuery(single?.label ?? \"\");\n }\n };\n\n const onPaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n if (!separators?.length || !multiple) return;\n const text = event.clipboardData.getData(\"text\");\n const parts = text.split(new RegExp(`[${separators.map((c) => c.replace(/[\\\\\\]^-]/g, \"\\\\$&\")).join(\"\")}\\\\n]`)).map((p) => p.trim()).filter(Boolean);\n if (parts.length < 2) return;\n event.preventDefault();\n const next = [...values];\n for (const part of parts) {\n if (props.maxSelected !== undefined && next.length >= props.maxSelected) break;\n if (next.some((v) => fold(v.label) === fold(part))) continue;\n next.push((options ?? []).find((o) => fold(o.label) === fold(part)) ?? onCreate(part));\n }\n setValues(next);\n };\n\n const loading = Boolean(onSearch) && remote.state === \"loading\";\n const failed = Boolean(onSearch) && remote.state === \"error\";\n const describedBy = [hint ? hintId : null, error ? errorId : null].filter(Boolean).join(\" \") || undefined;\n\n return (\n <div\n className={s.root({ className })}\n onBlur={(event) => {\n if (event.currentTarget.contains(event.relatedTarget as Node | null)) return;\n setOpenState(false);\n if (!multiple) {\n setEditing(false);\n setQuery(single?.label ?? \"\");\n }\n }}\n >\n <label htmlFor={inputId} className={hideLabel ? \"sr-only\" : s.label()}>\n {label}\n </label>\n <div className={s.control()} data-invalid={error ? \"\" : undefined} data-disabled={disabled ? \"\" : undefined} onMouseDown={(event) => {\n if (event.target === event.currentTarget) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }}>\n {multiple &&\n values.map((option) => (\n <Chip key={option.value} size=\"sm\" removable removeLabel={labels.remove(option.label)} disabled={disabled} onRemove={() => setValues(values.filter((v) => v.value !== option.value))}>\n {option.label}\n </Chip>\n ))}\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n {...listbox.inputProps}\n aria-describedby={describedBy}\n aria-invalid={error ? true : undefined}\n aria-busy={loading || undefined}\n value={shownQuery}\n placeholder={multiple && values.length > 0 ? undefined : placeholder}\n disabled={disabled}\n className={s.input()}\n onChange={(event) => onChange(event.target.value)}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onClick={() => !open && setOpen(true)}\n />\n {!multiple && single && !disabled ? (\n <button type=\"button\" aria-label={labels.clear} className={s.icon()} onClick={() => {\n setValues([]);\n setQuery(\"\");\n inputRef.current?.focus();\n }}>\n <CloseGlyph className=\"h-4 w-4\" />\n </button>\n ) : null}\n <button type=\"button\" tabIndex={-1} aria-label={labels.toggle} aria-expanded={open} aria-controls={listbox.listId} disabled={disabled} className={s.icon()} onClick={() => {\n setOpen(!open);\n inputRef.current?.focus();\n }}>\n <ChevronGlyph direction={open ? \"up\" : \"down\"} className=\"h-4 w-4\" />\n </button>\n </div>\n {name && values.map((v) => <input key={v.value} type=\"hidden\" name={name} value={v.value} />)}\n <div id={listbox.listId} role=\"listbox\" aria-label={label} aria-multiselectable={multiple || undefined} hidden={!open || (items.length === 0 && !loading && !failed && !labels.empty)} className={s.list()}>\n {open && loading && items.length === 0 ? <div className={s.status()}>{labels.loading}</div> : null}\n {open && failed ? <div className={s.status()}>{labels.error}</div> : null}\n {open && !loading && !failed && items.length === 0 && labels.empty ? <div className={s.status()}>{labels.empty}</div> : null}\n {open &&\n items.map((item, i) =>\n item.kind === \"create\" ? (\n <div key=\"__create\" {...listbox.optionProps(i, false)} className={s.option()}>\n <PlusGlyph className={s.check()} />\n {labels.create(item.query)}\n </div>\n ) : (\n <div key={item.option.value} {...listbox.optionProps(i, chosen.has(item.option.value))} className={s.option()}>\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">{chosen.has(item.option.value) ? <CheckGlyph className={s.check()} /> : null}</span>\n <span className=\"min-w-0 flex-1\">\n {item.option.label}\n {item.option.description ? <span className={s.description()}>{item.option.description}</span> : null}\n </span>\n </div>\n ),\n )}\n </div>\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic>\n {open && !loading ? labels.results(items.length) : \"\"}\n </span>\n {hint ? (\n <p id={hintId} className={s.hint()}>\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} className={s.error()}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":["query"]}
@@ -0,0 +1,92 @@
1
+ "use client";
2
+
3
+ // src/chip/chip.tsx
4
+ import { Toggle as TogglePrimitive, ToggleGroup as ToggleGroupPrimitive } from "radix-ui";
5
+ import * as React from "react";
6
+ import { tv } from "tailwind-variants";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var chip = tv({
9
+ slots: {
10
+ group: "flex flex-wrap items-center gap-2 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch",
11
+ base: "inline-flex shrink-0 select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-full border font-semibold transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 border-border-default bg-surface-1 text-fg-secondary hover:border-border-strong hover:text-fg data-[state=on]:border-accent data-[state=on]:bg-accent-soft data-[state=on]:text-fg",
12
+ remove: "-mr-1.5 inline-flex h-6 w-6 items-center justify-center rounded-full text-fg-secondary transition-colors hover:bg-surface-3 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring"
13
+ },
14
+ variants: {
15
+ size: { sm: { base: "h-7 px-3 text-xs" }, md: { base: "h-9 px-3.5 text-xs" } }
16
+ },
17
+ defaultVariants: { size: "md" }
18
+ });
19
+ var ChipGroupContext = React.createContext(null);
20
+ function RemoveIcon() {
21
+ return /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "h-3.5 w-3.5", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" }) });
22
+ }
23
+ function ChipBase(props) {
24
+ const group = React.useContext(ChipGroupContext);
25
+ if (props.removable) {
26
+ const { removable: _removable2, removeLabel, onRemove, disabled, size: size2, className: className2, children, ...rest2 } = props;
27
+ const s2 = chip({ size: size2 ?? group?.size });
28
+ return /* @__PURE__ */ jsxs("span", { "data-removable": "", className: s2.base({ className: className2 }), ...rest2, children: [
29
+ children,
30
+ /* @__PURE__ */ jsx("button", { type: "button", "aria-label": removeLabel, title: removeLabel, disabled, onClick: onRemove, className: s2.remove(), children: /* @__PURE__ */ jsx(RemoveIcon, {}) })
31
+ ] });
32
+ }
33
+ const { removable: _removable, value, selected, defaultSelected, onSelectedChange, size, className, ...rest } = props;
34
+ const s = chip({ size: size ?? group?.size });
35
+ if (group) {
36
+ if (value === void 0) throw new Error("Chip: a chip inside Chip.Group needs a `value`.");
37
+ return /* @__PURE__ */ jsx(ToggleGroupPrimitive.Item, { value, className: s.base({ className }), ...rest });
38
+ }
39
+ return /* @__PURE__ */ jsx(
40
+ TogglePrimitive.Root,
41
+ {
42
+ pressed: selected,
43
+ defaultPressed: defaultSelected,
44
+ onPressedChange: onSelectedChange,
45
+ className: s.base({ className }),
46
+ ...rest
47
+ }
48
+ );
49
+ }
50
+ function ChipGroup({ label, size, className, children, ...props }) {
51
+ const s = chip({ size });
52
+ const context = React.useMemo(() => ({ size }), [size]);
53
+ const common = { "aria-label": label, className: s.group({ className }) };
54
+ let group;
55
+ if (props.type === "single") {
56
+ const { type: _type, value, defaultValue, onValueChange, required, ...rest } = props;
57
+ group = /* @__PURE__ */ jsx(SingleGroup, { ...rest, ...common, value, defaultValue, onValueChange, required, children });
58
+ } else {
59
+ const { type: _type, required: _required, ...rest } = props;
60
+ group = /* @__PURE__ */ jsx(ToggleGroupPrimitive.Root, { type: "multiple", ...rest, ...common, children });
61
+ }
62
+ return /* @__PURE__ */ jsx(ChipGroupContext.Provider, { value: context, children: group });
63
+ }
64
+ function SingleGroup({
65
+ value,
66
+ defaultValue,
67
+ onValueChange,
68
+ required,
69
+ ...props
70
+ }) {
71
+ const [inner, setInner] = React.useState(defaultValue ?? "");
72
+ const current = value ?? inner;
73
+ return /* @__PURE__ */ jsx(
74
+ ToggleGroupPrimitive.Root,
75
+ {
76
+ type: "single",
77
+ value: current,
78
+ onValueChange: (next) => {
79
+ if (required && !next) return;
80
+ if (value === void 0) setInner(next);
81
+ onValueChange?.(next);
82
+ },
83
+ ...props
84
+ }
85
+ );
86
+ }
87
+ var Chip = Object.assign(ChipBase, { Group: ChipGroup });
88
+
89
+ export {
90
+ Chip
91
+ };
92
+ //# sourceMappingURL=chunk-YH4LMWRU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chip/chip.tsx"],"sourcesContent":["// Client (a context). A chip is a pressable pill: alone it is a Radix Toggle (aria-pressed), inside `Chip.Group` an\n// item of a Radix Toggle Group (roving focus with the arrows; `single` = radio semantics, `multiple` = pressed\n// buttons). A `removable` chip is a static label with its own remove button (two buttons cannot nest).\nimport { Toggle as TogglePrimitive, ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const chip = tv({\n slots: {\n group: \"flex flex-wrap items-center gap-2 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch\",\n base:\n \"inline-flex shrink-0 select-none items-center justify-center gap-1.5 whitespace-nowrap rounded-full border 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 \"border-border-default bg-surface-1 text-fg-secondary hover:border-border-strong hover:text-fg \" +\n \"data-[state=on]:border-accent data-[state=on]:bg-accent-soft data-[state=on]:text-fg\",\n remove:\n \"-mr-1.5 inline-flex h-6 w-6 items-center justify-center rounded-full text-fg-secondary transition-colors hover:bg-surface-3 hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n },\n variants: {\n size: { sm: { base: \"h-7 px-3 text-xs\" }, md: { base: \"h-9 px-3.5 text-xs\" } },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport type ChipVariants = VariantProps<typeof chip>;\n\ntype GroupContext = { size: ChipVariants[\"size\"] };\nconst ChipGroupContext = React.createContext<GroupContext | null>(null);\n\nfunction RemoveIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\ntype ToggleChipProps = Omit<React.ComponentProps<\"button\">, \"value\" | \"defaultValue\"> &\n ChipVariants & {\n /**\n * sm · md (inside `Chip.Group`, the group's size by default).\n * @default \"md\"\n */\n size?: ChipVariants[\"size\"];\n /** Inside `Chip.Group`: the value this chip stands for (required there, ignored alone). */\n value?: string;\n /** Alone: pressed or not (`defaultSelected` uncontrolled), `onSelectedChange` on every press. */\n selected?: boolean;\n /** Alone: pressed at first, uncontrolled. */\n defaultSelected?: boolean;\n /** Alone: called with the new state on every press. */\n onSelectedChange?: (selected: boolean) => void;\n /** A pressable chip (the default); `true` makes it a static chip with a remove button. */\n removable?: false;\n };\n\ntype RemovableChipProps = Omit<React.ComponentProps<\"span\">, \"onSelect\"> &\n ChipVariants & {\n /** A static chip (a chosen tag, an applied filter) with a remove button. */\n removable: true;\n /** The accessible name of the remove button — passed translated, e.g. \"Remove #night\". */\n removeLabel: string;\n /** Runs when the remove button is pressed. */\n onRemove: () => void;\n /** Disables the remove button. */\n disabled?: boolean;\n };\n\nexport type ChipProps = ToggleChipProps | RemovableChipProps;\n\n/** A selectable pill (`selected` / `onSelectedChange`), an item of `Chip.Group` (`value`), or `removable`. */\nfunction ChipBase(props: ChipProps) {\n const group = React.useContext(ChipGroupContext);\n if (props.removable) {\n const { removable: _removable, removeLabel, onRemove, disabled, size, className, children, ...rest } = props;\n const s = chip({ size: size ?? group?.size });\n return (\n <span data-removable=\"\" className={s.base({ className })} {...rest}>\n {children}\n <button type=\"button\" aria-label={removeLabel} title={removeLabel} disabled={disabled} onClick={onRemove} className={s.remove()}>\n <RemoveIcon />\n </button>\n </span>\n );\n }\n const { removable: _removable, value, selected, defaultSelected, onSelectedChange, size, className, ...rest } = props;\n const s = chip({ size: size ?? group?.size });\n if (group) {\n if (value === undefined) throw new Error(\"Chip: a chip inside Chip.Group needs a `value`.\");\n return <ToggleGroupPrimitive.Item value={value} className={s.base({ className })} {...rest} />;\n }\n return (\n <TogglePrimitive.Root\n pressed={selected}\n defaultPressed={defaultSelected}\n onPressedChange={onSelectedChange}\n className={s.base({ className })}\n {...rest}\n />\n );\n}\n\ntype GroupBase = Omit<React.ComponentProps<\"div\">, \"defaultValue\" | \"dir\"> &\n ChipVariants & {\n /**\n * sm · md: the size of every chip of the group.\n * @default \"md\"\n */\n size?: ChipVariants[\"size\"];\n /** The group's accessible name — passed translated (\"Filter by format\"). */\n label?: string;\n /** The arrow keys that move: left / right (horizontal, a row) or up / down (vertical, a column). */\n orientation?: \"horizontal\" | \"vertical\";\n /** Arrow keys wrap from the last chip to the first (default `true`). */\n loop?: boolean;\n /** Disables every chip of the group. */\n disabled?: boolean;\n };\n\nexport type ChipGroupProps =\n | (GroupBase & {\n /** One choice: the chips behave as radios. */\n type: \"single\";\n /** The chosen value (controlled), `\"\"` when none. */\n value?: string;\n /** The value chosen at first, uncontrolled. */\n defaultValue?: string;\n /** Called with the new value on every choice. */\n onValueChange?: (value: string) => void;\n /** Keeps one chip selected: pressing the selected chip does not clear it (default `false`). */\n required?: boolean;\n })\n | (GroupBase & {\n /** Any number of choices: the chips are pressed buttons. */\n type: \"multiple\";\n /** The chosen values (controlled). */\n value?: string[];\n /** The values chosen at first, uncontrolled. */\n defaultValue?: string[];\n /** Called with the new values on every press. */\n onValueChange?: (value: string[]) => void;\n required?: never;\n });\n\n/** Chips that choose together: `type` single · multiple, `value`/`defaultValue` + `onValueChange`. */\nexport function ChipGroup({ label, size, className, children, ...props }: ChipGroupProps) {\n const s = chip({ size });\n const context = React.useMemo(() => ({ size }), [size]);\n const common = { \"aria-label\": label, className: s.group({ className }) };\n let group: React.ReactNode;\n if (props.type === \"single\") {\n const { type: _type, value, defaultValue, onValueChange, required, ...rest } = props;\n group = <SingleGroup {...rest} {...common} value={value} defaultValue={defaultValue} onValueChange={onValueChange} required={required}>{children}</SingleGroup>;\n } else {\n const { type: _type, required: _required, ...rest } = props;\n group = (\n <ToggleGroupPrimitive.Root type=\"multiple\" {...rest} {...common}>\n {children}\n </ToggleGroupPrimitive.Root>\n );\n }\n return <ChipGroupContext.Provider value={context}>{group}</ChipGroupContext.Provider>;\n}\n\n/** Radix's single group, plus `required`: the value is held here so that an empty change can be refused. */\nfunction SingleGroup({\n value,\n defaultValue,\n onValueChange,\n required,\n ...props\n}: Omit<GroupBase, \"size\" | \"label\"> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n required?: boolean;\n}) {\n const [inner, setInner] = React.useState(defaultValue ?? \"\");\n const current = value ?? inner;\n return (\n <ToggleGroupPrimitive.Root\n type=\"single\"\n value={current}\n onValueChange={(next) => {\n if (required && !next) return;\n if (value === undefined) setInner(next);\n onValueChange?.(next);\n }}\n {...props}\n />\n );\n}\n\n/** `Chip` (selectable, removable) and `Chip.Group` (single · multiple). */\nexport const Chip = Object.assign(ChipBase, { Group: ChipGroup });\n"],"mappings":"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","names":["_removable","size","className","rest","s"]}
@@ -0,0 +1,94 @@
1
+ "use client";
2
+
3
+ // src/glyphs.tsx
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ function Glyph({ className = "h-4 w-4", fill, children }) {
6
+ return /* @__PURE__ */ jsx(
7
+ "svg",
8
+ {
9
+ viewBox: "0 0 24 24",
10
+ className,
11
+ fill: fill ? "currentColor" : "none",
12
+ stroke: fill ? "none" : "currentColor",
13
+ strokeWidth: "2",
14
+ strokeLinecap: "round",
15
+ strokeLinejoin: "round",
16
+ "aria-hidden": true,
17
+ focusable: "false",
18
+ children
19
+ }
20
+ );
21
+ }
22
+ var PlayGlyph = (p) => /* @__PURE__ */ jsx(Glyph, { ...p, fill: true, children: /* @__PURE__ */ jsx("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" }) });
23
+ var PauseGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, fill: true, children: [
24
+ /* @__PURE__ */ jsx("rect", { x: "6", y: "5", width: "4", height: "14", rx: "1" }),
25
+ /* @__PURE__ */ jsx("rect", { x: "14", y: "5", width: "4", height: "14", rx: "1" })
26
+ ] });
27
+ var VolumeGlyph = ({ muted, ...p }) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
28
+ /* @__PURE__ */ jsx("path", { d: "M11 5 6 9H3v6h3l5 4V5Z" }),
29
+ muted ? /* @__PURE__ */ jsx("path", { d: "m22 9-6 6m0-6 6 6" }) : /* @__PURE__ */ jsx("path", { d: "M15.5 8.5a5 5 0 0 1 0 7M18.5 5.5a9 9 0 0 1 0 13" })
30
+ ] });
31
+ var FullscreenGlyph = ({ exit, ...p }) => /* @__PURE__ */ jsx(Glyph, { ...p, children: exit ? /* @__PURE__ */ jsx("path", { d: "M9 4v5H4m11-5v5h5M9 20v-5H4m11 5v-5h5" }) : /* @__PURE__ */ jsx("path", { d: "M4 9V4h5m6 0h5v5M4 15v5h5m11-5v5h-5" }) });
32
+ var CaptionsGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
33
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }),
34
+ /* @__PURE__ */ jsx("path", { d: "M10 10.5a2 2 0 1 0 0 3M17 10.5a2 2 0 1 0 0 3" })
35
+ ] });
36
+ var PipGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
37
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "5", width: "18", height: "14", rx: "2" }),
38
+ /* @__PURE__ */ jsx("rect", { x: "12", y: "12", width: "6", height: "4", rx: "1" })
39
+ ] });
40
+ var SearchGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
41
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "7" }),
42
+ /* @__PURE__ */ jsx("path", { d: "m20 20-3.5-3.5" })
43
+ ] });
44
+ var CloseGlyph = (p) => /* @__PURE__ */ jsx(Glyph, { ...p, children: /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" }) });
45
+ var ChevronGlyph = ({ direction = "down", ...p }) => /* @__PURE__ */ jsx(Glyph, { ...p, children: /* @__PURE__ */ jsx("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] }) });
46
+ var CheckGlyph = (p) => /* @__PURE__ */ jsx(Glyph, { ...p, children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) });
47
+ var PlusGlyph = (p) => /* @__PURE__ */ jsx(Glyph, { ...p, children: /* @__PURE__ */ jsx("path", { d: "M12 5v14M5 12h14" }) });
48
+ var CalendarGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
49
+ /* @__PURE__ */ jsx("rect", { x: "3", y: "5", width: "18", height: "16", rx: "2" }),
50
+ /* @__PURE__ */ jsx("path", { d: "M3 10h18M8 3v4M16 3v4" })
51
+ ] });
52
+ var UploadGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
53
+ /* @__PURE__ */ jsx("path", { d: "M12 16V4m0 0L7 9m5-5 5 5" }),
54
+ /* @__PURE__ */ jsx("path", { d: "M4 16v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2" })
55
+ ] });
56
+ var FileGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
57
+ /* @__PURE__ */ jsx("path", { d: "M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8l-5-5Z" }),
58
+ /* @__PURE__ */ jsx("path", { d: "M14 3v5h5" })
59
+ ] });
60
+ var CameraGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
61
+ /* @__PURE__ */ jsx("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" }),
62
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "13.5", r: "3.5" })
63
+ ] });
64
+ var FlipGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
65
+ /* @__PURE__ */ jsx("path", { d: "M4 12a8 8 0 0 1 14-5.3M20 12a8 8 0 0 1-14 5.3" }),
66
+ /* @__PURE__ */ jsx("path", { d: "M18 3v4h-4M6 21v-4h4" })
67
+ ] });
68
+ var RetryGlyph = (p) => /* @__PURE__ */ jsxs(Glyph, { ...p, children: [
69
+ /* @__PURE__ */ jsx("path", { d: "M4 12a8 8 0 1 0 2.3-5.7L4 8.5" }),
70
+ /* @__PURE__ */ jsx("path", { d: "M4 4v4.5h4.5" })
71
+ ] });
72
+ var SortGlyph = ({ direction, ...p }) => /* @__PURE__ */ jsx(Glyph, { ...p, children: direction === "ascending" ? /* @__PURE__ */ jsx("path", { d: "m7 14 5-5 5 5" }) : direction === "descending" ? /* @__PURE__ */ jsx("path", { d: "m7 10 5 5 5-5" }) : /* @__PURE__ */ jsx("path", { d: "m8 9 4-4 4 4M8 15l4 4 4-4" }) });
73
+
74
+ export {
75
+ PlayGlyph,
76
+ PauseGlyph,
77
+ VolumeGlyph,
78
+ FullscreenGlyph,
79
+ CaptionsGlyph,
80
+ PipGlyph,
81
+ SearchGlyph,
82
+ CloseGlyph,
83
+ ChevronGlyph,
84
+ CheckGlyph,
85
+ PlusGlyph,
86
+ CalendarGlyph,
87
+ UploadGlyph,
88
+ FileGlyph,
89
+ CameraGlyph,
90
+ FlipGlyph,
91
+ RetryGlyph,
92
+ SortGlyph
93
+ };
94
+ //# sourceMappingURL=chunk-YX6CNVJA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/glyphs.tsx"],"sourcesContent":["// 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"],"mappings":"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","names":[]}
@@ -0,0 +1,95 @@
1
+ "use client";
2
+
3
+ // src/listbox.ts
4
+ import * as React from "react";
5
+ function useListbox({ count, isDisabled = () => false, onPick, open, setOpen }) {
6
+ const id = React.useId();
7
+ const listId = `${id}-list`;
8
+ const [chosen, setActive] = React.useState(-1);
9
+ const active = open ? Math.min(chosen, count - 1) : -1;
10
+ const optionId = (index) => `${id}-opt-${index}`;
11
+ const step = (from, delta) => {
12
+ for (let i = 1; i <= count; i += 1) {
13
+ const next = (from + delta * i + count * 2) % count;
14
+ if (!isDisabled(next)) return next;
15
+ }
16
+ return -1;
17
+ };
18
+ const first = () => step(-1, 1);
19
+ const last = () => step(count, -1);
20
+ const onKeyDown = (event) => {
21
+ switch (event.key) {
22
+ case "ArrowDown":
23
+ event.preventDefault();
24
+ if (!open) {
25
+ setOpen(true);
26
+ setActive(event.altKey ? -1 : first());
27
+ } else setActive(active < 0 ? first() : step(active, 1));
28
+ return true;
29
+ case "ArrowUp":
30
+ event.preventDefault();
31
+ if (!open) {
32
+ setOpen(true);
33
+ setActive(last());
34
+ } else setActive(active < 0 ? last() : step(active, -1));
35
+ return true;
36
+ case "Home":
37
+ case "End":
38
+ if (!open || count === 0) return false;
39
+ event.preventDefault();
40
+ setActive(event.key === "Home" ? first() : last());
41
+ return true;
42
+ case "Enter":
43
+ if (!open || active < 0) return false;
44
+ event.preventDefault();
45
+ onPick(active);
46
+ return true;
47
+ case "Escape":
48
+ if (!open) return false;
49
+ event.preventDefault();
50
+ event.stopPropagation();
51
+ setOpen(false);
52
+ return true;
53
+ case "Tab":
54
+ if (open) setOpen(false);
55
+ return false;
56
+ default:
57
+ return false;
58
+ }
59
+ };
60
+ React.useEffect(() => {
61
+ if (active < 0 || typeof document === "undefined") return;
62
+ document.getElementById(`${id}-opt-${active}`)?.scrollIntoView?.({ block: "nearest" });
63
+ }, [active, id]);
64
+ return {
65
+ listId,
66
+ active,
67
+ setActive,
68
+ optionId,
69
+ onKeyDown,
70
+ /** The ARIA of the text input. */
71
+ inputProps: {
72
+ role: "combobox",
73
+ "aria-expanded": open,
74
+ "aria-controls": listId,
75
+ "aria-autocomplete": "list",
76
+ "aria-activedescendant": open && active >= 0 ? optionId(active) : void 0
77
+ },
78
+ /** The ARIA and pointer handlers of option `i` (a mouse down keeps the focus in the input). */
79
+ optionProps: (index, selected) => ({
80
+ id: optionId(index),
81
+ role: "option",
82
+ "aria-selected": selected,
83
+ "aria-disabled": isDisabled(index) || void 0,
84
+ "data-active": index === active ? "" : void 0,
85
+ onMouseDown: (event) => event.preventDefault(),
86
+ onMouseMove: () => !isDisabled(index) && index !== active && setActive(index),
87
+ onClick: () => !isDisabled(index) && onPick(index)
88
+ })
89
+ };
90
+ }
91
+
92
+ export {
93
+ useListbox
94
+ };
95
+ //# sourceMappingURL=chunk-ZIXB33X7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/listbox.ts"],"sourcesContent":["// The ARIA 1.2 combobox engine shared by `combobox`, `tag-input` and `search-field` (client): the focus stays in the\n// text input, the active option is pointed at by `aria-activedescendant`, the arrows walk the enabled options, Enter\n// picks, Escape closes. The caller renders the input and the options; this hook gives them their ARIA and keys.\nimport * as React from \"react\";\n\nexport type ListboxOptions = {\n /** How many options are shown. */\n count: number;\n /** Whether option `i` can be picked. */\n isDisabled?: (index: number) => boolean;\n /** Called when option `i` is picked (Enter or a click). */\n onPick: (index: number) => void;\n /** Whether the list is shown. */\n open: boolean;\n /** Opens or closes the list. */\n setOpen: (open: boolean) => void;\n};\n\nexport function useListbox({ count, isDisabled = () => false, onPick, open, setOpen }: ListboxOptions) {\n const id = React.useId();\n const listId = `${id}-list`;\n const [chosen, setActive] = React.useState(-1);\n // The active option is cleared when the list closes and stays inside it when it shrinks.\n const active = open ? Math.min(chosen, count - 1) : -1;\n const optionId = (index: number) => `${id}-opt-${index}`;\n\n const step = (from: number, delta: 1 | -1) => {\n for (let i = 1; i <= count; i += 1) {\n const next = (from + delta * i + count * 2) % count;\n if (!isDisabled(next)) return next;\n }\n return -1;\n };\n const first = () => step(-1, 1);\n const last = () => step(count, -1);\n\n /** Keys of the text input. Returns `true` when the key was handled (the caller then does nothing else with it). */\n const onKeyDown = (event: React.KeyboardEvent): boolean => {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!open) {\n setOpen(true);\n setActive(event.altKey ? -1 : first());\n } else setActive(active < 0 ? first() : step(active, 1));\n return true;\n case \"ArrowUp\":\n event.preventDefault();\n if (!open) {\n setOpen(true);\n setActive(last());\n } else setActive(active < 0 ? last() : step(active, -1));\n return true;\n case \"Home\":\n case \"End\":\n if (!open || count === 0) return false;\n event.preventDefault();\n setActive(event.key === \"Home\" ? first() : last());\n return true;\n case \"Enter\":\n if (!open || active < 0) return false;\n event.preventDefault();\n onPick(active);\n return true;\n case \"Escape\":\n if (!open) return false;\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return true;\n case \"Tab\":\n if (open) setOpen(false);\n return false;\n default:\n return false;\n }\n };\n\n // Keeps the active option in view while the arrows walk a long list.\n React.useEffect(() => {\n if (active < 0 || typeof document === \"undefined\") return;\n document.getElementById(`${id}-opt-${active}`)?.scrollIntoView?.({ block: \"nearest\" });\n }, [active, id]);\n\n return {\n listId,\n active,\n setActive,\n optionId,\n onKeyDown,\n /** The ARIA of the text input. */\n inputProps: {\n role: \"combobox\" as const,\n \"aria-expanded\": open,\n \"aria-controls\": listId,\n \"aria-autocomplete\": \"list\" as const,\n \"aria-activedescendant\": open && active >= 0 ? optionId(active) : undefined,\n },\n /** The ARIA and pointer handlers of option `i` (a mouse down keeps the focus in the input). */\n optionProps: (index: number, selected: boolean) => ({\n id: optionId(index),\n role: \"option\" as const,\n \"aria-selected\": selected,\n \"aria-disabled\": isDisabled(index) || undefined,\n \"data-active\": index === active ? \"\" : undefined,\n onMouseDown: (event: React.MouseEvent) => event.preventDefault(),\n onMouseMove: () => !isDisabled(index) && index !== active && setActive(index),\n onClick: () => !isDisabled(index) && onPick(index),\n }),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,188 @@
1
+ import * as tailwind_variants from 'tailwind-variants';
2
+ import * as React from 'react';
3
+
4
+ declare const combobox: tailwind_variants.TVReturnType<{
5
+ [key: string]: {
6
+ [key: string]: tailwind_variants.ClassValue | {
7
+ input?: tailwind_variants.ClassValue;
8
+ label?: tailwind_variants.ClassValue;
9
+ option?: tailwind_variants.ClassValue;
10
+ list?: tailwind_variants.ClassValue;
11
+ status?: tailwind_variants.ClassValue;
12
+ hint?: tailwind_variants.ClassValue;
13
+ root?: tailwind_variants.ClassValue;
14
+ check?: tailwind_variants.ClassValue;
15
+ description?: tailwind_variants.ClassValue;
16
+ error?: tailwind_variants.ClassValue;
17
+ control?: tailwind_variants.ClassValue;
18
+ icon?: tailwind_variants.ClassValue;
19
+ };
20
+ };
21
+ } | {
22
+ [x: string]: {
23
+ [x: string]: tailwind_variants.ClassValue | {
24
+ input?: tailwind_variants.ClassValue;
25
+ label?: tailwind_variants.ClassValue;
26
+ option?: tailwind_variants.ClassValue;
27
+ list?: tailwind_variants.ClassValue;
28
+ status?: tailwind_variants.ClassValue;
29
+ hint?: tailwind_variants.ClassValue;
30
+ root?: tailwind_variants.ClassValue;
31
+ check?: tailwind_variants.ClassValue;
32
+ description?: tailwind_variants.ClassValue;
33
+ error?: tailwind_variants.ClassValue;
34
+ control?: tailwind_variants.ClassValue;
35
+ icon?: tailwind_variants.ClassValue;
36
+ };
37
+ };
38
+ } | {}, {
39
+ root: string;
40
+ label: string;
41
+ control: string;
42
+ input: string;
43
+ icon: string;
44
+ list: string;
45
+ option: string;
46
+ check: string;
47
+ description: string;
48
+ status: string;
49
+ hint: string;
50
+ error: string;
51
+ }, undefined, {
52
+ [key: string]: {
53
+ [key: string]: tailwind_variants.ClassValue | {
54
+ input?: tailwind_variants.ClassValue;
55
+ label?: tailwind_variants.ClassValue;
56
+ option?: tailwind_variants.ClassValue;
57
+ list?: tailwind_variants.ClassValue;
58
+ status?: tailwind_variants.ClassValue;
59
+ hint?: tailwind_variants.ClassValue;
60
+ root?: tailwind_variants.ClassValue;
61
+ check?: tailwind_variants.ClassValue;
62
+ description?: tailwind_variants.ClassValue;
63
+ error?: tailwind_variants.ClassValue;
64
+ control?: tailwind_variants.ClassValue;
65
+ icon?: tailwind_variants.ClassValue;
66
+ };
67
+ };
68
+ } | {}, {
69
+ root: string;
70
+ label: string;
71
+ control: string;
72
+ input: string;
73
+ icon: string;
74
+ list: string;
75
+ option: string;
76
+ check: string;
77
+ description: string;
78
+ status: string;
79
+ hint: string;
80
+ error: string;
81
+ }, tailwind_variants.TVReturnTypeLike<unknown, {
82
+ root: string;
83
+ label: string;
84
+ control: string;
85
+ input: string;
86
+ icon: string;
87
+ list: string;
88
+ option: string;
89
+ check: string;
90
+ description: string;
91
+ status: string;
92
+ hint: string;
93
+ error: string;
94
+ }>>;
95
+ type ComboboxOption = {
96
+ /** What the app stores. */
97
+ value: string;
98
+ /** What the person reads, passed translated. */
99
+ label: string;
100
+ /** A second line under the label. */
101
+ description?: string;
102
+ /** Shown but not choosable. */
103
+ disabled?: boolean;
104
+ };
105
+ type ComboboxLabels = {
106
+ /** No option matches ("No results"). */
107
+ empty: string;
108
+ /** While `onSearch` runs ("Searching…"). */
109
+ loading: string;
110
+ /** `onSearch` failed ("Search unavailable"). */
111
+ error: string;
112
+ /** The option that creates a value: `(query) => "Create “" + query + "”"`. */
113
+ create: (query: string) => string;
114
+ /** A chip's remove button: `(label) => "Remove " + label`. */
115
+ remove: (label: string) => string;
116
+ /** The button that empties a single choice ("Clear"). */
117
+ clear: string;
118
+ /** The button that opens the list ("Show options"). */
119
+ toggle: string;
120
+ /** Announced when the results change: `(n) => n + " results"`. */
121
+ results: (count: number) => string;
122
+ };
123
+ declare const comboboxLabels: ComboboxLabels;
124
+ type BaseProps = {
125
+ /** The visible label of the field, passed translated (also its accessible name). */
126
+ label: string;
127
+ /** Hides the label visually, keeping it as the accessible name (a search bar with its own context). */
128
+ hideLabel?: boolean;
129
+ /** The options, filtered as the person types (by `filter`). */
130
+ options?: readonly ComboboxOption[];
131
+ /** Fetches the options for a query (debounced by `debounce`); the `signal` aborts when a newer query starts. */
132
+ onSearch?: (query: string, signal: AbortSignal) => Promise<readonly ComboboxOption[]>;
133
+ /** The wait, in ms, between the last key and `onSearch`. Default 250. */
134
+ debounce?: number;
135
+ /** Whether an option matches a query. Default: its label contains the query, ignoring case and accents. */
136
+ filter?: (option: ComboboxOption, query: string) => boolean;
137
+ /** Offers to create the query as a new value when no option has that exact label. */
138
+ creatable?: boolean;
139
+ /** Turns a query into the created option (an id from the server…). Default `{ value: query, label: query }`. */
140
+ onCreate?: (query: string) => ComboboxOption;
141
+ /** Keys that create the query at once, as Enter does (`[","]` for tags); a paste is split on them too. */
142
+ separators?: readonly string[];
143
+ /** The input's placeholder, passed translated. */
144
+ placeholder?: string;
145
+ /** A help text under the field. */
146
+ hint?: string;
147
+ /** An error under the field: marks it invalid and is read with it. */
148
+ error?: string;
149
+ /** Not available. */
150
+ disabled?: boolean;
151
+ /** The name of a hidden input holding the value(s), for a plain `<form>` post. */
152
+ name?: string;
153
+ /** The words, passed translated; English by default. */
154
+ labels?: Partial<ComboboxLabels>;
155
+ /** Classes merged on the root. */
156
+ className?: string;
157
+ /** The id of the text input (default: generated). */
158
+ id?: string;
159
+ };
160
+ type SingleProps = BaseProps & {
161
+ /** One value (default) or several. */
162
+ multiple?: false;
163
+ /** The chosen option (controlled), `null` for none. */
164
+ value?: ComboboxOption | null;
165
+ /** The chosen option at first, uncontrolled. */
166
+ defaultValue?: ComboboxOption | null;
167
+ /** Called with the chosen option, or `null` when it is cleared. */
168
+ onValueChange?: (value: ComboboxOption | null) => void;
169
+ /** Most options that can be chosen (several values only). */
170
+ maxSelected?: never;
171
+ };
172
+ type MultipleProps = BaseProps & {
173
+ /** Several values, shown as chips. */
174
+ multiple: true;
175
+ /** The chosen options (controlled). */
176
+ value?: readonly ComboboxOption[];
177
+ /** The chosen options at first, uncontrolled. */
178
+ defaultValue?: readonly ComboboxOption[];
179
+ /** Called with every chosen option. */
180
+ onValueChange?: (value: ComboboxOption[]) => void;
181
+ /** Most options that can be chosen; the list stops offering more past it. */
182
+ maxSelected?: number;
183
+ };
184
+ type ComboboxProps = SingleProps | MultipleProps;
185
+ /** A text field that suggests, filters and completes: one value or several (chips), static or fetched, creatable. */
186
+ declare function Combobox(props: ComboboxProps): React.JSX.Element;
187
+
188
+ export { Combobox, type ComboboxLabels, type ComboboxOption, type ComboboxProps, combobox, comboboxLabels };
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import {
3
+ Combobox,
4
+ combobox,
5
+ comboboxLabels
6
+ } from "./chunk-XUMJA5ZI.js";
7
+ import "./chunk-YH4LMWRU.js";
8
+ import "./chunk-ZIXB33X7.js";
9
+ import "./chunk-EUPTXKH7.js";
10
+ import "./chunk-YX6CNVJA.js";
11
+ export {
12
+ Combobox,
13
+ combobox,
14
+ comboboxLabels
15
+ };
16
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}