@erplora/outfitkit 0.1.15 → 0.1.16

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 (43) hide show
  1. package/dist/cdn.d.ts +1 -0
  2. package/dist/components/ok-data-table/csv-encoding.d.ts +4 -0
  3. package/dist/components/ok-data-table/csv-encoding.test.d.ts +1 -0
  4. package/dist/components/ok-theme-picker/ok-theme-picker.d.ts +46 -0
  5. package/dist/components/ok-theme-picker/ok-theme-picker.test.d.ts +1 -0
  6. package/dist/index.d.ts +4 -2
  7. package/dist/index.js +4 -0
  8. package/dist/ok-app-launcher.js +1 -1
  9. package/dist/ok-audio.js +1 -1
  10. package/dist/ok-calendar.js +1 -1
  11. package/dist/ok-carousel.js +1 -1
  12. package/dist/ok-chat.js +1 -1
  13. package/dist/ok-combo.js +1 -1
  14. package/dist/ok-command-palette.js +1 -1
  15. package/dist/ok-data-table.js +13 -3
  16. package/dist/ok-date-picker.js +1 -1
  17. package/dist/ok-drawer.js +1 -1
  18. package/dist/ok-dropzone.js +1 -1
  19. package/dist/ok-file-manager.js +1 -1
  20. package/dist/ok-inline-feedback.js +1 -1
  21. package/dist/ok-kpi.js +1 -1
  22. package/dist/ok-lightbox.js +1 -1
  23. package/dist/ok-mail.js +1 -1
  24. package/dist/ok-menubar.js +1 -1
  25. package/dist/ok-notification-center.js +1 -1
  26. package/dist/ok-pdf.js +1 -1
  27. package/dist/ok-pinpad.js +1 -1
  28. package/dist/ok-qty-stepper.js +1 -1
  29. package/dist/ok-scheduler.js +1 -1
  30. package/dist/ok-signature.js +1 -1
  31. package/dist/ok-split-button.js +1 -1
  32. package/dist/ok-stepper.js +1 -1
  33. package/dist/ok-tag-input.js +1 -1
  34. package/dist/ok-theme-picker.js +221 -0
  35. package/dist/ok-tree.js +1 -1
  36. package/dist/ok-video.js +1 -1
  37. package/dist/ok-widget-board.js +1 -1
  38. package/dist/outfitkit.bundle.js +1247 -1041
  39. package/dist/outfitkit.js +1 -0
  40. package/dist/palettes.css +422 -0
  41. package/dist/shared/icons.js +45 -45
  42. package/dist/theme/palettes.test.d.ts +1 -0
  43. package/package.json +4 -1
package/dist/outfitkit.js CHANGED
@@ -73,6 +73,7 @@ import "./ok-hover-card.js";
73
73
  import "./ok-notification-center.js";
74
74
  import "./ok-coachmark.js";
75
75
  import "./ok-select-card.js";
76
+ import "./ok-theme-picker.js";
76
77
  import "./ok-error-page.js";
77
78
  import "./ok-date-picker.js";
78
79
  import "./ok-time-picker.js";
