@format.dev/cli 0.0.0 → 0.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.
Files changed (109) hide show
  1. package/README.md +29 -20
  2. package/bin/format.mjs +20 -0
  3. package/dist/config-Dq7O4e8N.mjs +63 -0
  4. package/dist/config.d.mts +21 -0
  5. package/dist/config.mjs +3 -0
  6. package/dist/draw-random-name-BzvSSVqO.d.mts +4 -0
  7. package/dist/draw-random-name-Dpt6YmUk.mjs +13 -0
  8. package/dist/index.d.mts +1 -0
  9. package/dist/index.mjs +1539 -0
  10. package/dist/install-BiDrmMgJ.mjs +1486 -0
  11. package/dist/lockstep.d.mts +27 -0
  12. package/dist/lockstep.mjs +30 -0
  13. package/dist/project-pX62Di_9.mjs +124 -0
  14. package/dist/random-name.d.mts +2 -0
  15. package/dist/random-name.mjs +3 -0
  16. package/dist/scaffold-shared.d.mts +2 -0
  17. package/dist/scaffold-shared.mjs +3 -0
  18. package/dist/scaffold.d.mts +191 -0
  19. package/dist/scaffold.mjs +6 -0
  20. package/dist/shared-BD62UD5L.d.mts +32 -0
  21. package/dist/shared-CM3vyUlL.mjs +143 -0
  22. package/env.d.ts +99 -0
  23. package/package.json +86 -34
  24. package/templates/html/documents/welcome/data/alternative.json +3 -0
  25. package/templates/html/documents/welcome/data/default.json +3 -0
  26. package/templates/html/documents/welcome/index.html +32 -0
  27. package/templates/html/documents/welcome/index.ts +4 -0
  28. package/templates/html/documents/welcome/pages/Close/close.html +9 -0
  29. package/templates/html/documents/welcome/pages/Cover/cover.html +13 -0
  30. package/templates/html/documents/welcome/pages/FeatureShowcase/feature-showcase.css +296 -0
  31. package/templates/html/documents/welcome/pages/FeatureShowcase/feature-showcase.html +296 -0
  32. package/templates/html/documents/welcome/pages/NextSteps/next-steps.css +107 -0
  33. package/templates/html/documents/welcome/pages/NextSteps/next-steps.html +398 -0
  34. package/templates/html/documents/welcome/styles.css +214 -0
  35. package/templates/html/format.config.json +4 -0
  36. package/templates/html/package.json +15 -0
  37. package/templates/html/tsconfig.json +3 -0
  38. package/templates/react/documents/welcome/components/ButtonLink.tsx +29 -0
  39. package/templates/react/documents/welcome/data/alternative.json +3 -0
  40. package/templates/react/documents/welcome/data/default.json +3 -0
  41. package/templates/react/documents/welcome/data/schema.ts +7 -0
  42. package/templates/react/documents/welcome/icons/propeller-asterisk.svg +1 -0
  43. package/templates/react/documents/welcome/index.tsx +59 -0
  44. package/templates/react/documents/welcome/logos/_logo-base.tsx +9 -0
  45. package/templates/react/documents/welcome/logos/aws-lambda.tsx +22 -0
  46. package/templates/react/documents/welcome/logos/bun.tsx +30 -0
  47. package/templates/react/documents/welcome/logos/cloudflare-workers.tsx +52 -0
  48. package/templates/react/documents/welcome/logos/css-modules.tsx +54 -0
  49. package/templates/react/documents/welcome/logos/css-official.tsx +18 -0
  50. package/templates/react/documents/welcome/logos/deno.tsx +17 -0
  51. package/templates/react/documents/welcome/logos/linaria.tsx +18 -0
  52. package/templates/react/documents/welcome/logos/node.tsx +47 -0
  53. package/templates/react/documents/welcome/logos/panda-css.tsx +18 -0
  54. package/templates/react/documents/welcome/logos/sass.tsx +12 -0
  55. package/templates/react/documents/welcome/logos/tailwind.tsx +45 -0
  56. package/templates/react/documents/welcome/logos/vanilla-extract.tsx +74 -0
  57. package/templates/react/documents/welcome/logos/vercel.tsx +17 -0
  58. package/templates/react/documents/welcome/pages/Close/ClosePage.tsx +13 -0
  59. package/templates/react/documents/welcome/pages/Cover/CoverPage.tsx +17 -0
  60. package/templates/react/documents/welcome/pages/FeatureShowcase/FeatureShowcasePage.tsx +221 -0
  61. package/templates/react/documents/welcome/pages/FeatureShowcase/feature-showcase.css +296 -0
  62. package/templates/react/documents/welcome/pages/FeatureShowcase/mountains.ts +27 -0
  63. package/templates/react/documents/welcome/pages/NextSteps/NextStepsPage.tsx +146 -0
  64. package/templates/react/documents/welcome/pages/NextSteps/next-steps.css +107 -0
  65. package/templates/react/documents/welcome/styles.css +214 -0
  66. package/templates/react/documents/welcome/types.ts +4 -0
  67. package/templates/react/format.config.json +4 -0
  68. package/templates/react/package.json +22 -0
  69. package/templates/react/tsconfig.json +6 -0
  70. package/templates/shared/README.md +18 -0
  71. package/templates/shared/_env +1 -0
  72. package/templates/shared/_gitignore +3 -0
  73. package/templates/shared/documents/welcome/assets/deploy.svg +268 -0
  74. package/templates/shared/documents/welcome/assets/logo.svg +22 -0
  75. package/templates/shared/documents/welcome/assets/mona-sans.woff2 +0 -0
  76. package/templates/shared/documents/welcome/assets/styling.svg +59 -0
  77. package/templates/vue/documents/welcome/components/ButtonLink.vue +28 -0
  78. package/templates/vue/documents/welcome/data/alternative.json +3 -0
  79. package/templates/vue/documents/welcome/data/default.json +3 -0
  80. package/templates/vue/documents/welcome/data/schema.ts +7 -0
  81. package/templates/vue/documents/welcome/index.vue +48 -0
  82. package/templates/vue/documents/welcome/logos/aws-lambda.vue +18 -0
  83. package/templates/vue/documents/welcome/logos/bun.vue +26 -0
  84. package/templates/vue/documents/welcome/logos/cloudflare-workers.vue +48 -0
  85. package/templates/vue/documents/welcome/logos/css-modules.vue +49 -0
  86. package/templates/vue/documents/welcome/logos/css-official.vue +14 -0
  87. package/templates/vue/documents/welcome/logos/deno.vue +13 -0
  88. package/templates/vue/documents/welcome/logos/linaria.vue +14 -0
  89. package/templates/vue/documents/welcome/logos/node.vue +43 -0
  90. package/templates/vue/documents/welcome/logos/panda-css.vue +14 -0
  91. package/templates/vue/documents/welcome/logos/sass.vue +8 -0
  92. package/templates/vue/documents/welcome/logos/tailwind.vue +41 -0
  93. package/templates/vue/documents/welcome/logos/vanilla-extract.vue +70 -0
  94. package/templates/vue/documents/welcome/logos/vercel.vue +13 -0
  95. package/templates/vue/documents/welcome/pages/Close/ClosePage.vue +11 -0
  96. package/templates/vue/documents/welcome/pages/Cover/CoverPage.vue +19 -0
  97. package/templates/vue/documents/welcome/pages/FeatureShowcase/FeatureShowcasePage.vue +217 -0
  98. package/templates/vue/documents/welcome/pages/FeatureShowcase/feature-showcase.css +296 -0
  99. package/templates/vue/documents/welcome/pages/FeatureShowcase/mountains.ts +27 -0
  100. package/templates/vue/documents/welcome/pages/NextSteps/NextStepsPage.vue +146 -0
  101. package/templates/vue/documents/welcome/pages/NextSteps/next-steps.css +107 -0
  102. package/templates/vue/documents/welcome/styles.css +214 -0
  103. package/templates/vue/documents/welcome/types.ts +4 -0
  104. package/templates/vue/format.config.json +4 -0
  105. package/templates/vue/package.json +19 -0
  106. package/templates/vue/tsconfig.json +7 -0
  107. package/tsconfig.recommended.json +22 -0
  108. package/index.d.ts +0 -2
  109. package/index.js +0 -3
