@krizaka/ui 3.34.0 → 3.36.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 (589) hide show
  1. package/dist/account-menu.js +1 -1
  2. package/dist/account-menu.js.map +1 -1
  3. package/dist/activity-feed.js +1 -1
  4. package/dist/activity-feed.js.map +1 -1
  5. package/dist/anatomy-plate.d.ts +26 -0
  6. package/dist/anatomy-plate.js +32 -0
  7. package/dist/anatomy-plate.js.map +1 -0
  8. package/dist/app-header.js +1 -1
  9. package/dist/app-header.js.map +1 -1
  10. package/dist/app-shell.js +3 -3
  11. package/dist/app-shell.js.map +1 -1
  12. package/dist/argument-card.js +1 -1
  13. package/dist/bird-plate.d.ts +38 -0
  14. package/dist/bird-plate.js +39 -0
  15. package/dist/bird-plate.js.map +1 -0
  16. package/dist/blocks.css +243 -46
  17. package/dist/checkbox.js +1 -1
  18. package/dist/checkbox.js.map +1 -1
  19. package/dist/chip-row.js +1 -1
  20. package/dist/chip-row.js.map +1 -1
  21. package/dist/{chunk-3S4GHSPZ.js → chunk-63KCDMX2.js} +3 -3
  22. package/dist/chunk-63KCDMX2.js.map +1 -0
  23. package/dist/{chunk-NJFCSVPT.js → chunk-6EAHUURY.js} +2 -2
  24. package/dist/chunk-6EAHUURY.js.map +1 -0
  25. package/dist/{chunk-REPTKUJ6.js → chunk-7NRSPHAF.js} +2 -2
  26. package/dist/chunk-7NRSPHAF.js.map +1 -0
  27. package/dist/{chunk-2AJ4NJUF.js → chunk-IANSFIVC.js} +5 -1
  28. package/dist/chunk-IANSFIVC.js.map +1 -0
  29. package/dist/chunk-JFJECOZ2.js +338 -0
  30. package/dist/chunk-JFJECOZ2.js.map +1 -0
  31. package/dist/{chunk-KIBICUZK.js → chunk-K2ZYB4HP.js} +4 -4
  32. package/dist/{chunk-7Z4KHPFC.js → chunk-YGIN2YIY.js} +2 -2
  33. package/dist/{chunk-7Z4KHPFC.js.map → chunk-YGIN2YIY.js.map} +1 -1
  34. package/dist/{chunk-LZNZLCOE.js → chunk-YKEIOYJ5.js} +20 -6
  35. package/dist/chunk-YKEIOYJ5.js.map +1 -0
  36. package/dist/{chunk-2PNLHZLT.js → chunk-YOTQD7JD.js} +2 -2
  37. package/dist/chunk-YOTQD7JD.js.map +1 -0
  38. package/dist/command.js +3 -3
  39. package/dist/command.js.map +1 -1
  40. package/dist/comparison-table.js +2 -2
  41. package/dist/comparison-table.js.map +1 -1
  42. package/dist/countdown.js +1 -1
  43. package/dist/countdown.js.map +1 -1
  44. package/dist/cover-hero.js +15 -6
  45. package/dist/cover-hero.js.map +1 -1
  46. package/dist/dashboard-layout.js +1 -1
  47. package/dist/dashboard-layout.js.map +1 -1
  48. package/dist/data-table.js +4 -4
  49. package/dist/date-picker.js +3 -3
  50. package/dist/date-picker.js.map +1 -1
  51. package/dist/description-list.js +1 -1
  52. package/dist/description-list.js.map +1 -1
  53. package/dist/detail-layout.js +1 -1
  54. package/dist/detail-layout.js.map +1 -1
  55. package/dist/dialog.js +1 -1
  56. package/dist/docs-nav.js +1 -1
  57. package/dist/docs-nav.js.map +1 -1
  58. package/dist/dropdown-menu.js +1 -1
  59. package/dist/dropdown-menu.js.map +1 -1
  60. package/dist/filter-bar.js +1 -1
  61. package/dist/footnote.d.ts +32 -0
  62. package/dist/footnote.js +29 -0
  63. package/dist/footnote.js.map +1 -0
  64. package/dist/genui.js +4 -4
  65. package/dist/geometry-DncHaYP8.d.ts +22 -0
  66. package/dist/language-switch.js +1 -1
  67. package/dist/list.js +1 -1
  68. package/dist/loader.js +2 -2
  69. package/dist/loader.js.map +1 -1
  70. package/dist/map.js +95 -83
  71. package/dist/map.js.map +1 -1
  72. package/dist/mascot-quote.d.ts +2 -21
  73. package/dist/mascot-quote.js +9 -338
  74. package/dist/mascot-quote.js.map +1 -1
  75. package/dist/match-dialog.js +1 -1
  76. package/dist/match-dialog.js.map +1 -1
  77. package/dist/meter.js +1 -1
  78. package/dist/meter.js.map +1 -1
  79. package/dist/motion.css +28 -41
  80. package/dist/native/map.js +94 -82
  81. package/dist/native/map.js.map +1 -1
  82. package/dist/native.d.ts +8 -1
  83. package/dist/native.js +53 -41
  84. package/dist/native.js.map +1 -1
  85. package/dist/nav-bar.d.ts +1 -1
  86. package/dist/nav-bar.js +9 -9
  87. package/dist/nav-bar.js.map +1 -1
  88. package/dist/page-hero.js +1 -1
  89. package/dist/page-index.d.ts +30 -0
  90. package/dist/page-index.js +23 -0
  91. package/dist/page-index.js.map +1 -0
  92. package/dist/page.d.ts +19 -7
  93. package/dist/page.js +1 -1
  94. package/dist/photo-grid.js +2 -2
  95. package/dist/photo-grid.js.map +1 -1
  96. package/dist/radio-group.js +1 -1
  97. package/dist/radio-group.js.map +1 -1
  98. package/dist/rail-nav.js +1 -1
  99. package/dist/rail-nav.js.map +1 -1
  100. package/dist/search-field.js +1 -1
  101. package/dist/service-card.js +2 -2
  102. package/dist/service-card.js.map +1 -1
  103. package/dist/site-footer.d.ts +1 -1
  104. package/dist/site-footer.js +3 -3
  105. package/dist/site-footer.js.map +1 -1
  106. package/dist/{sites-B4prB793.d.ts → sites-B4sYlfPQ.d.ts} +1 -1
  107. package/dist/sites.d.ts +1 -1
  108. package/dist/sites.js +4 -0
  109. package/dist/sites.js.map +1 -1
  110. package/dist/specimen-tag.d.ts +52 -0
  111. package/dist/specimen-tag.js +33 -0
  112. package/dist/specimen-tag.js.map +1 -0
  113. package/dist/stat.js +1 -1
  114. package/dist/stat.js.map +1 -1
  115. package/dist/sticky-action.d.ts +1 -1
  116. package/dist/sticky-action.js +1 -1
  117. package/dist/sticky-action.js.map +1 -1
  118. package/dist/swipe-deck.js +1 -1
  119. package/dist/swipe-deck.js.map +1 -1
  120. package/package.json +78 -8
  121. package/registry/account-menu.json +1 -1
  122. package/registry/achievement.json +1 -1
  123. package/registry/action-bar.json +1 -1
  124. package/registry/activity-feed.json +2 -2
  125. package/registry/alert.json +1 -1
  126. package/registry/anatomy-plate.json +168 -0
  127. package/registry/app-header.json +2 -2
  128. package/registry/app-shell.json +2 -2
  129. package/registry/argument-card.json +1 -1
  130. package/registry/audio-player.json +1 -1
  131. package/registry/auth-layout.json +1 -1
  132. package/registry/avatar.json +1 -1
  133. package/registry/badge.json +1 -1
  134. package/registry/bird-plate.json +221 -0
  135. package/registry/button.json +1 -1
  136. package/registry/captcha.json +1 -1
  137. package/registry/card-grid.json +1 -1
  138. package/registry/card.json +1 -1
  139. package/registry/catalogue-page.json +1 -1
  140. package/registry/changelog-page.json +1 -1
  141. package/registry/chat.json +3 -3
  142. package/registry/checkbox.json +2 -2
  143. package/registry/chip-link.json +1 -1
  144. package/registry/chip-row.json +2 -2
  145. package/registry/chip.json +1 -1
  146. package/registry/choice-grid.json +1 -1
  147. package/registry/code-block.json +1 -1
  148. package/registry/combobox.json +1 -1
  149. package/registry/command.json +2 -2
  150. package/registry/comparison-table.json +2 -2
  151. package/registry/component-page.json +1 -1
  152. package/registry/confirm-button.json +1 -1
  153. package/registry/contact-page.json +1 -1
  154. package/registry/continue-prompt.json +1 -1
  155. package/registry/countdown.json +2 -2
  156. package/registry/cover-hero.json +2 -2
  157. package/registry/cta-panel.json +1 -1
  158. package/registry/dashboard-layout.json +2 -2
  159. package/registry/data-table.json +1 -1
  160. package/registry/date-picker.json +4 -4
  161. package/registry/decision-list.json +1 -1
  162. package/registry/description-list.json +2 -2
  163. package/registry/detail-layout.json +2 -2
  164. package/registry/dialog.json +2 -2
  165. package/registry/docs-article-page.json +1 -1
  166. package/registry/docs-hub-page.json +1 -1
  167. package/registry/docs-layout.json +1 -1
  168. package/registry/docs-nav.json +2 -2
  169. package/registry/document-viewer.json +1 -1
  170. package/registry/dropdown-menu.json +2 -2
  171. package/registry/empty-state.json +1 -1
  172. package/registry/engine-flow.json +1 -1
  173. package/registry/error-page.json +1 -1
  174. package/registry/examples/action-sheet/native/video-actions.dark.png +0 -0
  175. package/registry/examples/action-sheet/native/video-actions.light.png +0 -0
  176. package/registry/examples/activity-feed/native/notifications.dark.png +0 -0
  177. package/registry/examples/activity-feed/native/notifications.light.png +0 -0
  178. package/registry/examples/anatomy-plate/button.d.ts +4 -0
  179. package/registry/examples/anatomy-plate/button.js +25 -0
  180. package/registry/examples/anatomy-plate/button.tsx +20 -0
  181. package/registry/examples/avatar/native/group.dark.png +0 -0
  182. package/registry/examples/avatar/native/group.light.png +0 -0
  183. package/registry/examples/avatar/native/presence.dark.png +0 -0
  184. package/registry/examples/avatar/native/presence.light.png +0 -0
  185. package/registry/examples/avatar/native/sizes.dark.png +0 -0
  186. package/registry/examples/avatar/native/sizes.light.png +0 -0
  187. package/registry/examples/badge/native/dot.dark.png +0 -0
  188. package/registry/examples/badge/native/dot.light.png +0 -0
  189. package/registry/examples/badge/native/scrim.dark.png +0 -0
  190. package/registry/examples/badge/native/scrim.light.png +0 -0
  191. package/registry/examples/badge/native/tones.dark.png +0 -0
  192. package/registry/examples/badge/native/tones.light.png +0 -0
  193. package/registry/examples/bird-plate/flock.d.ts +4 -0
  194. package/registry/examples/bird-plate/flock.js +24 -0
  195. package/registry/examples/bird-plate/flock.tsx +18 -0
  196. package/registry/examples/bird-plate/single.d.ts +4 -0
  197. package/registry/examples/bird-plate/single.js +19 -0
  198. package/registry/examples/bird-plate/single.tsx +13 -0
  199. package/registry/examples/button/native/danger.dark.png +0 -0
  200. package/registry/examples/button/native/danger.light.png +0 -0
  201. package/registry/examples/button/native/disabled.dark.png +0 -0
  202. package/registry/examples/button/native/disabled.light.png +0 -0
  203. package/registry/examples/button/native/ghost.dark.png +0 -0
  204. package/registry/examples/button/native/ghost.light.png +0 -0
  205. package/registry/examples/button/native/gradient.dark.png +0 -0
  206. package/registry/examples/button/native/gradient.light.png +0 -0
  207. package/registry/examples/button/native/icon-only.dark.png +0 -0
  208. package/registry/examples/button/native/icon-only.light.png +0 -0
  209. package/registry/examples/button/native/icon.dark.png +0 -0
  210. package/registry/examples/button/native/icon.light.png +0 -0
  211. package/registry/examples/button/native/loading.dark.png +0 -0
  212. package/registry/examples/button/native/loading.light.png +0 -0
  213. package/registry/examples/button/native/outline.dark.png +0 -0
  214. package/registry/examples/button/native/outline.light.png +0 -0
  215. package/registry/examples/button/native/primary.dark.png +0 -0
  216. package/registry/examples/button/native/primary.light.png +0 -0
  217. package/registry/examples/button/native/secondary.dark.png +0 -0
  218. package/registry/examples/button/native/secondary.light.png +0 -0
  219. package/registry/examples/button/native/sizes.dark.png +0 -0
  220. package/registry/examples/button/native/sizes.light.png +0 -0
  221. package/registry/examples/card/native/body.dark.png +0 -0
  222. package/registry/examples/card/native/body.light.png +0 -0
  223. package/registry/examples/card/native/default.dark.png +0 -0
  224. package/registry/examples/card/native/default.light.png +0 -0
  225. package/registry/examples/card/native/elevated.dark.png +0 -0
  226. package/registry/examples/card/native/elevated.light.png +0 -0
  227. package/registry/examples/card/native/pressable.dark.png +0 -0
  228. package/registry/examples/card/native/pressable.light.png +0 -0
  229. package/registry/examples/chat/native/assistant.dark.png +0 -0
  230. package/registry/examples/chat/native/assistant.light.png +0 -0
  231. package/registry/examples/chat/native/conversation.dark.png +0 -0
  232. package/registry/examples/chat/native/conversation.light.png +0 -0
  233. package/registry/examples/chat/native/inbox.dark.png +0 -0
  234. package/registry/examples/chat/native/inbox.light.png +0 -0
  235. package/registry/examples/checkbox/native/terms.dark.png +0 -0
  236. package/registry/examples/checkbox/native/terms.light.png +0 -0
  237. package/registry/examples/chip/native/multiple.dark.png +0 -0
  238. package/registry/examples/chip/native/multiple.light.png +0 -0
  239. package/registry/examples/chip/native/removable.dark.png +0 -0
  240. package/registry/examples/chip/native/removable.light.png +0 -0
  241. package/registry/examples/chip/native/single.dark.png +0 -0
  242. package/registry/examples/chip/native/single.light.png +0 -0
  243. package/registry/examples/chip/native/toggle.dark.png +0 -0
  244. package/registry/examples/chip/native/toggle.light.png +0 -0
  245. package/registry/examples/combobox/native/multiple.dark.png +0 -0
  246. package/registry/examples/combobox/native/multiple.light.png +0 -0
  247. package/registry/examples/combobox/native/search.dark.png +0 -0
  248. package/registry/examples/combobox/native/search.light.png +0 -0
  249. package/registry/examples/countdown/native/days.dark.png +0 -0
  250. package/registry/examples/countdown/native/days.light.png +0 -0
  251. package/registry/examples/countdown/native/hours.dark.png +0 -0
  252. package/registry/examples/countdown/native/hours.light.png +0 -0
  253. package/registry/examples/countdown/native/sizes.dark.png +0 -0
  254. package/registry/examples/countdown/native/sizes.light.png +0 -0
  255. package/registry/examples/countdown/native/urgent.dark.png +0 -0
  256. package/registry/examples/countdown/native/urgent.light.png +0 -0
  257. package/registry/examples/countdown/native/with-label.dark.png +0 -0
  258. package/registry/examples/countdown/native/with-label.light.png +0 -0
  259. package/registry/examples/date-picker/native/birth-date-wheel.dark.png +0 -0
  260. package/registry/examples/date-picker/native/birth-date-wheel.light.png +0 -0
  261. package/registry/examples/date-picker/native/birth-date.dark.png +0 -0
  262. package/registry/examples/date-picker/native/birth-date.light.png +0 -0
  263. package/registry/examples/date-picker/native/calendar.dark.png +0 -0
  264. package/registry/examples/date-picker/native/calendar.light.png +0 -0
  265. package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
  266. package/registry/examples/date-picker/native/day-strip.light.png +0 -0
  267. package/registry/examples/date-picker/native/month-year.dark.png +0 -0
  268. package/registry/examples/date-picker/native/month-year.light.png +0 -0
  269. package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
  270. package/registry/examples/date-picker/native/time-slots.light.png +0 -0
  271. package/registry/examples/date-picker/native/time-wheel.dark.png +0 -0
  272. package/registry/examples/date-picker/native/time-wheel.light.png +0 -0
  273. package/registry/examples/description-list/native/job-details.dark.png +0 -0
  274. package/registry/examples/description-list/native/job-details.light.png +0 -0
  275. package/registry/examples/dialog/native/sheet.dark.png +0 -0
  276. package/registry/examples/dialog/native/sheet.light.png +0 -0
  277. package/registry/examples/empty-state/native/default.dark.png +0 -0
  278. package/registry/examples/empty-state/native/default.light.png +0 -0
  279. package/registry/examples/fab/native/extended.dark.png +0 -0
  280. package/registry/examples/fab/native/extended.light.png +0 -0
  281. package/registry/examples/field/native/default.dark.png +0 -0
  282. package/registry/examples/field/native/default.light.png +0 -0
  283. package/registry/examples/field/native/select.dark.png +0 -0
  284. package/registry/examples/field/native/select.light.png +0 -0
  285. package/registry/examples/footnote/notes.d.ts +4 -0
  286. package/registry/examples/footnote/notes.js +24 -0
  287. package/registry/examples/footnote/notes.tsx +19 -0
  288. package/registry/examples/force-update-screen/native/default.dark.png +0 -0
  289. package/registry/examples/force-update-screen/native/default.light.png +0 -0
  290. package/registry/examples/form/native/amount.dark.png +0 -0
  291. package/registry/examples/form/native/amount.light.png +0 -0
  292. package/registry/examples/form/native/audience.dark.png +0 -0
  293. package/registry/examples/form/native/audience.light.png +0 -0
  294. package/registry/examples/form/native/profile.dark.png +0 -0
  295. package/registry/examples/form/native/profile.light.png +0 -0
  296. package/registry/examples/form/native/settings.dark.png +0 -0
  297. package/registry/examples/form/native/settings.light.png +0 -0
  298. package/registry/examples/form/native/sign-up.dark.png +0 -0
  299. package/registry/examples/form/native/sign-up.light.png +0 -0
  300. package/registry/examples/form/native/upload.dark.png +0 -0
  301. package/registry/examples/form/native/upload.light.png +0 -0
  302. package/registry/examples/goal-gauge/native/default.dark.png +0 -0
  303. package/registry/examples/goal-gauge/native/default.light.png +0 -0
  304. package/registry/examples/header/native/large-title.dark.png +0 -0
  305. package/registry/examples/header/native/large-title.light.png +0 -0
  306. package/registry/examples/image-viewer/native/gallery.dark.png +0 -0
  307. package/registry/examples/image-viewer/native/gallery.light.png +0 -0
  308. package/registry/examples/list/native/default.dark.png +0 -0
  309. package/registry/examples/list/native/default.light.png +0 -0
  310. package/registry/examples/list/native/infinite.dark.png +0 -0
  311. package/registry/examples/list/native/infinite.light.png +0 -0
  312. package/registry/examples/list/native/states.dark.png +0 -0
  313. package/registry/examples/list/native/states.light.png +0 -0
  314. package/registry/examples/loader/native/block.dark.png +0 -0
  315. package/registry/examples/loader/native/block.light.png +0 -0
  316. package/registry/examples/loader/native/branded.dark.png +0 -0
  317. package/registry/examples/loader/native/branded.light.png +0 -0
  318. package/registry/examples/loader/native/job-wait.dark.png +0 -0
  319. package/registry/examples/loader/native/job-wait.light.png +0 -0
  320. package/registry/examples/maintenance-screen/native/default.dark.png +0 -0
  321. package/registry/examples/maintenance-screen/native/default.light.png +0 -0
  322. package/registry/examples/map/native/location-picker.dark.png +0 -0
  323. package/registry/examples/map/native/location-picker.light.png +0 -0
  324. package/registry/examples/map/native/places.dark.png +0 -0
  325. package/registry/examples/map/native/places.light.png +0 -0
  326. package/registry/examples/markdown/native/ai-stream.dark.png +0 -0
  327. package/registry/examples/markdown/native/ai-stream.light.png +0 -0
  328. package/registry/examples/markdown/native/basic.dark.png +0 -0
  329. package/registry/examples/markdown/native/basic.light.png +0 -0
  330. package/registry/examples/mascot-state/native/default.dark.png +0 -0
  331. package/registry/examples/mascot-state/native/default.light.png +0 -0
  332. package/registry/examples/mascots/native/crane.dark.png +0 -0
  333. package/registry/examples/mascots/native/crane.light.png +0 -0
  334. package/registry/examples/mascots/native/default.dark.png +0 -0
  335. package/registry/examples/mascots/native/default.light.png +0 -0
  336. package/registry/examples/mascots/native/lovebird.dark.png +0 -0
  337. package/registry/examples/mascots/native/lovebird.light.png +0 -0
  338. package/registry/examples/mascots/native/phoenix.dark.png +0 -0
  339. package/registry/examples/mascots/native/phoenix.light.png +0 -0
  340. package/registry/examples/match-dialog/native/its-a-match.dark.png +0 -0
  341. package/registry/examples/match-dialog/native/its-a-match.light.png +0 -0
  342. package/registry/examples/media-capture/native/photo.dark.png +0 -0
  343. package/registry/examples/media-capture/native/photo.light.png +0 -0
  344. package/registry/examples/media-picker/native/story.dark.png +0 -0
  345. package/registry/examples/media-picker/native/story.light.png +0 -0
  346. package/registry/examples/meta-row/native/video.dark.png +0 -0
  347. package/registry/examples/meta-row/native/video.light.png +0 -0
  348. package/registry/examples/meter/native/credits.dark.png +0 -0
  349. package/registry/examples/meter/native/credits.light.png +0 -0
  350. package/registry/examples/meter/native/split-ring.dark.png +0 -0
  351. package/registry/examples/meter/native/split-ring.light.png +0 -0
  352. package/registry/examples/number-ticker/native/balance.dark.png +0 -0
  353. package/registry/examples/number-ticker/native/balance.light.png +0 -0
  354. package/registry/examples/onboarding/native/first-launch.dark.png +0 -0
  355. package/registry/examples/onboarding/native/first-launch.light.png +0 -0
  356. package/registry/examples/otp-input/native/invalid.dark.png +0 -0
  357. package/registry/examples/otp-input/native/invalid.light.png +0 -0
  358. package/registry/examples/otp-input/native/verify.dark.png +0 -0
  359. package/registry/examples/otp-input/native/verify.light.png +0 -0
  360. package/registry/examples/page-index/docs.d.ts +4 -0
  361. package/registry/examples/page-index/docs.js +33 -0
  362. package/registry/examples/page-index/docs.tsx +27 -0
  363. package/registry/examples/pagination/native/cursor.dark.png +0 -0
  364. package/registry/examples/pagination/native/cursor.light.png +0 -0
  365. package/registry/examples/pagination/native/pages.dark.png +0 -0
  366. package/registry/examples/pagination/native/pages.light.png +0 -0
  367. package/registry/examples/permission-prompt/native/blocked.dark.png +0 -0
  368. package/registry/examples/permission-prompt/native/blocked.light.png +0 -0
  369. package/registry/examples/permission-prompt/native/camera.dark.png +0 -0
  370. package/registry/examples/permission-prompt/native/camera.light.png +0 -0
  371. package/registry/examples/photo-grid/native/profile-photos.dark.png +0 -0
  372. package/registry/examples/photo-grid/native/profile-photos.light.png +0 -0
  373. package/registry/examples/profile-card/native/default.dark.png +0 -0
  374. package/registry/examples/profile-card/native/default.light.png +0 -0
  375. package/registry/examples/progress/native/bar.dark.png +0 -0
  376. package/registry/examples/progress/native/bar.light.png +0 -0
  377. package/registry/examples/progress/native/indeterminate.dark.png +0 -0
  378. package/registry/examples/progress/native/indeterminate.light.png +0 -0
  379. package/registry/examples/progress/native/ring.dark.png +0 -0
  380. package/registry/examples/progress/native/ring.light.png +0 -0
  381. package/registry/examples/pull-to-refresh/native/branded.dark.png +0 -0
  382. package/registry/examples/pull-to-refresh/native/branded.light.png +0 -0
  383. package/registry/examples/pull-to-refresh/native/feed.dark.png +0 -0
  384. package/registry/examples/pull-to-refresh/native/feed.light.png +0 -0
  385. package/registry/examples/radio-group/native/buttons.dark.png +0 -0
  386. package/registry/examples/radio-group/native/buttons.light.png +0 -0
  387. package/registry/examples/radio-group/native/cards.dark.png +0 -0
  388. package/registry/examples/radio-group/native/cards.light.png +0 -0
  389. package/registry/examples/radio-group/native/list.dark.png +0 -0
  390. package/registry/examples/radio-group/native/list.light.png +0 -0
  391. package/registry/examples/radio-group/native/segmented.dark.png +0 -0
  392. package/registry/examples/radio-group/native/segmented.light.png +0 -0
  393. package/registry/examples/screen/native/app-shell.dark.png +0 -0
  394. package/registry/examples/screen/native/app-shell.light.png +0 -0
  395. package/registry/examples/screen/native/auth.dark.png +0 -0
  396. package/registry/examples/screen/native/auth.light.png +0 -0
  397. package/registry/examples/screen/native/chat.dark.png +0 -0
  398. package/registry/examples/screen/native/chat.light.png +0 -0
  399. package/registry/examples/screen/native/feed.dark.png +0 -0
  400. package/registry/examples/screen/native/feed.light.png +0 -0
  401. package/registry/examples/screen/native/map.dark.png +0 -0
  402. package/registry/examples/screen/native/map.light.png +0 -0
  403. package/registry/examples/screen/native/notifications.dark.png +0 -0
  404. package/registry/examples/screen/native/notifications.light.png +0 -0
  405. package/registry/examples/screen/native/profile.dark.png +0 -0
  406. package/registry/examples/screen/native/profile.light.png +0 -0
  407. package/registry/examples/screen/native/settings.dark.png +0 -0
  408. package/registry/examples/screen/native/settings.light.png +0 -0
  409. package/registry/examples/search-field/native/cancel.dark.png +0 -0
  410. package/registry/examples/search-field/native/cancel.light.png +0 -0
  411. package/registry/examples/search-field/native/default.dark.png +0 -0
  412. package/registry/examples/search-field/native/default.light.png +0 -0
  413. package/registry/examples/segmented/native/default.dark.png +0 -0
  414. package/registry/examples/segmented/native/default.light.png +0 -0
  415. package/registry/examples/segmented/native/small.dark.png +0 -0
  416. package/registry/examples/segmented/native/small.light.png +0 -0
  417. package/registry/examples/settings-layout/native/account.dark.png +0 -0
  418. package/registry/examples/settings-layout/native/account.light.png +0 -0
  419. package/registry/examples/showcase/native/slides.dark.png +0 -0
  420. package/registry/examples/showcase/native/slides.light.png +0 -0
  421. package/registry/examples/skeleton/native/shapes.dark.png +0 -0
  422. package/registry/examples/skeleton/native/shapes.light.png +0 -0
  423. package/registry/examples/slider/native/default.dark.png +0 -0
  424. package/registry/examples/slider/native/default.light.png +0 -0
  425. package/registry/examples/slider/native/range.dark.png +0 -0
  426. package/registry/examples/slider/native/range.light.png +0 -0
  427. package/registry/examples/slider/native/stepped.dark.png +0 -0
  428. package/registry/examples/slider/native/stepped.light.png +0 -0
  429. package/registry/examples/slider/native/vertical.dark.png +0 -0
  430. package/registry/examples/slider/native/vertical.light.png +0 -0
  431. package/registry/examples/specimen-tag/product.d.ts +4 -0
  432. package/registry/examples/specimen-tag/product.js +28 -0
  433. package/registry/examples/specimen-tag/product.tsx +25 -0
  434. package/registry/examples/specimen-tag/stamps.d.ts +4 -0
  435. package/registry/examples/specimen-tag/stamps.js +16 -0
  436. package/registry/examples/specimen-tag/stamps.tsx +13 -0
  437. package/registry/examples/specimen-tag/wire.d.ts +4 -0
  438. package/registry/examples/specimen-tag/wire.js +16 -0
  439. package/registry/examples/specimen-tag/wire.tsx +20 -0
  440. package/registry/examples/spinner/native/sizes.dark.png +0 -0
  441. package/registry/examples/spinner/native/sizes.light.png +0 -0
  442. package/registry/examples/splash-handoff/native/default.dark.png +0 -0
  443. package/registry/examples/splash-handoff/native/default.light.png +0 -0
  444. package/registry/examples/step-progress/native/sign-up.dark.png +0 -0
  445. package/registry/examples/step-progress/native/sign-up.light.png +0 -0
  446. package/registry/examples/stepper/native/run.dark.png +0 -0
  447. package/registry/examples/stepper/native/run.light.png +0 -0
  448. package/registry/examples/swipe-deck/native/discover.dark.png +0 -0
  449. package/registry/examples/swipe-deck/native/discover.light.png +0 -0
  450. package/registry/examples/swipeable-row/native/conversation.dark.png +0 -0
  451. package/registry/examples/swipeable-row/native/conversation.light.png +0 -0
  452. package/registry/examples/switch/native/default.dark.png +0 -0
  453. package/registry/examples/switch/native/default.light.png +0 -0
  454. package/registry/examples/switch/native/settings.dark.png +0 -0
  455. package/registry/examples/switch/native/settings.light.png +0 -0
  456. package/registry/examples/tab-bar/native/main-sections.dark.png +0 -0
  457. package/registry/examples/tab-bar/native/main-sections.light.png +0 -0
  458. package/registry/examples/tabs/native/sections.dark.png +0 -0
  459. package/registry/examples/tabs/native/sections.light.png +0 -0
  460. package/registry/examples/tabs/native/segmented.dark.png +0 -0
  461. package/registry/examples/tabs/native/segmented.light.png +0 -0
  462. package/registry/examples/tag-selector/native/interests.dark.png +0 -0
  463. package/registry/examples/tag-selector/native/interests.light.png +0 -0
  464. package/registry/examples/toast/native/notification.dark.png +0 -0
  465. package/registry/examples/toast/native/notification.light.png +0 -0
  466. package/registry/examples/toast/native/snackbar.dark.png +0 -0
  467. package/registry/examples/toast/native/snackbar.light.png +0 -0
  468. package/registry/examples/toast/native/tones.dark.png +0 -0
  469. package/registry/examples/toast/native/tones.light.png +0 -0
  470. package/registry/examples/txt/native/tones.dark.png +0 -0
  471. package/registry/examples/txt/native/tones.light.png +0 -0
  472. package/registry/examples/txt/native/variants.dark.png +0 -0
  473. package/registry/examples/txt/native/variants.light.png +0 -0
  474. package/registry/examples/update-prompt/native/default.dark.png +0 -0
  475. package/registry/examples/update-prompt/native/default.light.png +0 -0
  476. package/registry/examples/verified-badge/native/verified.dark.png +0 -0
  477. package/registry/examples/verified-badge/native/verified.light.png +0 -0
  478. package/registry/examples/vertical-video/native/rail.dark.png +0 -0
  479. package/registry/examples/vertical-video/native/rail.light.png +0 -0
  480. package/registry/examples/video-player/native/default.dark.png +0 -0
  481. package/registry/examples/video-player/native/default.light.png +0 -0
  482. package/registry/examples/waveform/native/card.dark.png +0 -0
  483. package/registry/examples/waveform/native/card.light.png +0 -0
  484. package/registry/field.json +1 -1
  485. package/registry/file-upload.json +1 -1
  486. package/registry/filter-bar.json +1 -1
  487. package/registry/footnote.json +220 -0
  488. package/registry/force-update-screen.json +1 -1
  489. package/registry/form.json +3 -3
  490. package/registry/gallery-page.json +1 -1
  491. package/registry/genui.json +1 -1
  492. package/registry/glow-card.json +1 -1
  493. package/registry/goal-gauge.json +1 -1
  494. package/registry/how-it-works-page.json +1 -1
  495. package/registry/image-cropper.json +1 -1
  496. package/registry/index.json +160 -5
  497. package/registry/iso.json +1 -1
  498. package/registry/kanban.json +1 -1
  499. package/registry/kbd.json +1 -1
  500. package/registry/landing-page.json +1 -1
  501. package/registry/landscape.json +1 -1
  502. package/registry/language-switch.json +2 -2
  503. package/registry/legal-page.json +1 -1
  504. package/registry/link-card.json +1 -1
  505. package/registry/list.json +1 -1
  506. package/registry/loader.json +2 -2
  507. package/registry/longform-page.json +1 -1
  508. package/registry/maintenance-screen.json +1 -1
  509. package/registry/map.json +3 -3
  510. package/registry/markdown.json +1 -1
  511. package/registry/marketing-layout.json +1 -1
  512. package/registry/marquee.json +1 -1
  513. package/registry/mascot-quote.json +1 -1
  514. package/registry/mascot-state.json +1 -1
  515. package/registry/mascots.json +1 -1
  516. package/registry/match-dialog.json +1 -1
  517. package/registry/media-capture.json +1 -1
  518. package/registry/media-gallery.json +1 -1
  519. package/registry/media-grid.json +1 -1
  520. package/registry/meta-row.json +1 -1
  521. package/registry/meter.json +2 -2
  522. package/registry/nav-bar.json +3 -3
  523. package/registry/number-ticker.json +1 -1
  524. package/registry/opening-hours.json +1 -1
  525. package/registry/page-header.json +1 -1
  526. package/registry/page-hero.json +1 -1
  527. package/registry/page-index.json +168 -0
  528. package/registry/page.json +89 -5
  529. package/registry/pagination.json +1 -1
  530. package/registry/photo-grid.json +2 -2
  531. package/registry/pointer-light.json +1 -1
  532. package/registry/popover.json +1 -1
  533. package/registry/pricing-page.json +1 -1
  534. package/registry/product-page.json +1 -1
  535. package/registry/profile-card.json +1 -1
  536. package/registry/progress.json +1 -1
  537. package/registry/promise-card.json +1 -1
  538. package/registry/radio-group.json +2 -2
  539. package/registry/rail-nav.json +3 -3
  540. package/registry/recipes.json +1 -1
  541. package/registry/scroll-stage.json +1 -1
  542. package/registry/search-field.json +2 -2
  543. package/registry/section-backdrop.json +1 -1
  544. package/registry/separator.json +1 -1
  545. package/registry/service-card.json +2 -2
  546. package/registry/settings-layout.json +1 -1
  547. package/registry/showcase.json +1 -1
  548. package/registry/site-footer.json +3 -3
  549. package/registry/sites.json +2 -2
  550. package/registry/skeleton.json +1 -1
  551. package/registry/skip-link.json +1 -1
  552. package/registry/slider.json +1 -1
  553. package/registry/slot-picker.json +1 -1
  554. package/registry/slot.json +1 -1
  555. package/registry/specimen-tag.json +269 -0
  556. package/registry/spinner.json +1 -1
  557. package/registry/split-view.json +1 -1
  558. package/registry/stage-banner.json +1 -1
  559. package/registry/stat.json +2 -2
  560. package/registry/status-page.json +1 -1
  561. package/registry/step-progress.json +1 -1
  562. package/registry/step-showcase.json +1 -1
  563. package/registry/stepper.json +1 -1
  564. package/registry/sticky-action.json +2 -2
  565. package/registry/swipe-deck.json +2 -2
  566. package/registry/switch.json +1 -1
  567. package/registry/tabs.json +1 -1
  568. package/registry/tag-input.json +1 -1
  569. package/registry/tag-selector.json +1 -1
  570. package/registry/terminal-replay.json +1 -1
  571. package/registry/theme.json +1 -1
  572. package/registry/toast.json +1 -1
  573. package/registry/toc.json +1 -1
  574. package/registry/tooltip.json +1 -1
  575. package/registry/tree-view.json +1 -1
  576. package/registry/update-prompt.json +1 -1
  577. package/registry/verified-badge.json +1 -1
  578. package/registry/vertical-video.json +1 -1
  579. package/registry/video-player.json +1 -1
  580. package/registry/video-trimmer.json +1 -1
  581. package/registry/virtual.json +1 -1
  582. package/registry/waveform.json +1 -1
  583. package/dist/chunk-2AJ4NJUF.js.map +0 -1
  584. package/dist/chunk-2PNLHZLT.js.map +0 -1
  585. package/dist/chunk-3S4GHSPZ.js.map +0 -1
  586. package/dist/chunk-LZNZLCOE.js.map +0 -1
  587. package/dist/chunk-NJFCSVPT.js.map +0 -1
  588. package/dist/chunk-REPTKUJ6.js.map +0 -1
  589. /package/dist/{chunk-KIBICUZK.js.map → chunk-K2ZYB4HP.js.map} +0 -0
