@krizaka/ui 3.53.0 → 3.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/README.md +1 -0
  2. package/dist/account-menu.d.ts +6 -2
  3. package/dist/account-menu.js +8 -1
  4. package/dist/account-menu.js.map +1 -1
  5. package/dist/account-settings.js +28 -88
  6. package/dist/account-settings.js.map +1 -1
  7. package/dist/anatomy-plate.d.ts +4 -1
  8. package/dist/anatomy-plate.js +4 -0
  9. package/dist/anatomy-plate.js.map +1 -1
  10. package/dist/app-header/search.d.ts +63 -0
  11. package/dist/app-header/search.js +70 -0
  12. package/dist/app-header/search.js.map +1 -0
  13. package/dist/app-header.d.ts +88 -4
  14. package/dist/app-header.js +63 -5
  15. package/dist/app-header.js.map +1 -1
  16. package/dist/app-shell.js +31 -40
  17. package/dist/app-shell.js.map +1 -1
  18. package/dist/argument-card.js +3 -3
  19. package/dist/bird-plate.d.ts +3 -1
  20. package/dist/bird-plate.js +2 -2
  21. package/dist/bird-plate.js.map +1 -1
  22. package/dist/blocks.css +202 -27
  23. package/dist/chapter.d.ts +20 -3
  24. package/dist/chapter.js +82 -31
  25. package/dist/chapter.js.map +1 -1
  26. package/dist/chat.js +2 -2
  27. package/dist/chat.js.map +1 -1
  28. package/dist/checkbox.js +1 -1
  29. package/dist/checkbox.js.map +1 -1
  30. package/dist/chip.js +5 -98
  31. package/dist/chip.js.map +1 -1
  32. package/dist/choice-grid.js +28 -88
  33. package/dist/choice-grid.js.map +1 -1
  34. package/dist/{chunk-YGIN2YIY.js → chunk-3X3OF4TI.js} +2 -2
  35. package/dist/chunk-3X3OF4TI.js.map +1 -0
  36. package/dist/chunk-5VEVYDVC.js +11 -0
  37. package/dist/chunk-5VEVYDVC.js.map +1 -0
  38. package/dist/chunk-7U5TXA5Q.js +105 -0
  39. package/dist/chunk-7U5TXA5Q.js.map +1 -0
  40. package/dist/{chunk-KBQD6HE3.js → chunk-AEP3K4YD.js} +3 -3
  41. package/dist/{chunk-KBQD6HE3.js.map → chunk-AEP3K4YD.js.map} +1 -1
  42. package/dist/chunk-BDIU5LZB.js +18 -0
  43. package/dist/chunk-BDIU5LZB.js.map +1 -0
  44. package/dist/chunk-CSRKYZ53.js +39 -0
  45. package/dist/chunk-CSRKYZ53.js.map +1 -0
  46. package/dist/chunk-HEKDKM5Y.js +128 -0
  47. package/dist/chunk-HEKDKM5Y.js.map +1 -0
  48. package/dist/chunk-KGLRZMCY.js +16 -0
  49. package/dist/chunk-KGLRZMCY.js.map +1 -0
  50. package/dist/chunk-KID32IRJ.js +18 -0
  51. package/dist/chunk-KID32IRJ.js.map +1 -0
  52. package/dist/{chunk-ZQW7LF4Y.js → chunk-OIMXKRXF.js} +2 -2
  53. package/dist/{chunk-YHKTYFOQ.js → chunk-QWKCNSPF.js} +271 -47
  54. package/dist/chunk-QWKCNSPF.js.map +1 -0
  55. package/dist/{chunk-4LYKBSOG.js → chunk-USPOIQV5.js} +2 -2
  56. package/dist/chunk-USPOIQV5.js.map +1 -0
  57. package/dist/{chunk-7NRSPHAF.js → chunk-VB7MWE2N.js} +2 -2
  58. package/dist/{chunk-7NRSPHAF.js.map → chunk-VB7MWE2N.js.map} +1 -1
  59. package/dist/chunk-VIPSZXO4.js +103 -0
  60. package/dist/chunk-VIPSZXO4.js.map +1 -0
  61. package/dist/chunk-YCZ7N6Q6.js +385 -0
  62. package/dist/chunk-YCZ7N6Q6.js.map +1 -0
  63. package/dist/code-block.js +81 -98
  64. package/dist/code-block.js.map +1 -1
  65. package/dist/combobox.js +2 -2
  66. package/dist/component-page.d.ts +4 -1
  67. package/dist/component-page.js +5 -0
  68. package/dist/component-page.js.map +1 -1
  69. package/dist/continue-prompt.d.ts +4 -1
  70. package/dist/continue-prompt.js +4 -0
  71. package/dist/continue-prompt.js.map +1 -1
  72. package/dist/data-table.d.ts +60 -4
  73. package/dist/data-table.js +19 -7
  74. package/dist/date-picker.js +2 -2
  75. package/dist/date-picker.js.map +1 -1
  76. package/dist/detail-layout.d.ts +28 -17
  77. package/dist/detail-layout.js +73 -16
  78. package/dist/detail-layout.js.map +1 -1
  79. package/dist/doodle.d.ts +21 -0
  80. package/dist/doodle.js +39 -0
  81. package/dist/doodle.js.map +1 -0
  82. package/dist/drop-overlay.d.ts +12 -4
  83. package/dist/drop-overlay.js +16 -6
  84. package/dist/drop-overlay.js.map +1 -1
  85. package/dist/elephant.d.ts +2 -0
  86. package/dist/elephant.js +4 -0
  87. package/dist/elephant.js.map +1 -1
  88. package/dist/field.js +1 -1
  89. package/dist/field.js.map +1 -1
  90. package/dist/filter-bar.js +2 -2
  91. package/dist/force-update-screen.d.ts +5 -1
  92. package/dist/force-update-screen.js +4 -0
  93. package/dist/force-update-screen.js.map +1 -1
  94. package/dist/gallery-page.d.ts +4 -1
  95. package/dist/gallery-page.js +4 -0
  96. package/dist/gallery-page.js.map +1 -1
  97. package/dist/genui.js +5 -5
  98. package/dist/image-cropper.d.ts +10 -2
  99. package/dist/image-cropper.js +4 -0
  100. package/dist/image-cropper.js.map +1 -1
  101. package/dist/kanban.d.ts +3 -0
  102. package/dist/kanban.js +4 -0
  103. package/dist/kanban.js.map +1 -1
  104. package/dist/landscape.d.ts +4 -1
  105. package/dist/landscape.js +4 -0
  106. package/dist/landscape.js.map +1 -1
  107. package/dist/list.js +1 -1
  108. package/dist/maintenance-screen.d.ts +5 -1
  109. package/dist/maintenance-screen.js +4 -0
  110. package/dist/maintenance-screen.js.map +1 -1
  111. package/dist/map.js +6 -0
  112. package/dist/map.js.map +1 -1
  113. package/dist/markdown.d.ts +5 -1
  114. package/dist/markdown.js +12 -5
  115. package/dist/markdown.js.map +1 -1
  116. package/dist/match-dialog.d.ts +4 -1
  117. package/dist/match-dialog.js +4 -0
  118. package/dist/match-dialog.js.map +1 -1
  119. package/dist/media-capture.d.ts +6 -1
  120. package/dist/media-capture.js +4 -0
  121. package/dist/media-capture.js.map +1 -1
  122. package/dist/meter.js +5 -121
  123. package/dist/meter.js.map +1 -1
  124. package/dist/native/map.js +6 -0
  125. package/dist/native/map.js.map +1 -1
  126. package/dist/native/markdown.d.ts +9 -2
  127. package/dist/native/markdown.js +46 -7
  128. package/dist/native/markdown.js.map +1 -1
  129. package/dist/native/media-capture.d.ts +1 -0
  130. package/dist/native/media-capture.js +5 -0
  131. package/dist/native/media-capture.js.map +1 -1
  132. package/dist/native/vertical-video.d.ts +8 -2
  133. package/dist/native/vertical-video.js +6 -0
  134. package/dist/native/vertical-video.js.map +1 -1
  135. package/dist/native.d.ts +94 -4
  136. package/dist/native.js +1236 -1110
  137. package/dist/native.js.map +1 -1
  138. package/dist/nav-bar/me.d.ts +32 -0
  139. package/dist/nav-bar/me.js +23 -0
  140. package/dist/nav-bar/me.js.map +1 -0
  141. package/dist/nav-bar.d.ts +60 -2
  142. package/dist/nav-bar.js +92 -48
  143. package/dist/nav-bar.js.map +1 -1
  144. package/dist/notification-preferences.d.ts +151 -0
  145. package/dist/notification-preferences.js +77 -0
  146. package/dist/notification-preferences.js.map +1 -0
  147. package/dist/page-header.js +1 -1
  148. package/dist/page-header.js.map +1 -1
  149. package/dist/pointer-light.js +5 -0
  150. package/dist/pointer-light.js.map +1 -1
  151. package/dist/product-page.d.ts +4 -1
  152. package/dist/product-page.js +4 -0
  153. package/dist/product-page.js.map +1 -1
  154. package/dist/profile-card.d.ts +119 -1
  155. package/dist/profile-card.js +68 -21
  156. package/dist/profile-card.js.map +1 -1
  157. package/dist/promise-card.d.ts +4 -1
  158. package/dist/promise-card.js +4 -0
  159. package/dist/promise-card.js.map +1 -1
  160. package/dist/quota-meter.d.ts +113 -0
  161. package/dist/quota-meter.js +58 -0
  162. package/dist/quota-meter.js.map +1 -0
  163. package/dist/radio-group.js +6 -8
  164. package/dist/radio-group.js.map +1 -1
  165. package/dist/rail-nav.d.ts +18 -2
  166. package/dist/rail-nav.js +25 -2
  167. package/dist/rail-nav.js.map +1 -1
  168. package/dist/retro-tv.d.ts +30 -0
  169. package/dist/retro-tv.js +124 -0
  170. package/dist/retro-tv.js.map +1 -0
  171. package/dist/router.d.ts +12 -1
  172. package/dist/router.js +85 -8
  173. package/dist/router.js.map +1 -1
  174. package/dist/scroll-stage.d.ts +5 -1
  175. package/dist/scroll-stage.js +5 -0
  176. package/dist/scroll-stage.js.map +1 -1
  177. package/dist/search-field.js +1 -1
  178. package/dist/showcase.d.ts +9 -2
  179. package/dist/showcase.js +5 -0
  180. package/dist/showcase.js.map +1 -1
  181. package/dist/signature.d.ts +19 -0
  182. package/dist/signature.js +39 -0
  183. package/dist/signature.js.map +1 -0
  184. package/dist/site-footer.js +1 -1
  185. package/dist/sites.js +1 -1
  186. package/dist/sites.js.map +1 -1
  187. package/dist/slot.d.ts +1 -1
  188. package/dist/stat.js +1 -1
  189. package/dist/stat.js.map +1 -1
  190. package/dist/status-page.d.ts +4 -1
  191. package/dist/status-page.js +5 -0
  192. package/dist/status-page.js.map +1 -1
  193. package/dist/stuck.d.ts +27 -0
  194. package/dist/stuck.js +26 -0
  195. package/dist/stuck.js.map +1 -0
  196. package/dist/swipe-deck.d.ts +9 -2
  197. package/dist/swipe-deck.js +5 -0
  198. package/dist/swipe-deck.js.map +1 -1
  199. package/dist/switch.js +4 -32
  200. package/dist/switch.js.map +1 -1
  201. package/dist/tabs.d.ts +47 -8
  202. package/dist/tabs.js +62 -12
  203. package/dist/tabs.js.map +1 -1
  204. package/dist/tag-input.js +2 -2
  205. package/dist/tag-selector.js +1 -1
  206. package/dist/terminal-replay.d.ts +4 -1
  207. package/dist/terminal-replay.js +4 -0
  208. package/dist/terminal-replay.js.map +1 -1
  209. package/dist/tree-view.js +4 -0
  210. package/dist/tree-view.js.map +1 -1
  211. package/dist/update-prompt.d.ts +5 -1
  212. package/dist/update-prompt.js +4 -0
  213. package/dist/update-prompt.js.map +1 -1
  214. package/dist/video-player.js +7 -376
  215. package/dist/video-player.js.map +1 -1
  216. package/dist/video-trimmer.d.ts +6 -1
  217. package/dist/video-trimmer.js +4 -0
  218. package/dist/video-trimmer.js.map +1 -1
  219. package/package.json +143 -31
  220. package/registry/account-menu.json +9 -8
  221. package/registry/account-settings.json +2 -2
  222. package/registry/achievement.json +3 -4
  223. package/registry/action-bar.json +3 -3
  224. package/registry/action-sheet.json +1 -0
  225. package/registry/activity-feed.json +2 -1
  226. package/registry/agenda.json +1 -1
  227. package/registry/alert.json +1 -1
  228. package/registry/anatomy-plate.json +13 -5
  229. package/registry/app-header.json +470 -23
  230. package/registry/app-shell.json +2 -2
  231. package/registry/argument-card.json +1 -1
  232. package/registry/audio-player.json +1 -1
  233. package/registry/auth-layout.json +1 -1
  234. package/registry/avatar.json +3 -2
  235. package/registry/badge.json +2 -1
  236. package/registry/bird-plate.json +16 -2
  237. package/registry/button.json +7 -6
  238. package/registry/captcha.json +1 -1
  239. package/registry/card-grid.json +1 -1
  240. package/registry/card.json +7 -6
  241. package/registry/catalogue-page.json +3 -4
  242. package/registry/changelog-page.json +3 -5
  243. package/registry/chapter.json +46 -10
  244. package/registry/chat.json +3 -2
  245. package/registry/checkbox.json +4 -3
  246. package/registry/chip-link.json +2 -2
  247. package/registry/chip-row.json +2 -2
  248. package/registry/chip.json +3 -2
  249. package/registry/choice-grid.json +3 -4
  250. package/registry/code-block.json +1 -1
  251. package/registry/combobox.json +3 -2
  252. package/registry/command.json +2 -2
  253. package/registry/comparison-table.json +1 -1
  254. package/registry/component-page.json +14 -5
  255. package/registry/confirm-button.json +4 -4
  256. package/registry/contact-page.json +1 -1
  257. package/registry/continue-prompt.json +13 -5
  258. package/registry/countdown.json +4 -3
  259. package/registry/cover-hero.json +3 -4
  260. package/registry/cta-panel.json +1 -1
  261. package/registry/dashboard-layout.json +1 -1
  262. package/registry/data-table.json +63 -7
  263. package/registry/date-picker.json +5 -4
  264. package/registry/decision-list.json +1 -1
  265. package/registry/description-list.json +2 -1
  266. package/registry/detail-layout.json +30 -6
  267. package/registry/dialog.json +7 -6
  268. package/registry/docs-article-page.json +3 -4
  269. package/registry/docs-hub-page.json +1 -1
  270. package/registry/docs-layout.json +1 -1
  271. package/registry/docs-nav.json +1 -1
  272. package/registry/document-viewer.json +3 -5
  273. package/registry/doodle.json +209 -0
  274. package/registry/drop-overlay.json +30 -16
  275. package/registry/dropdown-menu.json +2 -2
  276. package/registry/elephant.json +15 -7
  277. package/registry/empty-state.json +2 -1
  278. package/registry/engine-flow.json +1 -1
  279. package/registry/error-page.json +3 -5
  280. package/registry/examples/app-header/family.d.ts +4 -0
  281. package/registry/examples/app-header/family.js +41 -0
  282. package/registry/examples/app-header/family.tsx +37 -0
  283. package/registry/examples/app-header/native/family.d.ts +4 -0
  284. package/registry/examples/app-header/native/family.dark.png +0 -0
  285. package/registry/examples/app-header/native/family.js +25 -0
  286. package/registry/examples/app-header/native/family.light.png +0 -0
  287. package/registry/examples/app-header/native/family.tsx +33 -0
  288. package/registry/examples/chapter/album.d.ts +4 -0
  289. package/registry/examples/chapter/album.js +34 -0
  290. package/registry/examples/chapter/album.tsx +30 -0
  291. package/registry/examples/chapter/in-ruled-page.d.ts +4 -0
  292. package/registry/examples/chapter/in-ruled-page.js +23 -0
  293. package/registry/examples/chapter/in-ruled-page.tsx +19 -0
  294. package/registry/examples/data-table/applicant-files.d.ts +4 -0
  295. package/registry/examples/data-table/applicant-files.js +24 -0
  296. package/registry/examples/data-table/applicant-files.tsx +23 -0
  297. package/registry/examples/data-table/checks.d.ts +4 -0
  298. package/registry/examples/data-table/checks.js +25 -0
  299. package/registry/examples/data-table/checks.tsx +24 -0
  300. package/registry/examples/detail-layout/profile.d.ts +4 -0
  301. package/registry/examples/detail-layout/profile.js +26 -0
  302. package/registry/examples/detail-layout/profile.tsx +21 -0
  303. package/registry/examples/doodle/kinds.d.ts +4 -0
  304. package/registry/examples/doodle/kinds.js +17 -0
  305. package/registry/examples/doodle/kinds.tsx +14 -0
  306. package/registry/examples/doodle/margin.d.ts +4 -0
  307. package/registry/examples/doodle/margin.js +17 -0
  308. package/registry/examples/doodle/margin.tsx +17 -0
  309. package/registry/examples/markdown/native/basic.dark.png +0 -0
  310. package/registry/examples/markdown/native/basic.light.png +0 -0
  311. package/registry/examples/markdown/native/wide-table.d.ts +4 -0
  312. package/registry/examples/markdown/native/wide-table.dark.png +0 -0
  313. package/registry/examples/markdown/native/wide-table.js +23 -0
  314. package/registry/examples/markdown/native/wide-table.light.png +0 -0
  315. package/registry/examples/markdown/native/wide-table.tsx +22 -0
  316. package/registry/examples/markdown/wide-table.d.ts +4 -0
  317. package/registry/examples/markdown/wide-table.js +28 -0
  318. package/registry/examples/markdown/wide-table.tsx +23 -0
  319. package/registry/examples/nav-bar/family-product.js +2 -4
  320. package/registry/examples/nav-bar/family-product.tsx +3 -5
  321. package/registry/examples/notification-preferences/default.d.ts +4 -0
  322. package/registry/examples/notification-preferences/default.js +29 -0
  323. package/registry/examples/notification-preferences/default.tsx +28 -0
  324. package/registry/examples/profile-card/banner.d.ts +4 -0
  325. package/registry/examples/profile-card/banner.js +28 -0
  326. package/registry/examples/profile-card/banner.tsx +24 -0
  327. package/registry/examples/profile-card/native/banner.d.ts +4 -0
  328. package/registry/examples/profile-card/native/banner.dark.png +0 -0
  329. package/registry/examples/profile-card/native/banner.js +22 -0
  330. package/registry/examples/profile-card/native/banner.light.png +0 -0
  331. package/registry/examples/profile-card/native/banner.tsx +18 -0
  332. package/registry/examples/quota-meter/default.d.ts +4 -0
  333. package/registry/examples/quota-meter/default.js +26 -0
  334. package/registry/examples/quota-meter/default.tsx +20 -0
  335. package/registry/examples/quota-meter/full.d.ts +4 -0
  336. package/registry/examples/quota-meter/full.js +25 -0
  337. package/registry/examples/quota-meter/full.tsx +18 -0
  338. package/registry/examples/rail-nav/shortcuts.d.ts +4 -0
  339. package/registry/examples/rail-nav/shortcuts.js +49 -0
  340. package/registry/examples/rail-nav/shortcuts.tsx +40 -0
  341. package/registry/examples/retro-tv/cabinet.d.ts +4 -0
  342. package/registry/examples/retro-tv/cabinet.js +12 -0
  343. package/registry/examples/retro-tv/cabinet.tsx +7 -0
  344. package/registry/examples/retro-tv/portable.d.ts +4 -0
  345. package/registry/examples/retro-tv/portable.js +12 -0
  346. package/registry/examples/retro-tv/portable.tsx +7 -0
  347. package/registry/examples/signature/both.d.ts +4 -0
  348. package/registry/examples/signature/both.js +11 -0
  349. package/registry/examples/signature/both.tsx +6 -0
  350. package/registry/examples/signature/variants.d.ts +4 -0
  351. package/registry/examples/signature/variants.js +14 -0
  352. package/registry/examples/signature/variants.tsx +11 -0
  353. package/registry/examples/stuck/card.d.ts +4 -0
  354. package/registry/examples/stuck/card.js +13 -0
  355. package/registry/examples/stuck/card.tsx +14 -0
  356. package/registry/examples/stuck/holds.d.ts +4 -0
  357. package/registry/examples/stuck/holds.js +12 -0
  358. package/registry/examples/stuck/holds.tsx +16 -0
  359. package/registry/examples/stuck/tag.d.ts +4 -0
  360. package/registry/examples/stuck/tag.js +12 -0
  361. package/registry/examples/stuck/tag.tsx +13 -0
  362. package/registry/examples/tabs/binder.d.ts +4 -0
  363. package/registry/examples/tabs/binder.js +22 -0
  364. package/registry/examples/tabs/binder.tsx +20 -0
  365. package/registry/examples/tabs/native/binder.d.ts +4 -0
  366. package/registry/examples/tabs/native/binder.dark.png +0 -0
  367. package/registry/examples/tabs/native/binder.js +26 -0
  368. package/registry/examples/tabs/native/binder.light.png +0 -0
  369. package/registry/examples/tabs/native/binder.tsx +22 -0
  370. package/registry/fab.json +1 -0
  371. package/registry/field.json +3 -2
  372. package/registry/file-upload.json +6 -11
  373. package/registry/filter-bar.json +2 -2
  374. package/registry/flock.json +3 -4
  375. package/registry/footnote.json +2 -3
  376. package/registry/force-update-screen.json +14 -5
  377. package/registry/form.json +5 -4
  378. package/registry/gallery-page.json +14 -5
  379. package/registry/genui.json +2 -2
  380. package/registry/glossary-term.json +1 -1
  381. package/registry/glossary.json +1 -1
  382. package/registry/glow-card.json +2 -2
  383. package/registry/goal-gauge.json +2 -1
  384. package/registry/header.json +1 -0
  385. package/registry/how-it-works-page.json +3 -5
  386. package/registry/image-cropper.json +13 -5
  387. package/registry/image-viewer.json +3 -4
  388. package/registry/index.json +306 -91
  389. package/registry/iso.json +1 -1
  390. package/registry/kanban.json +13 -5
  391. package/registry/kbd.json +1 -1
  392. package/registry/kpi-explained.json +2 -2
  393. package/registry/landing-page.json +3 -5
  394. package/registry/landscape.json +13 -5
  395. package/registry/language-switch.json +1 -1
  396. package/registry/legal-page.json +1 -1
  397. package/registry/link-card.json +1 -1
  398. package/registry/list.json +2 -1
  399. package/registry/loader.json +2 -1
  400. package/registry/longform-page.json +1 -1
  401. package/registry/maintenance-screen.json +14 -5
  402. package/registry/map.json +3 -2
  403. package/registry/markdown.json +86 -9
  404. package/registry/marketing-layout.json +1 -1
  405. package/registry/marquee.json +1 -1
  406. package/registry/mascot-quote.json +1 -1
  407. package/registry/mascot-state.json +12 -11
  408. package/registry/mascots.json +2 -1
  409. package/registry/match-dialog.json +14 -5
  410. package/registry/media-capture.json +14 -5
  411. package/registry/media-gallery.json +3 -5
  412. package/registry/media-grid.json +1 -1
  413. package/registry/media-picker.json +2 -3
  414. package/registry/meta-row.json +2 -1
  415. package/registry/meter.json +4 -3
  416. package/registry/nav-bar.json +100 -9
  417. package/registry/next-actions.json +1 -1
  418. package/registry/notification-preferences.json +250 -0
  419. package/registry/number-ticker.json +2 -1
  420. package/registry/onboarding.json +1 -0
  421. package/registry/opening-hours.json +1 -1
  422. package/registry/otp-input.json +1 -0
  423. package/registry/page-header.json +2 -2
  424. package/registry/page-hero.json +1 -1
  425. package/registry/page-index.json +1 -1
  426. package/registry/page.json +3 -3
  427. package/registry/pagination.json +2 -1
  428. package/registry/permission-prompt.json +2 -2
  429. package/registry/photo-grid.json +4 -4
  430. package/registry/pointer-light.json +6 -2
  431. package/registry/popover.json +2 -2
  432. package/registry/pricing-page.json +4 -6
  433. package/registry/product-page.json +14 -5
  434. package/registry/profile-card.json +232 -8
  435. package/registry/progress.json +4 -3
  436. package/registry/promise-card.json +13 -5
  437. package/registry/pull-to-refresh.json +1 -0
  438. package/registry/quota-meter.json +308 -0
  439. package/registry/radio-group.json +4 -3
  440. package/registry/rail-nav.json +48 -10
  441. package/registry/recipes.json +1 -1
  442. package/registry/retro-tv.json +478 -0
  443. package/registry/router.json +3 -3
  444. package/registry/screen.json +1 -0
  445. package/registry/scroll-stage.json +14 -5
  446. package/registry/search-field.json +3 -2
  447. package/registry/section-backdrop.json +1 -1
  448. package/registry/segmented.json +1 -0
  449. package/registry/separator.json +2 -2
  450. package/registry/service-card.json +1 -1
  451. package/registry/settings-layout.json +2 -1
  452. package/registry/showcase.json +14 -5
  453. package/registry/signature.json +185 -0
  454. package/registry/site-footer.json +3 -3
  455. package/registry/sites.json +2 -2
  456. package/registry/skeleton.json +2 -1
  457. package/registry/skip-link.json +1 -1
  458. package/registry/slider.json +5 -4
  459. package/registry/slot-picker.json +1 -1
  460. package/registry/slot.json +2 -2
  461. package/registry/specimen-tag.json +1 -1
  462. package/registry/spinner.json +4 -3
  463. package/registry/splash-handoff.json +1 -0
  464. package/registry/split-view.json +1 -1
  465. package/registry/stage-banner.json +2 -3
  466. package/registry/stat.json +2 -2
  467. package/registry/status-page.json +13 -5
  468. package/registry/step-progress.json +2 -1
  469. package/registry/step-showcase.json +3 -5
  470. package/registry/stepper.json +2 -1
  471. package/registry/sticky-action.json +1 -1
  472. package/registry/stuck.json +219 -0
  473. package/registry/swipe-deck.json +14 -5
  474. package/registry/swipeable-row.json +1 -0
  475. package/registry/switch.json +3 -2
  476. package/registry/tab-bar.json +1 -0
  477. package/registry/tabs.json +154 -22
  478. package/registry/tag-input.json +1 -1
  479. package/registry/tag-selector.json +2 -1
  480. package/registry/taped-photo.json +1 -1
  481. package/registry/terminal-replay.json +14 -5
  482. package/registry/text-style.json +5 -5
  483. package/registry/theme.json +2 -1
  484. package/registry/toast.json +2 -1
  485. package/registry/toc.json +1 -1
  486. package/registry/tooltip.json +2 -2
  487. package/registry/tree-view.json +6 -2
  488. package/registry/txt.json +1 -0
  489. package/registry/update-prompt.json +14 -5
  490. package/registry/upload-queue.json +1 -1
  491. package/registry/verified-badge.json +6 -6
  492. package/registry/vertical-video.json +8 -3
  493. package/registry/video-player.json +5 -6
  494. package/registry/video-trimmer.json +13 -5
  495. package/registry/virtual.json +2 -2
  496. package/registry/waveform.json +4 -3
  497. package/dist/chunk-4LYKBSOG.js.map +0 -1
  498. package/dist/chunk-HHFWK2HH.js +0 -163
  499. package/dist/chunk-HHFWK2HH.js.map +0 -1
  500. package/dist/chunk-R3LTSMS5.js +0 -75
  501. package/dist/chunk-R3LTSMS5.js.map +0 -1
  502. package/dist/chunk-YGIN2YIY.js.map +0 -1
  503. package/dist/chunk-YHKTYFOQ.js.map +0 -1
  504. /package/dist/{chunk-ZQW7LF4Y.js.map → chunk-OIMXKRXF.js.map} +0 -0
