@krizaka/ui 3.53.0 → 3.55.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 (504) hide show
  1. package/README.md +1 -0
  2. package/dist/account-menu.d.ts +6 -2
  3. package/dist/account-menu.js +8 -1
  4. package/dist/account-menu.js.map +1 -1
  5. package/dist/account-settings.js +28 -88
  6. package/dist/account-settings.js.map +1 -1
  7. package/dist/anatomy-plate.d.ts +4 -1
  8. package/dist/anatomy-plate.js +4 -0
  9. package/dist/anatomy-plate.js.map +1 -1
  10. package/dist/app-header/search.d.ts +63 -0
  11. package/dist/app-header/search.js +70 -0
  12. package/dist/app-header/search.js.map +1 -0
  13. package/dist/app-header.d.ts +88 -4
  14. package/dist/app-header.js +63 -5
  15. package/dist/app-header.js.map +1 -1
  16. package/dist/app-shell.js +31 -40
  17. package/dist/app-shell.js.map +1 -1
  18. package/dist/argument-card.js +3 -3
  19. package/dist/bird-plate.d.ts +3 -1
  20. package/dist/bird-plate.js +2 -2
  21. package/dist/bird-plate.js.map +1 -1
  22. package/dist/blocks.css +202 -27
  23. package/dist/chapter.d.ts +20 -3
  24. package/dist/chapter.js +82 -31
  25. package/dist/chapter.js.map +1 -1
  26. package/dist/chat.js +2 -2
  27. package/dist/chat.js.map +1 -1
  28. package/dist/checkbox.js +1 -1
  29. package/dist/checkbox.js.map +1 -1
  30. package/dist/chip.js +5 -98
  31. package/dist/chip.js.map +1 -1
  32. package/dist/choice-grid.js +28 -88
  33. package/dist/choice-grid.js.map +1 -1
  34. package/dist/{chunk-YGIN2YIY.js → chunk-3X3OF4TI.js} +2 -2
  35. package/dist/chunk-3X3OF4TI.js.map +1 -0
  36. package/dist/chunk-5VEVYDVC.js +11 -0
  37. package/dist/chunk-5VEVYDVC.js.map +1 -0
  38. package/dist/chunk-7U5TXA5Q.js +105 -0
  39. package/dist/chunk-7U5TXA5Q.js.map +1 -0
  40. package/dist/{chunk-KBQD6HE3.js → chunk-AEP3K4YD.js} +3 -3
  41. package/dist/{chunk-KBQD6HE3.js.map → chunk-AEP3K4YD.js.map} +1 -1
  42. package/dist/chunk-BDIU5LZB.js +18 -0
  43. package/dist/chunk-BDIU5LZB.js.map +1 -0
  44. package/dist/chunk-CSRKYZ53.js +39 -0
  45. package/dist/chunk-CSRKYZ53.js.map +1 -0
  46. package/dist/chunk-HEKDKM5Y.js +128 -0
  47. package/dist/chunk-HEKDKM5Y.js.map +1 -0
  48. package/dist/chunk-KGLRZMCY.js +16 -0
  49. package/dist/chunk-KGLRZMCY.js.map +1 -0
  50. package/dist/chunk-KID32IRJ.js +18 -0
  51. package/dist/chunk-KID32IRJ.js.map +1 -0
  52. package/dist/{chunk-ZQW7LF4Y.js → chunk-OIMXKRXF.js} +2 -2
  53. package/dist/{chunk-YHKTYFOQ.js → chunk-QWKCNSPF.js} +271 -47
  54. package/dist/chunk-QWKCNSPF.js.map +1 -0
  55. package/dist/{chunk-4LYKBSOG.js → chunk-USPOIQV5.js} +2 -2
  56. package/dist/chunk-USPOIQV5.js.map +1 -0
  57. package/dist/{chunk-7NRSPHAF.js → chunk-VB7MWE2N.js} +2 -2
  58. package/dist/{chunk-7NRSPHAF.js.map → chunk-VB7MWE2N.js.map} +1 -1
  59. package/dist/chunk-VIPSZXO4.js +103 -0
  60. package/dist/chunk-VIPSZXO4.js.map +1 -0
  61. package/dist/chunk-YCZ7N6Q6.js +385 -0
  62. package/dist/chunk-YCZ7N6Q6.js.map +1 -0
  63. package/dist/code-block.js +81 -98
  64. package/dist/code-block.js.map +1 -1
  65. package/dist/combobox.js +2 -2
  66. package/dist/component-page.d.ts +4 -1
  67. package/dist/component-page.js +5 -0
  68. package/dist/component-page.js.map +1 -1
  69. package/dist/continue-prompt.d.ts +4 -1
  70. package/dist/continue-prompt.js +4 -0
  71. package/dist/continue-prompt.js.map +1 -1
  72. package/dist/data-table.d.ts +60 -4
  73. package/dist/data-table.js +19 -7
  74. package/dist/date-picker.js +2 -2
  75. package/dist/date-picker.js.map +1 -1
  76. package/dist/detail-layout.d.ts +28 -17
  77. package/dist/detail-layout.js +73 -16
  78. package/dist/detail-layout.js.map +1 -1
  79. package/dist/doodle.d.ts +21 -0
  80. package/dist/doodle.js +39 -0
  81. package/dist/doodle.js.map +1 -0
  82. package/dist/drop-overlay.d.ts +12 -4
  83. package/dist/drop-overlay.js +16 -6
  84. package/dist/drop-overlay.js.map +1 -1
  85. package/dist/elephant.d.ts +2 -0
  86. package/dist/elephant.js +4 -0
  87. package/dist/elephant.js.map +1 -1
  88. package/dist/field.js +1 -1
  89. package/dist/field.js.map +1 -1
  90. package/dist/filter-bar.js +2 -2
  91. package/dist/force-update-screen.d.ts +5 -1
  92. package/dist/force-update-screen.js +4 -0
  93. package/dist/force-update-screen.js.map +1 -1
  94. package/dist/gallery-page.d.ts +4 -1
  95. package/dist/gallery-page.js +4 -0
  96. package/dist/gallery-page.js.map +1 -1
  97. package/dist/genui.js +5 -5
  98. package/dist/image-cropper.d.ts +10 -2
  99. package/dist/image-cropper.js +4 -0
  100. package/dist/image-cropper.js.map +1 -1
  101. package/dist/kanban.d.ts +3 -0
  102. package/dist/kanban.js +4 -0
  103. package/dist/kanban.js.map +1 -1
  104. package/dist/landscape.d.ts +4 -1
  105. package/dist/landscape.js +4 -0
  106. package/dist/landscape.js.map +1 -1
  107. package/dist/list.js +1 -1
  108. package/dist/maintenance-screen.d.ts +5 -1
  109. package/dist/maintenance-screen.js +4 -0
  110. package/dist/maintenance-screen.js.map +1 -1
  111. package/dist/map.js +6 -0
  112. package/dist/map.js.map +1 -1
  113. package/dist/markdown.d.ts +5 -1
  114. package/dist/markdown.js +12 -5
  115. package/dist/markdown.js.map +1 -1
  116. package/dist/match-dialog.d.ts +4 -1
  117. package/dist/match-dialog.js +4 -0
  118. package/dist/match-dialog.js.map +1 -1
  119. package/dist/media-capture.d.ts +6 -1
  120. package/dist/media-capture.js +4 -0
  121. package/dist/media-capture.js.map +1 -1
  122. package/dist/meter.js +5 -121
  123. package/dist/meter.js.map +1 -1
  124. package/dist/native/map.js +6 -0
  125. package/dist/native/map.js.map +1 -1
  126. package/dist/native/markdown.d.ts +9 -2
  127. package/dist/native/markdown.js +46 -7
  128. package/dist/native/markdown.js.map +1 -1
  129. package/dist/native/media-capture.d.ts +1 -0
  130. package/dist/native/media-capture.js +5 -0
  131. package/dist/native/media-capture.js.map +1 -1
  132. package/dist/native/vertical-video.d.ts +8 -2
  133. package/dist/native/vertical-video.js +6 -0
  134. package/dist/native/vertical-video.js.map +1 -1
  135. package/dist/native.d.ts +94 -4
  136. package/dist/native.js +1236 -1110
  137. package/dist/native.js.map +1 -1
  138. package/dist/nav-bar/me.d.ts +32 -0
  139. package/dist/nav-bar/me.js +23 -0
  140. package/dist/nav-bar/me.js.map +1 -0
  141. package/dist/nav-bar.d.ts +60 -2
  142. package/dist/nav-bar.js +92 -48
  143. package/dist/nav-bar.js.map +1 -1
  144. package/dist/notification-preferences.d.ts +151 -0
  145. package/dist/notification-preferences.js +77 -0
  146. package/dist/notification-preferences.js.map +1 -0
  147. package/dist/page-header.js +1 -1
  148. package/dist/page-header.js.map +1 -1
  149. package/dist/pointer-light.js +5 -0
  150. package/dist/pointer-light.js.map +1 -1
  151. package/dist/product-page.d.ts +4 -1
  152. package/dist/product-page.js +4 -0
  153. package/dist/product-page.js.map +1 -1
  154. package/dist/profile-card.d.ts +119 -1
  155. package/dist/profile-card.js +68 -21
  156. package/dist/profile-card.js.map +1 -1
  157. package/dist/promise-card.d.ts +4 -1
  158. package/dist/promise-card.js +4 -0
  159. package/dist/promise-card.js.map +1 -1
  160. package/dist/quota-meter.d.ts +113 -0
  161. package/dist/quota-meter.js +58 -0
  162. package/dist/quota-meter.js.map +1 -0
  163. package/dist/radio-group.js +6 -8
  164. package/dist/radio-group.js.map +1 -1
  165. package/dist/rail-nav.d.ts +18 -2
  166. package/dist/rail-nav.js +25 -2
  167. package/dist/rail-nav.js.map +1 -1
  168. package/dist/retro-tv.d.ts +30 -0
  169. package/dist/retro-tv.js +124 -0
  170. package/dist/retro-tv.js.map +1 -0
  171. package/dist/router.d.ts +12 -1
  172. package/dist/router.js +85 -8
  173. package/dist/router.js.map +1 -1
  174. package/dist/scroll-stage.d.ts +5 -1
  175. package/dist/scroll-stage.js +5 -0
  176. package/dist/scroll-stage.js.map +1 -1
  177. package/dist/search-field.js +1 -1
  178. package/dist/showcase.d.ts +9 -2
  179. package/dist/showcase.js +5 -0
  180. package/dist/showcase.js.map +1 -1
  181. package/dist/signature.d.ts +19 -0
  182. package/dist/signature.js +39 -0
  183. package/dist/signature.js.map +1 -0
  184. package/dist/site-footer.js +1 -1
  185. package/dist/sites.js +1 -1
  186. package/dist/sites.js.map +1 -1
  187. package/dist/slot.d.ts +1 -1
  188. package/dist/stat.js +1 -1
  189. package/dist/stat.js.map +1 -1
  190. package/dist/status-page.d.ts +4 -1
  191. package/dist/status-page.js +5 -0
  192. package/dist/status-page.js.map +1 -1
  193. package/dist/stuck.d.ts +27 -0
  194. package/dist/stuck.js +26 -0
  195. package/dist/stuck.js.map +1 -0
  196. package/dist/swipe-deck.d.ts +9 -2
  197. package/dist/swipe-deck.js +5 -0
  198. package/dist/swipe-deck.js.map +1 -1
  199. package/dist/switch.js +4 -32
  200. package/dist/switch.js.map +1 -1
  201. package/dist/tabs.d.ts +47 -8
  202. package/dist/tabs.js +62 -12
  203. package/dist/tabs.js.map +1 -1
  204. package/dist/tag-input.js +2 -2
  205. package/dist/tag-selector.js +1 -1
  206. package/dist/terminal-replay.d.ts +4 -1
  207. package/dist/terminal-replay.js +4 -0
  208. package/dist/terminal-replay.js.map +1 -1
  209. package/dist/tree-view.js +4 -0
  210. package/dist/tree-view.js.map +1 -1
  211. package/dist/update-prompt.d.ts +5 -1
  212. package/dist/update-prompt.js +4 -0
  213. package/dist/update-prompt.js.map +1 -1
  214. package/dist/video-player.js +7 -376
  215. package/dist/video-player.js.map +1 -1
  216. package/dist/video-trimmer.d.ts +6 -1
  217. package/dist/video-trimmer.js +4 -0
  218. package/dist/video-trimmer.js.map +1 -1
  219. package/package.json +143 -31
  220. package/registry/account-menu.json +9 -8
  221. package/registry/account-settings.json +2 -2
  222. package/registry/achievement.json +3 -4
  223. package/registry/action-bar.json +3 -3
  224. package/registry/action-sheet.json +1 -0
  225. package/registry/activity-feed.json +2 -1
  226. package/registry/agenda.json +1 -1
  227. package/registry/alert.json +1 -1
  228. package/registry/anatomy-plate.json +13 -5
  229. package/registry/app-header.json +470 -23
  230. package/registry/app-shell.json +2 -2
  231. package/registry/argument-card.json +1 -1
  232. package/registry/audio-player.json +1 -1
  233. package/registry/auth-layout.json +1 -1
  234. package/registry/avatar.json +3 -2
  235. package/registry/badge.json +2 -1
  236. package/registry/bird-plate.json +16 -2
  237. package/registry/button.json +7 -6
  238. package/registry/captcha.json +1 -1
  239. package/registry/card-grid.json +1 -1
  240. package/registry/card.json +7 -6
  241. package/registry/catalogue-page.json +3 -4
  242. package/registry/changelog-page.json +3 -5
  243. package/registry/chapter.json +46 -10
  244. package/registry/chat.json +3 -2
  245. package/registry/checkbox.json +4 -3
  246. package/registry/chip-link.json +2 -2
  247. package/registry/chip-row.json +2 -2
  248. package/registry/chip.json +3 -2
  249. package/registry/choice-grid.json +3 -4
  250. package/registry/code-block.json +1 -1
  251. package/registry/combobox.json +3 -2
  252. package/registry/command.json +2 -2
  253. package/registry/comparison-table.json +1 -1
  254. package/registry/component-page.json +14 -5
  255. package/registry/confirm-button.json +4 -4
  256. package/registry/contact-page.json +1 -1
  257. package/registry/continue-prompt.json +13 -5
  258. package/registry/countdown.json +4 -3
  259. package/registry/cover-hero.json +3 -4
  260. package/registry/cta-panel.json +1 -1
  261. package/registry/dashboard-layout.json +1 -1
  262. package/registry/data-table.json +63 -7
  263. package/registry/date-picker.json +5 -4
  264. package/registry/decision-list.json +1 -1
  265. package/registry/description-list.json +2 -1
  266. package/registry/detail-layout.json +30 -6
  267. package/registry/dialog.json +7 -6
  268. package/registry/docs-article-page.json +3 -4
  269. package/registry/docs-hub-page.json +1 -1
  270. package/registry/docs-layout.json +1 -1
  271. package/registry/docs-nav.json +1 -1
  272. package/registry/document-viewer.json +3 -5
  273. package/registry/doodle.json +209 -0
  274. package/registry/drop-overlay.json +30 -16
  275. package/registry/dropdown-menu.json +2 -2
  276. package/registry/elephant.json +15 -7
  277. package/registry/empty-state.json +2 -1
  278. package/registry/engine-flow.json +1 -1
  279. package/registry/error-page.json +3 -5
  280. package/registry/examples/app-header/family.d.ts +4 -0
  281. package/registry/examples/app-header/family.js +41 -0
  282. package/registry/examples/app-header/family.tsx +37 -0
  283. package/registry/examples/app-header/native/family.d.ts +4 -0
  284. package/registry/examples/app-header/native/family.dark.png +0 -0
  285. package/registry/examples/app-header/native/family.js +25 -0
  286. package/registry/examples/app-header/native/family.light.png +0 -0
  287. package/registry/examples/app-header/native/family.tsx +33 -0
  288. package/registry/examples/chapter/album.d.ts +4 -0
  289. package/registry/examples/chapter/album.js +34 -0
  290. package/registry/examples/chapter/album.tsx +30 -0
  291. package/registry/examples/chapter/in-ruled-page.d.ts +4 -0
  292. package/registry/examples/chapter/in-ruled-page.js +23 -0
  293. package/registry/examples/chapter/in-ruled-page.tsx +19 -0
  294. package/registry/examples/data-table/applicant-files.d.ts +4 -0
  295. package/registry/examples/data-table/applicant-files.js +24 -0
  296. package/registry/examples/data-table/applicant-files.tsx +23 -0
  297. package/registry/examples/data-table/checks.d.ts +4 -0
  298. package/registry/examples/data-table/checks.js +25 -0
  299. package/registry/examples/data-table/checks.tsx +24 -0
  300. package/registry/examples/detail-layout/profile.d.ts +4 -0
  301. package/registry/examples/detail-layout/profile.js +26 -0
  302. package/registry/examples/detail-layout/profile.tsx +21 -0
  303. package/registry/examples/doodle/kinds.d.ts +4 -0
  304. package/registry/examples/doodle/kinds.js +17 -0
  305. package/registry/examples/doodle/kinds.tsx +14 -0
  306. package/registry/examples/doodle/margin.d.ts +4 -0
  307. package/registry/examples/doodle/margin.js +17 -0
  308. package/registry/examples/doodle/margin.tsx +17 -0
  309. package/registry/examples/markdown/native/basic.dark.png +0 -0
  310. package/registry/examples/markdown/native/basic.light.png +0 -0
  311. package/registry/examples/markdown/native/wide-table.d.ts +4 -0
  312. package/registry/examples/markdown/native/wide-table.dark.png +0 -0
  313. package/registry/examples/markdown/native/wide-table.js +23 -0
  314. package/registry/examples/markdown/native/wide-table.light.png +0 -0
  315. package/registry/examples/markdown/native/wide-table.tsx +22 -0
  316. package/registry/examples/markdown/wide-table.d.ts +4 -0
  317. package/registry/examples/markdown/wide-table.js +28 -0
  318. package/registry/examples/markdown/wide-table.tsx +23 -0
  319. package/registry/examples/nav-bar/family-product.js +2 -4
  320. package/registry/examples/nav-bar/family-product.tsx +3 -5
  321. package/registry/examples/notification-preferences/default.d.ts +4 -0
  322. package/registry/examples/notification-preferences/default.js +29 -0
  323. package/registry/examples/notification-preferences/default.tsx +28 -0
  324. package/registry/examples/profile-card/banner.d.ts +4 -0
  325. package/registry/examples/profile-card/banner.js +28 -0
  326. package/registry/examples/profile-card/banner.tsx +24 -0
  327. package/registry/examples/profile-card/native/banner.d.ts +4 -0
  328. package/registry/examples/profile-card/native/banner.dark.png +0 -0
  329. package/registry/examples/profile-card/native/banner.js +22 -0
  330. package/registry/examples/profile-card/native/banner.light.png +0 -0
  331. package/registry/examples/profile-card/native/banner.tsx +18 -0
  332. package/registry/examples/quota-meter/default.d.ts +4 -0
  333. package/registry/examples/quota-meter/default.js +26 -0
  334. package/registry/examples/quota-meter/default.tsx +20 -0
  335. package/registry/examples/quota-meter/full.d.ts +4 -0
  336. package/registry/examples/quota-meter/full.js +25 -0
  337. package/registry/examples/quota-meter/full.tsx +18 -0
  338. package/registry/examples/rail-nav/shortcuts.d.ts +4 -0
  339. package/registry/examples/rail-nav/shortcuts.js +49 -0
  340. package/registry/examples/rail-nav/shortcuts.tsx +40 -0
  341. package/registry/examples/retro-tv/cabinet.d.ts +4 -0
  342. package/registry/examples/retro-tv/cabinet.js +12 -0
  343. package/registry/examples/retro-tv/cabinet.tsx +7 -0
  344. package/registry/examples/retro-tv/portable.d.ts +4 -0
  345. package/registry/examples/retro-tv/portable.js +12 -0
  346. package/registry/examples/retro-tv/portable.tsx +7 -0
  347. package/registry/examples/signature/both.d.ts +4 -0
  348. package/registry/examples/signature/both.js +11 -0
  349. package/registry/examples/signature/both.tsx +6 -0
  350. package/registry/examples/signature/variants.d.ts +4 -0
  351. package/registry/examples/signature/variants.js +14 -0
  352. package/registry/examples/signature/variants.tsx +11 -0
  353. package/registry/examples/stuck/card.d.ts +4 -0
  354. package/registry/examples/stuck/card.js +13 -0
  355. package/registry/examples/stuck/card.tsx +14 -0
  356. package/registry/examples/stuck/holds.d.ts +4 -0
  357. package/registry/examples/stuck/holds.js +12 -0
  358. package/registry/examples/stuck/holds.tsx +16 -0
  359. package/registry/examples/stuck/tag.d.ts +4 -0
  360. package/registry/examples/stuck/tag.js +12 -0
  361. package/registry/examples/stuck/tag.tsx +13 -0
  362. package/registry/examples/tabs/binder.d.ts +4 -0
  363. package/registry/examples/tabs/binder.js +22 -0
  364. package/registry/examples/tabs/binder.tsx +20 -0
  365. package/registry/examples/tabs/native/binder.d.ts +4 -0
  366. package/registry/examples/tabs/native/binder.dark.png +0 -0
  367. package/registry/examples/tabs/native/binder.js +26 -0
  368. package/registry/examples/tabs/native/binder.light.png +0 -0
  369. package/registry/examples/tabs/native/binder.tsx +22 -0
  370. package/registry/fab.json +1 -0
  371. package/registry/field.json +3 -2
  372. package/registry/file-upload.json +6 -11
  373. package/registry/filter-bar.json +2 -2
  374. package/registry/flock.json +3 -4
  375. package/registry/footnote.json +2 -3
  376. package/registry/force-update-screen.json +14 -5
  377. package/registry/form.json +5 -4
  378. package/registry/gallery-page.json +14 -5
  379. package/registry/genui.json +2 -2
  380. package/registry/glossary-term.json +1 -1
  381. package/registry/glossary.json +1 -1
  382. package/registry/glow-card.json +2 -2
  383. package/registry/goal-gauge.json +2 -1
  384. package/registry/header.json +1 -0
  385. package/registry/how-it-works-page.json +3 -5
  386. package/registry/image-cropper.json +13 -5
  387. package/registry/image-viewer.json +3 -4
  388. package/registry/index.json +306 -91
  389. package/registry/iso.json +1 -1
  390. package/registry/kanban.json +13 -5
  391. package/registry/kbd.json +1 -1
  392. package/registry/kpi-explained.json +2 -2
  393. package/registry/landing-page.json +3 -5
  394. package/registry/landscape.json +13 -5
  395. package/registry/language-switch.json +1 -1
  396. package/registry/legal-page.json +1 -1
  397. package/registry/link-card.json +1 -1
  398. package/registry/list.json +2 -1
  399. package/registry/loader.json +2 -1
  400. package/registry/longform-page.json +1 -1
  401. package/registry/maintenance-screen.json +14 -5
  402. package/registry/map.json +3 -2
  403. package/registry/markdown.json +86 -9
  404. package/registry/marketing-layout.json +1 -1
  405. package/registry/marquee.json +1 -1
  406. package/registry/mascot-quote.json +1 -1
  407. package/registry/mascot-state.json +12 -11
  408. package/registry/mascots.json +2 -1
  409. package/registry/match-dialog.json +14 -5
  410. package/registry/media-capture.json +14 -5
  411. package/registry/media-gallery.json +3 -5
  412. package/registry/media-grid.json +1 -1
  413. package/registry/media-picker.json +2 -3
  414. package/registry/meta-row.json +2 -1
  415. package/registry/meter.json +4 -3
  416. package/registry/nav-bar.json +100 -9
  417. package/registry/next-actions.json +1 -1
  418. package/registry/notification-preferences.json +250 -0
  419. package/registry/number-ticker.json +2 -1
  420. package/registry/onboarding.json +1 -0
  421. package/registry/opening-hours.json +1 -1
  422. package/registry/otp-input.json +1 -0
  423. package/registry/page-header.json +2 -2
  424. package/registry/page-hero.json +1 -1
  425. package/registry/page-index.json +1 -1
  426. package/registry/page.json +3 -3
  427. package/registry/pagination.json +2 -1
  428. package/registry/permission-prompt.json +2 -2
  429. package/registry/photo-grid.json +4 -4
  430. package/registry/pointer-light.json +6 -2
  431. package/registry/popover.json +2 -2
  432. package/registry/pricing-page.json +4 -6
  433. package/registry/product-page.json +14 -5
  434. package/registry/profile-card.json +232 -8
  435. package/registry/progress.json +4 -3
  436. package/registry/promise-card.json +13 -5
  437. package/registry/pull-to-refresh.json +1 -0
  438. package/registry/quota-meter.json +308 -0
  439. package/registry/radio-group.json +4 -3
  440. package/registry/rail-nav.json +48 -10
  441. package/registry/recipes.json +1 -1
  442. package/registry/retro-tv.json +478 -0
  443. package/registry/router.json +3 -3
  444. package/registry/screen.json +1 -0
  445. package/registry/scroll-stage.json +14 -5
  446. package/registry/search-field.json +3 -2
  447. package/registry/section-backdrop.json +1 -1
  448. package/registry/segmented.json +1 -0
  449. package/registry/separator.json +2 -2
  450. package/registry/service-card.json +1 -1
  451. package/registry/settings-layout.json +2 -1
  452. package/registry/showcase.json +14 -5
  453. package/registry/signature.json +185 -0
  454. package/registry/site-footer.json +3 -3
  455. package/registry/sites.json +2 -2
  456. package/registry/skeleton.json +2 -1
  457. package/registry/skip-link.json +1 -1
  458. package/registry/slider.json +5 -4
  459. package/registry/slot-picker.json +1 -1
  460. package/registry/slot.json +2 -2
  461. package/registry/specimen-tag.json +1 -1
  462. package/registry/spinner.json +4 -3
  463. package/registry/splash-handoff.json +1 -0
  464. package/registry/split-view.json +1 -1
  465. package/registry/stage-banner.json +2 -3
  466. package/registry/stat.json +2 -2
  467. package/registry/status-page.json +13 -5
  468. package/registry/step-progress.json +2 -1
  469. package/registry/step-showcase.json +3 -5
  470. package/registry/stepper.json +2 -1
  471. package/registry/sticky-action.json +1 -1
  472. package/registry/stuck.json +219 -0
  473. package/registry/swipe-deck.json +14 -5
  474. package/registry/swipeable-row.json +1 -0
  475. package/registry/switch.json +3 -2
  476. package/registry/tab-bar.json +1 -0
  477. package/registry/tabs.json +154 -22
  478. package/registry/tag-input.json +1 -1
  479. package/registry/tag-selector.json +2 -1
  480. package/registry/taped-photo.json +1 -1
  481. package/registry/terminal-replay.json +14 -5
  482. package/registry/text-style.json +5 -5
  483. package/registry/theme.json +2 -1
  484. package/registry/toast.json +2 -1
  485. package/registry/toc.json +1 -1
  486. package/registry/tooltip.json +2 -2
  487. package/registry/tree-view.json +6 -2
  488. package/registry/txt.json +1 -0
  489. package/registry/update-prompt.json +14 -5
  490. package/registry/upload-queue.json +1 -1
  491. package/registry/verified-badge.json +6 -6
  492. package/registry/vertical-video.json +8 -3
  493. package/registry/video-player.json +5 -6
  494. package/registry/video-trimmer.json +13 -5
  495. package/registry/virtual.json +2 -2
  496. package/registry/waveform.json +4 -3
  497. package/dist/chunk-4LYKBSOG.js.map +0 -1
  498. package/dist/chunk-HHFWK2HH.js +0 -163
  499. package/dist/chunk-HHFWK2HH.js.map +0 -1
  500. package/dist/chunk-R3LTSMS5.js +0 -75
  501. package/dist/chunk-R3LTSMS5.js.map +0 -1
  502. package/dist/chunk-YGIN2YIY.js.map +0 -1
  503. package/dist/chunk-YHKTYFOQ.js.map +0 -1
  504. /package/dist/{chunk-ZQW7LF4Y.js.map → chunk-OIMXKRXF.js.map} +0 -0