package/dist/blocks.css CHANGED
@@ -23,6 +23,50 @@
23
23
  /* A frame inside a frame (a Section in a TocLayout, a Page in a card) adds no second pair of gutters. */
24
24
  .kz-frame .kz-frame { --kz-gutter: 0px; }
25
25
 
26
+ /* ─── Paper (Cahier, ADR-004): the notebook under a page or a section ───
27
+ `data-paper="ruled"` — the French Seyès ruling: a strong line every 32 px (--kz-paper-module), three fine lines between
28
+ (--kz-paper-line) and the verticals; `data-paper="lines"` — the lines only, for a page to read. `data-margin` — the red
29
+ margin line on the left, where `.kz-heading-number` (§ 2) and `.kz-margin-note` hang on a wide screen. The ruling is
30
+ drawn by the element (backgrounds), never by an image: dark (slate) and light (paper) alike. */
31
+ [data-paper="ruled"] {
32
+ background-image:
33
+ linear-gradient(to bottom, var(--kz-paper-rule-major) 1px, transparent 1px),
34
+ linear-gradient(to bottom, var(--kz-paper-rule-minor) 1px, transparent 1px),
35
+ linear-gradient(to right, var(--kz-paper-rule-minor) 1px, transparent 1px);
36
+ background-size: 100% var(--kz-paper-module, 32px), 100% var(--kz-paper-line, 8px), var(--kz-paper-module, 32px) 100%;
37
+ }
38
+ [data-paper="lines"] {
39
+ background-image:
40
+ linear-gradient(to bottom, var(--kz-paper-rule-major) 1px, transparent 1px),
41
+ linear-gradient(to bottom, var(--kz-paper-rule-minor) 1px, transparent 1px);
42
+ background-size: 100% var(--kz-paper-module, 32px), 100% var(--kz-paper-line, 8px);
43
+ }
44
+ [data-margin] { position: relative; --kz-margin-x: max(8px, calc(var(--kz-gutter, 16px) - 12px)); }
45
+ [data-margin]::before {
46
+ content: "";
47
+ position: absolute;
48
+ inset-block: 0;
49
+ left: var(--kz-margin-x);
50
+ width: 1.5px;
51
+ background: var(--kz-paper-rule-margin);
52
+ opacity: 0.8;
53
+ pointer-events: none;
54
+ }
55
+ .kz-frame[data-margin] { --kz-margin-x: max(8px, calc(var(--kz-gutter) - 12px)); }
56
+ .kz-heading-number,
57
+ .kz-margin-note {
58
+ font-family: var(--kz-font-mono);
59
+ font-size: 13px;
60
+ line-height: 16px;
61
+ color: var(--kz-paper-rule-margin);
62
+ }
63
+ .kz-margin-note { color: var(--kz-text-secondary); }
64
+ @media (min-width: 1180px) {
65
+ .kz-heading { position: relative; }
66
+ .kz-heading-number { position: absolute; right: calc(100% + 28px); top: 0.55em; white-space: nowrap; }
67
+ .kz-margin-note { position: absolute; right: calc(100% + 28px); width: 12ch; text-align: right; }
68
+ }
69
+
26
70
  /* Section: the content in the frame, a space above and below; `divider` draws the hairline between two sections (the
27
71
  transition), inside the gutters. */