package/dist/blocks.css CHANGED
@@ -53,6 +53,9 @@
53
53
  pointer-events: none;
54
54
  }
55
55
  .kz-frame[data-margin] { --kz-margin-x: max(8px, calc(var(--kz-gutter) - 12px)); }
56
+ /* One margin rule per page (#620): a block that hangs its numbers in a margin (the chapter blocks, a
57
+ Section) inside a page that already draws one keeps its column but draws no second red line. */
58
+ [data-margin] [data-margin]::before { content: none; }
56
59
  .kz-heading-number,
57
60
  .kz-chapter-no,
58
61
  .kz-margin-note {
@@ -91,6 +94,76 @@
91
94
  :is([data-surface="product"], .brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza) :is(.kz-heading-title, .kz-hero-title) {
92
95
  font-weight: 650; /* the serif had one weight; the sans carries the hierarchy with a semibold */
93
96
  }
97
+
98
+ /* ─── The product register, 2027 (ADR-006, krizaka-ui#669) ─────────────────────────────────────────────────────────
99
+ The calm look of the products: slate ink, translucent hairlines, a visible edge on every field, radius 14 on cards, an
100
+ interactive card that answers the hand. Only here: the Cahier sites (www, the blog, ui., java., ts., motion) keep
101
+ ADR-004 (paper, square corners, the quiet hover). The register is a product's ROOT — `data-surface="product"`, or its
102
+ `.brand-<id>` on `<html>` / `<body>`; a `.brand-<id>` wrapper inside a Cahier page (www's product cards, the docs'
103
+ examples) only lends its accent and stays Cahier. Both themes in one rule: `light-dark()` follows the `color-scheme` the tokens pin on `:root`,
104
+ `html.light`, `.theme-dark` and `.theme-light`, so a dark island in a light product stays dark.
105
+ Text roles are ≥ 4.5:1 and the control edge ≥ 3:1 on surfaces 0–2 (product-register.test.ts); a hairline is a
106
+ decoration (1.16:1) and never a field's only edge. `:root:is()` outranks `html.light`; the second selector keeps the
107
+ register inside a theme island of a product. The card rules below read `--kz-card-*`, set here and nowhere else. */
108
+ :is([data-surface="product"], :root:is(.brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza), body:is(.brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza)), :is([data-surface="product"], :root:is(.brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza), body:is(.brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza)) :is(.theme-dark, .theme-light) {
109
+ --kz-surface-0: light-dark(#fbfbfa, #111318);
110
+ --kz-surface-1: light-dark(#ffffff, #171a21);
111
+ --kz-surface-2: light-dark(#f4f4f2, #1e222b);
112
+ --kz-surface-3: light-dark(#f0f0ed, #272c37);
113
+ --kz-text-title: light-dark(#222a3a, #f3f5f9);
114
+ --kz-text-primary: light-dark(#242c3d, #e8ebf1);
115
+ --kz-text-secondary: light-dark(#576275, #a9b1bf);
116
+ --kz-text-muted: light-dark(#646d80, #959eae);
117
+ --kz-border-subtle: light-dark(rgb(28 40 65 / 0.04), rgb(255 255 255 / 0.04));
118
+ --kz-border-default: light-dark(rgb(28 40 65 / 0.08), rgb(255 255 255 / 0.08));
119
+ --kz-border-control: light-dark(#7d8799, #646d7e);
120
+ --kz-border-hover: light-dark(color-mix(in srgb, var(--kz-accent) 22%, transparent), color-mix(in srgb, var(--kz-accent) 30%, transparent));
121
+ --kz-shadow-hover: 0 10px 25px -5px light-dark(rgb(0 0 0 / 0.04), rgb(0 0 0 / 0.5));
122
+ --kz-radius-xs: 4px;
123
+ --kz-radius-sm: 8px;
124
+ --kz-radius-md: 8px;
125
+ --kz-radius-lg: 14px;
126
+ --kz-radius-xl: 14px;
127
+ --kz-radius-2xl: 14px;
128
+ --kz-card-radius: var(--kz-radius-lg);
129
+ --kz-card-hover-shadow: var(--kz-shadow-hover);
130
+ --kz-card-hover-transform: translateY(-1px);
131
+ /* The faces (ADR-006 §2, #670): Plus Jakarta Sans for the titles, Courier Prime for the identifiers and tabular meta
132
+ (« KZ-03 », a reference, a time); code keeps the system monospace and the pen (Krizaka Cahier) is never inside a
133
+ product. The display steps take 550 / 650 and the tracking of a large title (−0.015 em from 24 px, −0.022 em from 40 px);
134
+ the page title and a statistic's value take 700 below. Going back is one token: --kz-font-display: var(--kz-font-sans). */
135
+ --kz-font-display: var(--kz-font-product-display);
136
+ --kz-type-display-2xl-weight: 550;
137
+ --kz-type-display-xl-weight: 550;
138
+ --kz-type-display-lg-weight: 550;
139
+ --kz-type-display-md-weight: 650;
140
+ --kz-type-display-sm-weight: 650;
141
+ --kz-type-display-2xl-tracking: -0.022em;
142
+ --kz-type-display-xl-tracking: -0.022em;
143
+ --kz-type-display-lg-tracking: -0.022em;
144
+ --kz-type-display-md-tracking: -0.015em;
145
+ --kz-type-display-sm-tracking: -0.015em;
146
+ }
147
+ /* Titles at 700 (PageHeader's title, Stat's value) in the title ink. */
148
+ :is([data-surface="product"], :root:is(.brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza), body:is(.brand-orazaka, .brand-orochia, .brand-yasakia, .brand-yororis, .brand-yomizaka, .brand-kachizaka, .brand-akinaza)) :is(.kz-page-title, .kz-stat-value) { font-weight: 700; color: var(--kz-text-title); }
149
+ /* The hover of an INTERACTIVE card only (a link or a button; ADR-006 amends ADR-003 here): the brand border, a soft shadow
150
+ and a 1 px lift in 150 ms. A static card never moves, nothing moves under reduced motion (the border and the shadow
151
+ still answer), a button keeps its colour-only hover. The Cahier sets none of the `--kz-card-hover-*`: it stays quiet. */
152
+ .kz-link-card, a.kz-block-card, button.kz-block-card, [data-interactive] {
153
+ transition: transform 150ms var(--kz-ease, ease), box-shadow 150ms var(--kz-ease, ease), border-color 150ms var(--kz-ease, ease), background-color 150ms var(--kz-ease, ease);
154
+ }
155
+ @media (hover: hover) {
156
+ .kz-link-card:hover, a.kz-block-card:hover, button.kz-block-card:hover, [data-interactive]:hover {
157
+ border-color: var(--kz-border-hover);
158
+ box-shadow: var(--kz-card-hover-shadow, none);
159
+ transform: var(--kz-card-hover-transform, none);
160
+ }
161
+ }
162
+ @media (prefers-reduced-motion: reduce) {
163
+ .kz-link-card, a.kz-block-card, button.kz-block-card, [data-interactive] { transition: none; }
164
+ .kz-link-card:hover, a.kz-block-card:hover, button.kz-block-card:hover, [data-interactive]:hover { transform: none; }
165
+ }
166
+
94
167
  /* Cahier (ADR-004, #417): the eyebrow is a note in the margin's voice — the typewriter face, lower case, untracked,
95
168
  inked in the margin red. No more uppercase tracked overline above every heading. */
96
169
  .kz-eyebrow {
@@ -426,12 +499,12 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
426
499
  .kz-foundation { --kz-rail: color-mix(in srgb, var(--kz-hue, var(--kz-accent)) 50%, var(--kz-border-default)); display: grid; }
427
500
  .kz-foundation-base { position: relative; display: grid; min-width: 0; }
428
501
  .kz-foundation-base::after { content: ""; position: absolute; left: 50%; top: 100%; width: 1px; height: 28px; background: var(--kz-rail); }
429
- .kz-foundation-group { position: relative; margin-top: 28px; padding: 22px 14px 14px; border: 1px solid var(--kz-rail); border-radius: 0; }
502
+ .kz-foundation-group { position: relative; margin-top: 28px; padding: 22px 14px 14px; border: 1px solid var(--kz-rail); border-radius: var(--kz-card-radius, 0); }
430
503
  .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); }
431
504
  .kz-foundation[data-position="end"] .kz-foundation-base { order: 2; }
432
505
  .kz-foundation[data-position="end"] .kz-foundation-group { order: 1; margin-top: 0; margin-bottom: 28px; }
433
506
  .kz-foundation[data-position="end"] .kz-foundation-base::after { top: auto; bottom: 100%; }
434
- @media (max-width: 640px) { .kz-foundation-group { padding: 20px 8px 8px; border-radius: 0; } }
507
+ @media (max-width: 640px) { .kz-foundation-group { padding: 20px 8px 8px; border-radius: var(--kz-card-radius, 0); } }
435
508
 
436
509
  /* The shared surface of the cards: a rail of the hue along the top, and one quiet hover (krizaka-ui#393) — the surface
437
510
  goes one step up and the hairline strengthens, in a short colour transition. Nothing moves, nothing follows the
@@ -440,7 +513,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
440
513
  position: relative;
441
514
  isolation: isolate;
442
515
  overflow: hidden;
443
- border-radius: 0;
516
+ border-radius: var(--kz-card-radius, 0);
444
517
  background: var(--kz-surface-1);
445
518
  border: 1px solid var(--kz-border-default);
446
519
  transition: background-color 150ms var(--kz-ease, ease), border-color 150ms var(--kz-ease, ease);
@@ -643,7 +716,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
643
716
 
644
717
  /* ─── DecisionList: one card per decision — what was chosen, large; refused · because · what it costs, side by side ─── */
645
718
  .kz-decisions { margin: 0; padding: 0; list-style: none; display: grid; gap: 14px; }
646
- .kz-decision { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 18px; padding: 20px 22px; border-radius: 0; background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
719
+ .kz-decision { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 18px; padding: 20px 22px; border-radius: var(--kz-card-radius, 0); background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
647
720
  .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: var(--kz-figures, lining-nums tabular-nums); color: var(--kz-hue-text, var(--kz-accent-text)); }
648
721
  .kz-decision-body { display: grid; gap: 14px; min-width: 0; }
649
722
  .kz-decision-part p:not(.kz-label) { margin: 6px 0 0; font-size: 14px; line-height: 1.6; color: var(--kz-text-secondary); }
@@ -661,7 +734,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
661
734
  @media (max-width: 560px) { .kz-decision { grid-template-columns: minmax(0, 1fr); gap: 10px; padding: 18px; } .kz-decision-n { font-size: 22px; } }
662
735
 
663
736
  /* ─── CodeBlock · CodeTabs: a file name, code that scrolls sideways (never shrinks), a copy button ─── */
664
- .kz-code { margin: 0; min-width: 0; overflow: hidden; border-radius: 0; background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); box-shadow: inset 3px 0 0 var(--kz-hue, var(--kz-accent)); }
737
+ .kz-code { margin: 0; min-width: 0; overflow: hidden; border-radius: var(--kz-card-radius, 0); background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); box-shadow: inset 3px 0 0 var(--kz-hue, var(--kz-accent)); }
665
738
  .kz-code-bar {
666
739
  display: flex;
667
740
  align-items: center;
@@ -704,7 +777,9 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
704
777
  .kz-code .kz-line-dim, .kz-code pre[data-focus] .th-line:not(.kz-line-focus) { color: var(--kz-text-secondary); }
705
778
  .kz-code .kz-line-dim .th-token, .kz-code pre[data-focus] .th-line:not(.kz-line-focus) .th-token { color: inherit; font-weight: inherit; }
706
779
  /* Markdown (TanStack Markdown's AST on the tokens): reading text, nothing decorative. */
707
- .kz-md { min-width: 0; color: var(--kz-text-primary); font-size: 15px; line-height: 1.7; overflow-wrap: anywhere; }
780
+ .kz-md { min-width: 0; color: var(--kz-text-primary); font-size: 15px; line-height: 1.7; overflow-wrap: break-word; }
781
+ .kz-md :is(p, li, a, th, td) { overflow-wrap: break-word; }
782
+ .kz-md pre { white-space: pre; overflow-wrap: normal; }
708
783
  .kz-md > * { margin-block: 0; }
709
784
  .kz-md > * + * { margin-top: 0.9em; }
710
785
  .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; }
@@ -722,9 +797,24 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
722
797
  .kz-md :not(pre) > code { padding: 0.12em 0.4em; border-radius: 6px; font-family: var(--kz-font-mono); font-size: 0.88em; background: var(--kz-surface-3); }
723
798
  .kz-md hr { border: 0; border-top: 1px solid var(--kz-border-default); }
724
799
  .kz-md img { max-width: 100%; height: auto; border-radius: 0; }
725
- .kz-md-table { overflow-x: auto; }
726
- .kz-md-table table { width: 100%; border-collapse: collapse; font-size: 0.93em; }
800
+ .kz-md-table {
801
+ overflow-x: auto;
802
+ border: 1px solid var(--kz-border-subtle);
803
+ background:
804
+ linear-gradient(to right, var(--kz-surface-1) 30%, transparent) left / 32px 100%,
805
+ linear-gradient(to left, var(--kz-surface-1) 30%, transparent) right / 32px 100%,
806
+ linear-gradient(to right, color-mix(in srgb, var(--kz-text-primary) 20%, transparent), transparent) left / 10px 100%,
807
+ linear-gradient(to left, color-mix(in srgb, var(--kz-text-primary) 20%, transparent), transparent) right / 10px 100%;
808
+ background-color: var(--kz-surface-1);
809
+ background-repeat: no-repeat;
810
+ background-attachment: local, local, scroll, scroll;
811
+ }
812
+ .kz-md-table:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); outline-offset: -2px; }
813
+ .kz-md-table table { width: max-content; min-width: 100%; border-collapse: collapse; font-size: 0.93em; }
727
814
  .kz-md-table :is(th, td) { padding: 0.55em 0.8em; text-align: start; border-bottom: 1px solid var(--kz-border-subtle); }
815
+ .kz-md-cell { display: inline-block; vertical-align: top; width: max-content; min-width: min-content; max-width: 36ch; }
816
+ .kz-md-table :is(th, td):first-child { width: 1%; white-space: nowrap; }
817
+ .kz-md-table :is(th, td) code { white-space: nowrap; }
728
818
  .kz-md-table th { font-weight: 700; color: var(--kz-text-secondary); background: var(--kz-surface-2); }
729
819
  .kz-md [data-footnotes] { font-size: 0.9em; color: var(--kz-text-secondary); border-top: 1px solid var(--kz-border-subtle); padding-top: 0.8em; }
730
820
  /* A text still arriving: a caret where it goes on (still under reduced motion). */
@@ -792,7 +882,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
792
882
  justify-content: space-between;
793
883
  gap: 20px;
794
884
  padding: 24px 26px;
795
- border-radius: 0;
885
+ border-radius: var(--kz-card-radius, 0);
796
886
  background: color-mix(in srgb, var(--kz-hue, var(--kz-accent)) 8%, var(--kz-surface-1));
797
887
  border: 1px solid color-mix(in srgb, var(--kz-hue, var(--kz-accent)) 30%, var(--kz-border-default));
798
888
  }
@@ -834,7 +924,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
834
924
  .kz-tpl-split[data-reverse] > :first-child { order: 2; }
835
925
  @media (max-width: 900px) { .kz-tpl-split { grid-template-columns: minmax(0, 1fr); } .kz-tpl-split[data-reverse] > :first-child { order: 0; } }
836
926
  .kz-tpl-stage {
837
- position: relative; min-width: 0; overflow: hidden; border-radius: 0; border: 1px solid var(--kz-border-default); background: var(--kz-surface-1);
927
+ position: relative; min-width: 0; overflow: hidden; border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default); background: var(--kz-surface-1);
838
928
  box-shadow: var(--kz-shadow-md);
839
929
  }
840
930
  .kz-tpl-stage-bar { display: flex; align-items: center; gap: 6px; padding: 9px 12px; border-bottom: 1px solid var(--kz-border-subtle); background: var(--kz-surface-2);
@@ -853,7 +943,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
853
943
 
854
944
  /* A bento: features of different weights on a six-column grid (one column on a phone). */
855
945
  .kz-tpl-bento { margin: 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 14px; }
856
- .kz-tpl-bento > li { grid-column: span 2; display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: 22px; border-radius: 0;
946
+ .kz-tpl-bento > li { grid-column: span 2; display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: 22px; border-radius: var(--kz-card-radius, 0);
857
947
  background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
858
948
  .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)); }
859
949
  .kz-tpl-bento > li[data-size="md"] { grid-column: span 3; }
@@ -885,7 +975,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
885
975
  /* A gallery: media in columns of different heights, the featured one wide. */
886
976
  .kz-tpl-gallery { margin: 0; padding: 0; list-style: none; columns: 3 280px; column-gap: 14px; }
887
977
  .kz-tpl-gallery > li { break-inside: avoid; margin-bottom: 14px; }
888
- .kz-tpl-figure { margin: 0; overflow: hidden; border-radius: 0; border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
978
+ .kz-tpl-figure { margin: 0; overflow: hidden; border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
889
979
  .kz-tpl-figure-media { overflow: hidden; background: var(--kz-media); }
890
980
  .kz-tpl-figure-media > :is(img, video) { display: block; width: 100%; height: auto; }
891
981
  .kz-tpl-figure figcaption { display: grid; gap: 4px; padding: 12px 14px; }
@@ -898,7 +988,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
898
988
  .kz-tpl-hub-search > * { width: 100%; }
899
989
  .kz-tpl-hub-hints { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; font-size: 13px; color: var(--kz-text-secondary); }
900
990
  .kz-tpl-collections { margin: 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: 14px; }
901
- .kz-tpl-collection { position: relative; isolation: isolate; overflow: hidden; display: flex; flex-direction: column; gap: 12px; height: 100%; padding: 20px; border-radius: 0;
991
+ .kz-tpl-collection { position: relative; isolation: isolate; overflow: hidden; display: flex; flex-direction: column; gap: 12px; height: 100%; padding: 20px; border-radius: var(--kz-card-radius, 0);
902
992
  background: linear-gradient(160deg, color-mix(in srgb, var(--kz-accent) 14%, var(--kz-surface-1)), var(--kz-surface-1) 55%);
903
993
  border: 1px solid color-mix(in srgb, var(--kz-accent) 28%, var(--kz-border-default)); }
904
994
  .kz-tpl-collection-head { display: flex; align-items: center; gap: 10px; }
@@ -956,7 +1046,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
956
1046
  .kz-tpl-count { margin: 0; font-family: var(--kz-font-mono); font-size: 12px; color: var(--kz-text-secondary); }
957
1047
  @media (max-width: 900px) {
958
1048
  .kz-tpl-catalogue { grid-template-columns: minmax(0, 1fr); gap: 16px; }
959
- .kz-tpl-catalogue-filters { position: static; border-radius: 0; border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
1049
+ .kz-tpl-catalogue-filters { position: static; border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
960
1050
  .kz-tpl-catalogue-filters > summary { display: flex; align-items: center; justify-content: space-between; min-height: 44px; padding: 0 14px; cursor: pointer; list-style: none;
961
1051
  font-size: 14px; font-weight: 650; color: var(--kz-text-primary); }
962
1052
  .kz-tpl-catalogue-filters > summary::-webkit-details-marker { display: none; }
@@ -1014,7 +1104,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1014
1104
  /* Contact: the ways to reach us beside the form; what happens next under it. */
1015
1105
  .kz-tpl-contact { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr); gap: clamp(24px, 4vw, 48px); align-items: start; }
1016
1106
  @media (max-width: 900px) { .kz-tpl-contact { grid-template-columns: minmax(0, 1fr); } }
1017
- .kz-tpl-form { padding: clamp(18px, 3vw, 28px); border-radius: 0; background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
1107
+ .kz-tpl-form { padding: clamp(18px, 3vw, 28px); border-radius: var(--kz-card-radius, 0); background: var(--kz-surface-1); border: 1px solid var(--kz-border-default); }
1018
1108
  .kz-tpl-next { margin: 0; padding: 0; list-style: none; counter-reset: next; display: grid; gap: 12px; }
1019
1109
  .kz-tpl-next li { counter-increment: next; display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 12px; font-size: 14px; line-height: 1.6; color: var(--kz-text-secondary); }
1020
1110
  .kz-tpl-next li::before { content: counter(next); display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 50%;
@@ -1022,7 +1112,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1022
1112
  .kz-tpl-next strong { display: block; color: var(--kz-text-primary); }
1023
1113
 
1024
1114
  /* Status: one line per service, its state in words and a dot; an incident log under it. */
1025
- .kz-tpl-state { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 20px; padding: 18px 20px; border-radius: 0; border: 1px solid var(--kz-border-default);
1115
+ .kz-tpl-state { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 20px; padding: 18px 20px; border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default);
1026
1116
  background: var(--kz-surface-1); }
1027
1117
  .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)); }
1028
1118
  .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)); }
@@ -1033,7 +1123,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1033
1123
  [data-state="degraded"] > .kz-tpl-dot, .kz-tpl-dot[data-state="degraded"] { background: var(--kz-warning); }
1034
1124
  [data-state="outage"] > .kz-tpl-dot, .kz-tpl-dot[data-state="outage"] { background: var(--kz-danger); }
1035
1125
  [data-state="building"] > .kz-tpl-dot, .kz-tpl-dot[data-state="building"] { background: var(--kz-info); }
1036
- .kz-tpl-services { margin: 16px 0 0; padding: 0; list-style: none; border-radius: 0; border: 1px solid var(--kz-border-default); overflow: hidden; }
1126
+ .kz-tpl-services { margin: 16px 0 0; padding: 0; list-style: none; border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default); overflow: hidden; }
1037
1127
  .kz-tpl-services li { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; border-top: 1px solid var(--kz-border-subtle);
1038
1128
  font-size: 14.5px; color: var(--kz-text-primary); background: var(--kz-surface-1); }
1039
1129
  .kz-tpl-services li:first-child { border-top: 0; }
@@ -1049,7 +1139,7 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1049
1139
 
1050
1140
  /* Pricing: plans side by side, the featured one lifted; a comparison under them. */
1051
1141
  .kz-tpl-plans { margin: 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr)); gap: 14px; align-items: stretch; }
1052
- .kz-tpl-plan { position: relative; display: flex; flex-direction: column; gap: 14px; height: 100%; padding: 24px; border-radius: 0; background: var(--kz-surface-1);
1142
+ .kz-tpl-plan { position: relative; display: flex; flex-direction: column; gap: 14px; height: 100%; padding: 24px; border-radius: var(--kz-card-radius, 0); background: var(--kz-surface-1);
1053
1143
  border: 1px solid var(--kz-border-default); }
1054
1144
  .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%);
1055
1145
  box-shadow: var(--kz-shadow-md); }
@@ -1064,9 +1154,9 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1064
1154
  .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); }
