@zenky/storefront-vue 0.9.47 → 0.10.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.
Files changed (98) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE.md +2 -2
  3. package/README.md +213 -6
  4. package/dist/cart/index.d.ts +588 -0
  5. package/dist/cart/index.js +12 -0
  6. package/dist/cart/index.js.map +1 -0
  7. package/dist/catalog/index.d.ts +73 -0
  8. package/dist/catalog/index.js +4 -0
  9. package/dist/catalog/index.js.map +1 -0
  10. package/dist/chunk-57IOMDAM.js +38 -0
  11. package/dist/chunk-57IOMDAM.js.map +1 -0
  12. package/dist/chunk-5QCUH3FF.js +15 -0
  13. package/dist/chunk-5QCUH3FF.js.map +1 -0
  14. package/dist/chunk-7FRMMCR5.js +93 -0
  15. package/dist/chunk-7FRMMCR5.js.map +1 -0
  16. package/dist/chunk-BWUKMWHL.js +45 -0
  17. package/dist/chunk-BWUKMWHL.js.map +1 -0
  18. package/dist/chunk-E3G7NGCH.js +45 -0
  19. package/dist/chunk-E3G7NGCH.js.map +1 -0
  20. package/dist/chunk-EMGQXBU3.js +3 -0
  21. package/dist/chunk-EMGQXBU3.js.map +1 -0
  22. package/dist/chunk-FFBZKQRV.js +393 -0
  23. package/dist/chunk-FFBZKQRV.js.map +1 -0
  24. package/dist/chunk-G2X4SBCO.js +2011 -0
  25. package/dist/chunk-G2X4SBCO.js.map +1 -0
  26. package/dist/chunk-GLTOJTZO.js +41 -0
  27. package/dist/chunk-GLTOJTZO.js.map +1 -0
  28. package/dist/chunk-GW2QNTAD.js +327 -0
  29. package/dist/chunk-GW2QNTAD.js.map +1 -0
  30. package/dist/chunk-JLFBAAFT.js +566 -0
  31. package/dist/chunk-JLFBAAFT.js.map +1 -0
  32. package/dist/chunk-MZ66ARDL.js +244 -0
  33. package/dist/chunk-MZ66ARDL.js.map +1 -0
  34. package/dist/chunk-N3NOTJUC.js +111 -0
  35. package/dist/chunk-N3NOTJUC.js.map +1 -0
  36. package/dist/chunk-RO25KNM5.js +36 -0
  37. package/dist/chunk-RO25KNM5.js.map +1 -0
  38. package/dist/chunk-RYYY7MVP.js +102 -0
  39. package/dist/chunk-RYYY7MVP.js.map +1 -0
  40. package/dist/chunk-TEG7EL4N.js +106 -0
  41. package/dist/chunk-TEG7EL4N.js.map +1 -0
  42. package/dist/chunk-V3VVDQIR.js +27 -0
  43. package/dist/chunk-V3VVDQIR.js.map +1 -0
  44. package/dist/chunk-XUGXLJZB.js +14 -0
  45. package/dist/chunk-XUGXLJZB.js.map +1 -0
  46. package/dist/chunk-Z3IW4ODZ.js +36 -0
  47. package/dist/chunk-Z3IW4ODZ.js.map +1 -0
  48. package/dist/index.d.ts +26 -0
  49. package/dist/index.js +21 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/layout/index.d.ts +54 -0
  52. package/dist/layout/index.js +106 -0
  53. package/dist/layout/index.js.map +1 -0
  54. package/dist/money/index.d.ts +26 -0
  55. package/dist/money/index.js +3 -0
  56. package/dist/money/index.js.map +1 -0
  57. package/dist/order/index.d.ts +34 -0
  58. package/dist/order/index.js +209 -0
  59. package/dist/order/index.js.map +1 -0
  60. package/dist/pagination/index.d.ts +87 -0
  61. package/dist/pagination/index.js +97 -0
  62. package/dist/pagination/index.js.map +1 -0
  63. package/dist/ports/index.d.ts +124 -0
  64. package/dist/ports/index.js +3 -0
  65. package/dist/ports/index.js.map +1 -0
  66. package/dist/products/index.d.ts +105 -0
  67. package/dist/products/index.js +7 -0
  68. package/dist/products/index.js.map +1 -0
  69. package/dist/promotions/index.d.ts +10 -0
  70. package/dist/promotions/index.js +7 -0
  71. package/dist/promotions/index.js.map +1 -0
  72. package/dist/schedule-Dd3zwHEb.d.ts +27 -0
  73. package/dist/seo/index.d.ts +91 -0
  74. package/dist/seo/index.js +289 -0
  75. package/dist/seo/index.js.map +1 -0
  76. package/dist/snippets/index.d.ts +17 -0
  77. package/dist/snippets/index.js +3 -0
  78. package/dist/snippets/index.js.map +1 -0
  79. package/dist/snippets-BC5bkSjm.d.ts +23 -0
  80. package/dist/stores/index.d.ts +196 -0
  81. package/dist/stores/index.js +8 -0
  82. package/dist/stores/index.js.map +1 -0
  83. package/dist/theme/index.d.ts +60 -0
  84. package/dist/theme/index.js +3 -0
  85. package/dist/theme/index.js.map +1 -0
  86. package/dist/utils/index.d.ts +66 -0
  87. package/dist/utils/index.js +4 -0
  88. package/dist/utils/index.js.map +1 -0
  89. package/dist/website-settings/index.d.ts +38 -0
  90. package/dist/website-settings/index.js +3 -0
  91. package/dist/website-settings/index.js.map +1 -0
  92. package/docs/consumer-setup.md +275 -0
  93. package/docs/ports.md +144 -0
  94. package/docs/releasing.md +46 -0
  95. package/package.json +143 -47
  96. package/dist/cjs/index.cjs +0 -3742
  97. package/dist/esm/index.mjs +0 -3642
  98. package/dist/zenky.d.ts +0 -10377
