create-neutron 0.1.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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +201 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +45 -0
  8. package/templates/app/_gitignore +3 -0
  9. package/templates/app/index.html +12 -0
  10. package/templates/app/neutron.config.ts +5 -0
  11. package/templates/app/package.json +24 -0
  12. package/templates/app/src/main.tsx +5 -0
  13. package/templates/app/src/routes/_layout.tsx +18 -0
  14. package/templates/app/src/routes/api/session/refresh.tsx +28 -0
  15. package/templates/app/src/routes/app/dashboard.tsx +39 -0
  16. package/templates/app/src/routes/app/settings.tsx +68 -0
  17. package/templates/app/src/routes/index.tsx +26 -0
  18. package/templates/app/src/routes/login.tsx +14 -0
  19. package/templates/app/src/routes/protected.tsx +53 -0
  20. package/templates/app/src/routes/users/[id].tsx +26 -0
  21. package/templates/app/tsconfig.json +14 -0
  22. package/templates/app/vite.config.ts +7 -0
  23. package/templates/basic/_gitignore +3 -0
  24. package/templates/basic/index.html +12 -0
  25. package/templates/basic/neutron.config.ts +5 -0
  26. package/templates/basic/package.json +24 -0
  27. package/templates/basic/src/main.tsx +5 -0
  28. package/templates/basic/src/routes/_layout.tsx +16 -0
  29. package/templates/basic/src/routes/index.tsx +19 -0
  30. package/templates/basic/src/routes/users/[id].tsx +26 -0
  31. package/templates/basic/tsconfig.json +14 -0
  32. package/templates/basic/vite.config.ts +7 -0
  33. package/templates/docs/_gitignore +3 -0
  34. package/templates/docs/index.html +12 -0
  35. package/templates/docs/neutron.config.ts +8 -0
  36. package/templates/docs/package.json +22 -0
  37. package/templates/docs/public/favicon.svg +1 -0
  38. package/templates/docs/src/components/Breadcrumbs.tsx +47 -0
  39. package/templates/docs/src/components/Callout.tsx +40 -0
  40. package/templates/docs/src/components/Card.tsx +31 -0
  41. package/templates/docs/src/components/CopyButton.tsx +35 -0
  42. package/templates/docs/src/components/Footer.tsx +72 -0
  43. package/templates/docs/src/components/Search.tsx +139 -0
  44. package/templates/docs/src/components/Sidebar.tsx +59 -0
  45. package/templates/docs/src/components/SidebarToggle.tsx +47 -0
  46. package/templates/docs/src/components/Steps.tsx +9 -0
  47. package/templates/docs/src/components/Tabs.tsx +35 -0
  48. package/templates/docs/src/components/ThemeToggle.tsx +45 -0
  49. package/templates/docs/src/components/Toc.tsx +36 -0
  50. package/templates/docs/src/components/TocTracker.tsx +35 -0
  51. package/templates/docs/src/content/config.ts +13 -0
  52. package/templates/docs/src/content/docs/getting-started/installation.mdx +18 -0
  53. package/templates/docs/src/content/docs/getting-started/quick-start.mdx +19 -0
  54. package/templates/docs/src/content/docs/index.mdx +13 -0
  55. package/templates/docs/src/lib/pagination.ts +39 -0
  56. package/templates/docs/src/lib/sidebar.ts +100 -0
  57. package/templates/docs/src/main.tsx +8 -0
  58. package/templates/docs/src/routes/_layout.tsx +27 -0
  59. package/templates/docs/src/routes/docs/[...slug].tsx +85 -0
  60. package/templates/docs/src/routes/docs/_layout.tsx +47 -0
  61. package/templates/docs/src/styles/code.css +188 -0
  62. package/templates/docs/src/styles/components.css +264 -0
  63. package/templates/docs/src/styles/docs.css +416 -0
  64. package/templates/docs/src/styles/prose.css +224 -0
  65. package/templates/docs/src/styles/search.css +225 -0
  66. package/templates/docs/tsconfig.json +19 -0
  67. package/templates/docs/vite.config.ts +6 -0
  68. package/templates/full/_gitignore +3 -0
  69. package/templates/full/index.html +12 -0
  70. package/templates/full/neutron.config.ts +5 -0
  71. package/templates/full/package.json +24 -0
  72. package/templates/full/src/components/Counter.tsx +13 -0
  73. package/templates/full/src/main.tsx +5 -0
  74. package/templates/full/src/routes/(marketing)/pricing.tsx +15 -0
  75. package/templates/full/src/routes/_layout.tsx +17 -0
  76. package/templates/full/src/routes/app/dashboard.tsx +28 -0
  77. package/templates/full/src/routes/app/settings.tsx +42 -0
  78. package/templates/full/src/routes/index.tsx +31 -0
  79. package/templates/full/src/routes/users/[id].tsx +26 -0
  80. package/templates/full/tsconfig.json +14 -0
  81. package/templates/full/vite.config.ts +7 -0
  82. package/templates/marketing/_gitignore +3 -0
  83. package/templates/marketing/index.html +12 -0
  84. package/templates/marketing/neutron.config.ts +5 -0
  85. package/templates/marketing/package.json +24 -0
  86. package/templates/marketing/src/components/Counter.tsx +14 -0
  87. package/templates/marketing/src/main.tsx +5 -0
  88. package/templates/marketing/src/routes/_layout.tsx +16 -0
  89. package/templates/marketing/src/routes/about.tsx +10 -0
  90. package/templates/marketing/src/routes/blog/[slug].tsx +34 -0
  91. package/templates/marketing/src/routes/blog/index.tsx +27 -0
  92. package/templates/marketing/src/routes/index.tsx +26 -0
  93. package/templates/marketing/src/routes/users/index.tsx +10 -0
  94. package/templates/marketing/tsconfig.json +14 -0
  95. package/templates/marketing/vite.config.ts +7 -0