1065
1155
  .kz-tpl-compare thead th { font-family: var(--kz-font-mono); font-size: 11px; letter-spacing: 0; text-transform: none; }
1066
1156
  .kz-tpl-compare tbody th { color: var(--kz-text-primary); font-weight: 600; }
1067
- .kz-tpl-scroll { overflow-x: auto; border-radius: 0; border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
1157
+ .kz-tpl-scroll { overflow-x: auto; border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
1068
1158
  .kz-tpl-faq { display: grid; gap: 8px; }
1069
- .kz-tpl-faq details { border-radius: 0; border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
1159
+ .kz-tpl-faq details { border-radius: var(--kz-card-radius, 0); border: 1px solid var(--kz-border-default); background: var(--kz-surface-1); }
1070
1160
  .kz-tpl-faq summary { display: flex; align-items: center; min-height: 48px; padding: 0 16px; cursor: pointer; list-style: none; font-size: 15px; font-weight: 650; color: var(--kz-text-primary); }
1071
1161
  .kz-tpl-faq summary::-webkit-details-marker { display: none; }
1072
1162
  .kz-tpl-faq summary:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); outline-offset: 2px; border-radius: 0; }
@@ -1172,23 +1262,71 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1172
1262
  --kz-tape-w: clamp(54px, 8vw, 92px); --kz-tape-h: clamp(17px, 2.4vw, 26px);
1173
1263
  padding: clamp(7px, 1.2vw, 14px); background: var(--kz-print); transform: rotate(var(--kz-taped-tilt, -1.6deg)); transform-origin: 50% 60%;
1174
1264
  box-shadow: 0 1px 0 hsl(30 20% 8% / 0.22), 2px 4px 0 hsl(30 20% 8% / 0.14), 4px 8px 0 -2px hsl(30 20% 8% / 0.08); }
