@krizaka/ui 3.52.0 → 3.54.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 (210) hide show
  1. package/dist/action-bar.js +1 -1
  2. package/dist/argument-card.js +2 -2
  3. package/dist/blocks.css +148 -0
  4. package/dist/chapter.d.ts +106 -0
  5. package/dist/chapter.js +174 -0
  6. package/dist/chapter.js.map +1 -0
  7. package/dist/choice-grid.js +1 -1
  8. package/dist/choice-grid.js.map +1 -1
  9. package/dist/{chunk-IBDTAMPF.js → chunk-7JG3VR4C.js} +2 -2
  10. package/dist/{chunk-C7LTF5CC.js → chunk-ENOS6ETI.js} +2 -2
  11. package/dist/{chunk-C7LTF5CC.js.map → chunk-ENOS6ETI.js.map} +1 -1
  12. package/dist/{chunk-2AGSO3WH.js → chunk-FVGFPB73.js} +2 -2
  13. package/dist/{chunk-2AGSO3WH.js.map → chunk-FVGFPB73.js.map} +1 -1
  14. package/dist/cover-hero.js +1 -1
  15. package/dist/link-card.js +2 -2
  16. package/dist/media-grid.js +1 -1
  17. package/dist/media-grid.js.map +1 -1
  18. package/dist/page-hero.js +1 -1
  19. package/dist/page-index.js +1 -1
  20. package/dist/service-card.js +1 -1
  21. package/dist/slot-picker.js +1 -1
  22. package/package.json +17 -3
  23. package/registry/account-menu.json +1 -1
  24. package/registry/account-settings.json +1 -1
  25. package/registry/achievement.json +1 -1
  26. package/registry/action-bar.json +2 -2
  27. package/registry/activity-feed.json +1 -1
  28. package/registry/agenda.json +1 -1
  29. package/registry/alert.json +1 -1
  30. package/registry/anatomy-plate.json +1 -1
  31. package/registry/app-header.json +1 -1
  32. package/registry/app-shell.json +1 -1
  33. package/registry/argument-card.json +2 -2
  34. package/registry/audio-player.json +1 -1
  35. package/registry/auth-layout.json +1 -1
  36. package/registry/avatar.json +1 -1
  37. package/registry/badge.json +1 -1
  38. package/registry/bird-plate.json +1 -1
  39. package/registry/button.json +1 -1
  40. package/registry/captcha.json +1 -1
  41. package/registry/card-grid.json +1 -1
  42. package/registry/card.json +1 -1
  43. package/registry/catalogue-page.json +1 -1
  44. package/registry/changelog-page.json +1 -1
  45. package/registry/chapter.json +514 -0
  46. package/registry/chat.json +1 -1
  47. package/registry/checkbox.json +1 -1
  48. package/registry/chip-link.json +1 -1
  49. package/registry/chip-row.json +1 -1
  50. package/registry/chip.json +1 -1
  51. package/registry/choice-grid.json +2 -2
  52. package/registry/code-block.json +1 -1
  53. package/registry/combobox.json +1 -1
  54. package/registry/command.json +1 -1
  55. package/registry/comparison-table.json +1 -1
  56. package/registry/component-page.json +1 -1
  57. package/registry/confirm-button.json +1 -1
  58. package/registry/contact-page.json +1 -1
  59. package/registry/continue-prompt.json +1 -1
  60. package/registry/countdown.json +1 -1
  61. package/registry/cover-hero.json +2 -2
  62. package/registry/cta-panel.json +1 -1
  63. package/registry/dashboard-layout.json +1 -1
  64. package/registry/data-table.json +1 -1
  65. package/registry/date-picker.json +1 -1
  66. package/registry/decision-list.json +1 -1
  67. package/registry/description-list.json +1 -1
  68. package/registry/detail-layout.json +1 -1
  69. package/registry/dialog.json +1 -1
  70. package/registry/docs-article-page.json +1 -1
  71. package/registry/docs-hub-page.json +1 -1
  72. package/registry/docs-layout.json +1 -1
  73. package/registry/docs-nav.json +1 -1
  74. package/registry/document-viewer.json +1 -1
  75. package/registry/drop-overlay.json +1 -1
  76. package/registry/dropdown-menu.json +1 -1
  77. package/registry/elephant.json +2 -2
  78. package/registry/empty-state.json +1 -1
  79. package/registry/engine-flow.json +1 -1
  80. package/registry/error-page.json +1 -1
  81. package/registry/examples/chapter/album.d.ts +4 -0
  82. package/registry/examples/chapter/album.js +34 -0
  83. package/registry/examples/chapter/album.tsx +30 -0
  84. package/registry/examples/chapter/detail.d.ts +4 -0
  85. package/registry/examples/chapter/detail.js +21 -0
  86. package/registry/examples/chapter/detail.tsx +16 -0
  87. package/registry/examples/chapter/foot.d.ts +4 -0
  88. package/registry/examples/chapter/foot.js +20 -0
  89. package/registry/examples/chapter/foot.tsx +15 -0
  90. package/registry/examples/chapter/head.d.ts +4 -0
  91. package/registry/examples/chapter/head.js +22 -0
  92. package/registry/examples/chapter/head.tsx +17 -0
  93. package/registry/examples/chapter/in-ruled-page.d.ts +4 -0
  94. package/registry/examples/chapter/in-ruled-page.js +23 -0
  95. package/registry/examples/chapter/in-ruled-page.tsx +19 -0
  96. package/registry/examples/chapter/index.d.ts +4 -0
  97. package/registry/examples/chapter/index.js +34 -0
  98. package/registry/examples/chapter/index.tsx +30 -0
  99. package/registry/examples/chapter/reading-page.d.ts +4 -0
  100. package/registry/examples/chapter/reading-page.js +34 -0
  101. package/registry/examples/chapter/reading-page.tsx +25 -0
  102. package/registry/field.json +1 -1
  103. package/registry/file-upload.json +1 -1
  104. package/registry/filter-bar.json +1 -1
  105. package/registry/flock.json +1 -1
  106. package/registry/footnote.json +1 -1
  107. package/registry/force-update-screen.json +1 -1
  108. package/registry/form.json +1 -1
  109. package/registry/gallery-page.json +1 -1
  110. package/registry/genui.json +1 -1
  111. package/registry/glossary-term.json +1 -1
  112. package/registry/glossary.json +1 -1
  113. package/registry/glow-card.json +1 -1
  114. package/registry/goal-gauge.json +1 -1
  115. package/registry/how-it-works-page.json +1 -1
  116. package/registry/image-cropper.json +1 -1
  117. package/registry/index.json +38 -6
  118. package/registry/iso.json +1 -1
  119. package/registry/kanban.json +1 -1
  120. package/registry/kbd.json +1 -1
  121. package/registry/kpi-explained.json +1 -1
  122. package/registry/landing-page.json +1 -1
  123. package/registry/landscape.json +1 -1
  124. package/registry/language-switch.json +1 -1
  125. package/registry/legal-page.json +1 -1
  126. package/registry/link-card.json +2 -2
  127. package/registry/list.json +1 -1
  128. package/registry/loader.json +1 -1
  129. package/registry/longform-page.json +1 -1
  130. package/registry/maintenance-screen.json +1 -1
  131. package/registry/map.json +2 -2
  132. package/registry/markdown.json +1 -1
  133. package/registry/marketing-layout.json +1 -1
  134. package/registry/marquee.json +1 -1
  135. package/registry/mascot-quote.json +1 -1
  136. package/registry/mascot-state.json +1 -1
  137. package/registry/mascots.json +1 -1
  138. package/registry/match-dialog.json +1 -1
  139. package/registry/media-capture.json +1 -1
  140. package/registry/media-gallery.json +1 -1
  141. package/registry/media-grid.json +2 -2
  142. package/registry/meta-row.json +1 -1
  143. package/registry/meter.json +1 -1
  144. package/registry/nav-bar.json +2 -2
  145. package/registry/next-actions.json +1 -1
  146. package/registry/number-ticker.json +1 -1
  147. package/registry/opening-hours.json +1 -1
  148. package/registry/page-header.json +1 -1
  149. package/registry/page-hero.json +2 -2
  150. package/registry/page-index.json +2 -2
  151. package/registry/page.json +1 -1
  152. package/registry/pagination.json +1 -1
  153. package/registry/photo-grid.json +1 -1
  154. package/registry/pointer-light.json +1 -1
  155. package/registry/popover.json +1 -1
  156. package/registry/pricing-page.json +1 -1
  157. package/registry/product-page.json +1 -1
  158. package/registry/profile-card.json +1 -1
  159. package/registry/progress.json +1 -1
  160. package/registry/promise-card.json +1 -1
  161. package/registry/radio-group.json +1 -1
  162. package/registry/rail-nav.json +2 -2
  163. package/registry/recipes.json +1 -1
  164. package/registry/router.json +1 -1
  165. package/registry/scroll-stage.json +1 -1
  166. package/registry/search-field.json +1 -1
  167. package/registry/section-backdrop.json +1 -1
  168. package/registry/separator.json +1 -1
  169. package/registry/service-card.json +2 -2
  170. package/registry/settings-layout.json +1 -1
  171. package/registry/showcase.json +1 -1
  172. package/registry/site-footer.json +2 -2
  173. package/registry/sites.json +1 -1
  174. package/registry/skeleton.json +1 -1
  175. package/registry/skip-link.json +1 -1
  176. package/registry/slider.json +1 -1
  177. package/registry/slot-picker.json +2 -2
  178. package/registry/slot.json +1 -1
  179. package/registry/specimen-tag.json +1 -1
  180. package/registry/spinner.json +1 -1
  181. package/registry/split-view.json +1 -1
  182. package/registry/stage-banner.json +1 -1
  183. package/registry/stat.json +1 -1
  184. package/registry/status-page.json +1 -1
  185. package/registry/step-progress.json +1 -1
  186. package/registry/step-showcase.json +1 -1
  187. package/registry/stepper.json +1 -1
  188. package/registry/sticky-action.json +1 -1
  189. package/registry/swipe-deck.json +1 -1
  190. package/registry/switch.json +1 -1
  191. package/registry/tabs.json +1 -1
  192. package/registry/tag-input.json +1 -1
  193. package/registry/tag-selector.json +1 -1
  194. package/registry/taped-photo.json +1 -1
  195. package/registry/terminal-replay.json +1 -1
  196. package/registry/text-style.json +1 -1
  197. package/registry/theme.json +1 -1
  198. package/registry/toast.json +1 -1
  199. package/registry/toc.json +1 -1
  200. package/registry/tooltip.json +1 -1
  201. package/registry/tree-view.json +1 -1
  202. package/registry/update-prompt.json +1 -1
  203. package/registry/upload-queue.json +1 -1
  204. package/registry/verified-badge.json +1 -1
  205. package/registry/vertical-video.json +1 -1
  206. package/registry/video-player.json +1 -1
  207. package/registry/video-trimmer.json +1 -1
  208. package/registry/virtual.json +1 -1
  209. package/registry/waveform.json +1 -1
  210. /package/dist/{chunk-IBDTAMPF.js.map → chunk-7JG3VR4C.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  BlockLink,
3
3
  isExternal
4
- } from "./chunk-2AGSO3WH.js";
4
+ } from "./chunk-FVGFPB73.js";
5
5
  import {
6
6
  ExternalGlyph
7
7
  } from "./chunk-XCBVFMNV.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  cardHoverClass