@@ -0,0 +1,416 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
2
+ @import './prose.css';
3
+ @import './code.css';
4
+ @import './components.css';
5
+ @import './search.css';
6
+
7
+ /* Theme tokens */
8
+ :root {
9
+ --nd-bg: #09090b;
10
+ --nd-fg: #fafafa;
11
+ --nd-muted: #a1a1aa;
12
+ --nd-border: hsla(0, 0%, 40%, 0.2);
13
+ --nd-accent: #818cf8;
14
+ --nd-sidebar-bg: #09090b;
15
+ --nd-card-bg: hsla(0, 0%, 100%, 0.03);
16
+ --nd-card-hover: hsla(0, 0%, 100%, 0.06);
17
+ --nd-code-bg: #18181b;
18
+ --nd-radius: 0.5rem;
19
+ --nd-sidebar-width: 17rem;
20
+ --nd-toc-width: 15rem;
21
+ --nd-content-max: 52rem;
22
+ }
23
+
24
+ [data-theme="light"] {
25
+ --nd-bg: #fafafa;
26
+ --nd-fg: #18181b;
27
+ --nd-muted: #71717a;
28
+ --nd-border: hsla(0, 0%, 0%, 0.08);
29
+ --nd-accent: #6366f1;
30
+ --nd-sidebar-bg: #fafafa;
31
+ --nd-card-bg: hsla(0, 0%, 0%, 0.03);
32
+ --nd-card-hover: hsla(0, 0%, 0%, 0.06);
33
+ --nd-code-bg: #f4f4f5;
34
+ }
35
+
36
+ /* Base reset */
37
+ *,
38
+ *::before,
39
+ *::after {
40
+ box-sizing: border-box;
41
+ margin: 0;
42
+ }
43
+
44
+ html {
45
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
46
+ font-size: 1rem;
47
+ line-height: 1.75;
48
+ background: var(--nd-bg);
49
+ color: var(--nd-fg);
50
+ -webkit-font-smoothing: antialiased;
51
+ -moz-osx-font-smoothing: grayscale;
52
+ }
53
+
54
+ body {
55
+ margin: 0;
56
+ min-height: 100vh;
57
+ }
58
+
59
+ a {
60
+ color: inherit;
61
+ text-decoration: none;
62
+ }
63
+
64
+ /* Three-column docs layout */
65
+ .docs-layout {
66
+ display: grid;
67
+ grid-template-columns: var(--nd-sidebar-width) minmax(0, 1fr) var(--nd-toc-width);
68
+ max-width: 1400px;
69
+ margin: 0 auto;
70
+ min-height: 100vh;
71
+ }
72
+
73
+ /* Sidebar */
74
+ .docs-sidebar {
75
+ position: sticky;
76
+ top: 0;
77
+ height: 100vh;
78
+ overflow-y: auto;
79
+ padding: 1.5rem 1rem;
80
+ background: var(--nd-sidebar-bg);
81
+ border-right: 1px solid var(--nd-border);
82
+ font-size: 0.875rem;
83
+ scrollbar-width: thin;
84
+ scrollbar-color: var(--nd-border) transparent;
85
+ }
86
+
87
+ .docs-sidebar::-webkit-scrollbar {
88
+ width: 4px;
89
+ }
90
+
91
+ .docs-sidebar::-webkit-scrollbar-track {
92
+ background: transparent;
93
+ }
94
+
95
+ .docs-sidebar::-webkit-scrollbar-thumb {
96
+ background: var(--nd-border);
97
+ border-radius: 2px;
98
+ }
99
+
100
+ .docs-sidebar-logo {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 0.5rem;
104
+ font-size: 1rem;
105
+ font-weight: 600;
106
+ padding-bottom: 1.25rem;
107
+ margin-bottom: 1rem;
108
+ border-bottom: 1px solid var(--nd-border);
109
+ }
110
+
111
+ .docs-sidebar-logo img,
112
+ .docs-sidebar-logo svg {
113
+ width: 1.5rem;
114
+ height: 1.5rem;
115
+ }
116
+
117
+ .docs-sidebar nav {
118
+ display: flex;
119
+ flex-direction: column;
120
+ gap: 0.125rem;
121
+ }
122
+
123
+ .docs-sidebar-section {
124
+ margin-top: 1rem;
125
+ }
126
+
127
+ .docs-sidebar-section > summary,
128
+ .docs-sidebar-section-title {
129
+ font-size: 0.875rem;
130
+ font-weight: 600;
131
+ color: var(--nd-fg);
132
+ padding: 0.375rem 0.5rem;
133
+ cursor: pointer;
134
+ list-style: none;
135
+ user-select: none;
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: space-between;
139
+ }
140
+
141
+ .docs-sidebar-section > summary::-webkit-details-marker {
142
+ display: none;
143
+ }
144
+
145
+ .docs-sidebar-section > summary::after {
146
+ content: '';
147
+ width: 0.375rem;
148
+ height: 0.375rem;
149
+ border-right: 1.5px solid var(--nd-muted);
150
+ border-bottom: 1.5px solid var(--nd-muted);
151
+ transform: rotate(-45deg);
152
+ transition: transform 0.15s ease;
153
+ }
154
+
155
+ .docs-sidebar-section[open] > summary::after {
156
+ transform: rotate(45deg);
157
+ }
158
+
159
+ .docs-sidebar-section-items {
160
+ display: flex;
161
+ flex-direction: column;
162
+ gap: 0.125rem;
163
+ padding-left: 0.5rem;
164
+ margin-top: 0.125rem;
165
+ }
166
+
167
+ .docs-sidebar-link {
168
+ display: block;
169
+ padding: 0.375rem 0.75rem;
170
+ border-radius: var(--nd-radius);
171
+ color: var(--nd-muted);
172
+ font-weight: 400;
173
+ transition: color 0.15s ease, background 0.15s ease;
174
+ }
175
+
176
+ .docs-sidebar-link:hover {
177
+ color: var(--nd-fg);
178
+ background: var(--nd-card-bg);
179
+ }
180
+
181
+ .docs-sidebar-link[aria-current="page"] {
182
+ color: var(--nd-fg);
183
+ background: var(--nd-card-hover);
184
+ font-weight: 500;
185
+ }
186
+
187
+ /* Content area */
188
+ .docs-main {
189
+ padding: 2.5rem 3rem;
190
+ max-width: var(--nd-content-max);
191
+ width: 100%;
192
+ min-width: 0;
193
+ }
194
+
195
+ .docs-main-header {
196
+ margin-bottom: 2rem;
197
+ }
198
+
199
+ .docs-main-header h1 {
200
+ font-size: 1.875rem;
201
+ font-weight: 700;
202
+ line-height: 1.2;
203
+ letter-spacing: -0.02em;
204
+ }
205
+
206
+ .docs-main-header p {
207
+ margin-top: 0.5rem;
208
+ color: var(--nd-muted);
209
+ font-size: 1rem;
210
+ }
211
+
212
+ /* TOC */
213
+ .docs-toc {
214
+ position: sticky;
215
+ top: 0;
216
+ height: 100vh;
217
+ overflow-y: auto;
218
+ padding: 2.5rem 1rem 2.5rem 0;
219
+ font-size: 0.875rem;
220
+ scrollbar-width: thin;
221
+ scrollbar-color: var(--nd-border) transparent;
222
+ }
223
+
224
+ .docs-toc::-webkit-scrollbar {
225
+ width: 4px;
226
+ }
227
+
228
+ .docs-toc::-webkit-scrollbar-track {
229
+ background: transparent;
230
+ }
231
+
232
+ .docs-toc::-webkit-scrollbar-thumb {
233
+ background: var(--nd-border);
234
+ border-radius: 2px;
235
+ }
236
+
237
+ .docs-toc-title {
238
+ font-size: 0.875rem;
239
+ font-weight: 600;
240
+ margin-bottom: 0.75rem;
241
+ color: var(--nd-fg);
242
+ }
243
+
244
+ .docs-toc nav {
245
+ display: flex;
246
+ flex-direction: column;
247
+ gap: 0.25rem;
248
+ border-left: 1px solid var(--nd-border);
249
+ padding-left: 0.75rem;
250
+ }
251
+
252
+ .docs-toc-link {
253
+ display: block;
254
+ padding: 0.25rem 0;
255
+ color: var(--nd-muted);
256
+ font-weight: 400;
257
+ transition: color 0.15s ease;
258
+ }
259
+
260
+ .docs-toc-link:hover {
261
+ color: var(--nd-fg);
262
+ }
263
+
264
+ .docs-toc-link[aria-current="true"] {
265
+ color: var(--nd-accent);
266
+ font-weight: 500;
267
+ }
268
+
269
+ .docs-toc-link--h3 {
270
+ padding-left: 0.75rem;
271
+ }
272
+
273
+ /* Breadcrumbs */
274
+ .docs-breadcrumbs {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 0.375rem;
278
+ font-size: 0.875rem;
279
+ color: var(--nd-muted);
280
+ margin-bottom: 1rem;
281
+ }
282
+
283
+ .docs-breadcrumbs a {
284
+ color: var(--nd-muted);
285
+ transition: color 0.15s ease;
286
+ }
287
+
288
+ .docs-breadcrumbs a:hover {
289
+ color: var(--nd-fg);
290
+ }
291
+
292
+ .docs-breadcrumbs-sep {
293
+ color: var(--nd-border);
294
+ user-select: none;
295
+ }
296
+
297
+ .docs-breadcrumbs-current {
298
+ color: var(--nd-fg);
299
+ font-weight: 500;
300
+ }
301
+
302
+ /* Footer pagination */
303
+ .docs-footer {
304
+ display: grid;
305
+ grid-template-columns: 1fr 1fr;
306
+ gap: 1rem;
307
+ margin-top: 3rem;
308
+ padding-top: 2rem;
309
+ border-top: 1px solid var(--nd-border);
310
+ }
311
+
312
+ .docs-footer-link {
313
+ display: flex;
314
+ flex-direction: column;
315
+ gap: 0.25rem;
316
+ padding: 1rem;
317
+ border: 1px solid var(--nd-border);
318
+ border-radius: var(--nd-radius);
319
+ transition: background 0.15s ease, border-color 0.15s ease;
320
+ }
321
+
322
+ .docs-footer-link:hover {
323
+ background: var(--nd-card-bg);
324
+ border-color: var(--nd-muted);
325
+ }
326
+
327
+ .docs-footer-link--next {
328
+ text-align: right;
329
+ grid-column: 2;
330
+ }
331
+
332
+ .docs-footer-label {
333
+ font-size: 0.875rem;
334
+ color: var(--nd-muted);
335
+ font-weight: 400;
336
+ }
337
+
338
+ .docs-footer-title {
339
+ font-size: 1rem;
340
+ font-weight: 500;
341
+ color: var(--nd-fg);
342
+ }
343
+
344
+ /* Mobile sidebar toggle */
345
+ .docs-mobile-toggle {
346
+ display: none;
347
+ position: fixed;
348
+ bottom: 1.25rem;
349
+ right: 1.25rem;
350
+ z-index: 50;
351
+ width: 3rem;
352
+ height: 3rem;
353
+ border-radius: var(--nd-radius);
354
+ border: 1px solid var(--nd-border);
355
+ background: var(--nd-bg);
356
+ color: var(--nd-fg);
357
+ cursor: pointer;
358
+ align-items: center;
359
+ justify-content: center;
360
+ }
361
+
362
+ .docs-mobile-toggle svg {
363
+ width: 1.25rem;
364
+ height: 1.25rem;
365
+ }
366
+
367
+ .docs-sidebar-overlay {
368
+ display: none;
369
+ position: fixed;
370
+ inset: 0;
371
+ z-index: 39;
372
+ background: hsla(0, 0%, 0%, 0.5);
373
+ }
374
+
375
+ /* Responsive */
376
+ @media (max-width: 1280px) {
377
+ .docs-layout {
378
+ grid-template-columns: var(--nd-sidebar-width) minmax(0, 1fr);
379
+ }
380
+
381
+ .docs-toc {
382
+ display: none;
383
+ }
384
+ }
385
+
386
+ @media (max-width: 768px) {
387
+ .docs-layout {
388
+ grid-template-columns: 1fr;
389
+ }
390
+
391
+ .docs-sidebar {
392
+ position: fixed;
393
+ top: 0;
394
+ left: 0;
395
+ z-index: 40;
396
+ width: var(--nd-sidebar-width);
397
+ transform: translateX(-100%);
398
+ transition: transform 0.2s ease;
399
+ }
400
+
401
+ .docs-sidebar.is-open {
402
+ transform: translateX(0);
403
+ }
404
+
405
+ .docs-sidebar.is-open ~ .docs-sidebar-overlay {
406
+ display: block;
407
+ }
408
+
409
+ .docs-mobile-toggle {
410
+ display: flex;
411
+ }
412
+
413
+ .docs-main {
414
+ padding: 1.5rem 1rem;
415
+ }
416
+ }
@@ -0,0 +1,224 @@
1
+ /* Prose — rendered markdown typography */
2
+
3
+ .prose {
4
+ font-size: 1rem;
5
+ line-height: 1.75;
6
+ color: var(--nd-fg);
7
+ }
8
+
9
+ .prose > * + * {
10
+ margin-top: 1.25rem;
11
+ }
12
+
13
+ /* Headings */
14
+ .prose h1 {
15
+ font-size: 1.875rem;
16
+ font-weight: 700;
17
+ line-height: 1.2;
18
+ letter-spacing: -0.02em;
19
+ margin-top: 0;
20
+ }
21
+
22
+ .prose h2 {
23
+ font-size: 1.5rem;
24
+ font-weight: 600;
25
+ line-height: 1.3;
26
+ letter-spacing: -0.01em;
27
+ margin-top: 2.5rem;
28
+ padding-bottom: 0.5rem;
29
+ border-bottom: 1px solid var(--nd-border);
30
+ }
31
+
32
+ .prose h3 {
33
+ font-size: 1.25rem;
34
+ font-weight: 600;
35
+ line-height: 1.4;
36
+ margin-top: 2rem;
37
+ }
38
+
39
+ .prose h2 + h3 {
40
+ margin-top: 1rem;
41
+ }
42
+
43
+ /* Heading anchors */
44
+ .prose h2 > a,
45
+ .prose h3 > a {
46
+ color: inherit;
47
+ text-decoration: none;
48
+ }
49
+
50
+ .prose h2 > a:hover::after,
51
+ .prose h3 > a:hover::after {
52
+ content: ' #';
53
+ color: var(--nd-muted);
54
+ font-weight: 400;
55
+ }
56
+
57
+ /* Paragraphs */
58
+ .prose p {
59
+ margin-top: 1.25rem;
60
+ }
61
+
62
+ .prose h1 + p,
63
+ .prose h2 + p,
64
+ .prose h3 + p {
65
+ margin-top: 0.5rem;
66
+ }
67
+
68
+ /* Links */
69
+ .prose a {
70
+ color: var(--nd-accent);
71
+ text-decoration: none;
72
+ font-weight: 500;
73
+ transition: text-decoration 0.15s ease;
74
+ }
75
+
76
+ .prose a:hover {
77
+ text-decoration: underline;
78
+ text-underline-offset: 2px;
79
+ }
80
+
81
+ /* Bold and italic */
82
+ .prose strong {
83
+ font-weight: 600;
84
+ color: var(--nd-fg);
85
+ }
86
+
87
+ .prose em {
88
+ font-style: italic;
89
+ }
90
+
91
+ /* Lists */
92
+ .prose ul,
93
+ .prose ol {
94
+ padding-left: 1.5rem;
95
+ margin-top: 1rem;
96
+ }
97
+
98
+ .prose ul {
99
+ list-style-type: disc;
100
+ }
101
+
102
+ .prose ol {
103
+ list-style-type: decimal;
104
+ }
105
+
106
+ .prose li {
107
+ margin-top: 0.375rem;
108
+ padding-left: 0.375rem;
109
+ }
110
+
111
+ .prose li > ul,
112
+ .prose li > ol {
113
+ margin-top: 0.375rem;
114
+ }
115
+
116
+ .prose li::marker {
117
+ color: var(--nd-muted);
118
+ }
119
+
120
+ /* Blockquotes */
121
+ .prose blockquote {
122
+ border-left: 3px solid var(--nd-accent);
123
+ padding: 0.5rem 1rem;
124
+ margin-left: 0;
125
+ margin-right: 0;
126
+ color: var(--nd-muted);
127
+ font-style: italic;
128
+ background: var(--nd-card-bg);
129
+ border-radius: 0 var(--nd-radius) var(--nd-radius) 0;
130
+ }
131
+
132
+ .prose blockquote p {
133
+ margin-top: 0;
134
+ }
135
+
136
+ .prose blockquote p + p {
137
+ margin-top: 0.75rem;
138
+ }
139
+
140
+ /* Inline code */
141
+ .prose :not(pre) > code {
142
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
143
+ font-size: 0.875em;
144
+ font-weight: 400;
145
+ background: var(--nd-code-bg);
146
+ padding: 0.15em 0.35em;
147
+ border-radius: 0.25rem;
148
+ border: 1px solid var(--nd-border);
149
+ }
150
+
151
+ /* Tables */
152
+ .prose table {
153
+ width: 100%;
154
+ border-collapse: collapse;
155
+ font-size: 0.875rem;
156
+ margin-top: 1.5rem;
157
+ }
158
+
159
+ .prose thead th {
160
+ text-align: left;
161
+ font-weight: 600;
162
+ padding: 0.625rem 0.75rem;
163
+ border-bottom: 2px solid var(--nd-border);
164
+ color: var(--nd-fg);
165
+ }
166
+
167
+ .prose tbody td {
168
+ padding: 0.625rem 0.75rem;
169
+ border-bottom: 1px solid var(--nd-border);
170
+ }
171
+
172
+ .prose tbody tr:nth-child(even) {
173
+ background: var(--nd-card-bg);
174
+ }
175
+
176
+ .prose tbody tr:hover {
177
+ background: var(--nd-card-hover);
178
+ }
179
+
180
+ /* Horizontal rules */
181
+ .prose hr {
182
+ border: none;
183
+ border-top: 1px solid var(--nd-border);
184
+ margin: 2.5rem 0;
185
+ }
186
+
187
+ /* Images */
188
+ .prose img {
189
+ max-width: 100%;
190
+ height: auto;
191
+ border-radius: var(--nd-radius);
192
+ border: 1px solid var(--nd-border);
193
+ margin-top: 1.5rem;
194
+ }
195
+
196
+ .prose img + em {
197
+ display: block;
198
+ text-align: center;
199
+ font-size: 0.875rem;
200
+ color: var(--nd-muted);
201
+ margin-top: 0.5rem;
202
+ }
203
+
204
+ /* Definition lists */
205
+ .prose dt {
206
+ font-weight: 600;
207
+ margin-top: 1rem;
208
+ }
209
+
210
+ .prose dd {
211
+ padding-left: 1rem;
212
+ color: var(--nd-muted);
213
+ }
214
+
215
+ /* Keyboard input */
216
+ .prose kbd {
217
+ font-family: 'Inter', system-ui, sans-serif;
218
+ font-size: 0.75rem;
219
+ padding: 0.15em 0.4em;
220
+ border: 1px solid var(--nd-border);
221
+ border-radius: 0.25rem;
222
+ background: var(--nd-card-bg);
223
+ box-shadow: 0 1px 0 var(--nd-border);
224
+ }