@aprovan/patchwork-image-shadcn 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.
@@ -0,0 +1,202 @@
1
+ // src/setup.ts
2
+ var DEFAULT_CSS_VARIABLES = {
3
+ "--background": "0 0% 100%",
4
+ "--foreground": "222.2 84% 4.9%",
5
+ "--card": "0 0% 100%",
6
+ "--card-foreground": "222.2 84% 4.9%",
7
+ "--popover": "0 0% 100%",
8
+ "--popover-foreground": "222.2 84% 4.9%",
9
+ "--primary": "222.2 47.4% 11.2%",
10
+ "--primary-foreground": "210 40% 98%",
11
+ "--secondary": "210 40% 96.1%",
12
+ "--secondary-foreground": "222.2 47.4% 11.2%",
13
+ "--muted": "210 40% 96.1%",
14
+ "--muted-foreground": "215.4 16.3% 46.9%",
15
+ "--accent": "210 40% 96.1%",
16
+ "--accent-foreground": "222.2 47.4% 11.2%",
17
+ "--destructive": "0 84.2% 60.2%",
18
+ "--destructive-foreground": "210 40% 98%",
19
+ "--border": "214.3 31.8% 91.4%",
20
+ "--input": "214.3 31.8% 91.4%",
21
+ "--ring": "222.2 84% 4.9%",
22
+ "--radius": "0.5rem"
23
+ };
24
+ var DARK_CSS_VARIABLES = {
25
+ "--background": "222.2 84% 4.9%",
26
+ "--foreground": "210 40% 98%",
27
+ "--card": "222.2 84% 4.9%",
28
+ "--card-foreground": "210 40% 98%",
29
+ "--popover": "222.2 84% 4.9%",
30
+ "--popover-foreground": "210 40% 98%",
31
+ "--primary": "210 40% 98%",
32
+ "--primary-foreground": "222.2 47.4% 11.2%",
33
+ "--secondary": "217.2 32.6% 17.5%",
34
+ "--secondary-foreground": "210 40% 98%",
35
+ "--muted": "217.2 32.6% 17.5%",
36
+ "--muted-foreground": "215 20.2% 65.1%",
37
+ "--accent": "217.2 32.6% 17.5%",
38
+ "--accent-foreground": "210 40% 98%",
39
+ "--destructive": "0 62.8% 30.6%",
40
+ "--destructive-foreground": "210 40% 98%",
41
+ "--border": "217.2 32.6% 17.5%",
42
+ "--input": "217.2 32.6% 17.5%",
43
+ "--ring": "212.7 26.8% 83.9%",
44
+ "--radius": "0.5rem"
45
+ };
46
+ var tailwindLoadPromise = null;
47
+ var themeStyleElement = null;
48
+ var containerObservers = /* @__PURE__ */ new Map();
49
+ async function setup(root, options = {}) {
50
+ const { darkMode = "system", cssRuntime = true, cssVariables = {} } = options;
51
+ if (cssRuntime) {
52
+ await injectTailwindPlayCdn();
53
+ }
54
+ let isDark = false;
55
+ if (darkMode === true) {
56
+ isDark = true;
57
+ } else if (darkMode === "system") {
58
+ isDark = window.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false;
59
+ }
60
+ if (!themeStyleElement) {
61
+ themeStyleElement = document.createElement("style");
62
+ themeStyleElement.id = "patchwork-image-shadcn-theme";
63
+ document.head.appendChild(themeStyleElement);
64
+ }
65
+ const baseVars = isDark ? DARK_CSS_VARIABLES : DEFAULT_CSS_VARIABLES;
66
+ const mergedVars = { ...baseVars, ...cssVariables };
67
+ const cssVarsString = Object.entries(mergedVars).map(([key, value]) => `${key}: ${value};`).join("\n ");
68
+ themeStyleElement.textContent = `
69
+ /* Patchwork ShadCN Theme */
70
+ :root {
71
+ ${cssVarsString}
72
+ }
73
+
74
+ .patchwork-widget {
75
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
76
+ line-height: 1.5;
77
+ color: hsl(var(--foreground));
78
+ background-color: hsl(var(--background));
79
+ }
80
+
81
+ .patchwork-widget *, .patchwork-widget *::before, .patchwork-widget *::after {
82
+ box-sizing: border-box;
83
+ border-color: hsl(var(--border));
84
+ }
85
+ `;
86
+ root.classList.add("patchwork-widget");
87
+ if (isDark) {
88
+ root.classList.add("dark");
89
+ } else {
90
+ root.classList.remove("dark");
91
+ }
92
+ if (cssRuntime && !containerObservers.has(root)) {
93
+ const observer = new MutationObserver(() => {
94
+ requestAnimationFrame(() => {
95
+ const tempNode = document.createTextNode("");
96
+ document.body.appendChild(tempNode);
97
+ document.body.removeChild(tempNode);
98
+ });
99
+ });
100
+ observer.observe(root, {
101
+ childList: true,
102
+ subtree: true,
103
+ attributes: true,
104
+ attributeFilter: ["class"]
105
+ });
106
+ containerObservers.set(root, observer);
107
+ }
108
+ }
109
+ function injectTailwindPlayCdn() {
110
+ if (tailwindLoadPromise) {
111
+ return tailwindLoadPromise;
112
+ }
113
+ if (document.getElementById("patchwork-tailwind-cdn")) {
114
+ return Promise.resolve();
115
+ }
116
+ tailwindLoadPromise = new Promise((resolve, reject) => {
117
+ window.tailwind = {
118
+ config: {
119
+ darkMode: "class",
120
+ theme: {
121
+ extend: {
122
+ colors: {
123
+ border: "hsl(var(--border))",
124
+ input: "hsl(var(--input))",
125
+ ring: "hsl(var(--ring))",
126
+ background: "hsl(var(--background))",
127
+ foreground: "hsl(var(--foreground))",
128
+ primary: {
129
+ DEFAULT: "hsl(var(--primary))",
130
+ foreground: "hsl(var(--primary-foreground))"
131
+ },
132
+ secondary: {
133
+ DEFAULT: "hsl(var(--secondary))",
134
+ foreground: "hsl(var(--secondary-foreground))"
135
+ },
136
+ destructive: {
137
+ DEFAULT: "hsl(var(--destructive))",
138
+ foreground: "hsl(var(--destructive-foreground))"
139
+ },
140
+ muted: {
141
+ DEFAULT: "hsl(var(--muted))",
142
+ foreground: "hsl(var(--muted-foreground))"
143
+ },
144
+ accent: {
145
+ DEFAULT: "hsl(var(--accent))",
146
+ foreground: "hsl(var(--accent-foreground))"
147
+ },
148
+ popover: {
149
+ DEFAULT: "hsl(var(--popover))",
150
+ foreground: "hsl(var(--popover-foreground))"
151
+ },
152
+ card: {
153
+ DEFAULT: "hsl(var(--card))",
154
+ foreground: "hsl(var(--card-foreground))"
155
+ }
156
+ },
157
+ borderRadius: {
158
+ lg: "var(--radius)",
159
+ md: "calc(var(--radius) - 2px)",
160
+ sm: "calc(var(--radius) - 4px)"
161
+ }
162
+ }
163
+ }
164
+ }
165
+ };
166
+ const script = document.createElement("script");
167
+ script.id = "patchwork-tailwind-cdn";
168
+ script.src = "https://cdn.tailwindcss.com";
169
+ script.onload = () => {
170
+ resolve();
171
+ };
172
+ script.onerror = () => {
173
+ reject(new Error("Failed to load Tailwind Play CDN"));
174
+ };
175
+ document.head.appendChild(script);
176
+ });
177
+ return tailwindLoadPromise;
178
+ }
179
+ function cleanup() {
180
+ if (themeStyleElement) {
181
+ themeStyleElement.remove();
182
+ themeStyleElement = null;
183
+ }
184
+ const tailwindScript = document.getElementById("patchwork-tailwind-cdn");
185
+ if (tailwindScript) {
186
+ tailwindScript.remove();
187
+ tailwindLoadPromise = null;
188
+ }
189
+ if (window.tailwind) {
190
+ delete window.tailwind;
191
+ }
192
+ containerObservers.forEach((observer) => observer.disconnect());
193
+ containerObservers.clear();
194
+ }
195
+
196
+ export {
197
+ DEFAULT_CSS_VARIABLES,
198
+ DARK_CSS_VARIABLES,
199
+ setup,
200
+ cleanup
201
+ };
202
+ //# sourceMappingURL=chunk-7LFKP2EW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * @aprovan/patchwork-image-shadcn\n *\n * Setup function for the ShadCN/ui image.\n * Uses Tailwind Play CDN for runtime CSS generation.\n */\n\nexport interface SetupOptions {\n /** Enable dark mode (default: false - respects system preference) */\n darkMode?: boolean | 'system';\n /** Inject CSS runtime (default: true) */\n cssRuntime?: boolean;\n /** Custom CSS variable overrides */\n cssVariables?: Record<string, string>;\n}\n\nexport const DEFAULT_CSS_VARIABLES = {\n '--background': '0 0% 100%',\n '--foreground': '222.2 84% 4.9%',\n '--card': '0 0% 100%',\n '--card-foreground': '222.2 84% 4.9%',\n '--popover': '0 0% 100%',\n '--popover-foreground': '222.2 84% 4.9%',\n '--primary': '222.2 47.4% 11.2%',\n '--primary-foreground': '210 40% 98%',\n '--secondary': '210 40% 96.1%',\n '--secondary-foreground': '222.2 47.4% 11.2%',\n '--muted': '210 40% 96.1%',\n '--muted-foreground': '215.4 16.3% 46.9%',\n '--accent': '210 40% 96.1%',\n '--accent-foreground': '222.2 47.4% 11.2%',\n '--destructive': '0 84.2% 60.2%',\n '--destructive-foreground': '210 40% 98%',\n '--border': '214.3 31.8% 91.4%',\n '--input': '214.3 31.8% 91.4%',\n '--ring': '222.2 84% 4.9%',\n '--radius': '0.5rem',\n};\n\nexport const DARK_CSS_VARIABLES = {\n '--background': '222.2 84% 4.9%',\n '--foreground': '210 40% 98%',\n '--card': '222.2 84% 4.9%',\n '--card-foreground': '210 40% 98%',\n '--popover': '222.2 84% 4.9%',\n '--popover-foreground': '210 40% 98%',\n '--primary': '210 40% 98%',\n '--primary-foreground': '222.2 47.4% 11.2%',\n '--secondary': '217.2 32.6% 17.5%',\n '--secondary-foreground': '210 40% 98%',\n '--muted': '217.2 32.6% 17.5%',\n '--muted-foreground': '215 20.2% 65.1%',\n '--accent': '217.2 32.6% 17.5%',\n '--accent-foreground': '210 40% 98%',\n '--destructive': '0 62.8% 30.6%',\n '--destructive-foreground': '210 40% 98%',\n '--border': '217.2 32.6% 17.5%',\n '--input': '217.2 32.6% 17.5%',\n '--ring': '212.7 26.8% 83.9%',\n '--radius': '0.5rem',\n};\n\n// Track CSS runtime state\nlet tailwindLoadPromise: Promise<void> | null = null;\nlet themeStyleElement: HTMLStyleElement | null = null;\nconst containerObservers: Map<HTMLElement, MutationObserver> = new Map();\n\n// Window type augmentation for Tailwind Play CDN\ndeclare global {\n interface Window {\n tailwind?: {\n config?: Record<string, unknown>;\n };\n }\n}\n\n/**\n * Setup the ShadCN/ui image runtime environment\n *\n * Injects Tailwind Play CDN and theme CSS variables.\n * Sets up a MutationObserver to trigger CSS regeneration when content changes.\n *\n * @param root - Root element where the widget will be mounted\n * @param options - Optional configuration\n */\nexport async function setup(\n root: HTMLElement,\n options: SetupOptions = {},\n): Promise<void> {\n const { darkMode = 'system', cssRuntime = true, cssVariables = {} } = options;\n\n // Inject Tailwind Play CDN and wait for it to load\n if (cssRuntime) {\n await injectTailwindPlayCdn();\n }\n\n // Determine if dark mode\n let isDark = false;\n if (darkMode === true) {\n isDark = true;\n } else if (darkMode === 'system') {\n isDark =\n window.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n }\n\n // Create or update theme style element\n if (!themeStyleElement) {\n themeStyleElement = document.createElement('style');\n themeStyleElement.id = 'patchwork-image-shadcn-theme';\n document.head.appendChild(themeStyleElement);\n }\n\n // Build CSS variables\n const baseVars = isDark ? DARK_CSS_VARIABLES : DEFAULT_CSS_VARIABLES;\n const mergedVars = { ...baseVars, ...cssVariables };\n const cssVarsString = Object.entries(mergedVars)\n .map(([key, value]) => `${key}: ${value};`)\n .join('\\n ');\n\n themeStyleElement.textContent = `\n /* Patchwork ShadCN Theme */\n :root {\n ${cssVarsString}\n }\n\n .patchwork-widget {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n line-height: 1.5;\n color: hsl(var(--foreground));\n background-color: hsl(var(--background));\n }\n\n .patchwork-widget *, .patchwork-widget *::before, .patchwork-widget *::after {\n box-sizing: border-box;\n border-color: hsl(var(--border));\n }\n `;\n\n // Mark root as patchwork widget container\n root.classList.add('patchwork-widget');\n\n // Set dark mode class if needed\n if (isDark) {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n\n // Set up MutationObserver to trigger Tailwind re-compile on content changes\n if (cssRuntime && !containerObservers.has(root)) {\n const observer = new MutationObserver(() => {\n // Trigger Tailwind to re-scan by dispatching a custom event\n // The Play CDN listens for this internally\n requestAnimationFrame(() => {\n // Force Tailwind to re-process by triggering a mutation\n const tempNode = document.createTextNode('');\n document.body.appendChild(tempNode);\n document.body.removeChild(tempNode);\n });\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['class'],\n });\n\n containerObservers.set(root, observer);\n }\n}\n\n/**\n * Inject Tailwind Play CDN script\n *\n * The Play CDN automatically observes the DOM and generates CSS\n * for any Tailwind classes it finds.\n *\n * Returns a promise that resolves when Tailwind is fully loaded.\n */\nfunction injectTailwindPlayCdn(): Promise<void> {\n // Return existing promise if already loading/loaded\n if (tailwindLoadPromise) {\n return tailwindLoadPromise;\n }\n\n // Check if already injected\n if (document.getElementById('patchwork-tailwind-cdn')) {\n return Promise.resolve();\n }\n\n tailwindLoadPromise = new Promise((resolve, reject) => {\n // First, set up the config object BEFORE loading Tailwind\n // Tailwind Play CDN reads window.tailwind.config on load\n window.tailwind = {\n config: {\n darkMode: 'class',\n theme: {\n extend: {\n colors: {\n border: 'hsl(var(--border))',\n input: 'hsl(var(--input))',\n ring: 'hsl(var(--ring))',\n background: 'hsl(var(--background))',\n foreground: 'hsl(var(--foreground))',\n primary: {\n DEFAULT: 'hsl(var(--primary))',\n foreground: 'hsl(var(--primary-foreground))',\n },\n secondary: {\n DEFAULT: 'hsl(var(--secondary))',\n foreground: 'hsl(var(--secondary-foreground))',\n },\n destructive: {\n DEFAULT: 'hsl(var(--destructive))',\n foreground: 'hsl(var(--destructive-foreground))',\n },\n muted: {\n DEFAULT: 'hsl(var(--muted))',\n foreground: 'hsl(var(--muted-foreground))',\n },\n accent: {\n DEFAULT: 'hsl(var(--accent))',\n foreground: 'hsl(var(--accent-foreground))',\n },\n popover: {\n DEFAULT: 'hsl(var(--popover))',\n foreground: 'hsl(var(--popover-foreground))',\n },\n card: {\n DEFAULT: 'hsl(var(--card))',\n foreground: 'hsl(var(--card-foreground))',\n },\n },\n borderRadius: {\n lg: 'var(--radius)',\n md: 'calc(var(--radius) - 2px)',\n sm: 'calc(var(--radius) - 4px)',\n },\n },\n },\n },\n };\n\n // Load Tailwind Play CDN\n const script = document.createElement('script');\n script.id = 'patchwork-tailwind-cdn';\n script.src = 'https://cdn.tailwindcss.com';\n\n // Wait for script to load before resolving\n script.onload = () => {\n resolve();\n };\n script.onerror = () => {\n reject(new Error('Failed to load Tailwind Play CDN'));\n };\n\n document.head.appendChild(script);\n });\n\n return tailwindLoadPromise;\n}\n\n/**\n * Cleanup any global resources added by setup\n */\nexport function cleanup(): void {\n if (themeStyleElement) {\n themeStyleElement.remove();\n themeStyleElement = null;\n }\n\n const tailwindScript = document.getElementById('patchwork-tailwind-cdn');\n if (tailwindScript) {\n tailwindScript.remove();\n tailwindLoadPromise = null;\n }\n\n // Clean up the tailwind config from window\n if (window.tailwind) {\n delete window.tailwind;\n }\n\n // Clean up observers\n containerObservers.forEach((observer) => observer.disconnect());\n containerObservers.clear();\n}\n"],"mappings":"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","names":[]}
package/dist/html.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @aprovan/patchwork-image-shadcnshadcn - HTML Generation
3
+ *
4
+ * Generates complete HTML documents for browser widget rendering.
5
+ * The image owns the full HTML template including CSS, import maps, and mounting code.
6
+ *
7
+ * Uses Tailwind Play CDN for runtime CSS generation.
8
+ */
9
+ interface HtmlOptions {
10
+ /** Document title */
11
+ title?: string;
12
+ /** Theme: 'light' | 'dark' (default: 'dark') */
13
+ theme?: 'light' | 'dark';
14
+ /** Custom CSS to inject */
15
+ customCss?: string;
16
+ /** Widget props to pass */
17
+ props?: Record<string, unknown>;
18
+ /** Service namespaces to expose (generates bridge code) */
19
+ services?: string[];
20
+ }
21
+ interface ImportMapEntry {
22
+ [pkg: string]: string;
23
+ }
24
+ /**
25
+ * Transform compiled widget code to set global export
26
+ */
27
+ declare function transformWidgetCode(code: string): string;
28
+ /**
29
+ * Generate a complete HTML document for rendering a widget
30
+ *
31
+ * Uses Tailwind Play CDN which detects class usage via MutationObserver and
32
+ * generates CSS on-demand.
33
+ *
34
+ * @param compiledJs - The compiled widget JavaScript code
35
+ * @param importMap - Import map for dependencies
36
+ * @param options - HTML generation options
37
+ */
38
+ declare function generateHtml(compiledJs: string, importMap: ImportMapEntry, options?: HtmlOptions): string;
39
+ /**
40
+ * Get the default import map for this image
41
+ */
42
+ declare function getDefaultImportMap(cdn?: string): ImportMapEntry;
43
+ /**
44
+ * Get framework dependencies declared by this image
45
+ */
46
+ declare function getFrameworkDependencies(): Record<string, string>;
47
+
48
+ export { type HtmlOptions, type ImportMapEntry, generateHtml, getDefaultImportMap, getFrameworkDependencies, transformWidgetCode };
package/dist/html.js ADDED
@@ -0,0 +1,14 @@
1
+ import {
2
+ generateHtml,
3
+ getDefaultImportMap,
4
+ getFrameworkDependencies,
5
+ transformWidgetCode
6
+ } from "./chunk-4QNUSFQA.js";
7
+ import "./chunk-7LFKP2EW.js";
8
+ export {
9
+ generateHtml,
10
+ getDefaultImportMap,
11
+ getFrameworkDependencies,
12
+ transformWidgetCode
13
+ };
14
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,16 @@
1
+ export { DARK_CSS_VARIABLES, DEFAULT_CSS_VARIABLES, SetupOptions, cleanup, setup } from './setup.js';
2
+ export { HtmlOptions, ImportMapEntry, generateHtml, getDefaultImportMap, getFrameworkDependencies, transformWidgetCode } from './html.js';
3
+ import { ClassValue } from 'clsx';
4
+ export { clsx } from 'clsx';
5
+ export { twMerge } from 'tailwind-merge';
6
+ export { VariantProps, cva } from 'class-variance-authority';
7
+
8
+ /**
9
+ * @aprovan/patchwork-image-shadcn
10
+ *
11
+ * ShadCN/ui image for browser widgets with Tailwind CSS and Radix UI components.
12
+ */
13
+
14
+ declare function cn(...inputs: ClassValue[]): string;
15
+
16
+ export { cn };