@puzzle-ui/theme 0.0.0-stage → 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 (87) hide show
  1. package/dist/LICENSE +21 -0
  2. package/dist/breakpoints.cjs +10 -0
  3. package/dist/breakpoints.cjs.map +1 -0
  4. package/dist/breakpoints.d.cts +7 -0
  5. package/dist/breakpoints.d.ts +7 -0
  6. package/dist/breakpoints.js +10 -0
  7. package/dist/breakpoints.js.map +1 -0
  8. package/dist/components-context.cjs +19 -0
  9. package/dist/components-context.cjs.map +1 -0
  10. package/dist/components-context.d.cts +8 -0
  11. package/dist/components-context.d.ts +8 -0
  12. package/dist/components-context.js +17 -0
  13. package/dist/components-context.js.map +1 -0
  14. package/dist/components.types.d.cts +46 -0
  15. package/dist/components.types.d.ts +46 -0
  16. package/dist/constants.cjs +567 -0
  17. package/dist/constants.cjs.map +1 -0
  18. package/dist/constants.d.cts +363 -0
  19. package/dist/constants.d.ts +363 -0
  20. package/dist/constants.js +565 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/create-theme-css.cjs +7 -0
  23. package/dist/create-theme-css.cjs.map +1 -0
  24. package/dist/create-theme-css.js +7 -0
  25. package/dist/create-theme-css.js.map +1 -0
  26. package/dist/create-theme-variables.cjs +135 -0
  27. package/dist/create-theme-variables.cjs.map +1 -0
  28. package/dist/create-theme-variables.js +134 -0
  29. package/dist/create-theme-variables.js.map +1 -0
  30. package/dist/fonts/constants.cjs +9 -0
  31. package/dist/fonts/constants.cjs.map +1 -0
  32. package/dist/fonts/constants.js +9 -0
  33. package/dist/fonts/constants.js.map +1 -0
  34. package/dist/fonts/create-google-font-url.cjs +27 -0
  35. package/dist/fonts/create-google-font-url.cjs.map +1 -0
  36. package/dist/fonts/create-google-font-url.d.cts +2 -0
  37. package/dist/fonts/create-google-font-url.d.ts +2 -0
  38. package/dist/fonts/create-google-font-url.js +27 -0
  39. package/dist/fonts/create-google-font-url.js.map +1 -0
  40. package/dist/fonts/google-font-familiy.d.cts +1 -0
  41. package/dist/fonts/google-font-familiy.d.ts +1 -0
  42. package/dist/fonts/google-font.cjs +42 -0
  43. package/dist/fonts/google-font.cjs.map +1 -0
  44. package/dist/fonts/google-font.d.cts +4 -0
  45. package/dist/fonts/google-font.d.ts +4 -0
  46. package/dist/fonts/google-font.js +42 -0
  47. package/dist/fonts/google-font.js.map +1 -0
  48. package/dist/fonts/index.d.cts +4 -0
  49. package/dist/fonts/resolve-font-config.cjs +28 -0
  50. package/dist/fonts/resolve-font-config.cjs.map +1 -0
  51. package/dist/fonts/resolve-font-config.js +28 -0
  52. package/dist/fonts/resolve-font-config.js.map +1 -0
  53. package/dist/fonts/resolve-font-stylesheets.cjs +47 -0
  54. package/dist/fonts/resolve-font-stylesheets.cjs.map +1 -0
  55. package/dist/fonts/resolve-font-stylesheets.js +47 -0
  56. package/dist/fonts/resolve-font-stylesheets.js.map +1 -0
  57. package/dist/fonts/types.d.cts +28 -0
  58. package/dist/fonts/types.d.ts +28 -0
  59. package/dist/fonts/typography.cjs +172 -0
  60. package/dist/fonts/typography.cjs.map +1 -0
  61. package/dist/fonts/typography.d.cts +2 -0
  62. package/dist/fonts/typography.d.ts +2 -0
  63. package/dist/fonts/typography.js +170 -0
  64. package/dist/fonts/typography.js.map +1 -0
  65. package/dist/global.css +135 -0
  66. package/dist/index.cjs +9 -0
  67. package/dist/index.d.cts +10 -0
  68. package/dist/index.d.ts +9 -0
  69. package/dist/index.js +5 -0
  70. package/dist/scope-context.cjs +58 -0
  71. package/dist/scope-context.cjs.map +1 -0
  72. package/dist/scope-context.d.cts +14 -0
  73. package/dist/scope-context.d.ts +14 -0
  74. package/dist/scope-context.js +56 -0
  75. package/dist/scope-context.js.map +1 -0
  76. package/dist/theme-scopes.css +90 -0
  77. package/dist/theme.cjs +56 -0
  78. package/dist/theme.cjs.map +1 -0
  79. package/dist/theme.css +194 -0
  80. package/dist/theme.d.cts +18 -0
  81. package/dist/theme.d.ts +17 -0
  82. package/dist/theme.js +56 -0
  83. package/dist/theme.js.map +1 -0
  84. package/dist/types.d.cts +185 -0
  85. package/dist/types.d.ts +185 -0
  86. package/package.json +73 -4
  87. package/README.md +0 -3
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useEffect, useMemo, useRef, useState } from "react";
4
+ // src/scope-context.tsx
5
+ const ThemeScopeContext = createContext(null);
6
+ const ThemeScopeProvider = ({ scopeId, theme, children }) => {
7
+ const scopeElementRef = useRef(null);
8
+ const [portalState, setPortalState] = useState(null);
9
+ useEffect(() => {
10
+ if (scopeId === null) return;
11
+ const ownerDocument = scopeElementRef.current?.ownerDocument;
12
+ if (!ownerDocument?.body) return;
13
+ const portalTarget = ownerDocument.createElement("div");
14
+ portalTarget.className = "puzzle-theme-scope puzzle-theme-scope--portal";
15
+ portalTarget.dataset.puzzleThemeScope = scopeId;
16
+ portalTarget.dataset.theme = theme;
17
+ portalTarget.dataset.puzzleThemePortal = "true";
18
+ ownerDocument.body.append(portalTarget);
19
+ setPortalState({
20
+ scopeId,
21
+ theme,
22
+ element: portalTarget
23
+ });
24
+ return () => {
25
+ portalTarget.remove();
26
+ };
27
+ }, [scopeId, theme]);
28
+ const portalTarget = scopeId !== null && portalState?.scopeId === scopeId && portalState.theme === theme ? portalState.element : null;
29
+ const value = useMemo(() => {
30
+ return scopeId === null ? null : {
31
+ scopeId,
32
+ theme,
33
+ portalTarget
34
+ };
35
+ }, [
36
+ scopeId,
37
+ theme,
38
+ portalTarget
39
+ ]);
40
+ return /* @__PURE__ */ jsx(ThemeScopeContext.Provider, {
41
+ value,
42
+ children: scopeId === null ? children : /* @__PURE__ */ jsx("div", {
43
+ ref: scopeElementRef,
44
+ className: "puzzle-theme-scope",
45
+ "data-puzzle-theme-scope": scopeId,
46
+ "data-theme": theme,
47
+ children
48
+ })
49
+ });
50
+ };
51
+ const useThemeScope = () => {
52
+ return useContext(ThemeScopeContext);
53
+ };
54
+ export { ThemeScopeProvider, useThemeScope };
55
+
56
+ //# sourceMappingURL=scope-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-context.js","names":[],"sources":["../src/scope-context.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type PropsWithChildren,\n} from \"react\";\n\nimport type { ThemeMode } from \"./types\";\n\ntype ThemeScopeContextValue = {\n scopeId: string;\n theme: ThemeMode;\n portalTarget: HTMLDivElement | null;\n};\n\ntype ThemeScopePortalState = {\n scopeId: string;\n theme: ThemeMode;\n element: HTMLDivElement;\n};\n\ntype ThemeScopeProviderProps = PropsWithChildren<{\n scopeId: string | null;\n theme: ThemeMode;\n}>;\n\nconst ThemeScopeContext = createContext<ThemeScopeContextValue | null>(null);\n\nconst ThemeScopeProvider = ({\n scopeId,\n theme,\n children,\n}: ThemeScopeProviderProps) => {\n const scopeElementRef = useRef<HTMLDivElement>(null);\n const [portalState, setPortalState] = useState<ThemeScopePortalState | null>(\n null,\n );\n\n useEffect(() => {\n if (scopeId === null) {\n return;\n }\n\n const ownerDocument = scopeElementRef.current?.ownerDocument;\n\n if (!ownerDocument?.body) {\n return;\n }\n\n const portalTarget = ownerDocument.createElement(\"div\");\n\n portalTarget.className = \"puzzle-theme-scope puzzle-theme-scope--portal\";\n portalTarget.dataset.puzzleThemeScope = scopeId;\n portalTarget.dataset.theme = theme;\n portalTarget.dataset.puzzleThemePortal = \"true\";\n\n ownerDocument.body.append(portalTarget);\n\n setPortalState({\n scopeId,\n theme,\n element: portalTarget,\n });\n\n return () => {\n portalTarget.remove();\n };\n }, [scopeId, theme]);\n\n const portalTarget =\n scopeId !== null &&\n portalState?.scopeId === scopeId &&\n portalState.theme === theme\n ? portalState.element\n : null;\n\n const value = useMemo<ThemeScopeContextValue | null>(() => {\n return scopeId === null\n ? null\n : {\n scopeId,\n theme,\n portalTarget,\n };\n }, [scopeId, theme, portalTarget]);\n\n return (\n <ThemeScopeContext.Provider value={value}>\n {scopeId === null ? (\n children\n ) : (\n <div\n ref={scopeElementRef}\n className=\"puzzle-theme-scope\"\n data-puzzle-theme-scope={scopeId}\n data-theme={theme}\n >\n {children}\n </div>\n )}\n </ThemeScopeContext.Provider>\n );\n};\n\nconst useThemeScope = () => {\n return useContext(ThemeScopeContext);\n};\n\nexport { ThemeScopeProvider, useThemeScope, type ThemeScopeContextValue };\n"],"mappings":";;;;AA+BA,MAAM,oBAAoB,cAA6C,IAAI;AAE3E,MAAM,sBAAsB,EAC1B,SACA,OACA,eAC6B;CAC7B,MAAM,kBAAkB,OAAuB,IAAI;CACnD,MAAM,CAAC,aAAa,kBAAkB,SACpC,IACF;CAEA,gBAAgB;EACd,IAAI,YAAY,MACd;EAGF,MAAM,gBAAgB,gBAAgB,SAAS;EAE/C,IAAI,CAAC,eAAe,MAClB;EAGF,MAAM,eAAe,cAAc,cAAc,KAAK;EAEtD,aAAa,YAAY;EACzB,aAAa,QAAQ,mBAAmB;EACxC,aAAa,QAAQ,QAAQ;EAC7B,aAAa,QAAQ,oBAAoB;EAEzC,cAAc,KAAK,OAAO,YAAY;EAEtC,eAAe;GACb;GACA;GACA,SAAS;EACX,CAAC;EAED,aAAa;GACX,aAAa,OAAO;EACtB;CACF,GAAG,CAAC,SAAS,KAAK,CAAC;CAEnB,MAAM,eACJ,YAAY,QACZ,aAAa,YAAY,WACzB,YAAY,UAAU,QAClB,YAAY,UACZ;CAEN,MAAM,QAAQ,cAA6C;EACzD,OAAO,YAAY,OACf,OACA;GACE;GACA;GACA;EACF;CACN,GAAG;EAAC;EAAS;EAAO;CAAY,CAAC;CAEjC,OACE,oBAAC,kBAAkB,UAAnB;EAAmC;EAChC,UAAA,YAAY,OACX,WAEA,oBAAC,OAAD;GACE,KAAK;GACL,WAAU;GACV,2BAAyB;GACzB,cAAY;GAEX;EACE,CAAA;CAEmB,CAAA;AAEhC;AAEA,MAAM,sBAAsB;CAC1B,OAAO,WAAW,iBAAiB;AACrC"}
@@ -0,0 +1,90 @@
1
+ .puzzle-theme-scope {
2
+ color: var(--puzzle-color-text, inherit);
3
+ display: contents;
4
+ }
5
+
6
+ .puzzle-theme-scope[data-theme="light"], .puzzle-theme-scope[data-theme="system"] {
7
+ color-scheme: light;
8
+ --puzzle-color-background: var(--puzzle-color-scheme-light-background, #f7f4ea);
9
+ --puzzle-color-surface: var(--puzzle-color-scheme-light-surface, #fff);
10
+ --puzzle-color-surface-elevated: var(--puzzle-color-scheme-light-surface-elevated, #fff);
11
+ --puzzle-color-surface-sunken: var(--puzzle-color-scheme-light-surface-sunken, #f1eee6);
12
+ --puzzle-color-text: var(--puzzle-color-scheme-light-text, #171717);
13
+ --puzzle-color-text-muted: var(--puzzle-color-scheme-light-text-muted, #666);
14
+ --puzzle-color-text-subtle: var(--puzzle-color-scheme-light-text-subtle, #737373);
15
+ --puzzle-color-border: var(--puzzle-color-scheme-light-border, #e5e0d6);
16
+ --puzzle-color-border-strong: var(--puzzle-color-scheme-light-border-strong, #c9c2b6);
17
+ --puzzle-color-primary: var(--puzzle-color-scheme-light-primary, #2563eb);
18
+ --puzzle-color-primary-foreground: var(--puzzle-color-scheme-light-primary-foreground, #fff);
19
+ --puzzle-color-secondary: var(--puzzle-color-scheme-light-secondary, #64748b);
20
+ --puzzle-color-secondary-foreground: var(--puzzle-color-scheme-light-secondary-foreground, #fff);
21
+ --puzzle-color-accent: var(--puzzle-color-scheme-light-accent, #7c3aed);
22
+ --puzzle-color-accent-foreground: var(--puzzle-color-scheme-light-accent-foreground, #fff);
23
+ --puzzle-color-ring: var(--puzzle-color-scheme-light-ring, #2563eb);
24
+ --puzzle-color-success: var(--puzzle-color-scheme-light-success, #15803d);
25
+ --puzzle-color-success-foreground: var(--puzzle-color-scheme-light-success-foreground, #fff);
26
+ --puzzle-color-warning: var(--puzzle-color-scheme-light-warning, #a16207);
27
+ --puzzle-color-warning-foreground: var(--puzzle-color-scheme-light-warning-foreground, #fff);
28
+ --puzzle-color-danger: var(--puzzle-color-scheme-light-danger, #b91c1c);
29
+ --puzzle-color-danger-foreground: var(--puzzle-color-scheme-light-danger-foreground, #fff);
30
+ --puzzle-color-info: var(--puzzle-color-scheme-light-info, #0369a1);
31
+ --puzzle-color-info-foreground: var(--puzzle-color-scheme-light-info-foreground, #fff);
32
+ }
33
+
34
+ .puzzle-theme-scope[data-theme="dark"] {
35
+ color-scheme: dark;
36
+ --puzzle-color-background: var(--puzzle-color-scheme-dark-background, #111518);
37
+ --puzzle-color-surface: var(--puzzle-color-scheme-dark-surface, #1c2226);
38
+ --puzzle-color-surface-elevated: var(--puzzle-color-scheme-dark-surface-elevated, #242c31);
39
+ --puzzle-color-surface-sunken: var(--puzzle-color-scheme-dark-surface-sunken, #0d1113);
40
+ --puzzle-color-text: var(--puzzle-color-scheme-dark-text, #f5f5f5);
41
+ --puzzle-color-text-muted: var(--puzzle-color-scheme-dark-text-muted, #a4adb3);
42
+ --puzzle-color-text-subtle: var(--puzzle-color-scheme-dark-text-subtle, #8c969d);
43
+ --puzzle-color-border: var(--puzzle-color-scheme-dark-border, #343c42);
44
+ --puzzle-color-border-strong: var(--puzzle-color-scheme-dark-border-strong, #4a555d);
45
+ --puzzle-color-primary: var(--puzzle-color-scheme-dark-primary, #60a5fa);
46
+ --puzzle-color-primary-foreground: var(--puzzle-color-scheme-dark-primary-foreground, #0b1220);
47
+ --puzzle-color-secondary: var(--puzzle-color-scheme-dark-secondary, #94a3b8);
48
+ --puzzle-color-secondary-foreground: var(--puzzle-color-scheme-dark-secondary-foreground, #0f172a);
49
+ --puzzle-color-accent: var(--puzzle-color-scheme-dark-accent, #c4b5fd);
50
+ --puzzle-color-accent-foreground: var(--puzzle-color-scheme-dark-accent-foreground, #1e1b4b);
51
+ --puzzle-color-ring: var(--puzzle-color-scheme-dark-ring, #93c5fd);
52
+ --puzzle-color-success: var(--puzzle-color-scheme-dark-success, #4ade80);
53
+ --puzzle-color-success-foreground: var(--puzzle-color-scheme-dark-success-foreground, #052e16);
54
+ --puzzle-color-warning: var(--puzzle-color-scheme-dark-warning, #fbbf24);
55
+ --puzzle-color-warning-foreground: var(--puzzle-color-scheme-dark-warning-foreground, #422006);
56
+ --puzzle-color-danger: var(--puzzle-color-scheme-dark-danger, #f87171);
57
+ --puzzle-color-danger-foreground: var(--puzzle-color-scheme-dark-danger-foreground, #450a0a);
58
+ --puzzle-color-info: var(--puzzle-color-scheme-dark-info, #38bdf8);
59
+ --puzzle-color-info-foreground: var(--puzzle-color-scheme-dark-info-foreground, #082f49);
60
+ }
61
+
62
+ @media (prefers-color-scheme: dark) {
63
+ .puzzle-theme-scope[data-theme="system"] {
64
+ color-scheme: dark;
65
+ --puzzle-color-background: var(--puzzle-color-scheme-dark-background, #111518);
66
+ --puzzle-color-surface: var(--puzzle-color-scheme-dark-surface, #1c2226);
67
+ --puzzle-color-surface-elevated: var(--puzzle-color-scheme-dark-surface-elevated, #242c31);
68
+ --puzzle-color-surface-sunken: var(--puzzle-color-scheme-dark-surface-sunken, #0d1113);
69
+ --puzzle-color-text: var(--puzzle-color-scheme-dark-text, #f5f5f5);
70
+ --puzzle-color-text-muted: var(--puzzle-color-scheme-dark-text-muted, #a4adb3);
71
+ --puzzle-color-text-subtle: var(--puzzle-color-scheme-dark-text-subtle, #8c969d);
72
+ --puzzle-color-border: var(--puzzle-color-scheme-dark-border, #343c42);
73
+ --puzzle-color-border-strong: var(--puzzle-color-scheme-dark-border-strong, #4a555d);
74
+ --puzzle-color-primary: var(--puzzle-color-scheme-dark-primary, #60a5fa);
75
+ --puzzle-color-primary-foreground: var(--puzzle-color-scheme-dark-primary-foreground, #0b1220);
76
+ --puzzle-color-secondary: var(--puzzle-color-scheme-dark-secondary, #94a3b8);
77
+ --puzzle-color-secondary-foreground: var(--puzzle-color-scheme-dark-secondary-foreground, #0f172a);
78
+ --puzzle-color-accent: var(--puzzle-color-scheme-dark-accent, #c4b5fd);
79
+ --puzzle-color-accent-foreground: var(--puzzle-color-scheme-dark-accent-foreground, #1e1b4b);
80
+ --puzzle-color-ring: var(--puzzle-color-scheme-dark-ring, #93c5fd);
81
+ --puzzle-color-success: var(--puzzle-color-scheme-dark-success, #4ade80);
82
+ --puzzle-color-success-foreground: var(--puzzle-color-scheme-dark-success-foreground, #052e16);
83
+ --puzzle-color-warning: var(--puzzle-color-scheme-dark-warning, #fbbf24);
84
+ --puzzle-color-warning-foreground: var(--puzzle-color-scheme-dark-warning-foreground, #422006);
85
+ --puzzle-color-danger: var(--puzzle-color-scheme-dark-danger, #f87171);
86
+ --puzzle-color-danger-foreground: var(--puzzle-color-scheme-dark-danger-foreground, #450a0a);
87
+ --puzzle-color-info: var(--puzzle-color-scheme-dark-info, #38bdf8);
88
+ --puzzle-color-info-foreground: var(--puzzle-color-scheme-dark-info-foreground, #082f49);
89
+ }
90
+ }
package/dist/theme.cjs ADDED
@@ -0,0 +1,56 @@
1
+ const require_components_context = require("./components-context.cjs");
2
+ const require_scope_context = require("./scope-context.cjs");
3
+ const require_resolve_font_stylesheets = require("./fonts/resolve-font-stylesheets.cjs");
4
+ const require_create_theme_variables = require("./create-theme-variables.cjs");
5
+ const require_create_theme_css = require("./create-theme-css.cjs");
6
+ ;/* empty css */
7
+ ;/* empty css */
8
+ ;/* empty css */
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
+ let react = require("react");
11
+ // src/theme.tsx
12
+ const Theme = ({ nonce, fonts, theme = "system", scope = "root", globalStyles, tokens, colorTheme, components, children }) => {
13
+ const scopeId = (0, react.useId)();
14
+ const fontStylesheets = require_resolve_font_stylesheets.resolveFontStylesheets(fonts);
15
+ const cssVariables = require_create_theme_variables.createThemeVariables(fonts, tokens, theme, colorTheme);
16
+ const css = `${scope === "root" ? ":root" : `[data-puzzle-theme-scope="${scopeId}"]`} {\n${require_create_theme_css.createThemeCss(cssVariables)}\n}`;
17
+ const shouldApplyGlobalStyles = scope === "root" && (globalStyles ?? true);
18
+ const scopedContent = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_scope_context.ThemeScopeProvider, {
19
+ scopeId: scope === "local" ? scopeId : null,
20
+ theme,
21
+ children: components === void 0 ? children : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_components_context.ThemeComponentsProvider, {
22
+ components,
23
+ children
24
+ })
25
+ });
26
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
27
+ fontStylesheets.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("link", {
28
+ rel: "preconnect",
29
+ href: "https://fonts.googleapis.com"
30
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("link", {
31
+ rel: "preconnect",
32
+ href: "https://fonts.gstatic.com",
33
+ crossOrigin: "anonymous"
34
+ })] }) : null,
35
+ fontStylesheets.map(({ href }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("link", {
36
+ rel: "stylesheet",
37
+ href,
38
+ precedence: "default"
39
+ }, href)),
40
+ shouldApplyGlobalStyles ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", {
41
+ nonce,
42
+ "data-puzzle-global-styles": ""
43
+ }) : null,
44
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", {
45
+ nonce,
46
+ "data-theme": theme,
47
+ "data-puzzle-theme": scope === "root" ? "true" : void 0,
48
+ "data-puzzle-theme-scope-style": scope === "local" ? scopeId : void 0,
49
+ children: css
50
+ }),
51
+ scopedContent
52
+ ] });
53
+ };
54
+ exports.Theme = Theme;
55
+
56
+ //# sourceMappingURL=theme.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.cjs","names":["useId","resolveFontStylesheets","createThemeVariables","createThemeCss","ThemeScopeProvider","ThemeComponentsProvider"],"sources":["../src/theme.tsx"],"sourcesContent":["import { useId, type PropsWithChildren } from \"react\";\n\nimport type { FontRole, FontConfig } from \"./fonts\";\nimport type { ColorThemes, ThemeMode, ThemeTokenOverrides } from \"./types\";\nimport type { ThemeComponents } from \"./components.types\";\n\nimport { ThemeComponentsProvider } from \"./components-context\";\nimport { ThemeScopeProvider } from \"./scope-context\";\n\nimport { resolveFontStylesheets } from \"./fonts/resolve-font-stylesheets\";\nimport { createThemeVariables } from \"./create-theme-variables\";\nimport { createThemeCss } from \"./create-theme-css\";\n\nimport \"./theme.css\";\nimport \"./theme-scopes.css\";\nimport \"./global.css\";\n\nexport type ThemeScope = \"root\" | \"local\";\n\nexport type ThemeProps = {\n nonce?: string;\n theme?: ThemeMode;\n scope?: ThemeScope;\n globalStyles?: boolean;\n fonts?: Partial<Record<FontRole, FontConfig>>;\n tokens?: ThemeTokenOverrides;\n colorTheme?: ColorThemes;\n components?: ThemeComponents;\n};\n\nconst Theme = ({\n nonce,\n fonts,\n theme = \"system\",\n scope = \"root\",\n globalStyles,\n tokens,\n colorTheme,\n components,\n children,\n}: PropsWithChildren<ThemeProps>) => {\n const scopeId = useId();\n\n const fontStylesheets = resolveFontStylesheets(fonts);\n const cssVariables = createThemeVariables(fonts, tokens, theme, colorTheme);\n\n const cssSelector =\n scope === \"root\" ? \":root\" : `[data-puzzle-theme-scope=\"${scopeId}\"]`;\n\n const css = `${cssSelector} {\\n${createThemeCss(cssVariables)}\\n}`;\n\n const shouldApplyGlobalStyles = scope === \"root\" && (globalStyles ?? true);\n\n const content =\n components === undefined ? (\n children\n ) : (\n <ThemeComponentsProvider components={components}>\n {children}\n </ThemeComponentsProvider>\n );\n\n const scopedContent = (\n <ThemeScopeProvider\n scopeId={scope === \"local\" ? scopeId : null}\n theme={theme}\n >\n {content}\n </ThemeScopeProvider>\n );\n\n return (\n <>\n {fontStylesheets.length > 0 ? (\n <>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link\n rel=\"preconnect\"\n href=\"https://fonts.gstatic.com\"\n crossOrigin=\"anonymous\"\n />\n </>\n ) : null}\n\n {fontStylesheets.map(({ href }) => (\n <link key={href} rel=\"stylesheet\" href={href} precedence=\"default\" />\n ))}\n\n {shouldApplyGlobalStyles ? (\n <style nonce={nonce} data-puzzle-global-styles=\"\" />\n ) : null}\n\n <style\n nonce={nonce}\n data-theme={theme}\n data-puzzle-theme={scope === \"root\" ? \"true\" : undefined}\n data-puzzle-theme-scope-style={scope === \"local\" ? scopeId : undefined}\n >\n {css}\n </style>\n\n {scopedContent}\n </>\n );\n};\n\nexport { Theme };\n"],"mappings":";;;;;;;;;;;AA8BA,MAAM,SAAS,EACb,OACA,OACA,QAAQ,UACR,QAAQ,QACR,cACA,QACA,YACA,YACA,eACmC;CACnC,MAAM,WAAA,GAAUA,MAAAA,MAAAA,CAAM;CAEtB,MAAM,kBAAkBC,iCAAAA,uBAAuB,KAAK;CACpD,MAAM,eAAeC,+BAAAA,qBAAqB,OAAO,QAAQ,OAAO,UAAU;CAK1E,MAAM,MAAM,GAFV,UAAU,SAAS,UAAU,6BAA6B,QAAQ,IAEzC,MAAMC,yBAAAA,eAAe,YAAY,EAAE;CAE9D,MAAM,0BAA0B,UAAU,WAAW,gBAAgB;CAWrE,MAAM,gBACJ,iBAAA,GAAA,kBAAA,IAAA,CAACC,sBAAAA,oBAAD;EACE,SAAS,UAAU,UAAU,UAAU;EAChC;EAXT,UAAA,eAAe,KAAA,IACb,WAEA,iBAAA,GAAA,kBAAA,IAAA,CAACC,2BAAAA,yBAAD;GAAqC;GAClC;EACsB,CAAA;CASP,CAAA;CAGtB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;EACG,gBAAgB,SAAS,IACxB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,KAAI;GAAa,MAAK;EAAgC,CAAA,GAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GACE,KAAI;GACJ,MAAK;GACL,aAAY;EACb,CAAA,CACD,EAAA,CAAA,IACA;EAEH,gBAAgB,KAAK,EAAE,WACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAiB,KAAI;GAAmB;GAAM,YAAW;EAAW,GAAzD,IAAyD,CACrE;EAEA,0BACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;GAAc;GAAO,6BAA0B;EAAI,CAAA,IACjD;EAEJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;GACS;GACP,cAAY;GACZ,qBAAmB,UAAU,SAAS,SAAS,KAAA;GAC/C,iCAA+B,UAAU,UAAU,UAAU,KAAA;GAE5D,UAAA;EACI,CAAA;EAEN;CACD,EAAA,CAAA;AAEN"}
package/dist/theme.css ADDED
@@ -0,0 +1,194 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --puzzle-container-gutter: clamp(1rem, 3vw, 3rem);
4
+ --puzzle-color-background: var(--puzzle-color-scheme-light-background, #f7f4ea);
5
+ --puzzle-color-surface: var(--puzzle-color-scheme-light-surface, #fff);
6
+ --puzzle-color-surface-elevated: var(--puzzle-color-scheme-light-surface-elevated, #fff);
7
+ --puzzle-color-surface-sunken: var(--puzzle-color-scheme-light-surface-sunken, #f1eee6);
8
+ --puzzle-color-text: var(--puzzle-color-scheme-light-text, #171717);
9
+ --puzzle-color-text-muted: var(--puzzle-color-scheme-light-text-muted, #666);
10
+ --puzzle-color-text-subtle: var(--puzzle-color-scheme-light-text-subtle, #737373);
11
+ --puzzle-color-border: var(--puzzle-color-scheme-light-border, #e5e0d6);
12
+ --puzzle-color-border-strong: var(--puzzle-color-scheme-light-border-strong, #c9c2b6);
13
+ --puzzle-color-primary: var(--puzzle-color-scheme-light-primary, #2563eb);
14
+ --puzzle-color-primary-foreground: var(--puzzle-color-scheme-light-primary-foreground, #fff);
15
+ --puzzle-color-secondary: var(--puzzle-color-scheme-light-secondary, #64748b);
16
+ --puzzle-color-secondary-foreground: var(--puzzle-color-scheme-light-secondary-foreground, #fff);
17
+ --puzzle-color-accent: var(--puzzle-color-scheme-light-accent, #7c3aed);
18
+ --puzzle-color-accent-foreground: var(--puzzle-color-scheme-light-accent-foreground, #fff);
19
+ --puzzle-color-ring: var(--puzzle-color-scheme-light-ring, #2563eb);
20
+ --puzzle-color-success: var(--puzzle-color-scheme-light-success, #15803d);
21
+ --puzzle-color-success-foreground: var(--puzzle-color-scheme-light-success-foreground, #fff);
22
+ --puzzle-color-warning: var(--puzzle-color-scheme-light-warning, #a16207);
23
+ --puzzle-color-warning-foreground: var(--puzzle-color-scheme-light-warning-foreground, #fff);
24
+ --puzzle-color-danger: var(--puzzle-color-scheme-light-danger, #b91c1c);
25
+ --puzzle-color-danger-foreground: var(--puzzle-color-scheme-light-danger-foreground, #fff);
26
+ --puzzle-color-info: var(--puzzle-color-scheme-light-info, #0369a1);
27
+ --puzzle-color-info-foreground: var(--puzzle-color-scheme-light-info-foreground, #fff);
28
+ }
29
+
30
+ :root:has(style[data-puzzle-theme="true"][data-theme="dark"]) {
31
+ color-scheme: dark;
32
+ --puzzle-color-background: var(--puzzle-color-scheme-dark-background, #111518);
33
+ --puzzle-color-surface: var(--puzzle-color-scheme-dark-surface, #1c2226);
34
+ --puzzle-color-surface-elevated: var(--puzzle-color-scheme-dark-surface-elevated, #242c31);
35
+ --puzzle-color-surface-sunken: var(--puzzle-color-scheme-dark-surface-sunken, #0d1113);
36
+ --puzzle-color-text: var(--puzzle-color-scheme-dark-text, #f5f5f5);
37
+ --puzzle-color-text-muted: var(--puzzle-color-scheme-dark-text-muted, #a4adb3);
38
+ --puzzle-color-text-subtle: var(--puzzle-color-scheme-dark-text-subtle, #8c969d);
39
+ --puzzle-color-border: var(--puzzle-color-scheme-dark-border, #343c42);
40
+ --puzzle-color-border-strong: var(--puzzle-color-scheme-dark-border-strong, #4a555d);
41
+ --puzzle-color-primary: var(--puzzle-color-scheme-dark-primary, #60a5fa);
42
+ --puzzle-color-primary-foreground: var(--puzzle-color-scheme-dark-primary-foreground, #0b1220);
43
+ --puzzle-color-secondary: var(--puzzle-color-scheme-dark-secondary, #94a3b8);
44
+ --puzzle-color-secondary-foreground: var(--puzzle-color-scheme-dark-secondary-foreground, #0f172a);
45
+ --puzzle-color-accent: var(--puzzle-color-scheme-dark-accent, #c4b5fd);
46
+ --puzzle-color-accent-foreground: var(--puzzle-color-scheme-dark-accent-foreground, #1e1b4b);
47
+ --puzzle-color-ring: var(--puzzle-color-scheme-dark-ring, #93c5fd);
48
+ --puzzle-color-success: var(--puzzle-color-scheme-dark-success, #4ade80);
49
+ --puzzle-color-success-foreground: var(--puzzle-color-scheme-dark-success-foreground, #052e16);
50
+ --puzzle-color-warning: var(--puzzle-color-scheme-dark-warning, #fbbf24);
51
+ --puzzle-color-warning-foreground: var(--puzzle-color-scheme-dark-warning-foreground, #422006);
52
+ --puzzle-color-danger: var(--puzzle-color-scheme-dark-danger, #f87171);
53
+ --puzzle-color-danger-foreground: var(--puzzle-color-scheme-dark-danger-foreground, #450a0a);
54
+ --puzzle-color-info: var(--puzzle-color-scheme-dark-info, #38bdf8);
55
+ --puzzle-color-info-foreground: var(--puzzle-color-scheme-dark-info-foreground, #082f49);
56
+ }
57
+
58
+ @media (prefers-color-scheme: dark) {
59
+ :root:not(:has(style[data-puzzle-theme="true"][data-theme="light"], style[data-puzzle-theme="true"][data-theme="dark"])) {
60
+ color-scheme: dark;
61
+ --puzzle-color-background: var(--puzzle-color-scheme-dark-background, #111518);
62
+ --puzzle-color-surface: var(--puzzle-color-scheme-dark-surface, #1c2226);
63
+ --puzzle-color-surface-elevated: var(--puzzle-color-scheme-dark-surface-elevated, #242c31);
64
+ --puzzle-color-surface-sunken: var(--puzzle-color-scheme-dark-surface-sunken, #0d1113);
65
+ --puzzle-color-text: var(--puzzle-color-scheme-dark-text, #f5f5f5);
66
+ --puzzle-color-text-muted: var(--puzzle-color-scheme-dark-text-muted, #a4adb3);
67
+ --puzzle-color-text-subtle: var(--puzzle-color-scheme-dark-text-subtle, #8c969d);
68
+ --puzzle-color-border: var(--puzzle-color-scheme-dark-border, #343c42);
69
+ --puzzle-color-border-strong: var(--puzzle-color-scheme-dark-border-strong, #4a555d);
70
+ --puzzle-color-primary: var(--puzzle-color-scheme-dark-primary, #60a5fa);
71
+ --puzzle-color-primary-foreground: var(--puzzle-color-scheme-dark-primary-foreground, #0b1220);
72
+ --puzzle-color-secondary: var(--puzzle-color-scheme-dark-secondary, #94a3b8);
73
+ --puzzle-color-secondary-foreground: var(--puzzle-color-scheme-dark-secondary-foreground, #0f172a);
74
+ --puzzle-color-accent: var(--puzzle-color-scheme-dark-accent, #c4b5fd);
75
+ --puzzle-color-accent-foreground: var(--puzzle-color-scheme-dark-accent-foreground, #1e1b4b);
76
+ --puzzle-color-ring: var(--puzzle-color-scheme-dark-ring, #93c5fd);
77
+ --puzzle-color-success: var(--puzzle-color-scheme-dark-success, #4ade80);
78
+ --puzzle-color-success-foreground: var(--puzzle-color-scheme-dark-success-foreground, #052e16);
79
+ --puzzle-color-warning: var(--puzzle-color-scheme-dark-warning, #fbbf24);
80
+ --puzzle-color-warning-foreground: var(--puzzle-color-scheme-dark-warning-foreground, #422006);
81
+ --puzzle-color-danger: var(--puzzle-color-scheme-dark-danger, #f87171);
82
+ --puzzle-color-danger-foreground: var(--puzzle-color-scheme-dark-danger-foreground, #450a0a);
83
+ --puzzle-color-info: var(--puzzle-color-scheme-dark-info, #38bdf8);
84
+ --puzzle-color-info-foreground: var(--puzzle-color-scheme-dark-info-foreground, #082f49);
85
+ }
86
+ }
87
+
88
+ .puzzle-typography-display1, .puzzle-typography-display2, .puzzle-typography-headline1, .puzzle-typography-headline2, .puzzle-typography-headline3, .puzzle-typography-headline4, .puzzle-typography-subtitle1, .puzzle-typography-subtitle2, .puzzle-typography-body1, .puzzle-typography-body2, .puzzle-typography-button, .puzzle-typography-caption, .puzzle-typography-overline {
89
+ font-family: var(--puzzle-font-family-body, inherit);
90
+ }
91
+
92
+ .puzzle-typography-display1 {
93
+ font-family: var(--puzzle-font-family-display1, inherit);
94
+ font-size: var(--puzzle-font-size-display1, inherit);
95
+ font-weight: var(--puzzle-font-weight-display1, inherit);
96
+ line-height: var(--puzzle-font-line-height-display1, inherit);
97
+ letter-spacing: var(--puzzle-font-letter-spacing-display1, inherit);
98
+ }
99
+
100
+ .puzzle-typography-display2 {
101
+ font-family: var(--puzzle-font-family-display2, inherit);
102
+ font-size: var(--puzzle-font-size-display2, inherit);
103
+ font-weight: var(--puzzle-font-weight-display2, inherit);
104
+ line-height: var(--puzzle-font-line-height-display2, inherit);
105
+ letter-spacing: var(--puzzle-font-letter-spacing-display2, inherit);
106
+ }
107
+
108
+ .puzzle-typography-headline1 {
109
+ font-family: var(--puzzle-font-family-headline1, inherit);
110
+ font-size: var(--puzzle-font-size-headline1, inherit);
111
+ font-weight: var(--puzzle-font-weight-headline1, inherit);
112
+ line-height: var(--puzzle-font-line-height-headline1, inherit);
113
+ letter-spacing: var(--puzzle-font-letter-spacing-headline1, inherit);
114
+ }
115
+
116
+ .puzzle-typography-headline2 {
117
+ font-family: var(--puzzle-font-family-headline2, inherit);
118
+ font-size: var(--puzzle-font-size-headline2, inherit);
119
+ font-weight: var(--puzzle-font-weight-headline2, inherit);
120
+ line-height: var(--puzzle-font-line-height-headline2, inherit);
121
+ letter-spacing: var(--puzzle-font-letter-spacing-headline2, inherit);
122
+ }
123
+
124
+ .puzzle-typography-headline3 {
125
+ font-family: var(--puzzle-font-family-headline3, inherit);
126
+ font-size: var(--puzzle-font-size-headline3, inherit);
127
+ font-weight: var(--puzzle-font-weight-headline3, inherit);
128
+ line-height: var(--puzzle-font-line-height-headline3, inherit);
129
+ letter-spacing: var(--puzzle-font-letter-spacing-headline3, inherit);
130
+ }
131
+
132
+ .puzzle-typography-headline4 {
133
+ font-family: var(--puzzle-font-family-headline4, inherit);
134
+ font-size: var(--puzzle-font-size-headline4, inherit);
135
+ font-weight: var(--puzzle-font-weight-headline4, inherit);
136
+ line-height: var(--puzzle-font-line-height-headline4, inherit);
137
+ letter-spacing: var(--puzzle-font-letter-spacing-headline4, inherit);
138
+ }
139
+
140
+ .puzzle-typography-subtitle1 {
141
+ font-family: var(--puzzle-font-family-subtitle1, inherit);
142
+ font-size: var(--puzzle-font-size-subtitle1, inherit);
143
+ font-weight: var(--puzzle-font-weight-subtitle1, inherit);
144
+ line-height: var(--puzzle-font-line-height-subtitle1, inherit);
145
+ letter-spacing: var(--puzzle-font-letter-spacing-subtitle1, inherit);
146
+ }
147
+
148
+ .puzzle-typography-subtitle2 {
149
+ font-family: var(--puzzle-font-family-subtitle2, inherit);
150
+ font-size: var(--puzzle-font-size-subtitle2, inherit);
151
+ font-weight: var(--puzzle-font-weight-subtitle2, inherit);
152
+ line-height: var(--puzzle-font-line-height-subtitle2, inherit);
153
+ letter-spacing: var(--puzzle-font-letter-spacing-subtitle2, inherit);
154
+ }
155
+
156
+ .puzzle-typography-body1 {
157
+ font-family: var(--puzzle-font-family-body1, inherit);
158
+ font-size: var(--puzzle-font-size-body1, inherit);
159
+ font-weight: var(--puzzle-font-weight-body1, inherit);
160
+ line-height: var(--puzzle-font-line-height-body1, inherit);
161
+ letter-spacing: var(--puzzle-font-letter-spacing-body1, inherit);
162
+ }
163
+
164
+ .puzzle-typography-body2 {
165
+ font-family: var(--puzzle-font-family-body2, inherit);
166
+ font-size: var(--puzzle-font-size-body2, inherit);
167
+ font-weight: var(--puzzle-font-weight-body2, inherit);
168
+ line-height: var(--puzzle-font-line-height-body2, inherit);
169
+ letter-spacing: var(--puzzle-font-letter-spacing-body2, inherit);
170
+ }
171
+
172
+ .puzzle-typography-button {
173
+ font-family: var(--puzzle-font-family-button, inherit);
174
+ font-size: var(--puzzle-font-size-button, inherit);
175
+ font-weight: var(--puzzle-font-weight-button, inherit);
176
+ line-height: var(--puzzle-font-line-height-button, inherit);
177
+ letter-spacing: var(--puzzle-font-letter-spacing-button, inherit);
178
+ }
179
+
180
+ .puzzle-typography-caption {
181
+ font-family: var(--puzzle-font-family-caption, inherit);
182
+ font-size: var(--puzzle-font-size-caption, inherit);
183
+ font-weight: var(--puzzle-font-weight-caption, inherit);
184
+ line-height: var(--puzzle-font-line-height-caption, inherit);
185
+ letter-spacing: var(--puzzle-font-letter-spacing-caption, inherit);
186
+ }
187
+
188
+ .puzzle-typography-overline {
189
+ font-family: var(--puzzle-font-family-overline, inherit);
190
+ font-size: var(--puzzle-font-size-overline, inherit);
191
+ font-weight: var(--puzzle-font-weight-overline, inherit);
192
+ line-height: var(--puzzle-font-line-height-overline, inherit);
193
+ letter-spacing: var(--puzzle-font-letter-spacing-overline, inherit);
194
+ }
@@ -0,0 +1,18 @@
1
+ import { FontConfig, FontRole } from "./fonts/types.cjs";
2
+ import "./fonts/index.cjs";
3
+ import { ColorThemes, ThemeMode, ThemeTokenOverrides } from "./types.cjs";
4
+ import { ThemeComponents } from "./components.types.cjs";
5
+ import { PropsWithChildren } from "react";
6
+ export type ThemeScope = "root" | "local";
7
+ export type ThemeProps = {
8
+ nonce?: string;
9
+ theme?: ThemeMode;
10
+ scope?: ThemeScope;
11
+ globalStyles?: boolean;
12
+ fonts?: Partial<Record<FontRole, FontConfig>>;
13
+ tokens?: ThemeTokenOverrides;
14
+ colorTheme?: ColorThemes;
15
+ components?: ThemeComponents;
16
+ };
17
+ declare const Theme: ({ nonce, fonts, theme, scope, globalStyles, tokens, colorTheme, components, children }: PropsWithChildren<ThemeProps>) => import("react").JSX.Element;
18
+ export { Theme };
@@ -0,0 +1,17 @@
1
+ import { FontConfig, FontRole } from "./fonts/types.js";
2
+ import { ColorThemes, ThemeMode, ThemeTokenOverrides } from "./types.js";
3
+ import { ThemeComponents } from "./components.types.js";
4
+ import { PropsWithChildren } from "react";
5
+ export type ThemeScope = "root" | "local";
6
+ export type ThemeProps = {
7
+ nonce?: string;
8
+ theme?: ThemeMode;
9
+ scope?: ThemeScope;
10
+ globalStyles?: boolean;
11
+ fonts?: Partial<Record<FontRole, FontConfig>>;
12
+ tokens?: ThemeTokenOverrides;
13
+ colorTheme?: ColorThemes;
14
+ components?: ThemeComponents;
15
+ };
16
+ declare const Theme: ({ nonce, fonts, theme, scope, globalStyles, tokens, colorTheme, components, children }: PropsWithChildren<ThemeProps>) => import("react").JSX.Element;
17
+ export { Theme };
package/dist/theme.js ADDED
@@ -0,0 +1,56 @@
1
+ import { ThemeComponentsProvider } from "./components-context.js";
2
+ import { ThemeScopeProvider } from "./scope-context.js";
3
+ import { resolveFontStylesheets } from "./fonts/resolve-font-stylesheets.js";
4
+ import { createThemeVariables } from "./create-theme-variables.js";
5
+ import { createThemeCss } from "./create-theme-css.js";
6
+ import "./theme.css";
7
+ import "./theme-scopes.css";
8
+ import "./global.css";
9
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
+ import { useId } from "react";
11
+ // src/theme.tsx
12
+ const Theme = ({ nonce, fonts, theme = "system", scope = "root", globalStyles, tokens, colorTheme, components, children }) => {
13
+ const scopeId = useId();
14
+ const fontStylesheets = resolveFontStylesheets(fonts);
15
+ const cssVariables = createThemeVariables(fonts, tokens, theme, colorTheme);
16
+ const css = `${scope === "root" ? ":root" : `[data-puzzle-theme-scope="${scopeId}"]`} {\n${createThemeCss(cssVariables)}\n}`;
17
+ const shouldApplyGlobalStyles = scope === "root" && (globalStyles ?? true);
18
+ const scopedContent = /* @__PURE__ */ jsx(ThemeScopeProvider, {
19
+ scopeId: scope === "local" ? scopeId : null,
20
+ theme,
21
+ children: components === void 0 ? children : /* @__PURE__ */ jsx(ThemeComponentsProvider, {
22
+ components,
23
+ children
24
+ })
25
+ });
26
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ fontStylesheets.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("link", {
28
+ rel: "preconnect",
29
+ href: "https://fonts.googleapis.com"
30
+ }), /* @__PURE__ */ jsx("link", {
31
+ rel: "preconnect",
32
+ href: "https://fonts.gstatic.com",
33
+ crossOrigin: "anonymous"
34
+ })] }) : null,
35
+ fontStylesheets.map(({ href }) => /* @__PURE__ */ jsx("link", {
36
+ rel: "stylesheet",
37
+ href,
38
+ precedence: "default"
39
+ }, href)),
40
+ shouldApplyGlobalStyles ? /* @__PURE__ */ jsx("style", {
41
+ nonce,
42
+ "data-puzzle-global-styles": ""
43
+ }) : null,
44
+ /* @__PURE__ */ jsx("style", {
45
+ nonce,
46
+ "data-theme": theme,
47
+ "data-puzzle-theme": scope === "root" ? "true" : void 0,
48
+ "data-puzzle-theme-scope-style": scope === "local" ? scopeId : void 0,
49
+ children: css
50
+ }),
51
+ scopedContent
52
+ ] });
53
+ };
54
+ export { Theme };
55
+
56
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","names":[],"sources":["../src/theme.tsx"],"sourcesContent":["import { useId, type PropsWithChildren } from \"react\";\n\nimport type { FontRole, FontConfig } from \"./fonts\";\nimport type { ColorThemes, ThemeMode, ThemeTokenOverrides } from \"./types\";\nimport type { ThemeComponents } from \"./components.types\";\n\nimport { ThemeComponentsProvider } from \"./components-context\";\nimport { ThemeScopeProvider } from \"./scope-context\";\n\nimport { resolveFontStylesheets } from \"./fonts/resolve-font-stylesheets\";\nimport { createThemeVariables } from \"./create-theme-variables\";\nimport { createThemeCss } from \"./create-theme-css\";\n\nimport \"./theme.css\";\nimport \"./theme-scopes.css\";\nimport \"./global.css\";\n\nexport type ThemeScope = \"root\" | \"local\";\n\nexport type ThemeProps = {\n nonce?: string;\n theme?: ThemeMode;\n scope?: ThemeScope;\n globalStyles?: boolean;\n fonts?: Partial<Record<FontRole, FontConfig>>;\n tokens?: ThemeTokenOverrides;\n colorTheme?: ColorThemes;\n components?: ThemeComponents;\n};\n\nconst Theme = ({\n nonce,\n fonts,\n theme = \"system\",\n scope = \"root\",\n globalStyles,\n tokens,\n colorTheme,\n components,\n children,\n}: PropsWithChildren<ThemeProps>) => {\n const scopeId = useId();\n\n const fontStylesheets = resolveFontStylesheets(fonts);\n const cssVariables = createThemeVariables(fonts, tokens, theme, colorTheme);\n\n const cssSelector =\n scope === \"root\" ? \":root\" : `[data-puzzle-theme-scope=\"${scopeId}\"]`;\n\n const css = `${cssSelector} {\\n${createThemeCss(cssVariables)}\\n}`;\n\n const shouldApplyGlobalStyles = scope === \"root\" && (globalStyles ?? true);\n\n const content =\n components === undefined ? (\n children\n ) : (\n <ThemeComponentsProvider components={components}>\n {children}\n </ThemeComponentsProvider>\n );\n\n const scopedContent = (\n <ThemeScopeProvider\n scopeId={scope === \"local\" ? scopeId : null}\n theme={theme}\n >\n {content}\n </ThemeScopeProvider>\n );\n\n return (\n <>\n {fontStylesheets.length > 0 ? (\n <>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link\n rel=\"preconnect\"\n href=\"https://fonts.gstatic.com\"\n crossOrigin=\"anonymous\"\n />\n </>\n ) : null}\n\n {fontStylesheets.map(({ href }) => (\n <link key={href} rel=\"stylesheet\" href={href} precedence=\"default\" />\n ))}\n\n {shouldApplyGlobalStyles ? (\n <style nonce={nonce} data-puzzle-global-styles=\"\" />\n ) : null}\n\n <style\n nonce={nonce}\n data-theme={theme}\n data-puzzle-theme={scope === \"root\" ? \"true\" : undefined}\n data-puzzle-theme-scope-style={scope === \"local\" ? scopeId : undefined}\n >\n {css}\n </style>\n\n {scopedContent}\n </>\n );\n};\n\nexport { Theme };\n"],"mappings":";;;;;;;;;;;AA8BA,MAAM,SAAS,EACb,OACA,OACA,QAAQ,UACR,QAAQ,QACR,cACA,QACA,YACA,YACA,eACmC;CACnC,MAAM,UAAU,MAAM;CAEtB,MAAM,kBAAkB,uBAAuB,KAAK;CACpD,MAAM,eAAe,qBAAqB,OAAO,QAAQ,OAAO,UAAU;CAK1E,MAAM,MAAM,GAFV,UAAU,SAAS,UAAU,6BAA6B,QAAQ,IAEzC,MAAM,eAAe,YAAY,EAAE;CAE9D,MAAM,0BAA0B,UAAU,WAAW,gBAAgB;CAWrE,MAAM,gBACJ,oBAAC,oBAAD;EACE,SAAS,UAAU,UAAU,UAAU;EAChC;EAXT,UAAA,eAAe,KAAA,IACb,WAEA,oBAAC,yBAAD;GAAqC;GAClC;EACsB,CAAA;CASP,CAAA;CAGtB,OACE,qBAAA,UAAA,EAAA,UAAA;EACG,gBAAgB,SAAS,IACxB,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;GAAM,KAAI;GAAa,MAAK;EAAgC,CAAA,GAC5D,oBAAC,QAAD;GACE,KAAI;GACJ,MAAK;GACL,aAAY;EACb,CAAA,CACD,EAAA,CAAA,IACA;EAEH,gBAAgB,KAAK,EAAE,WACtB,oBAAC,QAAD;GAAiB,KAAI;GAAmB;GAAM,YAAW;EAAW,GAAzD,IAAyD,CACrE;EAEA,0BACC,oBAAC,SAAD;GAAc;GAAO,6BAA0B;EAAI,CAAA,IACjD;EAEJ,oBAAC,SAAD;GACS;GACP,cAAY;GACZ,qBAAmB,UAAU,SAAS,SAAS,KAAA;GAC/C,iCAA+B,UAAU,UAAU,UAAU,KAAA;GAE5D,UAAA;EACI,CAAA;EAEN;CACD,EAAA,CAAA;AAEN"}