@jirawatpyk/aura-react 4.4.1

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,186 @@
1
+ 'use client';
2
+ function hexToRgb(hex) {
3
+ var h = String(hex).trim().replace("#", "");
4
+ if (h.length === 3) h = h.split("").map(function(c) {
5
+ return c + c;
6
+ }).join("");
7
+ if (!/^[0-9a-f]{6}$/i.test(h)) throw new Error('createTheme: "' + hex + '" is not a #rgb or #rrggbb colour');
8
+ return [0, 2, 4].map(function(i) {
9
+ return parseInt(h.slice(i, i + 2), 16) / 255;
10
+ });
11
+ }
12
+ function rgbToHex(rgb) {
13
+ return "#" + rgb.map(function(v) {
14
+ var n = Math.round(Math.min(1, Math.max(0, v)) * 255);
15
+ return (n < 16 ? "0" : "") + n.toString(16);
16
+ }).join("");
17
+ }
18
+ function lin(c) {
19
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
20
+ }
21
+ function delin(c) {
22
+ return c <= 31308e-7 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;
23
+ }
24
+ function rgbToOklch(rgb) {
25
+ var r = lin(rgb[0]), g = lin(rgb[1]), b = lin(rgb[2]);
26
+ var l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
27
+ var m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
28
+ var s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
29
+ var L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
30
+ var A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
31
+ var B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
32
+ return [L, Math.sqrt(A * A + B * B), (Math.atan2(B, A) * 180 / Math.PI + 360) % 360];
33
+ }
34
+ function oklchToRgbRaw(L, C, H) {
35
+ var a = C * Math.cos(H * Math.PI / 180), b = C * Math.sin(H * Math.PI / 180);
36
+ var l = Math.pow(L + 0.3963377774 * a + 0.2158037573 * b, 3);
37
+ var m = Math.pow(L - 0.1055613458 * a - 0.0638541728 * b, 3);
38
+ var s = Math.pow(L - 0.0894841775 * a - 1.291485548 * b, 3);
39
+ return [
40
+ 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
41
+ -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
42
+ -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s
43
+ ].map(delin);
44
+ }
45
+ function inGamut(rgb) {
46
+ return rgb.every(function(v) {
47
+ return v >= -5e-4 && v <= 1.0005;
48
+ });
49
+ }
50
+ function oklchToHex(L, C, H) {
51
+ var lo = 0, hi = C, rgb = oklchToRgbRaw(L, C, H);
52
+ if (inGamut(rgb)) return rgbToHex(rgb);
53
+ for (var i = 0; i < 24; i++) {
54
+ var mid = (lo + hi) / 2;
55
+ if (inGamut(oklchToRgbRaw(L, mid, H))) lo = mid;
56
+ else hi = mid;
57
+ }
58
+ return rgbToHex(oklchToRgbRaw(L, lo, H));
59
+ }
60
+ function luminance(hex) {
61
+ var c = hexToRgb(hex).map(lin);
62
+ return 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];
63
+ }
64
+ function contrast(a, b) {
65
+ var x = luminance(a), y = luminance(b);
66
+ return (Math.max(x, y) + 0.05) / (Math.min(x, y) + 0.05);
67
+ }
68
+ function mix(a, b, t) {
69
+ var x = hexToRgb(a), y = hexToRgb(b);
70
+ return rgbToHex(x.map(function(v, i) {
71
+ return v + (y[i] - v) * t;
72
+ }));
73
+ }
74
+ var STEPS = { 50: [0.975, 0.18], 100: [0.945, 0.3], 200: [0.895, 0.5], 300: [0.81, 0.72], 400: [0.715, 0.9], 500: [0.635, 1], 600: [0.555, 1], 700: [0.49, 0.95], 800: [0.43, 0.85], 900: [0.38, 0.72] };
75
+ function scale(hex) {
76
+ var o = rgbToOklch(hexToRgb(hex)), C = Math.max(o[1], 0.02), out = {};
77
+ Object.keys(STEPS).forEach(function(k) {
78
+ out[k] = oklchToHex(STEPS[k][0], C * STEPS[k][1] / 0.95 * (o[1] < 0.03 ? 0.4 : 1), o[2]);
79
+ });
80
+ return out;
81
+ }
82
+ function fit(hex, grounds, target, dir) {
83
+ var o = rgbToOklch(hexToRgb(hex)), L = o[0], c = hex;
84
+ for (var i = 0; i < 80; i++) {
85
+ if (grounds.every(function(g) {
86
+ return contrast(c, g) >= target;
87
+ })) return c;
88
+ L = Math.min(1, Math.max(0, L + dir * 0.01));
89
+ c = oklchToHex(L, o[1], o[2]);
90
+ }
91
+ return c;
92
+ }
93
+ var ZINC = { 0: "#ffffff", 50: "#fafafa", 100: "#f4f4f5", 800: "#27272a", 900: "#18181b", 950: "#09090b" };
94
+ var INK = "#18181b";
95
+ function createTheme(opts) {
96
+ var o = opts || {};
97
+ if (!o.brand) throw new Error('createTheme: pass { brand: "#rrggbb" }');
98
+ var b = scale(o.brand), s = o.signal ? scale(o.signal) : null;
99
+ var lightGrounds = [ZINC[0], ZINC[50]], darkGrounds = [ZINC[900], ZINC[950]];
100
+ var L = {}, D = {};
101
+ L["fg-accent"] = fit(b[700], lightGrounds, 4.5, -1);
102
+ L["accent-violet"] = L["fg-accent"];
103
+ L["focus-ring"] = fit(b[700], lightGrounds.concat([b[50]]), 3, -1);
104
+ L["bg-selected"] = b[50];
105
+ L["status-progress-bg"] = b[100];
106
+ L["status-progress-fg"] = fit(b[800], [b[100]], 4.5, -1);
107
+ L["alert-info-bg"] = b[50];
108
+ L["alert-info-fg"] = fit(b[800], [b[50]], 4.5, -1);
109
+ L["alert-info-border"] = b[200];
110
+ L["mesh-from"] = b[400];
111
+ D["fg-accent"] = fit(b[300], darkGrounds, 4.5, 1);
112
+ D["accent-violet"] = fit(b[400], darkGrounds, 3, 1);
113
+ D["focus-ring"] = fit(b[400], darkGrounds, 3, 1);
114
+ D["bg-selected"] = mix(ZINC[900], b[500], 0.16);
115
+ D["alert-info-bg"] = D["bg-selected"];
116
+ D["alert-info-fg"] = fit(b[300], [D["alert-info-bg"]], 4.5, 1);
117
+ D["alert-info-border"] = mix(ZINC[900], b[400], 0.4);
118
+ D["status-progress-bg"] = b[100];
119
+ D["status-progress-fg"] = L["status-progress-fg"];
120
+ if (s) {
121
+ L["accent-dot"] = s[200];
122
+ L["accent-lime"] = s[200];
123
+ L["mesh-to"] = s[200];
124
+ D["accent-dot"] = s[200];
125
+ D["accent-lime"] = s[200];
126
+ D["mesh-to"] = s[200];
127
+ }
128
+ var shadowLight = INK, shadowDark = D["accent-violet"];
129
+ if (o.primary === "brand") {
130
+ L["button-primary-bg"] = fit(b[600], [ZINC[0]], 4.5, -1);
131
+ L["button-primary-fg"] = ZINC[0];
132
+ L["button-primary-bg-hover"] = fit(b[700], [ZINC[0]], 4.5, -1);
133
+ D["button-primary-bg"] = fit(b[400], [ZINC[900]], 4.5, 1);
134
+ D["button-primary-fg"] = ZINC[900];
135
+ D["button-primary-bg-hover"] = fit(b[300], [ZINC[900]], 4.5, 1);
136
+ }
137
+ L["shadow-creative"] = "4px 4px 0px " + shadowLight;
138
+ L["shadow-creative-hover"] = "6px 6px 0px " + shadowLight;
139
+ L["card-shadow-creative"] = "8px 8px 0px " + shadowLight;
140
+ D["shadow-creative"] = "4px 4px 0px " + shadowDark;
141
+ D["shadow-creative-hover"] = "6px 6px 0px " + shadowDark;
142
+ D["card-shadow-creative"] = "8px 8px 0px " + shadowDark;
143
+ var checks = [];
144
+ function check(theme, fg, bg, target, fgHex, bgHex) {
145
+ var r = contrast(fgHex, bgHex);
146
+ checks.push({ theme, pair: fg + " on " + bg, ratio: Math.round(r * 100) / 100, target, pass: r >= target - 5e-3 });
147
+ }
148
+ [["bg-surface", ZINC[0]], ["bg-canvas", ZINC[50]], ["bg-selected", L["bg-selected"]]].forEach(function(g) {
149
+ check("light", "fg-accent", g[0], 4.5, L["fg-accent"], g[1]);
150
+ check("light", "focus-ring", g[0], 3, L["focus-ring"], g[1]);
151
+ });
152
+ [["bg-surface", ZINC[900]], ["bg-canvas", ZINC[950]], ["bg-selected", D["bg-selected"]]].forEach(function(g) {
153
+ check("dark", "fg-accent", g[0], 4.5, D["fg-accent"], g[1]);
154
+ check("dark", "focus-ring", g[0], 3, D["focus-ring"], g[1]);
155
+ });
156
+ check("light", "fg-primary", "bg-selected", 4.5, INK, L["bg-selected"]);
157
+ check("dark", "fg-primary", "bg-selected", 4.5, "#ffffff", D["bg-selected"]);
158
+ check("light", "status-progress-fg", "status-progress-bg", 4.5, L["status-progress-fg"], L["status-progress-bg"]);
159
+ check("light", "alert-info-fg", "alert-info-bg", 4.5, L["alert-info-fg"], L["alert-info-bg"]);
160
+ check("dark", "alert-info-fg", "alert-info-bg", 4.5, D["alert-info-fg"], D["alert-info-bg"]);
161
+ if (o.primary === "brand") {
162
+ check("light", "button-primary-fg", "button-primary-bg", 4.5, L["button-primary-fg"], L["button-primary-bg"]);
163
+ check("light", "button-primary-fg", "button-primary-bg-hover", 4.5, L["button-primary-fg"], L["button-primary-bg-hover"]);
164
+ check("dark", "button-primary-fg", "button-primary-bg", 4.5, D["button-primary-fg"], D["button-primary-bg"]);
165
+ check("dark", "button-primary-fg", "button-primary-bg-hover", 4.5, D["button-primary-fg"], D["button-primary-bg-hover"]);
166
+ }
167
+ if (s) check("light", "ink", "accent-lime (signal)", 4.5, INK, s[200]);
168
+ function css(selector) {
169
+ var light = selector ? selector : ':root, [data-theme="light"]';
170
+ var dark = selector ? selector + ".dark, .dark " + selector + ", " + selector + '[data-theme="dark"], [data-theme="dark"] ' + selector : '.dark, [data-theme="dark"]';
171
+ function block(sel, m) {
172
+ return sel + " {\n" + Object.keys(m).map(function(k) {
173
+ return " --aura-" + k + ": " + m[k] + ";";
174
+ }).join("\n") + "\n}";
175
+ }
176
+ return "/* AURA theme" + (o.name ? ' "' + o.name + '"' : "") + ": brand " + o.brand + (o.signal ? ", signal " + o.signal : "") + (o.primary === "brand" ? ", brand primary buttons" : "") + ". Load after aura.css. Generated by createTheme. */\n" + block(light, L) + "\n" + block(dark, D) + "\n";
177
+ }
178
+ return { name: o.name || null, brand: b, signal: s, light: L, dark: D, checks, ok: checks.every(function(c) {
179
+ return c.pass;
180
+ }), css };
181
+ }
182
+ export {
183
+ contrast,
184
+ createTheme,
185
+ scale
186
+ };