@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/anatomy-plate/anatomy-plate.tsx"],"sourcesContent":["// Server-safe. The anatomy plate of the Cahier (ADR-004, blocks.css): a component drawn large in the middle of a plate,\n// its parts numbered and named on both sides, a hairline leading from each note to the specimen — the way a field guide\n// shows a bird's anatomy. The notes are real text in an ordered list: the plate is its own text version, and on a phone\n// it stacks (the specimen, then the list).\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport interface AnatomyPart {\n /** The part's name: `the cut`. */\n label: React.ReactNode;\n /** Why it is there, in one sentence: `45°, the Krizaka chamfer; it points where the action goes.` */\n note: React.ReactNode;\n /** The side of the plate it is written on. @default alternates, left first */\n side?: \"left\" | \"right\";\n}\n\nexport type AnatomyPlateProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The plate's title: `Anatomy`. */\n title?: React.ReactNode;\n /** One line under the title, or the scale: `to scale × 1.9`. */\n subtitle?: React.ReactNode;\n /** The parts, numbered in this order. */\n parts: readonly AnatomyPart[];\n /** The specimen: the live component, drawn large. */\n children: React.ReactNode;\n /** The specimen's scale on a wide screen (it is drawn at 1 on a phone). @default 1.6 */\n scale?: number;\n};\n\n/** A component's anatomy as a naturalist's plate: the specimen in the middle, its numbered parts and their reasons around it. */\nexport function AnatomyPlate({ title, subtitle, parts, children, scale = 1.6, className, style, ...props }: AnatomyPlateProps) {\n const numbered = parts.map((p, i) => ({ ...p, n: i + 1, side: p.side ?? (i % 2 === 0 ? \"left\" : \"right\") }));\n const column = (side: \"left\" | \"right\") => (\n <ol className=\"kz-anatomy-parts\" data-side={side}>\n {numbered\n .filter((p) => p.side === side)\n .map((p) => (\n <li key={p.n} value={p.n} className=\"kz-anatomy-part\">\n <span className=\"kz-anatomy-n\" aria-hidden>\n {p.n}\n </span>\n <span className=\"kz-anatomy-text\">\n <b>{p.label}</b> {p.note}\n </span>\n </li>\n ))}\n </ol>\n );\n return (\n <figure className={cn(\"kz-anatomy\", className)} style={{ [\"--kz-anatomy-scale\" as string]: scale, ...style }} {...props}>\n {(title || subtitle) && (\n <figcaption className=\"kz-anatomy-head\">\n {title && <span className=\"kz-plate-title\">{title}</span>}\n {subtitle && <span className=\"kz-plate-sub\">{subtitle}</span>}\n </figcaption>\n )}\n <div className=\"kz-anatomy-stage\">\n {column(\"left\")}\n <div className=\"kz-anatomy-specimen\">\n <div className=\"kz-anatomy-scale\">{children}</div>\n </div>\n {column(\"right\")}\n </div>\n </figure>\n );\n}\n"],"mappings":";;;;;AAuCY,cAGA,YAHA;AARL,SAAS,aAAa,EAAE,OAAO,UAAU,OAAO,UAAU,QAAQ,KAAK,WAAW,OAAO,GAAG,MAAM,GAAsB;AAC7H,QAAM,WAAW,MAAM,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE,SAAS,IAAI,MAAM,IAAI,SAAS,SAAS,EAAE;AAC3G,QAAM,SAAS,CAAC,SACd,oBAAC,QAAG,WAAU,oBAAmB,aAAW,MACzC,mBACE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAC7B,IAAI,CAAC,MACJ,qBAAC,QAAa,OAAO,EAAE,GAAG,WAAU,mBAClC;AAAA,wBAAC,UAAK,WAAU,gBAAe,eAAW,MACvC,YAAE,GACL;AAAA,IACA,qBAAC,UAAK,WAAU,mBACd;AAAA,0BAAC,OAAG,YAAE,OAAM;AAAA,MAAI;AAAA,MAAE,EAAE;AAAA,OACtB;AAAA,OANO,EAAE,CAOX,CACD,GACL;AAEF,SACE,qBAAC,YAAO,WAAW,GAAG,cAAc,SAAS,GAAG,OAAO,EAAE,CAAC,oBAA8B,GAAG,OAAO,GAAG,MAAM,GAAI,GAAG,OAC9G;AAAA,cAAS,aACT,qBAAC,gBAAW,WAAU,mBACnB;AAAA,eAAS,oBAAC,UAAK,WAAU,kBAAkB,iBAAM;AAAA,MACjD,YAAY,oBAAC,UAAK,WAAU,gBAAgB,oBAAS;AAAA,OACxD;AAAA,IAEF,qBAAC,SAAI,WAAU,oBACZ;AAAA,aAAO,MAAM;AAAA,MACd,oBAAC,SAAI,WAAU,uBACb,8BAAC,SAAI,WAAU,oBAAoB,UAAS,GAC9C;AAAA,MACC,OAAO,OAAO;AAAA,OACjB;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/anatomy-plate/anatomy-plate.tsx"],"sourcesContent":["// Server-safe. The anatomy plate of the Cahier (ADR-004, blocks.css): a component drawn large in the middle of a plate,\n// its parts numbered and named on both sides, a hairline leading from each note to the specimen — the way a field guide\n// shows a bird's anatomy. The notes are real text in an ordered list: the plate is its own text version, and on a phone\n// it stacks (the specimen, then the list).\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { warnDeprecated } from \"../deprecated\";\n\nexport interface AnatomyPart {\n /** The part's name: `the cut`. */\n label: React.ReactNode;\n /** Why it is there, in one sentence: `45°, the Krizaka chamfer; it points where the action goes.` */\n note: React.ReactNode;\n /** The side of the plate it is written on. @default alternates, left first */\n side?: \"left\" | \"right\";\n}\n\nexport type AnatomyPlateProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The plate's title: `Anatomy`. */\n title?: React.ReactNode;\n /** One line under the title, or the scale: `to scale × 1.9`. */\n subtitle?: React.ReactNode;\n /** The parts, numbered in this order. */\n parts: readonly AnatomyPart[];\n /** The specimen: the live component, drawn large. */\n children: React.ReactNode;\n /** The specimen's scale on a wide screen (it is drawn at 1 on a phone). @default 1.6 */\n scale?: number;\n};\n\n/**\n * A component's anatomy as a naturalist's plate: the specimen in the middle, its numbered parts and their reasons around it.\n * @deprecated Since 3.55 (ADR-006, krizaka-ui#674): no product uses it. Removed in 4.0.\n */\nexport function AnatomyPlate({ title, subtitle, parts, children, scale = 1.6, className, style, ...props }: AnatomyPlateProps) {\n warnDeprecated(\"anatomy-plate\");\n const numbered = parts.map((p, i) => ({ ...p, n: i + 1, side: p.side ?? (i % 2 === 0 ? \"left\" : \"right\") }));\n const column = (side: \"left\" | \"right\") => (\n <ol className=\"kz-anatomy-parts\" data-side={side}>\n {numbered\n .filter((p) => p.side === side)\n .map((p) => (\n <li key={p.n} value={p.n} className=\"kz-anatomy-part\">\n <span className=\"kz-anatomy-n\" aria-hidden>\n {p.n}\n </span>\n <span className=\"kz-anatomy-text\">\n <b>{p.label}</b> {p.note}\n </span>\n </li>\n ))}\n </ol>\n );\n return (\n <figure className={cn(\"kz-anatomy\", className)} style={{ [\"--kz-anatomy-scale\" as string]: scale, ...style }} {...props}>\n {(title || subtitle) && (\n <figcaption className=\"kz-anatomy-head\">\n {title && <span className=\"kz-plate-title\">{title}</span>}\n {subtitle && <span className=\"kz-plate-sub\">{subtitle}</span>}\n </figcaption>\n )}\n <div className=\"kz-anatomy-stage\">\n {column(\"left\")}\n <div className=\"kz-anatomy-specimen\">\n <div className=\"kz-anatomy-scale\">{children}</div>\n </div>\n {column(\"right\")}\n </div>\n </figure>\n );\n}\n"],"mappings":";;;;;;;;AA4CY,cAGA,YAHA;AATL,SAAS,aAAa,EAAE,OAAO,UAAU,OAAO,UAAU,QAAQ,KAAK,WAAW,OAAO,GAAG,MAAM,GAAsB;AAC7H,iBAAe,eAAe;AAC9B,QAAM,WAAW,MAAM,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,EAAE,SAAS,IAAI,MAAM,IAAI,SAAS,SAAS,EAAE;AAC3G,QAAM,SAAS,CAAC,SACd,oBAAC,QAAG,WAAU,oBAAmB,aAAW,MACzC,mBACE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,EAC7B,IAAI,CAAC,MACJ,qBAAC,QAAa,OAAO,EAAE,GAAG,WAAU,mBAClC;AAAA,wBAAC,UAAK,WAAU,gBAAe,eAAW,MACvC,YAAE,GACL;AAAA,IACA,qBAAC,UAAK,WAAU,mBACd;AAAA,0BAAC,OAAG,YAAE,OAAM;AAAA,MAAI;AAAA,MAAE,EAAE;AAAA,OACtB;AAAA,OANO,EAAE,CAOX,CACD,GACL;AAEF,SACE,qBAAC,YAAO,WAAW,GAAG,cAAc,SAAS,GAAG,OAAO,EAAE,CAAC,oBAA8B,GAAG,OAAO,GAAG,MAAM,GAAI,GAAG,OAC9G;AAAA,cAAS,aACT,qBAAC,gBAAW,WAAU,mBACnB;AAAA,eAAS,oBAAC,UAAK,WAAU,kBAAkB,iBAAM;AAAA,MACjD,YAAY,oBAAC,UAAK,WAAU,gBAAgB,oBAAS;AAAA,OACxD;AAAA,IAEF,qBAAC,SAAI,WAAU,oBACZ;AAAA,aAAO,MAAM;AAAA,MACd,oBAAC,SAAI,WAAU,uBACb,8BAAC,SAAI,WAAU,oBAAoB,UAAS,GAC9C;AAAA,MACC,OAAO,OAAO;AAAA,OACjB;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,63 @@
1
+ import * as tailwind_variants from 'tailwind-variants';
2
+ import * as React from 'react';
3
+
4
+ declare const appHeaderSearch: tailwind_variants.TVReturnType<{
5
+ [key: string]: {
6
+ [key: string]: tailwind_variants.ClassValue | {
7
+ keys?: tailwind_variants.ClassValue;
8
+ label?: tailwind_variants.ClassValue;
9
+ glyph?: tailwind_variants.ClassValue;
10
+ root?: tailwind_variants.ClassValue;
11
+ };
12
+ };
13
+ } | {
14
+ [x: string]: {
15
+ [x: string]: tailwind_variants.ClassValue | {
16
+ keys?: tailwind_variants.ClassValue;
17
+ label?: tailwind_variants.ClassValue;
18
+ glyph?: tailwind_variants.ClassValue;
19
+ root?: tailwind_variants.ClassValue;
20
+ };
21
+ };
22
+ } | {}, {
23
+ root: string;
24
+ glyph: string;
25
+ label: string;
26
+ keys: string;
27
+ }, undefined, {
28
+ [key: string]: {
29
+ [key: string]: tailwind_variants.ClassValue | {
30
+ keys?: tailwind_variants.ClassValue;
31
+ label?: tailwind_variants.ClassValue;
32
+ glyph?: tailwind_variants.ClassValue;
33
+ root?: tailwind_variants.ClassValue;
34
+ };
35
+ };
36
+ } | {}, {
37
+ root: string;
38
+ glyph: string;
39
+ label: string;
40
+ keys: string;
41
+ }, tailwind_variants.TVReturnTypeLike<unknown, {
42
+ root: string;
43
+ glyph: string;
44
+ label: string;
45
+ keys: string;
46
+ }>>;
47
+ /** Whether a keydown is the shortcut: ⌘ or Ctrl with the key, no Alt. */
48
+ declare function isSearchShortcut(event: Pick<KeyboardEvent, "key" | "metaKey" | "ctrlKey" | "altKey">, key: string): boolean;
49
+ type AppHeaderSearchProps = Omit<React.ComponentProps<"button">, "children" | "onClick"> & {
50
+ /** What it searches (« Search files and checks ») — passed translated: the field's words from `md`, the button's name at every width. */
51
+ label: string;
52
+ /** Opens the palette: a click, Enter, and the shortcut. */
53
+ onOpen: () => void;
54
+ /**
55
+ * The shortcut's key with ⌘ (Apple) or Ctrl (elsewhere), global to the page; `false` for none. One per page.
56
+ * @default "k"
57
+ */
58
+ shortcut?: string | false;
59
+ };
60
+ /** The top bar's search trigger: a field from `md`, an icon below; it opens the host's palette, also on ⌘K. */
61
+ declare function AppHeaderSearch({ label, onOpen, shortcut, className, type, ...props }: AppHeaderSearchProps): React.JSX.Element;
62
+
63
+ export { AppHeaderSearch, type AppHeaderSearchProps, appHeaderSearch, isSearchShortcut };
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import {
3
+ Kbd
4
+ } from "../chunk-KID32IRJ.js";
5
+ import {
6
+ SearchGlyph
7
+ } from "../chunk-P7GZR5CU.js";
8
+
9
+ // src/app-header/search/search.tsx
10
+ import * as React from "react";
11
+ import { tv } from "tailwind-variants";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ var appHeaderSearch = tv({
14
+ slots: {
15
+ root: "inline-flex h-9 w-9 shrink-0 items-center justify-center gap-2 rounded-lg text-fg-secondary transition-colors hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none md:w-56 md:justify-start md:border md:border-border-default md:bg-surface-2/60 md:px-3 md:text-xs md:hover:border-border-strong lg:w-72",
16
+ glyph: "h-5 w-5 shrink-0 md:h-4 md:w-4",
17
+ // Hidden on a phone, still the button's name there (sr-only), so the name is the same at every width.
18
+ label: "sr-only md:not-sr-only md:flex-1 md:truncate md:text-left",
19
+ keys: "ml-auto hidden shrink-0 items-center gap-0.5 lg:flex"
20
+ }
21
+ });
22
+ var s = appHeaderSearch();
23
+ var isApple = () => typeof navigator !== "undefined" && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);
24
+ function isSearchShortcut(event, key) {
25
+ return event.key.toLowerCase() === key.toLowerCase() && (event.metaKey || event.ctrlKey) && !event.altKey;
26
+ }
27
+ function AppHeaderSearch({ label, onOpen, shortcut = "k", className, type, ...props }) {
28
+ const [apple, setApple] = React.useState(true);
29
+ const open = React.useRef(onOpen);
30
+ React.useEffect(() => {
31
+ open.current = onOpen;
32
+ }, [onOpen]);
33
+ React.useEffect(() => {
34
+ if (!shortcut) return;
35
+ setApple(isApple());
36
+ const onKey = (event) => {
37
+ if (!isSearchShortcut(event, shortcut)) return;
38
+ event.preventDefault();
39
+ open.current();
40
+ };
41
+ window.addEventListener("keydown", onKey);
42
+ return () => window.removeEventListener("keydown", onKey);
43
+ }, [shortcut]);
44
+ const key = shortcut ? shortcut.toUpperCase() : null;
45
+ return /* @__PURE__ */ jsxs(
46
+ "button",
47
+ {
48
+ type: type ?? "button",
49
+ "aria-haspopup": "dialog",
50
+ "aria-keyshortcuts": key ? `Meta+${key} Control+${key}` : void 0,
51
+ ...props,
52
+ onClick: () => onOpen(),
53
+ className: s.root({ className }),
54
+ children: [
55
+ /* @__PURE__ */ jsx(SearchGlyph, { className: s.glyph() }),
56
+ /* @__PURE__ */ jsx("span", { className: s.label(), children: label }),
57
+ key && /* @__PURE__ */ jsxs("span", { "aria-hidden": true, className: s.keys(), children: [
58
+ /* @__PURE__ */ jsx(Kbd, { size: "sm", children: apple ? "\u2318" : "Ctrl" }),
59
+ /* @__PURE__ */ jsx(Kbd, { size: "sm", children: key })
60
+ ] })
61
+ ]
62
+ }
63
+ );
64
+ }
65
+ export {
66
+ AppHeaderSearch,
67
+ appHeaderSearch,
68
+ isSearchShortcut
69
+ };
70
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/app-header/search/search.tsx"],"sourcesContent":["// Client (a global shortcut). The top bar's search trigger: a field-like button (the glyph, the label, ⌘K) from `md`, an\n// icon below. It does not search: it opens the host's palette (`CommandDialog` of @krizaka/ui/command) — on a click, on\n// Enter, and on ⌘K / Ctrl+K from anywhere on the page.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { SearchGlyph } from \"../../glyphs\";\nimport { Kbd } from \"../../kbd/kbd\";\n\nexport const appHeaderSearch = tv({\n slots: {\n root:\n \"inline-flex h-9 w-9 shrink-0 items-center justify-center gap-2 rounded-lg text-fg-secondary transition-colors \" +\n \"hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none \" +\n \"md:w-56 md:justify-start md:border md:border-border-default md:bg-surface-2/60 md:px-3 md:text-xs md:hover:border-border-strong lg:w-72\",\n glyph: \"h-5 w-5 shrink-0 md:h-4 md:w-4\",\n // Hidden on a phone, still the button's name there (sr-only), so the name is the same at every width.\n label: \"sr-only md:not-sr-only md:flex-1 md:truncate md:text-left\",\n keys: \"ml-auto hidden shrink-0 items-center gap-0.5 lg:flex\",\n },\n});\nconst s = appHeaderSearch();\n\nconst isApple = () => typeof navigator !== \"undefined\" && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n\n/** Whether a keydown is the shortcut: ⌘ or Ctrl with the key, no Alt. */\nexport function isSearchShortcut(event: Pick<KeyboardEvent, \"key\" | \"metaKey\" | \"ctrlKey\" | \"altKey\">, key: string): boolean {\n return event.key.toLowerCase() === key.toLowerCase() && (event.metaKey || event.ctrlKey) && !event.altKey;\n}\n\nexport type AppHeaderSearchProps = Omit<React.ComponentProps<\"button\">, \"children\" | \"onClick\"> & {\n /** What it searches (« Search files and checks ») — passed translated: the field's words from `md`, the button's name at every width. */\n label: string;\n /** Opens the palette: a click, Enter, and the shortcut. */\n onOpen: () => void;\n /**\n * The shortcut's key with ⌘ (Apple) or Ctrl (elsewhere), global to the page; `false` for none. One per page.\n * @default \"k\"\n */\n shortcut?: string | false;\n};\n\n/** The top bar's search trigger: a field from `md`, an icon below; it opens the host's palette, also on ⌘K. */\nexport function AppHeaderSearch({ label, onOpen, shortcut = \"k\", className, type, ...props }: AppHeaderSearchProps) {\n const [apple, setApple] = React.useState(true);\n const open = React.useRef(onOpen);\n React.useEffect(() => {\n open.current = onOpen;\n }, [onOpen]);\n\n React.useEffect(() => {\n if (!shortcut) return;\n // eslint-disable-next-line react-hooks/set-state-in-effect -- the platform is only known in the browser (no hydration mismatch)\n setApple(isApple());\n const onKey = (event: KeyboardEvent) => {\n if (!isSearchShortcut(event, shortcut)) return;\n event.preventDefault();\n open.current();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [shortcut]);\n\n const key = shortcut ? shortcut.toUpperCase() : null;\n return (\n <button\n type={type ?? \"button\"}\n aria-haspopup=\"dialog\"\n aria-keyshortcuts={key ? `Meta+${key} Control+${key}` : undefined}\n {...props}\n onClick={() => onOpen()}\n className={s.root({ className })}\n >\n <SearchGlyph className={s.glyph()} />\n <span className={s.label()}>{label}</span>\n {key && (\n <span aria-hidden className={s.keys()}>\n <Kbd size=\"sm\">{apple ? \"⌘\" : \"Ctrl\"}</Kbd>\n <Kbd size=\"sm\">{key}</Kbd>\n </span>\n )}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;AAGA,YAAY,WAAW;AACvB,SAAS,UAAU;AAqEb,cAGE,YAHF;AAhEC,IAAM,kBAAkB,GAAG;AAAA,EAChC,OAAO;AAAA,IACL,MACE;AAAA,IAGF,OAAO;AAAA;AAAA,IAEP,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF,CAAC;AACD,IAAM,IAAI,gBAAgB;AAE1B,IAAM,UAAU,MAAM,OAAO,cAAc,eAAe,kBAAkB,KAAK,UAAU,YAAY,UAAU,SAAS;AAGnH,SAAS,iBAAiB,OAAsE,KAAsB;AAC3H,SAAO,MAAM,IAAI,YAAY,MAAM,IAAI,YAAY,MAAM,MAAM,WAAW,MAAM,YAAY,CAAC,MAAM;AACrG;AAeO,SAAS,gBAAgB,EAAE,OAAO,QAAQ,WAAW,KAAK,WAAW,MAAM,GAAG,MAAM,GAAyB;AAClH,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAS,IAAI;AAC7C,QAAM,OAAa,aAAO,MAAM;AAChC,EAAM,gBAAU,MAAM;AACpB,SAAK,UAAU;AAAA,EACjB,GAAG,CAAC,MAAM,CAAC;AAEX,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AAEf,aAAS,QAAQ,CAAC;AAClB,UAAM,QAAQ,CAAC,UAAyB;AACtC,UAAI,CAAC,iBAAiB,OAAO,QAAQ,EAAG;AACxC,YAAM,eAAe;AACrB,WAAK,QAAQ;AAAA,IACf;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,MAAM,WAAW,SAAS,YAAY,IAAI;AAChD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,QAAQ;AAAA,MACd,iBAAc;AAAA,MACd,qBAAmB,MAAM,QAAQ,GAAG,YAAY,GAAG,KAAK;AAAA,MACvD,GAAG;AAAA,MACJ,SAAS,MAAM,OAAO;AAAA,MACtB,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,MAE/B;AAAA,4BAAC,eAAY,WAAW,EAAE,MAAM,GAAG;AAAA,QACnC,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,QAClC,OACC,qBAAC,UAAK,eAAW,MAAC,WAAW,EAAE,KAAK,GAClC;AAAA,8BAAC,OAAI,MAAK,MAAM,kBAAQ,WAAM,QAAO;AAAA,UACrC,oBAAC,OAAI,MAAK,MAAM,eAAI;AAAA,WACtB;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -10,6 +10,7 @@ declare const appHeader: tailwind_variants.TVReturnType<{
10
10
  name?: tailwind_variants.ClassValue;
