@pagesmith/core 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 (85) hide show
  1. package/README.md +481 -0
  2. package/assets/fonts/OFL.txt +7 -0
  3. package/assets/fonts/jetbrains-mono-variable.woff2 +0 -0
  4. package/assets/fonts/open-sans-variable.woff2 +0 -0
  5. package/assets/fonts.css +17 -0
  6. package/dist/ai/index.d.mts +41 -0
  7. package/dist/ai/index.d.mts.map +1 -0
  8. package/dist/ai/index.mjs +414 -0
  9. package/dist/ai/index.mjs.map +1 -0
  10. package/dist/assets/index.d.mts +31 -0
  11. package/dist/assets/index.d.mts.map +1 -0
  12. package/dist/assets/index.mjs +2 -0
  13. package/dist/assets-bX08zEJm.mjs +155 -0
  14. package/dist/assets-bX08zEJm.mjs.map +1 -0
  15. package/dist/content-config-fHPaFZ7i.d.mts +1128 -0
  16. package/dist/content-config-fHPaFZ7i.d.mts.map +1 -0
  17. package/dist/content-layer-B7fQ3im4.mjs +590 -0
  18. package/dist/content-layer-B7fQ3im4.mjs.map +1 -0
  19. package/dist/convert-DnuB6SVV.mjs +52 -0
  20. package/dist/convert-DnuB6SVV.mjs.map +1 -0
  21. package/dist/create/index.d.mts +20 -0
  22. package/dist/create/index.d.mts.map +1 -0
  23. package/dist/create/index.mjs +215 -0
  24. package/dist/create/index.mjs.map +1 -0
  25. package/dist/css/index.d.mts +2 -0
  26. package/dist/css/index.mjs +2 -0
  27. package/dist/css-ekIt2Fdb.mjs +19 -0
  28. package/dist/css-ekIt2Fdb.mjs.map +1 -0
  29. package/dist/heading-Dhvzlay-.d.mts +27 -0
  30. package/dist/heading-Dhvzlay-.d.mts.map +1 -0
  31. package/dist/index-BQ6B1-qG.d.mts +41 -0
  32. package/dist/index-BQ6B1-qG.d.mts.map +1 -0
  33. package/dist/index-CeNDTM-y.d.mts +7 -0
  34. package/dist/index-CeNDTM-y.d.mts.map +1 -0
  35. package/dist/index-DpRBzO8Q.d.mts +15 -0
  36. package/dist/index-DpRBzO8Q.d.mts.map +1 -0
  37. package/dist/index-sFCx17CD.d.mts +59 -0
  38. package/dist/index-sFCx17CD.d.mts.map +1 -0
  39. package/dist/index.d.mts +131 -0
  40. package/dist/index.d.mts.map +1 -0
  41. package/dist/index.mjs +56 -0
  42. package/dist/index.mjs.map +1 -0
  43. package/dist/jsx-runtime/index.d.mts +24 -0
  44. package/dist/jsx-runtime/index.d.mts.map +1 -0
  45. package/dist/jsx-runtime/index.mjs +88 -0
  46. package/dist/jsx-runtime/index.mjs.map +1 -0
  47. package/dist/loaders/index.d.mts +3 -0
  48. package/dist/loaders/index.mjs +2 -0
  49. package/dist/loaders-DyABmDrE.mjs +179 -0
  50. package/dist/loaders-DyABmDrE.mjs.map +1 -0
  51. package/dist/markdown/index.d.mts +3 -0
  52. package/dist/markdown/index.mjs +2 -0
  53. package/dist/markdown-Cj5X26FL.mjs +95 -0
  54. package/dist/markdown-Cj5X26FL.mjs.map +1 -0
  55. package/dist/runtime/index.d.mts +28 -0
  56. package/dist/runtime/index.d.mts.map +1 -0
  57. package/dist/runtime/index.mjs +90 -0
  58. package/dist/runtime/index.mjs.map +1 -0
  59. package/dist/schemas/index.d.mts +4 -0
  60. package/dist/schemas/index.mjs +2 -0
  61. package/dist/schemas-DJS7wOzd.mjs +47 -0
  62. package/dist/schemas-DJS7wOzd.mjs.map +1 -0
  63. package/dist/types-DUsjRE7Y.d.mts +28 -0
  64. package/dist/types-DUsjRE7Y.d.mts.map +1 -0
  65. package/dist/vite/index.d.mts +9878 -0
  66. package/dist/vite/index.d.mts.map +1 -0
  67. package/dist/vite/index.mjs +549 -0
  68. package/dist/vite/index.mjs.map +1 -0
  69. package/package.json +136 -0
  70. package/src/styles/code/inline.css +26 -0
  71. package/src/styles/content/alerts.css +87 -0
  72. package/src/styles/content/prose.css +225 -0
  73. package/src/styles/content/toc.css +87 -0
  74. package/src/styles/content.css +22 -0
  75. package/src/styles/foundations/reset.css +49 -0
  76. package/src/styles/foundations/tokens.css +66 -0
  77. package/src/styles/layout/grid.css +179 -0
  78. package/src/styles/layout/sidebar.css +18 -0
  79. package/src/styles/standalone.css +18 -0
  80. package/src/styles/viewport.css +20 -0
  81. package/templates/docs/content/README.md +18 -0
  82. package/templates/docs/content/guide/README.md +11 -0
  83. package/templates/docs/content/guide/getting-started/README.md +9 -0
  84. package/templates/docs/content/reference/README.md +11 -0
  85. package/templates/docs/pagesmith.config.json5 +15 -0
