skrypt-ai 0.3.4 → 0.4.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/README.md +1 -1
  2. package/dist/auth/index.d.ts +0 -1
  3. package/dist/auth/index.js +3 -5
  4. package/dist/autofix/index.js +15 -3
  5. package/dist/cli.js +19 -4
  6. package/dist/commands/check-links.js +164 -174
  7. package/dist/commands/deploy.js +5 -2
  8. package/dist/commands/generate.js +206 -199
  9. package/dist/commands/i18n.js +3 -20
  10. package/dist/commands/init.js +47 -40
  11. package/dist/commands/lint.js +3 -20
  12. package/dist/commands/mcp.js +125 -122
  13. package/dist/commands/monitor.js +125 -108
  14. package/dist/commands/review-pr.js +1 -1
  15. package/dist/commands/sdk.js +1 -1
  16. package/dist/config/loader.js +21 -2
  17. package/dist/generator/organizer.d.ts +3 -0
  18. package/dist/generator/organizer.js +4 -9
  19. package/dist/generator/writer.js +2 -10
  20. package/dist/github/pr-comments.js +21 -8
  21. package/dist/plugins/index.js +1 -0
  22. package/dist/scanner/index.js +8 -2
  23. package/dist/template/docs.json +2 -1
  24. package/dist/template/next.config.mjs +2 -1
  25. package/dist/template/package.json +17 -15
  26. package/dist/template/public/favicon.svg +4 -0
  27. package/dist/template/public/search-index.json +1 -1
  28. package/dist/template/scripts/build-search-index.mjs +120 -25
  29. package/dist/template/src/app/api/chat/route.ts +11 -3
  30. package/dist/template/src/app/docs/README.md +28 -0
  31. package/dist/template/src/app/docs/[...slug]/page.tsx +139 -16
  32. package/dist/template/src/app/docs/auth/page.mdx +589 -0
  33. package/dist/template/src/app/docs/autofix/page.mdx +624 -0
  34. package/dist/template/src/app/docs/cli/page.mdx +217 -0
  35. package/dist/template/src/app/docs/config/page.mdx +428 -0
  36. package/dist/template/src/app/docs/configuration/page.mdx +86 -0
  37. package/dist/template/src/app/docs/deployment/page.mdx +112 -0
  38. package/dist/template/src/app/docs/error.tsx +20 -0
  39. package/dist/template/src/app/docs/generator/generator.md +504 -0
  40. package/dist/template/src/app/docs/generator/organizer.md +779 -0
  41. package/dist/template/src/app/docs/generator/page.mdx +613 -0
  42. package/dist/template/src/app/docs/github/page.mdx +502 -0
  43. package/dist/template/src/app/docs/llm/anthropic-client.md +549 -0
  44. package/dist/template/src/app/docs/llm/index.md +471 -0
  45. package/dist/template/src/app/docs/llm/page.mdx +428 -0
  46. package/dist/template/src/app/docs/llms-full.md +256 -0
  47. package/dist/template/src/app/docs/llms.txt +2971 -0
  48. package/dist/template/src/app/docs/not-found.tsx +23 -0
  49. package/dist/template/src/app/docs/page.mdx +0 -3
  50. package/dist/template/src/app/docs/plugins/page.mdx +1793 -0
  51. package/dist/template/src/app/docs/pro/page.mdx +121 -0
  52. package/dist/template/src/app/docs/quickstart/page.mdx +93 -0
  53. package/dist/template/src/app/docs/scanner/content-type.md +599 -0
  54. package/dist/template/src/app/docs/scanner/index.md +212 -0
  55. package/dist/template/src/app/docs/scanner/page.mdx +307 -0
  56. package/dist/template/src/app/docs/scanner/python.md +469 -0
  57. package/dist/template/src/app/docs/scanner/python_parser.md +1056 -0
  58. package/dist/template/src/app/docs/scanner/rust.md +325 -0
  59. package/dist/template/src/app/docs/scanner/typescript.md +201 -0
  60. package/dist/template/src/app/error.tsx +3 -3
  61. package/dist/template/src/app/icon.tsx +29 -0
  62. package/dist/template/src/app/layout.tsx +42 -0
  63. package/dist/template/src/app/not-found.tsx +35 -0
  64. package/dist/template/src/app/page.tsx +62 -28
  65. package/dist/template/src/components/ai-chat.tsx +26 -21
  66. package/dist/template/src/components/breadcrumbs.tsx +46 -2
  67. package/dist/template/src/components/copy-button.tsx +17 -3
  68. package/dist/template/src/components/docs-layout.tsx +142 -8
  69. package/dist/template/src/components/feedback.tsx +4 -2
  70. package/dist/template/src/components/footer.tsx +42 -0
  71. package/dist/template/src/components/header.tsx +29 -5
  72. package/dist/template/src/components/mdx/accordion.tsx +7 -6
  73. package/dist/template/src/components/mdx/card.tsx +19 -7
  74. package/dist/template/src/components/mdx/code-block.tsx +17 -3
  75. package/dist/template/src/components/mdx/code-group.tsx +65 -18
  76. package/dist/template/src/components/mdx/code-playground.tsx +3 -0
  77. package/dist/template/src/components/mdx/go-playground.tsx +3 -0
  78. package/dist/template/src/components/mdx/highlighted-code.tsx +171 -76
  79. package/dist/template/src/components/mdx/python-playground.tsx +2 -0
  80. package/dist/template/src/components/mdx/tabs.tsx +74 -6
  81. package/dist/template/src/components/page-header.tsx +19 -0
  82. package/dist/template/src/components/scroll-to-top.tsx +33 -0
  83. package/dist/template/src/components/search-dialog.tsx +206 -52
  84. package/dist/template/src/components/sidebar.tsx +136 -77
  85. package/dist/template/src/components/table-of-contents.tsx +23 -7
  86. package/dist/template/src/lib/highlight.ts +90 -31
  87. package/dist/template/src/lib/search.ts +14 -4
  88. package/dist/template/src/lib/theme-utils.ts +140 -0
  89. package/dist/template/src/styles/globals.css +307 -166
  90. package/dist/template/src/types/remark-gfm.d.ts +2 -0
  91. package/dist/utils/files.d.ts +9 -0
  92. package/dist/utils/files.js +33 -0
  93. package/dist/utils/validation.d.ts +4 -0
  94. package/dist/utils/validation.js +38 -0
  95. package/package.json +1 -4