11
11
  chips?: tailwind_variants.ClassValue;
12
12
  actions?: tailwind_variants.ClassValue;
13
+ search?: tailwind_variants.ClassValue;
13
14
  };
14
15
  };
15
16
  } | {
@@ -21,6 +22,7 @@ declare const appHeader: tailwind_variants.TVReturnType<{
21
22
  name?: tailwind_variants.ClassValue;
22
23
  chips?: tailwind_variants.ClassValue;
23
24
  actions?: tailwind_variants.ClassValue;
25
+ search?: tailwind_variants.ClassValue;
24
26
  };
25
27
  };
26
28
  } | {}, {
@@ -30,6 +32,7 @@ declare const appHeader: tailwind_variants.TVReturnType<{
30
32
  name: string;
31
33
  chips: string;
32
34
  actions: string;
35
+ search: string;
33
36
  }, undefined, {
34
37
  [key: string]: {
35
38
  [key: string]: tailwind_variants.ClassValue | {
@@ -39,6 +42,7 @@ declare const appHeader: tailwind_variants.TVReturnType<{
39
42
  name?: tailwind_variants.ClassValue;
40
43
  chips?: tailwind_variants.ClassValue;
41
44
  actions?: tailwind_variants.ClassValue;
45
+ search?: tailwind_variants.ClassValue;
42
46
  };
43
47
  };
44
48
  } | {}, {
@@ -48,6 +52,7 @@ declare const appHeader: tailwind_variants.TVReturnType<{
48
52
  name: string;
49
53
  chips: string;
50
54
  actions: string;
55
+ search: string;
51
56
  }, tailwind_variants.TVReturnTypeLike<unknown, {
52
57
  root: string;
53
58
  brand: string;
@@ -55,6 +60,7 @@ declare const appHeader: tailwind_variants.TVReturnType<{
55
60
  name: string;
56
61
  chips: string;
57
62
  actions: string;
63
+ search: string;
58
64
  }>>;
59
65
  type AppHeaderProps = Omit<React.ComponentProps<"header">, "children"> & {
60
66
  /** The product's name, as text (`Orazaka`): the only brand element on a desktop. */
@@ -70,10 +76,88 @@ type AppHeaderProps = Omit<React.ComponentProps<"header">, "children"> & {
70
76
  }>;
71
77
  /** Status chips beside the name (`Badge`): « Local · Sovereign », « Dev », a version. */
72
78
  chips?: React.ReactNode;
73
- /** On the right: theme, notifications, the account menu. */
79
+ /** The search trigger, first of the controls: `AppHeaderSearch` (`@krizaka/ui/app-header/search`) — a field from `md`, an icon below, ⌘K. */
80
+ search?: React.ReactNode;
81
+ /** The language: `LanguageSwitch` (`@krizaka/ui/language-switch`) — a globe and « FR », labelled. */
82
+ language?: React.ReactNode;
83
+ /** The host's own controls, after the language (a theme toggle). Alone, it is the whole right side, as before. */
74
84
  actions?: React.ReactNode;
85
+ /** Messages: an `AppHeaderCount` (an icon button or link with its unread count). Empty: hidden. */
86
+ messages?: React.ReactNode;
87
+ /** Notifications: an `AppHeaderCount` (or the trigger of the host's popover). Empty: hidden. */
88
+ notifications?: React.ReactNode;
89
+ /** The one primary action of the app (« New check », #588), before the account. */
90
+ primary?: React.ReactNode;
91
+ /** The account, last: `AccountMenu` with `showName` (the name from `sm`), or the visitor's Sign in. */
92
+ account?: React.ReactNode;
75
93
  };
76
- /** The app's top bar: the name next to the rail, the mark on a phone, chips, actions. */
77
- declare function AppHeader({ name, mark, href, homeLink, chips, actions, className, ...props }: AppHeaderProps): React.JSX.Element;
94
+ /** The app's top bar: the name next to the rail, the mark on a phone, chips, then search · language · actions · messages · notifications · primary · account. */
95
+ declare function AppHeader({ name, mark, href, homeLink, chips, search, language, actions, messages, notifications, primary, account, className, ...props }: AppHeaderProps): React.JSX.Element;
78
96
 
79
- export { AppHeader, type AppHeaderProps, appHeader };
97
+ declare const appHeaderCount: tailwind_variants.TVReturnType<{
98
+ [key: string]: {
99
+ [key: string]: tailwind_variants.ClassValue | {
100
+ root?: tailwind_variants.ClassValue;
101
+ icon?: tailwind_variants.ClassValue;
102
+ count?: tailwind_variants.ClassValue;
103
+ };
104
+ };
105
+ } | {
106
+ [x: string]: {
107
+ [x: string]: tailwind_variants.ClassValue | {
108
+ root?: tailwind_variants.ClassValue;
109
+ icon?: tailwind_variants.ClassValue;
110
+ count?: tailwind_variants.ClassValue;
111
+ };
112
+ };
113
+ } | {}, {
114
+ root: string;
115
+ icon: string;
116
+ count: string;
117
+ }, undefined, {
118
+ [key: string]: {
119
+ [key: string]: tailwind_variants.ClassValue | {
120
+ root?: tailwind_variants.ClassValue;
121
+ icon?: tailwind_variants.ClassValue;
122
+ count?: tailwind_variants.ClassValue;
123
+ };
124
+ };
125
+ } | {}, {
126
+ root: string;
127
+ icon: string;
128
+ count: string;
129
+ }, tailwind_variants.TVReturnTypeLike<unknown, {
130
+ root: string;
131
+ icon: string;
132
+ count: string;
133
+ }>>;
134
+ type AppHeaderCountProps = Omit<React.ComponentProps<"button">, "children"> & {
135
+ /** What it is (« Notifications », « Messages ») — passed translated; its accessible name, with the count. */
136
+ label: string;
137
+ /** The icon (`<NotificationIcon />` of @krizaka/icons): decorative, the name is `label`. */
138
+ icon: React.ReactNode;
139
+ /** The unread count; 0 or absent draws no badge. */
140
+ count?: number;
141
+ /** The count in words, said after the label (« 3 new », « 3 nouvelles ») — passed translated, with its plural. Default: the number. */
142
+ countLabel?: string;
143
+ /**
144
+ * Above it the badge shows `max+`.
145
+ * @default 99
146
+ */
147
+ max?: number;
148
+ /** A link to the page (`/notifications`) instead of a button. */
149
+ href?: string;
150
+ /** Your router's link (Next's `Link`) for `href`; an `<a>` otherwise. */
151
+ linkAs?: React.ElementType;
152
+ /** The page is the one it leads to (`aria-current="page"`). */
153
+ current?: boolean;
154
+ };
155
+ /** An icon button or link of the top bar with an unread count, the count announced in its name. */
156
+ declare function AppHeaderCount({ label, icon, count, countLabel, max, href, linkAs, current, className, type, ...props }: AppHeaderCountProps): React.JSX.Element;
157
+
158
+ /** What the badge shows: the count, or `max+` above `max`; nothing at 0. */
159
+ declare function countText(count: number | undefined, max?: number): string | null;
160
+ /** The control's accessible name: the label alone, or the label and the count's words (« Notifications, 3 new »). */
161
+ declare function countName(label: string, count: number | undefined, countLabel?: string): string;
162
+
163
+ export { AppHeader, AppHeaderCount, type AppHeaderCountProps, type AppHeaderProps, appHeader, appHeaderCount, countName, countText };
@@ -4,29 +4,87 @@ import { tv } from "tailwind-variants";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  var appHeader = tv({
6
6
  slots: {
7
- root: "sticky top-0 z-30 flex h-14 w-full shrink-0 items-center gap-3 border-b border-border-subtle bg-surface-1 px-4 md:bg-surface-1 md:pl-3 md:pr-5",
7
+ root: "sticky top-0 z-30 flex h-14 w-full min-w-0 shrink-0 items-center gap-3 border-b border-border-subtle bg-surface-1 px-4 md:bg-surface-1 md:pl-3 md:pr-5",
8
8
  // The rail's mark is 56 px tall and so is this bar: the word shares the mark's line, right after the rail.
9
9
  brand: "flex min-w-0 items-center gap-2 font-display text-sm font-bold tracking-tight text-fg no-underline",
10
10
  mark: "inline-flex shrink-0 md:hidden",
11
11
  name: "truncate",
12
12
  chips: "flex shrink-0 items-center gap-2",
13
- actions: "ml-auto flex shrink-0 items-center gap-2"
13
+ // The controls: one row at the right, in the order of the slots. They keep their size; the name gives way.
14
+ actions: "ml-auto flex shrink-0 items-center gap-1 sm:gap-2",
15
+ search: "flex min-w-0 shrink-0"
14
16
  }
15
17
  });
16
18
  var s = appHeader();
17
- function AppHeader({ name, mark, href, homeLink, chips, actions, className, ...props }) {
19
+ function AppHeader({ name, mark, href, homeLink, chips, search, language, actions, messages, notifications, primary, account, className, ...props }) {
18
20
  const brand = /* @__PURE__ */ jsxs(Fragment, { children: [
19
21
  mark && /* @__PURE__ */ jsx("span", { "data-brand-mark": true, className: s.mark(), children: mark }),
20
22
  /* @__PURE__ */ jsx("span", { className: s.name(), children: name })
21
23
  ] });
24
+ const hasControls = [search, language, actions, messages, notifications, primary, account].some(Boolean);
22
25
  return /* @__PURE__ */ jsxs("header", { className: s.root({ className }), ...props, children: [
23
26
  homeLink ? React.cloneElement(homeLink, { className: s.brand() }, brand) : href ? /* @__PURE__ */ jsx("a", { href, className: s.brand(), children: brand }) : /* @__PURE__ */ jsx("div", { className: s.brand(), children: brand }),
24
27
  chips && /* @__PURE__ */ jsx("div", { className: s.chips(), children: chips }),
25
- actions && /* @__PURE__ */ jsx("div", { className: s.actions(), children: actions })
28
+ hasControls && /* @__PURE__ */ jsxs("div", { className: s.actions(), children: [
29
+ search && /* @__PURE__ */ jsx("div", { "data-slot": "search", className: s.search(), children: search }),
30
+ language,
31
+ actions,
32
+ messages,
33
+ notifications,
34
+ primary,
35
+ account
36
+ ] })
26
37
  ] });
27
38
  }
39
+
40
+ // src/app-header/count.tsx
41
+ import { tv as tv2 } from "tailwind-variants";
42
+
43
+ // src/app-header/count-text.ts
44
+ function countText(count, max = 99) {
45
+ if (!count || count <= 0 || !Number.isFinite(count)) return null;
46
+ return count > max ? `${max}+` : String(Math.floor(count));
47
+ }
48
+ function countName(label, count, countLabel) {
49
+ if (!countText(count, Number.POSITIVE_INFINITY)) return label;
50
+ return `${label}, ${countLabel ?? String(Math.floor(count))}`;
51
+ }
52
+
53
+ // src/app-header/count.tsx
54
+ import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
55
+ var appHeaderCount = tv2({
56
+ slots: {
57
+ root: "relative inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-fg-secondary no-underline transition-colors hover:bg-surface-2 hover:text-fg aria-expanded:bg-surface-2 aria-expanded:text-fg aria-[current=page]:bg-surface-2 aria-[current=page]:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none",
58
+ icon: "inline-flex h-5 w-5 items-center justify-center [&>svg]:h-5 [&>svg]:w-5",
59
+ count: "pointer-events-none absolute -right-0.5 -top-0.5 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-accent px-1 font-mono text-[10px] font-bold leading-none tabular-nums text-on-accent ring-2 ring-surface-1"
60
+ }
61
+ });
62
+ var s2 = appHeaderCount();
63
+ function AppHeaderCount({ label, icon, count, countLabel, max = 99, href, linkAs, current, className, type, ...props }) {
64
+ const text = countText(count, max);
65
+ const shared = {
66
+ ...props,
67
+ "aria-label": countName(label, count, countLabel),
68
+ "aria-current": current ? "page" : void 0,
69
+ "data-unread": text ? "" : void 0,
70
+ className: s2.root({ className })
71
+ };
72
+ const children = /* @__PURE__ */ jsxs2(Fragment2, { children: [
73
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": true, className: s2.icon(), children: icon }),
74
+ text && /* @__PURE__ */ jsx2("span", { "aria-hidden": true, "data-count": true, className: s2.count(), children: text })
75
+ ] });
76
+ if (href) {
77
+ const Link = linkAs ?? "a";
78
+ return /* @__PURE__ */ jsx2(Link, { href, ...shared, children });
79
+ }
80
+ return /* @__PURE__ */ jsx2("button", { type: type ?? "button", ...shared, children });
81
+ }
28
82
  export {
29
83
  AppHeader,
30
- appHeader
84
+ AppHeaderCount,
85
+ appHeader,
86
+ appHeaderCount,
87
+ countName,
88
+ countText
31
89
  };
32
90
  //# sourceMappingURL=app-header.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app-header/app-header.tsx"],"sourcesContent":["// Server-safe: no hook, no context. The top bar that sits next to a `RailNav`: the product's NAME as text (the mark is the\n// rail's), then optional chips, then the actions. Where the rail is a bottom tab bar (a phone) it has no room for the mark,\n// so the header shows it there and only there: exactly one brand mark is visible at every width.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const appHeader = tv({\n slots: {\n root: \"sticky top-0 z-30 flex h-14 w-full shrink-0 items-center gap-3 border-b border-border-subtle bg-surface-1 px-4 md:bg-surface-1 md:pl-3 md:pr-5\",\n // The rail's mark is 56 px tall and so is this bar: the word shares the mark's line, right after the rail.\n brand: \"flex min-w-0 items-center gap-2 font-display text-sm font-bold tracking-tight text-fg no-underline\",\n mark: \"inline-flex shrink-0 md:hidden\",\n name: \"truncate\",\n chips: \"flex shrink-0 items-center gap-2\",\n actions: \"ml-auto flex shrink-0 items-center gap-2\",\n },\n});\nconst s = appHeader();\n\nexport type AppHeaderProps = Omit<React.ComponentProps<\"header\">, \"children\"> & {\n /** The product's name, as text (`Orazaka`): the only brand element on a desktop. */\n name: string;\n /** The product's mark (`<ProductLogo id=\"orazaka\" size={22} />`): shown below `md` only, where the rail (which carries it) is a bottom bar. */\n mark?: React.ReactNode;\n /** Makes the name (and the mark) a link home: pass your router's link as `homeLink` or give a `href`. */\n href?: string;\n /** Your router's link element for the home link; it receives the name and the mark as children. */\n homeLink?: React.ReactElement<{ className?: string; children?: React.ReactNode }>;\n /** Status chips beside the name (`Badge`): « Local · Sovereign », « Dev », a version. */\n chips?: React.ReactNode;\n /** On the right: theme, notifications, the account menu. */\n actions?: React.ReactNode;\n};\n\n/** The app's top bar: the name next to the rail, the mark on a phone, chips, actions. */\nexport function AppHeader({ name, mark, href, homeLink, chips, actions, className, ...props }: AppHeaderProps) {\n const brand = (\n <>\n {mark && <span data-brand-mark className={s.mark()}>{mark}</span>}\n <span className={s.name()}>{name}</span>\n </>\n );\n return (\n <header className={s.root({ className })} {...props}>\n {homeLink ? (\n React.cloneElement(homeLink, { className: s.brand() }, brand)\n ) : href ? (\n <a href={href} className={s.brand()}>{brand}</a>\n ) : (\n <div className={s.brand()}>{brand}</div>\n )}\n {chips && <div className={s.chips()}>{chips}</div>}\n {actions && <div className={s.actions()}>{actions}</div>}\n </header>\n );\n}\n"],"mappings":";AAGA,YAAY,WAAW;AACvB,SAAS,UAAU;AAiCf,mBACW,KADX;AA/BG,IAAM,YAAY,GAAG;AAAA,EAC1B,OAAO;AAAA,IACL,MAAM;AAAA;AAAA,IAEN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AACF,CAAC;AACD,IAAM,IAAI,UAAU;AAkBb,SAAS,UAAU,EAAE,MAAM,MAAM,MAAM,UAAU,OAAO,SAAS,WAAW,GAAG,MAAM,GAAmB;AAC7G,QAAM,QACJ,iCACG;AAAA,YAAQ,oBAAC,UAAK,mBAAe,MAAC,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,IAC1D,oBAAC,UAAK,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,KACnC;AAEF,SACE,qBAAC,YAAO,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC3C;AAAA,eACO,mBAAa,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,IAC1D,OACF,oBAAC,OAAE,MAAY,WAAW,EAAE,MAAM,GAAI,iBAAM,IAE5C,oBAAC,SAAI,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAEnC,SAAS,oBAAC,SAAI,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAC3C,WAAW,oBAAC,SAAI,WAAW,EAAE,QAAQ,GAAI,mBAAQ;AAAA,KACpD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/app-header/app-header.tsx","../src/app-header/count.tsx","../src/app-header/count-text.ts"],"sourcesContent":["// Server-safe: no hook, no context. The family's top bar (#640): the product's NAME as text (the mark is the rail's), optional\n// chips, then the session's controls in a fixed order — search, language, the host's actions (a theme toggle), messages,\n// notifications, the primary action, the account. Every slot is the host's; a slot left empty draws nothing. Where the\n// rail is a bottom tab bar (a phone) it has no room for the mark, so the header shows it there and only there: exactly\n// one brand mark is visible at every width. At 360 px the name truncates first; the controls never clip.\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const appHeader = tv({\n slots: {\n root: \"sticky top-0 z-30 flex h-14 w-full min-w-0 shrink-0 items-center gap-3 border-b border-border-subtle bg-surface-1 px-4 md:bg-surface-1 md:pl-3 md:pr-5\",\n // The rail's mark is 56 px tall and so is this bar: the word shares the mark's line, right after the rail.\n brand: \"flex min-w-0 items-center gap-2 font-display text-sm font-bold tracking-tight text-fg no-underline\",\n mark: \"inline-flex shrink-0 md:hidden\",\n name: \"truncate\",\n chips: \"flex shrink-0 items-center gap-2\",\n // The controls: one row at the right, in the order of the slots. They keep their size; the name gives way.\n actions: \"ml-auto flex shrink-0 items-center gap-1 sm:gap-2\",\n search: \"flex min-w-0 shrink-0\",\n },\n});\nconst s = appHeader();\n\nexport type AppHeaderProps = Omit<React.ComponentProps<\"header\">, \"children\"> & {\n /** The product's name, as text (`Orazaka`): the only brand element on a desktop. */\n name: string;\n /** The product's mark (`<ProductLogo id=\"orazaka\" size={22} />`): shown below `md` only, where the rail (which carries it) is a bottom bar. */\n mark?: React.ReactNode;\n /** Makes the name (and the mark) a link home: pass your router's link as `homeLink` or give a `href`. */\n href?: string;\n /** Your router's link element for the home link; it receives the name and the mark as children. */\n homeLink?: React.ReactElement<{ className?: string; children?: React.ReactNode }>;\n /** Status chips beside the name (`Badge`): « Local · Sovereign », « Dev », a version. */\n chips?: React.ReactNode;\n /** The search trigger, first of the controls: `AppHeaderSearch` (`@krizaka/ui/app-header/search`) — a field from `md`, an icon below, ⌘K. */\n search?: React.ReactNode;\n /** The language: `LanguageSwitch` (`@krizaka/ui/language-switch`) — a globe and « FR », labelled. */\n language?: React.ReactNode;\n /** The host's own controls, after the language (a theme toggle). Alone, it is the whole right side, as before. */\n actions?: React.ReactNode;\n /** Messages: an `AppHeaderCount` (an icon button or link with its unread count). Empty: hidden. */\n messages?: React.ReactNode;\n /** Notifications: an `AppHeaderCount` (or the trigger of the host's popover). Empty: hidden. */\n notifications?: React.ReactNode;\n /** The one primary action of the app (« New check », #588), before the account. */\n primary?: React.ReactNode;\n /** The account, last: `AccountMenu` with `showName` (the name from `sm`), or the visitor's Sign in. */\n account?: React.ReactNode;\n};\n\n/** The app's top bar: the name next to the rail, the mark on a phone, chips, then search · language · actions · messages · notifications · primary · account. */\nexport function AppHeader({ name, mark, href, homeLink, chips, search, language, actions, messages, notifications, primary, account, className, ...props }: AppHeaderProps) {\n const brand = (\n <>\n {mark && <span data-brand-mark className={s.mark()}>{mark}</span>}\n <span className={s.name()}>{name}</span>\n </>\n );\n const hasControls = [search, language, actions, messages, notifications, primary, account].some(Boolean);\n return (\n <header className={s.root({ className })} {...props}>\n {homeLink ? (\n React.cloneElement(homeLink, { className: s.brand() }, brand)\n ) : href ? (\n <a href={href} className={s.brand()}>{brand}</a>\n ) : (\n <div className={s.brand()}>{brand}</div>\n )}\n {chips && <div className={s.chips()}>{chips}</div>}\n {/* The order is the family's, not the host's: the same bar in every product. */}\n {hasControls && (\n <div className={s.actions()}>\n {search && <div data-slot=\"search\" className={s.search()}>{search}</div>}\n {language}\n {actions}\n {messages}\n {notifications}\n {primary}\n {account}\n </div>\n )}\n </header>\n );\n}\n","// Server-safe: no hook. An icon control of the top bar with an unread count — messages, notifications. A link (`href`, your\n// router's `linkAs`) or a button (the trigger of the host's popover, through `asChild` of Radix: its props and ref are\n// spread here). The count is drawn as a small badge and said in the name: « Notifications, 3 new ».\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { countName, countText } from \"./count-text\";\n\nexport const appHeaderCount = tv({\n slots: {\n root:\n \"relative inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-fg-secondary no-underline transition-colors \" +\n \"hover:bg-surface-2 hover:text-fg aria-expanded:bg-surface-2 aria-expanded:text-fg aria-[current=page]:bg-surface-2 aria-[current=page]:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none\",\n icon: \"inline-flex h-5 w-5 items-center justify-center [&>svg]:h-5 [&>svg]:w-5\",\n count:\n \"pointer-events-none absolute -right-0.5 -top-0.5 flex h-[18px] min-w-[18px] items-center justify-center rounded-full bg-accent px-1 \" +\n \"font-mono text-[10px] font-bold leading-none tabular-nums text-on-accent ring-2 ring-surface-1\",\n },\n});\nconst s = appHeaderCount();\n\nexport type AppHeaderCountProps = Omit<React.ComponentProps<\"button\">, \"children\"> & {\n /** What it is (« Notifications », « Messages ») — passed translated; its accessible name, with the count. */\n label: string;\n /** The icon (`<NotificationIcon />` of @krizaka/icons): decorative, the name is `label`. */\n icon: React.ReactNode;\n /** The unread count; 0 or absent draws no badge. */\n count?: number;\n /** The count in words, said after the label (« 3 new », « 3 nouvelles ») — passed translated, with its plural. Default: the number. */\n countLabel?: string;\n /**\n * Above it the badge shows `max+`.\n * @default 99\n */\n max?: number;\n /** A link to the page (`/notifications`) instead of a button. */\n href?: string;\n /** Your router's link (Next's `Link`) for `href`; an `<a>` otherwise. */\n linkAs?: React.ElementType;\n /** The page is the one it leads to (`aria-current=\"page\"`). */\n current?: boolean;\n};\n\n/** An icon button or link of the top bar with an unread count, the count announced in its name. */\nexport function AppHeaderCount({ label, icon, count, countLabel, max = 99, href, linkAs, current, className, type, ...props }: AppHeaderCountProps) {\n const text = countText(count, max);\n const shared = {\n ...props,\n \"aria-label\": countName(label, count, countLabel),\n \"aria-current\": current ? (\"page\" as const) : undefined,\n \"data-unread\": text ? \"\" : undefined,\n className: s.root({ className }),\n };\n const children = (\n <>\n <span aria-hidden className={s.icon()}>{icon}</span>\n {text && <span aria-hidden data-count className={s.count()}>{text}</span>}\n </>\n );\n if (href) {\n const Link = linkAs ?? \"a\";\n return <Link href={href} {...shared}>{children}</Link>;\n }\n return <button type={type ?? \"button\"} {...shared}>{children}</button>;\n}\n","// Pure, no import: shared by the web's AppHeaderCount and the native one (src/native/app-header.tsx).\n\n/** What the badge shows: the count, or `max+` above `max`; nothing at 0. */\nexport function countText(count: number | undefined, max = 99): string | null {\n if (!count || count <= 0 || !Number.isFinite(count)) return null;\n return count > max ? `${max}+` : String(Math.floor(count));\n}\n\n/** The control's accessible name: the label alone, or the label and the count's words (« Notifications, 3 new »). */\nexport function countName(label: string, count: number | undefined, countLabel?: string): string {\n if (!countText(count, Number.POSITIVE_INFINITY)) return label;\n return `${label}, ${countLabel ?? String(Math.floor(count!))}`;\n}\n"],"mappings":";AAKA,YAAY,WAAW;AACvB,SAAS,UAAU;AA+Cf,mBACW,KADX;AA7CG,IAAM,YAAY,GAAG;AAAA,EAC1B,OAAO;AAAA,IACL,MAAM;AAAA;AAAA,IAEN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,IAEP,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF,CAAC;AACD,IAAM,IAAI,UAAU;AA8Bb,SAAS,UAAU,EAAE,MAAM,MAAM,MAAM,UAAU,OAAO,QAAQ,UAAU,SAAS,UAAU,eAAe,SAAS,SAAS,WAAW,GAAG,MAAM,GAAmB;AAC1K,QAAM,QACJ,iCACG;AAAA,YAAQ,oBAAC,UAAK,mBAAe,MAAC,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,IAC1D,oBAAC,UAAK,WAAW,EAAE,KAAK,GAAI,gBAAK;AAAA,KACnC;AAEF,QAAM,cAAc,CAAC,QAAQ,UAAU,SAAS,UAAU,eAAe,SAAS,OAAO,EAAE,KAAK,OAAO;AACvG,SACE,qBAAC,YAAO,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC3C;AAAA,eACO,mBAAa,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,IAC1D,OACF,oBAAC,OAAE,MAAY,WAAW,EAAE,MAAM,GAAI,iBAAM,IAE5C,oBAAC,SAAI,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAEnC,SAAS,oBAAC,SAAI,WAAW,EAAE,MAAM,GAAI,iBAAM;AAAA,IAE3C,eACC,qBAAC,SAAI,WAAW,EAAE,QAAQ,GACvB;AAAA,gBAAU,oBAAC,SAAI,aAAU,UAAS,WAAW,EAAE,OAAO,GAAI,kBAAO;AAAA,MACjE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,OACH;AAAA,KAEJ;AAEJ;;;AC/EA,SAAS,MAAAA,WAAU;;;ACDZ,SAAS,UAAU,OAA2B,MAAM,IAAmB;AAC5E,MAAI,CAAC,SAAS,SAAS,KAAK,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AAC5D,SAAO,QAAQ,MAAM,GAAG,GAAG,MAAM,OAAO,KAAK,MAAM,KAAK,CAAC;AAC3D;AAGO,SAAS,UAAU,OAAe,OAA2B,YAA6B;AAC/F,MAAI,CAAC,UAAU,OAAO,OAAO,iBAAiB,EAAG,QAAO;AACxD,SAAO,GAAG,KAAK,KAAK,cAAc,OAAO,KAAK,MAAM,KAAM,CAAC,CAAC;AAC9D;;;AD2CI,qBAAAC,WACE,OAAAC,MADF,QAAAC,aAAA;AA/CG,IAAM,iBAAiBC,IAAG;AAAA,EAC/B,OAAO;AAAA,IACL,MACE;AAAA,IAGF,MAAM;AAAA,IACN,OACE;AAAA,EAEJ;AACF,CAAC;AACD,IAAMC,KAAI,eAAe;AAyBlB,SAAS,eAAe,EAAE,OAAO,MAAM,OAAO,YAAY,MAAM,IAAI,MAAM,QAAQ,SAAS,WAAW,MAAM,GAAG,MAAM,GAAwB;AAClJ,QAAM,OAAO,UAAU,OAAO,GAAG;AACjC,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,cAAc,UAAU,OAAO,OAAO,UAAU;AAAA,IAChD,gBAAgB,UAAW,SAAmB;AAAA,IAC9C,eAAe,OAAO,KAAK;AAAA,IAC3B,WAAWA,GAAE,KAAK,EAAE,UAAU,CAAC;AAAA,EACjC;AACA,QAAM,WACJ,gBAAAF,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,UAAK,eAAW,MAAC,WAAWG,GAAE,KAAK,GAAI,gBAAK;AAAA,IAC5C,QAAQ,gBAAAH,KAAC,UAAK,eAAW,MAAC,cAAU,MAAC,WAAWG,GAAE,MAAM,GAAI,gBAAK;AAAA,KACpE;AAEF,MAAI,MAAM;AACR,UAAM,OAAO,UAAU;AACvB,WAAO,gBAAAH,KAAC,QAAK,MAAa,GAAG,QAAS,UAAS;AAAA,EACjD;AACA,SAAO,gBAAAA,KAAC,YAAO,MAAM,QAAQ,UAAW,GAAG,QAAS,UAAS;AAC/D;","names":["tv","Fragment","jsx","jsxs","tv","s"]}
package/dist/app-shell.js CHANGED
@@ -2,6 +2,9 @@
2
2
  import {
3
3
  SkipLink
4
4
  } from "./chunk-4QH6CP2Y.js";
5
+ import {
6
+ Kbd
7
+ } from "./chunk-KID32IRJ.js";
5
8
  import {
6
9
  ChevronGlyph,
7
10
  CloseGlyph,
@@ -14,19 +17,7 @@ import {
14
17
  // src/app-shell/app-shell.tsx
15
18
  import { Dialog as DialogPrimitive, Slot } from "radix-ui";
16
19
  import * as React3 from "react";
17
- import { tv as tv2 } from "tailwind-variants";
18
-
19
- // src/kbd/kbd.tsx
20
20
  import { tv } from "tailwind-variants";
21
- import { jsx } from "react/jsx-runtime";
22
- var kbdVariants = tv({
23
- base: "inline-flex shrink-0 items-center justify-center rounded-md border border-border-default border-b-2 bg-surface-2 font-mono font-semibold text-fg-secondary",
24
- variants: { size: { sm: "h-5 min-w-5 px-1 text-[10px]", md: "h-6 min-w-6 px-1.5 text-xs" } },
25
- defaultVariants: { size: "md" }
26
- });
27
- function Kbd({ size, className, ...props }) {
28
- return /* @__PURE__ */ jsx("kbd", { className: kbdVariants({ size, className }), ...props });
29
- }
30
21
 
31
22
  // src/app-shell/shortcuts.ts
32
23
  import * as React2 from "react";
@@ -126,8 +117,8 @@ function useShortcuts(map, { enabled = true, timeout = 900 } = {}) {
126
117
  }
127
118
 
128
119
  // src/app-shell/app-shell.tsx
129
- import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
130
- var appShell = tv2({
120
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
121
+ var appShell = tv({
131
122
  slots: {
132
123
  root: "flex min-h-dvh w-full bg-surface-0 text-fg data-desktop:h-[var(--kz-window-height,100dvh)] data-desktop:overflow-hidden",
133
124
  sidebar: "sticky top-0 hidden h-dvh shrink-0 flex-col overflow-x-clip border-r border-border-subtle bg-surface-1 transition-[width] duration-300 motion-reduce:transition-none md:flex w-64 data-collapsed:w-[4.25rem] [[data-desktop]_&]:static [[data-desktop]_&]:flex [[data-desktop]_&]:h-auto [[data-desktop]_&]:w-60 [[data-desktop]_&]:select-none [[data-desktop]_&]:data-collapsed:w-[4.75rem]",
@@ -176,8 +167,8 @@ function AppShellRoot({ defaultCollapsed = false, collapsed: controlled, onColla
176
167
  );
177
168
  const value = React3.useMemo(() => ({ collapsed, setCollapsed, open, setOpen, inDrawer: false, desktop }), [collapsed, setCollapsed, open, desktop]);
178
169
  useShortcuts(collapseShortcut ? { [collapseShortcut]: () => setCollapsed(!collapsed) } : {});
179
- return /* @__PURE__ */ jsx2(ShellContext.Provider, { value, children: /* @__PURE__ */ jsxs("div", { "data-desktop": desktop ? "" : void 0, className: s.root({ className }), ...props, children: [
180
- skipLabel && /* @__PURE__ */ jsx2(SkipLink, { href: "#content", children: skipLabel }),
170
+ return /* @__PURE__ */ jsx(ShellContext.Provider, { value, children: /* @__PURE__ */ jsxs("div", { "data-desktop": desktop ? "" : void 0, className: s.root({ className }), ...props, children: [
171
+ skipLabel && /* @__PURE__ */ jsx(SkipLink, { href: "#content", children: skipLabel }),
181
172
  children
182
173
  ] }) });
183
174
  }
@@ -185,17 +176,17 @@ function SidebarContent({ brand, children, footer, collapseLabels, closeLabel })
185
176
  const { collapsed, setCollapsed, inDrawer, desktop } = useShell();
186
177
  const drag = desktop ? { "data-tauri-drag-region": "" } : {};
187
178
  return /* @__PURE__ */ jsxs(Fragment, { children: [
188
- desktop && /* @__PURE__ */ jsx2("div", { "aria-hidden": true, className: s.titlebar(), ...drag }),
179
+ desktop && /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: s.titlebar(), ...drag }),
189
180
  /* @__PURE__ */ jsxs("div", { className: s.brand(), ...drag, children: [
190
181
  brand,
191
- inDrawer && /* @__PURE__ */ jsx2(DialogPrimitive.Close, { className: cn(s.menuButton(), "ml-auto flex"), "aria-label": closeLabel, children: /* @__PURE__ */ jsx2(CloseGlyph, { className: "h-4 w-4" }) })
182
+ inDrawer && /* @__PURE__ */ jsx(DialogPrimitive.Close, { className: cn(s.menuButton(), "ml-auto flex"), "aria-label": closeLabel, children: /* @__PURE__ */ jsx(CloseGlyph, { className: "h-4 w-4" }) })
192
183
  ] }),
193
- /* @__PURE__ */ jsx2("div", { className: s.nav(), children }),
184
+ /* @__PURE__ */ jsx("div", { className: s.nav(), children }),
194
185
  (footer || collapseLabels && !inDrawer) && /* @__PURE__ */ jsxs("div", { className: s.footer(), children: [
195
- footer && /* @__PURE__ */ jsx2("div", { className: s.footerContent(), children: footer }),
186
+ footer && /* @__PURE__ */ jsx("div", { className: s.footerContent(), children: footer }),
196
187
  collapseLabels && !inDrawer && /* @__PURE__ */ jsxs("button", { type: "button", className: s.collapse(), "aria-expanded": !collapsed, onClick: () => setCollapsed(!collapsed), children: [
197
- /* @__PURE__ */ jsx2(ChevronGlyph, { direction: collapsed ? "right" : "left", className: "h-4 w-4" }),
198
- /* @__PURE__ */ jsx2("span", { className: collapsed ? "sr-only" : void 0, children: collapsed ? collapseLabels[1] : collapseLabels[0] })
188
+ /* @__PURE__ */ jsx(ChevronGlyph, { direction: collapsed ? "right" : "left", className: "h-4 w-4" }),
189
+ /* @__PURE__ */ jsx("span", { className: collapsed ? "sr-only" : void 0, children: collapsed ? collapseLabels[1] : collapseLabels[0] })
199
190
  ] })
200
191
  ] })
201
192
  ] });
@@ -204,18 +195,18 @@ function AppShellSidebar({ label, brand, children, footer, collapseLabels, close
204
195
  const shell = useShell();
205
196
  const content = { brand, children, footer, collapseLabels, closeLabel };
206
197
  return /* @__PURE__ */ jsxs(Fragment, { children: [
207
- /* @__PURE__ */ jsx2("nav", { "aria-label": label, "data-collapsed": shell.collapsed ? "" : void 0, className: s.sidebar({ className }), ...props, children: /* @__PURE__ */ jsx2(SidebarContent, { ...content }) }),
208
- !shell.desktop && /* @__PURE__ */ jsx2(DialogPrimitive.Root, { open: shell.open, onOpenChange: shell.setOpen, children: /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { children: [
209
- /* @__PURE__ */ jsx2(DialogPrimitive.Overlay, { className: s.overlay() }),
198
+ /* @__PURE__ */ jsx("nav", { "aria-label": label, "data-collapsed": shell.collapsed ? "" : void 0, className: s.sidebar({ className }), ...props, children: /* @__PURE__ */ jsx(SidebarContent, { ...content }) }),
199
+ !shell.desktop && /* @__PURE__ */ jsx(DialogPrimitive.Root, { open: shell.open, onOpenChange: shell.setOpen, children: /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { children: [
200
+ /* @__PURE__ */ jsx(DialogPrimitive.Overlay, { className: s.overlay() }),
210
201
  /* @__PURE__ */ jsxs(DialogPrimitive.Content, { className: s.drawer(), "aria-describedby": void 0, children: [
211
- /* @__PURE__ */ jsx2(DialogPrimitive.Title, { className: "sr-only", children: label }),
212
- /* @__PURE__ */ jsx2(ShellContext.Provider, { value: { ...shell, collapsed: false, inDrawer: true }, children: /* @__PURE__ */ jsx2("nav", { "aria-label": label, className: "flex min-h-0 flex-1 flex-col", onClick: (e) => e.target.closest("a") && shell.setOpen(false), children: /* @__PURE__ */ jsx2(SidebarContent, { ...content }) }) })
202
+ /* @__PURE__ */ jsx(DialogPrimitive.Title, { className: "sr-only", children: label }),
203
+ /* @__PURE__ */ jsx(ShellContext.Provider, { value: { ...shell, collapsed: false, inDrawer: true }, children: /* @__PURE__ */ jsx("nav", { "aria-label": label, className: "flex min-h-0 flex-1 flex-col", onClick: (e) => e.target.closest("a") && shell.setOpen(false), children: /* @__PURE__ */ jsx(SidebarContent, { ...content }) }) })
213
204
  ] })
214
205
  ] }) })
215
206
  ] });
216
207
  }
217
208
  function AppShellGroup({ className, ...props }) {
218
- return /* @__PURE__ */ jsx2("p", { className: s.group({ className }), ...props });
209
+ return /* @__PURE__ */ jsx("p", { className: s.group({ className }), ...props });
219
210
  }
220
211
  function AppShellItem({ icon, label, current, badge, shortcut, asChild, children, className, ...props }) {
221
212
  const { collapsed, inDrawer } = useShell();
@@ -225,36 +216,36 @@ function AppShellItem({ icon, label, current, badge, shortcut, asChild, children
225
216
  const Comp = asChild ? Slot.Root : "a";
226
217
  const inner = /* @__PURE__ */ jsxs(Fragment, { children: [
227
218
  icon,
228
- /* @__PURE__ */ jsx2("span", { className: s.itemLabel(), children: label }),
229
- badge != null && /* @__PURE__ */ jsx2("span", { className: s.itemBadge(), children: badge }),
230
- shortcut && !inDrawer ? /* @__PURE__ */ jsx2("span", { className: s.itemHint(), "aria-hidden": true, children: formatShortcut(shortcut, apple).map((key) => /* @__PURE__ */ jsx2(Kbd, { size: "sm", children: key }, key)) }) : null
219
+ /* @__PURE__ */ jsx("span", { className: s.itemLabel(), children: label }),
220
+ badge != null && /* @__PURE__ */ jsx("span", { className: s.itemBadge(), children: badge }),
221
+ shortcut && !inDrawer ? /* @__PURE__ */ jsx("span", { className: s.itemHint(), "aria-hidden": true, children: formatShortcut(shortcut, apple).map((key) => /* @__PURE__ */ jsx(Kbd, { size: "sm", children: key }, key)) }) : null
231
222
  ] });
232
- return /* @__PURE__ */ jsx2(Comp, { ref: element, "aria-current": current ? "page" : void 0, "aria-keyshortcuts": shortcut ? ariaKeyShortcuts(shortcut, apple) : void 0, title: collapsed ? label : void 0, className: s.item({ className }), ...props, children: asChild && children ? React3.cloneElement(children, void 0, inner) : inner });
223
+ return /* @__PURE__ */ jsx(Comp, { ref: element, "aria-current": current ? "page" : void 0, "aria-keyshortcuts": shortcut ? ariaKeyShortcuts(shortcut, apple) : void 0, title: collapsed ? label : void 0, className: s.item({ className }), ...props, children: asChild && children ? React3.cloneElement(children, void 0, inner) : inner });
233
224
  }
234
225
  function AppShellBody({ className, ...props }) {
235
- return /* @__PURE__ */ jsx2("div", { className: s.body({ className }), ...props });
226
+ return /* @__PURE__ */ jsx("div", { className: s.body({ className }), ...props });
236
227
  }
237
228
  function AppShellHeader({ title, menuLabel, actions, className, children, ...props }) {
238
229
  const { open, setOpen, desktop } = useShell();
239
230
  const drag = desktop ? { "data-tauri-drag-region": "" } : {};
240
231
  return /* @__PURE__ */ jsxs("header", { className: s.header({ className }), ...drag, ...props, children: [
241
- /* @__PURE__ */ jsx2("button", { type: "button", className: s.menuButton(), "aria-label": menuLabel, "aria-expanded": open, "aria-haspopup": "dialog", onClick: () => setOpen(true), children: /* @__PURE__ */ jsx2("svg", { viewBox: "0 0 24 24", className: "h-4 w-4", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx2("path", { d: "M4 7h16M4 12h16M4 17h10" }) }) }),
242
- title && /* @__PURE__ */ jsx2("h1", { className: s.title(), ...drag, children: title }),
232
+ /* @__PURE__ */ jsx("button", { type: "button", className: s.menuButton(), "aria-label": menuLabel, "aria-expanded": open, "aria-haspopup": "dialog", onClick: () => setOpen(true), children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", className: "h-4 w-4", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M4 7h16M4 12h16M4 17h10" }) }) }),
233
+ title && /* @__PURE__ */ jsx("h1", { className: s.title(), ...drag, children: title }),
243
234
  children,
244
- actions && /* @__PURE__ */ jsx2("div", { className: s.actions(), children: actions })
235
+ actions && /* @__PURE__ */ jsx("div", { className: s.actions(), children: actions })
245
236
  ] });
246
237
  }
247
238
  function AppShellSearch({ label, onOpen, shortcut = "mod+k", className, ...props }) {
248
239
  const apple = useApple();
249
240
  useShortcuts({ [shortcut]: () => onOpen() });
250
241
  return /* @__PURE__ */ jsxs("button", { type: "button", className: s.search({ className }), "aria-keyshortcuts": ariaKeyShortcuts(shortcut, apple), onClick: onOpen, ...props, children: [
251
- /* @__PURE__ */ jsx2(SearchGlyph, {}),
252
- /* @__PURE__ */ jsx2("span", { className: s.searchLabel(), children: label }),
253
- /* @__PURE__ */ jsx2("span", { className: s.searchKeys(), "aria-hidden": true, children: formatShortcut(shortcut, apple).map((key) => /* @__PURE__ */ jsx2(Kbd, { size: "sm", children: key }, key)) })
242
+ /* @__PURE__ */ jsx(SearchGlyph, {}),
243
+ /* @__PURE__ */ jsx("span", { className: s.searchLabel(), children: label }),
244
+ /* @__PURE__ */ jsx("span", { className: s.searchKeys(), "aria-hidden": true, children: formatShortcut(shortcut, apple).map((key) => /* @__PURE__ */ jsx(Kbd, { size: "sm", children: key }, key)) })
254
245
  ] });
255
246
  }
256
247
  function AppShellMain({ className, ...props }) {
257
- return /* @__PURE__ */ jsx2("main", { id: "content", tabIndex: -1, className: s.main({ className }), ...props });
248
+ return /* @__PURE__ */ jsx("main", { id: "content", tabIndex: -1, className: s.main({ className }), ...props });
258
249
  }
259
250
  var AppShell = {
260
251
  Root: AppShellRoot,