package/dist/stat.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stat/stat.tsx"],"sourcesContent":["// Server-safe. A key figure: a label, the value in tabular digits, a hint, a trend. Every word is a prop.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const stat = tv({\n slots: {\n root: \"flex min-w-0 flex-col gap-1\",\n label: \"text-xs font-semibold text-fg-secondary\",\n value: \"font-display text-2xl font-black tabular-nums text-fg\",\n meta: \"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs\",\n // The status tokens are too light for small text on a light surface: the words stay a text role, the arrow carries\n // the direction's colour.\n trend: \"inline-flex items-center gap-1 font-semibold text-fg [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0\",\n hint: \"text-fg-secondary\",\n chart: \"mt-2 h-10 w-full min-w-0\",\n },\n variants: {\n trend: {\n up: { trend: \"[&>svg]:text-success\" },\n down: { trend: \"[&>svg]:text-danger\" },\n flat: { trend: \"[&>svg]:text-fg-secondary\" },\n },\n },\n});\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nconst ARROW: Record<StatTrend, string> = { up: \"M7 17 17 7M8 7h9v9\", down: \"M7 7l10 10M17 8v9H8\", flat: \"M5 12h14M13 6l6 6-6 6\" };\n\nexport type StatProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n /** What the figure is (\"Revenue\"), above it. */\n label: React.ReactNode;\n /** The figure, formatted by the app, in tabular digits. */\n value: React.ReactNode;\n /** A line under the value: the period, the comparison. */\n hint?: React.ReactNode;\n /** The direction of the change; its arrow is decorative. */\n trend?: StatTrend;\n /** The change, in words, as read and shown (e.g. \"+12 % vs last week\") — the arrow alone says nothing. */\n trendLabel?: React.ReactNode;\n /** Under the figure: a `Sparkline` of @krizaka/charts (its own accessible summary), a `Meter`. */\n chart?: React.ReactNode;\n};\n\nexport function Stat({ label, value, hint, trend, trendLabel, chart, className, ...props }: StatProps) {\n const s = stat({ trend });\n return (\n <div data-trend={trend} className={s.root({ className })} {...props}>\n <p className={s.label()}>{label}</p>\n <p className={s.value()}>{value}</p>\n {(trendLabel || hint) && (\n <p className={s.meta()}>\n {trend && trendLabel && (\n <span className={s.trend()}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={ARROW[trend]} />\n </svg>\n {trendLabel}\n </span>\n )}\n {hint && <span className={s.hint()}>{hint}</span>}\n </p>\n )}\n {chart ? <div className={s.chart()}>{chart}</div> : null}\n </div>\n );\n}\n\nexport const statGrid = tv({\n base: \"grid w-full grid-cols-[repeat(auto-fit,minmax(var(--kz-stat-min,11rem),1fr))] overflow-hidden rounded-xl border border-border-default bg-surface-1\",\n variants: {\n divided: {\n true: \"gap-px bg-border-subtle [&>*]:bg-surface-1 [&>*]:p-5\",\n false: \"gap-6 p-5\",\n },\n },\n defaultVariants: { divided: true },\n});\n\nexport type StatGridProps = React.ComponentProps<\"div\"> & {\n /** Hairlines between the stats (default) or space only. */\n divided?: boolean;\n /** The narrowest a stat may be before the row wraps, in rem. Default 11. */\n minWidth?: number;\n};\n\n/** A row of key figures that wraps with the width: a dashboard's head. The stats are its children. */\nexport function StatGrid({ divided, minWidth = 11, className, style, ...props }: StatGridProps) {\n return <div className={statGrid({ divided, className })} style={{ ...style, [\"--kz-stat-min\" as string]: `${minWidth}rem` }} {...props} />;\n}\n"],"mappings":";AAEA,SAAS,UAAU;AA8Cb,cAKM,YALN;AA5CC,IAAM,OAAO,GAAG;AAAA,EACrB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA;AAAA;AAAA,IAGN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,MACL,IAAI,EAAE,OAAO,uBAAuB;AAAA,MACpC,MAAM,EAAE,OAAO,sBAAsB;AAAA,MACrC,MAAM,EAAE,OAAO,4BAA4B;AAAA,IAC7C;AAAA,EACF;AACF,CAAC;AAID,IAAM,QAAmC,EAAE,IAAI,sBAAsB,MAAM,uBAAuB,MAAM,wBAAwB;AAiBzH,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,OAAO,YAAY,OAAO,WAAW,GAAG,MAAM,GAAc;AACrG,QAAM,IAAI,KAAK,EAAE,MAAM,CAAC;AACxB,SACE,qBAAC,SAAI,cAAY,OAAO,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC5D;AAAA,wBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAChC,oBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,KAC9B,cAAc,SACd,qBAAC,OAAE,WAAW,EAAE,KAAK,GAClB;AAAA,eAAS,cACR,qBAAC,UAAK,WAAW,EAAE,MAAM,GACvB;AAAA,4BAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACnI,8BAAC,UAAK,GAAG,MAAM,KAAK,GAAG,GACzB;AAAA,QACC;AAAA,SACH;AAAA,MAED,QAAQ,oBAAC,UAAK,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,OAC5C;AAAA,IAED,QAAQ,oBAAC,SAAI,WAAW,EAAE,MAAM,GAAI,iBAAM,IAAS;AAAA,KACtD;AAEJ;AAEO,IAAM,WAAW,GAAG;AAAA,EACzB,MAAM;AAAA,EACN,UAAU;AAAA,IACR,SAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,SAAS,KAAK;AACnC,CAAC;AAUM,SAAS,SAAS,EAAE,SAAS,WAAW,IAAI,WAAW,OAAO,GAAG,MAAM,GAAkB;AAC9F,SAAO,oBAAC,SAAI,WAAW,SAAS,EAAE,SAAS,UAAU,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,eAAyB,GAAG,GAAG,QAAQ,MAAM,GAAI,GAAG,OAAO;AAC1I;","names":[]}
1
+ {"version":3,"sources":["../src/stat/stat.tsx"],"sourcesContent":["// Server-safe. A key figure: a label, the value in tabular digits, a hint, a trend. Every word is a prop.\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const stat = tv({\n slots: {\n root: \"flex min-w-0 flex-col gap-1\",\n label: \"text-xs font-semibold text-fg-secondary\",\n value: \"kz-stat-value font-display text-2xl font-black tabular-nums text-fg\",\n meta: \"flex flex-wrap items-center gap-x-2 gap-y-1 text-xs\",\n // The status tokens are too light for small text on a light surface: the words stay a text role, the arrow carries\n // the direction's colour.\n trend: \"inline-flex items-center gap-1 font-semibold text-fg [&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:shrink-0\",\n hint: \"text-fg-secondary\",\n chart: \"mt-2 h-10 w-full min-w-0\",\n },\n variants: {\n trend: {\n up: { trend: \"[&>svg]:text-success\" },\n down: { trend: \"[&>svg]:text-danger\" },\n flat: { trend: \"[&>svg]:text-fg-secondary\" },\n },\n },\n});\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nconst ARROW: Record<StatTrend, string> = { up: \"M7 17 17 7M8 7h9v9\", down: \"M7 7l10 10M17 8v9H8\", flat: \"M5 12h14M13 6l6 6-6 6\" };\n\nexport type StatProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n /** What the figure is (\"Revenue\"), above it. */\n label: React.ReactNode;\n /** The figure, formatted by the app, in tabular digits. */\n value: React.ReactNode;\n /** A line under the value: the period, the comparison. */\n hint?: React.ReactNode;\n /** The direction of the change; its arrow is decorative. */\n trend?: StatTrend;\n /** The change, in words, as read and shown (e.g. \"+12 % vs last week\") — the arrow alone says nothing. */\n trendLabel?: React.ReactNode;\n /** Under the figure: a `Sparkline` of @krizaka/charts (its own accessible summary), a `Meter`. */\n chart?: React.ReactNode;\n};\n\nexport function Stat({ label, value, hint, trend, trendLabel, chart, className, ...props }: StatProps) {\n const s = stat({ trend });\n return (\n <div data-trend={trend} className={s.root({ className })} {...props}>\n <p className={s.label()}>{label}</p>\n <p className={s.value()}>{value}</p>\n {(trendLabel || hint) && (\n <p className={s.meta()}>\n {trend && trendLabel && (\n <span className={s.trend()}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d={ARROW[trend]} />\n </svg>\n {trendLabel}\n </span>\n )}\n {hint && <span className={s.hint()}>{hint}</span>}\n </p>\n )}\n {chart ? <div className={s.chart()}>{chart}</div> : null}\n </div>\n );\n}\n\nexport const statGrid = tv({\n base: \"grid w-full grid-cols-[repeat(auto-fit,minmax(var(--kz-stat-min,11rem),1fr))] overflow-hidden rounded-xl border border-border-default bg-surface-1\",\n variants: {\n divided: {\n true: \"gap-px bg-border-subtle [&>*]:bg-surface-1 [&>*]:p-5\",\n false: \"gap-6 p-5\",\n },\n },\n defaultVariants: { divided: true },\n});\n\nexport type StatGridProps = React.ComponentProps<\"div\"> & {\n /** Hairlines between the stats (default) or space only. */\n divided?: boolean;\n /** The narrowest a stat may be before the row wraps, in rem. Default 11. */\n minWidth?: number;\n};\n\n/** A row of key figures that wraps with the width: a dashboard's head. The stats are its children. */\nexport function StatGrid({ divided, minWidth = 11, className, style, ...props }: StatGridProps) {\n return <div className={statGrid({ divided, className })} style={{ ...style, [\"--kz-stat-min\" as string]: `${minWidth}rem` }} {...props} />;\n}\n"],"mappings":";AAEA,SAAS,UAAU;AA8Cb,cAKM,YALN;AA5CC,IAAM,OAAO,GAAG;AAAA,EACrB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA;AAAA;AAAA,IAGN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,MACL,IAAI,EAAE,OAAO,uBAAuB;AAAA,MACpC,MAAM,EAAE,OAAO,sBAAsB;AAAA,MACrC,MAAM,EAAE,OAAO,4BAA4B;AAAA,IAC7C;AAAA,EACF;AACF,CAAC;AAID,IAAM,QAAmC,EAAE,IAAI,sBAAsB,MAAM,uBAAuB,MAAM,wBAAwB;AAiBzH,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,OAAO,YAAY,OAAO,WAAW,GAAG,MAAM,GAAc;AACrG,QAAM,IAAI,KAAK,EAAE,MAAM,CAAC;AACxB,SACE,qBAAC,SAAI,cAAY,OAAO,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC5D;AAAA,wBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAChC,oBAAC,OAAE,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,KAC9B,cAAc,SACd,qBAAC,OAAE,WAAW,EAAE,KAAK,GAClB;AAAA,eAAS,cACR,qBAAC,UAAK,WAAW,EAAE,MAAM,GACvB;AAAA,4BAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACnI,8BAAC,UAAK,GAAG,MAAM,KAAK,GAAG,GACzB;AAAA,QACC;AAAA,SACH;AAAA,MAED,QAAQ,oBAAC,UAAK,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,OAC5C;AAAA,IAED,QAAQ,oBAAC,SAAI,WAAW,EAAE,MAAM,GAAI,iBAAM,IAAS;AAAA,KACtD;AAEJ;AAEO,IAAM,WAAW,GAAG;AAAA,EACzB,MAAM;AAAA,EACN,UAAU;AAAA,IACR,SAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,SAAS,KAAK;AACnC,CAAC;AAUM,SAAS,SAAS,EAAE,SAAS,WAAW,IAAI,WAAW,OAAO,GAAG,MAAM,GAAkB;AAC9F,SAAO,oBAAC,SAAI,WAAW,SAAS,EAAE,SAAS,UAAU,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,eAAyB,GAAG,GAAG,QAAQ,MAAM,GAAI,GAAG,OAAO;AAC1I;","names":[]}
@@ -36,7 +36,10 @@ type StatusPageProps = Omit<React.HTMLAttributes<HTMLElement>, "title"> & {
36
36
  /** The app's link component (Next's `Link`). */
37
37
  linkAs?: LinkComponent;
38
38
  };