@@ -0,0 +1,327 @@
1
+ import { computed } from 'vue';
2
+
3
+ // src/theme/colors.ts
4
+ function hexToHsl(hex) {
5
+ const clean = hex.replace("#", "");
6
+ const r = parseInt(clean.substring(0, 2), 16) / 255;
7
+ const g = parseInt(clean.substring(2, 4), 16) / 255;
8
+ const b = parseInt(clean.substring(4, 6), 16) / 255;
9
+ const max = Math.max(r, g, b);
10
+ const min = Math.min(r, g, b);
11
+ const l = (max + min) / 2;
12
+ if (max === min) {
13
+ return { h: 0, s: 0, l };
14
+ }
15
+ const d = max - min;
16
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
17
+ let h = 0;
18
+ if (max === r) {
19
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
20
+ } else if (max === g) {
21
+ h = ((b - r) / d + 2) / 6;
22
+ } else {
23
+ h = ((r - g) / d + 4) / 6;
24
+ }
25
+ return { h, s, l };
26
+ }
27
+ function hslToHex(hsl) {
28
+ const { h, s, l } = hsl;
29
+ if (s === 0) {
30
+ const v = Math.round(l * 255);
31
+ return `#${v.toString(16).padStart(2, "0").repeat(3)}`;
32
+ }
33
+ const hue2rgb = (p2, q2, t) => {
34
+ let tt = t;
35
+ if (tt < 0) tt += 1;
36
+ if (tt > 1) tt -= 1;
37
+ if (tt < 1 / 6) return p2 + (q2 - p2) * 6 * tt;
38
+ if (tt < 1 / 2) return q2;
39
+ if (tt < 2 / 3) return p2 + (q2 - p2) * (2 / 3 - tt) * 6;
40
+ return p2;
41
+ };
42
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
43
+ const p = 2 * l - q;
44
+ const r = Math.round(hue2rgb(p, q, h + 1 / 3) * 255);
45
+ const g = Math.round(hue2rgb(p, q, h) * 255);
46
+ const b = Math.round(hue2rgb(p, q, h - 1 / 3) * 255);
47
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
48
+ }
49
+ function mixColors(hex1, hex2, amount) {
50
+ const c1 = hexToHsl(hex1);
51
+ const c2 = hexToHsl(hex2);
52
+ const t = amount / 100;
53
+ let h;
54
+ if (c1.s === 0 && c2.s === 0) {
55
+ h = 0;
56
+ } else if (c1.s === 0) {
57
+ h = c2.h;
58
+ } else if (c2.s === 0) {
59
+ h = c1.h;
60
+ } else {
61
+ let dh = c2.h - c1.h;
62
+ if (dh > 0.5) dh -= 1;
63
+ if (dh < -0.5) dh += 1;
64
+ h = c1.h + dh * t;
65
+ if (h < 0) h += 1;
66
+ if (h > 1) h -= 1;
67
+ }
68
+ return hslToHex({
69
+ h,
70
+ s: c1.s + (c2.s - c1.s) * t,
71
+ l: c1.l + (c2.l - c1.l) * t
72
+ });
73
+ }
74
+ function mixColorsRgb(hex1, hex2, amount) {
75
+ const c1 = hex1.replace("#", "");
76
+ const c2 = hex2.replace("#", "");
77
+ const t = amount / 100;
78
+ const r1 = parseInt(c1.substring(0, 2), 16);
79
+ const g1 = parseInt(c1.substring(2, 4), 16);
80
+ const b1 = parseInt(c1.substring(4, 6), 16);
81
+ const r2 = parseInt(c2.substring(0, 2), 16);
82
+ const g2 = parseInt(c2.substring(2, 4), 16);
83
+ const b2 = parseInt(c2.substring(4, 6), 16);
84
+ const r = Math.round(r1 + (r2 - r1) * t);
85
+ const g = Math.round(g1 + (g2 - g1) * t);
86
+ const b = Math.round(b1 + (b2 - b1) * t);
87
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
88
+ }
89
+ function adjustLightness(hex, delta) {
90
+ const hsl = hexToHsl(hex);
91
+ return hslToHex({
92
+ h: hsl.h,
93
+ s: hsl.s,
94
+ l: Math.min(1, Math.max(0, hsl.l + delta))
95
+ });
96
+ }
97
+ function getContrastColor(hex) {
98
+ const clean = hex.replace("#", "");
99
+ const r = parseInt(clean.substring(0, 2), 16) / 255;
100
+ const g = parseInt(clean.substring(2, 4), 16) / 255;
101
+ const b = parseInt(clean.substring(4, 6), 16) / 255;
102
+ const toLinear = (c) => c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
103
+ const luminance = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
104
+ return luminance > 0.4 ? "#1a1a1a" : "#ffffff";
105
+ }
106
+ function generateShades(hex, bg = "#ffffff", text = "#000000") {
107
+ return generatePrimaryShades(hex, bg, text);
108
+ }
109
+ function generatePrimaryShades(hex, bg = "#ffffff", text = "#000000") {
110
+ const hsl = hexToHsl(hex);
111
+ const clamp = (v) => Math.min(1, Math.max(0, v));
112
+ const isVeryDark = hsl.l < 0.15;
113
+ const dark = isVeryDark ? clamp(hsl.l + 0.12) : clamp(hsl.l * 0.85);
114
+ const darker = isVeryDark ? clamp(hsl.l + 0.08) : clamp(hsl.l * 0.65);
115
+ const darkest = isVeryDark ? clamp(hsl.l + 0.05) : clamp(hsl.l * 0.45);
116
+ return {
117
+ lightest: hslToHex({ h: hsl.h, s: hsl.s * 0.3, l: clamp(0.92) }),
118
+ lighter: hslToHex({ h: hsl.h, s: hsl.s * 0.5, l: clamp(0.8) }),
119
+ light: hslToHex({ h: hsl.h, s: hsl.s * 0.7, l: clamp(hsl.l + (1 - hsl.l) * 0.4) }),
120
+ base: hex,
121
+ dark: hslToHex({ h: hsl.h, s: hsl.s, l: dark }),
122
+ darker: hslToHex({ h: hsl.h, s: hsl.s, l: darker }),
123
+ darkest: hslToHex({ h: hsl.h, s: hsl.s, l: darkest }),
124
+ tint: mixColorsRgb(bg, hex, 14),
125
+ tintHover: mixColorsRgb(mixColorsRgb(bg, hex, 14), bg, 34),
126
+ tintPressed: mixColorsRgb(bg, hex, 5),
127
+ ink: mixColorsRgb(text, hex, 44)
128
+ };
129
+ }
130
+ function buildCssVariableMap(config) {
131
+ const bg = config.background;
132
+ const text = config.text;
133
+ const shades = generatePrimaryShades(config.primary, bg, text);
134
+ const secondaryShades = generateShades(config.secondary, bg, text);
135
+ const vars = {
136
+ // Primary palette
137
+ "--zenky-primary-lightest": shades.lightest,
138
+ "--zenky-primary-lighter": shades.lighter,
139
+ "--zenky-primary-light": shades.light,
140
+ "--zenky-primary": shades.base,
141
+ "--zenky-primary-dark": shades.dark,
142
+ "--zenky-primary-darker": shades.darker,
143
+ "--zenky-primary-darkest": shades.darkest,
144
+ "--zenky-primary-tint": shades.tint,
145
+ "--zenky-primary-tint-hover": shades.tintHover,
146
+ "--zenky-primary-tint-pressed": shades.tintPressed,
147
+ "--zenky-primary-ink": shades.ink,
148
+ // Secondary palette
149
+ "--zenky-secondary-lightest": secondaryShades.lightest,
150
+ "--zenky-secondary-lighter": secondaryShades.lighter,
151
+ "--zenky-secondary-light": secondaryShades.light,
152
+ "--zenky-secondary": secondaryShades.base,
153
+ "--zenky-secondary-dark": secondaryShades.dark,
154
+ "--zenky-secondary-darker": secondaryShades.darker,
155
+ "--zenky-secondary-darkest": secondaryShades.darkest,
156
+ // Auto-contrast for secondary
157
+ "--zenky-on-secondary": getContrastColor(config.secondary),
158
+ // Accent
159
+ "--zenky-accent": config.accent,
160
+ "--zenky-accent-tint": mixColorsRgb(bg, config.accent, 14),
161
+ "--zenky-accent-tint-hover": mixColorsRgb(mixColorsRgb(bg, config.accent, 14), bg, 34),
162
+ "--zenky-accent-tint-pressed": mixColorsRgb(bg, config.accent, 5),
163
+ "--zenky-accent-ink": mixColorsRgb(text, config.accent, 44),
164
+ "--zenky-bg": bg,
165
+ "--zenky-text": text,
166
+ // Цвет текста поверх primary: ручная настройка или авто-контраст
167
+ "--zenky-on-primary": config.onPrimary || getContrastColor(config.primary),
168
+ "--zenky-on-accent": getContrastColor(config.accent),
169
+ // Derived text shades
170
+ "--zenky-text-muted": mixColors(bg, text, 50),
171
+ "--zenky-text-light": mixColors(bg, text, 35),
172
+ // Derived borders
173
+ "--zenky-border-light": mixColors(bg, text, 6),
174
+ "--zenky-border": mixColors(bg, text, 12),
175
+ "--zenky-border-strong": mixColors(bg, text, 35),
176
+ // Derived surfaces
177
+ "--zenky-surface-secondary": mixColors(bg, text, 5),
178
+ "--zenky-surface-secondary-hover": mixColors(bg, text, 10),
179
+ "--zenky-surface-active": mixColors(bg, config.primary, 8),
180
+ "--zenky-surface-dark": getContrastColor(bg) === "#ffffff" ? adjustLightness(bg, 0.08) : adjustLightness(text, -0.1),
181
+ "--zenky-control-active": mixColors(bg, text, 80),
182
+ "--zenky-surface-elevated": adjustLightness(bg, 0.06),
183
+ // Status (defaults if not provided)
184
+ "--zenky-success": config.success ?? "#22c55e",
185
+ "--zenky-danger": config.danger ?? "#ef4444",
186
+ "--zenky-warning": config.warning ?? "#f59e0b",
187
+ "--zenky-info": config.info ?? "#3b82f6",
188
+ // Component semantic (auto-derived with optional overrides)
189
+ "--zenky-header-bg": config.headerBg ?? adjustLightness(bg, -0.02),
190
+ "--zenky-nav-bg": config.headerBg ?? adjustLightness(bg, -0.02),
191
+ "--zenky-footer-bg": config.footerBg ?? adjustLightness(bg, -0.03),
192
+ "--zenky-footer-text": config.footerText ?? mixColors(bg, text, 70),
193
+ "--zenky-footer-text-muted": config.footerTextMuted ?? mixColors(bg, text, 40)
194
+ };
195
+ return vars;
196
+ }
197
+ function useTheme(colorConfig, fontConfig) {
198
+ const cssVariables = computed(() => {
199
+ const vars = buildCssVariableMap(colorConfig);
200
+ if (fontConfig.family) {
201
+ const stack = `'${fontConfig.family}', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif`;
202
+ vars["--zenky-font-sans"] = stack;
203
+ }
204
+ return vars;
205
+ });
206
+ const fontFamily = computed(() => fontConfig.family || null);
207
+ const fontUrl = computed(() => fontConfig.url || null);
208
+ return {
209
+ cssVariables,
210
+ fontFamily,
211
+ fontUrl
212
+ };
213
+ }
214
+
215
+ // src/theme/presets.ts
216
+ var THEME_PRESETS = [
217
+ {
218
+ id: "yarollov",
219
+ label: "Yarollov",
220
+ description: "\u0424\u0438\u0440\u043C\u0435\u043D\u043D\u044B\u0439 \u0431\u0440\u0435\u043D\u0434 \u2014 \u043C\u0430\u043B\u0438\u043D\u043E\u0432\u044B\u0439 primary, \u0442\u0451\u043C\u043D\u043E-\u0441\u0438\u043D\u0438\u0439 accent",
221
+ colors: {
222
+ primary: "#D81C4B",
223
+ secondary: "#8272C1",
224
+ accent: "#1E1B4B",
225
+ background: "#FFFFFF",
226
+ text: "#1A1A1A"
227
+ }
228
+ },
229
+ {
230
+ id: "orange",
231
+ label: "Orange",
232
+ description: "\u0422\u0451\u043F\u043B\u044B\u0439 \u043E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439 \u0441 \u0441\u0438\u043D\u0438\u043C \u0430\u043A\u0446\u0435\u043D\u0442\u043E\u043C",
233
+ colors: {
234
+ primary: "#FE5000",
235
+ secondary: "#64748B",
236
+ accent: "#007AFF",
237
+ background: "#FFFFFF",
238
+ text: "#1A1A1A"
239
+ }
240
+ },
241
+ {
242
+ id: "sushi03",
243
+ label: "Sushi03",
244
+ description: "\u0422\u0451\u043C\u043D\u043E-\u0441\u0438\u043D\u0438\u0439 primary + \u0433\u043E\u0440\u0447\u0438\u0447\u043D\u044B\u0439 accent",
245
+ colors: {
246
+ primary: "#002F8C",
247
+ secondary: "#8B9DC3",
248
+ accent: "#FFDE69",
249
+ background: "#FFFFFF",
250
+ text: "#1A1A1A",
251
+ success: "#00A980",
252
+ danger: "#E61717"
253
+ }
254
+ },
255
+ {
256
+ id: "olive",
257
+ label: "Olive Whisper",
258
+ description: "\u041A\u0438\u0441\u043B\u043E\u0442\u043D\u043E-\u0437\u0435\u043B\u0451\u043D\u044B\u0439 \u043D\u0430 \u0442\u0451\u043C\u043D\u043E\u043C \u0444\u043E\u043D\u0435",
259
+ colors: {
260
+ primary: "#C0F53D",
261
+ secondary: "#0A0D04",
262
+ accent: "#C0F53D",
263
+ background: "#1A2209",
264
+ text: "#FAFFF3",
265
+ headerBg: "#1A2209",
266
+ footerBg: "#0A0D04",
267
+ footerText: "#FAFFF3",
268
+ footerTextMuted: "#6B7A4A"
269
+ }
270
+ }
271
+ ];
272
+ var DARK_THEME_PRESETS = [
273
+ {
274
+ id: "yarollov-dark",
275
+ label: "Yarollov Dark",
276
+ description: "\u0424\u0438\u0440\u043C\u0435\u043D\u043D\u044B\u0439 \u0431\u0440\u0435\u043D\u0434 (\u0442\u0451\u043C\u043D\u0430\u044F)",
277
+ colors: {
278
+ primary: "#F472B6",
279
+ secondary: "#A78BFA",
280
+ accent: "#818CF8",
281
+ background: "#121212",
282
+ text: "#E5E5E5",
283
+ headerBg: "#1A1A1A",
284
+ footerBg: "#0F0F0F",
285
+ footerText: "#A3A3A3",
286
+ footerTextMuted: "#525252"
287
+ }
288
+ },
289
+ {
290
+ id: "orange-dark",
291
+ label: "Orange Dark",
292
+ description: "\u0422\u0451\u043F\u043B\u044B\u0439 \u043E\u0440\u0430\u043D\u0436\u0435\u0432\u044B\u0439 (\u0442\u0451\u043C\u043D\u0430\u044F)",
293
+ colors: {
294
+ primary: "#FE5000",
295
+ secondary: "#64748B",
296
+ accent: "#60A5FA",
297
+ background: "#121212",
298
+ text: "#E5E5E5",
299
+ headerBg: "#1A1A1A",
300
+ footerBg: "#0F0F0F",
301
+ footerText: "#A3A3A3",
302
+ footerTextMuted: "#525252"
303
+ }
304
+ },
305
+ {
306
+ id: "sushi03-dark",
307
+ label: "Sushi03 Dark",
308
+ description: "\u0422\u0451\u043C\u043D\u043E-\u0441\u0438\u043D\u0438\u0439 (\u0442\u0451\u043C\u043D\u0430\u044F)",
309
+ colors: {
310
+ primary: "#4D8DE8",
311
+ secondary: "#5A6D8A",
312
+ accent: "#FFDE69",
313
+ background: "#0F1419",
314
+ text: "#E5E5E5",
315
+ success: "#34D399",
316
+ danger: "#F87171",
317
+ headerBg: "#161C24",
318
+ footerBg: "#0A0F14",
319
+ footerText: "#94A3B8",
320
+ footerTextMuted: "#475569"
321
+ }
322
+ }
323
+ ];
324
+
325
+ export { DARK_THEME_PRESETS, THEME_PRESETS, buildCssVariableMap, generatePrimaryShades, generateShades, useTheme };
326
+ //# sourceMappingURL=chunk-GW2QNTAD.js.map
327
+ //# sourceMappingURL=chunk-GW2QNTAD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/colors.ts","../src/theme/useTheme.ts","../src/theme/presets.ts"],"names":["p","q"],"mappings":"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","file":"chunk-GW2QNTAD.js","sourcesContent":["// Генерация цветовой шкалы и CSS-переменных из базовых цветов бренда.\n// Чистая математика в HSL/RGB — ноль зависимостей, ноль Nuxt. Портируется как есть.\n\nexport interface ThemeColorConfig {\n primary: string\n secondary: string\n accent: string\n background: string\n text: string\n success?: string\n danger?: string\n warning?: string\n info?: string\n /** Цвет текста поверх primary-фона. Если не задан — рассчитывается автоматически. */\n onPrimary?: string\n headerBg?: string\n footerBg?: string\n footerText?: string\n footerTextMuted?: string\n}\n\ninterface HslColor {\n h: number\n s: number\n l: number\n}\n\nfunction hexToHsl(hex: string): HslColor {\n const clean = hex.replace('#', '')\n const r = parseInt(clean.substring(0, 2), 16) / 255\n const g = parseInt(clean.substring(2, 4), 16) / 255\n const b = parseInt(clean.substring(4, 6), 16) / 255\n\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n\n if (max === min) {\n return { h: 0, s: 0, l }\n }\n\n const d = max - min\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n\n let h = 0\n\n if (max === r) {\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n } else if (max === g) {\n h = ((b - r) / d + 2) / 6\n } else {\n h = ((r - g) / d + 4) / 6\n }\n\n return { h, s, l }\n}\n\nfunction hslToHex(hsl: HslColor): string {\n const { h, s, l } = hsl\n\n if (s === 0) {\n const v = Math.round(l * 255)\n return `#${v.toString(16).padStart(2, '0').repeat(3)}`\n }\n\n const hue2rgb = (p: number, q: number, t: number): number => {\n let tt = t\n\n if (tt < 0) tt += 1\n if (tt > 1) tt -= 1\n if (tt < 1 / 6) return p + (q - p) * 6 * tt\n if (tt < 1 / 2) return q\n if (tt < 2 / 3) return p + (q - p) * (2 / 3 - tt) * 6\n\n return p\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n\n const r = Math.round(hue2rgb(p, q, h + 1 / 3) * 255)\n const g = Math.round(hue2rgb(p, q, h) * 255)\n const b = Math.round(hue2rgb(p, q, h - 1 / 3) * 255)\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`\n}\n\n// ---------------------------------------------------------------------------\n// Color utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Mix two hex colors in HSL space.\n * amount: 0 = pure hex1, 100 = pure hex2.\n */\nfunction mixColors(hex1: string, hex2: string, amount: number): string {\n const c1 = hexToHsl(hex1)\n const c2 = hexToHsl(hex2)\n const t = amount / 100\n\n // Handle achromatic mixing: if one color has no saturation,\n // inherit hue from the other\n let h: number\n if (c1.s === 0 && c2.s === 0) {\n h = 0\n } else if (c1.s === 0) {\n h = c2.h\n } else if (c2.s === 0) {\n h = c1.h\n } else {\n // Shortest path around the hue circle\n let dh = c2.h - c1.h\n if (dh > 0.5) dh -= 1\n if (dh < -0.5) dh += 1\n h = c1.h + dh * t\n if (h < 0) h += 1\n if (h > 1) h -= 1\n }\n\n return hslToHex({\n h,\n s: c1.s + (c2.s - c1.s) * t,\n l: c1.l + (c2.l - c1.l) * t,\n })\n}\n\n/**\n * Mix two hex colors in linear RGB space — matches CSS `linear-gradient` overlay behavior.\n * amount: 0 = pure hex1, 100 = pure hex2.\n */\nfunction mixColorsRgb(hex1: string, hex2: string, amount: number): string {\n const c1 = hex1.replace('#', '')\n const c2 = hex2.replace('#', '')\n const t = amount / 100\n\n const r1 = parseInt(c1.substring(0, 2), 16)\n const g1 = parseInt(c1.substring(2, 4), 16)\n const b1 = parseInt(c1.substring(4, 6), 16)\n const r2 = parseInt(c2.substring(0, 2), 16)\n const g2 = parseInt(c2.substring(2, 4), 16)\n const b2 = parseInt(c2.substring(4, 6), 16)\n\n const r = Math.round(r1 + (r2 - r1) * t)\n const g = Math.round(g1 + (g2 - g1) * t)\n const b = Math.round(b1 + (b2 - b1) * t)\n\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`\n}\n\n/**\n * Adjust lightness of a hex color by a relative percentage.\n * delta: -0.05 = 5% darker, +0.05 = 5% lighter.\n */\nfunction adjustLightness(hex: string, delta: number): string {\n const hsl = hexToHsl(hex)\n return hslToHex({\n h: hsl.h,\n s: hsl.s,\n l: Math.min(1, Math.max(0, hsl.l + delta)),\n })\n}\n\n/**\n * Returns a contrasting text color (white or dark) for a given background hex.\n * Uses relative luminance formula (WCAG).\n */\nfunction getContrastColor(hex: string): string {\n const clean = hex.replace('#', '')\n const r = parseInt(clean.substring(0, 2), 16) / 255\n const g = parseInt(clean.substring(2, 4), 16) / 255\n const b = parseInt(clean.substring(4, 6), 16) / 255\n\n // sRGB to linear\n const toLinear = (c: number): number =>\n c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n const luminance = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b)\n\n return luminance > 0.4 ? '#1a1a1a' : '#ffffff'\n}\n\n// ---------------------------------------------------------------------------\n// Primary shades\n// ---------------------------------------------------------------------------\n\nexport interface PrimaryShades {\n lightest: string\n lighter: string\n light: string\n base: string\n dark: string\n darker: string\n darkest: string\n tint: string\n tintHover: string\n tintPressed: string\n ink: string\n}\n\n/** Универсальный генератор 11-ступенчатой шкалы от одного hex. */\nexport function generateShades(\n hex: string,\n bg: string = '#ffffff',\n text: string = '#000000'\n): PrimaryShades {\n return generatePrimaryShades(hex, bg, text)\n}\n\nexport function generatePrimaryShades(\n hex: string,\n bg: string = '#ffffff',\n text: string = '#000000'\n): PrimaryShades {\n const hsl = hexToHsl(hex)\n\n const clamp = (v: number): number => Math.min(1, Math.max(0, v))\n\n // For very dark colors (l < 0.15), dark shades go UP (lighten)\n // because you can't darken black — multiplying 0 by anything stays 0\n const isVeryDark = hsl.l < 0.15\n const dark = isVeryDark ? clamp(hsl.l + 0.12) : clamp(hsl.l * 0.85)\n const darker = isVeryDark ? clamp(hsl.l + 0.08) : clamp(hsl.l * 0.65)\n const darkest = isVeryDark ? clamp(hsl.l + 0.05) : clamp(hsl.l * 0.45)\n\n return {\n lightest: hslToHex({ h: hsl.h, s: hsl.s * 0.3, l: clamp(0.92) }),\n lighter: hslToHex({ h: hsl.h, s: hsl.s * 0.5, l: clamp(0.8) }),\n light: hslToHex({ h: hsl.h, s: hsl.s * 0.7, l: clamp(hsl.l + (1 - hsl.l) * 0.4) }),\n base: hex,\n dark: hslToHex({ h: hsl.h, s: hsl.s, l: dark }),\n darker: hslToHex({ h: hsl.h, s: hsl.s, l: darker }),\n darkest: hslToHex({ h: hsl.h, s: hsl.s, l: darkest }),\n tint: mixColorsRgb(bg, hex, 14),\n tintHover: mixColorsRgb(mixColorsRgb(bg, hex, 14), bg, 34),\n tintPressed: mixColorsRgb(bg, hex, 5),\n ink: mixColorsRgb(text, hex, 44),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Build complete CSS variable map from core colors\n// ---------------------------------------------------------------------------\n\nexport function buildCssVariableMap(config: ThemeColorConfig): Record<string, string> {\n const bg = config.background\n const text = config.text\n const shades = generatePrimaryShades(config.primary, bg, text)\n const secondaryShades = generateShades(config.secondary, bg, text)\n\n const vars: Record<string, string> = {\n // Primary palette\n '--zenky-primary-lightest': shades.lightest,\n '--zenky-primary-lighter': shades.lighter,\n '--zenky-primary-light': shades.light,\n '--zenky-primary': shades.base,\n '--zenky-primary-dark': shades.dark,\n '--zenky-primary-darker': shades.darker,\n '--zenky-primary-darkest': shades.darkest,\n '--zenky-primary-tint': shades.tint,\n '--zenky-primary-tint-hover': shades.tintHover,\n '--zenky-primary-tint-pressed': shades.tintPressed,\n '--zenky-primary-ink': shades.ink,\n\n // Secondary palette\n '--zenky-secondary-lightest': secondaryShades.lightest,\n '--zenky-secondary-lighter': secondaryShades.lighter,\n '--zenky-secondary-light': secondaryShades.light,\n '--zenky-secondary': secondaryShades.base,\n '--zenky-secondary-dark': secondaryShades.dark,\n '--zenky-secondary-darker': secondaryShades.darker,\n '--zenky-secondary-darkest': secondaryShades.darkest,\n\n // Auto-contrast for secondary\n '--zenky-on-secondary': getContrastColor(config.secondary),\n\n // Accent\n '--zenky-accent': config.accent,\n '--zenky-accent-tint': mixColorsRgb(bg, config.accent, 14),\n '--zenky-accent-tint-hover': mixColorsRgb(mixColorsRgb(bg, config.accent, 14), bg, 34),\n '--zenky-accent-tint-pressed': mixColorsRgb(bg, config.accent, 5),\n '--zenky-accent-ink': mixColorsRgb(text, config.accent, 44),\n '--zenky-bg': bg,\n '--zenky-text': text,\n\n // Цвет текста поверх primary: ручная настройка или авто-контраст\n '--zenky-on-primary': config.onPrimary || getContrastColor(config.primary),\n '--zenky-on-accent': getContrastColor(config.accent),\n\n // Derived text shades\n '--zenky-text-muted': mixColors(bg, text, 50),\n '--zenky-text-light': mixColors(bg, text, 35),\n\n // Derived borders\n '--zenky-border-light': mixColors(bg, text, 6),\n '--zenky-border': mixColors(bg, text, 12),\n '--zenky-border-strong': mixColors(bg, text, 35),\n\n // Derived surfaces\n '--zenky-surface-secondary': mixColors(bg, text, 5),\n '--zenky-surface-secondary-hover': mixColors(bg, text, 10),\n '--zenky-surface-active': mixColors(bg, config.primary, 8),\n '--zenky-surface-dark':\n getContrastColor(bg) === '#ffffff'\n ? adjustLightness(bg, 0.08)\n : adjustLightness(text, -0.1),\n '--zenky-control-active': mixColors(bg, text, 80),\n '--zenky-surface-elevated': adjustLightness(bg, 0.06),\n\n // Status (defaults if not provided)\n '--zenky-success': config.success ?? '#22c55e',\n '--zenky-danger': config.danger ?? '#ef4444',\n '--zenky-warning': config.warning ?? '#f59e0b',\n '--zenky-info': config.info ?? '#3b82f6',\n\n // Component semantic (auto-derived with optional overrides)\n '--zenky-header-bg': config.headerBg ?? adjustLightness(bg, -0.02),\n '--zenky-nav-bg': config.headerBg ?? adjustLightness(bg, -0.02),\n '--zenky-footer-bg': config.footerBg ?? adjustLightness(bg, -0.03),\n '--zenky-footer-text': config.footerText ?? mixColors(bg, text, 70),\n '--zenky-footer-text-muted': config.footerTextMuted ?? mixColors(bg, text, 40),\n }\n\n return vars\n}\n","import { computed, type ComputedRef } from 'vue'\n\nimport { buildCssVariableMap, type ThemeColorConfig } from './colors'\n\nexport interface FontConfig {\n family: string\n url: string\n}\n\nexport interface ThemeData {\n cssVariables: ComputedRef<Record<string, string>>\n fontFamily: ComputedRef<string | null>\n fontUrl: ComputedRef<string | null>\n}\n\n/** CSS-переменные темы + шрифт из цвето-/шрифто-конфига (инъекция в head — на стороне app). */\nexport function useTheme(colorConfig: ThemeColorConfig, fontConfig: FontConfig): ThemeData {\n const cssVariables = computed<Record<string, string>>(() => {\n const vars = buildCssVariableMap(colorConfig)\n\n if (fontConfig.family) {\n const stack = `'${fontConfig.family}', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif`\n vars['--zenky-font-sans'] = stack\n }\n\n return vars\n })\n\n const fontFamily = computed<string | null>(() => fontConfig.family || null)\n const fontUrl = computed<string | null>(() => fontConfig.url || null)\n\n return {\n cssVariables,\n fontFamily,\n fontUrl,\n }\n}\n","import type { ThemeColorConfig } from './colors'\n\nexport interface ThemePreset {\n id: string\n label: string\n description: string\n colors: ThemeColorConfig\n}\n\nexport const THEME_PRESETS: ThemePreset[] = [\n {\n id: 'yarollov',\n label: 'Yarollov',\n description: 'Фирменный бренд — малиновый primary, тёмно-синий accent',\n colors: {\n primary: '#D81C4B',\n secondary: '#8272C1',\n accent: '#1E1B4B',\n background: '#FFFFFF',\n text: '#1A1A1A',\n },\n },\n {\n id: 'orange',\n label: 'Orange',\n description: 'Тёплый оранжевый с синим акцентом',\n colors: {\n primary: '#FE5000',\n secondary: '#64748B',\n accent: '#007AFF',\n background: '#FFFFFF',\n text: '#1A1A1A',\n },\n },\n {\n id: 'sushi03',\n label: 'Sushi03',\n description: 'Тёмно-синий primary + горчичный accent',\n colors: {\n primary: '#002F8C',\n secondary: '#8B9DC3',\n accent: '#FFDE69',\n background: '#FFFFFF',\n text: '#1A1A1A',\n success: '#00A980',\n danger: '#E61717',\n },\n },\n {\n id: 'olive',\n label: 'Olive Whisper',\n description: 'Кислотно-зелёный на тёмном фоне',\n colors: {\n primary: '#C0F53D',\n secondary: '#0A0D04',\n accent: '#C0F53D',\n background: '#1A2209',\n text: '#FAFFF3',\n headerBg: '#1A2209',\n footerBg: '#0A0D04',\n footerText: '#FAFFF3',\n footerTextMuted: '#6B7A4A',\n },\n },\n] as const\n\n/** Тёмные версии пресетов — инвертированные background/text */\nexport const DARK_THEME_PRESETS: ThemePreset[] = [\n {\n id: 'yarollov-dark',\n label: 'Yarollov Dark',\n description: 'Фирменный бренд (тёмная)',\n colors: {\n primary: '#F472B6',\n secondary: '#A78BFA',\n accent: '#818CF8',\n background: '#121212',\n text: '#E5E5E5',\n headerBg: '#1A1A1A',\n footerBg: '#0F0F0F',\n footerText: '#A3A3A3',\n footerTextMuted: '#525252',\n },\n },\n {\n id: 'orange-dark',\n label: 'Orange Dark',\n description: 'Тёплый оранжевый (тёмная)',\n colors: {\n primary: '#FE5000',\n secondary: '#64748B',\n accent: '#60A5FA',\n background: '#121212',\n text: '#E5E5E5',\n headerBg: '#1A1A1A',\n footerBg: '#0F0F0F',\n footerText: '#A3A3A3',\n footerTextMuted: '#525252',\n },\n },\n {\n id: 'sushi03-dark',\n label: 'Sushi03 Dark',\n description: 'Тёмно-синий (тёмная)',\n colors: {\n primary: '#4D8DE8',\n secondary: '#5A6D8A',\n accent: '#FFDE69',\n background: '#0F1419',\n text: '#E5E5E5',\n success: '#34D399',\n danger: '#F87171',\n headerBg: '#161C24',\n footerBg: '#0A0F14',\n footerText: '#94A3B8',\n footerTextMuted: '#475569',\n },\n },\n] as const\n"]}