28
72
  .kz-section { --kz-section-space: clamp(48px, 7vw, 88px); position: relative; }
@@ -34,17 +78,20 @@
34
78
  }
35
79
  .kz-section :is(h2, h3)[id] { scroll-margin-top: var(--kz-anchor-offset, 96px); }
36
80
 
81
+ /* Cahier (ADR-004, #417): the eyebrow is a note in the margin's voice — the typewriter face, lower case, untracked,
82
+ inked in the margin red. No more uppercase tracked overline above every heading. */
37
83
  .kz-eyebrow {
38
84
  margin: 0;
39
85
  display: inline-flex;
40
- align-items: center;
41
- gap: 10px;
86
+ align-items: baseline;
87
+ gap: 8px;
42
88
  font-family: var(--kz-font-mono);
43
- font-size: 11px;
44
- font-weight: 600;
45
- letter-spacing: 0.18em;
46
- text-transform: uppercase;
47
- color: var(--kz-hue-text, var(--kz-accent-text));
89
+ font-size: 13px;
90
+ font-weight: 400;
91
+ line-height: 16px;
92
+ letter-spacing: 0;
93
+ text-transform: none;
94
+ color: var(--kz-paper-rule-margin, var(--kz-hue-text, var(--kz-accent-text)));
48
95
  }
49
96
  .kz-label {
50
97
  margin: 0;
@@ -52,10 +99,10 @@
52
99
  align-items: center;
53
100
  gap: 6px;
54
101
  font-family: var(--kz-font-mono);
55
- font-size: 10.5px;
56
- font-weight: 600;
57
- letter-spacing: 0.14em;
58
- text-transform: uppercase;
102
+ font-size: 12.5px;
103
+ font-weight: 400;
104
+ letter-spacing: 0;
105
+ text-transform: none;
59
106
  color: var(--kz-text-secondary);
60
107
  }
61
108
  .kz-heading { margin-bottom: clamp(24px, 3vw, 36px); display: grid; gap: 12px; }
@@ -68,8 +115,8 @@
68
115
  max-width: 24ch;
69
116
  font-family: var(--kz-font-display);
70
117
  font-size: clamp(1.6rem, 3.6vw, 2.3rem);
71
- font-weight: 800;
72
- letter-spacing: -0.028em;
118
+ font-weight: 400;
119
+ letter-spacing: -0.01em;
73
120
  line-height: 1.15;
74
121
  color: var(--kz-text-primary);
75
122
  text-wrap: balance;
@@ -156,8 +203,8 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
156
203
  margin: 10px 0 0;
157
204
  font-family: var(--kz-font-display);
158
205
  font-size: clamp(2rem, 5.4vw, 3.1rem);
159
- font-weight: 800;
160
- letter-spacing: -0.035em;
206
+ font-weight: 400;
207
+ letter-spacing: -0.01em;
161
208
  line-height: 1.08;
162
209
  color: var(--kz-text-primary);
163
210
  text-wrap: balance;
@@ -182,7 +229,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
182
229
  .kz-foundation-base { position: relative; display: grid; min-width: 0; }
183
230
  .kz-foundation-base::after { content: ""; position: absolute; left: 50%; top: 100%; width: 1px; height: 28px; background: var(--kz-rail); }
184
231
  .kz-foundation-group { position: relative; margin-top: 28px; padding: 22px 14px 14px; border: 1px solid var(--kz-rail); border-radius: 24px; }
185
- .kz-foundation-label { position: absolute; top: -9px; left: 22px; padding: 0 8px; font: 500 11px/18px var(--kz-font-mono, ui-monospace, monospace); letter-spacing: 0.06em; text-transform: uppercase; color: var(--kz-hue-text, var(--kz-accent-text)); background: var(--kz-surface-0); }
232
+ .kz-foundation-label { position: absolute; top: -9px; left: 22px; padding: 0 8px; font: 500 11px/18px var(--kz-font-mono, ui-monospace, monospace); letter-spacing: 0; text-transform: none; color: var(--kz-hue-text, var(--kz-accent-text)); background: var(--kz-surface-0); }
186
233
  .kz-foundation[data-position="end"] .kz-foundation-base { order: 2; }
187
234
  .kz-foundation[data-position="end"] .kz-foundation-group { order: 1; margin-top: 0; margin-bottom: 28px; }
188
235
  .kz-foundation[data-position="end"] .kz-foundation-base::after { top: auto; bottom: 100%; }
@@ -256,8 +303,8 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
256
303
  keeps its status and its link on one line. `data-footer="top"` keeps them under the text. */
257
304
  .kz-link-card-foot { display: grid; gap: 5px; margin-top: auto; }
258
305
  .kz-link-card[data-footer="top"] .kz-link-card-foot { margin-top: 0; }
259
- .kz-link-card-meta { margin: 0; font-family: var(--kz-font-mono); font-size: 11px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--kz-hue-text, var(--kz-accent-text)); }
260
- .kz-link-card-title { margin: 0; font-family: var(--kz-font-display); font-size: 16.5px; font-weight: 750; letter-spacing: -0.012em; line-height: 1.3; color: var(--kz-text-primary); }
306
+ .kz-link-card-meta { margin: 0; font-family: var(--kz-font-mono); font-size: 11px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--kz-hue-text, var(--kz-accent-text)); }
307
+ .kz-link-card-title { margin: 0; font-family: var(--kz-font-display); font-size: 16.5px; font-weight: 750; letter-spacing: -0.01em; line-height: 1.3; color: var(--kz-text-primary); }
261
308
  .kz-link-card-text { margin: 0; font-size: 14px; line-height: 1.55; color: var(--kz-text-secondary); }