package/package.json ADDED
@@ -0,0 +1,136 @@
1
+ {
2
+ "name": "@pagesmith/core",
3
+ "version": "0.1.0",
4
+ "description": "File-based CMS — schema-validated collections, lazy markdown rendering, and runtime CSS/JS exports",
5
+ "keywords": [
6
+ "cms",
7
+ "collections",
8
+ "content",
9
+ "content-layer",
10
+ "markdown",
11
+ "static-site"
12
+ ],
13
+ "homepage": "https://github.com/sujeet-pro/pagesmith/tree/main/packages/core",
14
+ "bugs": {
15
+ "url": "https://github.com/sujeet-pro/pagesmith/issues"
16
+ },
17
+ "license": "MIT",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/sujeet-pro/pagesmith.git",
21
+ "directory": "packages/core"
22
+ },
23
+ "files": [
24
+ "dist/",
25
+ "src/styles/",
26
+ "assets/",
27
+ "templates/"
28
+ ],
29
+ "type": "module",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.mts",
33
+ "import": "./dist/index.mjs"
34
+ },
35
+ "./jsx-runtime": {
36
+ "types": "./dist/jsx-runtime/index.d.mts",
37
+ "import": "./dist/jsx-runtime/index.mjs"
38
+ },
39
+ "./jsx-dev-runtime": {
40
+ "types": "./dist/jsx-runtime/index.d.mts",
41
+ "import": "./dist/jsx-runtime/index.mjs"
42
+ },
43
+ "./markdown": {
44
+ "types": "./dist/markdown/index.d.mts",
45
+ "import": "./dist/markdown/index.mjs"
46
+ },
47
+ "./css": {
48
+ "types": "./dist/css/index.d.mts",
49
+ "import": "./dist/css/index.mjs"
50
+ },
51
+ "./css/standalone": {
52
+ "types": "./css.d.ts",
53
+ "default": "./src/styles/standalone.css"
54
+ },
55
+ "./css/content": {
56
+ "types": "./css.d.ts",
57
+ "default": "./src/styles/content.css"
58
+ },
59
+ "./css/viewport": {
60
+ "types": "./css.d.ts",
61
+ "default": "./src/styles/viewport.css"
62
+ },
63
+ "./css/fonts": {
64
+ "types": "./css.d.ts",
65
+ "default": "./assets/fonts.css"
66
+ },
67
+ "./schemas": {
68
+ "types": "./dist/schemas/index.d.mts",
69
+ "import": "./dist/schemas/index.mjs"
70
+ },
71
+ "./loaders": {
72
+ "types": "./dist/loaders/index.d.mts",
73
+ "import": "./dist/loaders/index.mjs"
74
+ },
75
+ "./assets": {
76
+ "types": "./dist/assets/index.d.mts",
77
+ "import": "./dist/assets/index.mjs"
78
+ },
79
+ "./runtime": {
80
+ "types": "./dist/runtime/index.d.mts",
81
+ "import": "./dist/runtime/index.mjs"
82
+ },
83
+ "./ai": {
84
+ "types": "./dist/ai/index.d.mts",
85
+ "import": "./dist/ai/index.mjs"
86
+ },
87
+ "./vite": {
88
+ "types": "./dist/vite/index.d.mts",
89
+ "import": "./dist/vite/index.mjs"
90
+ },
91
+ "./create": {
92
+ "types": "./dist/create/index.d.mts",
93
+ "import": "./dist/create/index.mjs"
94
+ },
95
+ "./package.json": "./package.json"
96
+ },
97
+ "scripts": {
98
+ "build": "vp pack",
99
+ "test": "vp test run"
100
+ },
101
+ "dependencies": {
102
+ "chokidar": "^4.0.3",
103
+ "devalue": "^5.1.1",
104
+ "fast-glob": "^3.3.0",
105
+ "gray-matter": "^4.0.3",
106
+ "json5": "^2.2.3",
107
+ "lightningcss": "^1.32.0",
108
+ "rehype-accessible-emojis": "^0.3.2",
109
+ "rehype-autolink-headings": "^7.1.0",
110
+ "rehype-expressive-code": "^0.41.7",
111
+ "rehype-external-links": "^3.0.0",
112
+ "rehype-mathjax": "^7.1.0",
113
+ "rehype-slug": "^6.0.0",
114
+ "rehype-stringify": "^10.0.1",
115
+ "remark-frontmatter": "^5.0.0",
116
+ "remark-gfm": "^4.0.0",
117
+ "remark-github-alerts": "^0.1.1",
118
+ "remark-math": "^6.0.0",
119
+ "remark-parse": "^11.0.0",
120
+ "remark-rehype": "^11.1.1",
121
+ "remark-smartypants": "^3.0.2",
122
+ "rolldown": "^1.0.0-rc.10",
123
+ "smol-toml": "^1.3.0",
124
+ "unified": "^11.0.5",
125
+ "unist-util-visit": "^5.0.0",
126
+ "ws": "^8.19.0",
127
+ "yaml": "^2.7.0",
128
+ "zod": "^4.3.6"
129
+ },
130
+ "devDependencies": {
131
+ "@types/node": "^25.5.0",
132
+ "@types/ws": "^8.18.1",
133
+ "typescript": "^5.9.0",
134
+ "vite-plus": "^0.1.13"
135
+ }
136
+ }
@@ -0,0 +1,26 @@
1
+ /* ═══════════════════════════════════════════════════════════════
2
+ Inline code styling
3
+ ═══════════════════════════════════════════════════════════════ */
4
+
5
+ /* ─── Inline code ─── */
6
+ .prose code {
7
+ font-family: var(--font-mono);
8
+ font-size: 0.875em;
9
+ padding: 0.15em 0.4em;
10
+ background: var(--color-code-bg);
11
+ color: var(--color-code-text);
12
+ border-radius: var(--radius-sm);
13
+ word-break: break-word;
14
+ white-space: normal;
15
+ }
16
+ /* Reset for code inside pre blocks */
17
+ .prose pre code {
18
+ padding: 0;
19
+ background: none;
20
+ color: inherit;
21
+ border-radius: 0;
22
+ white-space: pre;
23
+ font-size: var(--font-size-sm);
24
+ line-height: 1.7;
25
+ word-break: normal;
26
+ }
@@ -0,0 +1,87 @@
1
+ /* ═══════════════════════════════════════════════════════════════
2
+ GitHub-style alerts — > [!NOTE], > [!TIP], > [!IMPORTANT],
3
+ > [!WARNING], > [!CAUTION]
4
+ ═══════════════════════════════════════════════════════════════ */
5
+
6
+ .markdown-alert {
7
+ padding: 0.75rem 1rem;
8
+ margin: 1.25rem 0;
9
+ border-left: 4px solid var(--alert-color, var(--color-border-subtle));
10
+ border-radius: var(--radius-sm);
11
+ background: var(--alert-bg, var(--color-bg-alt));
12
+ }
13
+
14
+ .markdown-alert > :first-child { margin-top: 0; }
15
+ .markdown-alert > :last-child { margin-bottom: 0; }
16
+
17
+ .markdown-alert-title {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 0.5rem;
21
+ font-weight: 600;
22
+ font-size: 0.875rem;
23
+ margin-bottom: 0.25rem;
24
+ color: var(--alert-color, var(--color-text));
25
+ }
26
+
27
+ /* Octicon SVG via CSS mask */
28
+ .octicon {
29
+ display: inline-block;
30
+ width: 1em;
31
+ height: 1em;
32
+ flex-shrink: 0;
33
+ background-color: currentColor;
34
+ mask-image: var(--oct-icon);
35
+ mask-size: contain;
36
+ mask-repeat: no-repeat;
37
+ -webkit-mask-image: var(--oct-icon);
38
+ -webkit-mask-size: contain;
39
+ -webkit-mask-repeat: no-repeat;
40
+ }
41
+
42
+ /* ─── Alert variants ─── */
43
+
44
+ .markdown-alert-note {
45
+ --alert-color: #0969da;
46
+ --alert-bg: color-mix(in srgb, #0969da 6%, transparent);
47
+ }
48
+ .markdown-alert-tip {
49
+ --alert-color: #1a7f37;
50
+ --alert-bg: color-mix(in srgb, #1a7f37 6%, transparent);
51
+ }
52
+ .markdown-alert-important {
53
+ --alert-color: #8250df;
54
+ --alert-bg: color-mix(in srgb, #8250df 6%, transparent);
55
+ }
56
+ .markdown-alert-warning {
57
+ --alert-color: #9a6700;
58
+ --alert-bg: color-mix(in srgb, #9a6700 6%, transparent);
59
+ }
60
+ .markdown-alert-caution {
61
+ --alert-color: #d1242f;
62
+ --alert-bg: color-mix(in srgb, #d1242f 6%, transparent);
63
+ }
64
+
65
+ /* ─── Dark mode ─── */
66
+ @media (prefers-color-scheme: dark) {
67
+ .markdown-alert-note {
68
+ --alert-color: #4493f8;
69
+ --alert-bg: color-mix(in srgb, #4493f8 8%, transparent);
70
+ }
71
+ .markdown-alert-tip {
72
+ --alert-color: #3fb950;
73
+ --alert-bg: color-mix(in srgb, #3fb950 8%, transparent);
74
+ }
75
+ .markdown-alert-important {
76
+ --alert-color: #a371f7;
77
+ --alert-bg: color-mix(in srgb, #a371f7 8%, transparent);
78
+ }
79
+ .markdown-alert-warning {
80
+ --alert-color: #d29922;
81
+ --alert-bg: color-mix(in srgb, #d29922 8%, transparent);
82
+ }
83
+ .markdown-alert-caution {
84
+ --alert-color: #f85149;
85
+ --alert-bg: color-mix(in srgb, #f85149 8%, transparent);
86
+ }
87
+ }
@@ -0,0 +1,225 @@
1
+ /* ─── Root ─── */
2
+ html {
3
+ font-family: var(--font-sans);
4
+ font-size: 16px;
5
+ color: var(--color-text);
6
+ background: var(--color-bg);
7
+ transition: background-color var(--transition-fast), color var(--transition-fast);
8
+ }
9
+ body {
10
+ min-height: 100vh;
11
+ display: flex;
12
+ flex-direction: column;
13
+ }
14
+
15
+ /* ─── Headings ─── */
16
+ h1 {
17
+ font-size: clamp(1.75rem, 4vw, var(--font-size-3xl));
18
+ font-weight: 700;
19
+ letter-spacing: -0.02em;
20
+ line-height: 1.2;
21
+ margin-bottom: 1rem;
22
+ }
23
+ h2 {
24
+ font-size: var(--font-size-2xl);
25
+ font-weight: 600;
26
+ letter-spacing: -0.01em;
27
+ line-height: 1.3;
28
+ margin-top: 2.5rem;
29
+ margin-bottom: 0.75rem;
30
+ padding-bottom: 0.5rem;
31
+ border-bottom: 1px solid var(--color-border-subtle);
32
+ }
33
+ h3 {
34
+ font-size: var(--font-size-xl);
35
+ font-weight: 600;
36
+ line-height: 1.4;
37
+ margin-top: 2rem;
38
+ margin-bottom: 0.5rem;
39
+ }
40
+ h4 {
41
+ font-size: var(--font-size-base);
42
+ font-weight: 500;
43
+ line-height: 1.5;
44
+ margin-top: 1.5rem;
45
+ margin-bottom: 0.5rem;
46
+ }
47
+
48
+ /* ─── Prose (markdown content) ─── */
49
+ .prose {
50
+ color: var(--color-text-secondary);
51
+ line-height: 1.8;
52
+ font-size: 17px;
53
+ overflow-wrap: break-word;
54
+ }
55
+ .prose p {
56
+ margin-bottom: 1.25rem;
57
+ }
58
+ .prose a {
59
+ color: var(--color-text);
60
+ text-decoration: underline;
61
+ text-decoration-color: var(--color-border);
62
+ text-underline-offset: 2px;
63
+ transition: text-decoration-color var(--transition-fast);
64
+ }
65
+ .prose a:hover {
66
+ text-decoration-color: var(--color-text);
67
+ }
68
+ .prose h1 a, .prose h2 a, .prose h3 a, .prose h4 a {
69
+ text-decoration: none;
70
+ }
71
+ .prose h1 a:hover, .prose h2 a:hover, .prose h3 a:hover, .prose h4 a:hover {
72
+ text-decoration: underline;
73
+ text-decoration-color: var(--color-border);
74
+ }
75
+ .prose strong {
76
+ font-weight: 600;
77
+ color: var(--color-text);
78
+ }
79
+ .prose em {
80
+ font-style: italic;
81
+ }
82
+ .prose ul, .prose ol {
83
+ padding-left: 1.5rem;
84
+ margin-bottom: 1.25rem;
85
+ }
86
+ .prose ul {
87
+ list-style: disc;
88
+ }
89
+ .prose ol {
90
+ list-style: decimal;
91
+ }
92
+ .prose li {
93
+ margin-bottom: 0.35rem;
94
+ }
95
+ .prose li::marker {
96
+ color: var(--color-text-muted);
97
+ }
98
+ .prose hr {
99
+ border: none;
100
+ border-top: 1px solid var(--color-border);
101
+ margin: 2.5rem 0;
102
+ }
103
+ .prose img {
104
+ border-radius: var(--radius-md);
105
+ margin: 1.5rem 0;
106
+ }
107
+ .prose > *:first-child {
108
+ margin-top: 0;
109
+ }
110
+ .prose > *:last-child {
111
+ margin-bottom: 0;
112
+ }
113
+
114
+ /* ─── Figures ─── */
115
+ .prose figure {
116
+ margin: 2rem 0;
117
+ }
118
+ .prose figure img {
119
+ display: block;
120
+ max-width: 100%;
121
+ max-height: 100vh;
122
+ height: auto;
123
+ margin: 0 auto;
124
+ border-radius: var(--radius-md);
125
+ }
126
+ .prose figure img.only-light,
127
+ .prose figure img.only-dark {
128
+ width: 100%;
129
+ }
130
+ .prose figcaption {
131
+ margin-top: 0.5rem;
132
+ font-size: var(--font-size-sm);
133
+ color: var(--color-text-muted);
134
+ text-align: center;
135
+ line-height: 1.5;
136
+ }
137
+
138
+ /* ─── Tables ─── */
139
+ .prose table {
140
+ display: block;
141
+ width: max-content;
142
+ max-width: 100%;
143
+ overflow-x: auto;
144
+ border-collapse: collapse;
145
+ margin-bottom: 1.25rem;
146
+ font-size: var(--font-size-sm);
147
+ }
148
+ .prose th, .prose td {
149
+ padding: 0.6rem 1rem;
150
+ text-align: left;
151
+ border-bottom: 1px solid var(--color-border);
152
+ white-space: nowrap;
153
+ }
154
+ .prose th {
155
+ font-weight: 600;
156
+ color: var(--color-text);
157
+ background: var(--color-bg-alt);
158
+ }
159
+ .prose tr:last-child td {
160
+ border-bottom: none;
161
+ }
162
+
163
+ /* ─── Blockquotes ─── */
164
+ .prose blockquote {
165
+ border-left: 3px solid var(--color-blockquote-border);
166
+ padding: 0.5rem 1.25rem;
167
+ margin-bottom: 1.25rem;
168
+ color: var(--color-text-muted);
169
+ background: var(--color-blockquote-bg);
170
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
171
+ }
172
+ .prose blockquote p:last-child {
173
+ margin-bottom: 0;
174
+ }
175
+
176
+ /* ─── Task lists (GFM) ─── */
177
+ .prose .contains-task-list {
178
+ list-style: none;
179
+ padding-left: 0;
180
+ }
181
+ .prose .task-list-item {
182
+ display: flex;
183
+ align-items: baseline;
184
+ gap: 0.5rem;
185
+ }
186
+ .prose .task-list-item input[type="checkbox"] {
187
+ accent-color: var(--color-text-muted);
188
+ }
189
+
190
+ /* ─── Light/dark image switching ─── */
191
+ img.only-dark, .prose figure img.only-dark {
192
+ display: none;
193
+ }
194
+
195
+ @media (prefers-color-scheme: dark) {
196
+ img.only-light,
197
+ .prose figure img.only-light {
198
+ display: none;
199
+ }
200
+ img.only-dark,
201
+ .prose figure img.only-dark {
202
+ display: block;
203
+ }
204
+ }
205
+
206
+ /* ─── Inline SVGs (embedded, use currentColor) ─── */
207
+ .prose .inline-svg {
208
+ display: block;
209
+ max-width: 100%;
210
+ height: auto;
211
+ margin: 1.5rem auto;
212
+ color: var(--color-text-secondary);
213
+ }
214
+
215
+ /* ─── Invert images in dark mode (.invert. naming convention) ─── */
216
+ @media (prefers-color-scheme: dark) {
217
+ .prose img.invert-on-dark {
218
+ filter: invert(1) hue-rotate(180deg);
219
+ }
220
+ }
221
+
222
+ /* ─── Scroll margin for anchors ─── */
223
+ .prose h1, .prose h2, .prose h3, .prose h4, h2[id], h3[id] {
224
+ scroll-margin-top: calc(var(--header-height) + 1.5rem);
225
+ }
@@ -0,0 +1,87 @@
1
+ /* ─── TOC ─── */
2
+ .toc {
3
+ font-size: var(--font-size-sm);
4
+ }
5
+ .toc-title {
6
+ font-size: var(--font-size-xs);
7
+ font-weight: 600;
8
+ text-transform: uppercase;
9
+ letter-spacing: 0.08em;
10
+ color: var(--color-text-muted);
11
+ margin-bottom: 0.75rem;
12
+ }
13
+ .toc-list {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 0.15rem;
17
+ border-left: 2px solid var(--color-border-subtle);
18
+ padding-left: 0;
19
+ }
20
+ .toc-item a {
21
+ display: block;
22
+ padding: 0.2rem 0 0.2rem 0.75rem;
23
+ color: var(--color-text-muted);
24
+ transition: color var(--transition-fast), border-color var(--transition-fast);
25
+ line-height: 1.4;
26
+ border-left: 2px solid transparent;
27
+ margin-left: -2px;
28
+ }
29
+ .toc-item a:hover {
30
+ color: var(--color-text);
31
+ }
32
+ .toc-item.active a {
33
+ color: var(--color-text);
34
+ border-left-color: var(--color-accent);
35
+ }
36
+ .toc-item.depth-3 a {
37
+ padding-left: 1.5rem;
38
+ font-size: 0.8125rem;
39
+ }
40
+
41
+ /* ─── Mobile TOC accordion ─── */
42
+ /* Visibility controlled by layout/grid.css breakpoints */
43
+ .toc-mobile {
44
+ margin-bottom: 1.5rem;
45
+ border: 1px solid var(--color-border-subtle);
46
+ border-radius: var(--radius-md);
47
+ background: var(--color-bg-alt);
48
+ }
49
+ .toc-mobile summary {
50
+ padding: 0.75rem 1rem;
51
+ font-size: var(--font-size-sm);
52
+ font-weight: 600;
53
+ color: var(--color-text-muted);
54
+ cursor: pointer;
55
+ list-style: none;
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: space-between;
59
+ }
60
+ .toc-mobile summary::-webkit-details-marker {
61
+ display: none;
62
+ }
63
+ .toc-mobile summary::after {
64
+ content: "";
65
+ width: 16px;
66
+ height: 16px;
67
+ background: currentColor;
68
+ clip-path: polygon(25% 20%, 75% 50%, 25% 80%);
69
+ transition: transform var(--transition-fast);
70
+ flex-shrink: 0;
71
+ }
72
+ .toc-mobile[open] summary::after {
73
+ transform: rotate(90deg);
74
+ }
75
+ .toc-mobile .toc {
76
+ padding: 0 1rem 0.75rem;
77
+ }
78
+ .toc-mobile .toc-title {
79
+ display: none;
80
+ }
81
+ .toc-mobile .toc-list {
82
+ border-left: none;
83
+ }
84
+ .toc-mobile .toc-item a {
85
+ border-left: none;
86
+ margin-left: 0;
87
+ }
@@ -0,0 +1,22 @@
1
+ /* ═══════════════════════════════════════════════════════════════
2
+ Content rendering CSS — all-in-one for styled markdown output.
3
+
4
+ Import this single file to get everything needed for rendering
5
+ processed markdown: typography and inline code styling.
6
+ Code block styling is handled by Expressive Code (injected inline).
7
+ Does NOT include layout (grid/sidebar) or site-level components.
8
+ ═══════════════════════════════════════════════════════════════ */
9
+
10
+ /* Foundations */
11
+ @import "./foundations/reset.css";
12
+ @import "./foundations/tokens.css";
13
+
14
+ /* Prose content */
15
+ @import "./content/prose.css";
16
+ @import "./content/alerts.css";
17
+
18
+ /* Inline code */
19
+ @import "./code/inline.css";
20
+
21
+ /* Viewport */
22
+ @import "./viewport.css";
@@ -0,0 +1,49 @@
1
+ *, *::before, *::after {
2
+ box-sizing: border-box;
3
+ margin: 0;
4
+ padding: 0;
5
+ }
6
+ html {
7
+ -webkit-text-size-adjust: 100%;
8
+ tab-size: 4;
9
+ scroll-behavior: smooth;
10
+ scrollbar-gutter: stable;
11
+ }
12
+ body {
13
+ line-height: 1.7;
14
+ -webkit-font-smoothing: antialiased;
15
+ -moz-osx-font-smoothing: grayscale;
16
+ }
17
+ img, svg, video {
18
+ display: block;
19
+ max-width: 100%;
20
+ }
21
+ h1, h2, h3, h4, h5, h6, p {
22
+ overflow-wrap: break-word;
23
+ }
24
+ ul, ol {
25
+ list-style: none;
26
+ }
27
+ a {
28
+ color: inherit;
29
+ text-decoration: none;
30
+ }
31
+ button, input, textarea, select {
32
+ font: inherit;
33
+ }
34
+ table {
35
+ border-collapse: collapse;
36
+ }
37
+
38
+ /* Screen-reader only */
39
+ .sr-only {
40
+ position: absolute;
41
+ width: 1px;
42
+ height: 1px;
43
+ padding: 0;
44
+ margin: -1px;
45
+ overflow: hidden;
46
+ clip: rect(0, 0, 0, 0);
47
+ white-space: nowrap;
48
+ border: 0;
49
+ }
@@ -0,0 +1,66 @@
1
+ /* -- Design Tokens -- */
2
+
3
+ :root {
4
+ color-scheme: light dark;
5
+
6
+ /* Colors */
7
+ --color-bg: light-dark(#f5f4f0, #111110);
8
+ --color-bg-alt: light-dark(#efefeb, #1a1a18);
9
+ --color-bg-elevated: light-dark(#f5f4f0, #1e1e1c);
10
+ --color-bg-code: light-dark(#efefeb, #1a1a18);
11
+ --color-bg-hover: light-dark(#efefeb, #222220);
12
+
13
+ --color-text: light-dark(#111110, #f5f4f0);
14
+ --color-text-secondary: light-dark(#333330, #ccccca);
15
+ --color-text-muted: light-dark(#7a7a72, #888882);
16
+
17
+ --color-border: light-dark(#d0cfc9, #2a2a28);
18
+ --color-border-subtle: light-dark(#e5e4de, #222220);
19
+ --color-border-hover: light-dark(#c0bfb9, #3a3a38);
20
+
21
+ --color-accent: light-dark(#d4381e, #e04a2e);
22
+ --color-accent-hover: light-dark(#b82e16, #f05a3e);
23
+ --color-accent-subtle: light-dark(rgba(212, 56, 30, 0.06), rgba(224, 74, 46, 0.08));
24
+
25
+ --color-code-bg: light-dark(#efefeb, #1a1a18);
26
+ --color-code-text: light-dark(#333330, #ccccca);
27
+
28
+ --color-blockquote-border: light-dark(#d0cfc9, #333330);
29
+ --color-blockquote-bg: light-dark(#efefeb, #1a1a18);
30
+
31
+ --color-overlay-bg: light-dark(rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.5));
32
+ --color-header-bg: light-dark(rgba(245, 244, 240, 0.85), rgba(17, 17, 16, 0.85));
33
+ --color-text-inverse: light-dark(#f5f4f0, #111110);
34
+
35
+ /* Shadows */
36
+ --shadow-color: light-dark(rgba(0, 0, 0, 0.04), rgba(0, 0, 0, 0.2));
37
+ --shadow-color-md: light-dark(rgba(0, 0, 0, 0.04), rgba(0, 0, 0, 0.25));
38
+ --shadow-color-lg: light-dark(rgba(0, 0, 0, 0.06), rgba(0, 0, 0, 0.3));
39
+ --shadow-sm: 0 1px 2px var(--shadow-color);
40
+ --shadow-md: 0 4px 6px var(--shadow-color-md);
41
+ --shadow-lg: 0 10px 25px var(--shadow-color-lg);
42
+
43
+ /* Typography */
44
+ --font-sans: 'Open Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
45
+ --font-mono: 'JetBrains Mono', 'Fira Code', Menlo, Consolas, monospace;
46
+
47
+ --font-size-xs: 0.75rem;
48
+ --font-size-sm: 0.875rem;
49
+ --font-size-base: 1rem;
50
+ --font-size-lg: 1.125rem;
51
+ --font-size-xl: 1.25rem;
52
+ --font-size-2xl: 1.5rem;
53
+ --font-size-3xl: 2rem;
54
+
55
+ /* Spacing */
56
+ --radius-sm: 2px;
57
+ --radius-md: 4px;
58
+ --radius-lg: 6px;
59
+
60
+ /* Transitions */
61
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
62
+ --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
63
+
64
+ /* Layout */
65
+ --header-height: 60px;
66
+ }