@@ -1,88 +1,151 @@
1
1
  @import "tailwindcss";
2
2
 
3
+ @custom-variant dark (&:where(.dark, .dark *));
4
+
5
+ /* Skip-to-content link — visible on focus only */
6
+ .skip-to-content {
7
+ position: absolute;
8
+ left: -9999px;
9
+ top: auto;
10
+ width: 1px;
11
+ height: 1px;
12
+ overflow: hidden;
13
+ z-index: 9999;
14
+ }
15
+ .skip-to-content:focus {
16
+ position: fixed;
17
+ top: 0.5rem;
18
+ left: 0.5rem;
19
+ width: auto;
20
+ height: auto;
21
+ overflow: visible;
22
+ padding: 0.5rem 1rem;
23
+ background: var(--color-primary);
24
+ color: var(--color-primary-foreground);
25
+ border-radius: 0.5rem;
26
+ font-size: 0.875rem;
27
+ font-weight: 600;
28
+ text-decoration: none;
29
+ }
30
+
3
31
  @theme {
4
- /* Colors - using semi-transparent borders like Next.js/Stripe/Fumadocs */
32
+ /* Primary configurable per project via docs.json */
5
33
  --color-primary: #3b82f6;
6
34
  --color-primary-dark: #2563eb;
7
- --color-primary-light: rgba(59, 130, 246, 0.1);
8
- --color-accent: #8b5cf6;
9
-
10
- /* Background */
35
+ --color-primary-light: #60a5fa;
36
+ --color-primary-foreground: #ffffff;
37
+
38
+ /* Gray scale (Mintlify-style, subtle warm undertone) */
39
+ --color-gray-50: #f9fafb;
40
+ --color-gray-100: #f3f4f6;
41
+ --color-gray-200: #e5e7eb;
42
+ --color-gray-300: #d1d5db;
43
+ --color-gray-400: #9ca3af;
44
+ --color-gray-500: #6b7280;
45
+ --color-gray-600: #4b5563;
46
+ --color-gray-700: #374151;
47
+ --color-gray-800: #1f2937;
48
+ --color-gray-900: #111827;
49
+ --color-gray-950: #030712;
50
+
51
+ /* Semantic tokens — light mode defaults */
11
52
  --color-bg: #ffffff;
12
53
  --color-bg-secondary: #f9fafb;
13
54
  --color-bg-tertiary: #f3f4f6;
14
-
15
- /* Text */
16
55
  --color-text: #111827;
17
- --color-text-secondary: #4b5563;
56
+ --color-text-secondary: #374151;
18
57
  --color-text-tertiary: #9ca3af;
19
-
20
- /* Border - semi-transparent for premium feel */
21
- --color-border: rgba(0, 0, 0, 0.08);
22
- --color-border-strong: rgba(0, 0, 0, 0.15);
58
+ --color-border: rgba(3, 7, 18, 0.1);
59
+ --color-border-strong: rgba(3, 7, 18, 0.15);
23
60
 
24
61
  /* Code */
25
- --color-code-bg: #0a0a0a;
26
- --color-code-text: #e5e7eb;
62
+ --color-code-bg: #ffffff;
63
+ --color-code-border: rgba(3, 7, 18, 0.1);
64
+ --color-code-text: #1f2937;
27
65
 
28
66
  /* Layout */
29
- --sidebar-width: 272px;
67
+ --sidebar-width: 264px;
30
68
  --toc-width: 224px;
31
- --header-height: 64px;
69
+ --header-height: 56px;
32
70
  --content-max-width: 768px;
71
+ --radius: 1rem;
33
72
  }