262
309
  .kz-link-card-extra { margin-top: 6px; }
263
310
  .kz-link-card-cta {
@@ -280,7 +327,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
280
327
  .kz-arg .kz-block-icon { width: 40px; height: 40px; }
281
328
  .kz-arg-head { display: flex; align-items: center; gap: 12px; min-width: 0; }
282
329
  .kz-arg-id { min-width: 0; }
283
- .kz-arg-title { margin: 0; font-family: var(--kz-font-display); font-size: 17px; font-weight: 800; letter-spacing: -0.015em; line-height: 1.2; color: var(--kz-text-primary); }
330
+ .kz-arg-title { margin: 0; font-family: var(--kz-font-display); font-size: 17px; font-weight: 400; letter-spacing: -0.01em; line-height: 1.2; color: var(--kz-text-primary); }
284
331
  .kz-arg-meta { margin: 3px 0 0; font-family: var(--kz-font-mono); font-size: 12px; color: var(--kz-text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
285
332
  .kz-arg-mark { margin-left: auto; align-self: flex-start; margin-top: -6px; margin-right: -4px; flex-shrink: 0; --kz-accent: var(--kz-hue, var(--kz-accent)); }
286
333
  .kz-arg-line { margin: 0; font-size: 15px; font-weight: 500; line-height: 1.55; color: var(--kz-text-primary); text-wrap: pretty; }
@@ -352,7 +399,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
352
399
  top: 6px;
353
400
  font-family: var(--kz-font-display), Georgia, serif;
354
401
  font-size: 44px;
355
- font-weight: 800;
402
+ font-weight: 400;
356
403
  line-height: 1;
357
404
  color: var(--kz-hue, var(--kz-accent));
358
405
  }
@@ -377,15 +424,14 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
377
424
  font-family: var(--kz-font-mono);
378
425
  font-size: 10.5px;
379
426
  font-weight: 700;
380
- letter-spacing: 0.14em;
381
- text-transform: uppercase;
427
+ letter-spacing: 0; text-transform: none;
382
428
  color: var(--kz-hue-text, var(--kz-accent-text));
383
429
  }
384
430
  .kz-quote-bird { flex-shrink: 0; --kz-accent: var(--kz-hue, var(--kz-accent)); }
385
431
  .kz-quote[data-variant="callout"] blockquote { padding: 24px 26px 24px 68px; border-radius: 22px 22px 22px 8px; }
386
432
  .kz-quote[data-variant="callout"] blockquote::before { left: 18px; top: 12px; font-size: 72px; }
387
433
  .kz-quote[data-variant="callout"] blockquote::after { left: 36px; bottom: -8px; width: 14px; height: 14px; }
388
- .kz-quote[data-variant="callout"] blockquote p { font-family: var(--kz-font-display); font-size: clamp(16px, 2vw, 19px); font-weight: 600; line-height: 1.55; letter-spacing: -0.005em; }
434
+ .kz-quote[data-variant="callout"] blockquote p { font-family: var(--kz-font-display); font-size: clamp(16px, 2vw, 19px); font-weight: 400; line-height: 1.55; letter-spacing: -0.01em; }
389
435
  .kz-quote[data-variant="callout"] figcaption { gap: 12px; padding-left: 14px; font-size: 11px; }
390
436
  @media (max-width: 480px) {
391
437
  .kz-quote[data-variant="callout"] blockquote { padding: 50px 20px 20px; }
@@ -400,7 +446,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
400
446
  /* ─── DecisionList: one card per decision — what was chosen, large; refused · because · what it costs, side by side ─── */
401
447
  .kz-decisions { margin: 0; padding: 0; list-style: none; display: grid; gap: 14px; }
402
448
  .kz-decision { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 18px; padding: 20px 22px; border-radius: 18px; background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
403
- .kz-decision-n { font-family: var(--kz-font-display); font-size: 28px; font-weight: 800; line-height: 1; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; color: var(--kz-hue-text, var(--kz-accent-text)); }
449
+ .kz-decision-n { font-family: var(--kz-font-display); font-size: 28px; font-weight: 400; line-height: 1; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; color: var(--kz-hue-text, var(--kz-accent-text)); }
404
450
  .kz-decision-body { display: grid; gap: 14px; min-width: 0; }
405
451
  .kz-decision-part p:not(.kz-label) { margin: 6px 0 0; font-size: 14px; line-height: 1.6; color: var(--kz-text-secondary); }
406
452
  .kz-decision-part[data-part="chose"] .kz-label { color: var(--kz-success-text); }
@@ -432,7 +478,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
432
478
  border-bottom: 1px solid var(--kz-border-subtle);
433
479
  }
434
480
  .kz-code-file { display: inline-flex; align-items: center; gap: 10px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
435
- .kz-code-lang { padding: 2px 7px; border-radius: 6px; font-size: 10px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--kz-text-primary); background: var(--kz-surface-3); }
481
+ .kz-code-lang { padding: 2px 7px; border-radius: 6px; font-size: 10px; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--kz-text-primary); background: var(--kz-surface-3); }
436
482
  .kz-code pre { margin: 0; padding: 16px 18px; overflow-x: auto; font-family: var(--kz-font-mono); font-size: 12.5px; line-height: 1.7; color: var(--kz-text-primary); tab-size: 2; }
437
483
  .kz-code pre:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); outline-offset: -2px; }
438
484
  /* The code's colours: TanStack Highlight's `th-*` classes on the tokens' text roles (each ≥ 4.5:1 on the code surface,
@@ -463,7 +509,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
463
509
  .kz-md { min-width: 0; color: var(--kz-text-primary); font-size: 15px; line-height: 1.7; overflow-wrap: anywhere; }
464
510
  .kz-md > * { margin-block: 0; }
465
511
  .kz-md > * + * { margin-top: 0.9em; }
466
- .kz-md h1, .kz-md h2, .kz-md h3, .kz-md h4, .kz-md h5, .kz-md h6 { font-family: var(--kz-font-display); font-weight: 800; line-height: 1.2; letter-spacing: -0.01em; }
512
+ .kz-md h1, .kz-md h2, .kz-md h3, .kz-md h4, .kz-md h5, .kz-md h6 { font-family: var(--kz-font-display); font-weight: 400; line-height: 1.2; letter-spacing: -0.01em; }
467
513
  .kz-md > * + :is(h1, h2, h3) { margin-top: 1.6em; }
468
514
  .kz-md h1 { font-size: 1.7em; } .kz-md h2 { font-size: 1.35em; } .kz-md h3 { font-size: 1.15em; } .kz-md h4, .kz-md h5, .kz-md h6 { font-size: 1em; }
469
515
  .kz-md a { color: var(--kz-accent-text); text-decoration: underline; text-underline-offset: 3px; }
@@ -553,7 +599,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
553
599
  border: 1px solid color-mix(in srgb, var(--kz-hue, var(--kz-accent)) 30%, var(--kz-border-default));
554
600
  }
555
601
  .kz-cta-text { min-width: 0; flex: 1 1 320px; }
556
- .kz-cta-title { margin: 0 0 6px; font-family: var(--kz-font-display); font-size: 21px; font-weight: 800; letter-spacing: -0.015em; color: var(--kz-text-primary); scroll-margin-top: var(--kz-anchor-offset, 96px); }
602
+ .kz-cta-title { margin: 0 0 6px; font-family: var(--kz-font-display); font-size: 21px; font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); scroll-margin-top: var(--kz-anchor-offset, 96px); }
557
603
  .kz-cta-body { margin: 0; max-width: 640px; font-size: 14.5px; line-height: 1.65; color: var(--kz-text-secondary); }
558
604
  .kz-cta-actions { display: flex; flex-wrap: wrap; gap: 10px; }
559
605
 
@@ -603,7 +649,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
603
649
  .kz-tpl-band { margin: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr)); border-block: 1px solid var(--kz-border-subtle); }
604
650
  .kz-tpl-band > div { padding: 20px 18px; border-left: 1px solid var(--kz-border-subtle); }
605
651
  .kz-tpl-band > div:first-child { border-left: 0; }
606
- .kz-tpl-band dt { font-family: var(--kz-font-display); font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 800; letter-spacing: -0.03em; color: var(--kz-text-primary); }
652
+ .kz-tpl-band dt { font-family: var(--kz-font-display); font-size: clamp(1.6rem, 3vw, 2.2rem); font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); }
607
653
  .kz-tpl-band dd { margin: 4px 0 0; font-size: 13px; color: var(--kz-text-secondary); }
608
654
  @media (max-width: 560px) { .kz-tpl-band > div { border-left: 0; border-top: 1px solid var(--kz-border-subtle); } .kz-tpl-band > div:first-child { border-top: 0; } }
609
655
 
@@ -613,7 +659,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
613
659
  background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
614
660
  .kz-tpl-bento > li[data-size="lg"] { grid-column: span 4; grid-row: span 2; background: color-mix(in srgb, var(--kz-hue, var(--kz-accent)) 7%, var(--kz-surface-1)); }
615
661
  .kz-tpl-bento > li[data-size="md"] { grid-column: span 3; }
616
- .kz-tpl-bento h3 { margin: 0; font-family: var(--kz-font-display); font-size: 17px; font-weight: 800; letter-spacing: -0.012em; color: var(--kz-text-primary); }
662
+ .kz-tpl-bento h3 { margin: 0; font-family: var(--kz-font-display); font-size: 17px; font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); }
617
663
  .kz-tpl-bento > li[data-size="lg"] h3 { font-size: clamp(1.3rem, 2.4vw, 1.75rem); }
618
664
  .kz-tpl-bento p { margin: 0; font-size: 14px; line-height: 1.6; color: var(--kz-text-secondary); }
619
665
  .kz-tpl-bento-visual { margin-top: auto; min-width: 0; }
@@ -625,9 +671,9 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
625
671
  background: linear-gradient(var(--kz-hue, var(--kz-accent)), color-mix(in srgb, var(--kz-hue, var(--kz-accent)) 10%, transparent)); }
626
672
  .kz-tpl-step { position: relative; display: grid; grid-template-columns: 44px minmax(0, 1fr) minmax(0, 1fr); gap: 20px 28px; align-items: start; }
627
673
  .kz-tpl-step-n { grid-column: 1; grid-row: 1; position: relative; z-index: 1; display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 14px;
628
- font-family: var(--kz-font-display); font-size: 16px; font-weight: 800; color: var(--kz-text-primary); background: var(--kz-surface-1);
674
+ font-family: var(--kz-font-display); font-size: 16px; font-weight: 400; color: var(--kz-text-primary); background: var(--kz-surface-1);
629
675
  border: 2px solid var(--kz-hue, var(--kz-accent)); box-shadow: 0 0 0 6px var(--kz-surface-0); }
630
- .kz-tpl-step :is(h2, h3) { margin: 6px 0 8px; font-family: var(--kz-font-display); font-size: clamp(1.15rem, 2.2vw, 1.4rem); font-weight: 800; color: var(--kz-text-primary); }
676
+ .kz-tpl-step :is(h2, h3) { margin: 6px 0 8px; font-family: var(--kz-font-display); font-size: clamp(1.15rem, 2.2vw, 1.4rem); font-weight: 400; color: var(--kz-text-primary); }
631
677
  .kz-tpl-step p { margin: 0; font-size: 15px; line-height: 1.7; color: var(--kz-text-secondary); }
632
678
  .kz-tpl-step-visual { min-width: 0; }
633
679
  .kz-tpl-step:nth-child(even) .kz-tpl-step-visual { order: -1; grid-column: 2; }
@@ -658,7 +704,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
658
704
  background: linear-gradient(160deg, color-mix(in srgb, var(--kz-accent) 14%, var(--kz-surface-1)), var(--kz-surface-1) 55%);
659
705
  border: 1px solid color-mix(in srgb, var(--kz-accent) 28%, var(--kz-border-default)); }
660
706
  .kz-tpl-collection-head { display: flex; align-items: center; gap: 10px; }
661
- .kz-tpl-collection-head a { font-family: var(--kz-font-display); font-size: 18px; font-weight: 800; color: var(--kz-text-primary); text-decoration: none; }
707
+ .kz-tpl-collection-head a { font-family: var(--kz-font-display); font-size: 18px; font-weight: 400; color: var(--kz-text-primary); text-decoration: none; }
662
708
  .kz-tpl-collection-head a::after { content: ""; position: absolute; inset: 0; z-index: -1; }
663
709
  .kz-tpl-collection-head a:focus-visible { outline: none; }
664
710
  .kz-tpl-collection:has(.kz-tpl-collection-head a:focus-visible) { outline: 2px solid var(--kz-ring, var(--kz-accent)); outline-offset: 2px; }
@@ -691,7 +737,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
691
737
  .kz-tpl-crumbs li + li::before { content: "/"; margin-right: 6px; color: var(--kz-border-strong); }
692
738
  .kz-tpl-crumbs a { color: inherit; text-decoration: none; }
693
739
  .kz-tpl-crumbs a:hover { color: var(--kz-text-primary); }
694
- .kz-tpl-article-title { margin: 0; font-family: var(--kz-font-display); font-size: clamp(1.9rem, 4vw, 2.6rem); font-weight: 800; letter-spacing: -0.03em; line-height: 1.1; color: var(--kz-text-primary); }
740
+ .kz-tpl-article-title { margin: 0; font-family: var(--kz-font-display); font-size: clamp(1.9rem, 4vw, 2.6rem); font-weight: 400; letter-spacing: -0.01em; line-height: 1.1; color: var(--kz-text-primary); }
695
741
  .kz-tpl-article-lead { margin: 12px 0 0; max-width: 46rem; font-size: 17px; line-height: 1.65; color: var(--kz-text-secondary); }
696
742
  .kz-tpl-article-meta { margin-top: 14px; }
697
743
  .kz-tpl-prose { max-width: 46rem; font-size: 16px; line-height: 1.75; color: var(--kz-text-secondary); }
@@ -702,7 +748,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
702
748
  .kz-tpl-pager a:hover { border-color: var(--kz-accent); }
703
749
  .kz-tpl-pager a:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); outline-offset: 2px; }
704
750
  .kz-tpl-pager a[rel="next"] { grid-column: 2; text-align: right; }
705
- .kz-tpl-pager small { font-family: var(--kz-font-mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--kz-text-secondary); }
751
+ .kz-tpl-pager small { font-family: var(--kz-font-mono); font-size: 11px; letter-spacing: 0; text-transform: none; color: var(--kz-text-secondary); }
706
752
 
707
753
  /* A catalogue: the filters in a sticky column (folded above the results on a phone). */
708
754
  .kz-tpl-catalogue { display: grid; grid-template-columns: 15rem minmax(0, 1fr); gap: 32px; align-items: start; }
@@ -730,14 +776,14 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
730
776
  /* A long read: chapters with their big numbers, pull quotes in the margin, figures that break out. */
731
777
  .kz-tpl-chapters { display: grid; gap: clamp(40px, 7vw, 88px); }
732
778
  .kz-tpl-chapter { display: grid; grid-template-columns: minmax(0, 9rem) minmax(0, 42rem) minmax(0, 1fr); gap: 24px 32px; }