39
- /** A status page — or an « under construction » one: the overall state, each service, then incidents or progress. */
39
+ /**
40
+ * A status page — or an « under construction » one: the overall state, each service, then incidents or progress.
41
+ * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.
42
+ */
40
43
  declare function StatusPage({ back, eyebrow, title, lead, aside, state, stateLabel, checked, services, servicesLabel, linkAs, children, ...props }: StatusPageProps): React.JSX.Element;
41
44
 
42
45
  export { type ServiceState, StatusPage, type StatusPageProps };
@@ -1,8 +1,13 @@
1
+ import {
2
+ warnDeprecated
3
+ } from "./chunk-KGLRZMCY.js";
4
+
1
5
  // src/status-page/status-page.tsx
2
6
  import { Page, Section } from "@krizaka/ui/page";
3
7
  import { PageHero } from "@krizaka/ui/page-hero";
4
8
  import { jsx, jsxs } from "react/jsx-runtime";
5
9
  function StatusPage({ back, eyebrow, title, lead, aside, state, stateLabel, checked, services, servicesLabel = "Services", linkAs, children, ...props }) {
10
+ warnDeprecated("status-page");
6
11
  return /* @__PURE__ */ jsxs("div", { ...props, children: [
7
12
  /* @__PURE__ */ jsx(PageHero, { back, linkAs, eyebrow, title, lead, aside, backdrop: "plain" }),
8
13
  /* @__PURE__ */ jsxs(Page, { className: "kz-tpl-longform", children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/status-page/status-page.tsx"],"sourcesContent":["// Server-safe. Where things stand (blocks.css `.kz-tpl-state`, `.kz-tpl-services`): the overall state in words and\n// colour, each service on its line, the incidents under them — or, for something not built yet (`state=\"building\"`),\n// what is coming, its progress and how to hear about it, the bird beside it. A state is always said in words.\nimport { Page, Section } from \"@krizaka/ui/page\";\nimport type { LinkComponent } from \"@krizaka/ui/page-hero\";\nimport { PageHero } from \"@krizaka/ui/page-hero\";\nimport type * as React from \"react\";\n\nexport type ServiceState = \"operational\" | \"degraded\" | \"outage\" | \"building\";\n\nexport type StatusPageProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The way back. */\n back?: { href: string; label: string };\n /** A mono line above the title. */\n eyebrow?: React.ReactNode;\n /** The page's `h1` (`Status`, `Yasakia is on its way`). */\n title: React.ReactNode;\n /** One sentence under it. */\n lead?: React.ReactNode;\n /** Beside the hero: a bird (the pigeon that delivers, the duck that builds). */\n aside?: React.ReactNode;\n /** The overall state. */\n state: ServiceState;\n /** The overall state, in words (`All systems operational`). */\n stateLabel: React.ReactNode;\n /** When it was checked (`Checked 2 min ago`). */\n checked?: React.ReactNode;\n /** The services and their states, in words: `{ id, name, state, label }`. */\n services?: readonly { id: string; name: React.ReactNode; state: ServiceState; label: React.ReactNode }[];\n /** The services list's accessible name (`Services`). */\n servicesLabel?: string;\n /** Under the services: the incidents (a ChangelogPage's entries, a list), or for `building` the progress and the way to follow. */\n children?: React.ReactNode;\n /** The app's link component (Next's `Link`). */\n linkAs?: LinkComponent;\n};\n\n/** A status page — or an « under construction » one: the overall state, each service, then incidents or progress. */\nexport function StatusPage({ back, eyebrow, title, lead, aside, state, stateLabel, checked, services, servicesLabel = \"Services\", linkAs, children, ...props }: StatusPageProps) {\n return (\n <div {...props}>\n <PageHero back={back} linkAs={linkAs} eyebrow={eyebrow} title={title} lead={lead} aside={aside} backdrop=\"plain\" />\n <Page className=\"kz-tpl-longform\">\n <div className=\"kz-tpl-state\" data-state={state} role=\"status\">\n <span className=\"kz-tpl-dot\" aria-hidden />\n <strong>{stateLabel}</strong>\n {checked && <span className=\"kz-tpl-count\">{checked}</span>}\n </div>\n {services && services.length > 0 && (\n <ul className=\"kz-tpl-services\" aria-label={servicesLabel}>\n {services.map((s) => (\n <li key={s.id}>\n <span>{s.name}</span>\n <small>\n <span className=\"kz-tpl-dot\" data-state={s.state} aria-hidden />\n {s.label}\n </small>\n </li>\n ))}\n </ul>\n )}\n </Page>\n {children && <Section spacing=\"sm\">{children}</Section>}\n </div>\n );\n}\n"],"mappings":";AAGA,SAAS,MAAM,eAAe;AAE9B,SAAS,gBAAgB;AAoCnB,cAEE,YAFF;AAHC,SAAS,WAAW,EAAE,MAAM,SAAS,OAAO,MAAM,OAAO,OAAO,YAAY,SAAS,UAAU,gBAAgB,YAAY,QAAQ,UAAU,GAAG,MAAM,GAAoB;AAC/K,SACE,qBAAC,SAAK,GAAG,OACP;AAAA,wBAAC,YAAS,MAAY,QAAgB,SAAkB,OAAc,MAAY,OAAc,UAAS,SAAQ;AAAA,IACjH,qBAAC,QAAK,WAAU,mBACd;AAAA,2BAAC,SAAI,WAAU,gBAAe,cAAY,OAAO,MAAK,UACpD;AAAA,4BAAC,UAAK,WAAU,cAAa,eAAW,MAAC;AAAA,QACzC,oBAAC,YAAQ,sBAAW;AAAA,QACnB,WAAW,oBAAC,UAAK,WAAU,gBAAgB,mBAAQ;AAAA,SACtD;AAAA,MACC,YAAY,SAAS,SAAS,KAC7B,oBAAC,QAAG,WAAU,mBAAkB,cAAY,eACzC,mBAAS,IAAI,CAAC,MACb,qBAAC,QACC;AAAA,4BAAC,UAAM,YAAE,MAAK;AAAA,QACd,qBAAC,WACC;AAAA,8BAAC,UAAK,WAAU,cAAa,cAAY,EAAE,OAAO,eAAW,MAAC;AAAA,UAC7D,EAAE;AAAA,WACL;AAAA,WALO,EAAE,EAMX,CACD,GACH;AAAA,OAEJ;AAAA,IACC,YAAY,oBAAC,WAAQ,SAAQ,MAAM,UAAS;AAAA,KAC/C;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/status-page/status-page.tsx"],"sourcesContent":["// Server-safe. Where things stand (blocks.css `.kz-tpl-state`, `.kz-tpl-services`): the overall state in words and\n// colour, each service on its line, the incidents under them — or, for something not built yet (`state=\"building\"`),\n// what is coming, its progress and how to hear about it, the bird beside it. A state is always said in words.\nimport { Page, Section } from \"@krizaka/ui/page\";\nimport type { LinkComponent } from \"@krizaka/ui/page-hero\";\nimport { PageHero } from \"@krizaka/ui/page-hero\";\nimport type * as React from \"react\";\n\nimport { warnDeprecated } from \"../deprecated\";\n\nexport type ServiceState = \"operational\" | \"degraded\" | \"outage\" | \"building\";\n\nexport type StatusPageProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The way back. */\n back?: { href: string; label: string };\n /** A mono line above the title. */\n eyebrow?: React.ReactNode;\n /** The page's `h1` (`Status`, `Yasakia is on its way`). */\n title: React.ReactNode;\n /** One sentence under it. */\n lead?: React.ReactNode;\n /** Beside the hero: a bird (the pigeon that delivers, the duck that builds). */\n aside?: React.ReactNode;\n /** The overall state. */\n state: ServiceState;\n /** The overall state, in words (`All systems operational`). */\n stateLabel: React.ReactNode;\n /** When it was checked (`Checked 2 min ago`). */\n checked?: React.ReactNode;\n /** The services and their states, in words: `{ id, name, state, label }`. */\n services?: readonly { id: string; name: React.ReactNode; state: ServiceState; label: React.ReactNode }[];\n /** The services list's accessible name (`Services`). */\n servicesLabel?: string;\n /** Under the services: the incidents (a ChangelogPage's entries, a list), or for `building` the progress and the way to follow. */\n children?: React.ReactNode;\n /** The app's link component (Next's `Link`). */\n linkAs?: LinkComponent;\n};\n\n/**\n * A status page — or an « under construction » one: the overall state, each service, then incidents or progress.\n * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.\n */\nexport function StatusPage({ back, eyebrow, title, lead, aside, state, stateLabel, checked, services, servicesLabel = \"Services\", linkAs, children, ...props }: StatusPageProps) {\n warnDeprecated(\"status-page\");\n return (\n <div {...props}>\n <PageHero back={back} linkAs={linkAs} eyebrow={eyebrow} title={title} lead={lead} aside={aside} backdrop=\"plain\" />\n <Page className=\"kz-tpl-longform\">\n <div className=\"kz-tpl-state\" data-state={state} role=\"status\">\n <span className=\"kz-tpl-dot\" aria-hidden />\n <strong>{stateLabel}</strong>\n {checked && <span className=\"kz-tpl-count\">{checked}</span>}\n </div>\n {services && services.length > 0 && (\n <ul className=\"kz-tpl-services\" aria-label={servicesLabel}>\n {services.map((s) => (\n <li key={s.id}>\n <span>{s.name}</span>\n <small>\n <span className=\"kz-tpl-dot\" data-state={s.state} aria-hidden />\n {s.label}\n </small>\n </li>\n ))}\n </ul>\n )}\n </Page>\n {children && <Section spacing=\"sm\">{children}</Section>}\n </div>\n );\n}\n"],"mappings":";;;;;AAGA,SAAS,MAAM,eAAe;AAE9B,SAAS,gBAAgB;AA0CnB,cAEE,YAFF;AAJC,SAAS,WAAW,EAAE,MAAM,SAAS,OAAO,MAAM,OAAO,OAAO,YAAY,SAAS,UAAU,gBAAgB,YAAY,QAAQ,UAAU,GAAG,MAAM,GAAoB;AAC/K,iBAAe,aAAa;AAC5B,SACE,qBAAC,SAAK,GAAG,OACP;AAAA,wBAAC,YAAS,MAAY,QAAgB,SAAkB,OAAc,MAAY,OAAc,UAAS,SAAQ;AAAA,IACjH,qBAAC,QAAK,WAAU,mBACd;AAAA,2BAAC,SAAI,WAAU,gBAAe,cAAY,OAAO,MAAK,UACpD;AAAA,4BAAC,UAAK,WAAU,cAAa,eAAW,MAAC;AAAA,QACzC,oBAAC,YAAQ,sBAAW;AAAA,QACnB,WAAW,oBAAC,UAAK,WAAU,gBAAgB,mBAAQ;AAAA,SACtD;AAAA,MACC,YAAY,SAAS,SAAS,KAC7B,oBAAC,QAAG,WAAU,mBAAkB,cAAY,eACzC,mBAAS,IAAI,CAAC,MACb,qBAAC,QACC;AAAA,4BAAC,UAAM,YAAE,MAAK;AAAA,QACd,qBAAC,WACC;AAAA,8BAAC,UAAK,WAAU,cAAa,cAAY,EAAE,OAAO,eAAW,MAAC;AAAA,UAC7D,EAAE;AAAA,WACL;AAAA,WALO,EAAE,EAMX,CACD,GACH;AAAA,OAEJ;AAAA,IACC,YAAY,oBAAC,WAAQ,SAAQ,MAAM,UAAS;AAAA,KAC/C;AAEJ;","names":[]}
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+
3
+ type StuckHold = "tape" | "tape-corners" | "pin" | "corner" | "glue";
4
+ type StuckProps = Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
5
+ /** What is stuck: a figure, a `SpecimenTag`, a card, a `TapedPhoto`. */
6
+ children: React.ReactNode;
7
+ /**
8
+ * How it is held: `tape` (one strip), `tape-corners` (two opposite corners), `pin` (a drawing pin), `corner` (photo
9
+ * corners) or `glue` (a slightly lifted edge).
10
+ * @default "tape"
11
+ */
12
+ hold?: StuckHold;
13
+ /** The tilt in degrees (negative leans left). Without it, the tilt comes from `seed`. */
14
+ tilt?: number;
15
+ /** Where the tilt comes from when `tilt` is not given: the same string always leans the same way (±2°). @default "" */
16
+ seed?: string;
17
+ /** Margin doodles (`Doodle`) drawn beside the block; they leave with the margin on a narrow screen. */
18
+ doodle?: React.ReactNode;
19
+ /** The element of the wrapper. A `figure` goes inside, never here. @default "div" */
20
+ as?: "div" | "li" | "aside";
21
+ };
22
+ /** The tilt of a stuck block: `tilt` when given, otherwise a steady lean (−2° to 2°) read from `seed`, rounded to a tenth. */
23
+ declare function stuckTilt(seed: string, tilt?: number): number;
24
+ /** A block stuck into the notebook: held by tape, a pin, photo corners or glue; tilted from data; a hard paper shadow. */
25
+ declare function Stuck({ children, hold, tilt, seed, doodle, as: Tag, className, style, ...props }: StuckProps): React.JSX.Element;
26
+
27
+ export { Stuck, type StuckHold, type StuckProps, stuckTilt };
package/dist/stuck.js ADDED
@@ -0,0 +1,26 @@
1
+ import {
2
+ seedUnit
3
+ } from "./chunk-5VEVYDVC.js";
4
+ import {
5
+ cn
6
+ } from "./chunk-W675RFOA.js";
7
+
8
+ // src/stuck/stuck.tsx
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ function stuckTilt(seed, tilt) {
11
+ return tilt ?? Math.round(seedUnit(seed) * 20) / 10;
12
+ }
13
+ function Stuck({ children, hold = "tape", tilt, seed = "", doodle, as: Tag = "div", className, style, ...props }) {
14
+ return /* @__PURE__ */ jsxs(Tag, { className: cn("kz-stuck", className), style, ...props, children: [
15
+ /* @__PURE__ */ jsxs("div", { className: "kz-stuck-body", "data-hold": hold, style: { ["--kz-stuck-tilt"]: `${stuckTilt(seed, tilt)}deg` }, children: [
16
+ hold === "pin" ? /* @__PURE__ */ jsx("span", { className: "kz-stuck-pin", "aria-hidden": true }) : null,
17
+ children
18
+ ] }),
19
+ doodle
20
+ ] });
21
+ }
22
+ export {
23
+ Stuck,
24
+ stuckTilt
25
+ };
26
+ //# sourceMappingURL=stuck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stuck/stuck.tsx"],"sourcesContent":["// Server-safe. A block stuck into the notebook (ADR-004, blocks.css): a figure, a specimen tag, a card, a print — held by\n// tape, a pin, photo corners or a lifted edge, slightly tilted (from data, never random), on the Cahier's hard paper\n// shadow. The tape is TapedPhoto's own (the same rule in blocks.css). The tilt is a transform: nothing shifts.\nimport type * as React from \"react\";\n\nimport { seedUnit } from \"../cahier-seed\";\nimport { cn } from \"../cn\";\n\nexport type StuckHold = \"tape\" | \"tape-corners\" | \"pin\" | \"corner\" | \"glue\";\n\nexport type StuckProps = Omit<React.HTMLAttributes<HTMLElement>, \"children\"> & {\n /** What is stuck: a figure, a `SpecimenTag`, a card, a `TapedPhoto`. */\n children: React.ReactNode;\n /**\n * How it is held: `tape` (one strip), `tape-corners` (two opposite corners), `pin` (a drawing pin), `corner` (photo\n * corners) or `glue` (a slightly lifted edge).\n * @default \"tape\"\n */\n hold?: StuckHold;\n /** The tilt in degrees (negative leans left). Without it, the tilt comes from `seed`. */\n tilt?: number;\n /** Where the tilt comes from when `tilt` is not given: the same string always leans the same way (±2°). @default \"\" */\n seed?: string;\n /** Margin doodles (`Doodle`) drawn beside the block; they leave with the margin on a narrow screen. */\n doodle?: React.ReactNode;\n /** The element of the wrapper. A `figure` goes inside, never here. @default \"div\" */\n as?: \"div\" | \"li\" | \"aside\";\n};\n\n/** The tilt of a stuck block: `tilt` when given, otherwise a steady lean (−2° to 2°) read from `seed`, rounded to a tenth. */\nexport function stuckTilt(seed: string, tilt?: number): number {\n return tilt ?? Math.round(seedUnit(seed) * 20) / 10;\n}\n\n/** A block stuck into the notebook: held by tape, a pin, photo corners or glue; tilted from data; a hard paper shadow. */\nexport function Stuck({ children, hold = \"tape\", tilt, seed = \"\", doodle, as: Tag = \"div\", className, style, ...props }: StuckProps) {\n return (\n <Tag className={cn(\"kz-stuck\", className)} style={style} {...props}>\n <div className=\"kz-stuck-body\" data-hold={hold} style={{ [\"--kz-stuck-tilt\" as string]: `${stuckTilt(seed, tilt)}deg` }}>\n {hold === \"pin\" ? <span className=\"kz-stuck-pin\" aria-hidden /> : null}\n {children}\n </div>\n {doodle}\n </Tag>\n );\n}\n"],"mappings":";;;;;;;;AAsCM,SACoB,KADpB;AARC,SAAS,UAAU,MAAc,MAAuB;AAC7D,SAAO,QAAQ,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,IAAI;AACnD;AAGO,SAAS,MAAM,EAAE,UAAU,OAAO,QAAQ,MAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,OAAO,WAAW,OAAO,GAAG,MAAM,GAAe;AACnI,SACE,qBAAC,OAAI,WAAW,GAAG,YAAY,SAAS,GAAG,OAAe,GAAG,OAC3D;AAAA,yBAAC,SAAI,WAAU,iBAAgB,aAAW,MAAM,OAAO,EAAE,CAAC,iBAA2B,GAAG,GAAG,UAAU,MAAM,IAAI,CAAC,MAAM,GACnH;AAAA,eAAS,QAAQ,oBAAC,UAAK,WAAU,gBAAe,eAAW,MAAC,IAAK;AAAA,MACjE;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
@@ -1,6 +1,7 @@
1
1
  import * as tailwind_variants from 'tailwind-variants';
2
2
  import * as React from 'react';
3
3
 
4
+ /** @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0. */
4
5
  declare const swipeDeck: tailwind_variants.TVReturnType<{
5
6
  [key: string]: {
6
7
  [key: string]: tailwind_variants.ClassValue | {
@@ -142,7 +143,10 @@ type PersonCardProps = {
142
143
  /** Classes merged on the card. */
143
144
  className?: string;
144
145
  };
145
- /** A person on a card: photos full bleed (a side to change), name and age over a scrim, a line, a bio, chips. */
146
+ /**
147
+ * A person on a card: photos full bleed (a side to change), name and age over a scrim, a line, a bio, chips.
148
+ * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.
149
+ */
146
150
  declare function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabels, className }: PersonCardProps): React.JSX.Element;
147
151
  type SwipeDirection = "like" | "pass";
148
152
  type SwipeDeckLabels = {
@@ -177,7 +181,10 @@ type SwipeDeckProps<T> = {
177
181
  /** Classes merged on the root. */
178
182
  className?: string;
179
183
  };
180
- /** A deck of cards decided one by one: drag, the buttons, or ← → — each decision announced. */
184
+ /**
185
+ * A deck of cards decided one by one: drag, the buttons, or ← → — each decision announced.
186
+ * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.
187
+ */
181
188
  declare function SwipeDeck<T>({ items, getId, getName, renderCard, onSwipe, empty, labels, className }: SwipeDeckProps<T>): React.JSX.Element;
182
189
 
183
190
  export { PersonCard, type PersonCardProps, SwipeDeck, type SwipeDeckLabels, type SwipeDeckProps, type SwipeDirection, swipeDeck };
@@ -1,4 +1,7 @@
1
1
  "use client";
2
+ import {
3
+ warnDeprecated
4
+ } from "./chunk-BDIU5LZB.js";
2
5
  import {
3
6
  usePrefersReducedMotion
4
7
  } from "./chunk-FZBWEDQI.js";
@@ -28,6 +31,7 @@ var swipeDeck = tv({
28
31
  }
29
32
  });
30
33
  function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabels = { previous: "Previous photo", next: "Next photo" }, className }) {
34
+ warnDeprecated("swipe-deck");
31
35
  const s = swipeDeck();
32
36
  const [index, setIndex] = React.useState(0);
33
37
  const photo = photos[index];
@@ -53,6 +57,7 @@ function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabels =
53
57
  ] });
54
58
  }
55
59
  function SwipeDeck({ items, getId, getName, renderCard, onSwipe, empty, labels, className }) {
60
+ warnDeprecated("swipe-deck");
56
61
  const s = swipeDeck();
57
62
  const reduce = usePrefersReducedMotion();
58
63
  const [dx, setDx] = React.useState(0);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/swipe-deck/swipe-deck.tsx"],"sourcesContent":["// Client (the drag, the decision). A deck of cards decided one by one — drag right to like, left to pass, or the\n// buttons, or ← → on the focused deck — and `PersonCard`, a person on a card. Reduced motion: the card leaves without\n// flying.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { usePrefersReducedMotion } from \"../media\";\n\nexport const swipeDeck = tv({\n slots: {\n root: \"flex w-full flex-col items-center gap-5\",\n stack: \"relative aspect-[3/4] w-full max-w-sm outline-hidden focus-visible:rounded-2xl focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-4 focus-visible:ring-offset-surface-0\",\n layer: \"absolute inset-0 touch-pan-y select-none\",\n stamp: \"pointer-events-none absolute top-8 rounded-lg border-[3px] px-2.5 py-0.5 font-display text-2xl font-black \",\n buttons: \"flex items-center gap-7\",\n button:\n \"inline-flex h-16 w-16 items-center justify-center rounded-full border-2 bg-surface-1 shadow-md transition-transform active:scale-90 \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 motion-reduce:transition-none [&>svg]:h-7 [&>svg]:w-7\",\n card: \"relative h-full w-full overflow-hidden rounded-2xl bg-surface-3 shadow-lg\",\n photo: \"absolute inset-0 h-full w-full object-cover\",\n bars: \"absolute inset-x-2 top-2 flex gap-1\",\n bar: \"h-[3px] flex-1 rounded-full bg-fg-on-media opacity-40 data-[on]:opacity-100\",\n half: \"absolute top-0 bottom-2/5 w-2/5 cursor-pointer outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n info: \"absolute inset-x-0 bottom-0 flex flex-col gap-1.5 bg-gradient-to-t from-scrim-strong via-scrim-strong/80 to-transparent p-4 pt-24 text-fg-on-media\",\n name: \"flex items-center gap-2 font-display text-3xl font-black\",\n age: \"font-sans text-2xl font-normal\",\n bio: \"line-clamp-2 text-sm\",\n footer: \"mt-1 flex flex-wrap gap-1.5\",\n },\n});\n\nexport type PersonCardProps = {\n /** The person's photos (URLs), the first shown first; click a side, or its buttons, to move between them. */\n photos: readonly { src: string; alt?: string }[];\n /** The name. */\n name: string;\n /** The age, written after the name. */\n age?: number;\n /** Beside the name: a `VerifiedBadge`. */\n badge?: React.ReactNode;\n /** A line under the name: a distance, a job. */\n meta?: React.ReactNode;\n /** A sentence about the person. */\n bio?: string;\n /** At the bottom: the interests as chips. */\n footer?: React.ReactNode;\n /** The photo buttons' words: `{ previous: \"Previous photo\", next: \"Next photo\" }` — passed translated. */\n photoLabels?: { previous: string; next: string };\n /** Classes merged on the card. */\n className?: string;\n};\n\n/** A person on a card: photos full bleed (a side to change), name and age over a scrim, a line, a bio, chips. */\nexport function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabels = { previous: \"Previous photo\", next: \"Next photo\" }, className }: PersonCardProps) {\n const s = swipeDeck();\n const [index, setIndex] = React.useState(0);\n const photo = photos[index];\n return (\n <article aria-label={age !== undefined ? `${name}, ${age}` : name} className={s.card({ className })}>\n {photo ? <img src={photo.src} alt={photo.alt ?? \"\"} className={s.photo()} draggable={false} /> : null}\n {photos.length > 1 ? (\n <>\n <div className={s.bars()} aria-hidden>\n {photos.map((_, i) => (\n <span key={i} className={s.bar()} data-on={i === index || undefined} />\n ))}\n </div>\n <button type=\"button\" aria-label={photoLabels.previous} disabled={index === 0} className={s.half({ className: \"left-0\" })} onClick={() => setIndex((i) => Math.max(0, i - 1))} />\n <button type=\"button\" aria-label={photoLabels.next} disabled={index === photos.length - 1} className={s.half({ className: \"right-0\" })} onClick={() => setIndex((i) => Math.min(photos.length - 1, i + 1))} />\n </>\n ) : null}\n <div className={s.info()}>\n <h3 className={s.name()}>\n <span className=\"truncate\">\n {name}\n {age !== undefined ? <span className={s.age()}>{` ${age}`}</span> : null}\n </span>\n {badge}\n </h3>\n {meta}\n {bio ? <p className={s.bio()}>{bio}</p> : null}\n {footer ? <div className={s.footer()}>{footer}</div> : null}\n </div>\n </article>\n );\n}\n\nexport type SwipeDirection = \"like\" | \"pass\";\n\nexport type SwipeDeckLabels = {\n /** The like button (“Like”). */\n like: string;\n /** The pass button (“Pass”). */\n pass: string;\n /** The deck's name and its keyboard hint (“Profiles. Right arrow to like, left arrow to pass.”). */\n deck: string;\n /** The stamp while dragging right (“LIKE”). */\n likeStamp?: string;\n /** The stamp while dragging left (“NOPE”). */\n passStamp?: string;\n /** Announced after a decision: `(name, direction) => …`. */\n decided?: (name: string, direction: SwipeDirection) => string;\n};\n\nexport type SwipeDeckProps<T> = {\n /** The cards still to decide, the first on top. */\n items: readonly T[];\n /** A card's id. */\n getId: (item: T) => string;\n /** A card's name, for the announcements. */\n getName: (item: T) => string;\n /** A card (usually a `PersonCard`). */\n renderCard: (item: T) => React.ReactNode;\n /** Called with the card decided and the decision; remove it from `items`. */\n onSwipe: (item: T, direction: SwipeDirection) => void;\n /** Shown when there is no card left (an `EmptyState`). */\n empty?: React.ReactNode;\n /** The words, passed translated. */\n labels: SwipeDeckLabels;\n /** Classes merged on the root. */\n className?: string;\n};\n\n/** A deck of cards decided one by one: drag, the buttons, or ← → — each decision announced. */\nexport function SwipeDeck<T>({ items, getId, getName, renderCard, onSwipe, empty, labels, className }: SwipeDeckProps<T>) {\n const s = swipeDeck();\n const reduce = usePrefersReducedMotion();\n const [dx, setDx] = React.useState(0);\n const [leaving, setLeaving] = React.useState<SwipeDirection | null>(null);\n const [message, setMessage] = React.useState(\"\");\n const start = React.useRef<{ x: number; width: number } | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const top = items[0];\n const decide = (direction: SwipeDirection) => {\n if (!top || leaving) return;\n const finish = () => {\n setLeaving(null);\n setDx(0);\n setMessage(labels.decided ? labels.decided(getName(top), direction) : `${getName(top)}: ${direction === \"like\" ? labels.like : labels.pass}`);\n onSwipe(top, direction);\n };\n if (reduce) return finish();\n setLeaving(direction);\n setTimeout(finish, 220);\n };\n const offset = leaving ? (leaving === \"like\" ? 1 : -1) * 900 : dx;\n const stampOpacity = (dir: 1 | -1) => Math.max(0, Math.min(1, (dir * offset) / 120));\n return (\n <div className={s.root({ className })}>\n <p className=\"sr-only\" aria-live=\"polite\">\n {message}\n </p>\n <div\n role=\"group\"\n aria-label={labels.deck}\n tabIndex={top ? 0 : -1}\n className={s.stack()}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\") decide(\"like\");\n if (e.key === \"ArrowLeft\") decide(\"pass\");\n }}\n >\n {!top ? empty : null}\n {items\n .slice(0, 2)\n .reverse()\n .map((item) => {\n const isTop = item === top;\n return (\n <div\n key={getId(item)}\n aria-hidden={!isTop || undefined}\n inert={!isTop || undefined}\n className={s.layer()}\n style={\n isTop\n ? { transform: `translateX(${offset}px) rotate(${offset / 22}deg)`, transition: dragging && !leaving ? \"none\" : reduce ? \"none\" : \"transform 220ms var(--kz-ease, ease-out)\" }\n : { transform: \"scale(0.96)\", opacity: 0.9 }\n }\n onPointerDown={(e) => {\n if (!isTop || (e.target as HTMLElement).closest(\"button\")) return;\n start.current = { x: e.clientX, width: e.currentTarget.offsetWidth };\n e.currentTarget.setPointerCapture(e.pointerId);\n setDragging(true);\n }}\n onPointerMove={(e) => {\n if (start.current) setDx(e.clientX - start.current.x);\n }}\n onPointerUp={() => {\n const width = start.current?.width ?? 300;\n start.current = null;\n setDragging(false);\n if (dx > width / 3) decide(\"like\");\n else if (dx < -width / 3) decide(\"pass\");\n else setDx(0);\n }}\n >\n {renderCard(item)}\n {isTop ? (\n <>\n <span aria-hidden className={s.stamp({ className: \"left-6 -rotate-12 border-success text-fg-success\" })} style={{ opacity: stampOpacity(1) }}>\n {labels.likeStamp ?? labels.like}\n </span>\n <span aria-hidden className={s.stamp({ className: \"right-6 rotate-12 border-danger text-fg-danger\" })} style={{ opacity: stampOpacity(-1) }}>\n {labels.passStamp ?? labels.pass}\n </span>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n <div className={s.buttons()}>\n <button type=\"button\" aria-label={labels.pass} disabled={!top} onClick={() => decide(\"pass\")} className={s.button({ className: \"border-danger text-fg-danger\" })}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n <button type=\"button\" aria-label={labels.like} disabled={!top} onClick={() => decide(\"like\")} className={s.button({ className: \"border-success text-fg-success\" })}>\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z\" />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/swipe-deck/swipe-deck.tsx"],"sourcesContent":["// Client (the drag, the decision). A deck of cards decided one by one — drag right to like, left to pass, or the\n// buttons, or ← → on the focused deck — and `PersonCard`, a person on a card. Reduced motion: the card leaves without\n// flying.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { warnDeprecated } from \"../deprecated\";\nimport { usePrefersReducedMotion } from \"../media\";\n\n/** @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0. */\nexport const swipeDeck = tv({\n slots: {\n root: \"flex w-full flex-col items-center gap-5\",\n stack: \"relative aspect-[3/4] w-full max-w-sm outline-hidden focus-visible:rounded-2xl focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-4 focus-visible:ring-offset-surface-0\",\n layer: \"absolute inset-0 touch-pan-y select-none\",\n stamp: \"pointer-events-none absolute top-8 rounded-lg border-[3px] px-2.5 py-0.5 font-display text-2xl font-black \",\n buttons: \"flex items-center gap-7\",\n button:\n \"inline-flex h-16 w-16 items-center justify-center rounded-full border-2 bg-surface-1 shadow-md transition-transform active:scale-90 \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-40 motion-reduce:transition-none [&>svg]:h-7 [&>svg]:w-7\",\n card: \"relative h-full w-full overflow-hidden rounded-2xl bg-surface-3 shadow-lg\",\n photo: \"absolute inset-0 h-full w-full object-cover\",\n bars: \"absolute inset-x-2 top-2 flex gap-1\",\n bar: \"h-[3px] flex-1 rounded-full bg-fg-on-media opacity-40 data-[on]:opacity-100\",\n half: \"absolute top-0 bottom-2/5 w-2/5 cursor-pointer outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n info: \"absolute inset-x-0 bottom-0 flex flex-col gap-1.5 bg-gradient-to-t from-scrim-strong via-scrim-strong/80 to-transparent p-4 pt-24 text-fg-on-media\",\n name: \"flex items-center gap-2 font-display text-3xl font-black\",\n age: \"font-sans text-2xl font-normal\",\n bio: \"line-clamp-2 text-sm\",\n footer: \"mt-1 flex flex-wrap gap-1.5\",\n },\n});\n\nexport type PersonCardProps = {\n /** The person's photos (URLs), the first shown first; click a side, or its buttons, to move between them. */\n photos: readonly { src: string; alt?: string }[];\n /** The name. */\n name: string;\n /** The age, written after the name. */\n age?: number;\n /** Beside the name: a `VerifiedBadge`. */\n badge?: React.ReactNode;\n /** A line under the name: a distance, a job. */\n meta?: React.ReactNode;\n /** A sentence about the person. */\n bio?: string;\n /** At the bottom: the interests as chips. */\n footer?: React.ReactNode;\n /** The photo buttons' words: `{ previous: \"Previous photo\", next: \"Next photo\" }` — passed translated. */\n photoLabels?: { previous: string; next: string };\n /** Classes merged on the card. */\n className?: string;\n};\n\n/**\n * A person on a card: photos full bleed (a side to change), name and age over a scrim, a line, a bio, chips.\n * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.\n */\nexport function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabels = { previous: \"Previous photo\", next: \"Next photo\" }, className }: PersonCardProps) {\n warnDeprecated(\"swipe-deck\");\n const s = swipeDeck();\n const [index, setIndex] = React.useState(0);\n const photo = photos[index];\n return (\n <article aria-label={age !== undefined ? `${name}, ${age}` : name} className={s.card({ className })}>\n {photo ? <img src={photo.src} alt={photo.alt ?? \"\"} className={s.photo()} draggable={false} /> : null}\n {photos.length > 1 ? (\n <>\n <div className={s.bars()} aria-hidden>\n {photos.map((_, i) => (\n <span key={i} className={s.bar()} data-on={i === index || undefined} />\n ))}\n </div>\n <button type=\"button\" aria-label={photoLabels.previous} disabled={index === 0} className={s.half({ className: \"left-0\" })} onClick={() => setIndex((i) => Math.max(0, i - 1))} />\n <button type=\"button\" aria-label={photoLabels.next} disabled={index === photos.length - 1} className={s.half({ className: \"right-0\" })} onClick={() => setIndex((i) => Math.min(photos.length - 1, i + 1))} />\n </>\n ) : null}\n <div className={s.info()}>\n <h3 className={s.name()}>\n <span className=\"truncate\">\n {name}\n {age !== undefined ? <span className={s.age()}>{` ${age}`}</span> : null}\n </span>\n {badge}\n </h3>\n {meta}\n {bio ? <p className={s.bio()}>{bio}</p> : null}\n {footer ? <div className={s.footer()}>{footer}</div> : null}\n </div>\n </article>\n );\n}\n\nexport type SwipeDirection = \"like\" | \"pass\";\n\nexport type SwipeDeckLabels = {\n /** The like button (“Like”). */\n like: string;\n /** The pass button (“Pass”). */\n pass: string;\n /** The deck's name and its keyboard hint (“Profiles. Right arrow to like, left arrow to pass.”). */\n deck: string;\n /** The stamp while dragging right (“LIKE”). */\n likeStamp?: string;\n /** The stamp while dragging left (“NOPE”). */\n passStamp?: string;\n /** Announced after a decision: `(name, direction) => …`. */\n decided?: (name: string, direction: SwipeDirection) => string;\n};\n\nexport type SwipeDeckProps<T> = {\n /** The cards still to decide, the first on top. */\n items: readonly T[];\n /** A card's id. */\n getId: (item: T) => string;\n /** A card's name, for the announcements. */\n getName: (item: T) => string;\n /** A card (usually a `PersonCard`). */\n renderCard: (item: T) => React.ReactNode;\n /** Called with the card decided and the decision; remove it from `items`. */\n onSwipe: (item: T, direction: SwipeDirection) => void;\n /** Shown when there is no card left (an `EmptyState`). */\n empty?: React.ReactNode;\n /** The words, passed translated. */\n labels: SwipeDeckLabels;\n /** Classes merged on the root. */\n className?: string;\n};\n\n/**\n * A deck of cards decided one by one: drag, the buttons, or ← → — each decision announced.\n * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.\n */\nexport function SwipeDeck<T>({ items, getId, getName, renderCard, onSwipe, empty, labels, className }: SwipeDeckProps<T>) {\n warnDeprecated(\"swipe-deck\");\n const s = swipeDeck();\n const reduce = usePrefersReducedMotion();\n const [dx, setDx] = React.useState(0);\n const [leaving, setLeaving] = React.useState<SwipeDirection | null>(null);\n const [message, setMessage] = React.useState(\"\");\n const start = React.useRef<{ x: number; width: number } | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const top = items[0];\n const decide = (direction: SwipeDirection) => {\n if (!top || leaving) return;\n const finish = () => {\n setLeaving(null);\n setDx(0);\n setMessage(labels.decided ? labels.decided(getName(top), direction) : `${getName(top)}: ${direction === \"like\" ? labels.like : labels.pass}`);\n onSwipe(top, direction);\n };\n if (reduce) return finish();\n setLeaving(direction);\n setTimeout(finish, 220);\n };\n const offset = leaving ? (leaving === \"like\" ? 1 : -1) * 900 : dx;\n const stampOpacity = (dir: 1 | -1) => Math.max(0, Math.min(1, (dir * offset) / 120));\n return (\n <div className={s.root({ className })}>\n <p className=\"sr-only\" aria-live=\"polite\">\n {message}\n </p>\n <div\n role=\"group\"\n aria-label={labels.deck}\n tabIndex={top ? 0 : -1}\n className={s.stack()}\n onKeyDown={(e) => {\n if (e.key === \"ArrowRight\") decide(\"like\");\n if (e.key === \"ArrowLeft\") decide(\"pass\");\n }}\n >\n {!top ? empty : null}\n {items\n .slice(0, 2)\n .reverse()\n .map((item) => {\n const isTop = item === top;\n return (\n <div\n key={getId(item)}\n aria-hidden={!isTop || undefined}\n inert={!isTop || undefined}\n className={s.layer()}\n style={\n isTop\n ? { transform: `translateX(${offset}px) rotate(${offset / 22}deg)`, transition: dragging && !leaving ? \"none\" : reduce ? \"none\" : \"transform 220ms var(--kz-ease, ease-out)\" }\n : { transform: \"scale(0.96)\", opacity: 0.9 }\n }\n onPointerDown={(e) => {\n if (!isTop || (e.target as HTMLElement).closest(\"button\")) return;\n start.current = { x: e.clientX, width: e.currentTarget.offsetWidth };\n e.currentTarget.setPointerCapture(e.pointerId);\n setDragging(true);\n }}\n onPointerMove={(e) => {\n if (start.current) setDx(e.clientX - start.current.x);\n }}\n onPointerUp={() => {\n const width = start.current?.width ?? 300;\n start.current = null;\n setDragging(false);\n if (dx > width / 3) decide(\"like\");\n else if (dx < -width / 3) decide(\"pass\");\n else setDx(0);\n }}\n >\n {renderCard(item)}\n {isTop ? (\n <>\n <span aria-hidden className={s.stamp({ className: \"left-6 -rotate-12 border-success text-fg-success\" })} style={{ opacity: stampOpacity(1) }}>\n {labels.likeStamp ?? labels.like}\n </span>\n <span aria-hidden className={s.stamp({ className: \"right-6 rotate-12 border-danger text-fg-danger\" })} style={{ opacity: stampOpacity(-1) }}>\n {labels.passStamp ?? labels.pass}\n </span>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n <div className={s.buttons()}>\n <button type=\"button\" aria-label={labels.pass} disabled={!top} onClick={() => decide(\"pass\")} className={s.button({ className: \"border-danger text-fg-danger\" })}>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n </button>\n <button type=\"button\" aria-label={labels.like} disabled={!top} onClick={() => decide(\"like\")} className={s.button({ className: \"border-success text-fg-success\" })}>\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z\" />\n </svg>\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
package/dist/switch.js CHANGED
@@ -1,36 +1,8 @@
1
1
  "use client";
2
-
3
- // src/switch/switch.tsx
4
- import { Switch as SwitchPrimitive } from "radix-ui";
5
- import { tv } from "tailwind-variants";
6
- import { jsx } from "react/jsx-runtime";
7
- var switchVariants = tv({
8
- slots: {
9
- root: "peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent bg-fg-muted transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:bg-accent aria-invalid:border-danger",
10
- thumb: "pointer-events-none block rounded-full bg-fg-on-media shadow-sm transition-transform data-[state=unchecked]:translate-x-0.5 motion-reduce:transition-none"
11
- },
12
- variants: {
13
- size: {
14
- sm: { root: "h-5 w-9", thumb: "h-4 w-4 data-[state=checked]:translate-x-[1.125rem]" },
15
- md: { root: "h-6 w-11", thumb: "h-5 w-5 data-[state=checked]:translate-x-[1.375rem]" }
16
- }
17
- },
18
- defaultVariants: { size: "md" }
19
- });
20
- function Switch({ label, size, invalid, className, ...props }) {
21
- const s = switchVariants({ size });
22
- return /* @__PURE__ */ jsx(
23
- SwitchPrimitive.Root,
24
- {
25
- "aria-label": label,
26
- "aria-invalid": invalid || void 0,
27
- "data-invalid": invalid ? "" : void 0,
28
- className: s.root({ className }),
29
- ...props,
30
- children: /* @__PURE__ */ jsx(SwitchPrimitive.Thumb, { className: s.thumb() })
31
- }
32
- );
33
- }
2
+ import {
3
+ Switch,
4
+ switchVariants
5
+ } from "./chunk-CSRKYZ53.js";
34
6
  export {
35
7
  Switch,
36
8
  switchVariants
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/switch/switch.tsx"],"sourcesContent":["// Client. Radix Switch: role=\"switch\", aria-checked, Space and Enter toggle, a hidden input inside a form.\nimport { Switch as SwitchPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport const switchVariants = tv({\n slots: {\n root:\n \"peer relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent bg-fg-muted transition-colors \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-surface-0 \" +\n \"disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:bg-accent aria-invalid:border-danger\",\n thumb:\n \"pointer-events-none block rounded-full bg-fg-on-media shadow-sm transition-transform data-[state=unchecked]:translate-x-0.5 motion-reduce:transition-none\",\n },\n variants: {\n size: {\n sm: { root: \"h-5 w-9\", thumb: \"h-4 w-4 data-[state=checked]:translate-x-[1.125rem]\" },\n md: { root: \"h-6 w-11\", thumb: \"h-5 w-5 data-[state=checked]:translate-x-[1.375rem]\" },\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport type SwitchVariants = VariantProps<typeof switchVariants>;\n\ntype Named =\n | {\n /** The accessible name — required when no visible label names it, passed translated. */\n label: string;\n }\n /** Named by a visible `<label htmlFor={id}>` (e.g. `Field.Label`). */\n | { label?: undefined; id: string }\n /** Named by another element. */\n | { label?: undefined; \"aria-labelledby\": string };\n\nexport type SwitchProps = Omit<React.ComponentProps<typeof SwitchPrimitive.Root>, \"children\"> &\n SwitchVariants &\n Named & {\n /**\n * sm · md.\n * @default \"md\"\n */\n size?: SwitchVariants[\"size\"];\n /** Marks it invalid: aria-invalid and data-invalid. */\n invalid?: boolean;\n };\n\n/** An on/off switch: `checked`/`defaultChecked` + `onCheckedChange`. */\nexport function Switch({ label, size, invalid, className, ...props }: SwitchProps) {\n const s = switchVariants({ size });\n return (\n <SwitchPrimitive.Root\n aria-label={label}\n aria-invalid={invalid || undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={s.root({ className })}\n {...props}\n >\n <SwitchPrimitive.Thumb className={s.thumb()} />\n </SwitchPrimitive.Root>\n );\n}\n"],"mappings":";;;AACA,SAAS,UAAU,uBAAuB;AAE1C,SAAS,UAA6B;AAuDhC;AArDC,IAAM,iBAAiB,GAAG;AAAA,EAC/B,OAAO;AAAA,IACL,MACE;AAAA,IAGF,OACE;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI,EAAE,MAAM,WAAW,OAAO,sDAAsD;AAAA,MACpF,IAAI,EAAE,MAAM,YAAY,OAAO,sDAAsD;AAAA,IACvF;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,MAAM,KAAK;AAChC,CAAC;AA2BM,SAAS,OAAO,EAAE,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,GAAgB;AACjF,QAAM,IAAI,eAAe,EAAE,KAAK,CAAC;AACjC,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,cAAY;AAAA,MACZ,gBAAc,WAAW;AAAA,MACzB,gBAAc,UAAU,KAAK;AAAA,MAC7B,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,MAC9B,GAAG;AAAA,MAEJ,8BAAC,gBAAgB,OAAhB,EAAsB,WAAW,EAAE,MAAM,GAAG;AAAA;AAAA,EAC/C;AAEJ;","names":[]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/tabs.d.ts CHANGED
@@ -17,6 +17,10 @@ declare const tabs: tailwind_variants.TVReturnType<{
17
17
  list: string;
18
18
  trigger: string;
19
19
  };
20
+ binder: {
21
+ list: string;
22
+ trigger: string;
23
+ };
20
24
  };
21
25
  }, {
22
26
  root: string;
@@ -37,6 +41,10 @@ declare const tabs: tailwind_variants.TVReturnType<{
37
41
  list: string;
38
42
  trigger: string;
39
43
  };
44
+ binder: {
45
+ list: string;
46
+ trigger: string;
47
+ };
40
48
  };
41
49
  }, {
42
50
  root: string;
@@ -57,6 +65,10 @@ declare const tabs: tailwind_variants.TVReturnType<{
57
65
  list: string;
58
66
  trigger: string;
59
67
  };
68
+ binder: {
69
+ list: string;
70
+ trigger: string;
71
+ };
60
72
  };