@@ -0,0 +1,422 @@
1
+ /* Paletas de tema OPCIONALES sobre el tema canónico (erplora.css) — traídas del showcase
2
+ * ERPlora/ux (lib/templates/*.css, manifest 2.1.0), traducidas de tokens --ux-* a --ion-*.
3
+ *
4
+ * Mecanismo: `data-ok-palette="<id>"` en el <html>. SIN atributo = marca ERPlora (el azul
5
+ * de erplora.css). El oscuro sigue siendo la clase Ionic `ion-palette-dark`, que COMPONE
6
+ * con la paleta: `:root.ion-palette-dark[data-ok-palette="ocean"]`.
7
+ *
8
+ * ⚠️ Contrato de especificidad (blindado por palettes.test.ts): el bloque claro de una
9
+ * paleta (0,2,0) empata con el oscuro base de erplora.css (0,2,0) y, al cargar este fichero
10
+ * DESPUÉS, lo pisa. Solo el bloque oscuro de la paleta (0,3,0) lo corrige — por eso los dos
11
+ * bloques de cada paleta definen SIEMPRE el mismo set de tokens.
12
+ *
13
+ * La escala de pasos se deriva con color-mix (texto N% sobre lienzo), la misma regla con la
14
+ * que Ionic genera sus steps — así cada paleta hereda superficies coherentes sin 9 literales.
15
+ *
16
+ * Carga: DESPUÉS de erplora.css.
17
+ * @import '@erplora/outfitkit/erplora.css';
18
+ * @import '@erplora/outfitkit/palettes.css';
19
+ */
20
+
21
+ /* ═══════════════ TERRACOTTA — el default cálido del showcase ux ═══════════════ */
22
+
23
+ :root[data-ok-palette='terracotta'] {
24
+ --ion-color-primary: #E8552A;
25
+ --ion-color-primary-rgb: 232, 85, 42;
26
+ --ion-color-primary-contrast: #ffffff;
27
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
28
+ --ion-color-primary-shade: #B83A12;
29
+ --ion-color-primary-tint: #FF7A4D;
30
+
31
+ --ion-background-color: #FAF8F4;
32
+ --ion-background-color-rgb: 250, 248, 244;
33
+ --ion-text-color: #1A1612;
34
+ --ion-text-color-rgb: 26, 22, 18;
35
+
36
+ --ion-color-medium: #837B70;
37
+ --ion-color-medium-rgb: 131, 123, 112;
38
+
39
+ --ion-item-background: #ffffff;
40
+ --ion-card-background: #ffffff;
41
+ --ion-border-color: rgba(20, 14, 8, 0.13);
42
+
43
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
44
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
45
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
46
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
47
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
48
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
49
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
50
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
51
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
52
+ }
53
+
54
+ :root.ion-palette-dark[data-ok-palette='terracotta'] {
55
+ --ion-color-primary: #E8552A;
56
+ --ion-color-primary-rgb: 232, 85, 42;
57
+ --ion-color-primary-contrast: #ffffff;
58
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
59
+ --ion-color-primary-shade: #B83A12;
60
+ --ion-color-primary-tint: #FF7A4D;
61
+
62
+ --ion-background-color: #0B0A09;
63
+ --ion-background-color-rgb: 11, 10, 9;
64
+ --ion-text-color: #F5F1EA;
65
+ --ion-text-color-rgb: 245, 241, 234;
66
+
67
+ --ion-color-medium: #8A8378;
68
+ --ion-color-medium-rgb: 138, 131, 120;
69
+
70
+ --ion-item-background: #1A1815;
71
+ --ion-card-background: #1A1815;
72
+ --ion-border-color: rgba(255, 255, 255, 0.1);
73
+
74
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
75
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
76
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
77
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
78
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
79
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
80
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
81
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
82
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
83
+
84
+ /* El oscuro base trae un literal zinc; aquí debe seguir a la paleta. */
85
+ --ok-surface-muted: var(--ion-color-step-50);
86
+ }
87
+
88
+ /* ═══════════════ CORPORATE — navy profundo, banca/enterprise ═══════════════ */
89
+
90
+ :root[data-ok-palette='corporate'] {
91
+ --ion-color-primary: #0F3F9C;
92
+ --ion-color-primary-rgb: 15, 63, 156;
93
+ --ion-color-primary-contrast: #ffffff;
94
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
95
+ --ion-color-primary-shade: #012B80;
96
+ --ion-color-primary-tint: #0060C5;
97
+
98
+ --ion-background-color: #F6F8FB;
99
+ --ion-background-color-rgb: 246, 248, 251;
100
+ --ion-text-color: #0F1626;
101
+ --ion-text-color-rgb: 15, 22, 38;
102
+
103
+ --ion-color-medium: #777E92;
104
+ --ion-color-medium-rgb: 119, 126, 146;
105
+
106
+ --ion-item-background: #ffffff;
107
+ --ion-card-background: #ffffff;
108
+ --ion-border-color: rgba(20, 30, 50, 0.12);
109
+
110
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
111
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
112
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
113
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
114
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
115
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
116
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
117
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
118
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
119
+ }
120
+
121
+ :root.ion-palette-dark[data-ok-palette='corporate'] {
122
+ /* En oscuro el navy sube a un azul más luminoso (el "focus ring" del ux) para
123
+ * que botones y enlaces no se hundan en el lienzo slate. */
124
+ --ion-color-primary: #176EC8;
125
+ --ion-color-primary-rgb: 23, 110, 200;
126
+ --ion-color-primary-contrast: #ffffff;
127
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
128
+ --ion-color-primary-shade: #093995;
129
+ --ion-color-primary-tint: #3E87D6;
130
+
131
+ --ion-background-color: #0A0E14;
132
+ --ion-background-color-rgb: 10, 14, 20;
133
+ --ion-text-color: #EEF2F8;
134
+ --ion-text-color-rgb: 238, 242, 248;
135
+
136
+ --ion-color-medium: #7B8597;
137
+ --ion-color-medium-rgb: 123, 133, 151;
138
+
139
+ --ion-item-background: #161C26;
140
+ --ion-card-background: #161C26;
141
+ --ion-border-color: rgba(180, 200, 230, 0.1);
142
+
143
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
144
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
145
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
146
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
147
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
148
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
149
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
150
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
151
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
152
+
153
+ --ok-surface-muted: var(--ion-color-step-50);
154
+ }
155
+
156
+ /* ═══════════════ MINIMAL — mono editorial/luxury ═══════════════ */
157
+
158
+ :root[data-ok-palette='minimal'] {
159
+ --ion-color-primary: #111111;
160
+ --ion-color-primary-rgb: 17, 17, 17;
161
+ --ion-color-primary-contrast: #ffffff;
162
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
163
+ --ion-color-primary-shade: #000000;
164
+ --ion-color-primary-tint: #2E2E2E;
165
+
166
+ --ion-background-color: #ffffff;
167
+ --ion-background-color-rgb: 255, 255, 255;
168
+ --ion-text-color: #0A0A0A;
169
+ --ion-text-color-rgb: 10, 10, 10;
170
+
171
+ --ion-color-medium: #858585;
172
+ --ion-color-medium-rgb: 133, 133, 133;
173
+
174
+ --ion-item-background: #FAFAFA;
175
+ --ion-card-background: #FAFAFA;
176
+ --ion-border-color: rgba(0, 0, 0, 0.08);
177
+
178
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
179
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
180
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
181
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
182
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
183
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
184
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
185
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
186
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
187
+ }
188
+
189
+ :root.ion-palette-dark[data-ok-palette='minimal'] {
190
+ /* Mono INVERTIDO: el brand #0A0A0A del ux sería invisible sobre lienzo negro;
191
+ * en oscuro el primario es la tinta (blanco), como un tema mono clásico. */
192
+ --ion-color-primary: #FAFAFA;
193
+ --ion-color-primary-rgb: 250, 250, 250;
194
+ --ion-color-primary-contrast: #0A0A0A;
195
+ --ion-color-primary-contrast-rgb: 10, 10, 10;
196
+ --ion-color-primary-shade: #E0E0E0;
197
+ --ion-color-primary-tint: #ffffff;
198
+
199
+ --ion-background-color: #0A0A0A;
200
+ --ion-background-color-rgb: 10, 10, 10;
201
+ --ion-text-color: #FAFAFA;
202
+ --ion-text-color-rgb: 250, 250, 250;
203
+
204
+ --ion-color-medium: #888888;
205
+ --ion-color-medium-rgb: 136, 136, 136;
206
+
207
+ --ion-item-background: #161616;
208
+ --ion-card-background: #161616;
209
+ --ion-border-color: rgba(255, 255, 255, 0.12);
210
+
211
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
212
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
213
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
214
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
215
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
216
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
217
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
218
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
219
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
220
+
221
+ --ok-surface-muted: var(--ion-color-step-50);
222
+ }
223
+
224
+ /* ═══════════════ FOREST — verde forestal y tierra ═══════════════ */
225
+
226
+ :root[data-ok-palette='forest'] {
227
+ --ion-color-primary: #1F542A;
228
+ --ion-color-primary-rgb: 31, 84, 42;
229
+ --ion-color-primary-contrast: #ffffff;
230
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
231
+ --ion-color-primary-shade: #11401C;
232
+ --ion-color-primary-tint: #2C8240;
233
+
234
+ --ion-background-color: #FAF6EE;
235
+ --ion-background-color-rgb: 250, 246, 238;
236
+ --ion-text-color: #1B1810;
237
+ --ion-text-color-rgb: 27, 24, 16;
238
+
239
+ --ion-color-medium: #87806C;
240
+ --ion-color-medium-rgb: 135, 128, 108;
241
+
242
+ --ion-item-background: #ffffff;
243
+ --ion-card-background: #ffffff;
244
+ --ion-border-color: rgba(60, 45, 20, 0.14);
245
+
246
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
247
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
248
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
249
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
250
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
251
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
252
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
253
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
254
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
255
+ }
256
+
257
+ :root.ion-palette-dark[data-ok-palette='forest'] {
258
+ /* Como en corporate: en oscuro el verde sube un paso de luminancia. */
259
+ --ion-color-primary: #3B874A;
260
+ --ion-color-primary-rgb: 59, 135, 74;
261
+ --ion-color-primary-contrast: #ffffff;
262
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
263
+ --ion-color-primary-shade: #25532E;
264
+ --ion-color-primary-tint: #4E9E5E;
265
+
266
+ --ion-background-color: #14110D;
267
+ --ion-background-color-rgb: 20, 17, 13;
268
+ --ion-text-color: #F1ECE0;
269
+ --ion-text-color-rgb: 241, 236, 224;
270
+
271
+ --ion-color-medium: #8C8472;
272
+ --ion-color-medium-rgb: 140, 132, 114;
273
+
274
+ --ion-item-background: #221F18;
275
+ --ion-card-background: #221F18;
276
+ --ion-border-color: rgba(220, 200, 170, 0.11);
277
+
278
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
279
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
280
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
281
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
282
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
283
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
284
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
285
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
286
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
287
+
288
+ --ok-surface-muted: var(--ion-color-step-50);
289
+ }
290
+
291
+ /* ═══════════════ OCEAN — teal/cian tech ═══════════════ */
292
+
293
+ :root[data-ok-palette='ocean'] {
294
+ --ion-color-primary: #008CBD;
295
+ --ion-color-primary-rgb: 0, 140, 189;
296
+ --ion-color-primary-contrast: #ffffff;
297
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
298
+ --ion-color-primary-shade: #0073A3;
299
+ --ion-color-primary-tint: #00ADD9;
300
+
301
+ --ion-background-color: #F4F8FC;
302
+ --ion-background-color-rgb: 244, 248, 252;
303
+ --ion-text-color: #0A1626;
304
+ --ion-text-color-rgb: 10, 22, 38;
305
+
306
+ --ion-color-medium: #768395;
307
+ --ion-color-medium-rgb: 118, 131, 149;
308
+
309
+ --ion-item-background: #ffffff;
310
+ --ion-card-background: #ffffff;
311
+ --ion-border-color: rgba(15, 40, 80, 0.13);
312
+
313
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
314
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
315
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
316
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
317
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
318
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
319
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
320
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
321
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
322
+ }
323
+
324
+ :root.ion-palette-dark[data-ok-palette='ocean'] {
325
+ /* El cian vivo del ux lleva texto OSCURO encima (contraste correcto). */
326
+ --ion-color-primary: #00B1DA;
327
+ --ion-color-primary-rgb: 0, 177, 218;
328
+ --ion-color-primary-contrast: #06141C;
329
+ --ion-color-primary-contrast-rgb: 6, 20, 28;
330
+ --ion-color-primary-shade: #0091BB;
331
+ --ion-color-primary-tint: #00CDEF;
332
+
333
+ --ion-background-color: #060B14;
334
+ --ion-background-color-rgb: 6, 11, 20;
335
+ --ion-text-color: #ECF3FA;
336
+ --ion-text-color-rgb: 236, 243, 250;
337
+
338
+ --ion-color-medium: #788599;
339
+ --ion-color-medium-rgb: 120, 133, 153;
340
+
341
+ --ion-item-background: #11192A;
342
+ --ion-card-background: #11192A;
343
+ --ion-border-color: rgba(140, 180, 230, 0.12);
344
+
345
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
346
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
347
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
348
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
349
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
350
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
351
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
352
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
353
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
354
+
355
+ --ok-surface-muted: var(--ion-color-step-50);
356
+ }
357
+
358
+ /* ═══════════════ VIOLET — violeta creativo ═══════════════ */
359
+
360
+ :root[data-ok-palette='violet'] {
361
+ --ion-color-primary: #742AD9;
362
+ --ion-color-primary-rgb: 116, 42, 217;
363
+ --ion-color-primary-contrast: #ffffff;
364
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
365
+ --ion-color-primary-shade: #5C10B4;
366
+ --ion-color-primary-tint: #8E58F2;
367
+
368
+ --ion-background-color: #FBF7FA;
369
+ --ion-background-color-rgb: 251, 247, 250;
370
+ --ion-text-color: #1A1024;
371
+ --ion-text-color-rgb: 26, 16, 36;
372
+
373
+ --ion-color-medium: #82728A;
374
+ --ion-color-medium-rgb: 130, 114, 138;
375
+
376
+ --ion-item-background: #ffffff;
377
+ --ion-card-background: #ffffff;
378
+ --ion-border-color: rgba(60, 25, 70, 0.13);
379
+
380
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
381
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
382
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
383
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
384
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
385
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
386
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
387
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
388
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
389
+ }
390
+
391
+ :root.ion-palette-dark[data-ok-palette='violet'] {
392
+ --ion-color-primary: #7F3BE7;
393
+ --ion-color-primary-rgb: 127, 59, 231;
394
+ --ion-color-primary-contrast: #ffffff;
395
+ --ion-color-primary-contrast-rgb: 255, 255, 255;
396
+ --ion-color-primary-shade: #6725C2;
397
+ --ion-color-primary-tint: #945FF9;
398
+
399
+ --ion-background-color: #0D0814;
400
+ --ion-background-color-rgb: 13, 8, 20;
401
+ --ion-text-color: #F2EDF8;
402
+ --ion-text-color-rgb: 242, 237, 248;
403
+
404
+ --ion-color-medium: #877D99;
405
+ --ion-color-medium-rgb: 135, 125, 153;
406
+
407
+ --ion-item-background: #1B1429;
408
+ --ion-card-background: #1B1429;
409
+ --ion-border-color: rgba(210, 190, 240, 0.12);
410
+
411
+ --ion-color-step-50: color-mix(in srgb, var(--ion-text-color) 5%, var(--ion-background-color));
412
+ --ion-color-step-100: color-mix(in srgb, var(--ion-text-color) 10%, var(--ion-background-color));
413
+ --ion-color-step-150: color-mix(in srgb, var(--ion-text-color) 15%, var(--ion-background-color));
414
+ --ion-color-step-200: color-mix(in srgb, var(--ion-text-color) 20%, var(--ion-background-color));
415
+ --ion-color-step-250: color-mix(in srgb, var(--ion-text-color) 25%, var(--ion-background-color));
416
+ --ion-color-step-300: color-mix(in srgb, var(--ion-text-color) 30%, var(--ion-background-color));
417
+ --ion-color-step-500: color-mix(in srgb, var(--ion-text-color) 50%, var(--ion-background-color));
418
+ --ion-color-step-700: color-mix(in srgb, var(--ion-text-color) 70%, var(--ion-background-color));
419
+ --ion-color-step-850: color-mix(in srgb, var(--ion-text-color) 85%, var(--ion-background-color));
420
+
421
+ --ok-surface-muted: var(--ion-color-step-50);
422
+ }
@@ -145,50 +145,50 @@ function okIcon(value) {
145
145
  return BY_NAME[value] ?? value;
146
146
  }