733
- .kz-tpl-chapter-n { font-family: var(--kz-font-display); font-size: clamp(2.4rem, 6vw, 4.2rem); font-weight: 800; line-height: 0.9; letter-spacing: -0.04em;
779
+ .kz-tpl-chapter-n { font-family: var(--kz-font-display); font-size: clamp(2.4rem, 6vw, 4.2rem); font-weight: 400; line-height: 0.9; letter-spacing: -0.01em;
734
780
  color: transparent; -webkit-text-stroke: 1.5px var(--kz-hue, var(--kz-accent)); }
735
- .kz-tpl-chapter h2 { margin: 0 0 14px; font-family: var(--kz-font-display); font-size: clamp(1.5rem, 3vw, 2.1rem); font-weight: 800; letter-spacing: -0.025em; line-height: 1.15;
781
+ .kz-tpl-chapter h2 { margin: 0 0 14px; font-family: var(--kz-font-display); font-size: clamp(1.5rem, 3vw, 2.1rem); font-weight: 400; letter-spacing: -0.01em; line-height: 1.15;
736
782
  color: var(--kz-text-primary); scroll-margin-top: var(--kz-anchor-offset, 96px); }
737
783
  .kz-tpl-chapter-body { font-size: 17px; line-height: 1.8; color: var(--kz-text-secondary); }
738
784
  .kz-tpl-chapter-body p { margin: 0 0 1em; }
739
785
  .kz-tpl-chapter-aside { align-self: start; padding-top: 8px; }
740
- .kz-tpl-pull { margin: 0; padding-left: 16px; border-left: 3px solid var(--kz-hue, var(--kz-accent)); font-family: var(--kz-font-display); font-size: 19px; font-weight: 700;
786
+ .kz-tpl-pull { margin: 0; padding-left: 16px; border-left: 3px solid var(--kz-hue, var(--kz-accent)); font-family: var(--kz-font-display); font-size: 19px; font-weight: 400;
741
787
  line-height: 1.4; color: var(--kz-text-primary); }
742
788
  .kz-tpl-chapter-figure { grid-column: 2 / -1; margin: 8px 0 0; }
743
789
  @media (max-width: 1023px) {
@@ -751,10 +797,10 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
751
797
  .kz-tpl-log-entry:first-child { border-top: 0; }
752
798
  .kz-tpl-log-when { position: sticky; top: var(--kz-anchor-offset, 96px); align-self: start; display: grid; gap: 6px; }
753
799
  .kz-tpl-log-when time { font-family: var(--kz-font-mono); font-size: 12.5px; color: var(--kz-text-secondary); }
754
- .kz-tpl-log-entry :is(h2, h3) { margin: 0 0 10px; font-family: var(--kz-font-display); font-size: 19px; font-weight: 800; color: var(--kz-text-primary); }
800
+ .kz-tpl-log-entry :is(h2, h3) { margin: 0 0 10px; font-family: var(--kz-font-display); font-size: 19px; font-weight: 400; color: var(--kz-text-primary); }
755
801
  .kz-tpl-log-items { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
756
802
  .kz-tpl-log-items li { display: grid; grid-template-columns: 6.5rem minmax(0, 1fr); gap: 10px; font-size: 14.5px; line-height: 1.6; color: var(--kz-text-secondary); }
757
- .kz-tpl-log-kind { font-family: var(--kz-font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; padding-top: 3px; }
803
+ .kz-tpl-log-kind { font-family: var(--kz-font-mono); font-size: 11px; font-weight: 700; letter-spacing: 0; text-transform: none; padding-top: 3px; }
758
804
  .kz-tpl-log-kind[data-kind="added"] { color: var(--kz-success-text); }
759
805
  .kz-tpl-log-kind[data-kind="changed"] { color: var(--kz-accent-text); }
760
806
  .kz-tpl-log-kind[data-kind="fixed"] { color: var(--kz-warning-text); }
@@ -783,7 +829,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
783
829
  .kz-tpl-state[data-state="operational"] { border-color: color-mix(in srgb, var(--kz-success) 40%, var(--kz-border-default)); background: color-mix(in srgb, var(--kz-success) 7%, var(--kz-surface-1)); }
784
830
  .kz-tpl-state[data-state="degraded"] { border-color: color-mix(in srgb, var(--kz-warning) 40%, var(--kz-border-default)); background: color-mix(in srgb, var(--kz-warning) 7%, var(--kz-surface-1)); }
785
831
  .kz-tpl-state[data-state="outage"] { border-color: color-mix(in srgb, var(--kz-danger) 40%, var(--kz-border-default)); background: color-mix(in srgb, var(--kz-danger) 7%, var(--kz-surface-1)); }
786
- .kz-tpl-state strong { font-family: var(--kz-font-display); font-size: 19px; font-weight: 800; color: var(--kz-text-primary); }
832
+ .kz-tpl-state strong { font-family: var(--kz-font-display); font-size: 19px; font-weight: 400; color: var(--kz-text-primary); }
787
833
  .kz-tpl-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; background: var(--kz-text-secondary); }
788
834
  [data-state="operational"] > .kz-tpl-dot, .kz-tpl-dot[data-state="operational"] { background: var(--kz-success); box-shadow: 0 0 0 4px color-mix(in srgb, var(--kz-success) 22%, transparent); }
789
835
  [data-state="degraded"] > .kz-tpl-dot, .kz-tpl-dot[data-state="degraded"] { background: var(--kz-warning); }
@@ -797,9 +843,9 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
797
843
 
798
844
  /* An error: the code, huge and drawn in outline, the bird beside it, the ways out under it. */
799
845
  .kz-tpl-error { display: grid; justify-items: center; gap: 16px; padding-block: calc(var(--kz-hero-top, 120px) - 16px) clamp(48px, 8vw, 96px); text-align: center; }
800
- .kz-tpl-error .kz-tpl-error-code { margin: 0; max-width: none; display: flex; align-items: center; gap: 8px; font-family: var(--kz-font-display); font-size: clamp(5rem, 18vw, 10rem); font-weight: 800;
801
- line-height: 0.9; letter-spacing: -0.06em; color: transparent; -webkit-text-stroke: 2px var(--kz-hue, var(--kz-accent)); }
802
- .kz-tpl-error h1 { margin: 0; font-family: var(--kz-font-display); font-size: clamp(1.6rem, 4vw, 2.3rem); font-weight: 800; letter-spacing: -0.025em; color: var(--kz-text-primary); }
846
+ .kz-tpl-error .kz-tpl-error-code { margin: 0; max-width: none; display: flex; align-items: center; gap: 8px; font-family: var(--kz-font-display); font-size: clamp(5rem, 18vw, 10rem); font-weight: 400;
847
+ line-height: 0.9; letter-spacing: -0.01em; color: transparent; -webkit-text-stroke: 2px var(--kz-hue, var(--kz-accent)); }
848
+ .kz-tpl-error h1 { margin: 0; font-family: var(--kz-font-display); font-size: clamp(1.6rem, 4vw, 2.3rem); font-weight: 400; letter-spacing: -0.01em; color: var(--kz-text-primary); }
803
849
  .kz-tpl-error p:not(.kz-tpl-error-code) { margin: 0; max-width: 34rem; font-size: 16px; line-height: 1.65; color: var(--kz-text-secondary); }
804
850
  .kz-tpl-error-search { width: min(100%, 28rem); }
805
851
 
@@ -809,8 +855,8 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
809
855
  border: 1px solid var(--kz-border-default); }
810
856
  .kz-tpl-plan[data-featured] { border-color: var(--kz-accent); background: linear-gradient(170deg, color-mix(in srgb, var(--kz-accent) 12%, var(--kz-surface-1)), var(--kz-surface-1) 60%);
811
857
  box-shadow: 0 30px 60px -36px var(--kz-accent); }
812
- .kz-tpl-plan :is(h2, h3) { margin: 0; font-family: var(--kz-font-display); font-size: 18px; font-weight: 800; color: var(--kz-text-primary); }
813
- .kz-tpl-price { margin: 0; font-family: var(--kz-font-display); font-size: 2.6rem; font-weight: 800; letter-spacing: -0.03em; line-height: 1; color: var(--kz-text-primary); }
858
+ .kz-tpl-plan :is(h2, h3) { margin: 0; font-family: var(--kz-font-display); font-size: 18px; font-weight: 400; color: var(--kz-text-primary); }
859
+ .kz-tpl-price { margin: 0; font-family: var(--kz-font-display); font-size: 2.6rem; font-weight: 400; letter-spacing: -0.01em; line-height: 1; color: var(--kz-text-primary); }
814
860
  .kz-tpl-price small { display: block; margin-top: 6px; font-family: var(--kz-font-text, inherit); font-size: 13px; font-weight: 500; letter-spacing: 0; color: var(--kz-text-secondary); }
815
861
  .kz-tpl-plan ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; font-size: 14px; color: var(--kz-text-secondary); }
816
862
  .kz-tpl-plan ul li { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 8px; }
@@ -818,7 +864,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
818
864
  .kz-tpl-plan > :last-child { margin-top: auto; }
819
865
  .kz-tpl-compare { width: 100%; border-collapse: collapse; font-size: 14px; }
820
866
  .kz-tpl-compare th, .kz-tpl-compare td { padding: 12px 14px; text-align: left; border-bottom: 1px solid var(--kz-border-subtle); color: var(--kz-text-secondary); }
821
- .kz-tpl-compare thead th { font-family: var(--kz-font-mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; }
867
+ .kz-tpl-compare thead th { font-family: var(--kz-font-mono); font-size: 11px; letter-spacing: 0; text-transform: none; }
822
868
  .kz-tpl-compare tbody th { color: var(--kz-text-primary); font-weight: 600; }
823
869
  .kz-tpl-scroll { overflow-x: auto; border-radius: 16px; border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
824
870
  .kz-tpl-faq { display: grid; gap: 8px; }
@@ -841,3 +887,154 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
841
887
  .kz-tpl-plan .kz-tpl-collection-head { justify-content: space-between; }
842
888
  .kz-tpl-scroll:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); outline-offset: 2px; }
843
889
  .kz-tpl-prose > p, .kz-tpl-prose > ul, .kz-tpl-prose > ol { margin: 0 0 1em; }
890
+
891
+ /* ─── The Cahier's signature blocks (ADR-004, #417): the specimen tag, the stamp, the bird plate, the anatomy plate,
892
+ the index, the caption and the footnotes. Paper and ink on the --kz-paper-* roles; nothing blurs, nothing glows. ─── */
893
+
894
+ /* SpecimenTag — manila, an eyelet, a typed record. `data-mount="hang"`: a string from the wire above. */
895
+ .kz-tag {
896
+ position: relative;
897
+ display: flex;
898
+ flex-direction: column;
899
+ gap: 10px;
900
+ padding: 40px 20px 16px;
901
+ color: var(--kz-paper-tag-ink);
902
+ background: var(--kz-paper-tag);
903
+ border: 1px solid var(--kz-paper-tag-edge);
904
+ border-top-left-radius: 12px;
905
+ border-top-right-radius: 12px;
906
+ corner-shape: bevel;
907
+ box-shadow: var(--kz-shadow-raised);
908
+ }
909
+ .kz-tag-eyelet {
910
+ position: absolute;
911
+ top: 12px;
912
+ left: 50%;
913
+ width: 14px;
914
+ height: 14px;
915
+ margin-left: -7px;
916
+ border-radius: 9999px;
917
+ background: var(--kz-surface-0);
918
+ box-shadow: inset 0 0 0 3px var(--kz-paper-tag-edge);
919
+ }
920
+ .kz-tag[data-mount="hang"] { margin-top: 32px; }
921
+ .kz-tag[data-mount="hang"]::before {
922
+ content: "";
923
+ position: absolute;
924
+ left: 50%;
925
+ top: -33px;
926
+ height: 52px;
927
+ border-left: 1.5px solid var(--kz-text-secondary);
928
+ opacity: 0.75;
929
+ }
930
+ .kz-tag-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 26px; }
931
+ .kz-tag-code { font-family: var(--kz-font-mono); font-size: 12.5px; font-weight: 700; line-height: 16px; }
932
+ .kz-tag-title { margin: 0; display: flex; align-items: center; justify-content: space-between; gap: 12px; font-family: var(--kz-font-display); font-weight: 400; font-size: 26px; line-height: 32px; color: inherit; }
933
+ .kz-tag-mark { display: inline-flex; flex-shrink: 0; }
934
+ .kz-tag-mark > svg, .kz-tag-mark > img { width: 32px; height: 32px; }
935
+ .kz-tag-body { font-size: 15px; line-height: 22px; }
936
+ .kz-tag-body > p { margin: 0; }
937
+ .kz-tag-fields { margin: 0; display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 12px; font-family: var(--kz-font-mono); font-size: 13px; line-height: 24px; }
938
+ .kz-tag-fields > div { display: contents; }
939
+ .kz-tag-fields dt { opacity: 0.72; }
940
+ .kz-tag-fields dd { margin: 0; font-weight: 700; border-bottom: 1px dashed var(--kz-paper-tag-edge); overflow-wrap: anywhere; }
941
+ .kz-tag-foot { margin-top: auto; padding-top: 10px; display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 6px 12px; font-family: var(--kz-font-mono); font-size: 12.5px; line-height: 16px; border-top: 1px dashed var(--kz-paper-tag-edge); }
942
+ .kz-tag-foot a { color: inherit; font-weight: 700; text-decoration: underline; text-decoration-thickness: 1.5px; text-underline-offset: 4px; }
943
+
944
+ /* Stamp — a rubber stamp: lower case, double-ruled, askew; the tone is its ink. */
945
+ .kz-stamp {
946
+ display: inline-flex;
947
+ align-items: center;
948
+ flex-shrink: 0;
949
+ padding: 3px 8px 2px;
950
+ font-family: var(--kz-font-mono);
951
+ font-size: 12px;
952
+ font-weight: 700;
953
+ line-height: 16px;
954
+ white-space: nowrap;
955
+ color: var(--kz-stamp-ink, var(--kz-text-primary));
956
+ border: 2px solid currentColor;
957
+ border-radius: 2px;
958
+ outline: 1px solid currentColor;
959
+ outline-offset: 2px;
960
+ transform: rotate(-3deg);
961
+ }
962
+ .kz-stamp[data-tone="ok"] { --kz-stamp-ink: var(--kz-success-text); }
963
+ .kz-stamp[data-tone="wip"] { --kz-stamp-ink: var(--kz-text-secondary); }
964
+ .kz-stamp[data-tone="construction"] { --kz-stamp-ink: var(--kz-paper-rule-margin); }
965
+ .kz-tag .kz-stamp[data-tone="wip"], .kz-tag .kz-stamp[data-tone="neutral"] { --kz-stamp-ink: var(--kz-paper-tag-ink); }
966
+ /* On the manila (or the slate tag), the margin's red is mixed with the tag's ink so a small stamp stays ≥ 4.5:1 (axe). */
967
+ .kz-tag .kz-stamp[data-tone="construction"] { --kz-stamp-ink: color-mix(in oklab, var(--kz-paper-rule-margin) 72%, var(--kz-paper-tag-ink)); }
968
+
969
+ /* BirdPlate and AnatomyPlate — a sheet of the field guide. */
970
+ .kz-plate, .kz-anatomy {
971
+ margin: 0;
972
+ padding: 20px 24px 24px;
973
+ background: var(--kz-surface-1);
974
+ border: 1px solid var(--kz-border-default);
975
+ box-shadow: var(--kz-shadow-md);
976
+ }
977
+ .kz-plate-head, .kz-anatomy-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 4px 16px; margin-bottom: 16px; }
978
+ .kz-plate-title { font-family: var(--kz-font-display); font-size: 22px; line-height: 32px; font-weight: 400; color: var(--kz-text-primary); }
979
+ .kz-plate-sub { font-family: var(--kz-font-mono); font-size: 13px; line-height: 16px; color: var(--kz-text-secondary); }
980
+ .kz-plate-figures { margin: 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 24px 20px; }
981
+ .kz-plate-figure { display: grid; justify-items: center; align-content: start; gap: 4px; text-align: center; }
982
+ .kz-plate-bird { width: 112px; height: 112px; }
983
+ .kz-plate-caption { position: relative; margin: 0; padding-top: 22px; max-width: 24ch; font-family: var(--kz-font-mono); font-size: 12.5px; line-height: 16px; color: var(--kz-text-secondary); }
984
+ .kz-plate-caption b { display: block; font-weight: 700; color: var(--kz-text-primary); }
985
+ .kz-plate-caption::before { content: ""; position: absolute; top: 2px; left: 50%; height: 16px; border-left: 1px solid var(--kz-text-secondary); }
986
+ .kz-plate-caption::after { content: ""; position: absolute; top: 0; left: calc(50% - 2.5px); width: 5px; height: 5px; border-radius: 9999px; background: var(--kz-paper-rule-margin); }
987
+ .kz-plate[data-layout="single"] .kz-plate-figures { grid-template-columns: 1fr; }
988
+ .kz-plate[data-layout="single"] .kz-plate-figure { grid-template-columns: auto minmax(0, 1fr); align-items: center; justify-items: start; text-align: left; gap: 32px; }
989
+ .kz-plate[data-layout="single"] .kz-plate-bird { width: 168px; height: 168px; }
990
+ .kz-plate[data-layout="single"] .kz-plate-caption { padding: 0 0 0 4px; max-width: 32ch; font-size: 13.5px; line-height: 20px; }
991
+ .kz-plate[data-layout="single"] .kz-plate-caption::before { top: 50%; left: -28px; height: 0; width: 26px; border-left: 0; border-top: 1px solid var(--kz-text-secondary); }
992
+ .kz-plate[data-layout="single"] .kz-plate-caption::after { top: calc(50% - 2.5px); left: -31px; }
993
+
994
+ .kz-anatomy-stage { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 0 56px; min-height: 240px; }
995
+ .kz-anatomy-specimen { display: grid; place-items: center; padding: 40px 24px; }
996
+ .kz-anatomy-scale { transform: scale(var(--kz-anatomy-scale, 1.6)); transform-origin: center; }
997
+ .kz-anatomy-parts { margin: 0; padding: 0; list-style: none; display: grid; gap: 28px; }
998
+ .kz-anatomy-part { position: relative; display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: 10px; align-items: start; font-family: var(--kz-font-mono); font-size: 12.5px; line-height: 16px; color: var(--kz-text-secondary); }
999
+ .kz-anatomy-part b { font-weight: 700; color: var(--kz-paper-rule-margin); }
1000
+ .kz-anatomy-n { display: grid; place-items: center; width: 24px; height: 24px; border: 1.5px solid var(--kz-paper-rule-margin); border-radius: 9999px; font-family: var(--kz-font-text); font-size: 12px; font-weight: 700; color: var(--kz-paper-rule-margin); }
1001
+ .kz-anatomy-parts[data-side="left"] .kz-anatomy-part::after,
1002
+ .kz-anatomy-parts[data-side="right"] .kz-anatomy-part::after { content: ""; position: absolute; top: 12px; width: 44px; border-top: 1px solid var(--kz-text-secondary); }
1003
+ .kz-anatomy-parts[data-side="left"] .kz-anatomy-part::after { right: -52px; }
1004
+ .kz-anatomy-parts[data-side="right"] .kz-anatomy-part::after { left: -52px; }
1005
+ @media (max-width: 720px) {
1006
+ .kz-anatomy-stage { grid-template-columns: 1fr; gap: 16px; }
1007
+ .kz-anatomy-specimen { order: -1; padding: 24px 0; }
1008
+ .kz-anatomy-scale { transform: none; }
1009
+ .kz-anatomy-parts { gap: 16px; }
1010
+ .kz-anatomy-parts[data-side] .kz-anatomy-part::after { display: none; }
1011
+ .kz-plate[data-layout="single"] .kz-plate-figure { grid-template-columns: 1fr; justify-items: center; text-align: center; gap: 4px; }
1012
+ .kz-plate[data-layout="single"] .kz-plate-caption { padding-top: 22px; }
1013
+ .kz-plate[data-layout="single"] .kz-plate-caption::before { top: 2px; left: 50%; height: 16px; width: 0; border-top: 0; border-left: 1px solid var(--kz-text-secondary); }
1014
+ .kz-plate[data-layout="single"] .kz-plate-caption::after { top: 0; left: calc(50% - 2.5px); }
1015
+ }
1016
+
1017
+ /* PageIndex — a book's index: dotted leaders and page numbers; the current entry marked in the margin. */
1018
+ .kz-index { font-size: 15px; line-height: 24px; }
1019
+ .kz-index-group + .kz-index-group { margin-top: 16px; }
1020
+ .kz-index-title { margin: 0 0 4px; font-family: var(--kz-font-mono); font-size: 12.5px; font-weight: 700; line-height: 24px; color: var(--kz-paper-rule-margin); }
1021
+ .kz-index ul { margin: 0; padding: 0; list-style: none; }
1022
+ .kz-index-entry { position: relative; display: flex; align-items: baseline; gap: 6px; padding: 4px 0; color: var(--kz-text-secondary); text-decoration: none; }
1023
+ .kz-index-entry:hover { color: var(--kz-text-primary); }
1024
+ .kz-index-entry:focus-visible { outline: var(--kz-ring-width, 2px) solid var(--kz-ring); outline-offset: 2px; }
1025
+ .kz-index-label { min-width: 0; }
1026
+ .kz-index-leader { flex: 1; min-width: 12px; border-bottom: 1.5px dotted var(--kz-text-muted); transform: translateY(-4px); }
1027
+ .kz-index-page { font-family: var(--kz-font-mono); font-size: 12.5px; color: var(--kz-text-secondary); font-variant-numeric: tabular-nums; }
1028
+ .kz-index-entry[aria-current="page"] { color: var(--kz-text-primary); font-weight: 700; }
1029
+ .kz-index-entry[aria-current="page"]::before { content: "→"; position: absolute; left: -20px; color: var(--kz-paper-rule-margin); font-weight: 400; }
1030
+
1031
+ /* Caption, footnote refs and the notes — the small print. */
1032
+ .kz-caption { display: block; margin: 8px 0 0; font-family: var(--kz-font-mono); font-size: 12.5px; line-height: 16px; color: var(--kz-text-secondary); }
1033
+ .kz-caption-figure { font-weight: 700; color: var(--kz-text-primary); }
1034
+ .kz-fnref { line-height: 0; }
1035
+ .kz-fnref a { padding: 0 1px; font-family: var(--kz-font-mono); font-size: 0.72em; font-weight: 700; color: var(--kz-paper-rule-margin); text-decoration: none; }
1036
+ .kz-fnref a:hover { text-decoration: underline; }
1037
+ .kz-footnotes { margin-top: 24px; padding-top: 12px; font-size: 13.5px; line-height: 20px; color: var(--kz-text-secondary); background: linear-gradient(var(--kz-text-secondary), var(--kz-text-secondary)) top left / 12ch 1px no-repeat; }
1038
+ .kz-footnotes ol { margin: 0; padding-left: 1.6em; display: grid; gap: 6px; }
1039
+ .kz-footnotes li::marker { font-family: var(--kz-font-mono); color: var(--kz-paper-rule-margin); }
1040
+ .kz-fn-back { color: var(--kz-accent-text); text-decoration: none; }
package/dist/checkbox.js CHANGED
@@ -8,7 +8,7 @@ var checkbox = tv({
8
8
  slots: {
9
9
  root: "peer inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-md border border-border-strong bg-surface-1 text-on-accent 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 hover:border-accent disabled:cursor-not-allowed disabled:opacity-40 data-[state=checked]:border-accent data-[state=checked]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent aria-invalid:border-danger aria-invalid:ring-danger/30",
10
10
  indicator: "flex items-center justify-center",
11
- label: "flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-60"
11
+ label: "flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-70"
12
12
  }
13
13
  });
14
14
  function Check() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/checkbox/checkbox.tsx"],"sourcesContent":["// Client. Radix Checkbox: role=\"checkbox\", aria-checked (true · false · mixed), Space toggles, a hidden input inside a\n// form. It sits in a `Field` like the other controls: `<Field.Label htmlFor={id}>`, `invalid`, aria-describedby.\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const checkbox = tv({\n slots: {\n root:\n \"peer inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-md border border-border-strong bg-surface-1 text-on-accent 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 \"hover:border-accent disabled:cursor-not-allowed disabled:opacity-40 \" +\n \"data-[state=checked]:border-accent data-[state=checked]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent \" +\n \"aria-invalid:border-danger aria-invalid:ring-danger/30\",\n indicator: \"flex items-center justify-center\",\n label: \"flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-60\",\n },\n});\n\nfunction Check() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction Dash() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n\nexport type CheckboxProps = Omit<React.ComponentProps<typeof CheckboxPrimitive.Root>, \"children\"> & {\n /** Marks it invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby). */\n invalid?: boolean;\n /** The text next to the box, clickable: the box and its words in one `<label>`. Otherwise name it with\n * `Field.Label htmlFor` or `aria-label`. */\n children?: React.ReactNode;\n};\n\n/** A checkbox: `checked`/`defaultChecked` (`true` · `false` · `\"indeterminate\"`) + `onCheckedChange`. */\nexport function Checkbox({ invalid, className, children, ...props }: CheckboxProps) {\n const s = checkbox();\n const box = (\n <CheckboxPrimitive.Root\n aria-invalid={invalid || undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={s.root({ className: children ? \"mt-0.5\" : className })}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={s.indicator()}>\n {props.checked === \"indeterminate\" ? <Dash /> : <Check />}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n if (!children) return box;\n return (\n <label className={s.label({ className })}>\n {box}\n <span className=\"min-w-0\">{children}</span>\n </label>\n );\n}\n"],"mappings":";;;AAEA,SAAS,YAAY,yBAAyB;AAE9C,SAAS,UAAU;AAkBb,cAsCF,YAtCE;AAhBC,IAAM,WAAW,GAAG;AAAA,EACzB,OAAO;AAAA,IACL,MACE;AAAA,IAKF,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AACF,CAAC;AAED,SAAS,QAAQ;AACf,SACE,oBAAC,SAAI,SAAQ,aAAY,WAAU,eAAc,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACzJ,8BAAC,UAAK,GAAE,mBAAkB,GAC5B;AAEJ;AAEA,SAAS,OAAO;AACd,SACE,oBAAC,SAAI,SAAQ,aAAY,WAAU,eAAc,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,eAAW,MAClI,8BAAC,UAAK,GAAE,YAAW,GACrB;AAEJ;AAWO,SAAS,SAAS,EAAE,SAAS,WAAW,UAAU,GAAG,MAAM,GAAkB;AAClF,QAAM,IAAI,SAAS;AACnB,QAAM,MACJ;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,gBAAc,WAAW;AAAA,MACzB,gBAAc,UAAU,KAAK;AAAA,MAC7B,WAAW,EAAE,KAAK,EAAE,WAAW,WAAW,WAAW,UAAU,CAAC;AAAA,MAC/D,GAAG;AAAA,MAEJ,8BAAC,kBAAkB,WAAlB,EAA4B,WAAW,EAAE,UAAU,GACjD,gBAAM,YAAY,kBAAkB,oBAAC,QAAK,IAAK,oBAAC,SAAM,GACzD;AAAA;AAAA,EACF;AAEF,MAAI,CAAC,SAAU,QAAO;AACtB,SACE,qBAAC,WAAM,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,GACpC;AAAA;AAAA,IACD,oBAAC,UAAK,WAAU,WAAW,UAAS;AAAA,KACtC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/checkbox/checkbox.tsx"],"sourcesContent":["// Client. Radix Checkbox: role=\"checkbox\", aria-checked (true · false · mixed), Space toggles, a hidden input inside a\n// form. It sits in a `Field` like the other controls: `<Field.Label htmlFor={id}>`, `invalid`, aria-describedby.\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nexport const checkbox = tv({\n slots: {\n root:\n \"peer inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-md border border-border-strong bg-surface-1 text-on-accent 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 \"hover:border-accent disabled:cursor-not-allowed disabled:opacity-40 \" +\n \"data-[state=checked]:border-accent data-[state=checked]:bg-accent data-[state=indeterminate]:border-accent data-[state=indeterminate]:bg-accent \" +\n \"aria-invalid:border-danger aria-invalid:ring-danger/30\",\n indicator: \"flex items-center justify-center\",\n label: \"flex cursor-pointer items-start gap-3 text-sm text-fg has-disabled:cursor-not-allowed has-disabled:opacity-70\",\n },\n});\n\nfunction Check() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction Dash() {\n return (\n <svg viewBox=\"0 0 24 24\" className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" aria-hidden>\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n\nexport type CheckboxProps = Omit<React.ComponentProps<typeof CheckboxPrimitive.Root>, \"children\"> & {\n /** Marks it invalid: aria-invalid and data-invalid (pair it with a `Field.Error` in aria-describedby). */\n invalid?: boolean;\n /** The text next to the box, clickable: the box and its words in one `<label>`. Otherwise name it with\n * `Field.Label htmlFor` or `aria-label`. */\n children?: React.ReactNode;\n};\n\n/** A checkbox: `checked`/`defaultChecked` (`true` · `false` · `\"indeterminate\"`) + `onCheckedChange`. */\nexport function Checkbox({ invalid, className, children, ...props }: CheckboxProps) {\n const s = checkbox();\n const box = (\n <CheckboxPrimitive.Root\n aria-invalid={invalid || undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={s.root({ className: children ? \"mt-0.5\" : className })}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={s.indicator()}>\n {props.checked === \"indeterminate\" ? <Dash /> : <Check />}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n if (!children) return box;\n return (\n <label className={s.label({ className })}>\n {box}\n <span className=\"min-w-0\">{children}</span>\n </label>\n );\n}\n"],"mappings":";;;AAEA,SAAS,YAAY,yBAAyB;AAE9C,SAAS,UAAU;AAkBb,cAsCF,YAtCE;AAhBC,IAAM,WAAW,GAAG;AAAA,EACzB,OAAO;AAAA,IACL,MACE;AAAA,IAKF,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AACF,CAAC;AAED,SAAS,QAAQ;AACf,SACE,oBAAC,SAAI,SAAQ,aAAY,WAAU,eAAc,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACzJ,8BAAC,UAAK,GAAE,mBAAkB,GAC5B;AAEJ;AAEA,SAAS,OAAO;AACd,SACE,oBAAC,SAAI,SAAQ,aAAY,WAAU,eAAc,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,eAAW,MAClI,8BAAC,UAAK,GAAE,YAAW,GACrB;AAEJ;AAWO,SAAS,SAAS,EAAE,SAAS,WAAW,UAAU,GAAG,MAAM,GAAkB;AAClF,QAAM,IAAI,SAAS;AACnB,QAAM,MACJ;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACC,gBAAc,WAAW;AAAA,MACzB,gBAAc,UAAU,KAAK;AAAA,MAC7B,WAAW,EAAE,KAAK,EAAE,WAAW,WAAW,WAAW,UAAU,CAAC;AAAA,MAC/D,GAAG;AAAA,MAEJ,8BAAC,kBAAkB,WAAlB,EAA4B,WAAW,EAAE,UAAU,GACjD,gBAAM,YAAY,kBAAkB,oBAAC,QAAK,IAAK,oBAAC,SAAM,GACzD;AAAA;AAAA,EACF;AAEF,MAAI,CAAC,SAAU,QAAO;AACtB,SACE,qBAAC,WAAM,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,GACpC;AAAA;AAAA,IACD,oBAAC,UAAK,WAAU,WAAW,UAAS;AAAA,KACtC;AAEJ;","names":[]}
package/dist/chip-row.js CHANGED
@@ -13,7 +13,7 @@ var chipRow = tv({
13
13
  hint: "text-xs text-fg-muted",
14
14
  list: "m-0 flex list-none snap-x snap-proximity gap-2 overflow-x-auto p-0 pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden [mask-image:linear-gradient(to_right,#000_calc(100%-2rem),transparent)] md:flex-wrap md:overflow-visible md:pb-0 md:[mask-image:none]",
15
15
  item: "snap-start",
16
- badge: "rounded-full bg-surface-3 px-1.5 py-0.5 text-[0.625rem] font-semibold uppercase leading-none tracking-wide text-fg-muted"
16
+ badge: "rounded-full bg-surface-3 px-1.5 py-0.5 text-[0.625rem] font-semibold leading-none text-fg-muted"
17
17
  }
18
18
  });