34
73
 
35
- /* Dark mode - supports both system preference and manual toggle */
74
+ /* ========================
75
+ Dark Mode
76
+ ======================== */
77
+
36
78
  @media (prefers-color-scheme: dark) {
37
79
  :root:not(.light) {
38
- --color-bg: #0a0a0a;
39
- --color-bg-secondary: #141414;
40
- --color-bg-tertiary: #1f1f1f;
41
- --color-text: #fafafa;
42
- --color-text-secondary: #a1a1aa;
43
- --color-text-tertiary: #71717a;
44
- --color-border: rgba(255, 255, 255, 0.08);
45
- --color-border-strong: rgba(255, 255, 255, 0.15);
46
- --color-primary-light: rgba(59, 130, 246, 0.15);
47
- --color-code-bg: #0a0a0a;
48
- --color-code-text: #e5e7eb;
80
+ --color-bg: #0f1117;
81
+ --color-bg-secondary: #1a1d27;
82
+ --color-bg-tertiary: #252833;
83
+ --color-text: #f3f4f6;
84
+ --color-text-secondary: #d1d5db;
85
+ --color-text-tertiary: #6b7280;
86
+ --color-border: rgba(255, 255, 255, 0.07);
87
+ --color-border-strong: rgba(255, 255, 255, 0.12);
88
+ --color-code-bg: #0b0c0e;
89
+ --color-code-border: rgba(255, 255, 255, 0.1);
90
+ --color-code-text: #f3f4f6;
49
91
  }
50
92
  }
51
93
 