147
147
  export {
148
- iconAppsOutline as A,
149
- iconCloseOutline as B,
150
- iconBackspaceOutline as C,
151
- iconCloudUploadOutline as D,
152
- iconAlertCircleOutline as E,
153
- iconDocumentOutline as F,
154
- iconSend as G,
155
- iconMenuOutline as H,
156
- iconDownloadOutline as I,
157
- iconVolumeMuteOutline as J,
158
- iconVolumeLowOutline as K,
159
- iconVolumeHighOutline as L,
160
- iconExpandOutline as M,
161
- iconOpenOutline as N,
162
- iconDocumentTextOutline as O,
163
- iconAdd as P,
164
- iconSearchOutline as Q,
165
- iconNotificationsOffOutline as R,
166
- iconPlayOutline as S,
167
- iconFolderOpenOutline as T,
168
- iconEllipsisVertical as a,
169
- iconClose as b,
170
- iconChevronBack as c,
171
- iconChevronForward as d,
172
- iconFileTrayOutline as e,
173
- iconSwapVerticalOutline as f,
174
- iconChevronUpOutline as g,
175
- iconChevronDownOutline as h,
176
- iconCalendarOutline as i,
177
- iconCreateOutline as j,
178
- iconArrowUndoOutline as k,
179
- iconArrowRedoOutline as l,
180
- iconArchiveOutline as m,
181
- iconTrashOutline as n,
148
+ iconDocumentOutline as A,
149
+ iconSend as B,
150
+ iconMenuOutline as C,
151
+ iconDownloadOutline as D,
152
+ iconVolumeMuteOutline as E,
153
+ iconVolumeLowOutline as F,
154
+ iconVolumeHighOutline as G,
155
+ iconExpandOutline as H,
156
+ iconOpenOutline as I,
157
+ iconDocumentTextOutline as J,
158
+ iconAdd as K,
159
+ iconSearchOutline as L,
160
+ iconNotificationsOffOutline as M,
161
+ iconCalendarOutline as N,
162
+ iconPlayOutline as O,
163
+ iconFolderOpenOutline as P,
164
+ iconChevronForward as Q,
165
+ iconFileTrayOutline as R,
166
+ iconSwapVerticalOutline as S,
167
+ iconChevronUpOutline as T,
168
+ iconChevronBack as a,
169
+ iconArrowUndoOutline as b,
170
+ iconArrowRedoOutline as c,
171
+ iconArchiveOutline as d,
172
+ iconTrashOutline as e,
173
+ iconDocumentAttachOutline as f,
174
+ iconChevronForwardOutline as g,
175
+ iconInformationCircle as h,
176
+ iconCreateOutline as i,
177
+ iconAlertCircle as j,
178
+ iconWarning as k,
179
+ iconCheckmarkCircle as l,
180
+ iconClose as m,
181
+ iconTrendingUp as n,
182
182
  okIcon as o,
183
- iconDocumentAttachOutline as p,
184
- iconChevronForwardOutline as q,
185
- iconInformationCircle as r,
186
- iconAlertCircle as s,
187
- iconWarning as t,
188
- iconCheckmarkCircle as u,
189
- iconTrendingUp as v,
190
- iconTrendingDown as w,
191
- iconRemove as x,
192
- iconCheckmarkOutline as y,
193
- iconChevronBackOutline as z
183
+ iconTrendingDown as p,
184
+ iconRemove as q,
185
+ iconCheckmarkOutline as r,
186
+ iconEllipsisVertical as s,
187
+ iconChevronBackOutline as t,
188
+ iconAppsOutline as u,
189
+ iconCloseOutline as v,
190
+ iconChevronDownOutline as w,
191
+ iconBackspaceOutline as x,
192
+ iconCloudUploadOutline as y,
193
+ iconAlertCircleOutline as z
194
194
  };
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@erplora/outfitkit",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "OutfitKit — librería de Web Components (Lit) que CONSTRUYE lo que Ionic no tiene (tree, data-table rica, inline-feedback, kpi/stat, stepper/wizard, calendar, kanban…) sobre primitivos de Ionic. Ionic es la base; OutfitKit cubre los huecos. npm + CDN, imports individuales, CSP-safe. Tema vía tokens --ok-* (fallback a --ion-*).",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -101,6 +101,7 @@
101
101
  "./ok-notification-center": "./dist/ok-notification-center.js",