19
19
  var s = chipRow();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chip-row/chip-row.tsx"],"sourcesContent":["// Client (arrow-key focus only). A row of chip links that scrolls sideways with scroll-snap on a phone (the trailing edge\n// fades, no scrollbar) and wraps from `md`: an audience picker, the filters of a page. Each item is a `ChipLink`-style\n// link at least 44 px high; the current one carries `aria-current`. Tab goes through the links; ← → Home End move between them.\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { chipVariants } from \"../chip-link\";\n\nexport const chipRow = tv({\n slots: {\n root: \"flex w-full flex-col gap-2\",\n hint: \"text-xs text-fg-muted\",\n list:\n \"m-0 flex list-none snap-x snap-proximity gap-2 overflow-x-auto p-0 pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden \" +\n \"[mask-image:linear-gradient(to_right,#000_calc(100%-2rem),transparent)] md:flex-wrap md:overflow-visible md:pb-0 md:[mask-image:none]\",\n item: \"snap-start\",\n badge: \"rounded-full bg-surface-3 px-1.5 py-0.5 text-[0.625rem] font-semibold uppercase leading-none tracking-wide text-fg-muted\",\n },\n});\n\nconst s = chipRow();\n\nexport type ChipRowProps = Omit<React.ComponentProps<\"nav\">, \"aria-label\"> & {\n /** What the links choose among (\"For whom?\"): the row's accessible name, passed translated. */\n label: string;\n /** A line under the label that says how to choose; read with the row. */\n hint?: React.ReactNode;\n};\n\n/** A scroll-snap row of chip links; wraps from `md`. Items: `ChipRow.Item`. */\nfunction ChipRowRoot({ label, hint, className, children, ...props }: ChipRowProps) {\n const id = React.useId();\n const list = React.useRef<HTMLUListElement>(null);\n const move = (event: React.KeyboardEvent<HTMLUListElement>) => {\n const keys = [\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n const links = [...(list.current?.querySelectorAll<HTMLElement>(\"a[href],button:not([disabled])\") ?? [])];\n const at = links.indexOf(event.target as HTMLElement);\n if (at < 0) return;\n const last = links.length - 1;\n const to = event.key === \"Home\" ? 0 : event.key === \"End\" ? last : Math.min(last, Math.max(0, at + (event.key === \"ArrowRight\" ? 1 : -1)));\n event.preventDefault();\n links[to]?.focus();\n links[to]?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n };\n return (\n <nav aria-label={label} aria-describedby={hint ? `${id}-hint` : undefined} className={s.root({ className })} {...props}>\n {hint ? (\n <p id={`${id}-hint`} className={s.hint()}>\n {hint}\n </p>\n ) : null}\n <ul ref={list} className={s.list()} onKeyDown={move}>\n {children}\n </ul>\n </nav>\n );\n}\n\nexport type ChipRowItemProps = React.ComponentProps<\"a\"> & {\n /** The current choice: the accent and `aria-current`. */\n selected?: boolean;\n /** What `aria-current` says when selected.\n * @default \"page\" */\n current?: \"page\" | \"true\";\n /** A small tag after the label (\"Soon\"), passed translated. */\n badge?: React.ReactNode;\n /** Renders your router's `<Link>` as the chip; put the label and the badge in your link's children yourself. */\n asChild?: boolean;\n};\n\n/** One link of the row. */\nfunction ChipRowItem({ selected = false, current = \"page\", badge, asChild, className, children, ...props }: ChipRowItemProps) {\n const Comp = asChild ? Slot.Root : \"a\";\n return (\n <li className={s.item()}>\n <Comp\n data-state={selected ? \"on\" : \"off\"}\n aria-current={selected ? current : undefined}\n className={chipVariants({ selected, className: [\"min-h-11\", className] })}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {badge ? <span className={s.badge()}>{badge}</span> : null}\n </>\n )}\n </Comp>\n </li>\n );\n}\n\nexport const ChipRow = Object.assign(ChipRowRoot, { Item: ChipRowItem });\n"],"mappings":";;;;;AAGA,SAAS,YAAY;AACrB,YAAY,WAAW;AACvB,SAAS,UAAU;AA0Cf,SAuCM,UArCF,KAFJ;AAtCG,IAAM,UAAU,GAAG;AAAA,EACxB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MACE;AAAA,IAEF,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,IAAI,QAAQ;AAUlB,SAAS,YAAY,EAAE,OAAO,MAAM,WAAW,UAAU,GAAG,MAAM,GAAiB;AACjF,QAAM,KAAW,YAAM;AACvB,QAAM,OAAa,aAAyB,IAAI;AAChD,QAAM,OAAO,CAAC,UAAiD;AAC7D,UAAM,OAAO,CAAC,aAAa,cAAc,QAAQ,KAAK;AACtD,QAAI,CAAC,KAAK,SAAS,MAAM,GAAG,EAAG;AAC/B,UAAM,QAAQ,CAAC,GAAI,KAAK,SAAS,iBAA8B,gCAAgC,KAAK,CAAC,CAAE;AACvG,UAAM,KAAK,MAAM,QAAQ,MAAM,MAAqB;AACpD,QAAI,KAAK,EAAG;AACZ,UAAM,OAAO,MAAM,SAAS;AAC5B,UAAM,KAAK,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,QAAQ,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,MAAM,MAAM,QAAQ,eAAe,IAAI,GAAG,CAAC;AACzI,UAAM,eAAe;AACrB,UAAM,EAAE,GAAG,MAAM;AACjB,UAAM,EAAE,GAAG,iBAAiB,EAAE,OAAO,WAAW,QAAQ,UAAU,CAAC;AAAA,EACrE;AACA,SACE,qBAAC,SAAI,cAAY,OAAO,oBAAkB,OAAO,GAAG,EAAE,UAAU,QAAW,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC9G;AAAA,WACC,oBAAC,OAAE,IAAI,GAAG,EAAE,SAAS,WAAW,EAAE,KAAK,GACpC,gBACH,IACE;AAAA,IACJ,oBAAC,QAAG,KAAK,MAAM,WAAW,EAAE,KAAK,GAAG,WAAW,MAC5C,UACH;AAAA,KACF;AAEJ;AAeA,SAAS,YAAY,EAAE,WAAW,OAAO,UAAU,QAAQ,OAAO,SAAS,WAAW,UAAU,GAAG,MAAM,GAAqB;AAC5H,QAAM,OAAO,UAAU,KAAK,OAAO;AACnC,SACE,oBAAC,QAAG,WAAW,EAAE,KAAK,GACpB;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,WAAW,OAAO;AAAA,MAC9B,gBAAc,WAAW,UAAU;AAAA,MACnC,WAAW,aAAa,EAAE,UAAU,WAAW,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA,MACvE,GAAG;AAAA,MAEH,oBACC,WAEA,iCACG;AAAA;AAAA,QACA,QAAQ,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAI,iBAAM,IAAU;AAAA,SACxD;AAAA;AAAA,EAEJ,GACF;AAEJ;AAEO,IAAM,UAAU,OAAO,OAAO,aAAa,EAAE,MAAM,YAAY,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/chip-row/chip-row.tsx"],"sourcesContent":["// Client (arrow-key focus only). A row of chip links that scrolls sideways with scroll-snap on a phone (the trailing edge\n// fades, no scrollbar) and wraps from `md`: an audience picker, the filters of a page. Each item is a `ChipLink`-style\n// link at least 44 px high; the current one carries `aria-current`. Tab goes through the links; ← → Home End move between them.\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport { chipVariants } from \"../chip-link\";\n\nexport const chipRow = tv({\n slots: {\n root: \"flex w-full flex-col gap-2\",\n hint: \"text-xs text-fg-muted\",\n list:\n \"m-0 flex list-none snap-x snap-proximity gap-2 overflow-x-auto p-0 pb-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden \" +\n \"[mask-image:linear-gradient(to_right,#000_calc(100%-2rem),transparent)] md:flex-wrap md:overflow-visible md:pb-0 md:[mask-image:none]\",\n item: \"snap-start\",\n badge: \"rounded-full bg-surface-3 px-1.5 py-0.5 text-[0.625rem] font-semibold leading-none text-fg-muted\",\n },\n});\n\nconst s = chipRow();\n\nexport type ChipRowProps = Omit<React.ComponentProps<\"nav\">, \"aria-label\"> & {\n /** What the links choose among (\"For whom?\"): the row's accessible name, passed translated. */\n label: string;\n /** A line under the label that says how to choose; read with the row. */\n hint?: React.ReactNode;\n};\n\n/** A scroll-snap row of chip links; wraps from `md`. Items: `ChipRow.Item`. */\nfunction ChipRowRoot({ label, hint, className, children, ...props }: ChipRowProps) {\n const id = React.useId();\n const list = React.useRef<HTMLUListElement>(null);\n const move = (event: React.KeyboardEvent<HTMLUListElement>) => {\n const keys = [\"ArrowLeft\", \"ArrowRight\", \"Home\", \"End\"];\n if (!keys.includes(event.key)) return;\n const links = [...(list.current?.querySelectorAll<HTMLElement>(\"a[href],button:not([disabled])\") ?? [])];\n const at = links.indexOf(event.target as HTMLElement);\n if (at < 0) return;\n const last = links.length - 1;\n const to = event.key === \"Home\" ? 0 : event.key === \"End\" ? last : Math.min(last, Math.max(0, at + (event.key === \"ArrowRight\" ? 1 : -1)));\n event.preventDefault();\n links[to]?.focus();\n links[to]?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n };\n return (\n <nav aria-label={label} aria-describedby={hint ? `${id}-hint` : undefined} className={s.root({ className })} {...props}>\n {hint ? (\n <p id={`${id}-hint`} className={s.hint()}>\n {hint}\n </p>\n ) : null}\n <ul ref={list} className={s.list()} onKeyDown={move}>\n {children}\n </ul>\n </nav>\n );\n}\n\nexport type ChipRowItemProps = React.ComponentProps<\"a\"> & {\n /** The current choice: the accent and `aria-current`. */\n selected?: boolean;\n /** What `aria-current` says when selected.\n * @default \"page\" */\n current?: \"page\" | \"true\";\n /** A small tag after the label (\"Soon\"), passed translated. */\n badge?: React.ReactNode;\n /** Renders your router's `<Link>` as the chip; put the label and the badge in your link's children yourself. */\n asChild?: boolean;\n};\n\n/** One link of the row. */\nfunction ChipRowItem({ selected = false, current = \"page\", badge, asChild, className, children, ...props }: ChipRowItemProps) {\n const Comp = asChild ? Slot.Root : \"a\";\n return (\n <li className={s.item()}>\n <Comp\n data-state={selected ? \"on\" : \"off\"}\n aria-current={selected ? current : undefined}\n className={chipVariants({ selected, className: [\"min-h-11\", className] })}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {badge ? <span className={s.badge()}>{badge}</span> : null}\n </>\n )}\n </Comp>\n </li>\n );\n}\n\nexport const ChipRow = Object.assign(ChipRowRoot, { Item: ChipRowItem });\n"],"mappings":";;;;;AAGA,SAAS,YAAY;AACrB,YAAY,WAAW;AACvB,SAAS,UAAU;AA0Cf,SAuCM,UArCF,KAFJ;AAtCG,IAAM,UAAU,GAAG;AAAA,EACxB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MACE;AAAA,IAEF,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,IAAI,QAAQ;AAUlB,SAAS,YAAY,EAAE,OAAO,MAAM,WAAW,UAAU,GAAG,MAAM,GAAiB;AACjF,QAAM,KAAW,YAAM;AACvB,QAAM,OAAa,aAAyB,IAAI;AAChD,QAAM,OAAO,CAAC,UAAiD;AAC7D,UAAM,OAAO,CAAC,aAAa,cAAc,QAAQ,KAAK;AACtD,QAAI,CAAC,KAAK,SAAS,MAAM,GAAG,EAAG;AAC/B,UAAM,QAAQ,CAAC,GAAI,KAAK,SAAS,iBAA8B,gCAAgC,KAAK,CAAC,CAAE;AACvG,UAAM,KAAK,MAAM,QAAQ,MAAM,MAAqB;AACpD,QAAI,KAAK,EAAG;AACZ,UAAM,OAAO,MAAM,SAAS;AAC5B,UAAM,KAAK,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,QAAQ,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,MAAM,MAAM,QAAQ,eAAe,IAAI,GAAG,CAAC;AACzI,UAAM,eAAe;AACrB,UAAM,EAAE,GAAG,MAAM;AACjB,UAAM,EAAE,GAAG,iBAAiB,EAAE,OAAO,WAAW,QAAQ,UAAU,CAAC;AAAA,EACrE;AACA,SACE,qBAAC,SAAI,cAAY,OAAO,oBAAkB,OAAO,GAAG,EAAE,UAAU,QAAW,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,GAAI,GAAG,OAC9G;AAAA,WACC,oBAAC,OAAE,IAAI,GAAG,EAAE,SAAS,WAAW,EAAE,KAAK,GACpC,gBACH,IACE;AAAA,IACJ,oBAAC,QAAG,KAAK,MAAM,WAAW,EAAE,KAAK,GAAG,WAAW,MAC5C,UACH;AAAA,KACF;AAEJ;AAeA,SAAS,YAAY,EAAE,WAAW,OAAO,UAAU,QAAQ,OAAO,SAAS,WAAW,UAAU,GAAG,MAAM,GAAqB;AAC5H,QAAM,OAAO,UAAU,KAAK,OAAO;AACnC,SACE,oBAAC,QAAG,WAAW,EAAE,KAAK,GACpB;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,WAAW,OAAO;AAAA,MAC9B,gBAAc,WAAW,UAAU;AAAA,MACnC,WAAW,aAAa,EAAE,UAAU,WAAW,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA,MACvE,GAAG;AAAA,MAEH,oBACC,WAEA,iCACG;AAAA;AAAA,QACA,QAAQ,oBAAC,UAAK,WAAW,EAAE,MAAM,GAAI,iBAAM,IAAU;AAAA,SACxD;AAAA;AAAA,EAEJ,GACF;AAEJ;AAEO,IAAM,UAAU,OAAO,OAAO,aAAa,EAAE,MAAM,YAAY,CAAC;","names":[]}
