pulumi-package-docs 0.2.0 → 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 (28) hide show
  1. package/bin/cli.js +0 -1
  2. package/dist/client/assets/{MemberDetail-CX9jiyic.js → MemberDetail-BS9DbqEt.js} +1 -1
  3. package/dist/client/assets/{index-CZRUHwIq.js → index-2FzxAhzN.js} +2 -2
  4. package/dist/client/assets/providers._name-FmJEVkdV.js +1 -0
  5. package/dist/client/assets/{providers._name.functions._token-DXrP4mSE.js → providers._name.functions._token-BzjmNHea.js} +1 -1
  6. package/dist/client/assets/{providers._name.functions._token-bvc3vrG2.js → providers._name.functions._token-D768U6I-.js} +1 -1
  7. package/dist/client/assets/{providers._name.index-CtKE1x7S.js → providers._name.index-C42yQ95z.js} +1 -1
  8. package/dist/client/assets/{providers._name.index-tTXQzRr7.js → providers._name.index-Dm0YiZWP.js} +1 -1
  9. package/dist/client/assets/{providers._name.resources._token--BZM8RBv.js → providers._name.resources._token-CIYPoqyA.js} +1 -1
  10. package/dist/client/assets/{providers._name.resources._token-CbZkRkaE.js → providers._name.resources._token-D0OLvgo_.js} +1 -1
  11. package/dist/client/assets/{routes-GAgiQcBX.js → routes-DKNWlgPZ.js} +1 -1
  12. package/dist/client/assets/styles-VChXLU8b.css +1 -0
  13. package/dist/server/assets/{MemberDetail-BiBAI1vw.js → MemberDetail-C5sAHNZW.js} +1 -1
  14. package/dist/server/assets/{_tanstack-start-manifest_v-DHujW1ME.js → _tanstack-start-manifest_v-B0J-S-em.js} +12 -12
  15. package/dist/server/assets/{providers._name.functions._token-C0A7Y90t.js → providers._name.functions._token-Gkw4zt3M.js} +2 -2
  16. package/dist/server/assets/{providers._name.index-BK_ZRd5l.js → providers._name.index-CEXkl-76.js} +1 -1
  17. package/dist/server/assets/{providers._name.resources._token-CbvRkms4.js → providers._name.resources._token-R_i2MmRl.js} +2 -2
  18. package/dist/server/assets/{router-DZSocx9m.js → router-1INob9fh.js} +184 -21
  19. package/dist/server/assets/{routes-B-G_iLTo.js → routes-4jiXnS1p.js} +3 -3
  20. package/dist/server/server.js +2 -2
  21. package/package.json +1 -1
  22. package/src/components/ThemeToggle.tsx +121 -0
  23. package/src/routes/__root.tsx +17 -7
  24. package/src/routes/index.tsx +2 -2
  25. package/src/styles.css +127 -7
  26. package/vite.config.ts +35 -1
  27. package/dist/client/assets/providers._name-DpU324kz.js +0 -1
  28. package/dist/client/assets/styles-CWDprFhI.css +0 -1
@@ -6,8 +6,14 @@ import {
6
6
  } from '@tanstack/react-router'
7
7
 
8
8
  import { PulumiLogo } from '@/components/PulumiLogo'
9
+ import { ThemeToggle } from '@/components/ThemeToggle'
9
10
  import appCss from '../styles.css?url'
10
11
 
