@macroui/macroui 4.0.2 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,262 @@
1
+ const pc = require("picocolors")
2
+ const colorNames = require("./colorNames")
3
+ const themeDefaults = require("./themeDefaults")
4
+
5
+ const { oklch, interpolate, wcagContrast } = require("culori/require")
6
+
7
+ const colorIsInvalid = (input) => {
8
+ console.error(
9
+ `├─ ${pc.red("⚠︎")} ${pc.bgRed(" Error ")} Invalid color ${pc.red(input)} in ${pc.green(
10
+ "tailwind.config.js"
11
+ )}`
12
+ )
13
+ }
14
+ const cutNumber = (number) => {
15
+ try {
16
+ if (number) {
17
+ return +number.toFixed(6)
18
+ }
19
+ return 0
20
+ } catch (e) {
21
+ // colorIsInvalid(number)
22
+ return false
23
+ }
24
+ }
25
+ module.exports = {
26
+ isDark: (color) => {
27
+ try {
28
+ if (wcagContrast(color, "black") < wcagContrast(color, "white")) {
29
+ return true
30
+ }
31
+ return false
32
+ } catch (e) {
33
+ // colorIsInvalid(color)
34
+ return false
35
+ }
36
+ },
37
+
38
+ colorObjToString: (input) => {
39
+ const { l, c, h } = input
40
+ return `${Number.parseFloat((cutNumber(l) * 100).toFixed(6))}% ${cutNumber(c)} ${cutNumber(h)}`
41
+ },
42
+
43
+ generateForegroundColorFrom: function (input, percentage = 0.8) {
44
+ try {
45
+ const result = interpolate(
46
+ [input, this.isDark(input) ? "white" : "black"],
47
+ "oklch"
48
+ )(percentage)
49
+ return this.colorObjToString(result)
50
+ } catch (e) {
51
+ // colorIsInvalid(input)
52
+ return false
53
+ }
54
+ },
55
+
56
+ generateDarkenColorFrom: function (input, percentage = 0.07) {
57
+ try {
58
+ const result = interpolate([input, "black"], "oklch")(percentage)
59
+ return this.colorObjToString(result)
60
+ } catch (e) {
61
+ // colorIsInvalid(input)
62
+ return false
63
+ }
64
+ },
65
+
66
+ convertColorFormat: function (input) {
67
+ if (typeof input !== "object" || input === null) {
68
+ return input
69
+ }
70
+
71
+ const resultObj = {}
72
+
73
+ for (const [rule, value] of Object.entries(input)) {
74
+ if (Object.hasOwn(colorNames, rule)) {
75
+ try {
76
+ const colorObj = oklch(value)
77
+ resultObj[colorNames[rule]] = this.colorObjToString(colorObj)
78
+ } catch (e) {
79
+ colorIsInvalid(value)
80
+ return false
81
+ }
82
+ } else {
83
+ resultObj[rule] = value
84
+ }
85
+
86
+ // auto generate base colors
87
+ if (!Object.hasOwn(input, "base-100")) {
88
+ resultObj["--b1"] = "100% 0 0"
89
+ }
90
+ if (!Object.hasOwn(input, "base-200")) {
91
+ resultObj["--b2"] = this.generateDarkenColorFrom(input["base-100"], 0.07)
92
+ }
93
+ if (!Object.hasOwn(input, "base-300")) {
94
+ if (Object.hasOwn(input, "base-200")) {
95
+ resultObj["--b3"] = this.generateDarkenColorFrom(input["base-200"], 0.07)
96
+ } else {
97
+ resultObj["--b3"] = this.generateDarkenColorFrom(input["base-100"], 0.14)
98
+ }
99
+ }
100
+
101
+ // auto generate state colors
102
+
103
+ if (!Object.hasOwn(input, "info")) {
104
+ resultObj["--in"] = "72.06% 0.191 231.6"
105
+ }
106
+ if (!Object.hasOwn(input, "success")) {
107
+ resultObj["--su"] = "64.8% 0.150 160"
108
+ }
109
+ if (!Object.hasOwn(input, "warning")) {
110
+ resultObj["--wa"] = "84.71% 0.199 83.87"
111
+ }
112
+ if (!Object.hasOwn(input, "error")) {
113
+ resultObj["--er"] = "71.76% 0.221 22.18"
114
+ }
115
+
116
+ // auto generate content colors
117
+ if (!Object.hasOwn(input, "base-content")) {
118
+ resultObj["--bc"] = this.generateForegroundColorFrom(input["base-100"], 0.8)
119
+ }
120
+ if (!Object.hasOwn(input, "primary-content")) {
121
+ resultObj["--pc"] = this.generateForegroundColorFrom(input.primary, 0.8)
122
+ }
123
+ if (!Object.hasOwn(input, "secondary-content")) {
124
+ resultObj["--sc"] = this.generateForegroundColorFrom(input.secondary, 0.8)
125
+ }
126
+ if (!Object.hasOwn(input, "accent-content")) {
127
+ resultObj["--ac"] = this.generateForegroundColorFrom(input.accent, 0.8)
128
+ }
129
+ if (!Object.hasOwn(input, "neutral-content")) {
130
+ resultObj["--nc"] = this.generateForegroundColorFrom(input.neutral, 0.8)
131
+ }
132
+ if (!Object.hasOwn(input, "info-content")) {
133
+ if (Object.hasOwn(input, "info")) {
134
+ resultObj["--inc"] = this.generateForegroundColorFrom(input.info, 0.8)
135
+ } else {
136
+ resultObj["--inc"] = "0% 0 0"
137
+ }
138
+ }
139
+ if (!Object.hasOwn(input, "success-content")) {
140
+ if (Object.hasOwn(input, "success")) {
141
+ resultObj["--suc"] = this.generateForegroundColorFrom(input.success, 0.8)
142
+ } else {
143
+ resultObj["--suc"] = "0% 0 0"
144
+ }
145
+ }
146
+ if (!Object.hasOwn(input, "warning-content")) {
147
+ if (Object.hasOwn(input, "warning")) {
148
+ resultObj["--wac"] = this.generateForegroundColorFrom(input.warning, 0.8)
149
+ } else {
150
+ resultObj["--wac"] = "0% 0 0"
151
+ }
152
+ }
153
+ if (!Object.hasOwn(input, "error-content")) {
154
+ if (Object.hasOwn(input, "error")) {
155
+ resultObj["--erc"] = this.generateForegroundColorFrom(input.error, 0.8)
156
+ } else {
157
+ resultObj["--erc"] = "0% 0 0"
158
+ }
159
+ }
160
+
161
+ // add css variables if not exist
162
+ for (const item of Object.entries(themeDefaults.variables)) {
163
+ const [variable, value] = item
164
+ if (!Object.hasOwn(input, variable)) {
165
+ resultObj[variable] = value
166
+ }
167
+ }
168
+
169
+ // add other custom styles
170
+ if (!Object.hasOwn(colorNames, rule)) {
171
+ resultObj[rule] = value
172
+ }
173
+ }
174
+
175
+ return resultObj
176
+ },
177
+
178
+ injectThemes: function (addBase, config, themes) {
179
+ const includedThemesObj = {}
180
+ // add default themes
181
+ const themeRoot = config("daisyui.themeRoot") ?? ":root"
182
+ for (const [theme, value] of Object.entries(themes)) {
183
+ includedThemesObj[theme] = this.convertColorFormat(value)
184
+ }
185
+
186
+ // add custom themes
187
+ if (Array.isArray(config("daisyui.themes"))) {
188
+ for (const item of config("daisyui.themes")) {
189
+ if (typeof item === "object" && item !== null) {
190
+ for (const [customThemeName, customThemevalue] of Object.entries(item)) {
191
+ includedThemesObj[customThemeName] = this.convertColorFormat(customThemevalue)
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ let themeOrder = []
198
+ if (Array.isArray(config("daisyui.themes"))) {
199
+ for (const theme of config("daisyui.themes")) {
200
+ if (typeof theme === "object" && theme !== null) {
201
+ for (const customThemeName of Object.keys(theme)) {
202
+ themeOrder.push(customThemeName)
203
+ }
204
+ } else if (Object.hasOwn(includedThemesObj, theme)) {
205
+ themeOrder.push(theme)
206
+ }
207
+ }
208
+ } else if (config("daisyui.themes") === true) {
209
+ themeOrder = themeDefaults.themeOrder
210
+ } else {
211
+ themeOrder = ["light", "dark"]
212
+ }
213
+
214
+ // inject themes in order
215
+ const themesToInject = {}
216
+ themeOrder.forEach((themeName, index) => {
217
+ if (index === 0) {
218
+ // first theme as root
219
+ themesToInject[themeRoot] = includedThemesObj[themeName]
220
+ } else if (index === 1) {
221
+ // auto dark
222
+ if (config("daisyui.darkTheme")) {
223
+ if (
224
+ themeOrder[0] !== config("daisyui.darkTheme") &&
225
+ themeOrder.includes(config("daisyui.darkTheme"))
226
+ ) {
227
+ themesToInject["@media (prefers-color-scheme: dark)"] = {
228
+ [themeRoot]: includedThemesObj[`${config("daisyui.darkTheme")}`],
229
+ }
230
+ }
231
+ } else if (config("daisyui.darkTheme") === false) {
232
+ // disables prefers-color-scheme: dark
233
+ } else {
234
+ if (themeOrder[0] !== "dark" && themeOrder.includes("dark")) {
235
+ themesToInject["@media (prefers-color-scheme: dark)"] = {
236
+ [themeRoot]: includedThemesObj.dark,
237
+ }
238
+ }
239
+ }
240
+ // theme 0 with name
241
+ themesToInject[`[data-theme=${themeOrder[0]}]`] = includedThemesObj[themeOrder[0]]
242
+ themesToInject[`${themeRoot}:has(input.theme-controller[value=${themeOrder[0]}]:checked)`] =
243
+ includedThemesObj[themeOrder[0]]
244
+ // theme 1 with name
245
+ themesToInject[`[data-theme=${themeOrder[1]}]`] = includedThemesObj[themeOrder[1]]
246
+ themesToInject[`${themeRoot}:has(input.theme-controller[value=${themeOrder[1]}]:checked)`] =
247
+ includedThemesObj[themeOrder[1]]
248
+ } else {
249
+ themesToInject[`[data-theme=${themeName}]`] = includedThemesObj[themeName]
250
+ themesToInject[`${themeRoot}:has(input.theme-controller[value=${themeName}]:checked)`] =
251
+ includedThemesObj[themeName]
252
+ }
253
+ })
254
+
255
+ addBase(themesToInject)
256
+
257
+ return {
258
+ includedThemesObj,
259
+ themeOrder,
260
+ }
261
+ },
262
+ }
@@ -0,0 +1,35 @@
1
+ const colorObject = {
2
+ "transparent": "transparent",
3
+ "current": "currentColor",
4
+
5
+ "primary": "var(--fallback-p,oklch(var(--p)/<alpha-value>))",
6
+ "primary-content": "var(--fallback-pc,oklch(var(--pc)/<alpha-value>))",
7
+
8
+ "secondary": "var(--fallback-s,oklch(var(--s)/<alpha-value>))",
9
+ "secondary-content": "var(--fallback-sc,oklch(var(--sc)/<alpha-value>))",
10
+
11
+ "accent": "var(--fallback-a,oklch(var(--a)/<alpha-value>))",
12
+ "accent-content": "var(--fallback-ac,oklch(var(--ac)/<alpha-value>))",
13
+
14
+ "neutral": "var(--fallback-n,oklch(var(--n)/<alpha-value>))",
15
+ "neutral-content": "var(--fallback-nc,oklch(var(--nc)/<alpha-value>))",
16
+
17
+ "base-100": "var(--fallback-b1,oklch(var(--b1)/<alpha-value>))",
18
+ "base-200": "var(--fallback-b2,oklch(var(--b2)/<alpha-value>))",
19
+ "base-300": "var(--fallback-b3,oklch(var(--b3)/<alpha-value>))",
20
+ "base-content": "var(--fallback-bc,oklch(var(--bc)/<alpha-value>))",
21
+
22
+ "info": "var(--fallback-in,oklch(var(--in)/<alpha-value>))",
23
+ "info-content": "var(--fallback-inc,oklch(var(--inc)/<alpha-value>))",
24
+
25
+ "success": "var(--fallback-su,oklch(var(--su)/<alpha-value>))",
26
+ "success-content": "var(--fallback-suc,oklch(var(--suc)/<alpha-value>))",
27
+
28
+ "warning": "var(--fallback-wa,oklch(var(--wa)/<alpha-value>))",
29
+ "warning-content": "var(--fallback-wac,oklch(var(--wac)/<alpha-value>))",
30
+
31
+ "error": "var(--fallback-er,oklch(var(--er)/<alpha-value>))",
32
+ "error-content": "var(--fallback-erc,oklch(var(--erc)/<alpha-value>))",
33
+ }
34
+
35
+ module.exports = colorObject
@@ -0,0 +1,47 @@
1
+ module.exports = {
2
+ themeOrder: [
3
+ "light",
4
+ "dark",
5
+ "cupcake",
6
+ "bumblebee",
7
+ "emerald",
8
+ "corporate",
9
+ "synthwave",
10
+ "retro",
11
+ "cyberpunk",
12
+ "valentine",
13
+ "halloween",
14
+ "garden",
15
+ "forest",
16
+ "aqua",
17
+ "lofi",
18
+ "pastel",
19
+ "fantasy",
20
+ "wireframe",
21
+ "black",
22
+ "luxury",
23
+ "dracula",
24
+ "cmyk",
25
+ "autumn",
26
+ "business",
27
+ "acid",
28
+ "lemonade",
29
+ "night",
30
+ "coffee",
31
+ "winter",
32
+ "dim",
33
+ "nord",
34
+ "sunset",
35
+ ],
36
+ variables: {
37
+ "--rounded-box": "1rem",
38
+ "--rounded-btn": "0.5rem",
39
+ "--rounded-badge": "1.9rem",
40
+ "--animation-btn": "0.25s",
41
+ "--animation-input": ".2s",
42
+ "--btn-focus-scale": "0.95",
43
+ "--border-btn": "1px",
44
+ "--tab-border": "1px",
45
+ "--tab-radius": "0.5rem",
46
+ },
47
+ }
@@ -0,0 +1,5 @@
1
+ import type { CustomTheme, Theme } from "../index"
2
+
3
+ declare const themes: Record<`${Theme}`, CustomTheme[string]>
4
+
5
+ export = themes