printdown 1.0.0 → 1.1.1

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.
package/README.md CHANGED
@@ -12,6 +12,8 @@ Printdown turns Markdown into clean, publication-grade PDFs, PNGs, JPEGs, and We
12
12
  - **Marker Pen Highlights**: Physical marker pen effect with `==text==` (blue) and `=={amber}text==` (amber).
13
13
  - **Badges & Labels**: Badges with `<Badge>` / `[badge:...]` supporting `solid`, `soft`, and `outline` variants.
14
14
  - **Keyboard Keys**: Styled keyboard keys with `<Kbd icon="command" />` / `[kbd:...]` and embedded icon masks.
15
+ - **Center Alignment**: Center text, headings, or blocks with `::: center`, `-> text <-`, `<center>`, or `[center:...]`.
16
+ - **Heading Border Control**: Remove underline/border from individual headings using `{.no-border}` or `{-}`.
15
17
  - **Code Highlighting**: Syntax highlighting powered by **Shiki** with dark theme support.
16
18
  - **Custom CSS & Variables**: Full control over styling by overriding OKLCH CSS variables or injecting custom CSS.
17
19
  - **Japanese & Multilingual Typography**: Balanced typography for Japanese and English mixed documents with robust fallbacks.
@@ -163,6 +165,77 @@ Use <Kbd icon="arrow-up" /> or <Kbd icon="arrow-down" /> to navigate.
163
165
  [kbd:Enter]
164
166
  ```
165
167
 
168
+ ## Center Alignment
169
+
170
+ Printdown provides flexible block and inline center alignment options.
171
+
172
+ ### Container Block Syntax (`::: center`)
173
+
174
+ ```markdown
175
+ ::: center
176
+
177
+ # Centered Heading
178
+
179
+ This entire block of paragraphs, lists, and images is centered.
180
+ :::
181
+ ```
182
+
183
+ ### Arrow Block Syntax (`-> ... <-`)
184
+
185
+ ```markdown
186
+ -> Centered Single Line <-
187
+ ```
188
+
189
+ ```markdown
190
+ ->
191
+
192
+ # Centered Block
193
+
194
+ Multiple lines of text centered easily.
195
+ <-
196
+ ```
197
+
198
+ ### Component / HTML Tag Syntax
199
+
200
+ ```markdown
201
+ <center>
202
+ # Centered Title
203
+ Centered paragraph text.
204
+ </center>
205
+ ```
206
+
207
+ ### Markdown Inline Syntax
208
+
209
+ ```markdown
210
+ Normal text with [center:centered inline text] in the sentence.
211
+ ```
212
+
213
+ ## Heading Underline / Border Control
214
+
215
+ In Printdown's default theme, `h1` has a bottom border/underline. You can remove the border from individual headings (H1, H2, H3, etc.) using suffix attributes or tags:
216
+
217
+ ### Suffix Syntax
218
+
219
+ ```markdown
220
+ # Title Without Underline {.no-border}
221
+
222
+ # Another Heading {.no-underline}
223
+
224
+ # Clean Heading {-}
225
+ ```
226
+
227
+ ### Supported Suffix Variations
228
+
229
+ - `{.no-border}` / `{.no-underline}` / `{.plain}`
230
+ - `{no-border}` / `{no-underline}` / `{-}`
231
+ - `[no-border]` / `[no-underline]`
232
+
233
+ ### HTML Heading Syntax
234
+
235
+ ```html
236
+ <h1 no-border>Title Without Underline</h1>
237
+ ```
238
+
166
239
  ## CSS Customization
167
240
 
168
241
  Printdown loads styles in a predictable cascade:
@@ -241,6 +241,56 @@ var typographyCss = `.printdown h1,
241
241
  border-bottom: 1px solid var(--printdown-border-light);
242
242
  }
243
243
 
244
+ .printdown h1.printdown-no-border,
245
+ .printdown h1.printdown-no-underline,
246
+ .printdown h1.no-border,
247
+ .printdown h1.no-underline,
248
+ .printdown h1.plain,
249
+ .printdown h1[no-border],
250
+ .printdown h1[no-underline],
251
+ .printdown h2.printdown-no-border,
252
+ .printdown h2.printdown-no-underline,
253
+ .printdown h2.no-border,
254
+ .printdown h2.no-underline,
255
+ .printdown h2.plain,
256
+ .printdown h2[no-border],
257
+ .printdown h2[no-underline],
258
+ .printdown h3.printdown-no-border,
259
+ .printdown h3.printdown-no-underline,
260
+ .printdown h3.no-border,
261
+ .printdown h3.no-underline,
262
+ .printdown h3.plain,
263
+ .printdown h3[no-border],
264
+ .printdown h3[no-underline],
265
+ .printdown h4.printdown-no-border,
266
+ .printdown h4.printdown-no-underline,
267
+ .printdown h4.no-border,
268
+ .printdown h4.no-underline,
269
+ .printdown h4.plain,
270
+ .printdown h4[no-border],
271
+ .printdown h4[no-underline],
272
+ .printdown h5.printdown-no-border,
273
+ .printdown h5.printdown-no-underline,
274
+ .printdown h5.no-border,
275
+ .printdown h5.no-underline,
276
+ .printdown h5.plain,
277
+ .printdown h5[no-border],
278
+ .printdown h5[no-underline],
279
+ .printdown h6.printdown-no-border,
280
+ .printdown h6.printdown-no-underline,
281
+ .printdown h6.no-border,
282
+ .printdown h6.no-underline,
283
+ .printdown h6.plain,
284
+ .printdown h6[no-border],
285
+ .printdown h6[no-underline],
286
+ .printdown .printdown-no-border,
287
+ .printdown .printdown-no-underline,
288
+ .printdown .no-border,
289
+ .printdown .no-underline {
290
+ border-bottom: none !important;
291
+ padding-bottom: 0 !important;
292
+ }
293
+
244
294
  .printdown h2 {
245
295
  font-size: var(--printdown-text-2xl);
246
296
  font-weight: var(--printdown-font-weight-bold);
@@ -462,6 +512,7 @@ var codeCss = `/* Inline Code */
462
512
  background-color: var(--printdown-neutral-200);
463
513
  color: var(--printdown-neutral-900);
464
514
  padding: 0.15em 0.35em;
515
+ margin: 0 0.25em;
465
516
  border-radius: 4px;
466
517
  font-size: 0.875em;
467
518
  font-weight: 400;
@@ -765,6 +816,52 @@ var kbdCss = `/* Keyboard Key (Kbd) */
765
816
  }