52
- /* Manual dark mode override */
53
94
  :root.dark {
54
- --color-bg: #0a0a0a;
55
- --color-bg-secondary: #141414;
56
- --color-bg-tertiary: #1f1f1f;
57
- --color-text: #fafafa;
58
- --color-text-secondary: #a1a1aa;
59
- --color-text-tertiary: #71717a;
60
- --color-border: rgba(255, 255, 255, 0.08);
61
- --color-border-strong: rgba(255, 255, 255, 0.15);
62
- --color-primary-light: rgba(59, 130, 246, 0.15);
63
- --color-code-bg: #0a0a0a;
64
- --color-code-text: #e5e7eb;
95
+ --color-bg: #0f1117;
96
+ --color-bg-secondary: #1a1d27;
97
+ --color-bg-tertiary: #252833;
98
+ --color-text: #f3f4f6;
99
+ --color-text-secondary: #d1d5db;
100
+ --color-text-tertiary: #6b7280;
101
+ --color-border: rgba(255, 255, 255, 0.07);
102
+ --color-border-strong: rgba(255, 255, 255, 0.12);
103
+ --color-code-bg: #0b0c0e;
104
+ --color-code-border: rgba(255, 255, 255, 0.1);
105
+ --color-code-text: #f3f4f6;
106
+ }
107
+
108
+ /* Error page icon — dark mode overrides (avoids Tailwind dark: variant mismatch) */
109
+ :root.dark .error-icon-bg { background-color: rgba(127, 29, 29, 0.3); }
110
+ :root.dark .error-icon-text { color: #f87171; }
111
+ @media (prefers-color-scheme: dark) {
112
+ :root:not(.light) .error-icon-bg { background-color: rgba(127, 29, 29, 0.3); }
113
+ :root:not(.light) .error-icon-text { color: #f87171; }
114
+ }
115
+
116
+ /* Feedback thumbs — dark mode overrides */
117
+ :root.dark .feedback-positive { background-color: rgba(6, 95, 70, 0.3); color: #34d399; }
118
+ :root.dark .feedback-negative { background-color: rgba(127, 29, 29, 0.3); color: #f87171; }
119
+ @media (prefers-color-scheme: dark) {
120
+ :root:not(.light) .feedback-positive { background-color: rgba(6, 95, 70, 0.3); color: #34d399; }
121
+ :root:not(.light) .feedback-negative { background-color: rgba(127, 29, 29, 0.3); color: #f87171; }
65
122
  }
66
123
 
67
124
  /* ========================
68
- Base & Reset
125
+ Base in @layer base so Tailwind utilities can override
69
126
  ======================== */
70
127
 
128
+ @layer base {
129
+
71
130
  html {
72
131
  scroll-behavior: smooth;
73
132
  -webkit-font-smoothing: antialiased;
74
133
  -moz-osx-font-smoothing: grayscale;
134
+ overscroll-behavior-y: none;
135
+ line-height: 1.5;
75
136
  }
76
137
 
77
138
  body {
78
139
  background-color: var(--color-bg);
79
140
  color: var(--color-text);
80
- font-feature-settings: "rlig" 1, "calt" 1;
141
+ font-family: var(--font-body, "Inter", ui-sans-serif, system-ui, sans-serif);
142
+ font-feature-settings: "cv02", "cv03", "cv04", "cv11";
143
+ font-size: 15px;
81
144
  }
82
145
 
83
- /* Global transitions for interactive elements */
146
+ /* Global transitions 150ms on interactive elements */
84
147
  a, button, input, select, textarea {
85
- transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease, box-shadow 150ms ease, opacity 150ms ease;
148
+ transition: color 150ms, background-color 150ms, border-color 150ms, opacity 150ms;
86
149
  }
87
150
 
88
151
  ::selection {
@@ -90,51 +153,31 @@ a, button, input, select, textarea {
90
153
  color: white;
91
154
  }
92
155
 
156
+ /* Links — inherit color by default, primary in prose */
157
+ a {
158
+ text-decoration: none;
159
+ color: inherit;
160
+ }
161
+
93
162
  /* ========================
94
163
  Typography
95
164
  ======================== */
96
165
 
97
166
  h1, h2, h3, h4, h5, h6 {
98
167
  color: var(--color-text);
99
- font-weight: 700;
100
168
  line-height: 1.2;
101
- letter-spacing: -0.02em;
169
+ letter-spacing: -0.025em;
102
170
  }
103
171
 
104
- h1 {
105
- font-size: 2.25rem;
106
- letter-spacing: -0.03em;
107
- }
172
+ h1 { font-size: 2.25em; font-weight: 800; }
173
+ h2 { font-size: 1.5em; font-weight: 700; margin-top: 2em; margin-bottom: 0.6667em; }
174
+ h3 { font-size: 1.25em; font-weight: 600; margin-top: 2.4em; margin-bottom: 0.6em; }
175
+ h4 { font-size: 1.125em; font-weight: 600; margin-top: 2em; margin-bottom: 0.5em; }
108
176
 
109
- h2 {
110
- font-size: 1.5rem;
111
- margin-top: 2.5rem;
112
- padding-bottom: 0.75rem;
113
- border-bottom: 1px solid var(--color-border);
114
- }
115
-
116
- h3 {
117
- font-size: 1.25rem;
118
- margin-top: 2rem;
119
- }
120
-
121
- h4 {
122
- font-size: 1.0625rem;
123
- margin-top: 1.5rem;
124
- }
125
-
126
- /* ========================
127
- Links
128
- ======================== */
129
-
130
- a {
131
- color: var(--color-primary);
132
- text-decoration: none;
133
- }
134
-
135
- a:hover {
136
- text-decoration: underline;
137
- text-underline-offset: 2px;
177
+ @media (max-width: 640px) {
178
+ h1 { font-size: 1.75em; }
179
+ h2 { font-size: 1.25em; }
180
+ h3 { font-size: 1.125em; }
138
181
  }
139
182
 
140
183
  /* ========================
@@ -143,27 +186,47 @@ a:hover {
143
186
 
144
187
  pre {
145
188
  background-color: var(--color-code-bg) !important;
146
- border: 1px solid var(--color-border);
189
+ border: 1px solid var(--color-code-border);
147
190
  border-radius: 0.75rem;
148
- padding: 1rem 1.25rem;
191
+ padding: 0.875rem 1rem;
149
192
  overflow-x: auto;
150
- font-size: 0.8125rem;
151
- line-height: 1.7;
193
+ font-size: 0.875em;
194
+ line-height: 1.7142857;
195
+ }
196
+
197
+ /* Prevent FOUC: code blocks get the right bg before Shiki loads */
198
+ .shiki, .shiki pre {
199
+ background-color: var(--color-code-bg) !important;
152
200
  }
153
201
 
154
202
  code {
155
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
156
- font-size: 0.8125rem;
203
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
204
+ font-size: 0.875em;
205
+ font-variant-ligatures: none;
157
206
  }
158
207
 
159
- /* Inline code */
208
+ /* Inline code — Mintlify style */
160
209
  :not(pre) > code {
161
- background-color: var(--color-bg-tertiary);
162
- border: 1px solid var(--color-border);
163
- padding: 0.125rem 0.375rem;
210
+ background-color: var(--color-gray-100);
211
+ padding: 0.125rem 0.5rem;
164
212
  border-radius: 0.375rem;
165
- font-size: 0.8125em;
166
- font-weight: 500;
213
+ font-size: 0.875em;
214
+ line-height: 1.5;
215
+ color: var(--color-gray-600);
216
+ overflow-wrap: break-word;
217
+ word-break: break-word;
218
+ }
219
+
220
+ :root.dark :not(pre) > code {
221
+ background-color: rgba(255, 255, 255, 0.05);
222
+ color: var(--color-gray-200);
223
+ }
224
+
225
+ @media (prefers-color-scheme: dark) {
226
+ :root:not(.light) :not(pre) > code {
227
+ background-color: rgba(255, 255, 255, 0.05);
228
+ color: var(--color-gray-200);
229
+ }
167
230
  }
168
231
 
169
232
  /* ========================
@@ -173,152 +236,230 @@ code {
173
236
  .prose {
174
237
  max-width: var(--content-max-width);
175
238
  line-height: 1.75;
239
+ color: var(--color-text-secondary);
240
+ }
241
+
242
+ .prose a {
176
243
  color: var(--color-text);
244
+ font-weight: 600;
245
+ text-decoration: none;
246
+ border-bottom: 1px solid var(--color-primary);
247
+ transition: border-color 150ms, border-bottom-width 150ms;
248
+ }
249
+
250
+ .prose a:hover {
251
+ border-bottom-width: 2px;
177
252
  }
178
253
 
179
254
  .prose p {
180
- margin-top: 1.25rem;
181
- margin-bottom: 1.25rem;
182
- color: var(--color-text-secondary);
255
+ margin-top: 1.25em;
256
+ margin-bottom: 1.25em;
183
257
  }
184
258
 
185
- .prose > p:first-child {
186
- font-size: 1.125rem;
187
- line-height: 1.75;
188
- color: var(--color-text-secondary);
259
+ /* Page header description is handled by PageHeader component */
260
+
261
+ .prose strong {
262
+ font-weight: 600;
263
+ color: var(--color-text);
189
264
  }
190
265
 
266
+ /* Lists */
191
267
  .prose ul, .prose ol {
192
- margin-top: 1rem;
193
- margin-bottom: 1rem;
268
+ margin-top: 1em;
269
+ margin-bottom: 1em;
194
270
  padding-left: 1.5rem;
195
271
  }
196
272
 
197
- .prose ul {
198
- list-style-type: disc;
199
- }
200
-
201
- .prose ol {
202
- list-style-type: decimal;
203
- }
273
+ .prose ul { list-style-type: disc; }
274
+ .prose ol { list-style-type: decimal; }
204
275
 
205
276
  .prose li {
206
- margin-top: 0.375rem;
207
- margin-bottom: 0.375rem;
208
- color: var(--color-text-secondary);
277
+ margin-top: 0.5em;
278
+ margin-bottom: 0.5em;
209
279
  }
210
280
 
211
281
  .prose li::marker {
212
282
  color: var(--color-text-tertiary);
213
283
  }
214
284
 
215
- /* Tables - clean Stripe-style, no alternating rows */
285
+ /* Headings in prose */
286
+ .prose h1, .prose h2, .prose h3, .prose h4 {
287
+ color: var(--color-text);
288
+ }
289
+
290
+ .prose h2 a, .prose h3 a, .prose h4 a {
291
+ color: inherit;
292
+ border-bottom: none;
293
+ font-weight: inherit;
294
+ }
295
+
296
+ .prose h2 a:hover, .prose h3 a:hover, .prose h4 a:hover {
297
+ border-bottom: none;
298
+ }
299
+
300
+ /* Tables — Mintlify style: clean, minimal */
216
301
  .prose table {
217
302
  width: 100%;
218
303
  border-collapse: collapse;
219
- margin: 1.5rem 0;
304
+ margin: 1.5em 0;
220
305
  font-size: 0.875rem;
306
+ line-height: 1.5;
221
307
  display: table;
308
+ table-layout: auto;
222
309
  }
223
310
 
224
- .prose thead {
225
- display: table-header-group;
226
- }
311
+ .prose thead { display: table-header-group; }
312
+ .prose tbody { display: table-row-group; }
313
+ .prose tr { display: table-row; }
227
314
 
228
- .prose tbody {
229
- display: table-row-group;
315
+ .prose th {
316
+ display: table-cell;
317
+ font-weight: 600;
318
+ color: var(--color-text);
319
+ vertical-align: bottom;
320
+ padding: 0.625rem 1rem 0.625rem 0;
321
+ text-align: left;
322
+ white-space: nowrap;
323
+ border-bottom: 1px solid var(--color-border-strong);
230
324
  }
231
325
 
232
- .prose tr {
233
- display: table-row;
234
- border-bottom: 1px solid var(--color-border);
235
- transition: background-color 150ms ease;
236
- }
326
+ .prose th:last-child { padding-right: 0; }
237
327
 
238
- .prose th, .prose td {
239
- padding: 0.75rem 1rem;
240
- text-align: left;
328
+ .prose td {
241
329
  display: table-cell;
242
330
  vertical-align: top;
331
+ color: var(--color-text-secondary);
332
+ padding: 0.75rem 1rem 0.75rem 0;
243
333
  }
244
334
 
245
- .prose th {
246
- font-weight: 600;
247
- font-size: 0.75rem;
248
- text-transform: uppercase;
249
- letter-spacing: 0.05em;
250
- color: var(--color-text-tertiary);
251
- border-bottom: 2px solid var(--color-border-strong);
252
- }
335
+ .prose td:last-child { padding-right: 0; }
253
336
 
254
- .prose td {
255
- color: var(--color-text-secondary);
337
+ /* Inline code inside table cells should never wrap */
338
+ .prose td code, .prose th code {
339
+ white-space: nowrap;
340
+ word-break: normal;
341
+ overflow-wrap: normal;
256
342
  }
257
343
 
258
- .prose tbody tr:hover {
259
- background-color: var(--color-bg-secondary);
344
+ .prose tbody tr {
345
+ border-bottom: 1px solid var(--color-border);
260
346
  }
261
347
 
262
348
  /* Blockquotes */
263
349
  .prose blockquote {
264
- border-left: 3px solid var(--color-primary);
265
- padding: 0.5rem 0 0.5rem 1.25rem;
266
- margin: 1.5rem 0;
350
+ border-left: 3px solid var(--color-border-strong);
351
+ padding: 0.5em 0 0.5em 1.25em;
352
+ margin: 1.5em 0;
267
353
  color: var(--color-text-secondary);
268
354
  }
269
355
 
270
- .prose blockquote p {
271
- margin: 0;
272
- }
356
+ .prose blockquote p { margin: 0; }
273
357
 
274
358
  /* Horizontal rules */
275
359
  .prose hr {
276
360
  border: none;
277
361
  border-top: 1px solid var(--color-border);
278
- margin: 2.5rem 0;
362
+ margin: 3em 0;
279
363
  }
280
364
 
281
365
  /* Images */
282
366
  .prose img {
283
367
  max-width: 100%;
284
368
  border-radius: 0.75rem;
285
- border: 1px solid var(--color-border);
286
- margin: 1.5rem 0;
369
+ margin: 2em 0;
287
370
  }
288
371
 
289
- .prose strong {
290
- font-weight: 600;
291
- color: var(--color-text);
372
+ /* ========================
373
+ Scrollbar (Mintlify style — thin, subtle)
374
+ ======================== */
375
+
376
+ * {
377
+ scrollbar-width: thin;
378
+ scrollbar-color: rgba(0, 0, 0, 0.15) transparent;
292
379
  }
293
380
 
294
- /* Heading anchor links */
295
- .prose h2 a, .prose h3 a, .prose h4 a {
296
- color: inherit;
297
- text-decoration: none;
381
+ :root.dark * {
382
+ scrollbar-color: rgba(255, 255, 255, 0.2) transparent;
298
383
  }
299
384
 
300
- .prose h2 a:hover, .prose h3 a:hover, .prose h4 a:hover {
301
- text-decoration: none;
385
+ @media (prefers-color-scheme: dark) {
386
+ :root:not(.light) * {
387
+ scrollbar-color: rgba(255, 255, 255, 0.2) transparent;
388
+ }
389
+ :root:not(.light) ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.2); }
390
+ :root:not(.light) ::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.3); }
302
391
  }
303
392
 
393
+ :root.dark ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.2); }
394
+ :root.dark ::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.3); }
395
+
396
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
397
+ ::-webkit-scrollbar-track { background: transparent; }
398
+ ::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.15); border-radius: 3px; }
399
+ ::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.2); }
400
+
304
401
  /* ========================
305
- Scrollbar (subtle)
402
+ Focus indicators
306
403
  ======================== */
307
404
 
308
- ::-webkit-scrollbar {
309
- width: 6px;
310
- height: 6px;
405
+ *:focus-visible {
406
+ outline: 2px solid var(--color-primary);
407
+ outline-offset: 2px;
311
408
  }
312
409
 
313
- ::-webkit-scrollbar-track {
314
- background: transparent;
410
+ input:focus-visible, textarea:focus-visible {
411
+ outline-offset: 0;
315
412
  }
316
413
 
317
- ::-webkit-scrollbar-thumb {
318
- background: var(--color-border-strong);
319
- border-radius: 3px;
414
+ } /* end @layer base */
415
+
416
+ /* Sidebar scroll shadows — fade content at top/bottom edges */
417
+ .sidebar-scroll-shadow {
418
+ mask-image: linear-gradient(to bottom, transparent, black 1rem, black calc(100% - 1rem), transparent);
419
+ -webkit-mask-image: linear-gradient(to bottom, transparent, black 1rem, black calc(100% - 1rem), transparent);
420
+ }
421
+
422
+ /* Search dialog entrance animation */
423
+ @keyframes dialog-in {
424
+ from { opacity: 0; transform: translate(-50%, -8px) scale(0.98); }
425
+ to { opacity: 1; transform: translate(-50%, 0) scale(1); }
426
+ }
427
+ .dialog-animate-in {
428
+ animation: dialog-in 150ms ease-out;
429
+ }
430
+
431
+ /* ========================
432
+ Terminal-style code blocks
433
+ ======================== */
434
+ .terminal-block pre {
435
+ background-color: #0a0a0a !important;
436
+ border-color: rgba(255, 255, 255, 0.08);
320
437
  }
321
438
 
322
- ::-webkit-scrollbar-thumb:hover {
323
- background: var(--color-text-tertiary);
439
+ /* ========================
440
+ Copy toast animation
441
+ ======================== */
442
+ @keyframes copy-toast-in {
443
+ 0% { opacity: 0; transform: translateX(-50%) translateY(-4px); }
444
+ 15% { opacity: 1; transform: translateX(-50%) translateY(0); }
445
+ 85% { opacity: 1; transform: translateX(-50%) translateY(0); }
446
+ 100% { opacity: 0; transform: translateX(-50%) translateY(-4px); }
447
+ }
448
+ .copy-toast {
449
+ animation: copy-toast-in 1.5s ease-in-out forwards;
450
+ pointer-events: none;
451
+ }
452
+
453
+ /* ========================
454
+ Search skeleton shimmer
455
+ ======================== */
456
+ @keyframes shimmer {
457
+ 0% { background-position: -200% 0; }
458
+ 100% { background-position: 200% 0; }
459
+ }
460
+ .skeleton {
461
+ background: linear-gradient(90deg, var(--color-bg-secondary) 25%, var(--color-bg-tertiary) 50%, var(--color-bg-secondary) 75%);
462
+ background-size: 200% 100%;
463
+ animation: shimmer 1.5s infinite;
464
+ border-radius: 0.25rem;
324
465
  }
@@ -0,0 +1,2 @@
1
+ declare module 'remark-gfm'
2
+ declare module 'remark-frontmatter'
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Recursively find all .md and .mdx files in a directory.
3
+ * Skips hidden directories and node_modules.
4
+ */
5
+ export declare function findMdxFiles(dir: string): string[];
6
+ /**
7
+ * Convert string to URL-safe slug
8
+ */
9
+ export declare function slugify(str: string): string;
@@ -0,0 +1,33 @@
1
+ import { readdirSync, statSync } from 'fs';
2
+ import { join, extname } from 'path';
3
+ /**
4
+ * Recursively find all .md and .mdx files in a directory.
5
+ * Skips hidden directories and node_modules.
6
+ */
7
+ export function findMdxFiles(dir) {
8
+ const files = [];
9
+ function walk(currentDir) {
10
+ const entries = readdirSync(currentDir);
11
+ for (const entry of entries) {
12
+ const fullPath = join(currentDir, entry);
13
+ const stat = statSync(fullPath);
14
+ if (stat.isDirectory() && !entry.startsWith('.') && entry !== 'node_modules') {
15
+ walk(fullPath);
16
+ }
17
+ else if (stat.isFile() && (extname(entry) === '.mdx' || extname(entry) === '.md')) {
18
+ files.push(fullPath);
19
+ }
20
+ }
21
+ }
22
+ walk(dir);
23
+ return files;
24
+ }
25
+ /**
26
+ * Convert string to URL-safe slug
27
+ */
28
+ export function slugify(str) {
29
+ return str
30
+ .toLowerCase()
31
+ .replace(/[^a-z0-9]+/g, '-')
32
+ .replace(/^-|-$/g, '');
33
+ }
@@ -0,0 +1,4 @@
1
+ export declare function validatePath(input: string, mustExist?: boolean): string;
2
+ export declare function validateUrl(input: string): string;
3
+ export declare function validateSlug(input: string): string;
4
+ export declare function sanitizeForShell(input: string): string;