1265
+ .kz-stuck-body { --kz-tape: hsl(46 58% 82% / 0.72); --kz-tape-w: clamp(54px, 8vw, 92px); --kz-tape-h: clamp(17px, 2.4vw, 26px); }
1175
1266
  :root:not(.light) .kz-taped { --kz-print: hsl(42 22% 88%); --kz-tape: hsl(46 40% 70% / 0.62); }
1176
- .kz-taped::before, .kz-taped::after { content: ""; position: absolute; z-index: 1; width: var(--kz-tape-w); height: var(--kz-tape-h); background: var(--kz-tape);
1267
+ :root:not(.light) .kz-stuck-body { --kz-tape: hsl(46 40% 70% / 0.62); }
1268
+ /* Stuck's tape is this tape: the same strip, the same torn ends — one rule, two selectors. */
1269
+ .kz-taped::before, .kz-taped::after, .kz-stuck-body:is([data-hold="tape"], [data-hold="tape-corners"])::before, .kz-stuck-body:is([data-hold="tape"], [data-hold="tape-corners"])::after { content: ""; position: absolute; z-index: 1; width: var(--kz-tape-w); height: var(--kz-tape-h); background: var(--kz-tape);
1177
1270
  box-shadow: 0 1px 0 hsl(30 20% 8% / 0.2); pointer-events: none;
1178
1271
  clip-path: polygon(0 8%, 4% 0, 8% 10%, 12% 0, 100% 0, 96% 25%, 100% 50%, 96% 75%, 100% 100%, 12% 100%, 8% 90%, 4% 100%, 0 92%); }
1179
- .kz-taped::before { top: calc(-0.55 * var(--kz-tape-h)); left: calc(-0.35 * var(--kz-tape-w)); transform: rotate(-34deg); }
1180
- .kz-taped::after { bottom: calc(-0.55 * var(--kz-tape-h)); right: calc(-0.35 * var(--kz-tape-w)); transform: rotate(-34deg); }
1181
- .kz-taped[data-tape="top"]::before { top: calc(-0.5 * var(--kz-tape-h)); left: calc(50% - var(--kz-tape-w) / 2); transform: rotate(-3deg); }
1182
- .kz-taped[data-tape="top"]::after, .kz-taped[data-tape="none"]::before, .kz-taped[data-tape="none"]::after { display: none; }
1272
+ .kz-taped::before, .kz-stuck-body[data-hold="tape-corners"]::before { top: calc(-0.55 * var(--kz-tape-h)); left: calc(-0.35 * var(--kz-tape-w)); transform: rotate(-34deg); }
1273
+ .kz-taped::after, .kz-stuck-body[data-hold="tape-corners"]::after { bottom: calc(-0.55 * var(--kz-tape-h)); right: calc(-0.35 * var(--kz-tape-w)); transform: rotate(-34deg); }
1274
+ .kz-taped[data-tape="top"]::before, .kz-stuck-body[data-hold="tape"]::before { top: calc(-0.5 * var(--kz-tape-h)); left: calc(50% - var(--kz-tape-w) / 2); transform: rotate(-3deg); }
1275
+ .kz-taped[data-tape="top"]::after, .kz-taped[data-tape="none"]::before, .kz-taped[data-tape="none"]::after, .kz-stuck-body[data-hold="tape"]::after { display: none; }
1183
1276
  .kz-taped-picture { position: relative; overflow: hidden; }
1184
1277
  .kz-taped-picture > img, .kz-taped-picture > video { display: block; width: 100%; height: auto; }
1185
1278
  .kz-taped-caption { margin: 0; padding: 10px 4px 2px; font-family: var(--kz-font-mono); font-size: 13px; line-height: 20px; color: var(--kz-print-ink); }
1186
1279
  @media (max-width: 640px) {
1187
1280
  .kz-taped { transform: rotate(calc(var(--kz-taped-tilt, -1.6deg) * 0.6)); }
1188
- .kz-taped::before { left: -4px; } .kz-taped::after { right: -4px; }
1189
- .kz-taped[data-tape="top"]::before { left: calc(50% - var(--kz-tape-w) / 2); }
1281
+ .kz-taped::before, .kz-stuck-body[data-hold="tape-corners"]::before { left: -4px; } .kz-taped::after, .kz-stuck-body[data-hold="tape-corners"]::after { right: -4px; }
1282
+ .kz-taped[data-tape="top"]::before, .kz-stuck-body[data-hold="tape"]::before { left: calc(50% - var(--kz-tape-w) / 2); }
1190
1283
  }
1191
1284
 
1285
+ /* ─── Stuck (ADR-004): any block stuck into the notebook — held by tape (TapedPhoto's, above), a pin, photo corners or a
1286
+ lifted edge. The outer element stays still (it carries the doodles); the body leans by `--kz-stuck-tilt` (a transform:
1287
+ nothing shifts) on the hard paper shadow. A TapedPhoto or a SpecimenTag inside gives its own lean, shadow and tape up. ─── */
1288
+ .kz-stuck { position: relative; }
1289
+ .kz-stuck-body { position: relative; transform: rotate(var(--kz-stuck-tilt, 0deg)); transform-origin: 50% 60%; --kz-stuck-fold: var(--kz-paper-tag); --kz-stuck-metal: var(--kz-paper-tag-edge);
1290
+ box-shadow: var(--kz-shadow-floating); }
1291
+ .kz-stuck-body > :is(.kz-taped, .kz-tag) { transform: none; box-shadow: none; }
1292
+ .kz-stuck-body > .kz-taped::before, .kz-stuck-body > .kz-taped::after { display: none; }
1293
+ .kz-stuck-pin { position: absolute; z-index: 2; top: -7px; left: calc(50% - 7px); width: 14px; height: 14px; border-radius: 9999px; pointer-events: none;
1294
+ background: var(--kz-paper-rule-margin); box-shadow: inset -2px -2px 0 var(--kz-edge-well), var(--kz-shadow-floating); }
1295
+ .kz-stuck-body[data-hold="corner"]::before { content: ""; position: absolute; z-index: 1; inset: -3px; pointer-events: none;
1296
+ background:
1297
+ linear-gradient(135deg, var(--kz-stuck-fold) 50%, transparent 50%) top left / 18px 18px no-repeat,
1298
+ linear-gradient(225deg, var(--kz-stuck-fold) 50%, transparent 50%) top right / 18px 18px no-repeat,
1299
+ linear-gradient(315deg, var(--kz-stuck-fold) 50%, transparent 50%) bottom right / 18px 18px no-repeat,
1300
+ linear-gradient(45deg, var(--kz-stuck-fold) 50%, transparent 50%) bottom left / 18px 18px no-repeat; }
1301
+ .kz-stuck-body[data-hold="glue"]::after { content: ""; position: absolute; z-index: 1; right: 0; bottom: 0; width: 20px; height: 20px; pointer-events: none;
1302
+ background: linear-gradient(135deg, transparent 50%, var(--kz-stuck-fold) 50%); box-shadow: -2px -2px 0 var(--kz-stuck-metal); }
1303
+ @media (max-width: 640px) { .kz-stuck-body { transform: rotate(calc(var(--kz-stuck-tilt, 0deg) * 0.6)); } }
1304
+
1305
+ /* ─── Doodle (ADR-004): a margin doodle — in the margin ink, never over text. Beside the block only where the page's margin
1306
+ is wide enough to hold it (1360 px and up); below that it is gone (`place="inline"` stays in the flow). ─── */
1307
+ .kz-doodle { display: none; position: relative; width: 56px; color: var(--kz-paper-rule-margin); pointer-events: none; transform: rotate(var(--kz-doodle-tilt, 0deg)); }
1308
+ .kz-doodle[data-place="inline"] { display: inline-block; }
1309
+ .kz-doodle svg { display: block; width: 100%; height: auto; overflow: visible; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
1310
+ .kz-doodle[data-side="right"] svg { transform: scaleX(-1); }
1311
+ .kz-doodle[data-kind="circle"] { width: 72px; }
1312
+ .kz-doodle-word { position: absolute; inset: 0; display: grid; place-items: center; font-family: var(--kz-font-cahier, var(--kz-font-display)); font-size: 18px; line-height: 24px; color: var(--kz-text-secondary); }
1313
+ @media (min-width: 1360px) {
1314
+ .kz-doodle[data-place="margin"] { display: block; position: absolute; top: var(--kz-doodle-top, 0px); right: calc(100% + 16px); }
1315
+ .kz-doodle[data-place="margin"][data-side="right"] { right: auto; left: calc(100% + 16px); }
1316
+ .kz-stuck:has(> .kz-doodle[data-place="margin"][data-side="left"]) { margin-left: 96px; width: calc(100% - 96px); }
1317
+ .kz-stuck:has(> .kz-doodle[data-place="margin"][data-side="right"]) { margin-right: 96px; width: calc(100% - 96px); }
1318
+ .kz-stuck:has(> .kz-doodle[data-place="margin"][data-side="left"]):has(> .kz-doodle[data-place="margin"][data-side="right"]) { width: calc(100% - 192px); }
1319
+ }
1320
+
1321
+ /* ─── Signature (ADR-004): the house signs the page — the mark as an ink stamp, the name in the notebook's pen, one ink
1322
+ (the host's text role: chalk on slate, ink on paper), a slight grain from the SVG filter. Fixed sizes: nothing shifts. ─── */
1323
+ .kz-signature { position: relative; display: inline-flex; align-items: center; gap: 14px; color: var(--kz-text-primary); }
1324
+ .kz-signature-defs { position: absolute; width: 0; height: 0; }
1325
+ .kz-signature-stamp { flex: none; width: 48px; height: 48px; transform: rotate(-6deg); }
1326
+ .kz-signature-text { display: grid; gap: 2px; transform: rotate(-2deg); transform-origin: 0 100%; }
1327
+ .kz-signature-name { font-family: var(--kz-font-cahier, var(--kz-font-display)); font-size: 26px; line-height: 32px; white-space: nowrap; }
1328
+ .kz-signature-date { font-family: var(--kz-font-mono); font-size: 12px; line-height: 16px; color: var(--kz-text-secondary); }
1329
+
1192
1330
  .kz-plate, .kz-anatomy {
1193
1331
  margin: 0;
1194
1332
  padding: 20px 24px 24px;
@@ -1335,6 +1473,43 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1335
1473
  .kz-chapter-detail { display: block; padding-left: 0; }
1336
1474
  }
1337
1475
 
1476
+ /* The album (#621): each chapter is its cover as a taped print beside its words, the rows alternating left and right and
1477
+ the prints facing each other (the tilt is set per row). One grid per row — margin · print · words — whose middle rows
1478
+ hold the title, the line and the period, so the number shares the title's baseline and the words sit centred on the
1479
+ print. The print keeps its own aspect-ratio (the cover's width and height), so nothing shifts while it loads. Light:
1480
+ no card, no border, the lines of the paper run under it all; nothing moves. */
1481
+ .kz-chapters[data-variant="album"] { --kz-chapters-max: 60rem; --kz-album-print: minmax(0, 5fr); --kz-album-words: minmax(0, 6fr); }
1482
+ .kz-chapters[data-variant="album"] .kz-chapter-row {
1483
+ grid-template-columns: var(--kz-margin-x) var(--kz-album-print) var(--kz-album-words);
1484
+ grid-template-rows: 1fr auto auto auto 1fr;
1485
+ padding-block: var(--kz-chapter-line);
1486
+ }
1487
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) { grid-template-columns: var(--kz-margin-x) var(--kz-album-words) var(--kz-album-print); }
1488
+ .kz-chapters[data-variant="album"] .kz-chapter-print { grid-column: 2; grid-row: 1 / -1; align-self: center; margin: 16px 32px 16px var(--kz-chapter-gap); }
1489
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) .kz-chapter-print { grid-column: 3; margin: 16px 28px 16px 32px; }
1490
+ .kz-chapters[data-variant="album"] .kz-chapter-row > :not(.kz-chapter-print, .kz-chapter-no) { grid-column: 3; }
1491
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) > :not(.kz-chapter-print, .kz-chapter-no) { grid-column: 2; }
1492
+ .kz-chapters[data-variant="album"] .kz-chapter-no { grid-column: 1; grid-row: 2; }
1493
+ .kz-chapters[data-variant="album"] .kz-chapter-link { grid-row: 2; font-size: clamp(1.3125rem, 2.4vw, 1.625rem); line-height: 1.25; text-wrap: balance; }
1494
+ .kz-chapters[data-variant="album"] .kz-chapter-detail { grid-row: 3; max-width: 36ch; margin-top: 8px; font-size: 1rem; line-height: 1.5; text-wrap: pretty; }
1495
+ .kz-chapters[data-variant="album"] .kz-chapter-period { grid-row: 4; margin-top: 12px; padding-left: var(--kz-chapter-gap); }
1496
+ /* A phone: one column — the print above its words (at most 60 % wide, still tilted), the number beside the title. */
1497
+ @container (max-width: 34rem) {
1498
+ /* `:nth-child(n)` lifts these over the wide rows' alternation: on a phone every row is the same column. */
1499
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) {
1500
+ display: grid;
1501
+ grid-template-columns: var(--kz-margin-x) minmax(0, 1fr);
1502
+ grid-template-rows: auto;
1503
+ padding: 0 0 var(--kz-chapter-line);
1504
+ }
1505
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) .kz-chapter-print {
1506
+ grid-column: 2; grid-row: 1; justify-self: start; width: 60%; margin: 20px 0 24px calc(var(--kz-chapter-gap) + 4px);
1507
+ }
1508
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) .kz-chapter-print { justify-self: end; margin: 20px 12px 24px 0; }
1509
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) > :not(.kz-chapter-print, .kz-chapter-no) { grid-column: 2; display: block; padding-left: var(--kz-chapter-gap); }
1510
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) .kz-chapter-no { display: block; width: auto; margin: 0; }
1511
+ }
1512
+
1338
1513
  /* The foot: the previous and the next as two rows of the index, then one quiet line back to the story. */
