pulumi-package-docs 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 (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/bin/cli.js +80 -0
  4. package/dist/client/assets/MemberDetail-CX9jiyic.js +1 -0
  5. package/dist/client/assets/index-CZRUHwIq.js +13 -0
  6. package/dist/client/assets/providers._name-DpU324kz.js +1 -0
  7. package/dist/client/assets/providers._name.functions._token-DXrP4mSE.js +1 -0
  8. package/dist/client/assets/providers._name.functions._token-bvc3vrG2.js +1 -0
  9. package/dist/client/assets/providers._name.index-CtKE1x7S.js +1 -0
  10. package/dist/client/assets/providers._name.index-tTXQzRr7.js +1 -0
  11. package/dist/client/assets/providers._name.resources._token--BZM8RBv.js +1 -0
  12. package/dist/client/assets/providers._name.resources._token-CbZkRkaE.js +1 -0
  13. package/dist/client/assets/routes-GAgiQcBX.js +1 -0
  14. package/dist/client/assets/styles-CWDprFhI.css +1 -0
  15. package/dist/client/assets/token-oQmZfAP3.js +1 -0
  16. package/dist/client/assets/useSelector-BIt42tGI.js +1 -0
  17. package/dist/server/assets/MemberDetail-BiBAI1vw.js +96 -0
  18. package/dist/server/assets/_tanstack-start-manifest_v-Cl1i6HDY.js +62 -0
  19. package/dist/server/assets/api-BV6lykkP.js +20 -0
  20. package/dist/server/assets/api-C55bS4R6.js +64 -0
  21. package/dist/server/assets/empty-plugin-adapters-D9UWiqvJ.js +5 -0
  22. package/dist/server/assets/providers._name-DF6sA3DG.js +6 -0
  23. package/dist/server/assets/providers._name.functions._token-C0A7Y90t.js +21 -0
  24. package/dist/server/assets/providers._name.functions._token-D8LsoIum.js +13 -0
  25. package/dist/server/assets/providers._name.index-BEwt-7U0.js +13 -0
  26. package/dist/server/assets/providers._name.index-BK_ZRd5l.js +97 -0
  27. package/dist/server/assets/providers._name.resources._token-CbvRkms4.js +22 -0
  28. package/dist/server/assets/providers._name.resources._token-DJPF8nMg.js +13 -0
  29. package/dist/server/assets/router-DZSocx9m.js +562 -0
  30. package/dist/server/assets/routes-B-G_iLTo.js +82 -0
  31. package/dist/server/assets/schema.server-B-VvU1qb.js +122 -0
  32. package/dist/server/assets/start-5Z2QO8AU.js +4 -0
  33. package/dist/server/server.js +2003 -0
  34. package/package.json +67 -0
  35. package/src/components/CodeExample.tsx +14 -0
  36. package/src/components/MemberDetail.tsx +89 -0
  37. package/src/components/PropertyTable.tsx +49 -0
  38. package/src/components/PulumiLogo.tsx +86 -0
  39. package/src/lib/pulumi/api.ts +77 -0
  40. package/src/lib/pulumi/description.test.ts +54 -0
  41. package/src/lib/pulumi/description.ts +35 -0
  42. package/src/lib/pulumi/discovery.server.test.ts +117 -0
  43. package/src/lib/pulumi/discovery.server.ts +77 -0
  44. package/src/lib/pulumi/examples.test.ts +97 -0
  45. package/src/lib/pulumi/examples.ts +55 -0
  46. package/src/lib/pulumi/format.test.ts +51 -0
  47. package/src/lib/pulumi/format.ts +11 -0
  48. package/src/lib/pulumi/mcp.server.ts +343 -0
  49. package/src/lib/pulumi/naming.test.ts +27 -0
  50. package/src/lib/pulumi/naming.ts +31 -0
  51. package/src/lib/pulumi/schema.server.ts +78 -0
  52. package/src/lib/pulumi/token.test.ts +21 -0
  53. package/src/lib/pulumi/token.ts +10 -0
  54. package/src/lib/pulumi/types.ts +62 -0
  55. package/src/routeTree.gen.ts +187 -0
  56. package/src/router.tsx +19 -0
  57. package/src/routes/__root.tsx +59 -0
  58. package/src/routes/index.tsx +78 -0
  59. package/src/routes/mcp.ts +30 -0
  60. package/src/routes/providers.$name.functions.$token.tsx +47 -0
  61. package/src/routes/providers.$name.index.tsx +129 -0
  62. package/src/routes/providers.$name.resources.$token.tsx +48 -0
  63. package/src/routes/providers.$name.tsx +5 -0
  64. package/src/styles.css +478 -0
  65. package/tsconfig.json +29 -0
@@ -0,0 +1,129 @@
1
+ import { Link, createFileRoute, notFound } from '@tanstack/react-router'
2
+
3
+ import { getProvider } from '@/lib/pulumi/api'
4
+ import { resolveDescription } from '@/lib/pulumi/description'
5
+ import { summarizeDescription } from '@/lib/pulumi/examples'
6
+ import { tokenDisplayName } from '@/lib/pulumi/token'
7
+ import type { SchemaFunction, SchemaResource } from '@/lib/pulumi/types'
8
+
9
+ export const Route = createFileRoute('/providers/$name/')({
10
+ loader: async ({ params }) => {
11
+ const entry = await getProvider({ data: params.name })
12
+ if (!entry) throw notFound()
13
+ return entry
14
+ },
15
+ component: ProviderDetail,
16
+ notFoundComponent: () => (
17
+ <main>
18
+ <p>
19
+ No local provider with that name was found.{' '}
20
+ <Link to="/">Back to all providers.</Link>
21
+ </p>
22
+ </main>
23
+ ),
24
+ })
25
+
26
+ function MemberListItem({
27
+ token,
28
+ member,
29
+ runtime,
30
+ to,
31
+ providerName,
32
+ }: {
33
+ token: string
34
+ member: SchemaResource | SchemaFunction
35
+ runtime?: string
36
+ to: '/providers/$name/resources/$token' | '/providers/$name/functions/$token'
37
+ providerName: string
38
+ }) {
39
+ const summary = summarizeDescription(
40
+ resolveDescription(member.description, runtime),
41
+ )
42
+ const deprecated = 'deprecationMessage' in member && member.deprecationMessage
43
+
44
+ return (
45
+ <li className="doc-list-item">
46
+ <Link to={to} params={{ name: providerName, token }}>
47
+ <code>{tokenDisplayName(token)}</code>
48
+ </Link>
49
+ {deprecated && <span className="badge badge-warning">Deprecated</span>}
50
+ {summary && <p className="doc-summary">{summary}</p>}
51
+ </li>
52
+ )
53
+ }
54
+
55
+ function ProviderDetail() {
56
+ const entry = Route.useLoaderData()
57
+ const { ref, schema, origin, error, runtime } = entry
58
+
59
+ const resources = Object.entries(schema?.resources ?? {})
60
+ const functions = Object.entries(schema?.functions ?? {})
61
+
62
+ return (
63
+ <main className="provider-detail">
64
+ <Link to="/" className="back-link">
65
+ &larr; All providers
66
+ </Link>
67
+ <h1>{ref.name}</h1>
68
+ <p className="subtitle">
69
+ {ref.source}
70
+ {ref.version ? ` @ ${ref.version}` : ''}
71
+ {ref.parameters?.length ? ` (${ref.parameters.join(' ')})` : ''}
72
+ </p>
73
+
74
+ {origin === 'error' || !schema ? (
75
+ <p className="banner banner-failure">
76
+ Failed to load schema: {error ?? 'unknown error'}
77
+ </p>
78
+ ) : (
79
+ <>
80
+ {origin === 'cache' && (
81
+ <p className="banner banner-info">
82
+ Showing a cached schema (the <code>pulumi</code> CLI call failed
83
+ on this load).
84
+ </p>
85
+ )}
86
+ {schema.description && (
87
+ <p>{resolveDescription(schema.description, runtime)}</p>
88
+ )}
89
+
90
+ <h2>Resources</h2>
91
+ {resources.length === 0 ? (
92
+ <p className="empty-state">No resources.</p>
93
+ ) : (
94
+ <ul className="doc-list">
95
+ {resources.map(([token, resource]) => (
96
+ <MemberListItem
97
+ key={token}
98
+ token={token}
99
+ member={resource}
100
+ runtime={runtime}
101
+ to="/providers/$name/resources/$token"
102
+ providerName={ref.name}
103
+ />
104
+ ))}
105
+ </ul>
106
+ )}
107
+
108
+ <h2>Functions</h2>
109
+ {functions.length === 0 ? (
110
+ <p className="empty-state">No functions.</p>
111
+ ) : (
112
+ <ul className="doc-list">
113
+ {functions.map(([token, fn]) => (
114
+ <MemberListItem
115
+ key={token}
116
+ token={token}
117
+ member={fn}
118
+ runtime={runtime}
119
+ to="/providers/$name/functions/$token"
120
+ providerName={ref.name}
121
+ />
122
+ ))}
123
+ </ul>
124
+ )}
125
+ </>
126
+ )}
127
+ </main>
128
+ )
129
+ }
@@ -0,0 +1,48 @@
1
+ import { Link, createFileRoute, notFound } from '@tanstack/react-router'
2
+
3
+ import { MemberDetail } from '@/components/MemberDetail'
4
+ import { getProvider } from '@/lib/pulumi/api'
5
+ import { tokenDisplayName } from '@/lib/pulumi/token'
6
+
7
+ export const Route = createFileRoute('/providers/$name/resources/$token')({
8
+ loader: async ({ params }) => {
9
+ const entry = await getProvider({ data: params.name })
10
+ const resource = entry?.schema?.resources?.[params.token]
11
+ if (!resource) throw notFound()
12
+ return {
13
+ providerName: params.name,
14
+ token: params.token,
15
+ resource,
16
+ runtime: entry?.runtime,
17
+ }
18
+ },
19
+ component: ResourceDetail,
20
+ notFoundComponent: () => (
21
+ <main>
22
+ <p>
23
+ No resource with that name was found.{' '}
24
+ <Link to="/">Back to all providers.</Link>
25
+ </p>
26
+ </main>
27
+ ),
28
+ })
29
+
30
+ function ResourceDetail() {
31
+ const { providerName, token, resource, runtime } = Route.useLoaderData()
32
+
33
+ return (
34
+ <MemberDetail
35
+ providerName={providerName}
36
+ kind="Resource"
37
+ displayName={tokenDisplayName(token)}
38
+ token={token}
39
+ description={resource.description}
40
+ deprecationMessage={resource.deprecationMessage}
41
+ runtime={runtime}
42
+ inputProperties={resource.inputProperties}
43
+ requiredInputs={resource.requiredInputs}
44
+ outputProperties={resource.properties}
45
+ requiredOutputs={resource.required}
46
+ />
47
+ )
48
+ }
@@ -0,0 +1,5 @@
1
+ import { Outlet, createFileRoute } from '@tanstack/react-router'
2
+
3
+ export const Route = createFileRoute('/providers/$name')({
4
+ component: () => <Outlet />,
5
+ })
package/src/styles.css ADDED
@@ -0,0 +1,478 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+
4
+ --font-sans:
5
+ Inter, 'Helvetica Neue', Helvetica, Arial, -apple-system,
6
+ BlinkMacSystemFont, sans-serif;
7
+ --font-mono: 'Monaspace Neon', Menlo, Consolas, ui-monospace, monospace;
8
+
9
+ --color-bg: #ffffff;
10
+ --color-fg: #2e2932; /* gray-950 */
11
+ --color-fg-muted: #56535a; /* gray-800 */
12
+ --color-fg-subtle: #6a6675; /* gray-700 */
13
+ --color-border: #e0dfe2; /* gray-200 */
14
+ --color-border-strong: #cbcace; /* gray-300 */
15
+
16
+ --color-primary: #5a30c5; /* violet-700 */
17
+ --color-primary-strong: #492e8e; /* violet-800 */
18
+ --color-accent: #9077f3; /* violet-500 */
19
+ --color-accent-bg: #f5f5ff; /* violet-50 */
20
+ --color-accent-border: #dedbff; /* violet-200 */
21
+
22
+ --color-code-bg: rgb(245 245 255 / 55%); /* violet-50 @ 50% */
23
+ --color-code-border: #dedbff; /* violet-200 */
24
+
25
+ --badge-resource-bg: #ebebff; /* violet-100 */
26
+ --badge-resource-fg: #5a30c5; /* violet-700 */
27
+ --badge-resource-border: #dedbff; /* violet-200 */
28
+
29
+ --badge-function-bg: #ccfff5; /* aqua-100 */
30
+ --badge-function-fg: #00756c; /* aqua-700 */
31
+ --badge-function-border: #5cffde; /* aqua-200 */
32
+
33
+ --badge-warning-bg: #fef2c7; /* yellow-100 */
34
+ --badge-warning-fg: #933d0d; /* yellow-800 */
35
+ --badge-warning-border: #fde38a; /* yellow-200 */
36
+
37
+ --badge-failure-bg: #ffe0e1; /* red-100 */
38
+ --badge-failure-fg: #96171e; /* red-800 */
39
+ --badge-failure-border: #ffc7ca; /* red-200 */
40
+
41
+ --badge-info-bg: #e5f1ff; /* blue-100 */
42
+ --badge-info-fg: #1e47c2; /* blue-800 */
43
+ --badge-info-border: #cce4ff; /* blue-200 */
44
+
45
+ --radius-sm: 6px;
46
+ --radius-md: 10px;
47
+ --radius-lg: 14px;
48
+ }
49
+
50
+ @media (prefers-color-scheme: dark) {
51
+ :root {
52
+ --color-bg: #1f1b21; /* service black */
53
+ --color-fg: #fafafa; /* gray-950 dark */
54
+ --color-fg-muted: #e0dfe2; /* gray-800 dark */
55
+ --color-fg-subtle: #cbcace; /* gray-700 dark */
56
+ --color-border: #46434c; /* gray-100 dark */
57
+ --color-border-strong: #56535a; /* gray-200 dark */
58
+
59
+ --color-primary: #dedbff; /* violet-800 dark: body-safe accent */
60
+ --color-primary-strong: #f5f5ff; /* violet-950 dark */
61
+ --color-accent: #9077f3; /* violet-500, symmetric */
62
+ --color-accent-bg: #231f33; /* violet-50 dark */
63
+ --color-accent-border: #492e8e; /* violet-200 dark */
64
+
65
+ --color-code-bg: rgb(35 31 51 / 55%); /* violet-950 (dark theme) @ 50% */
66
+ --color-code-border: #492e8e; /* violet-800 (dark theme) */
67
+
68
+ --badge-resource-bg: #392960; /* violet-100 dark */
69
+ --badge-resource-fg: #c3bdff; /* violet-700 dark */
70
+ --badge-resource-border: #492e8e; /* violet-200 dark */
71
+
72
+ --badge-function-bg: #114642; /* aqua-100 dark */
73
+ --badge-function-fg: #1efad9; /* aqua-700 dark */
74
+ --badge-function-border: #075f59; /* aqua-200 dark */
75
+
76
+ --badge-warning-bg: #723213; /* yellow-100 dark */
77
+ --badge-warning-fg: #fde38a; /* yellow-800 dark */
78
+ --badge-warning-border: #933d0d; /* yellow-200 dark */
79
+
80
+ --badge-failure-bg: #611f22; /* red-100 dark */
81
+ --badge-failure-fg: #ffc7ca; /* red-800 dark */
82
+ --badge-failure-border: #96171e; /* red-200 dark */
83
+
84
+ --badge-info-bg: #28448a; /* blue-100 dark */
85
+ --badge-info-fg: #cce4ff; /* blue-800 dark */
86
+ --badge-info-border: #1e47c2; /* blue-200 dark */
87
+ }
88
+ }
89
+
90
+ * {
91
+ box-sizing: border-box;
92
+ }
93
+
94
+ html {
95
+ background: var(--color-bg);
96
+ }
97
+
98
+ body {
99
+ margin: 0;
100
+ font-family: var(--font-sans);
101
+ font-feature-settings:
102
+ 'liga' 1,
103
+ 'calt' 1,
104
+ 'cv11' 1;
105
+ color: var(--color-fg);
106
+ background: var(--color-bg);
107
+ line-height: 1.3;
108
+ -webkit-font-smoothing: antialiased;
109
+ text-rendering: optimizeLegibility;
110
+ }
111
+
112
+ h1,
113
+ h2,
114
+ h3 {
115
+ font-weight: 600;
116
+ letter-spacing: -0.02em;
117
+ line-height: 1.1;
118
+ color: var(--color-fg);
119
+ }
120
+
121
+ h1 {
122
+ font-size: 1.9rem;
123
+ margin: 0 0 0.4rem;
124
+ }
125
+
126
+ h2 {
127
+ font-size: 0.8rem;
128
+ text-transform: uppercase;
129
+ letter-spacing: 0.05em;
130
+ color: var(--color-fg-subtle);
131
+ font-weight: 600;
132
+ margin: 2.5rem 0 1rem;
133
+ padding-left: 0.65rem;
134
+ border-left: 3px solid var(--color-accent);
135
+ }
136
+
137
+ p {
138
+ line-height: 1.6;
139
+ }
140
+
141
+ a {
142
+ color: var(--color-primary);
143
+ }
144
+
145
+ code {
146
+ font-family: var(--font-mono);
147
+ font-weight: 500;
148
+ background: var(--color-accent-bg);
149
+ border: 1px solid var(--color-accent-border);
150
+ padding: 0.1rem 0.4rem;
151
+ border-radius: var(--radius-sm);
152
+ font-size: 0.9em;
153
+ }
154
+
155
+ main {
156
+ width: min(56rem, calc(100% - 2rem));
157
+ margin: 2.5rem auto 6rem;
158
+ }
159
+
160
+ /* header */
161
+
162
+ .site-header {
163
+ position: sticky;
164
+ top: 0;
165
+ z-index: 10;
166
+ display: flex;
167
+ align-items: center;
168
+ padding: 0.85rem 1rem;
169
+ background: color-mix(in srgb, var(--color-bg) 88%, transparent);
170
+ backdrop-filter: blur(8px);
171
+ border-bottom: 1px solid var(--color-border);
172
+ }
173
+
174
+ .site-brand {
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 0.7rem;
178
+ text-decoration: none;
179
+ color: var(--color-fg);
180
+ margin: 0 auto;
181
+ width: min(56rem, calc(100% - 2rem));
182
+ }
183
+
184
+ .pulumi-logo {
185
+ display: inline-flex;
186
+ align-items: center;
187
+ }
188
+
189
+ .pulumi-logo-mark {
190
+ width: auto;
191
+ display: none;
192
+ }
193
+
194
+ @media (prefers-color-scheme: light) {
195
+ .pulumi-logo-light {
196
+ display: block;
197
+ }
198
+ }
199
+
200
+ @media (prefers-color-scheme: dark) {
201
+ .pulumi-logo-dark {
202
+ display: block;
203
+ }
204
+ }
205
+
206
+ .site-brand-divider {
207
+ width: 1px;
208
+ height: 1.1rem;
209
+ background: var(--color-border-strong);
210
+ }
211
+
212
+ .site-brand-name {
213
+ font-weight: 600;
214
+ font-size: 0.95rem;
215
+ letter-spacing: -0.01em;
216
+ }
217
+
218
+ /* subtitles, badges, banners */
219
+
220
+ .subtitle {
221
+ color: var(--color-fg-muted);
222
+ margin-top: -0.35rem;
223
+ font-size: 0.95rem;
224
+ }
225
+
226
+ .back-link {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ gap: 0.35rem;
230
+ margin-bottom: 1.25rem;
231
+ color: var(--color-fg-muted);
232
+ font-size: 0.875rem;
233
+ font-weight: 500;
234
+ text-decoration: none;
235
+ }
236
+
237
+ .back-link:hover {
238
+ color: var(--color-primary);
239
+ }
240
+
241
+ .empty-state {
242
+ color: var(--color-fg-muted);
243
+ }
244
+
245
+ .badge {
246
+ display: inline-flex;
247
+ align-items: center;
248
+ font-family: var(--font-mono);
249
+ font-size: 0.7rem;
250
+ font-weight: 500;
251
+ text-transform: uppercase;
252
+ letter-spacing: 0.05em;
253
+ padding: 0.15rem 0.5rem;
254
+ border-radius: 999px;
255
+ border: 1px solid transparent;
256
+ white-space: nowrap;
257
+ }
258
+
259
+ .badge-resource {
260
+ background: var(--badge-resource-bg);
261
+ color: var(--badge-resource-fg);
262
+ border-color: var(--badge-resource-border);
263
+ }
264
+
265
+ .badge-function {
266
+ background: var(--badge-function-bg);
267
+ color: var(--badge-function-fg);
268
+ border-color: var(--badge-function-border);
269
+ }
270
+
271
+ .badge-warning {
272
+ background: var(--badge-warning-bg);
273
+ color: var(--badge-warning-fg);
274
+ border-color: var(--badge-warning-border);
275
+ }
276
+
277
+ .badge-failure {
278
+ background: var(--badge-failure-bg);
279
+ color: var(--badge-failure-fg);
280
+ border-color: var(--badge-failure-border);
281
+ }
282
+
283
+ .badge-info {
284
+ background: var(--badge-info-bg);
285
+ color: var(--badge-info-fg);
286
+ border-color: var(--badge-info-border);
287
+ }
288
+
289
+ .banner {
290
+ border-radius: var(--radius-md);
291
+ border: 1px solid transparent;
292
+ padding: 0.7rem 0.9rem;
293
+ font-size: 0.9rem;
294
+ margin: 0.75rem 0 1.25rem;
295
+ }
296
+
297
+ .banner-failure {
298
+ background: var(--badge-failure-bg);
299
+ color: var(--badge-failure-fg);
300
+ border-color: var(--badge-failure-border);
301
+ }
302
+
303
+ .banner-warning {
304
+ background: var(--badge-warning-bg);
305
+ color: var(--badge-warning-fg);
306
+ border-color: var(--badge-warning-border);
307
+ }
308
+
309
+ .banner-info {
310
+ background: var(--badge-info-bg);
311
+ color: var(--badge-info-fg);
312
+ border-color: var(--badge-info-border);
313
+ }
314
+
315
+ /* provider / doc lists */
316
+
317
+ .provider-list {
318
+ list-style: none;
319
+ padding: 0;
320
+ display: grid;
321
+ gap: 0.75rem;
322
+ }
323
+
324
+ .provider-card {
325
+ border: 1px solid var(--color-border);
326
+ border-radius: var(--radius-lg);
327
+ padding: 1.1rem 1.25rem;
328
+ background: var(--color-bg);
329
+ transition:
330
+ border-color 0.15s ease,
331
+ background-color 0.15s ease,
332
+ transform 0.15s ease;
333
+ }
334
+
335
+ .provider-card:hover {
336
+ border-color: var(--color-accent-border);
337
+ background: var(--color-accent-bg);
338
+ }
339
+
340
+ .provider-card a {
341
+ display: flex;
342
+ justify-content: space-between;
343
+ align-items: baseline;
344
+ gap: 1rem;
345
+ text-decoration: none;
346
+ color: inherit;
347
+ }
348
+
349
+ .provider-name {
350
+ font-weight: 600;
351
+ font-size: 1.1rem;
352
+ letter-spacing: -0.01em;
353
+ }
354
+
355
+ .provider-source {
356
+ color: var(--color-fg-subtle);
357
+ font-size: 0.85rem;
358
+ font-family: var(--font-mono);
359
+ }
360
+
361
+ .provider-stats {
362
+ color: var(--color-fg-muted);
363
+ margin: 0.6rem 0 0;
364
+ font-size: 0.85rem;
365
+ }
366
+
367
+ .doc-list {
368
+ list-style: none;
369
+ padding: 0;
370
+ display: grid;
371
+ gap: 0.6rem;
372
+ margin-bottom: 2rem;
373
+ }
374
+
375
+ .doc-list-item {
376
+ border: 1px solid var(--color-border);
377
+ border-radius: var(--radius-md);
378
+ padding: 0.75rem 1rem;
379
+ transition:
380
+ border-color 0.15s ease,
381
+ background-color 0.15s ease;
382
+ }
383
+
384
+ .doc-list-item:hover {
385
+ border-color: var(--color-accent-border);
386
+ background: var(--color-accent-bg);
387
+ }
388
+
389
+ .doc-list-item a {
390
+ text-decoration: none;
391
+ color: var(--color-fg);
392
+ font-weight: 500;
393
+ }
394
+
395
+ .doc-list-item a:hover {
396
+ color: var(--color-primary);
397
+ }
398
+
399
+ .doc-list-item .badge {
400
+ margin-top: 0.4rem;
401
+ }
402
+
403
+ .doc-summary {
404
+ color: var(--color-fg-muted);
405
+ margin: 0.35rem 0 0;
406
+ font-size: 0.9rem;
407
+ }
408
+
409
+ /* code examples */
410
+
411
+ .code-example {
412
+ margin-bottom: 1.5rem;
413
+ }
414
+
415
+ .code-example-lang {
416
+ display: inline-block;
417
+ font-family: var(--font-mono);
418
+ font-size: 0.7rem;
419
+ color: var(--color-fg-subtle);
420
+ text-transform: uppercase;
421
+ letter-spacing: 0.05em;
422
+ margin-bottom: 0.4rem;
423
+ }
424
+
425
+ .code-example pre {
426
+ background: var(--color-code-bg);
427
+ border: 1px solid var(--color-code-border);
428
+ border-radius: var(--radius-md);
429
+ padding: 1rem 1.1rem;
430
+ overflow-x: auto;
431
+ margin: 0;
432
+ }
433
+
434
+ .code-example code {
435
+ background: none;
436
+ border: none;
437
+ padding: 0;
438
+ border-radius: 0;
439
+ font-size: 0.85rem;
440
+ line-height: 1.6;
441
+ }
442
+
443
+ /* property tables */
444
+
445
+ .props-table {
446
+ width: 100%;
447
+ border-collapse: collapse;
448
+ font-size: 0.875rem;
449
+ margin-bottom: 1rem;
450
+ border: 1px solid var(--color-border);
451
+ border-radius: var(--radius-md);
452
+ overflow: hidden;
453
+ }
454
+
455
+ .props-table th,
456
+ .props-table td {
457
+ text-align: left;
458
+ padding: 0.55rem 0.75rem;
459
+ border-bottom: 1px solid var(--color-border);
460
+ vertical-align: top;
461
+ }
462
+
463
+ .props-table tr:last-child td {
464
+ border-bottom: none;
465
+ }
466
+
467
+ .props-table th {
468
+ color: var(--color-fg-subtle);
469
+ font-weight: 600;
470
+ font-size: 0.75rem;
471
+ text-transform: uppercase;
472
+ letter-spacing: 0.04em;
473
+ background: var(--color-accent-bg);
474
+ }
475
+
476
+ .props-table code {
477
+ font-size: 0.85em;
478
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "include": ["**/*.ts", "**/*.tsx", "vite.config.js"],
3
+
4
+ "compilerOptions": {
5
+ "target": "ES2022",
6
+ "jsx": "react-jsx",
7
+ "module": "ESNext",
8
+ "paths": {
9
+ "#/*": ["./src/*"],
10
+ "@/*": ["./src/*"]
11
+ },
12
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
13
+ "types": ["vite/client"],
14
+
15
+ /* Bundler mode */
16
+ "moduleResolution": "bundler",
17
+ "allowImportingTsExtensions": true,
18
+ "verbatimModuleSyntax": true,
19
+ "noEmit": true,
20
+
21
+ /* Linting */
22
+ "skipLibCheck": true,
23
+ "strict": true,
24
+ "noUnusedLocals": true,
25
+ "noUnusedParameters": true,
26
+ "noFallthroughCasesInSwitch": true,
27
+ "noUncheckedSideEffectImports": true
28
+ }
29
+ }