@@ -7,10 +7,10 @@ import { jsx, jsxs } from "react/jsx-runtime";
7
7
  var languageSwitch = tv({
8
8
  slots: {
9
9
  root: "relative inline-flex",
10
- trigger: "group/language inline-flex h-9 shrink-0 select-none items-center gap-1.5 rounded-full px-2.5 font-mono text-xs font-semibold uppercase tracking-wide text-fg-secondary transition-colors hover:bg-surface-3 hover:text-fg aria-expanded:bg-surface-3 aria-expanded:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",
10
+ trigger: "group/language inline-flex h-9 shrink-0 select-none items-center gap-1.5 rounded-full px-2.5 font-mono text-xs font-semibold text-fg-secondary transition-colors hover:bg-surface-3 hover:text-fg aria-expanded:bg-surface-3 aria-expanded:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring",
11
11
  glyph: "h-4 w-4 shrink-0",
12
12
  panel: "kz-pop absolute right-0 top-full z-50 mt-2 grid min-w-44 max-w-[calc(100vw-2rem)] gap-0.5 rounded-xl border border-border-default bg-surface-1 p-1.5 shadow-lg",
13
- heading: "px-2.5 pb-1 pt-1.5 text-[11px] font-semibold uppercase tracking-wider text-fg-secondary",
13
+ heading: "px-2.5 pb-1 pt-1.5 text-[11px] font-semibold text-fg-secondary",
14
14
  item: "flex min-h-9 items-center justify-between gap-6 rounded-lg px-2.5 py-2 text-sm font-medium text-fg no-underline outline-hidden transition-colors hover:bg-surface-2 focus-visible:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring aria-[current=true]:bg-accent-soft",
15
15
  check: "h-4 w-4 shrink-0 text-fg-accent",
16
16
  inline: "inline-flex items-center gap-1 rounded-full border border-border-subtle bg-surface-2/60 p-0.5",
@@ -106,4 +106,4 @@ export {
106
106
  languageSwitch,
107
107
  LanguageSwitch
108
108
  };
109
- //# sourceMappingURL=chunk-3S4GHSPZ.js.map
109
+ //# sourceMappingURL=chunk-63KCDMX2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/language-switch/language-switch.tsx"],"sourcesContent":["// Client (a disclosure). The one language switch of the family: a globe and the current code (FR), opening a short list of\n// the languages by their own names — links with `hreflang` that keep the page. A disclosure, not a Radix menu: the items\n// are navigation, and the bar must not pay for a menu engine (Escape, outside press, focus-out and the arrows are here).\nimport * as React from \"react\";\nimport { tv } from \"tailwind-variants\";\n\nimport type { Language } from \"./href\";\n\nexport const languageSwitch = tv({\n slots: {\n root: \"relative inline-flex\",\n trigger:\n \"group/language inline-flex h-9 shrink-0 select-none items-center gap-1.5 rounded-full px-2.5 font-mono text-xs font-semibold text-fg-secondary transition-colors \" +\n \"hover:bg-surface-3 hover:text-fg aria-expanded:bg-surface-3 aria-expanded:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring\",\n glyph: \"h-4 w-4 shrink-0\",\n panel:\n \"kz-pop absolute right-0 top-full z-50 mt-2 grid min-w-44 max-w-[calc(100vw-2rem)] gap-0.5 rounded-xl border border-border-default bg-surface-1 p-1.5 shadow-lg\",\n heading: \"px-2.5 pb-1 pt-1.5 text-[11px] font-semibold text-fg-secondary\",\n item:\n \"flex min-h-9 items-center justify-between gap-6 rounded-lg px-2.5 py-2 text-sm font-medium text-fg no-underline outline-hidden transition-colors \" +\n \"hover:bg-surface-2 focus-visible:bg-surface-2 focus-visible:ring-2 focus-visible:ring-ring aria-[current=true]:bg-accent-soft\",\n check: \"h-4 w-4 shrink-0 text-fg-accent\",\n inline: \"inline-flex items-center gap-1 rounded-full border border-border-subtle bg-surface-2/60 p-0.5\",\n inlineLink:\n \"inline-flex min-h-9 items-center rounded-full px-3 text-sm font-medium text-fg-secondary no-underline transition-colors hover:text-fg \" +\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring aria-[current=true]:bg-surface-3 aria-[current=true]:text-fg\",\n },\n});\nconst s = languageSwitch();\n\nexport type LanguageSwitchProps = {\n /** The control's accessible name (“Language”, “Langue”) — passed translated. */\n label: string;\n /** The code of the page's language (`fr`). */\n current: string;\n /** The languages offered, each with its name in its own language and the address of the same page (`languagesFor`). */\n languages: readonly Language[];\n /**\n * `menu`: a globe and the code, opening a menu (the bar). `inline`: every language in a row (a mobile panel, a settings page).\n * @default \"menu\"\n */\n variant?: \"menu\" | \"inline\";\n /** Your router's `<Link>` (it receives `href`, `hrefLang`, `lang`). A plain `<a>` otherwise. */\n linkAs?: React.ElementType;\n /** Opens the menu at first render (a story, a screenshot). */\n defaultOpen?: boolean;\n /** Classes of the control. */\n className?: string;\n};\n\nconst Globe = ({ className }: { className?: string }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M3 12h18M12 3c2.5 2.6 3.8 5.6 3.8 9S14.5 18.4 12 21c-2.5-2.6-3.8-5.6-3.8-9S9.5 5.6 12 3Z\" />\n </svg>\n);\n\n/**\n * The language switch, the same on every Krizaka site and app: a compact control — a globe and the current code\n * (`FR`) — that opens a menu of the languages named in their own language (Français · English), each a link with\n * `hreflang` to the same page. It shows the language you are in, never the “other” one. `variant=\"inline\"` lays the\n * languages in a row for a phone's panel or a settings page.\n */\nexport function LanguageSwitch({ label, current, languages, variant = \"menu\", linkAs, defaultOpen = false, className }: LanguageSwitchProps) {\n const Link = linkAs ?? \"a\";\n const id = React.useId();\n const [open, setOpen] = React.useState(defaultOpen);\n const root = React.useRef<HTMLDivElement>(null);\n const trigger = React.useRef<HTMLButtonElement>(null);\n const active = languages.find((l) => l.code === current);\n\n React.useEffect(() => {\n if (!open) return;\n // A press outside closes it (the page under it stays usable).\n const onPress = (e: PointerEvent) => {\n if (e.target instanceof Node && !root.current?.contains(e.target)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPress);\n return () => document.removeEventListener(\"pointerdown\", onPress);\n }, [open]);\n\n if (variant === \"inline\") {\n return (\n <div role=\"group\" aria-label={label} className={s.inline({ className })}>\n {languages.map((l) => (\n <Link key={l.code} href={l.href} hrefLang={l.code} lang={l.code} aria-current={l.code === current ? \"true\" : undefined} className={s.inlineLink()}>\n {l.name}\n </Link>\n ))}\n </div>\n );\n }\n\n const links = () => [...(root.current?.querySelectorAll<HTMLElement>(\"[data-language]\") ?? [])];\n const close = (focus: boolean) => {\n setOpen(false);\n if (focus) trigger.current?.focus();\n };\n return (\n <div\n ref={root}\n className={s.root({ className })}\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && open) {\n e.stopPropagation();\n close(true);\n }\n if (open && (e.key === \"ArrowDown\" || e.key === \"ArrowUp\" || e.key === \"Home\" || e.key === \"End\")) {\n e.preventDefault();\n const all = links();\n const at = all.indexOf(document.activeElement as HTMLElement);\n const next = e.key === \"Home\" ? 0 : e.key === \"End\" ? all.length - 1 : (at + (e.key === \"ArrowDown\" ? 1 : -1) + all.length) % all.length;\n all[next]?.focus();\n }\n }}\n // Tab out of the switch closes it.\n onBlur={(e) => {\n if (open && !root.current?.contains(e.relatedTarget as Node | null)) setOpen(false);\n }}\n >\n <button\n ref={trigger}\n type=\"button\"\n aria-label={active ? `${label}: ${active.name}` : label}\n aria-expanded={open}\n aria-controls={id}\n onClick={() => setOpen(!open)}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n requestAnimationFrame(() => (links().find((l) => l.getAttribute(\"aria-current\") === \"true\") ?? links()[0])?.focus());\n }\n }}\n className={s.trigger()}\n >\n <Globe className={s.glyph()} />\n {/* Drawn by CSS: the code is no text of the button, so its name (`Language: English`) never mismatches what is visible. */}\n <span aria-hidden data-code={current} className=\"after:content-[attr(data-code)]\" />\n </button>\n {open && (\n <div id={id} role=\"group\" aria-label={label} className={s.panel()}>\n <p aria-hidden className={s.heading()}>\n {label}\n </p>\n {languages.map((l) => (\n <Link key={l.code} data-language=\"\" href={l.href} hrefLang={l.code} lang={l.code} aria-current={l.code === current ? \"true\" : undefined} className={s.item()}>\n {l.name}\n {l.code === current && (\n <svg viewBox=\"0 0 24 24\" className={s.check()} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </Link>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;AAGA,YAAY,WAAW;AACvB,SAAS,UAAU;AA+CjB,SACE,KADF;AA3CK,IAAM,iBAAiB,GAAG;AAAA,EAC/B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SACE;AAAA,IAEF,OAAO;AAAA,IACP,OACE;AAAA,IACF,SAAS;AAAA,IACT,MACE;AAAA,IAEF,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YACE;AAAA,EAEJ;AACF,CAAC;AACD,IAAM,IAAI,eAAe;AAsBzB,IAAM,QAAQ,CAAC,EAAE,UAAU,MACzB,qBAAC,SAAI,SAAQ,aAAY,WAAsB,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACzJ;AAAA,sBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,EAC9B,oBAAC,UAAK,GAAE,4FAA2F;AAAA,GACrG;AASK,SAAS,eAAe,EAAE,OAAO,SAAS,WAAW,UAAU,QAAQ,QAAQ,cAAc,OAAO,UAAU,GAAwB;AAC3I,QAAM,OAAO,UAAU;AACvB,QAAM,KAAW,YAAM;AACvB,QAAM,CAAC,MAAM,OAAO,IAAU,eAAS,WAAW;AAClD,QAAM,OAAa,aAAuB,IAAI;AAC9C,QAAM,UAAgB,aAA0B,IAAI;AACpD,QAAM,SAAS,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAEvD,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AAEX,UAAM,UAAU,CAAC,MAAoB;AACnC,UAAI,EAAE,kBAAkB,QAAQ,CAAC,KAAK,SAAS,SAAS,EAAE,MAAM,EAAG,SAAQ,KAAK;AAAA,IAClF;AACA,aAAS,iBAAiB,eAAe,OAAO;AAChD,WAAO,MAAM,SAAS,oBAAoB,eAAe,OAAO;AAAA,EAClE,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,YAAY,UAAU;AACxB,WACE,oBAAC,SAAI,MAAK,SAAQ,cAAY,OAAO,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,GACnE,oBAAU,IAAI,CAAC,MACd,oBAAC,QAAkB,MAAM,EAAE,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,MAAM,gBAAc,EAAE,SAAS,UAAU,SAAS,QAAW,WAAW,EAAE,WAAW,GAC7I,YAAE,QADM,EAAE,IAEb,CACD,GACH;AAAA,EAEJ;AAEA,QAAM,QAAQ,MAAM,CAAC,GAAI,KAAK,SAAS,iBAA8B,iBAAiB,KAAK,CAAC,CAAE;AAC9F,QAAM,QAAQ,CAAC,UAAmB;AAChC,YAAQ,KAAK;AACb,QAAI,MAAO,SAAQ,SAAS,MAAM;AAAA,EACpC;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;AAAA,MAC/B,WAAW,CAAC,MAAM;AAChB,YAAI,EAAE,QAAQ,YAAY,MAAM;AAC9B,YAAE,gBAAgB;AAClB,gBAAM,IAAI;AAAA,QACZ;AACA,YAAI,SAAS,EAAE,QAAQ,eAAe,EAAE,QAAQ,aAAa,EAAE,QAAQ,UAAU,EAAE,QAAQ,QAAQ;AACjG,YAAE,eAAe;AACjB,gBAAM,MAAM,MAAM;AAClB,gBAAM,KAAK,IAAI,QAAQ,SAAS,aAA4B;AAC5D,gBAAM,OAAO,EAAE,QAAQ,SAAS,IAAI,EAAE,QAAQ,QAAQ,IAAI,SAAS,KAAK,MAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,IAAI,UAAU,IAAI;AAClI,cAAI,IAAI,GAAG,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,MAEA,QAAQ,CAAC,MAAM;AACb,YAAI,QAAQ,CAAC,KAAK,SAAS,SAAS,EAAE,aAA4B,EAAG,SAAQ,KAAK;AAAA,MACpF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAY,SAAS,GAAG,KAAK,KAAK,OAAO,IAAI,KAAK;AAAA,YAClD,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,YAC5B,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,aAAa;AACzB,kBAAE,eAAe;AACjB,wBAAQ,IAAI;AACZ,sCAAsB,OAAO,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,cAAc,MAAM,MAAM,KAAK,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC;AAAA,cACrH;AAAA,YACF;AAAA,YACA,WAAW,EAAE,QAAQ;AAAA,YAErB;AAAA,kCAAC,SAAM,WAAW,EAAE,MAAM,GAAG;AAAA,cAE7B,oBAAC,UAAK,eAAW,MAAC,aAAW,SAAS,WAAU,mCAAkC;AAAA;AAAA;AAAA,QACpF;AAAA,QACC,QACC,qBAAC,SAAI,IAAQ,MAAK,SAAQ,cAAY,OAAO,WAAW,EAAE,MAAM,GAC9D;AAAA,8BAAC,OAAE,eAAW,MAAC,WAAW,EAAE,QAAQ,GACjC,iBACH;AAAA,UACC,UAAU,IAAI,CAAC,MACd,qBAAC,QAAkB,iBAAc,IAAG,MAAM,EAAE,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,MAAM,gBAAc,EAAE,SAAS,UAAU,SAAS,QAAW,WAAW,EAAE,KAAK,GACxJ;AAAA,cAAE;AAAA,YACF,EAAE,SAAS,WACV,oBAAC,SAAI,SAAQ,aAAY,WAAW,EAAE,MAAM,GAAG,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAW,MACzJ,8BAAC,UAAK,GAAE,mBAAkB,GAC5B;AAAA,eALO,EAAE,IAOb,CACD;AAAA,WACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}