1339
1514
  .kz-chapter-row[data-dir] .kz-chapter-period { color: var(--kz-text-secondary); }
1340
1515
  .kz-chapter-back { margin: 0; padding-left: calc(var(--kz-margin-x) + var(--kz-chapter-gap)); font-size: 14.5px; line-height: var(--kz-chapter-line); }
package/dist/chapter.d.ts CHANGED
@@ -18,6 +18,17 @@ interface ChapterEntry {
18
18
  isNew?: boolean;
19
19
  /** The page the reader is on. */
20
20
  current?: boolean;
21
+ /** Its cover, drawn by the `album` variant as a taped print. Decorative there (`alt=""`): the title carries the link. */
22
+ cover?: ChapterCover;
23
+ }
24
+ /** A chapter's cover: its intrinsic size gives the print its aspect-ratio, so nothing shifts while it loads. */
25
+ interface ChapterCover {
26
+ src: string;
27
+ width: number;
28
+ height: number;
29
+ srcSet?: string;
30
+ /** @default "(max-width: 34rem) 60vw, 26rem" */
31
+ sizes?: string;
21
32
  }
22
33
  type ChapterIndexProps = Omit<React.OlHTMLAttributes<HTMLOListElement>, "children"> & {
23
34
  /** The chapters, in reading order. */
@@ -30,9 +41,15 @@ type ChapterIndexProps = Omit<React.OlHTMLAttributes<HTMLOListElement>, "childre
30
41
  paper?: ChapterPaper;
31
42
  /** The app's router link (Next's `Link`), so internal chapters prefetch. */
32
43
  linkAs?: LinkComponent;
44
+ /**
45
+ * `lines` — one ruled line per chapter (the compact index); `album` — each chapter's `cover` as a taped print beside
46
+ * its title, its `detail` (one short line) and its period, the rows alternating left and right.
47
+ * @default "lines"
48
+ */
49
+ variant?: "lines" | "album";
33
50
  };