@@ -0,0 +1,296 @@
1
+ <section class="showcase-intro">
2
+ <h2>Made it this far?</h2>
3
+ <p>You're clearly in the zone. Let's demonstrate a few stand out features.</p>
4
+ </section>
5
+ <section class="showcase-feature">
6
+ <h3 class="feature-heading">Tables that paginate themselves</h3>
7
+ <p>
8
+ A long table is notoriously tricky to get right when you're making PDFs from HTML and CSS. Format flows the
9
+ rows across as many pages as they need, and repeats the header row on each one. Remember, in the table
10
+ example below, we haven't explicitly told Format where to split the table, it just flows across the two
11
+ pages automatically.
12
+ </p>
13
+ </section>
14
+ <template data-type="flow">
15
+ <div class="feature-table">
16
+ <p class="feature-table-caption">The world's highest mountains</p>
17
+ <table>
18
+ <thead>
19
+ <tr>
20
+ <th>Peak</th>
21
+ <th class="height">Height</th>
22
+ <th>Range</th>
23
+ <th>Country</th>
24
+ </tr>
25
+ </thead>
26
+ <tbody>
27
+ <template data-type="stream">
28
+ <tr>
29
+ <td class="peak">Everest</td>
30
+ <td class="height">8,849 m</td>
31
+ <td>Mahalangur Himalaya</td>
32
+ <td>Nepal / China</td>
33
+ </tr>
34
+ <tr>
35
+ <td class="peak">K2</td>
36
+ <td class="height">8,611 m</td>
37
+ <td>Karakoram</td>
38
+ <td>Pakistan / China</td>
39
+ </tr>
40
+ <tr>
41
+ <td class="peak">Kangchenjunga</td>
42
+ <td class="height">8,586 m</td>
43
+ <td>Kangchenjunga Himalaya</td>
44
+ <td>Nepal / India</td>
45
+ </tr>
46
+ <tr>
47
+ <td class="peak">Lhotse</td>
48
+ <td class="height">8,516 m</td>
49
+ <td>Mahalangur Himalaya</td>
50
+ <td>Nepal / China</td>
51
+ </tr>
52
+ <tr>
53
+ <td class="peak">Makalu</td>
54
+ <td class="height">8,485 m</td>
55
+ <td>Mahalangur Himalaya</td>
56
+ <td>Nepal / China</td>
57
+ </tr>
58
+ <tr>
59
+ <td class="peak">Cho Oyu</td>
60
+ <td class="height">8,188 m</td>
61
+ <td>Mahalangur Himalaya</td>
62
+ <td>Nepal / China</td>
63
+ </tr>
64
+ <tr>
65
+ <td class="peak">Dhaulagiri I</td>
66
+ <td class="height">8,167 m</td>
67
+ <td>Dhaulagiri Himalaya</td>
68
+ <td>Nepal</td>
69
+ </tr>
70
+ <tr>
71
+ <td class="peak">Manaslu</td>
72
+ <td class="height">8,163 m</td>
73
+ <td>Manaslu Himalaya</td>
74
+ <td>Nepal</td>
75
+ </tr>
76
+ <tr>
77
+ <td class="peak">Nanga Parbat</td>
78
+ <td class="height">8,126 m</td>
79
+ <td>Nanga Parbat Himalaya</td>
80
+ <td>Pakistan</td>
81
+ </tr>
82
+ <tr>
83
+ <td class="peak">Annapurna I</td>
84
+ <td class="height">8,091 m</td>
85
+ <td>Annapurna Himalaya</td>
86
+ <td>Nepal</td>
87
+ </tr>
88
+ <tr>
89
+ <td class="peak">Gasherbrum I</td>
90
+ <td class="height">8,080 m</td>
91
+ <td>Karakoram</td>
92
+ <td>Pakistan / China</td>
93
+ </tr>
94
+ <tr>
95
+ <td class="peak">Broad Peak</td>
96
+ <td class="height">8,051 m</td>
97
+ <td>Karakoram</td>
98
+ <td>Pakistan / China</td>
99
+ </tr>
100
+ <tr>
101
+ <td class="peak">Gasherbrum II</td>
102
+ <td class="height">8,035 m</td>
103
+ <td>Karakoram</td>
104
+ <td>Pakistan / China</td>
105
+ </tr>
106
+ <tr>
107
+ <td class="peak">Shishapangma</td>
108
+ <td class="height">8,027 m</td>
109
+ <td>Langtang Himalaya</td>
110
+ <td>China</td>
111
+ </tr>
112
+ <tr>
113
+ <td class="peak">Gyachung Kang</td>
114
+ <td class="height">7,952 m</td>
115
+ <td>Mahalangur Himalaya</td>
116
+ <td>Nepal / China</td>
117
+ </tr>
118
+ <tr>
119
+ <td class="peak">Gasherbrum III</td>
120
+ <td class="height">7,946 m</td>
121
+ <td>Karakoram</td>
122
+ <td>Pakistan / China</td>
123
+ </tr>
124
+ <tr>
125
+ <td class="peak">Annapurna II</td>
126
+ <td class="height">7,937 m</td>
127
+ <td>Annapurna Himalaya</td>
128
+ <td>Nepal</td>
129
+ </tr>
130
+ <tr>
131
+ <td class="peak">Himalchuli</td>
132
+ <td class="height">7,893 m</td>
133
+ <td>Manaslu Himalaya</td>
134
+ <td>Nepal</td>
135
+ </tr>
136
+ </template>
137
+ </tbody>
138
+ </table>
139
+ </div>
140
+ </template>
141
+ <template data-type="page-break"></template>
142
+ <section class="showcase-feature">
143
+ <h3 class="feature-heading">Flowing prose and footnotes</h3>
144
+ <p>
145
+ Format's pagination model is very effective for long-form text that you want to flow naturally across
146
+ pages. Choose your <code>splitGranularity</code> and let the engine do the rest. Check out the automatic
147
+ <code>&lt;Footnote&gt;</code> system too.
148
+ </p>
149
+ </section>
150
+ <template data-type="flow" data-split-granularity="word">
151
+ <div class="feature-prose">
152
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 766 766" fill="currentColor" class="fleuron" width="10" height="10" aria-hidden="true"><path d="M157 675Q133 675 112 654Q91 633 91 609Q91 583 114 560Q131 543 152.5 530.0Q174 517 200 504Q223 492 248.0 477.0Q273 462 302 440Q289 422 285 400Q250 405 221.5 412.0Q193 419 168 427Q140 436 115.5 442.0Q91 448 68 448Q36 448 18.0 430.5Q0 413 0 383Q0 353 18.0 335.5Q36 318 68 318Q91 318 115.5 324.0Q140 330 168 339Q193 347 221.5 354.0Q250 361 286 367Q290 344 303 326Q274 304 248.5 289.0Q223 274 200 262Q174 248 152.5 235.0Q131 222 114 206Q91 183 91 157Q91 133 112 112Q133 91 157 91Q183 91 206 114Q223 130 236.0 152.0Q249 174 262 200Q274 223 289.0 248.5Q304 274 326 303Q344 289 367 286Q361 250 354.0 221.5Q347 193 339 168Q330 139 324.0 115.0Q318 91 318 68Q318 36 335.5 18.0Q353 0 383 0Q413 0 430.5 18.0Q448 36 448 68Q448 91 442.0 115.0Q436 139 427 168Q419 193 412.0 221.5Q405 250 400 285Q422 289 440 302Q462 273 477.0 248.0Q492 223 504 200Q518 174 531.0 152.0Q544 130 560 114Q583 91 609 91Q633 91 654 112Q675 133 675 157Q675 183 652 206Q636 222 614.0 235.0Q592 248 566 262Q543 274 518.0 289.0Q493 304 464 326Q477 344 481 367Q516 361 544.5 354.0Q573 347 598 339Q627 330 651.0 324.0Q675 318 698 318Q730 318 748.0 335.5Q766 353 766 383Q766 413 748.0 430.5Q730 448 698 448Q675 448 651.0 442.0Q627 436 598 427Q573 419 544.5 412.0Q516 405 481 400Q477 422 464 441Q493 462 518.0 477.0Q543 492 566 504Q592 517 614.0 530.0Q636 543 652 560Q675 583 675 609Q675 633 654 654Q633 675 609 675Q583 675 560 652Q544 635 531.0 613.5Q518 592 504 566Q492 543 477.0 518.0Q462 493 441 464Q422 477 400 481Q405 516 412.0 544.5Q419 573 427 598Q436 626 442.0 650.5Q448 675 448 698Q448 730 430.5 748.0Q413 766 383 766Q353 766 335.5 748.0Q318 730 318 698Q318 675 324.0 650.5Q330 626 339 598Q347 573 354.0 544.5Q361 516 367 481Q344 477 326 464Q304 493 289.0 518.0Q274 543 262 566Q249 592 236.0 613.5Q223 635 206 652Q183 675 157 675Z"/></svg>
153
+ <p>
154
+ In the early 1990s, digital documents were strangely unstable<template data-type="footnote">Format lifts this note to the foot of the page it lands on, and numbers it for you.</template>.
155
+ You could write something, send it across town, and see it return with different fonts, altered spacing,
156
+ and page breaks that landed wherever they felt like. The text survived, but the layout, the thing that
157
+ made it readable, often didn't.
158
+ </p>
159
+ <p>
160
+ That wasn't because computers couldn't show text. It was because they all did it differently. Operating
161
+ systems handled fonts in inconsistent ways, printers relied on varied drivers and defaults, and even
162
+ similar setups could disagree on margins or letter widths. A document was less a finished object than a
163
+ set of instructions open to interpretation.
164
+ </p>
165
+ <p>
166
+ PDF showed up as a practical fix: a format designed to preserve the look of a page. Instead of depending
167
+ on the recipient's computer to recreate the layout, a PDF includes what's needed to render the page
168
+ consistently. It acted like digital paper, portable, stable, and reliable across devices.
169
+ </p>
170
+ <p>
171
+ At first, that predictability was the whole pitch. Manuals, invoices, design proofs, anything official
172
+ needed certainty, not improvisation. The promise was simple: what you see is what they will see, down to
173
+ the last line break.
174
+ </p>
175
+ <p>
176
+ Adoption took time, but PDFs fit into existing habits<template data-type="footnote">Format numbers footnotes continuously through the whole document.</template>. They printed
177
+ cleanly, handled images and typography well, and could be shared as a single file rather than a messy
178
+ bundle of fonts and linked graphics. For organizations, that alone made exporting to PDF worth it.
179
+ </p>
180
+ <p>
181
+ As the web became the main way information traveled, portability mattered even more. Documents weren't
182
+ just moving between coworkers; they were crossing platforms, browsers, and devices that didn't share the
183
+ same assumptions. A PDF offered a straightforward deal: you can view this without rebuilding it.
184
+ </p>
185
+ <p>
186
+ PDF also changed how a file felt. Editable formats implied collaboration and revision; PDFs implied
187
+ reading, signing, and completion. Even if the content could still change later, the format signaled
188
+ intent: this is the document, not a draft.
189
+ </p>
190
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 766 766" fill="currentColor" class="fleuron" width="10" height="10" aria-hidden="true"><path d="M157 675Q133 675 112 654Q91 633 91 609Q91 583 114 560Q131 543 152.5 530.0Q174 517 200 504Q223 492 248.0 477.0Q273 462 302 440Q289 422 285 400Q250 405 221.5 412.0Q193 419 168 427Q140 436 115.5 442.0Q91 448 68 448Q36 448 18.0 430.5Q0 413 0 383Q0 353 18.0 335.5Q36 318 68 318Q91 318 115.5 324.0Q140 330 168 339Q193 347 221.5 354.0Q250 361 286 367Q290 344 303 326Q274 304 248.5 289.0Q223 274 200 262Q174 248 152.5 235.0Q131 222 114 206Q91 183 91 157Q91 133 112 112Q133 91 157 91Q183 91 206 114Q223 130 236.0 152.0Q249 174 262 200Q274 223 289.0 248.5Q304 274 326 303Q344 289 367 286Q361 250 354.0 221.5Q347 193 339 168Q330 139 324.0 115.0Q318 91 318 68Q318 36 335.5 18.0Q353 0 383 0Q413 0 430.5 18.0Q448 36 448 68Q448 91 442.0 115.0Q436 139 427 168Q419 193 412.0 221.5Q405 250 400 285Q422 289 440 302Q462 273 477.0 248.0Q492 223 504 200Q518 174 531.0 152.0Q544 130 560 114Q583 91 609 91Q633 91 654 112Q675 133 675 157Q675 183 652 206Q636 222 614.0 235.0Q592 248 566 262Q543 274 518.0 289.0Q493 304 464 326Q477 344 481 367Q516 361 544.5 354.0Q573 347 598 339Q627 330 651.0 324.0Q675 318 698 318Q730 318 748.0 335.5Q766 353 766 383Q766 413 748.0 430.5Q730 448 698 448Q675 448 651.0 442.0Q627 436 598 427Q573 419 544.5 412.0Q516 405 481 400Q477 422 464 441Q493 462 518.0 477.0Q543 492 566 504Q592 517 614.0 530.0Q636 543 652 560Q675 583 675 609Q675 633 654 654Q633 675 609 675Q583 675 560 652Q544 635 531.0 613.5Q518 592 504 566Q492 543 477.0 518.0Q462 493 441 464Q422 477 400 481Q405 516 412.0 544.5Q419 573 427 598Q436 626 442.0 650.5Q448 675 448 698Q448 730 430.5 748.0Q413 766 383 766Q353 766 335.5 748.0Q318 730 318 698Q318 675 324.0 650.5Q330 626 339 598Q347 573 354.0 544.5Q361 516 367 481Q344 477 326 464Q304 493 289.0 518.0Q274 543 262 566Q249 592 236.0 613.5Q223 635 206 652Q183 675 157 675Z"/></svg>
191
+ </div>
192
+ <div class="prose-learn-more">
193
+ <p>Learn more about how to split content across pages and how to work with footnotes.</p>
194
+ <div class="button-row">
195
+ <a class="button" href="https://format.dev/docs/document-model/types/flow" target="_blank" rel="noopener noreferrer">Flow docs<svg class="button-icon" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M8 7h9v9"/></svg></a>
196
+ <a class="button" href="https://format.dev/docs/document-model/types/footnote" target="_blank" rel="noopener noreferrer">Footnote docs<svg class="button-icon" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M8 7h9v9"/></svg></a>
197
+ </div>
198
+ </div>
199
+ </template>
200
+ <template data-type="page-break"></template>
201
+ <section class="showcase-feature">
202
+ <h3 class="feature-heading">Full support for modern CSS</h3>
203
+ <p>
204
+ You might have experienced other tools flattening or "rasterizing" certain CSS visuals such as box shadows,
205
+ fancy borders or gradients. Format produces fully vector output, increasing fidelity, whilst decreasing
206
+ filesize. Equally, all modern layout techniques are supported, like flexbox and grid.
207
+ </p>
208
+ <div class="css-demo">
209
+ <div class="css-demo-tile tile-shadow">
210
+ <div class="tile-visual"></div>
211
+ <span class="tile-label">Drop shadow</span>
212
+ </div>
213
+ <div class="css-demo-tile tile-gradient">
214
+ <div class="tile-visual"></div>
215
+ <span class="tile-label">Gradients</span>
216
+ </div>
217
+ <div class="css-demo-tile tile-transform">
218
+ <div class="tile-visual"></div>
219
+ <span class="tile-label">Transforms</span>
220
+ </div>
221
+ <div class="css-demo-tile tile-grid">
222
+ <div class="tile-visual"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div>
223
+ <span class="tile-label">Grid</span>
224
+ </div>
225
+ <div class="css-demo-tile tile-flex">
226
+ <div class="tile-visual"><span></span><span></span><span></span></div>
227
+ <span class="tile-label">Flexbox</span>
228
+ </div>
229
+ <div class="css-demo-tile tile-radius">
230
+ <div class="tile-visual"></div>
231
+ <span class="tile-label">Rounded corners</span>
232
+ </div>
233
+ <div class="css-demo-tile tile-orphans">
234
+ <div class="tile-visual"><span></span><span></span><span></span><span></span></div>
235
+ <span class="tile-label">Orphans &amp; widows</span>
236
+ </div>
237
+ <div class="css-demo-tile tile-breaks">
238
+ <div class="tile-visual"><span></span><span></span><span></span><span></span><span></span></div>
239
+ <span class="tile-label">Break before/after</span>
240
+ </div>
241
+ <div class="css-demo-tile tile-pattern">
242
+ <div class="tile-visual"></div>
243
+ <span class="tile-label">Repeating patterns</span>
244
+ </div>
245
+ </div>
246
+ <p>
247
+ Take repeating backgrounds, for example. These are especially awkward in other tools, often either not
248
+ displaying at all, or just getting rasterized, which, for anyone that wants quality will not be happy with.
249
+ In Format, whether you're using <code>background-repeat</code> to tile an SVG or the
250
+ <code>&lt;pattern&gt;</code> tag inside an SVG on the page, you'll get crisp pattern repeats and small PDF
251
+ filesizes.
252
+ </p>
253
+ <div class="css-pattern-demo">
254
+ <svg class="css-pattern" aria-hidden="true">
255
+ <defs>
256
+ <pattern id="fs-diagonal-stripes" width="14" height="14" fill="#999" patternUnits="userSpaceOnUse" patternTransform="rotate(-45)">
257
+ <rect class="css-pattern-stripe" width="6" height="14" />
258
+ </pattern>
259
+ </defs>
260
+ <rect width="800" height="200" fill="url(#fs-diagonal-stripes)" />
261
+ </svg>
262
+ <span class="css-pattern-caption">A seamless SVG &lt;pattern&gt;, kept as vector in the PDF</span>
263
+ </div>
264
+ <p>
265
+ We've spent countless hours smoothing over CSS quirks and PDF-viewer edge cases, so your documents render
266
+ the same everywhere, at the smallest file sizes, delivered fast over the wire.
267
+ </p>
268
+ </section>
269
+ <section class="showcase-feature">
270
+ <h3 class="feature-heading">And there's plenty more&hellip;</h3>
271
+ <p>
272
+ We're determined to conquer every feature and every edge-case in HTML and CSS, so you can build the very
273
+ highest quality PDFs. Here are a few other features to read about.
274
+ </p>
275
+ <ul class="more-list">
276
+ <li>
277
+ <strong>Automatic tables of contents.</strong> Built from your headings, with page numbers filled in
278
+ after layout. Even use several ToCs in one document with no overlap.
279
+ <a class="button button-inline" href="https://format.dev/docs/document-model/types/table-of-contents" target="_blank" rel="noopener noreferrer">ToC docs<svg class="button-icon" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M8 7h9v9"/></svg></a>
280
+ </li>
281
+ <li>
282
+ <strong>Page counters.</strong> Live page numbers and totals in any numbering style.
283
+ <a class="button button-inline" href="https://format.dev/docs/document-model/types/counter" target="_blank" rel="noopener noreferrer">Counter docs<svg class="button-icon" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M8 7h9v9"/></svg></a>
284
+ </li>
285
+ <li>
286
+ <strong>Numbered figures and cross-references.</strong> Number a figure or heading, then point to it by
287
+ name. "See Figure 3" resolves to the right number even as content reflows.
288
+ <a class="button button-inline" href="https://format.dev/docs/document-model/types/ref" target="_blank" rel="noopener noreferrer">Ref docs<svg class="button-icon" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M8 7h9v9"/></svg></a>
289
+ </li>
290
+ <li>
291
+ <strong>Endnotes and references.</strong> Collect footnotes into an endnotes list, or output the page a
292
+ target landed on once the layout settles.
293
+ <a class="button button-inline" href="https://format.dev/docs/document-model/types/footnotes" target="_blank" rel="noopener noreferrer">Endnotes docs<svg class="button-icon" width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"/><path d="M8 7h9v9"/></svg></a>
294
+ </li>
295
+ </ul>
296
+ </section>
@@ -0,0 +1,107 @@
1
+ .next-steps {
2
+ list-style: none;
3
+ margin-block-start: 36px;
4
+ padding: 0;
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 40px;
8
+
9
+ .button {
10
+ margin-block-start: 12px;
11
+ }
12
+ }
13
+
14
+ .next-steps-step {
15
+ display: grid;
16
+ grid-template-columns: 32px 1fr;
17
+ gap: 16px;
18
+ align-items: baseline;
19
+ break-inside: avoid;
20
+ }
21
+
22
+ .next-steps-marker {
23
+ display: grid;
24
+ place-items: center;
25
+ width: 32px;
26
+ height: 32px;
27
+ border: var(--hairline);
28
+ border-radius: 50%;
29
+ background: white;
30
+ font-family: monospace;
31
+ font-size: 14px;
32
+ font-variant-numeric: tabular-nums;
33
+ transform: translateY(-2px);
34
+ }
35
+
36
+ .next-steps-content {
37
+ display: flex;
38
+ flex-direction: column;
39
+ align-items: flex-start;
40
+ gap: 12px;
41
+ }
42
+
43
+ .next-steps-title {
44
+ margin: 0;
45
+ font-size: 18px;
46
+ font-weight: 800;
47
+ letter-spacing: -0.3px;
48
+ color: var(--color-text-prose);
49
+ }
50
+
51
+ .next-steps-body {
52
+ margin: 0;
53
+ font-size: 15px;
54
+ }
55
+
56
+ .learn-list {
57
+ padding: 0;
58
+ list-style: none;
59
+ display: flex;
60
+ flex-direction: column;
61
+ gap: 8px;
62
+
63
+ li {
64
+ position: relative;
65
+ padding-left: 24px;
66
+ font-size: 14px;
67
+ line-height: 1.4;
68
+ color: var(--color-text);
69
+
70
+ &:before {
71
+ content: '';
72
+ position: absolute;
73
+ left: 5px;
74
+ top: 3px;
75
+ width: 5px;
76
+ height: 9px;
77
+ border: solid var(--color-accent);
78
+ border-width: 0 2px 2px 0;
79
+ transform: rotate(45deg);
80
+ }
81
+ }
82
+ }
83
+
84
+ .logos-row {
85
+ display: flex;
86
+ flex-wrap: wrap;
87
+ gap: 16px;
88
+ margin-block-start: 12px;
89
+ }
90
+
91
+ .logo-item {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ gap: 8px;
95
+ font-size: 12px;
96
+ font-weight: 600;
97
+ background: var(--color-bg-muted);
98
+ padding: 8px 14px;
99
+ border-radius: 48px;
100
+ border: var(--hairline);
101
+ box-shadow: 0 1px 4px -1px rgb(0 0 0 / 3%);
102
+
103
+ svg {
104
+ width: auto;
105
+ height: 18px;
106
+ }
107
+ }