@mesob/ui 0.2.5 → 0.3.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.
@@ -0,0 +1,17 @@
1
+ /** Hsva: h 0-360, s/v/a 0-1 */
2
+ type Hsva = {
3
+ h: number;
4
+ s: number;
5
+ v: number;
6
+ a: number;
7
+ };
8
+ type ColorFormat = 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla';
9
+ /** Returns true if the string is empty or a parseable color (hex, rgb, rgba, hsl, hsla). */
10
+ declare function isColorValid(value: string | null | undefined): boolean;
11
+ /** Parse color string to Hsva. Falls back to black opaque on parse failure. */
12
+ declare function parseColor(value: string): Hsva;
13
+ /** Format Hsva to string by format. */
14
+ declare function formatColor(hsva: Hsva, format: ColorFormat): string;
15
+ declare function hasAlpha(format: ColorFormat): boolean;
16
+
17
+ export { type ColorFormat, type Hsva, formatColor, hasAlpha, isColorValid, parseColor };
@@ -0,0 +1,205 @@
1
+ // src/lib/color-utils.ts
2
+ function hex2rgb(hex) {
3
+ const n = hex.replace(/^#/, "");
4
+ if (n.length === 3) {
5
+ const r = Number.parseInt(n[0] + n[0], 16);
6
+ const g = Number.parseInt(n[1] + n[1], 16);
7
+ const b = Number.parseInt(n[2] + n[2], 16);
8
+ return [r, g, b];
9
+ }
10
+ return [
11
+ Number.parseInt(n.slice(0, 2), 16),
12
+ Number.parseInt(n.slice(2, 4), 16),
13
+ Number.parseInt(n.slice(4, 6), 16)
14
+ ];
15
+ }
16
+ function rgb2hsv(r, g, b) {
17
+ const rn = r / 255;
18
+ const gn = g / 255;
19
+ const bn = b / 255;
20
+ const max = Math.max(rn, gn, bn);
21
+ const min = Math.min(rn, gn, bn);
22
+ const d = max - min;
23
+ const v = max;
24
+ const s = max === 0 ? 0 : d / max;
25
+ let h = 0;
26
+ if (max !== min) {
27
+ switch (max) {
28
+ case rn:
29
+ h = (gn - bn) / d + (gn < bn ? 6 : 0);
30
+ break;
31
+ case gn:
32
+ h = (bn - rn) / d + 2;
33
+ break;
34
+ default:
35
+ h = (rn - gn) / d + 4;
36
+ }
37
+ h /= 6;
38
+ }
39
+ return [h * 360, s, v];
40
+ }
41
+ function hsv2rgb(h, s, v) {
42
+ const hn = h % 360 / 360;
43
+ const i = Math.floor(hn * 6);
44
+ const f = hn * 6 - i;
45
+ const p = v * (1 - s);
46
+ const q = v * (1 - f * s);
47
+ const t = v * (1 - (1 - f) * s);
48
+ switch (i % 6) {
49
+ case 0:
50
+ return [v * 255, t * 255, p * 255];
51
+ case 1:
52
+ return [q * 255, v * 255, p * 255];
53
+ case 2:
54
+ return [p * 255, v * 255, t * 255];
55
+ case 3:
56
+ return [p * 255, q * 255, v * 255];
57
+ case 4:
58
+ return [t * 255, p * 255, v * 255];
59
+ default: {
60
+ return [v * 255, p * 255, q * 255];
61
+ }
62
+ }
63
+ }
64
+ var RGB_RE = /rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+)\s*)?\)/;
65
+ var HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
66
+ var HSL_RE = /hsla?\s*\(\s*(\d+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%\s*(?:,\s*([\d.]+)\s*)?\)/;
67
+ function isColorValid(value) {
68
+ const t = value?.trim();
69
+ if (t === "" || t == null) {
70
+ return true;
71
+ }
72
+ return HEX_RE.test(t) || RGB_RE.test(t) || HSL_RE.test(t);
73
+ }
74
+ function hsl2rgb(h, s, l) {
75
+ const sn = s / 100;
76
+ const ln = l / 100;
77
+ const c = (1 - Math.abs(2 * ln - 1)) * sn;
78
+ const x = c * (1 - Math.abs(h / 60 % 2 - 1));
79
+ const m = ln - c / 2;
80
+ let r = 0;
81
+ let g = 0;
82
+ let b = 0;
83
+ if (h < 60) {
84
+ r = c;
85
+ g = x;
86
+ } else if (h < 120) {
87
+ r = x;
88
+ g = c;
89
+ } else if (h < 180) {
90
+ g = c;
91
+ b = x;
92
+ } else if (h < 240) {
93
+ g = x;
94
+ b = c;
95
+ } else if (h < 300) {
96
+ r = x;
97
+ b = c;
98
+ } else {
99
+ r = c;
100
+ b = x;
101
+ }
102
+ return [(r + m) * 255, (g + m) * 255, (b + m) * 255];
103
+ }
104
+ function rgb2hsl(r, g, b) {
105
+ const rn = r / 255;
106
+ const gn = g / 255;
107
+ const bn = b / 255;
108
+ const max = Math.max(rn, gn, bn);
109
+ const min = Math.min(rn, gn, bn);
110
+ const d = max - min;
111
+ const l = (max + min) / 2;
112
+ let h = 0;
113
+ let s = 0;
114
+ if (max !== min) {
115
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
116
+ switch (max) {
117
+ case rn:
118
+ h = (gn - bn) / d + (gn < bn ? 6 : 0);
119
+ break;
120
+ case gn:
121
+ h = (bn - rn) / d + 2;
122
+ break;
123
+ default:
124
+ h = (rn - gn) / d + 4;
125
+ }
126
+ h /= 6;
127
+ }
128
+ return [h * 360, s * 100, l * 100];
129
+ }
130
+ function parseColor(value) {
131
+ const fallback = { h: 0, s: 0, v: 0, a: 1 };
132
+ const trimmed = value?.trim();
133
+ if (!trimmed) {
134
+ return fallback;
135
+ }
136
+ const hex = HEX_RE.exec(trimmed);
137
+ if (hex) {
138
+ const part = hex[1];
139
+ const [r, g, b] = part.length <= 4 ? hex2rgb(part) : [
140
+ Number.parseInt(part.slice(0, 2), 16),
141
+ Number.parseInt(part.slice(2, 4), 16),
142
+ Number.parseInt(part.slice(4, 6), 16)
143
+ ];
144
+ const a = part.length === 8 ? Number.parseInt(part.slice(6, 8), 16) / 255 : 1;
145
+ const [h, s, vv] = rgb2hsv(r, g, b);
146
+ return { h, s, v: vv, a };
147
+ }
148
+ const rgb = RGB_RE.exec(trimmed);
149
+ if (rgb) {
150
+ const r = Number(rgb[1]);
151
+ const g = Number(rgb[2]);
152
+ const b = Number(rgb[3]);
153
+ const a = rgb[4] != null ? Number(rgb[4]) : 1;
154
+ const [h, s, vv] = rgb2hsv(r, g, b);
155
+ return { h, s, v: vv, a };
156
+ }
157
+ const hsl = HSL_RE.exec(trimmed);
158
+ if (hsl) {
159
+ const h = Number(hsl[1]);
160
+ const s = Number(hsl[2]);
161
+ const l = Number(hsl[3]);
162
+ const a = hsl[4] != null ? Number(hsl[4]) : 1;
163
+ const [r, g, b] = hsl2rgb(h, s, l);
164
+ const [hh, ss, vv] = rgb2hsv(r, g, b);
165
+ return { h: hh, s: ss, v: vv, a };
166
+ }
167
+ return fallback;
168
+ }
169
+ function formatColor(hsva, format) {
170
+ const [r, g, b] = hsv2rgb(hsva.h, hsva.s, hsva.v);
171
+ const rr = Math.round(r);
172
+ const gg = Math.round(g);
173
+ const bb = Math.round(b);
174
+ const a = hsva.a;
175
+ switch (format) {
176
+ case "hex":
177
+ return `#${[rr, gg, bb].map((x) => x.toString(16).padStart(2, "0")).join("")}`;
178
+ case "hexa":
179
+ return `#${[rr, gg, bb, Math.round(a * 255)].map((x) => x.toString(16).padStart(2, "0")).join("")}`;
180
+ case "rgb":
181
+ return `rgb(${rr}, ${gg}, ${bb})`;
182
+ case "rgba":
183
+ return `rgba(${rr}, ${gg}, ${bb}, ${a})`;
184
+ case "hsl": {
185
+ const [h, s, l] = rgb2hsl(rr, gg, bb);
186
+ return `hsl(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(l)}%)`;
187
+ }
188
+ case "hsla": {
189
+ const [h, s, l] = rgb2hsl(rr, gg, bb);
190
+ return `hsla(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(l)}%, ${a})`;
191
+ }
192
+ default:
193
+ return formatColor(hsva, "hex");
194
+ }
195
+ }
196
+ function hasAlpha(format) {
197
+ return format === "hexa" || format === "rgba" || format === "hsla";
198
+ }
199
+ export {
200
+ formatColor,
201
+ hasAlpha,
202
+ isColorValid,
203
+ parseColor
204
+ };
205
+ //# sourceMappingURL=color-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/color-utils.ts"],"sourcesContent":["/** Hsva: h 0-360, s/v/a 0-1 */\nexport type Hsva = { h: number; s: number; v: number; a: number };\n\nexport type ColorFormat = 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla';\n\nfunction hex2rgb(hex: string): [number, number, number] {\n const n = hex.replace(/^#/, '');\n if (n.length === 3) {\n const r = Number.parseInt(n[0] + n[0], 16);\n const g = Number.parseInt(n[1] + n[1], 16);\n const b = Number.parseInt(n[2] + n[2], 16);\n return [r, g, b];\n }\n return [\n Number.parseInt(n.slice(0, 2), 16),\n Number.parseInt(n.slice(2, 4), 16),\n Number.parseInt(n.slice(4, 6), 16),\n ];\n}\n\nfunction rgb2hsv(r: number, g: number, b: number): [number, number, number] {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const d = max - min;\n const v = max;\n const s = max === 0 ? 0 : d / max;\n let h = 0;\n if (max !== min) {\n switch (max) {\n case rn:\n h = (gn - bn) / d + (gn < bn ? 6 : 0);\n break;\n case gn:\n h = (bn - rn) / d + 2;\n break;\n default:\n h = (rn - gn) / d + 4;\n }\n h /= 6;\n }\n return [h * 360, s, v];\n}\n\nfunction hsv2rgb(h: number, s: number, v: number): [number, number, number] {\n const hn = (h % 360) / 360;\n const i = Math.floor(hn * 6);\n const f = hn * 6 - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n switch (i % 6) {\n case 0:\n return [v * 255, t * 255, p * 255];\n case 1:\n return [q * 255, v * 255, p * 255];\n case 2:\n return [p * 255, v * 255, t * 255];\n case 3:\n return [p * 255, q * 255, v * 255];\n case 4:\n return [t * 255, p * 255, v * 255];\n default: {\n return [v * 255, p * 255, q * 255];\n }\n }\n}\n\nconst RGB_RE =\n /rgba?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/;\nconst HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst HSL_RE =\n /hsla?\\s*\\(\\s*(\\d+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%\\s*(?:,\\s*([\\d.]+)\\s*)?\\)/;\n\n/** Returns true if the string is empty or a parseable color (hex, rgb, rgba, hsl, hsla). */\nexport function isColorValid(value: string | null | undefined): boolean {\n const t = value?.trim();\n if (t === '' || t == null) {\n return true;\n }\n return HEX_RE.test(t) || RGB_RE.test(t) || HSL_RE.test(t);\n}\n\nfunction hsl2rgb(h: number, s: number, l: number): [number, number, number] {\n const sn = s / 100;\n const ln = l / 100;\n const c = (1 - Math.abs(2 * ln - 1)) * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = ln - c / 2;\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n return [(r + m) * 255, (g + m) * 255, (b + m) * 255];\n}\n\nfunction rgb2hsl(r: number, g: number, b: number): [number, number, number] {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const d = max - min;\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n if (max !== min) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rn:\n h = (gn - bn) / d + (gn < bn ? 6 : 0);\n break;\n case gn:\n h = (bn - rn) / d + 2;\n break;\n default:\n h = (rn - gn) / d + 4;\n }\n h /= 6;\n }\n return [h * 360, s * 100, l * 100];\n}\n\n/** Parse color string to Hsva. Falls back to black opaque on parse failure. */\nexport function parseColor(value: string): Hsva {\n const fallback: Hsva = { h: 0, s: 0, v: 0, a: 1 };\n const trimmed = value?.trim();\n if (!trimmed) {\n return fallback;\n }\n\n const hex = HEX_RE.exec(trimmed);\n if (hex) {\n const part = hex[1];\n const [r, g, b] =\n part.length <= 4\n ? hex2rgb(part)\n : [\n Number.parseInt(part.slice(0, 2), 16),\n Number.parseInt(part.slice(2, 4), 16),\n Number.parseInt(part.slice(4, 6), 16),\n ];\n const a =\n part.length === 8 ? Number.parseInt(part.slice(6, 8), 16) / 255 : 1;\n const [h, s, vv] = rgb2hsv(r, g, b);\n return { h, s, v: vv, a };\n }\n\n const rgb = RGB_RE.exec(trimmed);\n if (rgb) {\n const r = Number(rgb[1]);\n const g = Number(rgb[2]);\n const b = Number(rgb[3]);\n const a = rgb[4] != null ? Number(rgb[4]) : 1;\n const [h, s, vv] = rgb2hsv(r, g, b);\n return { h, s, v: vv, a };\n }\n\n const hsl = HSL_RE.exec(trimmed);\n if (hsl) {\n const h = Number(hsl[1]);\n const s = Number(hsl[2]);\n const l = Number(hsl[3]);\n const a = hsl[4] != null ? Number(hsl[4]) : 1;\n const [r, g, b] = hsl2rgb(h, s, l);\n const [hh, ss, vv] = rgb2hsv(r, g, b);\n return { h: hh, s: ss, v: vv, a };\n }\n\n return fallback;\n}\n\n/** Format Hsva to string by format. */\nexport function formatColor(hsva: Hsva, format: ColorFormat): string {\n const [r, g, b] = hsv2rgb(hsva.h, hsva.s, hsva.v);\n const rr = Math.round(r);\n const gg = Math.round(g);\n const bb = Math.round(b);\n const a = hsva.a;\n\n switch (format) {\n case 'hex':\n return `#${[rr, gg, bb].map((x) => x.toString(16).padStart(2, '0')).join('')}`;\n case 'hexa':\n return `#${[rr, gg, bb, Math.round(a * 255)].map((x) => x.toString(16).padStart(2, '0')).join('')}`;\n case 'rgb':\n return `rgb(${rr}, ${gg}, ${bb})`;\n case 'rgba':\n return `rgba(${rr}, ${gg}, ${bb}, ${a})`;\n case 'hsl': {\n const [h, s, l] = rgb2hsl(rr, gg, bb);\n return `hsl(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(l)}%)`;\n }\n case 'hsla': {\n const [h, s, l] = rgb2hsl(rr, gg, bb);\n return `hsla(${Math.round(h)}, ${Math.round(s)}%, ${Math.round(l)}%, ${a})`;\n }\n default:\n return formatColor(hsva, 'hex');\n }\n}\n\nexport function hasAlpha(format: ColorFormat): boolean {\n return format === 'hexa' || format === 'rgba' || format === 'hsla';\n}\n"],"mappings":"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","names":[]}
@@ -6,11 +6,12 @@ type Locale = {
6
6
  };
7
7
  type Translation = (key: string) => string;
8
8
  declare const DEFAULT_LANGUAGE = "en";
9
- declare const SUPPORTED_LANGUAGES: {
9
+ type SupportedLanguage = {
10
10
  value: string;
11
11
  label: string;
12
12
  key: string;
13
- }[];
13
+ };
14
+ declare const SUPPORTED_LANGUAGES: SupportedLanguage[];
14
15
  declare const LOCALE_INPUT_DEFAULT: {
15
16
  [k: string]: string;
16
17
  };
@@ -34,4 +35,4 @@ declare const LOCALE_OPTIONAL_INPUT_SCHEMA: z.ZodObject<SchemaAccumulator, z.Unk
34
35
  [x: string]: any;
35
36
  }>;