34
- /** The chapters of a story as a sober timeline: one ruled line each, the number in the margin, the title the link. */
35
- declare function ChapterIndex({ chapters, newLabel, label, paper, linkAs, className, ...props }: ChapterIndexProps): React.JSX.Element;
51
+ /** The chapters of a story as a sober timeline: one ruled line each (or a taped print each), the number in the margin, the title the link. */
52
+ declare function ChapterIndex({ chapters, newLabel, label, paper, linkAs, variant, className, ...props }: ChapterIndexProps): React.JSX.Element;
36
53
  type ChapterHeadProps = Omit<React.HTMLAttributes<HTMLElement>, "title"> & {
37
54
  /** The chapter's number, hung in the margin: `01`, `Chapitre 1`. */
38
55
  number: React.ReactNode;
@@ -86,4 +103,4 @@ type ChapterFootProps = Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
86
103
  /** The foot of a chapter: the previous and the next on the ruled lines, then one line back to the story. */
87
104
  declare function ChapterFoot({ previous, next, back, labels, label, paper, linkAs, className, ...props }: ChapterFootProps): React.JSX.Element;
88
105
 
89
- export { type ChapterEntry, ChapterFoot, type ChapterFootProps, ChapterHead, type ChapterHeadProps, ChapterIndex, type ChapterIndexProps, type ChapterLink, LinkComponent };
106
+ export { type ChapterCover, type ChapterEntry, ChapterFoot, type ChapterFootProps, ChapterHead, type ChapterHeadProps, ChapterIndex, type ChapterIndexProps, type ChapterLink, LinkComponent };
package/dist/chapter.js CHANGED
@@ -5,8 +5,43 @@ import {
5
5
  cn
6
6
  } from "./chunk-W675RFOA.js";
7
7
 
8
+ // src/taped-photo/taped-photo.tsx
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ function TapedPhoto({ children, caption, tilt = -1.6, tape = "corners", className, style, ...props }) {
11
+ return /* @__PURE__ */ jsxs(
12
+ "figure",
13
+ {
14
+ className: cn("kz-taped", className),
15
+ "data-tape": tape === "corners" ? void 0 : tape,
16
+ style: { ...style, ["--kz-taped-tilt"]: `${tilt}deg` },
17
+ ...props,
18
+ children: [
19
+ /* @__PURE__ */ jsx("div", { className: "kz-taped-picture", children }),
20
+ caption ? /* @__PURE__ */ jsx("figcaption", { className: "kz-taped-caption", children: caption }) : null
21
+ ]
22
+ }
23
+ );
24
+ }
25
+
8
26
  // src/chapter/chapter.tsx
9
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
27
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
28
+ var EAGER_COVERS = 2;
29
+ var ALBUM_TILT = 1.4;
30
+ function ChapterPrint({ cover, index }) {
31
+ return /* @__PURE__ */ jsx2(TapedPhoto, { className: "kz-chapter-print", tilt: index % 2 === 0 ? -ALBUM_TILT : ALBUM_TILT, "aria-hidden": true, children: /* @__PURE__ */ jsx2(
32
+ "img",
33
+ {
34
+ src: cover.src,
35
+ srcSet: cover.srcSet,
36
+ sizes: cover.srcSet ? cover.sizes ?? "(max-width: 34rem) 60vw, 26rem" : void 0,
37
+ width: cover.width,
38
+ height: cover.height,
39
+ alt: "",
40
+ loading: index < EAGER_COVERS ? "eager" : "lazy",
41
+ decoding: "async"
42
+ }
43
+ ) });
44
+ }
10
45
  function ChapterRow({
11
46
  number,
12
47
  title,
@@ -18,46 +53,62 @@ function ChapterRow({
18
53
  rel,
19
54
  linkAs
20
55
  }) {
21
- return /* @__PURE__ */ jsxs(Fragment, { children: [
22
- /* @__PURE__ */ jsx("span", { className: "kz-chapter-no", children: number }),
23
- /* @__PURE__ */ jsxs(BlockLink, { href, linkAs, rel, className: "kz-chapter-link", "aria-current": current ? "page" : void 0, children: [
24
- /* @__PURE__ */ jsx("span", { className: "kz-chapter-title", children: title }),
25
- mark && /* @__PURE__ */ jsxs(Fragment, { children: [
56
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
57
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-no", children: number }),
58
+ /* @__PURE__ */ jsxs2(BlockLink, { href, linkAs, rel, className: "kz-chapter-link", "aria-current": current ? "page" : void 0, children: [
59
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-title", children: title }),
60
+ mark && /* @__PURE__ */ jsxs2(Fragment, { children: [
26
61
  " ",
27
- /* @__PURE__ */ jsx("span", { className: "kz-chapter-new", children: mark })
62
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-new", children: mark })
28
63
  ] })
29
64
  ] }),
30
- aside && /* @__PURE__ */ jsxs(Fragment, { children: [
65
+ aside && /* @__PURE__ */ jsxs2(Fragment, { children: [
31
66
  " ",
32
- /* @__PURE__ */ jsx("span", { className: "kz-chapter-period", children: aside })
67
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-period", children: aside })
33
68
  ] }),
34
- detail && /* @__PURE__ */ jsx("span", { className: "kz-chapter-detail", children: detail })
69
+ detail && /* @__PURE__ */ jsx2("span", { className: "kz-chapter-detail", children: detail })
35
70
  ] });
36
71
  }
37
- function ChapterIndex({ chapters, newLabel = "New", label, paper = "lines", linkAs, className, ...props }) {
72
+ function ChapterIndex({ chapters, newLabel = "New", label, paper = "lines", linkAs, variant = "lines", className, ...props }) {
73
+ const album = variant === "album";
38
74
  return (
39
75
  // `role="list"`: a list without bullets is still a list to VoiceOver.
40
- /* @__PURE__ */ jsx("ol", { role: "list", "aria-label": label, "data-paper": paper || void 0, "data-margin": "", className: cn("kz-chapters", className), ...props, children: chapters.map((c, i) => /* @__PURE__ */ jsx("li", { className: "kz-chapter-row", "data-new": c.isNew ? "" : void 0, "data-detail": c.detail ? "" : void 0, children: /* @__PURE__ */ jsx(ChapterRow, { number: c.number, title: c.title, href: c.href, aside: c.period, mark: c.isNew ? newLabel : void 0, detail: c.detail, current: c.current, linkAs }) }, i)) })
76
+ /* @__PURE__ */ jsx2(
77
+ "ol",
78
+ {
79
+ role: "list",
80
+ "aria-label": label,
81
+ "data-paper": paper || void 0,
82
+ "data-margin": "",
83
+ "data-variant": album ? "album" : void 0,
84
+ className: cn("kz-chapters", className),
85
+ ...props,
86
+ children: chapters.map((c, i) => /* @__PURE__ */ jsxs2("li", { className: "kz-chapter-row", "data-new": c.isNew ? "" : void 0, "data-detail": c.detail ? "" : void 0, children: [
87
+ album && c.cover && /* @__PURE__ */ jsx2(ChapterPrint, { cover: c.cover, index: i }),
88
+ /* @__PURE__ */ jsx2(ChapterRow, { number: c.number, title: c.title, href: c.href, aside: c.period, mark: c.isNew ? newLabel : void 0, detail: c.detail, current: c.current, linkAs })
89
+ ] }, i))
90
+ }
91
+ )
41
92
  );
42
93
  }
43
94
  function ChapterHead({ number, title, period, readingTime, faced, built, versusLabels, level = 1, className, children, ...props }) {
44
95
  const H = level === 1 ? "h1" : "h2";
45
96
  const meta = [period, readingTime].filter((m) => m !== void 0 && m !== null && m !== "");
46
- return /* @__PURE__ */ jsxs("header", { "data-margin": "", className: cn("kz-chapter-head", className), ...props, children: [
47
- /* @__PURE__ */ jsx("p", { className: "kz-chapter-no", children: number }),
48
- /* @__PURE__ */ jsx(H, { className: "kz-chapter-head-title", children: title }),
49
- meta.length > 0 && /* @__PURE__ */ jsx("p", { className: "kz-chapter-meta", children: meta.map((m, i) => /* @__PURE__ */ jsxs("span", { children: [
50
- i > 0 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: " \xB7 " }),
97
+ return /* @__PURE__ */ jsxs2("header", { "data-margin": "", className: cn("kz-chapter-head", className), ...props, children: [
98
+ /* @__PURE__ */ jsx2("p", { className: "kz-chapter-no", children: number }),
99
+ /* @__PURE__ */ jsx2(H, { className: "kz-chapter-head-title", children: title }),
100
+ meta.length > 0 && /* @__PURE__ */ jsx2("p", { className: "kz-chapter-meta", children: meta.map((m, i) => /* @__PURE__ */ jsxs2("span", { children: [
101
+ i > 0 && /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: " \xB7 " }),
51
102
  m
52
103
  ] }, i)) }),
53
- faced && built && /* @__PURE__ */ jsxs("p", { className: "kz-chapter-standfirst", children: [
54
- versusLabels && /* @__PURE__ */ jsxs("span", { className: "kz-sr-only", children: [
104
+ faced && built && /* @__PURE__ */ jsxs2("p", { className: "kz-chapter-standfirst", children: [
105
+ versusLabels && /* @__PURE__ */ jsxs2("span", { className: "kz-sr-only", children: [
55
106
  versusLabels[0],
56
107
  ", "
57
108
  ] }),
58
109
  faced,
59
- /* @__PURE__ */ jsx("span", { className: "kz-chapter-arrow", "aria-hidden": true, children: " \u2192 " }),
60
- versusLabels && /* @__PURE__ */ jsxs("span", { className: "kz-sr-only", children: [
110
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-arrow", "aria-hidden": true, children: " \u2192 " }),
111
+ versusLabels && /* @__PURE__ */ jsxs2("span", { className: "kz-sr-only", children: [
61
112
  "; ",
62
113
  versusLabels[1],
63
114
  ", "
@@ -78,9 +129,9 @@ function ChapterFoot({
78
129
  className,
79
130
  ...props
80
131
  }) {
81
- return /* @__PURE__ */ jsxs("nav", { "aria-label": label, "data-paper": paper || void 0, "data-margin": "", className: cn("kz-chapters kz-chapter-foot", className), ...props, children: [
82
- /* @__PURE__ */ jsxs("ul", { role: "list", children: [
83
- previous && /* @__PURE__ */ jsx("li", { className: "kz-chapter-row", "data-dir": "previous", children: /* @__PURE__ */ jsx(
132
+ return /* @__PURE__ */ jsxs2("nav", { "aria-label": label, "data-paper": paper || void 0, "data-margin": "", className: cn("kz-chapters kz-chapter-foot", className), ...props, children: [
133
+ /* @__PURE__ */ jsxs2("ul", { role: "list", children: [
134
+ previous && /* @__PURE__ */ jsx2("li", { className: "kz-chapter-row", "data-dir": "previous", children: /* @__PURE__ */ jsx2(
84
135
  ChapterRow,
85
136
  {
86
137
  number: previous.number,
@@ -88,13 +139,13 @@ function ChapterFoot({
88
139
  href: previous.href,
89
140
  rel: "prev",
90
141
  linkAs,
91
- aside: /* @__PURE__ */ jsxs(Fragment, { children: [
92
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u2190 " }),
142
+ aside: /* @__PURE__ */ jsxs2(Fragment, { children: [
143
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: "\u2190 " }),
93
144
  labels.previous
94
145
  ] })
95
146
  }
96
147
  ) }),
97
- next && /* @__PURE__ */ jsx("li", { className: "kz-chapter-row", "data-dir": "next", children: /* @__PURE__ */ jsx(
148
+ next && /* @__PURE__ */ jsx2("li", { className: "kz-chapter-row", "data-dir": "next", children: /* @__PURE__ */ jsx2(
98
149
  ChapterRow,
99
150
  {
100
151
  number: next.number,
@@ -102,15 +153,15 @@ function ChapterFoot({
102
153
  href: next.href,
103
154
  rel: "next",
104
155
  linkAs,
105
- aside: /* @__PURE__ */ jsxs(Fragment, { children: [
156
+ aside: /* @__PURE__ */ jsxs2(Fragment, { children: [
106
157
  labels.next,
107
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: " \u2192" })
158
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: " \u2192" })
108
159
  ] })
109
160
  }
110
161
  ) })
111
162
  ] }),
112
- back && /* @__PURE__ */ jsx("p", { className: "kz-chapter-back", children: /* @__PURE__ */ jsxs(BlockLink, { href: back.href, linkAs, className: "kz-chapter-back-link", children: [
113
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: "\u21A9 " }),
163
+ back && /* @__PURE__ */ jsx2("p", { className: "kz-chapter-back", children: /* @__PURE__ */ jsxs2(BlockLink, { href: back.href, linkAs, className: "kz-chapter-back-link", children: [
164
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: "\u21A9 " }),
114
165
  back.label
115
166
  ] }) })
116
167
  ] });