3
- } from "./chunk-IBDTAMPF.js";
3
+ } from "./chunk-7JG3VR4C.js";
4
4
  import {
5
5
  Facts
6
6
  } from "./chunk-YKEIOYJ5.js";
7
7
  import {
8
8
  BlockLink
9
- } from "./chunk-2AGSO3WH.js";
9
+ } from "./chunk-FVGFPB73.js";
10
10
  import {
11
11
  ArrowGlyph,
12
12
  ChevronGlyph
package/dist/blocks.css CHANGED
@@ -53,7 +53,11 @@
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,
60
+ .kz-chapter-no,
57
61
  .kz-margin-note {
58
62
  font-family: var(--kz-font-mono);
59
63
  font-size: 13px;
@@ -1260,6 +1264,150 @@ a.kz-fact:focus-visible { outline: 2px solid var(--kz-ring, var(--kz-accent)); o
1260
1264
  .kz-footnotes li::marker { font-family: var(--kz-font-mono); color: var(--kz-paper-rule-margin); }
1261
1265
  .kz-fn-back { color: var(--kz-accent-text); text-decoration: none; }
1262
1266
 
1267
+ /* ChapterIndex, ChapterHead, ChapterFoot (#617) — the chapters of a story on the notebook's lines, never boxes. Every row is
1268
+ one ruled line (--kz-chapter-line = the paper's module, 32 px): the number hangs in the margin left of the red rule
1269
+ (`[data-margin]`, moved to --kz-margin-x), the serif title is the link and its hit area is the whole row, the period is
1270
+ quiet on the right (under the title in a narrow column). The ruling is `[data-paper="lines"]`, shifted so a major line
1271
+ runs under the titles' baseline (--kz-chapter-baseline, in em of the title). No border per row, nothing moves. */
1272
+ .kz-chapters {
1273
+ --kz-chapter-line: var(--kz-paper-module, 32px);
1274
+ --kz-chapter-pad: var(--kz-paper-line, 8px);
1275
+ --kz-chapter-baseline: calc(var(--kz-chapter-line) / 2 + 0.36em);
1276
+ --kz-chapter-gap: 16px;
1277
+ container-type: inline-size;
1278
+ box-sizing: border-box;
1279
+ max-width: var(--kz-chapters-max, 46rem); /* the period stays within reach of its title */
1280
+ margin: 0;
1281
+ padding: var(--kz-chapter-pad) 0;
1282
+ list-style: none;
1283
+ font-size: 1.1875rem;
1284
+ }
1285
+ .kz-chapters[data-margin], .kz-chapter-head[data-margin] { --kz-margin-x: 3rem; }
1286
+ .kz-chapters[data-paper] { background-position: 0 calc(var(--kz-chapter-pad) + var(--kz-chapter-baseline)); }
1287
+ .kz-chapters ul { margin: 0; padding: 0; list-style: none; }
1288
+ .kz-chapter-row {
1289
+ position: relative;
1290
+ display: grid;
1291
+ grid-template-columns: var(--kz-margin-x) minmax(0, 1fr) auto;
1292
+ align-items: baseline;
1293
+ min-height: var(--kz-chapter-line);
1294
+ line-height: var(--kz-chapter-line);
1295
+ }
1296
+ .kz-chapter-row .kz-chapter-no { grid-column: 1; padding-right: 12px; text-align: right; white-space: nowrap; }
1297
+ .kz-chapter-link {
1298
+ grid-column: 2;
1299
+ min-width: 0;
1300
+ padding-left: var(--kz-chapter-gap);
1301
+ font-family: var(--kz-font-display);
1302
+ font-weight: 400;
1303
+ line-height: var(--kz-chapter-line);
1304
+ color: var(--kz-text-primary);
1305
+ text-decoration: none;
1306
+ overflow-wrap: anywhere;
1307
+ }
1308
+ .kz-chapter-link::after { content: ""; position: absolute; inset: 0; }
1309
+ .kz-chapter-link:focus-visible { outline: none; }
1310
+ .kz-chapter-link:focus-visible::after { outline: var(--kz-ring-width, 2px) solid var(--kz-ring); outline-offset: 0; }
1311
+ .kz-chapter-title { text-decoration-line: none; text-decoration-thickness: 1.5px; text-underline-offset: 0.2em; }
1312
+ .kz-chapter-link:is(:hover, :focus-visible) .kz-chapter-title { text-decoration-line: underline; text-decoration-color: var(--kz-hue, var(--kz-accent)); }
1313
+ .kz-chapter-link[aria-current="page"] .kz-chapter-title { text-decoration-line: underline; text-decoration-color: var(--kz-paper-rule-margin); }
1314
+ .kz-chapter-new,
1315
+ .kz-chapter-period,
1316
+ .kz-chapter-meta {
1317
+ font-family: var(--kz-font-mono);
1318
+ font-size: 12.5px;
1319
+ line-height: 16px;
1320
+ font-variant-numeric: var(--kz-figures, lining-nums tabular-nums);
1321
+ }
1322
+ .kz-chapter-new { margin-left: 4px; white-space: nowrap; color: var(--kz-hue-text, var(--kz-accent-text)); }
1323
+ .kz-chapter-period { grid-column: 3; padding-left: var(--kz-chapter-gap); white-space: nowrap; color: var(--kz-text-secondary); }
1324
+ .kz-chapter-detail { grid-column: 2 / -1; padding-left: var(--kz-chapter-gap); font-size: 14.5px; color: var(--kz-text-secondary); }
1325
+ /* A narrow column: the row flows as text with a hanging indent — the number still in the margin (inline, so it shares the
1326
+ title's baseline), the title wraps from line to line, the period runs on after its last word: two ruled lines at most. */
1327
+ @container (max-width: 34rem) {
1328
+ .kz-chapter-row { display: block; padding-left: calc(var(--kz-margin-x) + var(--kz-chapter-gap)); }
1329
+ .kz-chapter-row .kz-chapter-no {
1330
+ display: inline-block;
1331
+ box-sizing: border-box;
1332
+ width: var(--kz-margin-x);
1333
+ margin-left: calc(-1 * (var(--kz-margin-x) + var(--kz-chapter-gap)));
1334
+ margin-right: var(--kz-chapter-gap);
1335
+ }
1336
+ .kz-chapter-link { display: inline; padding-left: 0; }
1337
+ .kz-chapter-period { display: inline-block; padding-left: 0; }
1338
+ .kz-chapter-detail { display: block; padding-left: 0; }
1339
+ }
1340
+
1341
+ /* The album (#621): each chapter is its cover as a taped print beside its words, the rows alternating left and right and
1342
+ the prints facing each other (the tilt is set per row). One grid per row — margin · print · words — whose middle rows
1343
+ hold the title, the line and the period, so the number shares the title's baseline and the words sit centred on the
1344
+ print. The print keeps its own aspect-ratio (the cover's width and height), so nothing shifts while it loads. Light:
1345
+ no card, no border, the lines of the paper run under it all; nothing moves. */
1346
+ .kz-chapters[data-variant="album"] { --kz-chapters-max: 60rem; --kz-album-print: minmax(0, 5fr); --kz-album-words: minmax(0, 6fr); }
1347
+ .kz-chapters[data-variant="album"] .kz-chapter-row {
1348
+ grid-template-columns: var(--kz-margin-x) var(--kz-album-print) var(--kz-album-words);
1349
+ grid-template-rows: 1fr auto auto auto 1fr;
1350
+ padding-block: var(--kz-chapter-line);
1351
+ }
1352
+ .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); }
1353
+ .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); }
1354
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) .kz-chapter-print { grid-column: 3; margin: 16px 28px 16px 32px; }
1355
+ .kz-chapters[data-variant="album"] .kz-chapter-row > :not(.kz-chapter-print, .kz-chapter-no) { grid-column: 3; }
1356
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) > :not(.kz-chapter-print, .kz-chapter-no) { grid-column: 2; }
1357
+ .kz-chapters[data-variant="album"] .kz-chapter-no { grid-column: 1; grid-row: 2; }
1358
+ .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; }
1359
+ .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; }
1360
+ .kz-chapters[data-variant="album"] .kz-chapter-period { grid-row: 4; margin-top: 12px; padding-left: var(--kz-chapter-gap); }
1361
+ /* A phone: one column — the print above its words (at most 60 % wide, still tilted), the number beside the title. */
1362
+ @container (max-width: 34rem) {
1363
+ /* `:nth-child(n)` lifts these over the wide rows' alternation: on a phone every row is the same column. */
1364
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) {
1365
+ display: grid;
1366
+ grid-template-columns: var(--kz-margin-x) minmax(0, 1fr);
1367
+ grid-template-rows: auto;
1368
+ padding: 0 0 var(--kz-chapter-line);
1369
+ }
1370
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) .kz-chapter-print {
1371
+ grid-column: 2; grid-row: 1; justify-self: start; width: 60%; margin: 20px 0 24px calc(var(--kz-chapter-gap) + 4px);
1372
+ }
1373
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(even) .kz-chapter-print { justify-self: end; margin: 20px 12px 24px 0; }
1374
+ .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); }
1375
+ .kz-chapters[data-variant="album"] .kz-chapter-row:nth-child(n) .kz-chapter-no { display: block; width: auto; margin: 0; }
1376
+ }
1377
+
1378
+ /* The foot: the previous and the next as two rows of the index, then one quiet line back to the story. */
1379
+ .kz-chapter-row[data-dir] .kz-chapter-period { color: var(--kz-text-secondary); }
1380
+ .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); }
1381
+ .kz-chapter-back-link { color: var(--kz-text-secondary); text-decoration: none; text-decoration-thickness: 1.5px; text-underline-offset: 0.2em; }
1382
+ .kz-chapter-back-link:is(:hover, :focus-visible) { color: var(--kz-text-primary); text-decoration-line: underline; text-decoration-color: var(--kz-hue, var(--kz-accent)); }
1383
+ .kz-chapter-back-link:focus-visible { outline: var(--kz-ring-width, 2px) solid var(--kz-ring); outline-offset: 2px; }
1384
+
1385
+ /* The head: the number in the margin beside the title's first line, one quiet meta line, the standfirst once. */
1386
+ .kz-chapter-head {
1387
+ display: grid;
1388
+ grid-template-columns: var(--kz-margin-x) minmax(0, 1fr);
1389
+ align-items: baseline;
1390
+ row-gap: 12px;
1391
+ padding-block: 8px;
1392
+ }
1393
+ .kz-chapter-head > * { grid-column: 2; margin: 0; padding-left: var(--kz-chapter-gap, 16px); min-width: 0; }
1394
+ .kz-chapter-head > .kz-chapter-no { grid-column: 1; grid-row: 1; padding: 0 12px 0 0; text-align: right; white-space: nowrap; }
1395
+ .kz-chapter-head-title {
1396
+ grid-row: 1;
1397
+ max-width: 22ch;
1398
+ font-family: var(--kz-font-display);
1399
+ font-size: clamp(1.85rem, 5.2vw, 2.75rem);
1400
+ font-weight: 400;
1401
+ line-height: 1.15;
1402
+ letter-spacing: -0.01em;
1403
+ color: var(--kz-text-primary);
1404
+ text-wrap: balance;
1405
+ overflow-wrap: anywhere;
1406
+ }
1407
+ .kz-chapter-meta { color: var(--kz-text-secondary); }
1408
+ .kz-chapter-standfirst { max-width: 60ch; font-size: 1.125rem; line-height: 1.6; color: var(--kz-text-secondary); text-wrap: pretty; }
1409
+ .kz-chapter-arrow { color: var(--kz-hue-text, var(--kz-paper-rule-margin)); }
1410
+
1263
1411
  /* Mascot life — the Flock's birds at ease, in character (Mascot `life`). */