766
817
  `;
767
818
 
819
+ // src/themes/default/center.ts
820
+ var centerCss = `/* Center Alignment */
821
+ .printdown center,
822
+ .printdown .printdown-center,
823
+ .printdown .text-center,
824
+ .printdown [align="center"] {
825
+ text-align: center;
826
+ }
827
+
828
+ .printdown div.printdown-center,
829
+ .printdown center {
830
+ display: block;
831
+ text-align: center;
832
+ margin-top: 0;
833
+ margin-bottom: 1rem;
834
+ }
835
+
836
+ .printdown div.printdown-center > *:first-child,
837
+ .printdown center > *:first-child {
838
+ margin-top: 0;
839
+ }
840
+
841
+ .printdown div.printdown-center > *:last-child,
842
+ .printdown center > *:last-child {
843
+ margin-bottom: 0;
844
+ }
845
+
846
+ .printdown span.printdown-center {
847
+ display: inline-block;
848
+ text-align: center;
849
+ }
850
+
851
+ .printdown .printdown-center img,
852
+ .printdown center img {
853
+ display: inline-block;
854
+ margin-left: auto;
855
+ margin-right: auto;
856
+ }
857
+
858
+ .printdown .printdown-center table,
859
+ .printdown center table {
860
+ margin-left: auto;
861
+ margin-right: auto;
862
+ }
863
+ `;
864
+
768
865
  // src/themes/default/print.ts
769
866
  var printCss = `/* Print and PDF Layout */