12
+ // Runs before hydration so an explicit theme choice applies before first
13
+ // paint (no flash of the wrong theme). Absent (system default) is a no-op —
14
+ // styles.css's prefers-color-scheme rules already handle that case.
15
+ const themeInitScript = `try{var t=localStorage.getItem('theme');if(t==='light'||t==='dark'){document.documentElement.dataset.theme=t}}catch(e){}`
16
+
11
17
  export const Route = createRootRoute({
12
18
  head: () => ({
13
19
  meta: [
@@ -19,7 +25,7 @@ export const Route = createRootRoute({
19
25
  content: 'width=device-width, initial-scale=1',
20
26
  },
21
27
  {
22
- title: 'Local Provider Docs',
28
+ title: 'Pulumi Package Docs',
23
29
  },
24
30
  ],
25
31
  links: [
@@ -38,17 +44,21 @@ export const Route = createRootRoute({
38
44
 
39
45
  function RootDocument({ children }: { children: React.ReactNode }) {
40
46
  return (
41
- <html lang="en">
47
+ <html lang="en" suppressHydrationWarning>
42
48
  <head>
49
+ <script dangerouslySetInnerHTML={{ __html: themeInitScript }} />
43
50
  <HeadContent />
44
51
  </head>
45
52
  <body>
46
53
  <header className="site-header">
47
- <Link to="/" className="site-brand">
48
- <PulumiLogo height={22} />
49
- <span className="site-brand-divider" aria-hidden="true" />
50
- <span className="site-brand-name">Local Provider Docs</span>
51
- </Link>
54
+ <div className="site-header-inner">
55
+ <Link to="/" className="site-brand">
56
+ <PulumiLogo height={22} />
57
+ <span className="site-brand-divider" aria-hidden="true" />
58
+ <span className="site-brand-name">Package Docs</span>
59
+ </Link>
60
+ <ThemeToggle />
61
+ </div>
52
62
  </header>
53
63
  {children}
54
64
 
@@ -13,7 +13,7 @@ function Home() {
13
13
  if (!project) {
14
14
  return (
15
15
  <main>
16
- <h1>Local Provider Docs</h1>
16
+ <h1>Pulumi Package Docs</h1>
17
17
  <p className="empty-state">
18
18
  No Pulumi project was found at <code>{targetDir}</code> (or any parent
19
19
  directory). Run this from inside a Pulumi project directory, or with{' '}
@@ -25,7 +25,7 @@ function Home() {
25
25
 
26
26
  return (
27
27
  <main>
28
- <h1>Local Provider Docs</h1>
28
+ <h1>Pulumi Package Docs</h1>
29
29
  <p className="subtitle">
30
30
  {project.name ?? 'Pulumi project'} &middot; <code>{project.root}</code>
31
31
  </p>
package/src/styles.css CHANGED
@@ -47,8 +47,16 @@
47
47
  --radius-lg: 14px;
48
48
  }
49
49
 
50
+ /*
51
+ * Theme resolution: system preference by default; an explicit choice (from
52
+ * ThemeToggle, via `data-theme` on <html>) overrides it either way. The
53
+ * dark values below are duplicated across the media query and the
54
+ * `[data-theme='dark']` rule rather than shared, since a media query can't
55
+ * be combined into one selector list with a plain attribute selector -
56
+ * keep both blocks in sync.
57
+ */
50
58
  @media (prefers-color-scheme: dark) {
51
- :root {
59
+ :root:not([data-theme='light']) {
52
60
  --color-bg: #1f1b21; /* service black */
53
61
  --color-fg: #fafafa; /* gray-950 dark */
54
62
  --color-fg-muted: #e0dfe2; /* gray-800 dark */
@@ -87,6 +95,44 @@
87
95
  }
88
96
  }
89
97
 
98
+ :root[data-theme='dark'] {
99
+ --color-bg: #1f1b21; /* service black */
100
+ --color-fg: #fafafa; /* gray-950 dark */
101
+ --color-fg-muted: #e0dfe2; /* gray-800 dark */
102
+ --color-fg-subtle: #cbcace; /* gray-700 dark */
103
+ --color-border: #46434c; /* gray-100 dark */
104
+ --color-border-strong: #56535a; /* gray-200 dark */
105
+
106
+ --color-primary: #dedbff; /* violet-800 dark: body-safe accent */
107
+ --color-primary-strong: #f5f5ff; /* violet-950 dark */
108
+ --color-accent: #9077f3; /* violet-500, symmetric */
109
+ --color-accent-bg: #231f33; /* violet-50 dark */
110
+ --color-accent-border: #492e8e; /* violet-200 dark */
111
+
112
+ --color-code-bg: rgb(35 31 51 / 55%); /* violet-950 (dark theme) @ 50% */
113
+ --color-code-border: #492e8e; /* violet-800 (dark theme) */
114
+
115
+ --badge-resource-bg: #392960; /* violet-100 dark */
116
+ --badge-resource-fg: #c3bdff; /* violet-700 dark */
117
+ --badge-resource-border: #492e8e; /* violet-200 dark */
118
+
119
+ --badge-function-bg: #114642; /* aqua-100 dark */
120
+ --badge-function-fg: #1efad9; /* aqua-700 dark */
121
+ --badge-function-border: #075f59; /* aqua-200 dark */
122
+
123
+ --badge-warning-bg: #723213; /* yellow-100 dark */
124
+ --badge-warning-fg: #fde38a; /* yellow-800 dark */
125
+ --badge-warning-border: #933d0d; /* yellow-200 dark */
126
+
127
+ --badge-failure-bg: #611f22; /* red-100 dark */
128
+ --badge-failure-fg: #ffc7ca; /* red-800 dark */
129
+ --badge-failure-border: #96171e; /* red-200 dark */
130
+
131
+ --badge-info-bg: #28448a; /* blue-100 dark */
132
+ --badge-info-fg: #cce4ff; /* blue-800 dark */
133
+ --badge-info-border: #1e47c2; /* blue-200 dark */
134
+ }
135
+
90
136
  * {
91
137
  box-sizing: border-box;
92
138
  }
@@ -163,22 +209,26 @@ main {
163
209
  position: sticky;
164
210
  top: 0;
165
211
  z-index: 10;
166
- display: flex;
167
- align-items: center;
168
212
  padding: 0.85rem 1rem;
169
213
  background: color-mix(in srgb, var(--color-bg) 88%, transparent);
170
214
  backdrop-filter: blur(8px);
171
215
  border-bottom: 1px solid var(--color-border);
172
216
  }
173
217
 
218
+ .site-header-inner {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 0.5rem;
222
+ margin: 0 auto;
223
+ width: min(56rem, calc(100% - 2rem));
224
+ }
225
+
174
226
  .site-brand {
175
227
  display: flex;
176
228
  align-items: center;
177
229
  gap: 0.7rem;
178
230
  text-decoration: none;
179
231
  color: var(--color-fg);
180
- margin: 0 auto;
181
- width: min(56rem, calc(100% - 2rem));
182
232
  }
183
233
 
184
234
  .pulumi-logo {
@@ -192,17 +242,25 @@ main {
192
242
  }
193
243
 
194
244
  @media (prefers-color-scheme: light) {
195
- .pulumi-logo-light {
245
+ :root:not([data-theme='dark']) .pulumi-logo-light {
196
246
  display: block;
197
247
  }
198
248
  }
199
249
 
200
250
  @media (prefers-color-scheme: dark) {
201
- .pulumi-logo-dark {
251
+ :root:not([data-theme='light']) .pulumi-logo-dark {
202
252
  display: block;
203
253
  }
204
254
  }
205
255
 
256
+ :root[data-theme='light'] .pulumi-logo-light {
257
+ display: block;
258
+ }
259
+
260
+ :root[data-theme='dark'] .pulumi-logo-dark {
261
+ display: block;
262
+ }
263
+
206
264
  .site-brand-divider {
207
265
  width: 1px;
208
266
  height: 1.1rem;
@@ -215,6 +273,68 @@ main {
215
273
  letter-spacing: -0.01em;
216
274
  }
217
275
 
276
+ .theme-switch {
277
+ display: inline-flex;
278
+ align-items: center;
279
+ gap: 0.15rem;
280
+ padding: 0.15rem;
281
+ border: 1px solid var(--color-border);
282
+ border-radius: var(--radius-md);
283
+ }
284
+
285
+ .theme-switch-option {
286
+ position: relative;
287
+ display: inline-flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ width: 1.5rem;
291
+ height: 1.5rem;
292
+ padding: 0;
293
+ border: 1px solid transparent;
294
+ border-radius: var(--radius-sm);
295
+ background: none;
296
+ color: var(--color-fg-subtle);
297
+ cursor: pointer;
298
+ transition:
299
+ background-color 0.15s ease,
300
+ border-color 0.15s ease,
301
+ color 0.15s ease;
302
+ }
303
+
304
+ .theme-switch-option:hover {
305
+ color: var(--color-primary);
306
+ }
307
+
308
+ .theme-switch-option[aria-pressed='true'] {
309
+ background: var(--color-accent-bg);
310
+ border-color: var(--color-accent-border);
311
+ color: var(--color-primary);
312
+ }
313
+
314
+ .theme-switch-option::after {
315
+ content: attr(aria-label);
316
+ position: absolute;
317
+ top: calc(100% + 0.45rem);
318
+ left: 50%;
319
+ transform: translateX(-50%);
320
+ padding: 0.25rem 0.5rem;
321
+ border-radius: var(--radius-sm);
322
+ background: var(--color-fg);
323
+ color: var(--color-bg);
324
+ font-size: 0.7rem;
325
+ font-weight: 500;
326
+ white-space: nowrap;
327
+ opacity: 0;
328
+ pointer-events: none;
329
+ transition: opacity 0.15s ease;
330
+ z-index: 20;
331
+ }
332
+
333
+ .theme-switch-option:hover::after,
334
+ .theme-switch-option:focus-visible::after {
335
+ opacity: 1;
336
+ }
337
+
218
338
  /* subtitles, badges, banners */
219
339
 
220
340
  .subtitle {
package/vite.config.ts CHANGED
@@ -1,12 +1,46 @@
1
1
  import { defineConfig } from 'vite'
2
+ import type { Plugin, PreviewServer, ViteDevServer } from 'vite'
2
3
 
3
4
  import { tanstackStart } from '@tanstack/react-start/plugin/vite'
4
5
 
5
6
  import viteReact from '@vitejs/plugin-react'
6
7
 
8
+ // Matches the ANSI styling Vite's own CLI uses for its "Local"/"Network"
9
+ // bullets (picocolors' green/bold/cyan), so this reads as one more item in
10
+ // that same list rather than a separately-styled line.
11
+ const green = (s: string) => `\x1b[32m${s}\x1b[39m`
12
+ const bold = (s: string) => `\x1b[1m${s}\x1b[22m`
13
+ const cyan = (s: string) => `\x1b[36m${s}\x1b[39m`
14
+ const colorUrl = (url: string) =>
15
+ cyan(url.replace(/:(\d+)\//, (_, port) => `:${bold(port)}/`))
16
+
17
+ /** Prints the MCP endpoint alongside Vite's own "Local"/"Network" bullets. */
18
+ function printMcpUrl(): Plugin {
19
+ function withMcpUrl(server: ViteDevServer | PreviewServer) {
20
+ const printUrls = server.printUrls.bind(server)
21
+ server.printUrls = () => {
22
+ printUrls()
23
+ const base = server.resolvedUrls?.local[0]
24
+ if (!base) return
25
+ const url = new URL('mcp', base).toString()
26
+ // Padded to the same 9-column label width Vite uses ("Local: " /
27
+ // "Network: " are both 9 characters before the URL).
28
+ server.config.logger.info(
29
+ ` ${green('➜')} ${bold('MCP')}: ${colorUrl(url)}`,
30
+ )
31
+ }
32
+ }
33
+
34
+ return {
35
+ name: 'print-mcp-url',
36
+ configureServer: withMcpUrl,
37
+ configurePreviewServer: withMcpUrl,
38
+ }
39
+ }
40
+
7
41
  const config = defineConfig({
8
42
  resolve: { tsconfigPaths: true },
9
- plugins: [tanstackStart(), viteReact()],
43
+ plugins: [tanstackStart(), viteReact(), printMcpUrl()],
10
44
  })
11
45
 
12
46
  export default config
@@ -1 +0,0 @@
1
- import{o as e}from"./useSelector-BIt42tGI.js";import{a as t}from"./index-CZRUHwIq.js";var n=e(),r=()=>(0,n.jsx)(t,{});export{r as component};
@@ -1 +0,0 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--font-sans:Inter, "Helvetica Neue", Helvetica, Arial, -apple-system, BlinkMacSystemFont, sans-serif;--font-mono:"Monaspace Neon", Menlo, Consolas, ui-monospace, monospace;--color-bg:#fff;--color-fg:#2e2932;--color-fg-muted:#56535a;--color-fg-subtle:#6a6675;--color-border:#e0dfe2;--color-border-strong:#cbcace;--color-primary:#5a30c5;--color-primary-strong:#492e8e;--color-accent:#9077f3;--color-accent-bg:#f5f5ff;--color-accent-border:#dedbff;--color-code-bg:#f5f5ff8c;--color-code-border:#dedbff;--badge-resource-bg:#ebebff;--badge-resource-fg:#5a30c5;--badge-resource-border:#dedbff;--badge-function-bg:#ccfff5;--badge-function-fg:#00756c;--badge-function-border:#5cffde;--badge-warning-bg:#fef2c7;--badge-warning-fg:#933d0d;--badge-warning-border:#fde38a;--badge-failure-bg:#ffe0e1;--badge-failure-fg:#96171e;--badge-failure-border:#ffc7ca;--badge-info-bg:#e5f1ff;--badge-info-fg:#1e47c2;--badge-info-border:#cce4ff;--radius-sm:6px;--radius-md:10px;--radius-lg:14px}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--color-bg:#1f1b21;--color-fg:#fafafa;--color-fg-muted:#e0dfe2;--color-fg-subtle:#cbcace;--color-border:#46434c;--color-border-strong:#56535a;--color-primary:#dedbff;--color-primary-strong:#f5f5ff;--color-accent:#9077f3;--color-accent-bg:#231f33;--color-accent-border:#492e8e;--color-code-bg:#231f338c;--color-code-border:#492e8e;--badge-resource-bg:#392960;--badge-resource-fg:#c3bdff;--badge-resource-border:#492e8e;--badge-function-bg:#114642;--badge-function-fg:#1efad9;--badge-function-border:#075f59;--badge-warning-bg:#723213;--badge-warning-fg:#fde38a;--badge-warning-border:#933d0d;--badge-failure-bg:#611f22;--badge-failure-fg:#ffc7ca;--badge-failure-border:#96171e;--badge-info-bg:#28448a;--badge-info-fg:#cce4ff;--badge-info-border:#1e47c2}}*{box-sizing:border-box}html{background:var(--color-bg)}body{font-family:var(--font-sans);font-feature-settings:"liga" 1, "calt" 1, "cv11" 1;color:var(--color-fg);background:var(--color-bg);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0;line-height:1.3}h1,h2,h3{letter-spacing:-.02em;color:var(--color-fg);font-weight:600;line-height:1.1}h1{margin:0 0 .4rem;font-size:1.9rem}h2{text-transform:uppercase;letter-spacing:.05em;color:var(--color-fg-subtle);border-left:3px solid var(--color-accent);margin:2.5rem 0 1rem;padding-left:.65rem;font-size:.8rem;font-weight:600}p{line-height:1.6}a{color:var(--color-primary)}code{font-family:var(--font-mono);background:var(--color-accent-bg);border:1px solid var(--color-accent-border);border-radius:var(--radius-sm);padding:.1rem .4rem;font-size:.9em;font-weight:500}main{width:min(56rem,100% - 2rem);margin:2.5rem auto 6rem}.site-header{z-index:10;background:color-mix(in srgb, var(--color-bg) 88%, transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--color-border);align-items:center;padding:.85rem 1rem;display:flex;position:sticky;top:0}.site-brand{color:var(--color-fg);align-items:center;gap:.7rem;width:min(56rem,100% - 2rem);margin:0 auto;text-decoration:none;display:flex}.pulumi-logo{align-items:center;display:inline-flex}.pulumi-logo-mark{width:auto;display:none}@media (prefers-color-scheme:light){.pulumi-logo-light{display:block}}@media (prefers-color-scheme:dark){.pulumi-logo-dark{display:block}}.site-brand-divider{background:var(--color-border-strong);width:1px;height:1.1rem}.site-brand-name{letter-spacing:-.01em;font-size:.95rem;font-weight:600}.subtitle{color:var(--color-fg-muted);margin-top:-.35rem;font-size:.95rem}.back-link{color:var(--color-fg-muted);align-items:center;gap:.35rem;margin-bottom:1.25rem;font-size:.875rem;font-weight:500;text-decoration:none;display:inline-flex}.back-link:hover{color:var(--color-primary)}.empty-state{color:var(--color-fg-muted)}.badge{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-items:center;padding:.15rem .5rem;font-size:.7rem;font-weight:500;display:inline-flex}.badge-resource{background:var(--badge-resource-bg);color:var(--badge-resource-fg);border-color:var(--badge-resource-border)}.badge-function{background:var(--badge-function-bg);color:var(--badge-function-fg);border-color:var(--badge-function-border)}.badge-warning{background:var(--badge-warning-bg);color:var(--badge-warning-fg);border-color:var(--badge-warning-border)}.badge-failure{background:var(--badge-failure-bg);color:var(--badge-failure-fg);border-color:var(--badge-failure-border)}.badge-info{background:var(--badge-info-bg);color:var(--badge-info-fg);border-color:var(--badge-info-border)}.banner{border-radius:var(--radius-md);border:1px solid #0000;margin:.75rem 0 1.25rem;padding:.7rem .9rem;font-size:.9rem}.banner-failure{background:var(--badge-failure-bg);color:var(--badge-failure-fg);border-color:var(--badge-failure-border)}.banner-warning{background:var(--badge-warning-bg);color:var(--badge-warning-fg);border-color:var(--badge-warning-border)}.banner-info{background:var(--badge-info-bg);color:var(--badge-info-fg);border-color:var(--badge-info-border)}.provider-list{gap:.75rem;padding:0;list-style:none;display:grid}.provider-card{border:1px solid var(--color-border);border-radius:var(--radius-lg);background:var(--color-bg);padding:1.1rem 1.25rem;transition:border-color .15s,background-color .15s,transform .15s}.provider-card:hover{border-color:var(--color-accent-border);background:var(--color-accent-bg)}.provider-card a{color:inherit;justify-content:space-between;align-items:baseline;gap:1rem;text-decoration:none;display:flex}.provider-name{letter-spacing:-.01em;font-size:1.1rem;font-weight:600}.provider-source{color:var(--color-fg-subtle);font-size:.85rem;font-family:var(--font-mono)}.provider-stats{color:var(--color-fg-muted);margin:.6rem 0 0;font-size:.85rem}.doc-list{gap:.6rem;margin-bottom:2rem;padding:0;list-style:none;display:grid}.doc-list-item{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:.75rem 1rem;transition:border-color .15s,background-color .15s}.doc-list-item:hover{border-color:var(--color-accent-border);background:var(--color-accent-bg)}.doc-list-item a{color:var(--color-fg);font-weight:500;text-decoration:none}.doc-list-item a:hover{color:var(--color-primary)}.doc-list-item .badge{margin-top:.4rem}.doc-summary{color:var(--color-fg-muted);margin:.35rem 0 0;font-size:.9rem}.code-example{margin-bottom:1.5rem}.code-example-lang{font-family:var(--font-mono);color:var(--color-fg-subtle);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.4rem;font-size:.7rem;display:inline-block}.code-example pre{background:var(--color-code-bg);border:1px solid var(--color-code-border);border-radius:var(--radius-md);margin:0;padding:1rem 1.1rem;overflow-x:auto}.code-example code{background:0 0;border:none;border-radius:0;padding:0;font-size:.85rem;line-height:1.6}.props-table{border-collapse:collapse;border:1px solid var(--color-border);border-radius:var(--radius-md);width:100%;margin-bottom:1rem;font-size:.875rem;overflow:hidden}.props-table th,.props-table td{text-align:left;border-bottom:1px solid var(--color-border);vertical-align:top;padding:.55rem .75rem}.props-table tr:last-child td{border-bottom:none}.props-table th{color:var(--color-fg-subtle);text-transform:uppercase;letter-spacing:.04em;background:var(--color-accent-bg);font-size:.75rem;font-weight:600}.props-table code{font-size:.85em}