36
37
 
37
- export { DEFAULT_LANGUAGE, LOCALE_INPUT_DEFAULT, LOCALE_OPTIONAL_INPUT_SCHEMA, LOCALE_REQUIRED_INPUT_SCHEMA, type Locale, type LocaleKey, SUPPORTED_LANGUAGES, type Translation, createLocalInputSchema, createLocalRequiredInputSchema };
38
+ export { DEFAULT_LANGUAGE, LOCALE_INPUT_DEFAULT, LOCALE_OPTIONAL_INPUT_SCHEMA, LOCALE_REQUIRED_INPUT_SCHEMA, type Locale, type LocaleKey, SUPPORTED_LANGUAGES, type SupportedLanguage, type Translation, createLocalInputSchema, createLocalRequiredInputSchema };
@@ -3,8 +3,7 @@ import { z } from "zod";
3
3
  var DEFAULT_LANGUAGE = "en";
4
4
  var SUPPORTED_LANGUAGES = [
5
5
  { value: "en", label: "English", key: "En" },
6
- { value: "am", label: "\u12A0\u121B\u122D\u129B", key: "\u12A0\u121B" },
7
- { value: "ar", label: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", key: "\u0627\u0644" }
6
+ { value: "am", label: "\u12A0\u121B\u122D\u129B", key: "\u12A0\u121B" }
8
7
  ];
9
8
  var LOCALE_INPUT_DEFAULT = Object.fromEntries(
10
9
  SUPPORTED_LANGUAGES.map(({ value }) => [value, ""])
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/locale.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport const SUPPORTED_LANGUAGES = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n { value: 'ar', label: 'العربية', key: 'ال' },\n];\n\nexport const LOCALE_INPUT_DEFAULT = Object.fromEntries(\n SUPPORTED_LANGUAGES.map(({ value }) => [value, '']),\n);\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n SUPPORTED_LANGUAGES.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === DEFAULT_LANGUAGE ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n validation: z.ZodTypeAny,\n): z.ZodEffects<z.ZodObject<SchemaAccumulator>> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n SUPPORTED_LANGUAGES.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of SUPPORTED_LANGUAGES) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = createLocalRequiredInputSchema(\n z.string().optional(),\n);\n\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = createLocalInputSchema(\n z.string().optional(),\n z.string().optional(),\n);\n"],"mappings":";AAAA,SAAS,SAAS;AAUX,IAAM,mBAAmB;AAEzB,IAAM,sBAAsB;AAAA,EACjC,EAAE,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AAAA,EAC3C,EAAE,OAAO,MAAM,OAAO,4BAAQ,KAAK,eAAK;AAAA,EACxC,EAAE,OAAO,MAAM,OAAO,8CAAW,KAAK,eAAK;AAC7C;AAEO,IAAM,uBAAuB,OAAO;AAAA,EACzC,oBAAoB,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;AACpD;AAMO,SAAS,uBACd,mBACA,iBACgC;AAChC,QAAM,mBACJ,oBAAoB,OAAO,CAAC,KAAwB,EAAE,MAAM,MAAM;AAChE,QAAI,KAAK,IACP,UAAU,mBAAmB,oBAAoB;AACnD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEP,SAAO,EAAE,OAAO,gBAAgB;AAClC;AAEO,SAAS,+BACd,YAC8C;AAC9C,QAAM,mBACJ,oBAAoB,OAAO,CAAC,KAAwB,EAAE,MAAM,MAAM;AAChE,QAAI,KAAK,IAAI;AACb,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEP,SAAO,EAAE,OAAO,gBAAgB,EAAE,YAAY,CAAC,MAAM,QAAQ;AAC3D,UAAM,WAAW,OAAO,OAAO,IAAI,EAAE;AAAA,MACnC,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,IAChE;AAEA,QAAI,CAAC,UAAU;AACb,iBAAW,EAAE,MAAM,KAAK,qBAAqB;AAC3C,YAAI,SAAS;AAAA,UACX,MAAM,EAAE,aAAa;AAAA,UACrB,SAAS;AAAA,UACT,MAAM,CAAC,KAAK;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,IAAM,+BAA+B;AAAA,EAC1C,EAAE,OAAO,EAAE,SAAS;AACtB;AAEO,IAAM,+BAA+B;AAAA,EAC1C,EAAE,OAAO,EAAE,SAAS;AAAA,EACpB,EAAE,OAAO,EAAE,SAAS;AACtB;","names":[]}
1
+ {"version":3,"sources":["../../src/lib/locale.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type LocaleKey = 'am' | 'en' | 'om' | 'ti' | 'so' | 'sw' | 'fr' | 'ar';\n\nexport type Locale = {\n [key in LocaleKey | string]?: string;\n};\n\nexport type Translation = (key: string) => string;\n\nexport const DEFAULT_LANGUAGE = 'en';\n\nexport type SupportedLanguage = { value: string; label: string; key: string };\n\nexport const SUPPORTED_LANGUAGES: SupportedLanguage[] = [\n { value: 'en', label: 'English', key: 'En' },\n { value: 'am', label: 'አማርኛ', key: 'አማ' },\n];\n\nexport const LOCALE_INPUT_DEFAULT = Object.fromEntries(\n SUPPORTED_LANGUAGES.map(({ value }) => [value, '']),\n);\n\ntype SchemaAccumulator = {\n [key: string]: z.ZodTypeAny;\n};\n\nexport function createLocalInputSchema(\n defaultValidation: z.ZodTypeAny,\n otherValidation: z.ZodTypeAny,\n): z.ZodObject<SchemaAccumulator> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n SUPPORTED_LANGUAGES.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] =\n value === DEFAULT_LANGUAGE ? defaultValidation : otherValidation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition);\n}\n\nexport function createLocalRequiredInputSchema(\n validation: z.ZodTypeAny,\n): z.ZodEffects<z.ZodObject<SchemaAccumulator>> {\n const schemaDefinition: { [key: string]: z.ZodTypeAny } =\n SUPPORTED_LANGUAGES.reduce((acc: SchemaAccumulator, { value }) => {\n acc[value] = validation;\n return acc;\n }, {});\n\n return z.object(schemaDefinition).superRefine((data, ctx) => {\n const hasValue = Object.values(data).some(\n (value) => typeof value === 'string' && value.trim().length > 0,\n );\n\n if (!hasValue) {\n for (const { value } of SUPPORTED_LANGUAGES) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'field is required',\n path: [value],\n });\n }\n }\n });\n}\n\nexport const LOCALE_REQUIRED_INPUT_SCHEMA = createLocalRequiredInputSchema(\n z.string().optional(),\n);\n\nexport const LOCALE_OPTIONAL_INPUT_SCHEMA = createLocalInputSchema(\n z.string().optional(),\n z.string().optional(),\n);\n"],"mappings":";AAAA,SAAS,SAAS;AAUX,IAAM,mBAAmB;AAIzB,IAAM,sBAA2C;AAAA,EACtD,EAAE,OAAO,MAAM,OAAO,WAAW,KAAK,KAAK;AAAA,EAC3C,EAAE,OAAO,MAAM,OAAO,4BAAQ,KAAK,eAAK;AAC1C;AAEO,IAAM,uBAAuB,OAAO;AAAA,EACzC,oBAAoB,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;AACpD;AAMO,SAAS,uBACd,mBACA,iBACgC;AAChC,QAAM,mBACJ,oBAAoB,OAAO,CAAC,KAAwB,EAAE,MAAM,MAAM;AAChE,QAAI,KAAK,IACP,UAAU,mBAAmB,oBAAoB;AACnD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEP,SAAO,EAAE,OAAO,gBAAgB;AAClC;AAEO,SAAS,+BACd,YAC8C;AAC9C,QAAM,mBACJ,oBAAoB,OAAO,CAAC,KAAwB,EAAE,MAAM,MAAM;AAChE,QAAI,KAAK,IAAI;AACb,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEP,SAAO,EAAE,OAAO,gBAAgB,EAAE,YAAY,CAAC,MAAM,QAAQ;AAC3D,UAAM,WAAW,OAAO,OAAO,IAAI,EAAE;AAAA,MACnC,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,IAChE;AAEA,QAAI,CAAC,UAAU;AACb,iBAAW,EAAE,MAAM,KAAK,qBAAqB;AAC3C,YAAI,SAAS;AAAA,UACX,MAAM,EAAE,aAAa;AAAA,UACrB,SAAS;AAAA,UACT,MAAM,CAAC,KAAK;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,IAAM,+BAA+B;AAAA,EAC1C,EAAE,OAAO,EAAE,SAAS;AACtB;AAEO,IAAM,+BAA+B;AAAA,EAC1C,EAAE,OAAO,EAAE,SAAS;AAAA,EACpB,EAAE,OAAO,EAAE,SAAS;AACtB;","names":[]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Theme configuration and building logic.
3
+ * Converts user config (hex color + base color) into CSS variables.
4
+ */
5
+ type StyleName = 'vega' | 'nova' | 'maia' | 'lyra' | 'mira';
6
+ type ThemeConfig = {
7
+ color: string;
8
+ baseColor?: 'neutral' | 'zinc' | 'stone' | 'gray';
9
+ style?: StyleName;
10
+ radius?: 'default' | 'none' | 'small' | 'medium' | 'large';
11
+ };
12
+ type ThemeVars = {
13
+ light: Record<string, string>;
14
+ dark: Record<string, string>;
15
+ };
16
+ /**
17
+ * Build theme CSS variables from config.
18
+ * Merges base color with primary color derived from user hex.
19
+ */
20
+ declare function buildTheme(config: ThemeConfig): ThemeVars;
21
+
22
+ export { type StyleName, type ThemeConfig, type ThemeVars, buildTheme };