@freitas-ds/theme 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Eric Freitas Sampaio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @freitas-ds/theme
2
+
3
+ Motor de temas do Freitas DS. Gera, resolve e aplica tokens semânticos por seed color ou configuração manual, sem depender de React.
4
+
5
+ ## Instalação
6
+
7
+ ```bash
8
+ pnpm add @freitas-ds/theme
9
+ ```
10
+
11
+ ## Uso
12
+
13
+ ```ts
14
+ import { applyTheme, createThemeFromSeed } from "@freitas-ds/theme"
15
+
16
+ const theme = createThemeFromSeed("#2563eb", { mode: "light" })
17
+ applyTheme(theme)
18
+ ```
19
+
20
+ Consulte a [documentação completa](https://github.com/freitaseric/freitas-ds) para conhecer temas manuais, tipos e tokens disponíveis.
@@ -0,0 +1,89 @@
1
+ //#region src/types.d.ts
2
+ type FreitasThemeMode = "light" | "dark";
3
+ type FreitasColorScheme = {
4
+ primary: string;
5
+ onPrimary: string;
6
+ primaryContainer: string;
7
+ onPrimaryContainer: string;
8
+ secondary: string;
9
+ onSecondary: string;
10
+ secondaryContainer: string;
11
+ onSecondaryContainer: string;
12
+ tertiary: string;
13
+ onTertiary: string;
14
+ tertiaryContainer: string;
15
+ onTertiaryContainer: string;
16
+ surface: string;
17
+ onSurface: string;
18
+ surfaceVariant: string;
19
+ onSurfaceVariant: string;
20
+ surfaceContainer: string;
21
+ surfaceContainerHigh: string;
22
+ outline: string;
23
+ outlineVariant: string;
24
+ error: string;
25
+ onError: string;
26
+ errorContainer: string;
27
+ onErrorContainer: string;
28
+ success: string;
29
+ onSuccess: string;
30
+ successContainer: string;
31
+ onSuccessContainer: string;
32
+ warning: string;
33
+ onWarning: string;
34
+ warningContainer: string;
35
+ onWarningContainer: string;
36
+ info: string;
37
+ onInfo: string;
38
+ infoContainer: string;
39
+ onInfoContainer: string;
40
+ ring: string;
41
+ };
42
+ type FreitasRadiusScheme = {
43
+ sm: string;
44
+ md: string;
45
+ lg: string;
46
+ xl: string;
47
+ full: string;
48
+ };
49
+ type FreitasTypographyScheme = {
50
+ fontSans: string;
51
+ fontMono: string;
52
+ };
53
+ type FreitasTheme = {
54
+ mode: FreitasThemeMode;
55
+ colors: FreitasColorScheme;
56
+ radius: FreitasRadiusScheme;
57
+ typography: FreitasTypographyScheme;
58
+ };
59
+ type FreitasManualThemeInput = {
60
+ mode?: FreitasThemeMode;
61
+ colors?: Partial<FreitasColorScheme>;
62
+ radius?: Partial<FreitasRadiusScheme>;
63
+ typography?: Partial<FreitasTypographyScheme>;
64
+ };
65
+ type FreitasSeedThemeInput = FreitasManualThemeInput & {
66
+ seed: string;
67
+ };
68
+ type FreitasThemeInput = FreitasManualThemeInput | FreitasSeedThemeInput;
69
+ //#endregion
70
+ //#region src/apply-theme.d.ts
71
+ declare function themeToCssVariables(theme: FreitasTheme): Record<string, string>;
72
+ declare function applyTheme(theme: FreitasTheme, element?: HTMLElement): void;
73
+ //#endregion
74
+ //#region src/create-theme-from-seed.d.ts
75
+ type CreateThemeFromSeedOptions = {
76
+ mode?: FreitasThemeMode;
77
+ colors?: Partial<FreitasColorScheme>;
78
+ };
79
+ declare function createThemeFromSeed(seed: string, options?: CreateThemeFromSeedOptions): FreitasTheme;
80
+ //#endregion
81
+ //#region src/default-theme.d.ts
82
+ declare const defaultLightTheme: FreitasTheme;
83
+ declare const defaultDarkTheme: FreitasTheme;
84
+ //#endregion
85
+ //#region src/resolve-theme.d.ts
86
+ declare function resolveTheme(input?: FreitasThemeInput): FreitasTheme;
87
+ //#endregion
88
+ export { FreitasColorScheme, FreitasManualThemeInput, FreitasRadiusScheme, FreitasSeedThemeInput, FreitasTheme, FreitasThemeInput, FreitasThemeMode, FreitasTypographyScheme, applyTheme, createThemeFromSeed, defaultDarkTheme, defaultLightTheme, resolveTheme, themeToCssVariables };
89
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/apply-theme.ts","../src/create-theme-from-seed.ts","../src/default-theme.ts","../src/resolve-theme.ts"],"mappings":";KAAY,gBAAA;AAAA,KAEA,kBAAA;EACV,OAAA;EACA,SAAA;EACA,gBAAA;EACA,kBAAA;EAEA,SAAA;EACA,WAAA;EACA,kBAAA;EACA,oBAAA;EAEA,QAAA;EACA,UAAA;EACA,iBAAA;EACA,mBAAA;EAEA,OAAA;EACA,SAAA;EACA,cAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EAEA,OAAA;EACA,cAAA;EAEA,KAAA;EACA,OAAA;EACA,cAAA;EACA,gBAAA;EAEA,OAAA;EACA,SAAA;EACA,gBAAA;EACA,kBAAA;EAEA,OAAA;EACA,SAAA;EACA,gBAAA;EACA,kBAAA;EAEA,IAAA;EACA,MAAA;EACA,aAAA;EACA,eAAA;EAEA,IAAA;AAAA;AAAA,KAGU,mBAAA;EACV,EAAA;EACA,EAAA;EACA,EAAA;EACA,EAAA;EACA,IAAA;AAAA;AAAA,KAGU,uBAAA;EACV,QAAA;EACA,QAAQ;AAAA;AAAA,KAGE,YAAA;EACV,IAAA,EAAM,gBAAA;EACN,MAAA,EAAQ,kBAAA;EACR,MAAA,EAAQ,mBAAA;EACR,UAAA,EAAY,uBAAA;AAAA;AAAA,KAGF,uBAAA;EACV,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,OAAA,CAAQ,kBAAA;EACjB,MAAA,GAAS,OAAA,CAAQ,mBAAA;EACjB,UAAA,GAAa,OAAA,CAAQ,uBAAA;AAAA;AAAA,KAGX,qBAAA,GAAwB,uBAAuB;EACzD,IAAI;AAAA;AAAA,KAGM,iBAAA,GAAoB,uBAAA,GAA0B,qBAAqB;;;iBChF/D,mBAAA,CAAoB,KAAA,EAAO,YAAA,GAAe,MAAM;AAAA,iBA4DhD,UAAA,CAAW,KAAA,EAAO,YAAA,EAAc,OAAA,GAAU,WAAW;;;KCrDhE,0BAAA;EACH,IAAA,GAAO,gBAAA;EACP,MAAA,GAAS,OAAA,CAAQ,kBAAA;AAAA;AAAA,iBAaH,mBAAA,CACd,IAAA,UACA,OAAA,GAAS,0BAAA,GACR,YAAY;;;cCzBF,iBAAA,EAAmB,YA6D/B;AAAA,cAEY,gBAAA,EAAkB,YAmD9B;;;iBChHe,YAAA,CAAa,KAAA,GAAQ,iBAAA,GAAoB,YAAY"}
package/dist/index.mjs ADDED
@@ -0,0 +1,257 @@
1
+ import { argbFromHex, hexFromArgb, themeFromSourceColor } from "@material/material-color-utilities";
2
+ //#region src/apply-theme.ts
3
+ function themeToCssVariables(theme) {
4
+ return {
5
+ "--fds-color-primary": theme.colors.primary,
6
+ "--fds-color-on-primary": theme.colors.onPrimary,
7
+ "--fds-color-primary-container": theme.colors.primaryContainer,
8
+ "--fds-color-on-primary-container": theme.colors.onPrimaryContainer,
9
+ "--fds-color-secondary": theme.colors.secondary,
10
+ "--fds-color-on-secondary": theme.colors.onSecondary,
11
+ "--fds-color-secondary-container": theme.colors.secondaryContainer,
12
+ "--fds-color-on-secondary-container": theme.colors.onSecondaryContainer,
13
+ "--fds-color-tertiary": theme.colors.tertiary,
14
+ "--fds-color-on-tertiary": theme.colors.onTertiary,
15
+ "--fds-color-tertiary-container": theme.colors.tertiaryContainer,
16
+ "--fds-color-on-tertiary-container": theme.colors.onTertiaryContainer,
17
+ "--fds-color-surface": theme.colors.surface,
18
+ "--fds-color-on-surface": theme.colors.onSurface,
19
+ "--fds-color-surface-variant": theme.colors.surfaceVariant,
20
+ "--fds-color-on-surface-variant": theme.colors.onSurfaceVariant,
21
+ "--fds-color-surface-container": theme.colors.surfaceContainer,
22
+ "--fds-color-surface-container-high": theme.colors.surfaceContainerHigh,
23
+ "--fds-color-outline": theme.colors.outline,
24
+ "--fds-color-outline-variant": theme.colors.outlineVariant,
25
+ "--fds-color-error": theme.colors.error,
26
+ "--fds-color-on-error": theme.colors.onError,
27
+ "--fds-color-error-container": theme.colors.errorContainer,
28
+ "--fds-color-on-error-container": theme.colors.onErrorContainer,
29
+ "--fds-color-success": theme.colors.success,
30
+ "--fds-color-on-success": theme.colors.onSuccess,
31
+ "--fds-color-success-container": theme.colors.successContainer,
32
+ "--fds-color-on-success-container": theme.colors.onSuccessContainer,
33
+ "--fds-color-warning": theme.colors.warning,
34
+ "--fds-color-on-warning": theme.colors.onWarning,
35
+ "--fds-color-warning-container": theme.colors.warningContainer,
36
+ "--fds-color-on-warning-container": theme.colors.onWarningContainer,
37
+ "--fds-color-info": theme.colors.info,
38
+ "--fds-color-on-info": theme.colors.onInfo,
39
+ "--fds-color-info-container": theme.colors.infoContainer,
40
+ "--fds-color-on-info-container": theme.colors.onInfoContainer,
41
+ "--fds-color-ring": theme.colors.ring,
42
+ "--fds-radius-sm": theme.radius.sm,
43
+ "--fds-radius-md": theme.radius.md,
44
+ "--fds-radius-lg": theme.radius.lg,
45
+ "--fds-radius-xl": theme.radius.xl,
46
+ "--fds-radius-full": theme.radius.full,
47
+ "--fds-font-sans": theme.typography.fontSans,
48
+ "--fds-font-mono": theme.typography.fontMono
49
+ };
50
+ }
51
+ function applyTheme(theme, element) {
52
+ if (typeof document === "undefined") return;
53
+ const target = element ?? document.documentElement;
54
+ const variables = themeToCssVariables(theme);
55
+ for (const [name, value] of Object.entries(variables)) target.style.setProperty(name, value);
56
+ target.dataset.fdsTheme = theme.mode;
57
+ target.style.colorScheme = theme.mode;
58
+ }
59
+ //#endregion
60
+ //#region src/default-theme.ts
61
+ const defaultLightTheme = {
62
+ mode: "light",
63
+ colors: {
64
+ primary: "#2563eb",
65
+ onPrimary: "#ffffff",
66
+ primaryContainer: "#dbeafe",
67
+ onPrimaryContainer: "#172554",
68
+ secondary: "#475569",
69
+ onSecondary: "#ffffff",
70
+ secondaryContainer: "#e2e8f0",
71
+ onSecondaryContainer: "#0f172a",
72
+ tertiary: "#7c3aed",
73
+ onTertiary: "#ffffff",
74
+ tertiaryContainer: "#ede9fe",
75
+ onTertiaryContainer: "#2e1065",
76
+ surface: "#ffffff",
77
+ onSurface: "#0f172a",
78
+ surfaceVariant: "#f1f5f9",
79
+ onSurfaceVariant: "#475569",
80
+ surfaceContainer: "#f8fafc",
81
+ surfaceContainerHigh: "#f1f5f9",
82
+ outline: "#94a3b8",
83
+ outlineVariant: "#cbd5e1",
84
+ error: "#b91c1c",
85
+ onError: "#ffffff",
86
+ errorContainer: "#fee2e2",
87
+ onErrorContainer: "#450a0a",
88
+ success: "#15803d",
89
+ onSuccess: "#ffffff",
90
+ successContainer: "#dcfce7",
91
+ onSuccessContainer: "#052e16",
92
+ warning: "#b45309",
93
+ onWarning: "#ffffff",
94
+ warningContainer: "#fef3c7",
95
+ onWarningContainer: "#451a03",
96
+ info: "#0369a1",
97
+ onInfo: "#ffffff",
98
+ infoContainer: "#e0f2fe",
99
+ onInfoContainer: "#082f49",
100
+ ring: "#2563eb"
101
+ },
102
+ radius: {
103
+ sm: "0.375rem",
104
+ md: "0.625rem",
105
+ lg: "0.875rem",
106
+ xl: "1.25rem",
107
+ full: "999px"
108
+ },
109
+ typography: {
110
+ fontSans: "Inter, ui-sans-serif, system-ui, sans-serif",
111
+ fontMono: "JetBrains Mono, ui-monospace, SFMono-Regular, monospace"
112
+ }
113
+ };
114
+ const defaultDarkTheme = {
115
+ ...defaultLightTheme,
116
+ mode: "dark",
117
+ colors: {
118
+ primary: "#93c5fd",
119
+ onPrimary: "#172554",
120
+ primaryContainer: "#1e3a8a",
121
+ onPrimaryContainer: "#dbeafe",
122
+ secondary: "#cbd5e1",
123
+ onSecondary: "#0f172a",
124
+ secondaryContainer: "#334155",
125
+ onSecondaryContainer: "#f8fafc",
126
+ tertiary: "#c4b5fd",
127
+ onTertiary: "#2e1065",
128
+ tertiaryContainer: "#5b21b6",
129
+ onTertiaryContainer: "#ede9fe",
130
+ surface: "#020617",
131
+ onSurface: "#f8fafc",
132
+ surfaceVariant: "#1e293b",
133
+ onSurfaceVariant: "#cbd5e1",
134
+ surfaceContainer: "#0f172a",
135
+ surfaceContainerHigh: "#1e293b",
136
+ outline: "#64748b",
137
+ outlineVariant: "#334155",
138
+ error: "#fca5a5",
139
+ onError: "#450a0a",
140
+ errorContainer: "#7f1d1d",
141
+ onErrorContainer: "#fee2e2",
142
+ success: "#86efac",
143
+ onSuccess: "#052e16",
144
+ successContainer: "#14532d",
145
+ onSuccessContainer: "#dcfce7",
146
+ warning: "#fcd34d",
147
+ onWarning: "#451a03",
148
+ warningContainer: "#78350f",
149
+ onWarningContainer: "#fef3c7",
150
+ info: "#7dd3fc",
151
+ onInfo: "#082f49",
152
+ infoContainer: "#075985",
153
+ onInfoContainer: "#e0f2fe",
154
+ ring: "#93c5fd"
155
+ }
156
+ };
157
+ //#endregion
158
+ //#region src/create-theme-from-seed.ts
159
+ function pickColor(raw, key, fallback) {
160
+ const value = raw[key];
161
+ if (typeof value === "number") return hexFromArgb(value);
162
+ return fallback;
163
+ }
164
+ function createThemeFromSeed(seed, options = {}) {
165
+ const mode = options.mode ?? "light";
166
+ const fallbackTheme = mode === "dark" ? defaultDarkTheme : defaultLightTheme;
167
+ const materialTheme = themeFromSourceColor(argbFromHex(seed));
168
+ const raw = (mode === "dark" ? materialTheme.schemes.dark : materialTheme.schemes.light).toJSON();
169
+ return {
170
+ mode,
171
+ colors: {
172
+ primary: pickColor(raw, "primary", fallbackTheme.colors.primary),
173
+ onPrimary: pickColor(raw, "onPrimary", fallbackTheme.colors.onPrimary),
174
+ primaryContainer: pickColor(raw, "primaryContainer", fallbackTheme.colors.primaryContainer),
175
+ onPrimaryContainer: pickColor(raw, "onPrimaryContainer", fallbackTheme.colors.onPrimaryContainer),
176
+ secondary: pickColor(raw, "secondary", fallbackTheme.colors.secondary),
177
+ onSecondary: pickColor(raw, "onSecondary", fallbackTheme.colors.onSecondary),
178
+ secondaryContainer: pickColor(raw, "secondaryContainer", fallbackTheme.colors.secondaryContainer),
179
+ onSecondaryContainer: pickColor(raw, "onSecondaryContainer", fallbackTheme.colors.onSecondaryContainer),
180
+ tertiary: pickColor(raw, "tertiary", fallbackTheme.colors.tertiary),
181
+ onTertiary: pickColor(raw, "onTertiary", fallbackTheme.colors.onTertiary),
182
+ tertiaryContainer: pickColor(raw, "tertiaryContainer", fallbackTheme.colors.tertiaryContainer),
183
+ onTertiaryContainer: pickColor(raw, "onTertiaryContainer", fallbackTheme.colors.onTertiaryContainer),
184
+ surface: pickColor(raw, "surface", fallbackTheme.colors.surface),
185
+ onSurface: pickColor(raw, "onSurface", fallbackTheme.colors.onSurface),
186
+ surfaceVariant: pickColor(raw, "surfaceVariant", fallbackTheme.colors.surfaceVariant),
187
+ onSurfaceVariant: pickColor(raw, "onSurfaceVariant", fallbackTheme.colors.onSurfaceVariant),
188
+ surfaceContainer: pickColor(raw, "surfaceContainer", pickColor(raw, "surfaceVariant", fallbackTheme.colors.surfaceContainer)),
189
+ surfaceContainerHigh: pickColor(raw, "surfaceContainerHigh", pickColor(raw, "surfaceVariant", fallbackTheme.colors.surfaceContainerHigh)),
190
+ outline: pickColor(raw, "outline", fallbackTheme.colors.outline),
191
+ outlineVariant: pickColor(raw, "outlineVariant", fallbackTheme.colors.outlineVariant),
192
+ error: pickColor(raw, "error", fallbackTheme.colors.error),
193
+ onError: pickColor(raw, "onError", fallbackTheme.colors.onError),
194
+ errorContainer: pickColor(raw, "errorContainer", fallbackTheme.colors.errorContainer),
195
+ onErrorContainer: pickColor(raw, "onErrorContainer", fallbackTheme.colors.onErrorContainer),
196
+ success: fallbackTheme.colors.success,
197
+ onSuccess: fallbackTheme.colors.onSuccess,
198
+ successContainer: fallbackTheme.colors.successContainer,
199
+ onSuccessContainer: fallbackTheme.colors.onSuccessContainer,
200
+ warning: fallbackTheme.colors.warning,
201
+ onWarning: fallbackTheme.colors.onWarning,
202
+ warningContainer: fallbackTheme.colors.warningContainer,
203
+ onWarningContainer: fallbackTheme.colors.onWarningContainer,
204
+ info: fallbackTheme.colors.info,
205
+ onInfo: fallbackTheme.colors.onInfo,
206
+ infoContainer: fallbackTheme.colors.infoContainer,
207
+ onInfoContainer: fallbackTheme.colors.onInfoContainer,
208
+ ring: pickColor(raw, "primary", fallbackTheme.colors.ring),
209
+ ...options.colors
210
+ },
211
+ radius: fallbackTheme.radius,
212
+ typography: fallbackTheme.typography
213
+ };
214
+ }
215
+ //#endregion
216
+ //#region src/resolve-theme.ts
217
+ function resolveTheme(input) {
218
+ if (!input) return defaultLightTheme;
219
+ const mode = input.mode ?? "light";
220
+ if ("seed" in input && input.seed) {
221
+ const seededTheme = createThemeFromSeed(input.seed, {
222
+ mode,
223
+ colors: input.colors
224
+ });
225
+ return {
226
+ ...seededTheme,
227
+ radius: {
228
+ ...seededTheme.radius,
229
+ ...input.radius
230
+ },
231
+ typography: {
232
+ ...seededTheme.typography,
233
+ ...input.typography
234
+ }
235
+ };
236
+ }
237
+ const fallbackTheme = mode === "dark" ? defaultDarkTheme : defaultLightTheme;
238
+ return {
239
+ mode,
240
+ colors: {
241
+ ...fallbackTheme.colors,
242
+ ...input.colors
243
+ },
244
+ radius: {
245
+ ...fallbackTheme.radius,
246
+ ...input.radius
247
+ },
248
+ typography: {
249
+ ...fallbackTheme.typography,
250
+ ...input.typography
251
+ }
252
+ };
253
+ }
254
+ //#endregion
255
+ export { applyTheme, createThemeFromSeed, defaultDarkTheme, defaultLightTheme, resolveTheme, themeToCssVariables };
256
+
257
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/apply-theme.ts","../src/default-theme.ts","../src/create-theme-from-seed.ts","../src/resolve-theme.ts"],"sourcesContent":["import type { FreitasTheme } from \"./types\"\n\nexport function themeToCssVariables(theme: FreitasTheme): Record<string, string> {\n return {\n \"--fds-color-primary\": theme.colors.primary,\n \"--fds-color-on-primary\": theme.colors.onPrimary,\n \"--fds-color-primary-container\": theme.colors.primaryContainer,\n \"--fds-color-on-primary-container\": theme.colors.onPrimaryContainer,\n\n \"--fds-color-secondary\": theme.colors.secondary,\n \"--fds-color-on-secondary\": theme.colors.onSecondary,\n \"--fds-color-secondary-container\": theme.colors.secondaryContainer,\n \"--fds-color-on-secondary-container\": theme.colors.onSecondaryContainer,\n\n \"--fds-color-tertiary\": theme.colors.tertiary,\n \"--fds-color-on-tertiary\": theme.colors.onTertiary,\n \"--fds-color-tertiary-container\": theme.colors.tertiaryContainer,\n \"--fds-color-on-tertiary-container\": theme.colors.onTertiaryContainer,\n\n \"--fds-color-surface\": theme.colors.surface,\n \"--fds-color-on-surface\": theme.colors.onSurface,\n \"--fds-color-surface-variant\": theme.colors.surfaceVariant,\n \"--fds-color-on-surface-variant\": theme.colors.onSurfaceVariant,\n \"--fds-color-surface-container\": theme.colors.surfaceContainer,\n \"--fds-color-surface-container-high\": theme.colors.surfaceContainerHigh,\n\n \"--fds-color-outline\": theme.colors.outline,\n \"--fds-color-outline-variant\": theme.colors.outlineVariant,\n\n \"--fds-color-error\": theme.colors.error,\n \"--fds-color-on-error\": theme.colors.onError,\n \"--fds-color-error-container\": theme.colors.errorContainer,\n \"--fds-color-on-error-container\": theme.colors.onErrorContainer,\n\n \"--fds-color-success\": theme.colors.success,\n \"--fds-color-on-success\": theme.colors.onSuccess,\n \"--fds-color-success-container\": theme.colors.successContainer,\n \"--fds-color-on-success-container\": theme.colors.onSuccessContainer,\n\n \"--fds-color-warning\": theme.colors.warning,\n \"--fds-color-on-warning\": theme.colors.onWarning,\n \"--fds-color-warning-container\": theme.colors.warningContainer,\n \"--fds-color-on-warning-container\": theme.colors.onWarningContainer,\n\n \"--fds-color-info\": theme.colors.info,\n \"--fds-color-on-info\": theme.colors.onInfo,\n \"--fds-color-info-container\": theme.colors.infoContainer,\n \"--fds-color-on-info-container\": theme.colors.onInfoContainer,\n\n \"--fds-color-ring\": theme.colors.ring,\n\n \"--fds-radius-sm\": theme.radius.sm,\n \"--fds-radius-md\": theme.radius.md,\n \"--fds-radius-lg\": theme.radius.lg,\n \"--fds-radius-xl\": theme.radius.xl,\n \"--fds-radius-full\": theme.radius.full,\n\n \"--fds-font-sans\": theme.typography.fontSans,\n \"--fds-font-mono\": theme.typography.fontMono\n }\n}\n\nexport function applyTheme(theme: FreitasTheme, element?: HTMLElement): void {\n if (typeof document === \"undefined\") {\n return\n }\n\n const target = element ?? document.documentElement\n const variables = themeToCssVariables(theme)\n\n for (const [name, value] of Object.entries(variables)) {\n target.style.setProperty(name, value)\n }\n\n target.dataset.fdsTheme = theme.mode\n target.style.colorScheme = theme.mode\n}\n","import type { FreitasTheme } from \"./types\"\n\nexport const defaultLightTheme: FreitasTheme = {\n mode: \"light\",\n colors: {\n primary: \"#2563eb\",\n onPrimary: \"#ffffff\",\n primaryContainer: \"#dbeafe\",\n onPrimaryContainer: \"#172554\",\n\n secondary: \"#475569\",\n onSecondary: \"#ffffff\",\n secondaryContainer: \"#e2e8f0\",\n onSecondaryContainer: \"#0f172a\",\n\n tertiary: \"#7c3aed\",\n onTertiary: \"#ffffff\",\n tertiaryContainer: \"#ede9fe\",\n onTertiaryContainer: \"#2e1065\",\n\n surface: \"#ffffff\",\n onSurface: \"#0f172a\",\n surfaceVariant: \"#f1f5f9\",\n onSurfaceVariant: \"#475569\",\n surfaceContainer: \"#f8fafc\",\n surfaceContainerHigh: \"#f1f5f9\",\n\n outline: \"#94a3b8\",\n outlineVariant: \"#cbd5e1\",\n\n error: \"#b91c1c\",\n onError: \"#ffffff\",\n errorContainer: \"#fee2e2\",\n onErrorContainer: \"#450a0a\",\n\n success: \"#15803d\",\n onSuccess: \"#ffffff\",\n successContainer: \"#dcfce7\",\n onSuccessContainer: \"#052e16\",\n\n warning: \"#b45309\",\n onWarning: \"#ffffff\",\n warningContainer: \"#fef3c7\",\n onWarningContainer: \"#451a03\",\n\n info: \"#0369a1\",\n onInfo: \"#ffffff\",\n infoContainer: \"#e0f2fe\",\n onInfoContainer: \"#082f49\",\n\n ring: \"#2563eb\"\n },\n radius: {\n sm: \"0.375rem\",\n md: \"0.625rem\",\n lg: \"0.875rem\",\n xl: \"1.25rem\",\n full: \"999px\"\n },\n typography: {\n fontSans: \"Inter, ui-sans-serif, system-ui, sans-serif\",\n fontMono: \"JetBrains Mono, ui-monospace, SFMono-Regular, monospace\"\n }\n}\n\nexport const defaultDarkTheme: FreitasTheme = {\n ...defaultLightTheme,\n mode: \"dark\",\n colors: {\n primary: \"#93c5fd\",\n onPrimary: \"#172554\",\n primaryContainer: \"#1e3a8a\",\n onPrimaryContainer: \"#dbeafe\",\n\n secondary: \"#cbd5e1\",\n onSecondary: \"#0f172a\",\n secondaryContainer: \"#334155\",\n onSecondaryContainer: \"#f8fafc\",\n\n tertiary: \"#c4b5fd\",\n onTertiary: \"#2e1065\",\n tertiaryContainer: \"#5b21b6\",\n onTertiaryContainer: \"#ede9fe\",\n\n surface: \"#020617\",\n onSurface: \"#f8fafc\",\n surfaceVariant: \"#1e293b\",\n onSurfaceVariant: \"#cbd5e1\",\n surfaceContainer: \"#0f172a\",\n surfaceContainerHigh: \"#1e293b\",\n\n outline: \"#64748b\",\n outlineVariant: \"#334155\",\n\n error: \"#fca5a5\",\n onError: \"#450a0a\",\n errorContainer: \"#7f1d1d\",\n onErrorContainer: \"#fee2e2\",\n\n success: \"#86efac\",\n onSuccess: \"#052e16\",\n successContainer: \"#14532d\",\n onSuccessContainer: \"#dcfce7\",\n\n warning: \"#fcd34d\",\n onWarning: \"#451a03\",\n warningContainer: \"#78350f\",\n onWarningContainer: \"#fef3c7\",\n\n info: \"#7dd3fc\",\n onInfo: \"#082f49\",\n infoContainer: \"#075985\",\n onInfoContainer: \"#e0f2fe\",\n\n ring: \"#93c5fd\"\n }\n}\n","import {\n argbFromHex,\n hexFromArgb,\n themeFromSourceColor\n} from \"@material/material-color-utilities\"\n\nimport { defaultDarkTheme, defaultLightTheme } from \"./default-theme\"\nimport type { FreitasColorScheme, FreitasTheme, FreitasThemeMode } from \"./types\"\n\ntype CreateThemeFromSeedOptions = {\n mode?: FreitasThemeMode\n colors?: Partial<FreitasColorScheme>\n}\n\nfunction pickColor(raw: Record<string, unknown>, key: string, fallback: string): string {\n const value = raw[key]\n\n if (typeof value === \"number\") {\n return hexFromArgb(value)\n }\n\n return fallback\n}\n\nexport function createThemeFromSeed(\n seed: string,\n options: CreateThemeFromSeedOptions = {}\n): FreitasTheme {\n const mode = options.mode ?? \"light\"\n const fallbackTheme = mode === \"dark\" ? defaultDarkTheme : defaultLightTheme\n\n const materialTheme = themeFromSourceColor(argbFromHex(seed))\n const scheme =\n mode === \"dark\" ? materialTheme.schemes.dark : materialTheme.schemes.light\n\n const raw = scheme.toJSON() as Record<string, unknown>\n\n const colors: FreitasColorScheme = {\n primary: pickColor(raw, \"primary\", fallbackTheme.colors.primary),\n onPrimary: pickColor(raw, \"onPrimary\", fallbackTheme.colors.onPrimary),\n primaryContainer: pickColor(\n raw,\n \"primaryContainer\",\n fallbackTheme.colors.primaryContainer\n ),\n onPrimaryContainer: pickColor(\n raw,\n \"onPrimaryContainer\",\n fallbackTheme.colors.onPrimaryContainer\n ),\n\n secondary: pickColor(raw, \"secondary\", fallbackTheme.colors.secondary),\n onSecondary: pickColor(raw, \"onSecondary\", fallbackTheme.colors.onSecondary),\n secondaryContainer: pickColor(\n raw,\n \"secondaryContainer\",\n fallbackTheme.colors.secondaryContainer\n ),\n onSecondaryContainer: pickColor(\n raw,\n \"onSecondaryContainer\",\n fallbackTheme.colors.onSecondaryContainer\n ),\n\n tertiary: pickColor(raw, \"tertiary\", fallbackTheme.colors.tertiary),\n onTertiary: pickColor(raw, \"onTertiary\", fallbackTheme.colors.onTertiary),\n tertiaryContainer: pickColor(\n raw,\n \"tertiaryContainer\",\n fallbackTheme.colors.tertiaryContainer\n ),\n onTertiaryContainer: pickColor(\n raw,\n \"onTertiaryContainer\",\n fallbackTheme.colors.onTertiaryContainer\n ),\n\n surface: pickColor(raw, \"surface\", fallbackTheme.colors.surface),\n onSurface: pickColor(raw, \"onSurface\", fallbackTheme.colors.onSurface),\n surfaceVariant: pickColor(raw, \"surfaceVariant\", fallbackTheme.colors.surfaceVariant),\n onSurfaceVariant: pickColor(\n raw,\n \"onSurfaceVariant\",\n fallbackTheme.colors.onSurfaceVariant\n ),\n\n surfaceContainer: pickColor(\n raw,\n \"surfaceContainer\",\n pickColor(raw, \"surfaceVariant\", fallbackTheme.colors.surfaceContainer)\n ),\n surfaceContainerHigh: pickColor(\n raw,\n \"surfaceContainerHigh\",\n pickColor(raw, \"surfaceVariant\", fallbackTheme.colors.surfaceContainerHigh)\n ),\n\n outline: pickColor(raw, \"outline\", fallbackTheme.colors.outline),\n outlineVariant: pickColor(raw, \"outlineVariant\", fallbackTheme.colors.outlineVariant),\n\n error: pickColor(raw, \"error\", fallbackTheme.colors.error),\n onError: pickColor(raw, \"onError\", fallbackTheme.colors.onError),\n errorContainer: pickColor(raw, \"errorContainer\", fallbackTheme.colors.errorContainer),\n onErrorContainer: pickColor(\n raw,\n \"onErrorContainer\",\n fallbackTheme.colors.onErrorContainer\n ),\n\n success: fallbackTheme.colors.success,\n onSuccess: fallbackTheme.colors.onSuccess,\n successContainer: fallbackTheme.colors.successContainer,\n onSuccessContainer: fallbackTheme.colors.onSuccessContainer,\n\n warning: fallbackTheme.colors.warning,\n onWarning: fallbackTheme.colors.onWarning,\n warningContainer: fallbackTheme.colors.warningContainer,\n onWarningContainer: fallbackTheme.colors.onWarningContainer,\n\n info: fallbackTheme.colors.info,\n onInfo: fallbackTheme.colors.onInfo,\n infoContainer: fallbackTheme.colors.infoContainer,\n onInfoContainer: fallbackTheme.colors.onInfoContainer,\n\n ring: pickColor(raw, \"primary\", fallbackTheme.colors.ring)\n }\n\n return {\n mode,\n colors: {\n ...colors,\n ...options.colors\n },\n radius: fallbackTheme.radius,\n typography: fallbackTheme.typography\n }\n}\n","import { createThemeFromSeed } from \"./create-theme-from-seed\"\nimport { defaultDarkTheme, defaultLightTheme } from \"./default-theme\"\nimport type { FreitasTheme, FreitasThemeInput } from \"./types\"\n\nexport function resolveTheme(input?: FreitasThemeInput): FreitasTheme {\n if (!input) {\n return defaultLightTheme\n }\n\n const mode = input.mode ?? \"light\"\n\n if (\"seed\" in input && input.seed) {\n const seededTheme = createThemeFromSeed(input.seed, {\n mode,\n colors: input.colors\n })\n\n return {\n ...seededTheme,\n radius: {\n ...seededTheme.radius,\n ...input.radius\n },\n typography: {\n ...seededTheme.typography,\n ...input.typography\n }\n }\n }\n\n const fallbackTheme = mode === \"dark\" ? defaultDarkTheme : defaultLightTheme\n\n return {\n mode,\n colors: {\n ...fallbackTheme.colors,\n ...input.colors\n },\n radius: {\n ...fallbackTheme.radius,\n ...input.radius\n },\n typography: {\n ...fallbackTheme.typography,\n ...input.typography\n }\n }\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@freitas-ds/theme",
3
+ "version": "0.1.0",
4
+ "description": "Motor de temas e tokens semânticos do Freitas DS.",
5
+ "keywords": [
6
+ "design-system",
7
+ "theme",
8
+ "tokens",
9
+ "css-variables"
10
+ ],
11
+ "author": {
12
+ "name": "Eric Freitas Sampaio",
13
+ "email": "contato@freitaseric.com",
14
+ "url": "https://freitaseric.com"
15
+ },
16
+ "license": "MIT",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/freitaseric/freitas-ds.git",
20
+ "directory": "packages/theme"
21
+ },
22
+ "homepage": "https://github.com/freitaseric/freitas-ds#readme",
23
+ "bugs": {
24
+ "url": "https://github.com/freitaseric/freitas-ds/issues"
25
+ },
26
+ "type": "module",
27
+ "main": "./dist/index.mjs",
28
+ "module": "./dist/index.mjs",
29
+ "types": "./dist/index.d.mts",
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "package.json"
34
+ ],
35
+ "exports": {
36
+ ".": {
37
+ "types": "./dist/index.d.mts",
38
+ "import": "./dist/index.mjs"
39
+ }
40
+ },
41
+ "publishConfig": {
42
+ "access": "public",
43
+ "registry": "https://registry.npmjs.org/"
44
+ },
45
+ "dependencies": {
46
+ "@material/material-color-utilities": "^0.4.0"
47
+ },
48
+ "devDependencies": {
49
+ "tsdown": "^0.22.2",
50
+ "typescript": "^6.0.3"
51
+ },
52
+ "scripts": {
53
+ "build": "tsdown",
54
+ "typecheck": "tsc --noEmit",
55
+ "clean": "rm -rf dist",
56
+ "lint": "biome check ."
57
+ }
58
+ }