1264
1412
  /* mascot-life:begin — generated by scripts/gen-mascot-life.mjs from src/mascots/life.ts; do not edit */
1265
1413
  @keyframes kzb-breathe{0%,100%{transform:scale(1,1)}50%{transform:scale(.996,1.018)}}
@@ -0,0 +1,106 @@
1
+ import { L as LinkComponent } from './block-link-BAg4eoZk.js';
2
+ import * as React from 'react';
3
+
4
+ /** The notebook under the rows: `lines` (the ruling of `Page`, aligned on the rows) or `false` (the page's own paper). */
5
+ type ChapterPaper = "lines" | false;
6
+ interface ChapterEntry {
7
+ /** Its number, hung in the margin: `01`, `§ 1`. */
8
+ number: React.ReactNode;
9
+ /** The title, in the serif: the link. */
10
+ title: React.ReactNode;
11
+ /** Where it leads. */
12
+ href: string;
13
+ /** When it happened, quiet on the right (under the title on a phone): `janv. – mars 2026`, or a `<time>`. */
14
+ period?: React.ReactNode;
15
+ /** One more line under the title (what was faced → what was built). Off unless given: the chapter's page says it. */
16
+ detail?: React.ReactNode;
17
+ /** The latest chapter: a small mark after the title, in the hue (`newLabel`). */
18
+ isNew?: boolean;
19
+ /** The page the reader is on. */
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;
32
+ }
33
+ type ChapterIndexProps = Omit<React.OlHTMLAttributes<HTMLOListElement>, "children"> & {
34
+ /** The chapters, in reading order. */
35
+ chapters: readonly ChapterEntry[];
36
+ /** The word of the latest chapter's mark. @default "New" */
37
+ newLabel?: React.ReactNode;
38
+ /** The accessible name of the list, when no heading names it (`aria-labelledby`). */
39
+ label?: string;
40
+ /** The ruling under the rows. `false` when the page is ruled already and the list starts on its module. @default "lines" */
41
+ paper?: ChapterPaper;
42
+ /** The app's router link (Next's `Link`), so internal chapters prefetch. */
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";
50
+ };
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;
53
+ type ChapterHeadProps = Omit<React.HTMLAttributes<HTMLElement>, "title"> & {
54
+ /** The chapter's number, hung in the margin: `01`, `Chapitre 1`. */
55
+ number: React.ReactNode;
56
+ /** The title: the page's `h1`. */
57
+ title: React.ReactNode;
58
+ /** When it happened: `janv. – mars 2026`. */
59
+ period?: React.ReactNode;
60
+ /** How long it reads: `8 min`. */
61
+ readingTime?: React.ReactNode;
62
+ /** What was faced: the first half of the standfirst. */
63
+ faced?: React.ReactNode;
64
+ /** What was built: its second half, after the arrow. */
65
+ built?: React.ReactNode;
66
+ /** The words a screen reader says before each half (the arrow is drawn, not read): `["What I faced", "What we built"]`. */
67
+ versusLabels?: readonly [string, string];
68
+ /** The level of the title. @default 1 */
69
+ level?: 1 | 2;
70
+ };
71
+ /** The head of a chapter: the number in the margin, the title, the period and the reading time, the standfirst once. */
72
+ declare function ChapterHead({ number, title, period, readingTime, faced, built, versusLabels, level, className, children, ...props }: ChapterHeadProps): React.JSX.Element;
73
+ interface ChapterLink {
74
+ /** Its number, in the margin: `02`. */
75
+ number?: React.ReactNode;
76
+ /** Its title, the link. */
77
+ title: React.ReactNode;
78
+ /** Where it leads. */
79
+ href: string;
80
+ }
81
+ type ChapterFootProps = Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
82
+ /** The chapter before this one (none on the first). */
83
+ previous?: ChapterLink;
84
+ /** The chapter after this one (none on the latest). */
85
+ next?: ChapterLink;
86
+ /** The line back to the story: `{ href: "/", label: "Back to the story" }`. */
87
+ back?: {
88
+ href: string;
89
+ label: React.ReactNode;
90
+ };
91
+ /** The quiet words beside each link. @default { previous: "Previous", next: "Next" } */
92
+ labels?: {
93
+ previous: React.ReactNode;
94
+ next: React.ReactNode;
95
+ };
96
+ /** The accessible name of the navigation. @default "Chapters" */
97
+ label?: string;
98
+ /** The ruling under the links. @default "lines" */
99
+ paper?: ChapterPaper;
100
+ /** The app's router link (Next's `Link`). */
101
+ linkAs?: LinkComponent;
102
+ };
103
+ /** The foot of a chapter: the previous and the next on the ruled lines, then one line back to the story. */
104
+ declare function ChapterFoot({ previous, next, back, labels, label, paper, linkAs, className, ...props }: ChapterFootProps): React.JSX.Element;
105
+
106
+ export { type ChapterCover, type ChapterEntry, ChapterFoot, type ChapterFootProps, ChapterHead, type ChapterHeadProps, ChapterIndex, type ChapterIndexProps, type ChapterLink, LinkComponent };
@@ -0,0 +1,174 @@
1
+ import {
2
+ BlockLink
3
+ } from "./chunk-FVGFPB73.js";
4
+ import {
5
+ cn
6
+ } from "./chunk-W675RFOA.js";
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
+
26
+ // src/chapter/chapter.tsx
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
+ }
45
+ function ChapterRow({
46
+ number,
47
+ title,
48
+ href,
49
+ aside,
50
+ mark,
51
+ detail,
52
+ current,
53
+ rel,
54
+ linkAs
55
+ }) {
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: [
61
+ " ",
62
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-new", children: mark })
63
+ ] })
64
+ ] }),
65
+ aside && /* @__PURE__ */ jsxs2(Fragment, { children: [
66
+ " ",
67
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-period", children: aside })
68
+ ] }),
69
+ detail && /* @__PURE__ */ jsx2("span", { className: "kz-chapter-detail", children: detail })
70
+ ] });
71
+ }
72
+ function ChapterIndex({ chapters, newLabel = "New", label, paper = "lines", linkAs, variant = "lines", className, ...props }) {
73
+ const album = variant === "album";
74
+ return (
75
+ // `role="list"`: a list without bullets is still a list to VoiceOver.
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
+ )
92
+ );
93
+ }
94
+ function ChapterHead({ number, title, period, readingTime, faced, built, versusLabels, level = 1, className, children, ...props }) {
95
+ const H = level === 1 ? "h1" : "h2";
96
+ const meta = [period, readingTime].filter((m) => m !== void 0 && m !== null && m !== "");
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 " }),
102
+ m
103
+ ] }, i)) }),
104
+ faced && built && /* @__PURE__ */ jsxs2("p", { className: "kz-chapter-standfirst", children: [
105
+ versusLabels && /* @__PURE__ */ jsxs2("span", { className: "kz-sr-only", children: [
106
+ versusLabels[0],
107
+ ", "
108
+ ] }),
109
+ faced,
110
+ /* @__PURE__ */ jsx2("span", { className: "kz-chapter-arrow", "aria-hidden": true, children: " \u2192 " }),
111
+ versusLabels && /* @__PURE__ */ jsxs2("span", { className: "kz-sr-only", children: [
112
+ "; ",
113
+ versusLabels[1],
114
+ ", "
115
+ ] }),
116
+ built
117
+ ] }),
118
+ children
119
+ ] });
120
+ }
121
+ function ChapterFoot({
122
+ previous,
123
+ next,
124
+ back,
125
+ labels = { previous: "Previous", next: "Next" },
126
+ label = "Chapters",
127
+ paper = "lines",
128
+ linkAs,
129
+ className,
130
+ ...props
131
+ }) {
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(
135
+ ChapterRow,
136
+ {
137
+ number: previous.number,
138
+ title: previous.title,
139
+ href: previous.href,
140
+ rel: "prev",
141
+ linkAs,
142
+ aside: /* @__PURE__ */ jsxs2(Fragment, { children: [
143
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: "\u2190 " }),
144
+ labels.previous
145
+ ] })
146
+ }
147
+ ) }),
148
+ next && /* @__PURE__ */ jsx2("li", { className: "kz-chapter-row", "data-dir": "next", children: /* @__PURE__ */ jsx2(
149
+ ChapterRow,
150
+ {
151
+ number: next.number,
152
+ title: next.title,
153
+ href: next.href,
154
+ rel: "next",
155
+ linkAs,
156
+ aside: /* @__PURE__ */ jsxs2(Fragment, { children: [
157
+ labels.next,
158
+ /* @__PURE__ */ jsx2("span", { "aria-hidden": true, children: " \u2192" })
159
+ ] })
160
+ }
161
+ ) })
162
+ ] }),
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 " }),
165
+ back.label
166
+ ] }) })
167
+ ] });
168
+ }
169
+ export {
170
+ ChapterFoot,
171
+ ChapterHead,
172
+ ChapterIndex
173
+ };
174
+ //# sourceMappingURL=chapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/taped-photo/taped-photo.tsx","../src/chapter/chapter.tsx"],"sourcesContent":["// The taped photo of the Cahier (ADR-004, blocks.css): a print stuck in the notebook — slightly tilted, a thin white print\n// border, a soft paper shadow (layered, never a glow), strips of tape. Whatever it holds (an image, a video, a live scene)\n// is its picture; the tilt is a transform, so nothing shifts and the picture keeps its own box. Server-safe: no state.\nimport type * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport type TapedPhotoProps = React.HTMLAttributes<HTMLElement> & {\n /** The picture: an `img`, a `video`, a scene. It fills the print. */\n children: React.ReactNode;\n /** A line written under the picture, on the print. */\n caption?: React.ReactNode;\n /** The tilt in degrees (negative leans left); eased on a phone. @default -1.6 */\n tilt?: number;\n /** Where the tape holds it: two opposite `corners`, one strip at the `top`, or `none`. @default \"corners\" */\n tape?: \"corners\" | \"top\" | \"none\";\n};\n\n/** A print taped in the notebook: tilted, a white border, a paper shadow, tape at two corners or at the top. */\nexport function TapedPhoto({ children, caption, tilt = -1.6, tape = \"corners\", className, style, ...props }: TapedPhotoProps) {\n return (\n <figure\n className={cn(\"kz-taped\", className)}\n data-tape={tape === \"corners\" ? undefined : tape}\n style={{ ...style, [\"--kz-taped-tilt\" as string]: `${tilt}deg` }}\n {...props}\n >\n <div className=\"kz-taped-picture\">{children}</div>\n {caption ? <figcaption className=\"kz-taped-caption\">{caption}</figcaption> : null}\n </figure>\n );\n}\n","// Server-safe. The chapters of a story on the Cahier (ADR-004, blocks.css, krizaka-ui#617): a sober timeline, never a\n// stack of boxes. The rows sit on the notebook's ruled lines (`data-paper=\"lines\"`, the ruling of `Page`), the number\n// hangs in the margin beside its red rule (`data-margin`), the serif title is the link, the period is quiet.\n// - `ChapterIndex` — the chapters in reading order, one ruled line each (two at most), the latest marked « New »;\n// - `ChapterHead` — the head of a chapter's page: number in the margin, title, one quiet meta line, the standfirst;\n// - `ChapterFoot` — its foot: the previous and next chapters on the lines, then one line back to the story.\n// No border per row, no card, no button: the paper carries the rhythm. Every word arrives as a prop.\n// `ChapterIndex variant=\"album\"` (#621): each row is the chapter's cover as a `TapedPhoto`, the prints facing each other\n// from left to right, and beside it the same number, title, line and period — light, on the same lines.\nimport type * as React from \"react\";\n\nimport { BlockLink, type LinkComponent } from \"../block-link\";\nimport { cn } from \"../cn\";\nimport { TapedPhoto } from \"../taped-photo\";\n\n/** The notebook under the rows: `lines` (the ruling of `Page`, aligned on the rows) or `false` (the page's own paper). */\ntype ChapterPaper = \"lines\" | false;\n\nexport interface ChapterEntry {\n /** Its number, hung in the margin: `01`, `§ 1`. */\n number: React.ReactNode;\n /** The title, in the serif: the link. */\n title: React.ReactNode;\n /** Where it leads. */\n href: string;\n /** When it happened, quiet on the right (under the title on a phone): `janv. – mars 2026`, or a `<time>`. */\n period?: React.ReactNode;\n /** One more line under the title (what was faced → what was built). Off unless given: the chapter's page says it. */\n detail?: React.ReactNode;\n /** The latest chapter: a small mark after the title, in the hue (`newLabel`). */\n isNew?: boolean;\n /** The page the reader is on. */\n current?: boolean;\n /** Its cover, drawn by the `album` variant as a taped print. Decorative there (`alt=\"\"`): the title carries the link. */\n cover?: ChapterCover;\n}\n\n/** A chapter's cover: its intrinsic size gives the print its aspect-ratio, so nothing shifts while it loads. */\nexport interface ChapterCover {\n src: string;\n width: number;\n height: number;\n srcSet?: string;\n /** @default \"(max-width: 34rem) 60vw, 26rem\" */\n sizes?: string;\n}\n\n/** The covers above the fold load at once; the rest wait for the reader. */\nconst EAGER_COVERS = 2;\n/** The prints face each other: the left one leans left, the right one leans right (TapedPhoto's practice). */\nconst ALBUM_TILT = 1.4;\n\nfunction ChapterPrint({ cover, index }: { cover: ChapterCover; index: number }) {\n return (\n <TapedPhoto className=\"kz-chapter-print\" tilt={index % 2 === 0 ? -ALBUM_TILT : ALBUM_TILT} aria-hidden>\n <img\n src={cover.src}\n srcSet={cover.srcSet}\n sizes={cover.srcSet ? (cover.sizes ?? \"(max-width: 34rem) 60vw, 26rem\") : undefined}\n width={cover.width}\n height={cover.height}\n alt=\"\"\n loading={index < EAGER_COVERS ? \"eager\" : \"lazy\"}\n decoding=\"async\"\n />\n </TapedPhoto>\n );\n}\n\n/** One ruled row: number in the margin, the title as the link (its hit area the whole row), an aside on the right. */\nfunction ChapterRow({\n number,\n title,\n href,\n aside,\n mark,\n detail,\n current,\n rel,\n linkAs,\n}: {\n number?: React.ReactNode;\n title: React.ReactNode;\n href: string;\n aside?: React.ReactNode;\n mark?: React.ReactNode;\n detail?: React.ReactNode;\n current?: boolean;\n rel?: string;\n linkAs?: LinkComponent;\n}) {\n return (\n <>\n <span className=\"kz-chapter-no\">{number}</span>\n <BlockLink href={href} linkAs={linkAs} rel={rel} className=\"kz-chapter-link\" aria-current={current ? \"page\" : undefined}>\n <span className=\"kz-chapter-title\">{title}</span>\n {mark && (\n <>\n {\" \"}\n <span className=\"kz-chapter-new\">{mark}</span>\n </>\n )}\n </BlockLink>\n {aside && (\n <>\n {/* A space, not a margin: in a narrow column the period runs on after the title, and starts flush when it wraps. */}{\" \"}\n <span className=\"kz-chapter-period\">{aside}</span>\n </>\n )}\n {detail && <span className=\"kz-chapter-detail\">{detail}</span>}\n </>\n );\n}\n\nexport type ChapterIndexProps = Omit<React.OlHTMLAttributes<HTMLOListElement>, \"children\"> & {\n /** The chapters, in reading order. */\n chapters: readonly ChapterEntry[];\n /** The word of the latest chapter's mark. @default \"New\" */\n newLabel?: React.ReactNode;\n /** The accessible name of the list, when no heading names it (`aria-labelledby`). */\n label?: string;\n /** The ruling under the rows. `false` when the page is ruled already and the list starts on its module. @default \"lines\" */\n paper?: ChapterPaper;\n /** The app's router link (Next's `Link`), so internal chapters prefetch. */\n linkAs?: LinkComponent;\n /**\n * `lines` — one ruled line per chapter (the compact index); `album` — each chapter's `cover` as a taped print beside\n * its title, its `detail` (one short line) and its period, the rows alternating left and right.\n * @default \"lines\"\n */\n variant?: \"lines\" | \"album\";\n};\n\n/** 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. */\nexport function ChapterIndex({ chapters, newLabel = \"New\", label, paper = \"lines\", linkAs, variant = \"lines\", className, ...props }: ChapterIndexProps) {\n const album = variant === \"album\";\n return (\n // `role=\"list\"`: a list without bullets is still a list to VoiceOver.\n <ol\n role=\"list\"\n aria-label={label}\n data-paper={paper || undefined}\n data-margin=\"\"\n data-variant={album ? \"album\" : undefined}\n className={cn(\"kz-chapters\", className)}\n {...props}\n >\n {chapters.map((c, i) => (\n <li key={i} className=\"kz-chapter-row\" data-new={c.isNew ? \"\" : undefined} data-detail={c.detail ? \"\" : undefined}>\n {album && c.cover && <ChapterPrint cover={c.cover} index={i} />}\n <ChapterRow number={c.number} title={c.title} href={c.href} aside={c.period} mark={c.isNew ? newLabel : undefined} detail={c.detail} current={c.current} linkAs={linkAs} />\n </li>\n ))}\n </ol>\n );\n}\n\nexport type ChapterHeadProps = Omit<React.HTMLAttributes<HTMLElement>, \"title\"> & {\n /** The chapter's number, hung in the margin: `01`, `Chapitre 1`. */\n number: React.ReactNode;\n /** The title: the page's `h1`. */\n title: React.ReactNode;\n /** When it happened: `janv. – mars 2026`. */\n period?: React.ReactNode;\n /** How long it reads: `8 min`. */\n readingTime?: React.ReactNode;\n /** What was faced: the first half of the standfirst. */\n faced?: React.ReactNode;\n /** What was built: its second half, after the arrow. */\n built?: React.ReactNode;\n /** The words a screen reader says before each half (the arrow is drawn, not read): `[\"What I faced\", \"What we built\"]`. */\n versusLabels?: readonly [string, string];\n /** The level of the title. @default 1 */\n level?: 1 | 2;\n};\n\n/** The head of a chapter: the number in the margin, the title, the period and the reading time, the standfirst once. */\nexport function ChapterHead({ number, title, period, readingTime, faced, built, versusLabels, level = 1, className, children, ...props }: ChapterHeadProps) {\n const H = level === 1 ? \"h1\" : \"h2\";\n const meta = [period, readingTime].filter((m) => m !== undefined && m !== null && m !== \"\");\n return (\n <header data-margin=\"\" className={cn(\"kz-chapter-head\", className)} {...props}>\n <p className=\"kz-chapter-no\">{number}</p>\n <H className=\"kz-chapter-head-title\">{title}</H>\n {meta.length > 0 && (\n <p className=\"kz-chapter-meta\">\n {meta.map((m, i) => (\n <span key={i}>\n {i > 0 && <span aria-hidden> · </span>}\n {m}\n </span>\n ))}\n </p>\n )}\n {faced && built && (\n <p className=\"kz-chapter-standfirst\">\n {versusLabels && <span className=\"kz-sr-only\">{versusLabels[0]}, </span>}\n {faced}\n <span className=\"kz-chapter-arrow\" aria-hidden>\n {\" → \"}\n </span>\n {versusLabels && <span className=\"kz-sr-only\">; {versusLabels[1]}, </span>}\n {built}\n </p>\n )}\n {children}\n </header>\n );\n}\n\nexport interface ChapterLink {\n /** Its number, in the margin: `02`. */\n number?: React.ReactNode;\n /** Its title, the link. */\n title: React.ReactNode;\n /** Where it leads. */\n href: string;\n}\n\nexport type ChapterFootProps = Omit<React.HTMLAttributes<HTMLElement>, \"children\"> & {\n /** The chapter before this one (none on the first). */\n previous?: ChapterLink;\n /** The chapter after this one (none on the latest). */\n next?: ChapterLink;\n /** The line back to the story: `{ href: \"/\", label: \"Back to the story\" }`. */\n back?: { href: string; label: React.ReactNode };\n /** The quiet words beside each link. @default { previous: \"Previous\", next: \"Next\" } */\n labels?: { previous: React.ReactNode; next: React.ReactNode };\n /** The accessible name of the navigation. @default \"Chapters\" */\n label?: string;\n /** The ruling under the links. @default \"lines\" */\n paper?: ChapterPaper;\n /** The app's router link (Next's `Link`). */\n linkAs?: LinkComponent;\n};\n\n/** The foot of a chapter: the previous and the next on the ruled lines, then one line back to the story. */\nexport function ChapterFoot({\n previous,\n next,\n back,\n labels = { previous: \"Previous\", next: \"Next\" },\n label = \"Chapters\",\n paper = \"lines\",\n linkAs,\n className,\n ...props\n}: ChapterFootProps) {\n return (\n <nav aria-label={label} data-paper={paper || undefined} data-margin=\"\" className={cn(\"kz-chapters kz-chapter-foot\", className)} {...props}>\n <ul role=\"list\">\n {previous && (\n <li className=\"kz-chapter-row\" data-dir=\"previous\">\n <ChapterRow\n number={previous.number}\n title={previous.title}\n href={previous.href}\n rel=\"prev\"\n linkAs={linkAs}\n aside={\n <>\n <span aria-hidden>← </span>\n {labels.previous}\n </>\n }\n />\n </li>\n )}\n {next && (\n <li className=\"kz-chapter-row\" data-dir=\"next\">\n <ChapterRow\n number={next.number}\n title={next.title}\n href={next.href}\n rel=\"next\"\n linkAs={linkAs}\n aside={\n <>\n {labels.next}\n <span aria-hidden> →</span>\n </>\n }\n />\n </li>\n )}\n </ul>\n {back && (\n <p className=\"kz-chapter-back\">\n <BlockLink href={back.href} linkAs={linkAs} className=\"kz-chapter-back-link\">\n <span aria-hidden>↩ </span>\n {back.label}\n </BlockLink>\n </p>\n )}\n </nav>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs"]}
@@ -22,7 +22,7 @@ function BlockLink({
22
22
  }) {
23
23
  if (external) return /* @__PURE__ */ jsx("a", { href, target: "_blank", rel: rel ?? "noopener noreferrer", ...props });
24
24
  const Comp = Link;
25
- return /* @__PURE__ */ jsx(Comp, { href, ...props });
25
+ return /* @__PURE__ */ jsx(Comp, { href, rel, ...props });
26
26
  }
27
27
 
28
28
  // src/router/route-state.tsx