770
867
  @page {
@@ -830,6 +927,7 @@ var defaultThemeCssParts = {
830
927
  highlight: highlightCss,
831
928
  badge: badgeCss,
832
929
  kbd: kbdCss,
930
+ center: centerCss,
833
931
  print: printCss
834
932
  };
835
933
  var defaultThemeCss = [
@@ -842,6 +940,7 @@ var defaultThemeCss = [
842
940
  highlightCss,
843
941
  badgeCss,
844
942
  kbdCss,
943
+ centerCss,
845
944
  printCss
846
945
  ].join("\n\n");
847
946
  var defaultTheme = {
@@ -860,9 +959,10 @@ export {
860
959
  highlightCss,
861
960
  badgeCss,
862
961
  kbdCss,
962
+ centerCss,
863
963
  printCss,
864
964
  defaultThemeCssParts,
865
965
  defaultThemeCss,
866
966
  defaultTheme
867
967
  };
868
- //# sourceMappingURL=chunk-INBZBWSZ.js.map
968
+ //# sourceMappingURL=chunk-GEQQR3U7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/themes/default/fonts.ts","../src/themes/default/variables.ts","../src/themes/default/base.ts","../src/themes/default/typography.ts","../src/themes/default/markdown.ts","../src/themes/default/code.ts","../src/themes/default/highlight.ts","../src/themes/default/badge.ts","../src/themes/default/kbd.ts","../src/themes/default/center.ts","../src/themes/default/print.ts","../src/themes/default/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport url from \"node:url\";\n\nfunction tryResolveFontCss(specifier: string): string {\n try {\n const resolvedUrl = import.meta.resolve(specifier);\n const filePath = url.fileURLToPath(resolvedUrl);\n if (fs.existsSync(filePath)) {\n return fs.readFileSync(filePath, \"utf-8\");\n }\n } catch {\n // Fallback if import.meta.resolve is unavailable\n }\n return \"\";\n}\n\nexport function getFontDir(specifier: string): string {\n try {\n const resolvedUrl = import.meta.resolve(specifier);\n const filePath = url.fileURLToPath(resolvedUrl);\n return path.dirname(filePath);\n } catch {\n return \"\";\n }\n}\n\nfunction buildNpmFontsCss(): string {\n const parts: string[] = [];\n\n // 1. @fontsource-variable/inter\n const interRaw = tryResolveFontCss(\"@fontsource-variable/inter/index.css\");\n if (interRaw) {\n parts.push(interRaw.replace(/url\\(\\.\\/files\\//g, \"url(https://printdown.local/fonts/inter/\"));\n }\n\n // 2. @fontsource-variable/noto-sans-jp\n const notoRaw = tryResolveFontCss(\"@fontsource-variable/noto-sans-jp/index.css\");\n if (notoRaw) {\n parts.push(\n notoRaw.replace(/url\\(\\.\\/files\\//g, \"url(https://printdown.local/fonts/noto-sans-jp/\"),\n );\n }\n\n // 3. @fontsource-variable/jetbrains-mono\n const jbRaw = tryResolveFontCss(\"@fontsource-variable/jetbrains-mono/index.css\");\n if (jbRaw) {\n parts.push(\n jbRaw.replace(/url\\(\\.\\/files\\//g, \"url(https://printdown.local/fonts/jetbrains-mono/\"),\n );\n }\n\n // 4. gen-interface-jp\n const gen500 = tryResolveFontCss(\"gen-interface-jp/500.css\");\n const gen600 = tryResolveFontCss(\"gen-interface-jp/600.css\");\n const gen700 = tryResolveFontCss(\"gen-interface-jp/700.css\");\n if (gen500 || gen600 || gen700) {\n const genCss = [gen500, gen600, gen700]\n .join(\"\\n\")\n .replace(/url\\([\"']?\\.\\/w\\//g, 'url(\"https://printdown.local/fonts/gen-interface-jp/w/');\n parts.push(genCss);\n }\n\n // CDN fallbacks for standalone web/HTML environments\n parts.push(`/* CDN Fallback for Standalone HTML */\n@import url('https://cdn.jsdelivr.net/npm/gen-interface-jp@0.8.0/500.css');\n@import url('https://cdn.jsdelivr.net/npm/gen-interface-jp@0.8.0/600.css');\n@import url('https://cdn.jsdelivr.net/npm/gen-interface-jp@0.8.0/700.css');\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Noto+Sans+JP:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');\n`);\n\n parts.push(`:root {\n --printdown-font-fallback:\n 'Hiragino Kaku Gothic ProN', 'Hiragino Sans', 'Yu Gothic', 'Meiryo',\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial,\n 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', sans-serif;\n\n --printdown-font-sans:\n 'Gen Interface JP', 'Inter Variable', 'Inter', 'Noto Sans JP Variable', 'Noto Sans JP', var(--printdown-font-fallback);\n\n --printdown-font-mono:\n 'JetBrains Mono Variable', 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco,\n Consolas, 'Liberation Mono', 'Courier New', monospace;\n}\n`);\n\n return parts.join(\"\\n\\n\");\n}\n\nexport const fontsCss = buildNpmFontsCss();\n","export const variablesCss = `:root {\n /* Primary brand color - Deep Blue */\n --printdown-primary: oklch(37.9% 0.146 265.522);\n\n /* Blue scale */\n --printdown-blue-50: oklch(0.97 0.014 254.604);\n --printdown-blue-100: oklch(0.932 0.032 255.585);\n --printdown-blue-200: oklch(0.882 0.059 254.128);\n --printdown-blue-300: oklch(0.809 0.105 251.813);\n --printdown-blue-400: oklch(0.707 0.165 254.624);\n --printdown-blue-500: oklch(0.623 0.214 259.815);\n --printdown-blue-600: oklch(0.546 0.245 262.881);\n --printdown-blue-700: oklch(0.488 0.243 264.376);\n --printdown-blue-800: oklch(0.424 0.199 265.638);\n --printdown-blue-900: oklch(0.379 0.146 265.522);\n --printdown-blue-950: oklch(0.282 0.091 267.935);\n\n /* Amber scale */\n --printdown-amber-50: oklch(0.987 0.022 95.277);\n --printdown-amber-100: oklch(0.962 0.059 95.617);\n --printdown-amber-200: oklch(0.924 0.12 95.746);\n --printdown-amber-300: oklch(0.879 0.169 91.605);\n --printdown-amber-400: oklch(0.828 0.189 84.429);\n --printdown-amber-500: oklch(0.769 0.188 70.08);\n --printdown-amber-600: oklch(0.666 0.179 58.318);\n --printdown-amber-700: oklch(0.555 0.163 48.998);\n --printdown-amber-800: oklch(0.473 0.137 46.201);\n --printdown-amber-900: oklch(0.414 0.112 45.904);\n --printdown-amber-950: oklch(0.279 0.077 45.635);\n\n /* Neutral scale */\n --printdown-neutral-50: oklch(0.985 0 0);\n --printdown-neutral-100: oklch(0.97 0 0);\n --printdown-neutral-200: oklch(0.922 0 0);\n --printdown-neutral-300: oklch(0.87 0 0);\n --printdown-neutral-400: oklch(0.708 0 0);\n --printdown-neutral-500: oklch(0.556 0 0);\n --printdown-neutral-600: oklch(0.439 0 0);\n --printdown-neutral-700: oklch(0.371 0 0);\n --printdown-neutral-800: oklch(0.269 0 0);\n --printdown-neutral-900: oklch(0.205 0 0);\n --printdown-neutral-950: oklch(0.145 0 0);\n\n /* Gray scale */\n --printdown-gray-50: oklch(0.985 0.002 247.839);\n --printdown-gray-100: oklch(0.967 0.003 264.542);\n --printdown-gray-200: oklch(0.928 0.006 264.531);\n --printdown-gray-300: oklch(0.872 0.01 258.338);\n --printdown-gray-400: oklch(0.707 0.022 261.325);\n --printdown-gray-500: oklch(0.551 0.027 264.364);\n --printdown-gray-600: oklch(0.446 0.03 256.802);\n --printdown-gray-700: oklch(0.373 0.034 259.733);\n --printdown-gray-800: oklch(0.278 0.033 256.848);\n --printdown-gray-900: oklch(0.21 0.034 264.665);\n --printdown-gray-950: oklch(0.13 0.028 261.692);\n\n /* Semantic Theme Colors */\n --printdown-bg: #ffffff;\n --printdown-text: var(--printdown-neutral-800);\n --printdown-text-strong: var(--printdown-neutral-950);\n --printdown-text-muted: var(--printdown-neutral-600);\n --printdown-border: var(--printdown-gray-200);\n --printdown-border-light: var(--printdown-gray-100);\n\n /* Spacing scale */\n --printdown-size-1: 0.25rem;\n --printdown-size-2: 0.5rem;\n --printdown-size-3: 0.75rem;\n --printdown-size-4: 1rem;\n --printdown-size-5: 1.25rem;\n --printdown-size-6: 1.5rem;\n --printdown-size-8: 2rem;\n --printdown-size-10: 2.5rem;\n --printdown-size-12: 3rem;\n\n /* Typography scale */\n --printdown-text-xs: 0.75rem;\n --printdown-text-sm: 0.875rem;\n --printdown-text-base: 1rem;\n --printdown-text-lg: 1.125rem;\n --printdown-text-xl: 1.25rem;\n --printdown-text-2xl: 1.5rem;\n --printdown-text-3xl: 1.875rem;\n --printdown-text-4xl: 2.25rem;\n\n /* Line heights */\n --printdown-leading-none: 1;\n --printdown-leading-tight: 1.25;\n --printdown-leading-snug: 1.375;\n --printdown-leading-normal: 1.5;\n --printdown-leading-relaxed: 1.65;\n --printdown-leading-loose: 2;\n\n /* Font weights */\n --printdown-font-weight-normal: 400;\n --printdown-font-weight-medium: 500;\n --printdown-font-weight-semibold: 600;\n --printdown-font-weight-bold: 700;\n}\n`;\n","export const baseCss = `*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n font-size: 16px;\n}\n\nbody {\n margin: 0;\n padding: 0;\n background-color: var(--printdown-bg);\n color: var(--printdown-text);\n font-family: var(--printdown-font-sans);\n font-size: var(--printdown-text-base);\n font-weight: var(--printdown-font-weight-normal);\n line-height: var(--printdown-leading-relaxed);\n}\n\n.printdown {\n font-family: var(--printdown-font-sans);\n color: var(--printdown-text);\n font-size: var(--printdown-text-base);\n font-weight: var(--printdown-font-weight-normal);\n line-height: var(--printdown-leading-relaxed);\n max-width: 820px;\n margin: 0 auto;\n padding: 2.5rem 2rem;\n background-color: var(--printdown-bg);\n}\n`;\n","export const typographyCss = `.printdown h1,\n.printdown h2,\n.printdown h3,\n.printdown h4,\n.printdown h5,\n.printdown h6 {\n color: var(--printdown-text-strong);\n margin-top: 2rem;\n margin-bottom: 0.75rem;\n font-weight: var(--printdown-font-weight-bold);\n line-height: var(--printdown-leading-tight);\n}\n\n.printdown h1:first-child,\n.printdown h2:first-child,\n.printdown h3:first-child {\n margin-top: 0;\n}\n\n.printdown h1 {\n font-size: var(--printdown-text-3xl);\n font-weight: var(--printdown-font-weight-bold);\n letter-spacing: -0.025em;\n margin-top: 2.25rem;\n margin-bottom: 1rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid var(--printdown-border-light);\n}\n\n.printdown h1.printdown-no-border,\n.printdown h1.printdown-no-underline,\n.printdown h1.no-border,\n.printdown h1.no-underline,\n.printdown h1.plain,\n.printdown h1[no-border],\n.printdown h1[no-underline],\n.printdown h2.printdown-no-border,\n.printdown h2.printdown-no-underline,\n.printdown h2.no-border,\n.printdown h2.no-underline,\n.printdown h2.plain,\n.printdown h2[no-border],\n.printdown h2[no-underline],\n.printdown h3.printdown-no-border,\n.printdown h3.printdown-no-underline,\n.printdown h3.no-border,\n.printdown h3.no-underline,\n.printdown h3.plain,\n.printdown h3[no-border],\n.printdown h3[no-underline],\n.printdown h4.printdown-no-border,\n.printdown h4.printdown-no-underline,\n.printdown h4.no-border,\n.printdown h4.no-underline,\n.printdown h4.plain,\n.printdown h4[no-border],\n.printdown h4[no-underline],\n.printdown h5.printdown-no-border,\n.printdown h5.printdown-no-underline,\n.printdown h5.no-border,\n.printdown h5.no-underline,\n.printdown h5.plain,\n.printdown h5[no-border],\n.printdown h5[no-underline],\n.printdown h6.printdown-no-border,\n.printdown h6.printdown-no-underline,\n.printdown h6.no-border,\n.printdown h6.no-underline,\n.printdown h6.plain,\n.printdown h6[no-border],\n.printdown h6[no-underline],\n.printdown .printdown-no-border,\n.printdown .printdown-no-underline,\n.printdown .no-border,\n.printdown .no-underline {\n border-bottom: none !important;\n padding-bottom: 0 !important;\n}\n\n.printdown h2 {\n font-size: var(--printdown-text-2xl);\n font-weight: var(--printdown-font-weight-bold);\n letter-spacing: -0.015em;\n margin-top: 2rem;\n margin-bottom: 0.75rem;\n}\n\n.printdown h3 {\n font-size: var(--printdown-text-xl);\n font-weight: var(--printdown-font-weight-semibold);\n letter-spacing: -0.01em;\n margin-top: 1.5rem;\n margin-bottom: 0.5rem;\n}\n\n.printdown h4 {\n font-size: var(--printdown-text-lg);\n font-weight: var(--printdown-font-weight-semibold);\n margin-top: 1.25rem;\n margin-bottom: 0.5rem;\n}\n\n.printdown h5 {\n font-size: var(--printdown-text-base);\n font-weight: var(--printdown-font-weight-semibold);\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n}\n\n.printdown h6 {\n font-size: var(--printdown-text-sm);\n font-weight: var(--printdown-font-weight-semibold);\n color: var(--printdown-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n}\n\n.printdown p {\n margin-top: 0;\n margin-bottom: 1rem;\n line-height: var(--printdown-leading-relaxed);\n}\n\n.printdown p:last-child {\n margin-bottom: 0;\n}\n\n.printdown strong,\n.printdown b {\n font-weight: var(--printdown-font-weight-bold);\n color: var(--printdown-text-strong);\n}\n\n.printdown em,\n.printdown i {\n font-style: italic;\n}\n\n.printdown del,\n.printdown s {\n text-decoration: line-through;\n color: var(--printdown-text-muted);\n}\n\n.printdown small {\n font-size: var(--printdown-text-sm);\n color: var(--printdown-text-muted);\n}\n\n.printdown a {\n color: var(--printdown-primary);\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 2.5px;\n}\n\n.printdown hr {\n border: 0;\n border-top: 1px solid var(--printdown-border);\n margin: 2rem 0;\n}\n`;\n","export const markdownCss = `/* Lists */\n.printdown ul,\n.printdown ol {\n padding-left: 1.5rem;\n margin-top: 0.5rem;\n margin-bottom: 1rem;\n}\n\n.printdown ul {\n list-style-type: disc;\n}\n\n.printdown ol {\n list-style-type: decimal;\n}\n\n.printdown li {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n line-height: var(--printdown-leading-relaxed);\n}\n\n.printdown li > ul,\n.printdown li > ol {\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n}\n\n/* Task Lists */\n.printdown ul.printdown-task-list {\n list-style: none;\n padding-left: 0;\n}\n\n.printdown .printdown-task-list-item {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-top: 0.35rem;\n margin-bottom: 0.35rem;\n}\n\n.printdown .printdown-task-list-checkbox {\n appearance: none;\n -webkit-appearance: none;\n width: 1.05em;\n height: 1.05em;\n margin-top: 0.3em;\n flex-shrink: 0;\n border-radius: 2px;\n border: 1.5px solid var(--printdown-neutral-400);\n background-color: transparent;\n position: relative;\n cursor: default;\n}\n\n.printdown .printdown-task-list-checkbox:checked {\n background-color: var(--printdown-blue-900);\n border-color: var(--printdown-blue-900);\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E\");\n background-size: 80% 80%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n/* Blockquote */\n.printdown blockquote {\n position: relative;\n margin: 1.25rem 0;\n padding: 0.25rem 0 0.25rem 1rem;\n border-left: 3px solid var(--printdown-primary);\n background: transparent;\n color: var(--printdown-neutral-700);\n font-size: var(--printdown-text-base);\n line-height: var(--printdown-leading-relaxed);\n}\n\n.printdown blockquote > *:first-child {\n margin-top: 0;\n}\n\n.printdown blockquote > *:last-child {\n margin-bottom: 0;\n}\n\n/* Tables */\n.printdown table {\n width: 100%;\n border-collapse: collapse;\n margin-top: 1.25rem;\n margin-bottom: 1.25rem;\n font-size: var(--printdown-text-sm);\n line-height: var(--printdown-leading-normal);\n}\n\n.printdown th,\n.printdown td {\n padding: 0.625rem 0.75rem;\n text-align: left;\n vertical-align: top;\n}\n\n.printdown th {\n font-weight: var(--printdown-font-weight-semibold);\n color: var(--printdown-text-strong);\n border-bottom: 2px solid var(--printdown-gray-300);\n}\n\n.printdown td {\n border-bottom: 1px solid var(--printdown-gray-200);\n color: var(--printdown-text);\n}\n\n.printdown tr:last-child td {\n border-bottom: 1px solid var(--printdown-gray-200);\n}\n\n/* Images */\n.printdown img {\n max-width: 100%;\n height: auto;\n display: block;\n margin: 1.25rem auto;\n border-radius: 4px;\n}\n`;\n","export const codeCss = `/* Inline Code */\n.printdown :not(pre) > code {\n font-family: var(--printdown-font-mono);\n background-color: var(--printdown-neutral-200);\n color: var(--printdown-neutral-900);\n padding: 0.15em 0.35em;\n margin: 0 0.25em;\n border-radius: 4px;\n font-size: 0.875em;\n font-weight: 400;\n vertical-align: baseline;\n}\n\n/* Code Blocks */\n.printdown pre.printdown-code,\n.printdown pre.shiki {\n font-family: var(--printdown-font-mono);\n font-size: 0.85rem;\n line-height: 1.55;\n padding: 1rem 1.25rem;\n border-radius: 6px;\n margin: 1.25rem 0;\n overflow-x: auto;\n tab-size: 2;\n background-color: #1a1b26;\n color: #c0caf5;\n}\n\n.printdown pre.printdown-code code,\n.printdown pre.shiki code {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n background: transparent;\n padding: 0;\n border-radius: 0;\n color: inherit;\n}\n`;\n","export const highlightCss = `/* Marker Pen / Highlight */\n.printdown mark,\n.printdown .printdown-highlight {\n --highlight-ink: color-mix(in oklch, var(--printdown-blue-300) 42%, transparent);\n\n display: inline;\n padding: 0 0.15em;\n margin: 0;\n border-radius: 0;\n font-size: inherit;\n font-weight: inherit;\n font-family: inherit;\n line-height: inherit;\n color: inherit;\n vertical-align: baseline;\n background-color: transparent;\n background-image: linear-gradient(\n to top,\n var(--highlight-ink) 0%,\n var(--highlight-ink) 58%,\n transparent 58%\n );\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n}\n\n.printdown .printdown-highlight--blue {\n --highlight-ink: color-mix(in oklch, var(--printdown-blue-300) 42%, transparent);\n}\n\n.printdown .printdown-highlight--amber {\n --highlight-ink: color-mix(in oklch, var(--printdown-amber-400) 48%, transparent);\n}\n\n/* Inline code inside highlight — transparent wrapper, marker stroke on code */\n.printdown mark:has(> code),\n.printdown .printdown-highlight:has(> code) {\n display: contents;\n padding: 0;\n background-image: none;\n background-color: transparent;\n}\n\n.printdown mark > code,\n.printdown .printdown-highlight > code {\n --highlight-ink: color-mix(in oklch, var(--printdown-blue-300) 42%, transparent);\n\n display: inline;\n padding: 0 0.25em;\n border-radius: 0;\n font-size: inherit;\n font-weight: inherit;\n font-family: inherit;\n line-height: inherit;\n vertical-align: baseline;\n background-color: transparent;\n background-image: linear-gradient(\n to top,\n var(--highlight-ink) 0%,\n var(--highlight-ink) 58%,\n transparent 58%\n );\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n}\n\n.printdown .printdown-highlight--amber > code {\n --highlight-ink: color-mix(in oklch, var(--printdown-amber-400) 48%, transparent);\n}\n`;\n","export const badgeCss = `/* Badges */\n.printdown .printdown-badge,\n.printdown badge,\n.printdown Badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.12em 0.5em;\n margin: 0 0.2em;\n border-radius: 4px;\n font-size: 0.75em;\n font-weight: var(--printdown-font-weight-medium);\n font-family: var(--printdown-font-sans);\n line-height: 1.3;\n letter-spacing: 0.02em;\n vertical-align: 0.08em;\n white-space: nowrap;\n box-sizing: border-box;\n}\n\n/* Headings adjustment - keep badge proportional and vertically centered */\n.printdown h1 .printdown-badge,\n.printdown h2 .printdown-badge,\n.printdown h3 .printdown-badge,\n.printdown h4 .printdown-badge {\n font-size: 0.55em;\n vertical-align: 0.15em;\n}\n\n/* Solid Variants (Default) */\n.printdown .printdown-badge--solid,\n.printdown .printdown-badge--solid.printdown-badge--blue {\n background-color: var(--printdown-blue-900);\n color: #ffffff;\n}\n\n.printdown .printdown-badge--solid.printdown-badge--amber {\n background-color: var(--printdown-amber-700);\n color: #ffffff;\n}\n\n.printdown .printdown-badge--solid.printdown-badge--neutral,\n.printdown .printdown-badge--solid.printdown-badge--gray {\n background-color: var(--printdown-neutral-800);\n color: #ffffff;\n}\n\n/* Soft Variants */\n.printdown .printdown-badge--soft,\n.printdown .printdown-badge--soft.printdown-badge--blue {\n background-color: var(--printdown-blue-100);\n color: var(--printdown-blue-900);\n}\n\n.printdown .printdown-badge--soft.printdown-badge--amber {\n background-color: var(--printdown-amber-100);\n color: var(--printdown-amber-900);\n}\n\n.printdown .printdown-badge--soft.printdown-badge--neutral,\n.printdown .printdown-badge--soft.printdown-badge--gray {\n background-color: var(--printdown-neutral-200);\n color: var(--printdown-neutral-900);\n}\n\n/* Outline Variants */\n.printdown .printdown-badge--outline,\n.printdown .printdown-badge--outline.printdown-badge--blue {\n background-color: transparent;\n color: var(--printdown-blue-900);\n box-shadow: inset 0 0 0 1px var(--printdown-blue-900);\n}\n\n.printdown .printdown-badge--outline.printdown-badge--amber {\n background-color: transparent;\n color: var(--printdown-amber-700);\n box-shadow: inset 0 0 0 1px var(--printdown-amber-600);\n}\n\n.printdown .printdown-badge--outline.printdown-badge--neutral,\n.printdown .printdown-badge--outline.printdown-badge--gray {\n background-color: transparent;\n color: var(--printdown-neutral-700);\n box-shadow: inset 0 0 0 1px var(--printdown-neutral-400);\n}\n`;\n","export const kbdCss = `/* Keyboard Key (Kbd) */\n.printdown kbd,\n.printdown .printdown-kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.5em;\n height: 1.6em;\n padding: 0 0.45em 2px; /* Compensate for 2px bottom shadow to center on key surface */\n margin: 0 0.25em;\n border-radius: 4px;\n background-color: var(--printdown-neutral-50);\n color: var(--printdown-blue-900);\n font-family: var(--printdown-font-sans);\n font-size: 0.8em;\n font-weight: var(--printdown-font-weight-semibold);\n line-height: 1;\n text-align: center;\n vertical-align: middle;\n white-space: nowrap;\n box-sizing: border-box;\n border: 1px solid var(--printdown-gray-300);\n box-shadow: inset 0 -2px 0 0 var(--printdown-gray-200), 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n/* Headings adjustment */\n.printdown h1 kbd,\n.printdown h1 .printdown-kbd,\n.printdown h2 kbd,\n.printdown h2 .printdown-kbd,\n.printdown h3 kbd,\n.printdown h3 .printdown-kbd {\n font-size: 0.6em;\n height: 1.6em;\n vertical-align: middle;\n}\n\n/* Kbd Icons */\n.printdown .printdown-kbd-icon {\n display: inline-block;\n width: 1.1em;\n height: 1.1em;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-position: center;\n mask-position: center;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n}\n\n.printdown .printdown-kbd-icon + span,\n.printdown .printdown-kbd-icon + text {\n margin-left: 0.25em;\n}\n\n/* Command Icon */\n.printdown .printdown-kbd-icon--command,\n.printdown .printdown-kbd-icon--cmd {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3z'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3z'/%3E%3C/svg%3E\");\n}\n\n/* Arrow Icons */\n.printdown .printdown-kbd-icon--arrow-up,\n.printdown .printdown-kbd-icon--up {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 7-7 7 7'/%3E%3Cpath d='M12 19V5'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 7-7 7 7'/%3E%3Cpath d='M12 19V5'/%3E%3C/svg%3E\");\n}\n\n.printdown .printdown-kbd-icon--arrow-down,\n.printdown .printdown-kbd-icon--down {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14'/%3E%3Cpath d='m19 12-7 7-7-7'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 5v14'/%3E%3Cpath d='m19 12-7 7-7-7'/%3E%3C/svg%3E\");\n}\n\n.printdown .printdown-kbd-icon--arrow-left,\n.printdown .printdown-kbd-icon--left {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m12 19-7-7 7-7'/%3E%3Cpath d='M19 12H5'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m12 19-7-7 7-7'/%3E%3Cpath d='M19 12H5'/%3E%3C/svg%3E\");\n}\n\n.printdown .printdown-kbd-icon--arrow-right,\n.printdown .printdown-kbd-icon--right {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3Cpath d='m12 5 7 7-7 7'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3Cpath d='m12 5 7 7-7 7'/%3E%3C/svg%3E\");\n}\n\n/* Option / Alt Icon */\n.printdown .printdown-kbd-icon--option,\n.printdown .printdown-kbd-icon--alt {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 3h6l6 18h6'/%3E%3Cpath d='M14 3h7'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 3h6l6 18h6'/%3E%3Cpath d='M14 3h7'/%3E%3C/svg%3E\");\n}\n\n/* Shift Icon */\n.printdown .printdown-kbd-icon--shift {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m12 3-8 8h5v10h6V11h5z'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m12 3-8 8h5v10h6V11h5z'/%3E%3C/svg%3E\");\n}\n\n/* Enter Icon */\n.printdown .printdown-kbd-icon--enter,\n.printdown .printdown-kbd-icon--return {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 10 4 15 9 20'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 10 4 15 9 20'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E\");\n}\n`;\n","export const centerCss = `/* Center Alignment */\n.printdown center,\n.printdown .printdown-center,\n.printdown .text-center,\n.printdown [align=\"center\"] {\n text-align: center;\n}\n\n.printdown div.printdown-center,\n.printdown center {\n display: block;\n text-align: center;\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\n.printdown div.printdown-center > *:first-child,\n.printdown center > *:first-child {\n margin-top: 0;\n}\n\n.printdown div.printdown-center > *:last-child,\n.printdown center > *:last-child {\n margin-bottom: 0;\n}\n\n.printdown span.printdown-center {\n display: inline-block;\n text-align: center;\n}\n\n.printdown .printdown-center img,\n.printdown center img {\n display: inline-block;\n margin-left: auto;\n margin-right: auto;\n}\n\n.printdown .printdown-center table,\n.printdown center table {\n margin-left: auto;\n margin-right: auto;\n}\n`;\n","export const printCss = `/* Print and PDF Layout */\n@page {\n size: A4;\n margin: 20mm 18mm;\n}\n\n@media print {\n html,\n body {\n background-color: #ffffff;\n font-size: 15px;\n }\n\n .printdown {\n max-width: 100%;\n margin: 0;\n padding: 0;\n }\n\n /* Prevent awkward page breaks */\n .printdown h1,\n .printdown h2,\n .printdown h3,\n .printdown h4,\n .printdown h5,\n .printdown h6 {\n break-after: avoid;\n page-break-after: avoid;\n }\n\n .printdown pre.printdown-code,\n .printdown pre.shiki,\n .printdown blockquote,\n .printdown table,\n .printdown tr,\n .printdown img,\n .printdown .printdown-task-list-item {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n\n .printdown p {\n orphans: 3;\n widows: 3;\n }\n\n .printdown .printdown-page-break {\n break-before: page;\n page-break-before: always;\n }\n}\n`;\n","import { fontsCss } from \"./fonts.js\";\nimport { variablesCss } from \"./variables.js\";\nimport { baseCss } from \"./base.js\";\nimport { typographyCss } from \"./typography.js\";\nimport { markdownCss } from \"./markdown.js\";\nimport { codeCss } from \"./code.js\";\nimport { highlightCss } from \"./highlight.js\";\nimport { badgeCss } from \"./badge.js\";\nimport { kbdCss } from \"./kbd.js\";\nimport { centerCss } from \"./center.js\";\nimport { printCss } from \"./print.js\";\n\nexport {\n fontsCss,\n variablesCss,\n baseCss,\n typographyCss,\n markdownCss,\n codeCss,\n highlightCss,\n badgeCss,\n kbdCss,\n centerCss,\n printCss,\n};\n\nexport const defaultThemeCssParts = {\n fonts: fontsCss,\n variables: variablesCss,\n base: baseCss,\n typography: typographyCss,\n markdown: markdownCss,\n code: codeCss,\n highlight: highlightCss,\n badge: badgeCss,\n kbd: kbdCss,\n center: centerCss,\n print: printCss,\n};\n\nexport const defaultThemeCss = [\n fontsCss,\n variablesCss,\n baseCss,\n typographyCss,\n markdownCss,\n codeCss,\n highlightCss,\n badgeCss,\n kbdCss,\n centerCss,\n printCss,\n].join(\"\\n\\n\");\n\nexport interface Theme {\n name: string;\n css: string;\n}\n\nexport const defaultTheme: Theme = {\n name: \"default\",\n css: defaultThemeCss,\n};\n"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,SAAS;AAEhB,SAAS,kBAAkB,WAA2B;AACpD,MAAI;AACF,UAAM,cAAc,YAAY,QAAQ,SAAS;AACjD,UAAM,WAAW,IAAI,cAAc,WAAW;AAC9C,QAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,aAAO,GAAG,aAAa,UAAU,OAAO;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,WAAW,WAA2B;AACpD,MAAI;AACF,UAAM,cAAc,YAAY,QAAQ,SAAS;AACjD,UAAM,WAAW,IAAI,cAAc,WAAW;AAC9C,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAA2B;AAClC,QAAM,QAAkB,CAAC;AAGzB,QAAM,WAAW,kBAAkB,sCAAsC;AACzE,MAAI,UAAU;AACZ,UAAM,KAAK,SAAS,QAAQ,qBAAqB,0CAA0C,CAAC;AAAA,EAC9F;AAGA,QAAM,UAAU,kBAAkB,6CAA6C;AAC/E,MAAI,SAAS;AACX,UAAM;AAAA,MACJ,QAAQ,QAAQ,qBAAqB,iDAAiD;AAAA,IACxF;AAAA,EACF;AAGA,QAAM,QAAQ,kBAAkB,+CAA+C;AAC/E,MAAI,OAAO;AACT,UAAM;AAAA,MACJ,MAAM,QAAQ,qBAAqB,mDAAmD;AAAA,IACxF;AAAA,EACF;AAGA,QAAM,SAAS,kBAAkB,0BAA0B;AAC3D,QAAM,SAAS,kBAAkB,0BAA0B;AAC3D,QAAM,SAAS,kBAAkB,0BAA0B;AAC3D,MAAI,UAAU,UAAU,QAAQ;AAC9B,UAAM,SAAS,CAAC,QAAQ,QAAQ,MAAM,EACnC,KAAK,IAAI,EACT,QAAQ,sBAAsB,wDAAwD;AACzF,UAAM,KAAK,MAAM;AAAA,EACnB;AAGA,QAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,CAKZ;AAEC,QAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAaZ;AAEC,SAAO,MAAM,KAAK,MAAM;AAC1B;AAEO,IAAM,WAAW,iBAAiB;;;ACzFlC,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACArB,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAtB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApB,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAhB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACArB,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAjB,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAf,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAlB,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC0BjB,IAAM,uBAAuB;AAAA,EAClC,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AACT;AAEO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,MAAM;AAON,IAAM,eAAsB;AAAA,EACjC,MAAM;AAAA,EACN,KAAK;AACP;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  defaultThemeCss,
3
3
  getFontDir
4
- } from "./chunk-INBZBWSZ.js";
4
+ } from "./chunk-GEQQR3U7.js";
5
5
 
6
6
  // src/index.ts
7
7
  import fs3 from "fs";
@@ -424,6 +424,249 @@ function kbdPlugin(md) {
424
424
  });