102
102
  "./ok-coachmark": "./dist/ok-coachmark.js",
103
103
  "./ok-select-card": "./dist/ok-select-card.js",
104
+ "./ok-theme-picker": "./dist/ok-theme-picker.js",
104
105
  "./ok-error-page": "./dist/ok-error-page.js",
105
106
  "./ok-date-picker": "./dist/ok-date-picker.js",
106
107
  "./ok-time-picker": "./dist/ok-time-picker.js",
@@ -124,6 +125,7 @@
124
125
  "./ok-file-manager": "./dist/ok-file-manager.js",
125
126
  "./theme.css": "./dist/theme.example.css",
126
127
  "./erplora.css": "./dist/erplora.css",
128
+ "./palettes.css": "./dist/palettes.css",
127
129
  "./layout.css": "./dist/layout.css",
128
130
  "./cdn": "./dist/outfitkit.js",
129
131
  "./bundle": "./dist/outfitkit.bundle.js"
@@ -148,6 +150,7 @@
148
150
  "devDependencies": {
149
151
  "@iconify-json/ion": "^1.2.7",
150
152
  "@types/node": "^24.10.1",
153
+ "happy-dom": "^20.10.6",
151
154
  "typescript": "^5.6.0",
152
155
  "unplugin-icons": "^23.0.1",
153
156
  "vite": "^6.0.0",