@maz-ui/themes 4.0.0-beta.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/dist/build/index.js +52 -0
  4. package/dist/composables/index.js +11 -0
  5. package/dist/composables/useTheme.js +95 -0
  6. package/dist/define-preset.js +11 -0
  7. package/dist/index.js +36 -0
  8. package/dist/plugin/index.js +8 -0
  9. package/dist/plugin.js +65 -0
  10. package/dist/presets/index.js +10 -0
  11. package/dist/presets/mazUi.js +62 -0
  12. package/dist/presets/obsidian.js +65 -0
  13. package/dist/presets/ocean.js +63 -0
  14. package/dist/presets/pristine.js +62 -0
  15. package/dist/types/build/index.d.ts +37 -0
  16. package/dist/types/build/index.d.ts.map +1 -0
  17. package/dist/types/composables/useTheme.d.ts +16 -0
  18. package/dist/types/composables/useTheme.d.ts.map +1 -0
  19. package/dist/types/define-preset.d.ts +44 -0
  20. package/dist/types/define-preset.d.ts.map +1 -0
  21. package/dist/types/index.d.ts +10 -0
  22. package/dist/types/index.d.ts.map +1 -0
  23. package/dist/types/plugin.d.ts +61 -0
  24. package/dist/types/plugin.d.ts.map +1 -0
  25. package/dist/types/presets/index.d.ts +5 -0
  26. package/dist/types/presets/index.d.ts.map +1 -0
  27. package/dist/types/presets/mazUi.d.ts +3 -0
  28. package/dist/types/presets/mazUi.d.ts.map +1 -0
  29. package/dist/types/presets/obsidian.d.ts +3 -0
  30. package/dist/types/presets/obsidian.d.ts.map +1 -0
  31. package/dist/types/presets/ocean.d.ts +3 -0
  32. package/dist/types/presets/ocean.d.ts.map +1 -0
  33. package/dist/types/presets/pristine.d.ts +3 -0
  34. package/dist/types/presets/pristine.d.ts.map +1 -0
  35. package/dist/types/types/index.d.ts +127 -0
  36. package/dist/types/types/index.d.ts.map +1 -0
  37. package/dist/types/utils/color-utils.d.ts +11 -0
  38. package/dist/types/utils/color-utils.d.ts.map +1 -0
  39. package/dist/types/utils/cookie-storage.d.ts +3 -0
  40. package/dist/types/utils/cookie-storage.d.ts.map +1 -0
  41. package/dist/types/utils/css-generator.d.ts +46 -0
  42. package/dist/types/utils/css-generator.d.ts.map +1 -0
  43. package/dist/types/utils/get-color-mode.d.ts +4 -0
  44. package/dist/types/utils/get-color-mode.d.ts.map +1 -0
  45. package/dist/types/utils/get-preset.d.ts +5 -0
  46. package/dist/types/utils/get-preset.d.ts.map +1 -0
  47. package/dist/types/utils/index.d.ts +6 -0
  48. package/dist/types/utils/index.d.ts.map +1 -0
  49. package/dist/types/utils/preset-merger.d.ts +4 -0
  50. package/dist/types/utils/preset-merger.d.ts.map +1 -0
  51. package/dist/utils/color-utils.js +77 -0
  52. package/dist/utils/cookie-storage.js +13 -0
  53. package/dist/utils/css-generator.js +166 -0
  54. package/dist/utils/get-color-mode.js +14 -0
  55. package/dist/utils/get-preset.js +28 -0
  56. package/dist/utils/index.js +22 -0
  57. package/dist/utils/preset-merger.js +34 -0
  58. package/package.json +104 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 LouisMazel
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,163 @@
1
+ # @maz-ui/themes
2
+
3
+ High-performance and typed theme system for Maz-UI, inspired by Shadcn and PrimeVue.
4
+
5
+ ## Features
6
+
7
+ - 🎨 **HSL CSS Variables** - Uses HSL CSS variables for maximum flexibility
8
+ - 🌓 **Automatic dark mode** - Native dark mode support with `prefers-color-scheme`
9
+ - 🚀 **Automatic generation** - Automatically generates color variants (50-950)
10
+ - ⚡ **Flexible strategies** - Runtime, build-time or hybrid
11
+ - 🛡️ **Strict TypeScript** - Complete types for optimal DX
12
+ - 🎯 **Zero FOUC** - Critical CSS injected inline
13
+ - 🔧 **Configurable presets** - Ready-to-use and customizable presets
14
+
15
+ ## Installation
16
+
17
+ ```bash
18
+ npm install @maz-ui/themes
19
+ ```
20
+
21
+ ## Basic usage
22
+
23
+ ### 1. Plugin installation
24
+
25
+ ```typescript
26
+ import { MazUiTheme } from '@maz-ui/themes'
27
+ // main.ts
28
+ import { createApp } from 'vue'
29
+
30
+ const app = createApp(App)
31
+
32
+ app.use(MazUiTheme, {
33
+ preset: 'maz-ui',
34
+ strategy: 'hybrid',
35
+ darkModeStrategy: 'class'
36
+ })
37
+ ```
38
+
39
+ ### 2. Usage in components
40
+
41
+ ```vue
42
+ <script setup>
43
+ import { useMazTheme } from '@maz-ui/themes'
44
+
45
+ const { toggleDarkMode, isDark } = useMazTheme()
46
+ </script>
47
+
48
+ <template>
49
+ <div class="maz-bg-background maz-text-foreground">
50
+ <button
51
+ class="maz-bg-primary maz-text-primary-foreground maz-rounded-[var(--radius)]"
52
+ @click="toggleDarkMode"
53
+ >
54
+ Toggle Dark Mode
55
+ </button>
56
+ </div>
57
+ </template>
58
+ ```
59
+
60
+ ## Available presets
61
+
62
+ ### Default (Shadcn-like)
63
+
64
+ ```typescript
65
+ import { mazUi } from '@maz-ui/themes'
66
+ ```
67
+
68
+ ### Dark
69
+
70
+ ```typescript
71
+ import { dark } from '@maz-ui/themes'
72
+ ```
73
+
74
+ ### Ocean
75
+
76
+ ```typescript
77
+ import { ocean } from '@maz-ui/themes'
78
+ ```
79
+
80
+ ### Obsidian
81
+
82
+ ```typescript
83
+ import { obsidian } from '@maz-ui/themes'
84
+ ```
85
+
86
+ ## Creating custom presets
87
+
88
+ ```typescript
89
+ import { definePreset, mazUi } from '@maz-ui/themes'
90
+
91
+ const myPreset = definePreset({
92
+ base: mazUi,
93
+ overrides: {
94
+ name: 'my-theme',
95
+ radius: '0.75rem',
96
+ colors: {
97
+ light: {
98
+ primary: '220 100% 50%',
99
+ secondary: '210 40% 96%'
100
+ },
101
+ dark: {
102
+ primary: '220 100% 70%',
103
+ secondary: '210 40% 15%'
104
+ }
105
+ }
106
+ }
107
+ })
108
+ ```
109
+
110
+ ## Composable API
111
+
112
+ ```typescript
113
+ const {
114
+ currentPreset, // Ref<ThemePreset>
115
+ colorMode, // Ref<'light' | 'dark' | 'auto'>
116
+ isDark, // Ref<boolean>
117
+ strategy, // Ref<'runtime' | 'build' | 'hybrid'>
118
+ updateTheme, // (preset: ThemePreset | ThemePresetName | ThemePresetOverrides) => void
119
+ setColorMode, // (mode: 'light' | 'dark' | 'auto') => void
120
+ toggleDarkMode // () => void
121
+ } = useMazTheme()
122
+ ```
123
+
124
+ ## Strategies
125
+
126
+ ### Runtime
127
+
128
+ CSS generated and injected dynamically on the client side.
129
+
130
+ ### Build
131
+
132
+ CSS generated at build-time and included in the bundle.
133
+
134
+ ### Hybrid (recommended)
135
+
136
+ Critical CSS injected inline, complete CSS loaded asynchronously.
137
+
138
+ ## Generated CSS variables
139
+
140
+ The system automatically generates:
141
+
142
+ - Base color variables: `--primary`, `--secondary`, etc.
143
+ - Color scales: `--primary-50` to `--primary-950`
144
+ - Design variables: `--radius`, `--font-family`
145
+ - Dark mode support via `.dark` or `@media (prefers-color-scheme: dark)`
146
+
147
+ ## Build-time
148
+
149
+ ```typescript
150
+ import { buildThemeCSS, generateThemeBundle } from '@maz-ui/themes'
151
+
152
+ // CSS for a preset
153
+ const css = buildThemeCSS({
154
+ preset: myPreset,
155
+ darkModeStrategy: 'class',
156
+ critical: true
157
+ })
158
+
159
+ // Bundle for multiple presets
160
+ const bundle = generateThemeBundle([mazUi, darkPreset], {
161
+ darkModeStrategy: 'class'
162
+ })
163
+ ```
@@ -0,0 +1,52 @@
1
+ import { generateCriticalCSS as c, generateFullCSS as m } from "../utils/css-generator.js";
2
+ function o(t) {
3
+ const {
4
+ preset: e,
5
+ mode: i = "both",
6
+ prefix: r = "maz",
7
+ criticalOnly: n = !1
8
+ } = t, l = {
9
+ mode: i,
10
+ prefix: r
11
+ };
12
+ if (n)
13
+ return c(e, l);
14
+ const a = c(e, l), s = m(e, l);
15
+ return `${a}
16
+ ${s}`;
17
+ }
18
+ function u(t, e = {}) {
19
+ const {
20
+ mode: i = "both",
21
+ prefix: r = "maz",
22
+ criticalOnly: n = !1
23
+ } = e;
24
+ return t.reduce((l, a) => (l[a.name] = o({
25
+ preset: a,
26
+ mode: i,
27
+ prefix: r,
28
+ criticalOnly: n
29
+ }), l), {});
30
+ }
31
+ function f(t, e = {}) {
32
+ const { id: i = "maz-theme", media: r } = e;
33
+ let n = `<style id="${i}"`;
34
+ return r && (n += ` media="${r}"`), n += `>
35
+ ${t}
36
+ </style>`, n;
37
+ }
38
+ function S(t, e = {}) {
39
+ const { prefix: i = "maz", darkSelector: r = "class" } = e, n = { prefix: i, darkSelector: r };
40
+ return {
41
+ critical: c(t, { ...n, mode: "both" }),
42
+ full: m(t, { ...n, mode: "both" }),
43
+ lightOnly: o({ preset: t, mode: "light", ...e }),
44
+ darkOnly: o({ preset: t, mode: "dark", ...e })
45
+ };
46
+ }
47
+ export {
48
+ S as buildSeparateThemeFiles,
49
+ o as buildThemeCSS,
50
+ f as createThemeStylesheet,
51
+ u as generateThemeBundle
52
+ };
@@ -0,0 +1,11 @@
1
+ import { initThemeState as T, useTheme as a } from "./useTheme.js";
2
+ import "vue";
3
+ import "../utils/cookie-storage.js";
4
+ import "../utils/css-generator.js";
5
+ import "../utils/get-color-mode.js";
6
+ import "../utils/get-preset.js";
7
+ import "../utils/preset-merger.js";
8
+ export {
9
+ T as initThemeState,
10
+ a as useTheme
11
+ };
@@ -0,0 +1,95 @@
1
+ import { ref as m, computed as a, watchEffect as p, inject as v, getCurrentInstance as c } from "vue";
2
+ import { setCookie as g } from "../utils/cookie-storage.js";
3
+ import { generateCriticalCSS as k, generateFullCSS as M, injectCSS as s } from "../utils/css-generator.js";
4
+ import { getColorMode as y, getSystemPrefersDark as S } from "../utils/get-color-mode.js";
5
+ import { getPreset as P } from "../utils/get-preset.js";
6
+ import { mergePresets as h } from "../utils/preset-merger.js";
7
+ function w() {
8
+ return typeof document > "u" || typeof window > "u";
9
+ }
10
+ const r = m();
11
+ function l() {
12
+ typeof document > "u" || !r.value || r.value.darkModeStrategy === "media" || (r.value.isDark ? document.documentElement.classList.add("dark") : document.documentElement.classList.remove("dark"));
13
+ }
14
+ function C() {
15
+ const e = c()?.appContext.app;
16
+ e && r.value && (e.config.globalProperties.$mazThemeState = r.value);
17
+ }
18
+ function z(e) {
19
+ if (e.currentPreset && e.colorMode !== void 0) {
20
+ u({
21
+ currentPreset: e.currentPreset,
22
+ colorMode: e.colorMode,
23
+ isDark: e.isDark,
24
+ strategy: e.strategy,
25
+ darkModeStrategy: e.darkModeStrategy
26
+ });
27
+ return;
28
+ }
29
+ const t = y(e.colorMode), o = t === "auto" ? S() === "dark" : t === "dark";
30
+ u({
31
+ currentPreset: e.currentPreset,
32
+ colorMode: t,
33
+ isDark: o,
34
+ strategy: e.strategy,
35
+ darkModeStrategy: e.darkModeStrategy
36
+ });
37
+ }
38
+ function u(e) {
39
+ if (r.value = e, typeof window < "u" && r.value.colorMode === "auto") {
40
+ const t = window.matchMedia("(prefers-color-scheme: dark)"), o = () => {
41
+ r.value && r.value.colorMode === "auto" && (r.value.isDark = t.matches);
42
+ };
43
+ t.addEventListener("change", o), o();
44
+ }
45
+ p(() => {
46
+ r.value && (l(), C());
47
+ });
48
+ }
49
+ const T = a(() => r.value?.currentPreset), b = a({
50
+ get: () => r.value?.colorMode,
51
+ set: (e) => n(e)
52
+ }), D = a(() => r.value?.isDark ?? !1), E = a(() => r.value?.strategy);
53
+ async function x(e) {
54
+ if (!r.value)
55
+ return;
56
+ const t = typeof e == "string" ? await P(e) : e, o = "name" in t && t.name !== r.value.currentPreset.name ? t : h(r.value.currentPreset, t);
57
+ if (r.value.currentPreset = o, r.value.strategy === "runtime" || r.value.strategy === "hybrid") {
58
+ const i = {
59
+ mode: "both",
60
+ prefix: "maz"
61
+ }, d = k(o, i), f = M(o, i);
62
+ s(d, "maz-theme-critical"), s(f, "maz-theme-full");
63
+ }
64
+ }
65
+ function n(e) {
66
+ r.value && (r.value.colorMode = e, e === "auto" ? r.value.isDark = typeof window < "u" && window.matchMedia("(prefers-color-scheme: dark)").matches : r.value.isDark = e === "dark", l(), g("maz-color-mode", e));
67
+ }
68
+ function F() {
69
+ r.value && n(r.value.isDark ? "light" : "dark");
70
+ }
71
+ function O() {
72
+ let e;
73
+ try {
74
+ if (e = v("mazThemeState", void 0), !e)
75
+ throw new Error("mazThemeState not found");
76
+ } catch {
77
+ const t = c();
78
+ t?.appContext?.app?.config?.globalProperties && (e = t.appContext.app.config.globalProperties.$mazThemeState);
79
+ }
80
+ if (e && (r.value ? w() && (r.value.colorMode = e.colorMode, r.value.isDark = e.isDark, r.value.currentPreset = e.currentPreset) : z(e)), !r.value)
81
+ throw new Error("You must install the MazUi or MazUiTheme plugin before using useTheme composable");
82
+ return {
83
+ currentPreset: T,
84
+ colorMode: b,
85
+ isDark: D,
86
+ strategy: E,
87
+ updateTheme: x,
88
+ setColorMode: n,
89
+ toggleDarkMode: F
90
+ };
91
+ }
92
+ export {
93
+ u as initThemeState,
94
+ O as useTheme
95
+ };
@@ -0,0 +1,11 @@
1
+ import { mergePresets as r } from "./utils/preset-merger.js";
2
+ import { getPreset as f } from "./utils/get-preset.js";
3
+ function o({
4
+ base: e = "maz-ui",
5
+ overrides: t = {}
6
+ }) {
7
+ return typeof e == "string" ? f(e).then((n) => r(n, t)) : r(e, t);
8
+ }
9
+ export {
10
+ o as definePreset
11
+ };
package/dist/index.js ADDED
@@ -0,0 +1,36 @@
1
+ import { buildSeparateThemeFiles as o, buildThemeCSS as t, createThemeStylesheet as m, generateThemeBundle as a } from "./build/index.js";
2
+ import { initThemeState as S, useTheme as p } from "./composables/useTheme.js";
3
+ import { definePreset as n } from "./define-preset.js";
4
+ import { MazUiTheme as l } from "./plugin.js";
5
+ import { adjustColorLightness as C, formatHSL as h, generateColorScale as g, getContrastColor as d, parseHSL as T } from "./utils/color-utils.js";
6
+ import { generateCriticalCSS as c, generateFullCSS as b, injectCSS as L, removeCSS as j } from "./utils/css-generator.js";
7
+ import { deepMerge as F, mergePresets as H } from "./utils/preset-merger.js";
8
+ import { mazUi as P } from "./presets/mazUi.js";
9
+ import { obsidian as v } from "./presets/obsidian.js";
10
+ import { ocean as B } from "./presets/ocean.js";
11
+ import { pristine as q } from "./presets/pristine.js";
12
+ export {
13
+ l as MazUiTheme,
14
+ C as adjustColorLightness,
15
+ o as buildSeparateThemeFiles,
16
+ t as buildThemeCSS,
17
+ m as createThemeStylesheet,
18
+ F as deepMerge,
19
+ n as definePreset,
20
+ h as formatHSL,
21
+ g as generateColorScale,
22
+ c as generateCriticalCSS,
23
+ b as generateFullCSS,
24
+ a as generateThemeBundle,
25
+ d as getContrastColor,
26
+ S as initThemeState,
27
+ L as injectCSS,
28
+ P as mazUi,
29
+ H as mergePresets,
30
+ v as obsidian,
31
+ B as ocean,
32
+ T as parseHSL,
33
+ q as pristine,
34
+ j as removeCSS,
35
+ p as useTheme
36
+ };
@@ -0,0 +1,8 @@
1
+ import "vue";
2
+ import "../utils/css-generator.js";
3
+ import "../utils/get-color-mode.js";
4
+ import "../utils/get-preset.js";
5
+ import { MazUiTheme as e } from "../plugin.js";
6
+ export {
7
+ e as MazUiTheme
8
+ };
package/dist/plugin.js ADDED
@@ -0,0 +1,65 @@
1
+ import { reactive as l } from "vue";
2
+ import { generateCriticalCSS as d, injectCSS as n, generateFullCSS as m } from "./utils/css-generator.js";
3
+ import { getColorMode as u, getSystemPrefersDark as S } from "./utils/get-color-mode.js";
4
+ import { getPreset as f } from "./utils/get-preset.js";
5
+ function g(r, t) {
6
+ typeof document > "u" || r !== "class" || (t ? document.documentElement.classList.add("dark") : document.documentElement.classList.remove("dark"));
7
+ }
8
+ function k(r, t) {
9
+ if (typeof document > "u")
10
+ return;
11
+ const e = {
12
+ mode: "both",
13
+ prefix: t.prefix
14
+ };
15
+ if (t.injectCriticalCSS) {
16
+ const a = d(r, e);
17
+ n(a, "maz-theme-critical");
18
+ }
19
+ if (!t.injectFullCSS)
20
+ return;
21
+ const o = m(r, e);
22
+ t.strategy === "runtime" ? n(o, "maz-theme-full") : t.strategy === "hybrid" && requestIdleCallback(() => {
23
+ n(o, "maz-theme-full");
24
+ }, { timeout: 100 });
25
+ }
26
+ function p(r, t) {
27
+ r.provide("mazThemeState", t), r.config.globalProperties.$mazThemeState = t;
28
+ }
29
+ const z = {
30
+ async install(r, t = {}) {
31
+ const e = {
32
+ preset: "maz-ui",
33
+ strategy: "runtime",
34
+ darkModeStrategy: "class",
35
+ colorMode: "auto",
36
+ prefix: "maz",
37
+ injectCriticalCSS: !0,
38
+ injectFullCSS: !0,
39
+ ...t
40
+ }, o = u(e.colorMode), a = o === "auto" ? S() === "dark" : o === "dark", s = l({
41
+ // @ts-expect-error - empty currentPreset to avoid error
42
+ currentPreset: {},
43
+ colorMode: o,
44
+ isDark: a,
45
+ strategy: e.strategy,
46
+ darkModeStrategy: e.darkModeStrategy
47
+ });
48
+ g(e.darkModeStrategy, s.isDark), p(r, s);
49
+ const i = await f(e.preset), c = e.overrides ? {
50
+ ...i,
51
+ foundation: {
52
+ ...i.foundation,
53
+ ...e.overrides.foundation
54
+ },
55
+ colors: {
56
+ light: { ...i.colors.light, ...e.overrides.colors?.light },
57
+ dark: { ...i.colors.dark, ...e.overrides.colors?.dark }
58
+ }
59
+ } : i;
60
+ s.currentPreset = c, e.strategy !== "buildtime" && k(c, e);
61
+ }
62
+ };
63
+ export {
64
+ z as MazUiTheme
65
+ };
@@ -0,0 +1,10 @@
1
+ import { mazUi as e } from "./mazUi.js";
2
+ import { obsidian as m } from "./obsidian.js";
3
+ import { ocean as t } from "./ocean.js";
4
+ import { pristine as x } from "./pristine.js";
5
+ export {
6
+ e as mazUi,
7
+ m as obsidian,
8
+ t as ocean,
9
+ x as pristine
10
+ };
@@ -0,0 +1,62 @@
1
+ const r = {
2
+ name: "maz-ui",
3
+ foundation: {
4
+ "base-font-size": "14px",
5
+ "font-family": "Manrope, sans-serif, system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, oxygen, ubuntu, cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif",
6
+ radius: "0.7rem",
7
+ "border-width": "0.0625rem"
8
+ },
9
+ colors: {
10
+ light: {
11
+ background: "0 0% 100%",
12
+ foreground: "210 8% 14%",
13
+ primary: "210 100% 56%",
14
+ "primary-foreground": "0 0% 100%",
15
+ secondary: "272 99% 54%",
16
+ "secondary-foreground": "0 0% 100%",
17
+ accent: "164 76% 46%",
18
+ "accent-foreground": "0 0% 100%",
19
+ success: "80 61% 50%",
20
+ "success-foreground": "210 8% 14%",
21
+ warning: "40 97% 59%",
22
+ "warning-foreground": "210 8% 14%",
23
+ destructive: "1 100% 71%",
24
+ "destructive-foreground": "0 0% 100%",
25
+ info: "188 78% 41%",
26
+ "info-foreground": "0 0% 100%",
27
+ contrast: "235 16% 15%",
28
+ "contrast-foreground": "255 0% 95%",
29
+ border: "220 13.04% 90.98%",
30
+ overlay: "0 0% 40%",
31
+ muted: "0 0% 54%",
32
+ shadow: "240 5.9% 10%"
33
+ },
34
+ dark: {
35
+ background: "235 16% 15%",
36
+ foreground: "0 0% 85%",
37
+ primary: "210 100% 56%",
38
+ "primary-foreground": "0 0% 100%",
39
+ secondary: "272 99% 54%",
40
+ "secondary-foreground": "0 0% 100%",
41
+ accent: "164 76% 46%",
42
+ "accent-foreground": "0 0% 100%",
43
+ success: "80 61% 50%",
44
+ "success-foreground": "210 8% 14%",
45
+ warning: "40 97% 59%",
46
+ "warning-foreground": "210 8% 14%",
47
+ destructive: "1 100% 71%",
48
+ "destructive-foreground": "0 0% 100%",
49
+ info: "188 78% 41%",
50
+ "info-foreground": "0 0% 100%",
51
+ contrast: "0 0% 100%",
52
+ "contrast-foreground": "210 8% 14%",
53
+ muted: "255 0% 54%",
54
+ border: "238 17% 25%",
55
+ overlay: "0 0% 15%",
56
+ shadow: "240 3.7% 15.9%"
57
+ }
58
+ }
59
+ };
60
+ export {
61
+ r as mazUi
62
+ };
@@ -0,0 +1,65 @@
1
+ const r = {
2
+ name: "obsidian",
3
+ foundation: {
4
+ "base-font-size": "14px",
5
+ radius: "0.6rem",
6
+ "border-width": "1px",
7
+ "font-family": "'Inter', system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, oxygen, ubuntu, cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif"
8
+ },
9
+ colors: {
10
+ light: {
11
+ // On reste très sobre même en light mode, légèrement warm
12
+ background: "0 0% 98%",
13
+ foreground: "220 13% 15%",
14
+ primary: "220 100% 60%",
15
+ "primary-foreground": "0 0% 100%",
16
+ contrast: "220 13% 15%",
17
+ "contrast-foreground": "0 0% 100%",
18
+ secondary: "220 13% 90%",
19
+ "secondary-foreground": "220 13% 15%",
20
+ muted: "220 8% 50%",
21
+ accent: "280 100% 65%",
22
+ // une touche violet Linear-esque
23
+ "accent-foreground": "0 0% 100%",
24
+ destructive: "0 75% 55%",
25
+ "destructive-foreground": "0 0% 100%",
26
+ success: "160 60% 40%",
27
+ "success-foreground": "0 0% 100%",
28
+ warning: "40 100% 50%",
29
+ "warning-foreground": "0 0% 100%",
30
+ info: "200 100% 55%",
31
+ "info-foreground": "0 0% 100%",
32
+ border: "220 13% 90%",
33
+ overlay: "220 13% 15%",
34
+ shadow: "220 10% 20%"
35
+ },
36
+ dark: {
37
+ background: "220 13% 10%",
38
+ foreground: "0 0% 95%",
39
+ primary: "220 100% 70%",
40
+ "primary-foreground": "0 0% 10%",
41
+ contrast: "0 0% 100%",
42
+ "contrast-foreground": "220 13% 10%",
43
+ secondary: "220 13% 18%",
44
+ "secondary-foreground": "0 0% 95%",
45
+ muted: "220 8% 60%",
46
+ accent: "280 100% 65%",
47
+ // violet saturé (Linear)
48
+ "accent-foreground": "0 0% 100%",
49
+ destructive: "0 70% 60%",
50
+ "destructive-foreground": "0 0% 100%",
51
+ success: "160 60% 50%",
52
+ "success-foreground": "0 0% 100%",
53
+ warning: "40 100% 55%",
54
+ "warning-foreground": "0 0% 100%",
55
+ info: "200 100% 60%",
56
+ "info-foreground": "0 0% 100%",
57
+ border: "220 13% 20%",
58
+ overlay: "220 13% 10%",
59
+ shadow: "220 10% 5%"
60
+ }
61
+ }
62
+ };
63
+ export {
64
+ r as obsidian
65
+ };
@@ -0,0 +1,63 @@
1
+ const r = {
2
+ name: "ocean",
3
+ foundation: {
4
+ "base-font-size": "16px",
5
+ radius: "1rem",
6
+ "border-width": "0.125rem",
7
+ "font-family": "'Poppins', 'Inter', system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, oxygen, ubuntu, cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif"
8
+ },
9
+ colors: {
10
+ light: {
11
+ background: "200 40% 98%",
12
+ foreground: "210 20% 12%",
13
+ primary: "195 60% 45%",
14
+ "primary-foreground": "0 0% 100%",
15
+ contrast: "210 20% 12%",
16
+ "contrast-foreground": "200 40% 98%",
17
+ secondary: "180 35% 92%",
18
+ "secondary-foreground": "210 20% 12%",
19
+ muted: "200 15% 55%",
20
+ accent: "25 60% 70%",
21
+ // plus doux, légèrement pêche pastel
22
+ "accent-foreground": "210 20% 12%",
23
+ destructive: "5 65% 50%",
24
+ "destructive-foreground": "0 0% 100%",
25
+ success: "160 50% 38%",
26
+ "success-foreground": "0 0% 100%",
27
+ warning: "35 60% 55%",
28
+ "warning-foreground": "210 20% 12%",
29
+ info: "190 60% 50%",
30
+ "info-foreground": "0 0% 100%",
31
+ border: "180 25% 85%",
32
+ overlay: "210 20% 12%",
33
+ shadow: "195 20% 25%"
34
+ },
35
+ dark: {
36
+ background: "210 20% 10%",
37
+ foreground: "180 20% 92%",
38
+ primary: "180 60% 50%",
39
+ "primary-foreground": "210 20% 10%",
40
+ contrast: "180 20% 92%",
41
+ "contrast-foreground": "210 20% 10%",
42
+ secondary: "200 30% 18%",
43
+ "secondary-foreground": "180 20% 92%",
44
+ muted: "200 10% 60%",
45
+ accent: "25 50% 65%",
46
+ "accent-foreground": "210 20% 10%",
47
+ destructive: "5 60% 55%",
48
+ "destructive-foreground": "0 0% 100%",
49
+ success: "160 45% 40%",
50
+ "success-foreground": "0 0% 100%",
51
+ warning: "35 55% 55%",
52
+ "warning-foreground": "210 20% 10%",
53
+ info: "190 50% 55%",
54
+ "info-foreground": "0 0% 100%",
55
+ border: "200 20% 25%",
56
+ overlay: "210 20% 10%",
57
+ shadow: "195 10% 5%"
58
+ }
59
+ }
60
+ };
61
+ export {
62
+ r as ocean
63
+ };