61
73
  }, {
62
74
  root: string;
@@ -64,9 +76,20 @@ declare const tabs: tailwind_variants.TVReturnType<{
64
76
  trigger: string;
65
77
  content: string;
66
78
  }>>;
79
+ /**
80
+ * A divider's colour (`variant="binder"`): the brand's accent by default, or a role of the theme — every one reads at 3:1 or
81
+ * more on both themes. The colour is never the only signal: the words and the count say it.
82
+ */
83
+ type TabsHue = "accent" | "success" | "warning" | "danger" | "neutral";
84
+ type TabsAdd = {
85
+ /** Its words (« Intercalaire », « New tag ») — passed translated. */
86
+ label: string;
87
+ /** Adds a divider (opens the host's form). */
88
+ onAdd: () => void;
89
+ };
67
90
  type TabsVariants = VariantProps<typeof tabs>;
68
91
  type TabsRootProps = React.ComponentProps<typeof Tabs$1.Root> & {
69
- /** underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections). */
92
+ /** underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections) · binder (dividers that organise collections, tags, statuses). */
70
93
  variant?: TabsVariants["variant"];
71
94
  /** Binds the active tab to this search parameter of the URL (`?tab=…`): the URL is the state. Without it the state is local — only for an ephemeral choice. */
72
95
  routeKey?: string;
@@ -75,9 +98,19 @@ type TabsRootProps = React.ComponentProps<typeof Tabs$1.Root> & {
75
98
  };
76
99
  /** `value`/`defaultValue` + `onValueChange`, `orientation` (horizontal by default), `variant` for the list. */
77
100
  declare function TabsRoot({ variant, className, routeKey, routeValues, ...rest }: TabsRootProps): React.JSX.Element;
101
+ type TabsListProps = React.ComponentProps<typeof Tabs$1.List> & {
102
+ /** A « + » button after the tabs (`variant="binder"`: « + Intercalaire »): its words and what it does. */
103
+ add?: TabsAdd;
104
+ };
78
105
  /** The tabs. Name it (`aria-label`) when no heading says what it switches. One light glides to the active tab. */
79
- declare function TabsList({ className, ...props }: React.ComponentProps<typeof Tabs$1.List>): React.JSX.Element;
80
- declare function TabsTrigger({ className, ...props }: React.ComponentProps<typeof Tabs$1.Trigger>): React.JSX.Element;
106
+ declare function TabsList({ className, add, ...props }: TabsListProps): React.JSX.Element;
107
+ type TabsTriggerProps = React.ComponentProps<typeof Tabs$1.Trigger> & {
108
+ /** A count after the words (clients in a collection, unread): part of the tab's name. */
109
+ count?: number;
110
+ /** `variant="binder"`: the divider's colour (the accent by default). */
111
+ hue?: TabsHue;
112
+ };
113
+ declare function TabsTrigger({ className, count, hue, style, children, ...props }: TabsTriggerProps): React.JSX.Element;
81
114
  declare function TabsContent({ className, ...props }: React.ComponentProps<typeof Tabs$1.Content>): React.JSX.Element;
82
115
  /**
83
116
  * Is the link `href` the tab of the route `current` (a path, with its search: `/docs/api?tab=x`)? The path must equal the
@@ -87,11 +120,13 @@ declare function TabsContent({ className, ...props }: React.ComponentProps<typeo
87
120
  */
88
121
  declare function isTabActive(current: string, href: string, exact?: boolean): boolean;
89
122
  type TabsNavProps = Omit<React.ComponentProps<"nav">, "children"> & {
123
+ /** A « + » button after the tabs (`variant="binder"`: « + Intercalaire »). */
124
+ add?: TabsAdd;
90
125
  /** The navigation's accessible name (« Sections »). */
91
126
  label: string;
92
127
  /** The current route, passed in: the path with its search (`usePathname()` + `useSearchParams()`, `/docs?tab=api`). The active tab comes from it; no local state. */
93
128
  current: string;
94
- /** underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections). */
129
+ /** underline (the sections of a page) · segmented (a view switch) · pills (a feed's sections) · binder (dividers). */
95
130
  variant?: TabsVariants["variant"];
96
131
  /** The tabs: `Tabs.NavLink`. */
97
132
  children: React.ReactNode;
@@ -101,7 +136,7 @@ type TabsNavProps = Omit<React.ComponentProps<"nav">, "children"> & {
101
136
  * anchor, the active one carries `aria-current="page"`, the keyboard is the page's own (Tab walks the links, Enter
102
137
  * follows one) and there is no panel — the page is the panel. The same looks and the same gliding light as `Tabs.List`.
103
138
  */
104
- declare function TabsNav({ label, current, variant, className, children, ...props }: TabsNavProps): React.JSX.Element;
139
+ declare function TabsNav({ label, current, variant, add, className, children, ...props }: TabsNavProps): React.JSX.Element;
105
140
  type TabsNavLinkProps = React.ComponentProps<"a"> & {
106
141
  /** Where the tab goes (`/docs/api`, `/docs?tab=api`). */
107
142
  href: string;
@@ -109,10 +144,14 @@ type TabsNavLinkProps = React.ComponentProps<"a"> & {
109
144
  exact?: boolean;
110
145
  /** Renders your router's `<Link>` (pass it as the only child; the `href` goes on this part and on the link). */
111
146
  asChild?: boolean;
147
+ /** A count after the words (not with `asChild`: put it in your link). */
148
+ count?: number;
149
+ /** `variant="binder"`: the divider's colour (the accent by default). */
150
+ hue?: TabsHue;
112
151
  };
113
152
  /** One tab of `Tabs.Nav`: an anchor that is active when the current route is its `href`. */
114
- declare function TabsNavLink({ href, exact, asChild, className, children, ...props }: TabsNavLinkProps): React.JSX.Element;
115
- /** `Tabs.Root/List/Trigger/Content` — `variant` underline · segmented · pills on the root. `Tabs.Nav` + `Tabs.NavLink`: the same tabs as routes. */
153
+ declare function TabsNavLink({ href, exact, asChild, count, hue, style, className, children, ...props }: TabsNavLinkProps): React.JSX.Element;
154
+ /** `Tabs.Root/List/Trigger/Content` — `variant` underline · segmented · pills · binder on the root. `Tabs.Nav` + `Tabs.NavLink`: the same tabs as routes. */
116
155
  declare const Tabs: {
117
156
  Root: typeof TabsRoot;
118
157
  List: typeof TabsList;
@@ -122,4 +161,4 @@ declare const Tabs: {
122
161
  NavLink: typeof TabsNavLink;
123
162
  };
124
163
 
125
- export { Tabs, TabsContent, TabsList, TabsNav, TabsNavLink, type TabsNavLinkProps, type TabsNavProps, TabsRoot, type TabsRootProps, TabsTrigger, type TabsVariants, isTabActive, tabs };
164
+ export { Tabs, type TabsAdd, TabsContent, type TabsHue, TabsList, type TabsListProps, TabsNav, TabsNavLink, type TabsNavLinkProps, type TabsNavProps, TabsRoot, type TabsRootProps, TabsTrigger, type TabsTriggerProps, type TabsVariants, isTabActive, tabs };
package/dist/tabs.js CHANGED
@@ -2,9 +2,6 @@
2
2
  import {
3
3
  useSlidingIndicator
4
4
  } from "./chunk-4QN5YJ3D.js";
5
- import {
6
- useRouteBinding
7
- } from "./chunk-R3LTSMS5.js";
8
5
  import {
9
6
  cn
10
7
  } from "./chunk-NSLXEDIS.js";
@@ -13,7 +10,8 @@ import {
13
10
  import { Slot, Tabs as TabsPrimitive } from "radix-ui";
14
11
  import * as React from "react";
15
12
  import { tv } from "tailwind-variants";
16
- import { jsx } from "react/jsx-runtime";
13
+ import { useRouteBinding } from "@krizaka/ui/router";
14
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
17
15
  var tabs = tv({
18
16
  slots: {
19
17
  root: "flex gap-4 data-[orientation=horizontal]:flex-col data-[orientation=vertical]:flex-row",
@@ -39,24 +37,67 @@ var tabs = tv({
39
37
  pills: {
40
38
  list: "gap-1.5 overflow-x-auto overflow-y-hidden overscroll-x-contain pt-1 -mt-1 pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden before:left-0 before:top-0 before:h-(--kz-ind-h) before:w-(--kz-ind-w) before:translate-x-(--kz-ind-x) before:translate-y-(--kz-ind-y) before:rounded-sm before:border before:border-accent before:bg-accent-soft",
41
39
  trigger: "h-9 rounded-sm border border-border-default bg-surface-1 px-4 text-xs text-fg-secondary hover:border-border-strong hover:text-fg data-[state=active]:border-accent data-[state=active]:bg-accent-soft data-[state=active]:text-fg group-data-[indicator=on]/tabs:data-[state=active]:border-transparent group-data-[indicator=on]/tabs:data-[state=active]:bg-transparent"
40
+ },
41
+ /*
42
+ * Binder dividers (intercalaires, #648): organise collections, tags and statuses. Each tab is a divider with a
43
+ * coloured top edge (`hue`), its words and a count; the active one is the page's colour and joins the content
44
+ * under the list's line. Too many dividers scroll sideways, the edges fading. No paper texture: organisation only.
45
+ */
46
+ binder: {
47
+ list: "items-end gap-1 overflow-x-auto overflow-y-hidden overscroll-x-contain border-b border-border-default px-3 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden [mask-image:linear-gradient(to_right,transparent,black_12px,black_calc(100%-12px),transparent)]",
48
+ trigger: "relative -mb-px min-h-10 rounded-t-lg border border-b-0 border-border-default bg-surface-2 px-3.5 pb-2 pt-2.5 text-sm text-fg-secondary before:absolute before:inset-x-0 before:-top-px before:h-1 before:rounded-t-lg before:bg-(--kz-hue,var(--kz-accent)) hover:bg-surface-3 hover:text-fg data-[state=active]:z-[1] data-[state=active]:bg-surface-1 data-[state=active]:pb-2.5 data-[state=active]:text-fg data-[state=active]:shadow-[0_1px_0_0_var(--kz-surface-1)] motion-reduce:transition-none"
42
49
  }
43
50
  }
44
51
  },
45
52
  defaultVariants: { variant: "underline" }
46
53
  });
54
+ var HUE = {
55
+ accent: "var(--kz-accent)",
56
+ success: "var(--kz-success-text)",
57
+ warning: "var(--kz-warning-text)",
58
+ danger: "var(--kz-danger-text)",
59
+ neutral: "var(--kz-text-muted)"
60
+ };
61
+ var hueStyle = (hue, style) => hue ? { ...style, ["--kz-hue"]: HUE[hue] } : style;
62
+ function TabCount({ count }) {
63
+ if (count === void 0) return null;
64
+ return /* @__PURE__ */ jsx("span", { "data-tab-count": "", className: "font-mono text-xs font-medium tabular-nums text-fg-secondary", children: count });
65
+ }
66
+ function AddButton({ add }) {
67
+ return /* @__PURE__ */ jsxs(
68
+ "button",
69
+ {
70
+ type: "button",
71
+ onClick: add.onAdd,
72
+ className: "mb-1 ml-1 inline-flex min-h-9 shrink-0 items-center gap-1.5 rounded-lg px-2.5 text-sm font-medium text-fg-secondary hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",
73
+ children: [
74
+ /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "h-4 w-4", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": true, focusable: "false", children: /* @__PURE__ */ jsx("path", { d: "M12 5v14M5 12h14" }) }),
75
+ add.label
76
+ ]
77
+ }
78
+ );
79
+ }
47
80
  var VariantContext = React.createContext("underline");
48
81
  function TabsRoot({ variant = "underline", className, routeKey, routeValues, ...rest }) {
49
82
  const props = useRouteBinding(routeKey, routeValues, rest);
50
83
  return /* @__PURE__ */ jsx(VariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx(TabsPrimitive.Root, { "data-variant": variant, className: tabs({ variant }).root({ className }), ...props }) });
51
84
  }
52
- function TabsList({ className, ...props }) {
85
+ function TabsList({ className, add, ...props }) {
53
86
  const variant = React.useContext(VariantContext);
54
87
  const { ref } = useSlidingIndicator({ item: "[role=tab]", active: "[role=tab][data-state=active]" });
55
- return /* @__PURE__ */ jsx(TabsPrimitive.List, { ref, "data-variant": variant, className: tabs({ variant }).list({ className }), ...props });
88
+ const list = /* @__PURE__ */ jsx(TabsPrimitive.List, { ref, "data-variant": variant, className: tabs({ variant }).list({ className: cn(add && "min-w-0 flex-1 border-b-0", className) }), ...props });
89
+ if (!add) return list;
90
+ return /* @__PURE__ */ jsxs("div", { "data-tabs-row": "", className: cn("flex min-w-0 items-end", variant === "binder" && "border-b border-border-default"), children: [
91
+ list,
92
+ /* @__PURE__ */ jsx(AddButton, { add })
93
+ ] });
56
94
  }
57
- function TabsTrigger({ className, ...props }) {
95
+ function TabsTrigger({ className, count, hue, style, children, ...props }) {
58
96
  const variant = React.useContext(VariantContext);
59
- return /* @__PURE__ */ jsx(TabsPrimitive.Trigger, { className: tabs({ variant }).trigger({ className }), ...props });
97
+ return /* @__PURE__ */ jsxs(TabsPrimitive.Trigger, { className: tabs({ variant }).trigger({ className }), style: hueStyle(hue, style), "data-hue": hue, ...props, children: [
98
+ children,
99
+ /* @__PURE__ */ jsx(TabCount, { count })
100
+ ] });
60
101
  }
61
102
  function TabsContent({ className, ...props }) {
62
103
  return /* @__PURE__ */ jsx(TabsPrimitive.Content, { className: tabs().content({ className }), ...props });
@@ -75,12 +116,16 @@ function isTabActive(current, href, exact = false) {
75
116
  return true;
76
117
  }
77
118
  var NavContext = React.createContext(null);
78
- function TabsNav({ label, current, variant = "underline", className, children, ...props }) {
119
+ function TabsNav({ label, current, variant = "underline", add, className, children, ...props }) {
79
120
  const { ref } = useSlidingIndicator({ item: "[data-tabs-link]", active: "[data-tabs-link][data-state=active]" });
80
121
  const value = React.useMemo(() => ({ current, variant }), [current, variant]);
81
- return /* @__PURE__ */ jsx(NavContext.Provider, { value, children: /* @__PURE__ */ jsx("nav", { ref, "aria-label": label, "data-variant": variant, "data-orientation": "horizontal", className: tabs({ variant }).list({ className }), ...props, children }) });
122
+ const nav = /* @__PURE__ */ jsx("nav", { ref, "aria-label": label, "data-variant": variant, "data-orientation": "horizontal", className: tabs({ variant }).list({ className: cn(add && "min-w-0 flex-1 border-b-0", className) }), ...props, children });
123
+ return /* @__PURE__ */ jsx(NavContext.Provider, { value, children: add ? /* @__PURE__ */ jsxs("div", { "data-tabs-row": "", className: cn("flex min-w-0 items-end", variant === "binder" && "border-b border-border-default"), children: [
124
+ nav,
125
+ /* @__PURE__ */ jsx(AddButton, { add })
126
+ ] }) : nav });
82
127
  }
83
- function TabsNavLink({ href, exact, asChild, className, children, ...props }) {
128
+ function TabsNavLink({ href, exact, asChild, count, hue, style, className, children, ...props }) {
84
129
  const ctx = React.useContext(NavContext);
85
130
  if (!ctx) throw new Error("Tabs.NavLink must be inside <Tabs.Nav>");
86
131
  const active = isTabActive(ctx.current, href, exact);
@@ -93,9 +138,14 @@ function TabsNavLink({ href, exact, asChild, className, children, ...props }) {
93
138
  "data-orientation": "horizontal",
94
139
  "aria-current": active ? "page" : void 0,
95
140
  ...asChild ? {} : { href },
141
+ "data-hue": hue,
142
+ style: hueStyle(hue, style),
96
143
  className: cn(tabs({ variant: ctx.variant }).trigger(), "no-underline", className),
97
144
  ...props,
98
- children
145
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
146
+ children,
147
+ /* @__PURE__ */ jsx(TabCount, { count })
148
+ ] })
99
149
  }
100
150
  );
101
151
  }