425
425
  }
426
426
 
427
+ // src/markdown/plugins/center.ts
428
+ var CENTER_INLINE_BRACKET_REGEX = /^\[center:([\s\S]*?)\]/i;
429
+ var CENTER_INLINE_ARROW_REGEX = /^->\s*([\s\S]*?)\s*<-/;
430
+ var CENTER_OPEN_TAG_REGEX = /^<center(\s+[^>]*)?>$/i;
431
+ var CENTER_CLOSE_TAG_REGEX = /^<\/center>$/i;
432
+ function centerPlugin(md) {
433
+ function inlineCenterRule(state, silent) {
434
+ const start = state.pos;
435
+ const max = state.posMax;
436
+ const src = state.src;
437
+ if (src.charCodeAt(start) === 91) {
438
+ const match = src.slice(start).match(CENTER_INLINE_BRACKET_REGEX);
439
+ if (match) {
440
+ const matchedLength = match[0].length;
441
+ if (start + matchedLength > max) return false;
442
+ if (silent) {
443
+ state.pos += matchedLength;
444
+ return true;
445
+ }
446
+ const centerText = match[1];
447
+ const tokenOpen = state.push("center_open", "span", 1);
448
+ tokenOpen.attrs = [["class", "printdown-center"]];
449
+ const nestedTokens = [];
450
+ state.md.inline.parse(centerText, state.md, state.env, nestedTokens);
451
+ for (const nested of nestedTokens) {
452
+ state.tokens.push(nested);
453
+ }
454
+ state.push("center_close", "span", -1);
455
+ state.pos += matchedLength;
456
+ return true;
457
+ }
458
+ }
459
+ if (src.charCodeAt(start) === 45 && src.charCodeAt(start + 1) === 62) {
460
+ if (start > 0 && src.charCodeAt(start - 1) === 45) {
461
+ return false;
462
+ }
463
+ const rest = src.slice(start);
464
+ const match = rest.match(CENTER_INLINE_ARROW_REGEX);
465
+ if (match && match[1].length > 0) {
466
+ const matchedLength = match[0].length;
467
+ if (start + matchedLength > max) return false;
468
+ if (silent) {
469
+ state.pos += matchedLength;
470
+ return true;
471
+ }
472
+ const centerText = match[1];
473
+ const tokenOpen = state.push("center_open", "span", 1);
474
+ tokenOpen.attrs = [["class", "printdown-center"]];
475
+ const nestedTokens = [];
476
+ state.md.inline.parse(centerText, state.md, state.env, nestedTokens);
477
+ for (const nested of nestedTokens) {
478
+ state.tokens.push(nested);
479
+ }
480
+ state.push("center_close", "span", -1);
481
+ state.pos += matchedLength;
482
+ return true;
483
+ }
484
+ }
485
+ return false;
486
+ }
487
+ md.inline.ruler.before("link", "center_inline", inlineCenterRule);
488
+ function blockCenterRule(state, startLine, endLine, silent) {
489
+ const startPos = state.bMarks[startLine] + state.tShift[startLine];
490
+ const maxPos = state.eMarks[startLine];
491
+ const lineText = state.src.slice(startPos, maxPos).trim();
492
+ if (/^:::\s*center\s*$/i.test(lineText)) {
493
+ if (silent) return true;
494
+ let nextLine = startLine + 1;
495
+ let foundEnd = false;
496
+ while (nextLine < endLine) {
497
+ const pos = state.bMarks[nextLine] + state.tShift[nextLine];
498
+ const max = state.eMarks[nextLine];
499
+ const curLine = state.src.slice(pos, max).trim();
500
+ if (/^:::\s*$/.test(curLine) || /^:::\s*center\s*$/i.test(curLine)) {
501
+ foundEnd = true;
502
+ break;
503
+ }
504
+ nextLine++;
505
+ }
506
+ const tokenOpen = state.push("center_container_open", "div", 1);
507
+ tokenOpen.attrs = [["class", "printdown-center"]];
508
+ tokenOpen.block = true;
509
+ const oldParentType = state.parentType;
510
+ state.parentType = "root";
511
+ state.md.block.tokenize(state, startLine + 1, nextLine);
512
+ state.parentType = oldParentType;
513
+ const tokenClose = state.push("center_container_close", "div", -1);
514
+ tokenClose.block = true;
515
+ state.line = foundEnd ? nextLine + 1 : nextLine;
516
+ return true;
517
+ }
518
+ if (lineText.startsWith("->")) {
519
+ if (lineText.endsWith("<-") && lineText.length >= 4) {
520
+ if (silent) return true;
521
+ const content = lineText.slice(2, -2).trim();
522
+ const tokenOpen = state.push("center_container_open", "div", 1);
523
+ tokenOpen.attrs = [["class", "printdown-center"]];
524
+ tokenOpen.block = true;
525
+ const pOpen = state.push("paragraph_open", "p", 1);
526
+ pOpen.attrs = [["class", "printdown-center"]];
527
+ const inlineToken = state.push("inline", "", 0);
528
+ inlineToken.content = content;
529
+ inlineToken.children = [];
530
+ state.push("paragraph_close", "p", -1);
531
+ const tokenClose = state.push("center_container_close", "div", -1);
532
+ tokenClose.block = true;
533
+ state.line = startLine + 1;
534
+ return true;
535
+ }
536
+ if (lineText === "->") {
537
+ if (silent) return true;
538
+ let nextLine = startLine + 1;
539
+ let foundEnd = false;
540
+ while (nextLine < endLine) {
541
+ const pos = state.bMarks[nextLine] + state.tShift[nextLine];
542
+ const max = state.eMarks[nextLine];
543
+ const curLine = state.src.slice(pos, max).trim();
544
+ if (curLine === "<-") {
545
+ foundEnd = true;
546
+ break;
547
+ }
548
+ nextLine++;
549
+ }
550
+ const tokenOpen = state.push("center_container_open", "div", 1);
551
+ tokenOpen.attrs = [["class", "printdown-center"]];
552
+ tokenOpen.block = true;
553
+ const oldParentType = state.parentType;
554
+ state.parentType = "root";
555
+ state.md.block.tokenize(state, startLine + 1, nextLine);
556
+ state.parentType = oldParentType;
557
+ const tokenClose = state.push("center_container_close", "div", -1);
558
+ tokenClose.block = true;
559
+ state.line = foundEnd ? nextLine + 1 : nextLine;
560
+ return true;
561
+ }
562
+ }
563
+ return false;
564
+ }
565
+ md.block.ruler.before("fence", "center_block", blockCenterRule);
566
+ md.core.ruler.after("inline", "center_tags", (state) => {
567
+ const tokens = state.tokens;
568
+ function processToken(token) {
569
+ if (token.type === "html_inline") {
570
+ const trimmed = token.content.trim();
571
+ if (CENTER_OPEN_TAG_REGEX.test(trimmed)) {
572
+ token.content = '<span class="printdown-center">';
573
+ } else if (CENTER_CLOSE_TAG_REGEX.test(trimmed)) {
574
+ token.content = "</span>";
575
+ }
576
+ } else if (token.type === "html_block") {
577
+ token.content = token.content.replace(
578
+ /<center(\s+[^>]*)?>([\s\S]*?)<\/center>/gi,
579
+ (_, _attrs, body) => {
580
+ const rendered = md.render(body.trim()).trim();
581
+ return `<div class="printdown-center">${rendered}</div>`;
582
+ }
583
+ );
584
+ }
585
+ }
586
+ for (let i = 0; i < tokens.length; i++) {
587
+ processToken(tokens[i]);
588
+ if (tokens[i].children) {
589
+ for (let j = 0; j < tokens[i].children.length; j++) {
590
+ processToken(tokens[i].children[j]);
591
+ }
592
+ }
593
+ }
594
+ });
595
+ }
596
+
597
+ // src/markdown/plugins/heading.ts
598
+ var NO_BORDER_ATTR_REGEX = /\s*(?:\{(?:\.|\s)*(?:no-border|no-underline|no-bottom-border|plain|-)\s*\}|\[(?:no-border|no-underline)\]|<!--\s*(?:no-border|no-underline)\s*-->)\s*$/i;
599
+ function addClass2(token, className) {
600
+ const classIndex = token.attrIndex("class");
601
+ if (classIndex < 0) {
602
+ token.attrPush(["class", className]);
603
+ } else if (token.attrs) {
604
+ const existing = token.attrs[classIndex][1];
605
+ if (typeof existing === "string") {
606
+ const classes = existing.split(" ");
607
+ const newClasses = className.split(" ");
608
+ for (const cls of newClasses) {
609
+ if (!classes.includes(cls)) {
610
+ classes.push(cls);
611
+ }
612
+ }
613
+ token.attrs[classIndex][1] = classes.join(" ").trim();
614
+ }
615
+ }
616
+ }
617
+ function headingPlugin(md) {
618
+ md.core.ruler.after("inline", "heading_no_border", (state) => {
619
+ const tokens = state.tokens;
620
+ for (let i = 0; i < tokens.length; i++) {
621
+ if (tokens[i].type === "heading_open") {
622
+ const inlineToken = tokens[i + 1];
623
+ if (inlineToken && inlineToken.type === "inline") {
624
+ if (NO_BORDER_ATTR_REGEX.test(inlineToken.content)) {
625
+ addClass2(tokens[i], "printdown-no-border printdown-no-underline");
626
+ inlineToken.content = inlineToken.content.replace(NO_BORDER_ATTR_REGEX, "");
627
+ if (inlineToken.children && inlineToken.children.length > 0) {
628
+ for (let j = inlineToken.children.length - 1; j >= 0; j--) {
629
+ const child = inlineToken.children[j];
630
+ if (child.type === "text") {
631
+ if (NO_BORDER_ATTR_REGEX.test(child.content)) {
632
+ child.content = child.content.replace(NO_BORDER_ATTR_REGEX, "");
633
+ if (child.content === "") {
634
+ inlineToken.children.splice(j, 1);
635
+ }
636
+ break;
637
+ }
638
+ } else if (child.type === "html_inline") {
639
+ if (child.content.includes("no-border") || child.content.includes("no-underline")) {
640
+ inlineToken.children.splice(j, 1);
641
+ break;
642
+ }
643
+ }
644
+ }
645
+ }
646
+ }
647
+ }
648
+ } else if (tokens[i].type === "html_block") {
649
+ tokens[i].content = tokens[i].content.replace(
650
+ /<(h[1-6])(\s+[^>]*)?(?:\s+(?:no-border|no-underline))\s*([^>]*)>/gi,
651
+ (match, tag, before, after) => {
652
+ const combinedAttrs = `${before || ""} ${after || ""}`.trim();
653
+ if (combinedAttrs.includes('class="') || combinedAttrs.includes("class='")) {
654
+ return `<${tag} ${combinedAttrs.replace(
655
+ /class=(["'])(.*?)\1/,
656
+ "class=$1$2 printdown-no-border printdown-no-underline$1"
657
+ )}>`;
658
+ }
659
+ return `<${tag} class="printdown-no-border printdown-no-underline" ${combinedAttrs}>`.replace(
660
+ /\s+>/,
661
+ ">"
662
+ );
663
+ }
664
+ );
665
+ }
666
+ }
667
+ });
668
+ }
669
+
427
670
  // src/markdown/index.ts
428
671
  var DEFAULT_LANGS = [
429
672
  "javascript",
@@ -498,6 +741,8 @@ async function createMarkdownRenderer(options = {}) {
498
741
  md.use(taskListPlugin);
499
742
  md.use(badgePlugin);
500
743
  md.use(kbdPlugin);
744
+ md.use(centerPlugin);
745
+ md.use(headingPlugin);
501
746
  const highlighter = await getHighlighter(options.shiki);
502
747
  const theme = options.shiki?.theme || DEFAULT_THEME;
503
748
  const defaultFence = md.renderer.rules.fence;
@@ -1003,4 +1248,4 @@ export {
1003
1248
  render,
1004
1249
  renderFile
1005
1250
  };
1006
- //# sourceMappingURL=chunk-HX2CR2SJ.js.map
1251
+ //# sourceMappingURL=chunk-ZB6NLLOD.js.map