@focus4/styling 12.11.0 → 12.11.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,365 @@
1
+ html {
2
+ color: rgb(var(--color-black));
3
+ font-size: var(--font-size-small);
4
+ line-height: 1.4;
5
+ font-family: var(--preferred-font);
6
+ }
7
+
8
+ body {
9
+ animation-duration: var(--animation-duration);
10
+ animation-delay: var(--animation-delay);
11
+ animation-timing-function: var(--animation-curve-default);
12
+ margin: 0;
13
+ }
14
+
15
+ textarea {
16
+ resize: vertical;
17
+ }
18
+
19
+ h1, h2, h3, h4, h5, h6 {
20
+ margin: 24px 0;
21
+ font-weight: 400;
22
+ }
23
+
24
+ h1 {
25
+ font-size: calc(3.5 * var(--font-size));
26
+ letter-spacing: -.02em;
27
+ line-height: 1.35;
28
+ }
29
+
30
+ h2 {
31
+ font-size: calc(2.8 * var(--font-size));
32
+ line-height: 48px;
33
+ }
34
+
35
+ h3 {
36
+ font-size: calc(2.2 * var(--font-size));
37
+ line-height: 40px;
38
+ }
39
+
40
+ h4 {
41
+ font-size: calc(1.5 * var(--font-size));
42
+ line-height: 32px;
43
+ }
44
+
45
+ h5 {
46
+ font-size: calc(1.25 * var(--font-size));
47
+ font-weight: var(--font-weight-semi-bold);
48
+ letter-spacing: .02em;
49
+ line-height: 1;
50
+ }
51
+
52
+ h6 {
53
+ font-size: var(--font-size);
54
+ letter-spacing: .04em;
55
+ line-height: 24px;
56
+ }
57
+
58
+ th {
59
+ font-weight: normal;
60
+ }
61
+ :root {
62
+ --color-black: 0, 0, 0;
63
+ --color-white: 255, 255, 255;
64
+ --palette-red-50: 255, 235, 238;
65
+ --palette-red-100: 255, 205, 210;
66
+ --palette-red-200: 239, 154, 154;
67
+ --palette-red-300: 229, 115, 115;
68
+ --palette-red-400: 239, 83, 80;
69
+ --palette-red-500: 244, 67, 54;
70
+ --palette-red-600: 229, 57, 53;
71
+ --palette-red-700: 211, 47, 47;
72
+ --palette-red-800: 198, 40, 40;
73
+ --palette-red-900: 183, 28, 28;
74
+ --palette-red-a100: 255, 138, 128;
75
+ --palette-red-a200: 255, 82, 82;
76
+ --palette-red-a400: 255, 23, 68;
77
+ --palette-red-a700: 213, 0, 0;
78
+ --palette-pink-50: 252, 228, 236;
79
+ --palette-pink-100: 248, 187, 208;
80
+ --palette-pink-200: 244, 143, 177;
81
+ --palette-pink-300: 240, 98, 146;
82
+ --palette-pink-400: 236, 64, 122;
83
+ --palette-pink-500: 233, 30, 99;
84
+ --palette-pink-600: 216, 27, 96;
85
+ --palette-pink-700: 194, 24, 91;
86
+ --palette-pink-800: 173, 20, 87;
87
+ --palette-pink-900: 136, 14, 79;
88
+ --palette-pink-a100: 255, 128, 171;
89
+ --palette-pink-a200: 255, 64, 129;
90
+ --palette-pink-a400: 245, 0, 87;
91
+ --palette-pink-a700: 197, 17, 98;
92
+ --palette-purple-50: 243, 229, 245;
93
+ --palette-purple-100: 225, 190, 231;
94
+ --palette-purple-200: 206, 147, 216;
95
+ --palette-purple-300: 186, 104, 200;
96
+ --palette-purple-400: 171, 71, 188;
97
+ --palette-purple-500: 156, 39, 176;
98
+ --palette-purple-600: 142, 36, 170;
99
+ --palette-purple-700: 123, 31, 162;
100
+ --palette-purple-800: 106, 27, 154;
101
+ --palette-purple-900: 74, 20, 140;
102
+ --palette-purple-a100: 234, 128, 252;
103
+ --palette-purple-a200: 224, 64, 251;
104
+ --palette-purple-a400: 213, 0, 249;
105
+ --palette-purple-a700: 170, 0, 255;
106
+ --palette-deep-purple-50: 237, 231, 246;
107
+ --palette-deep-purple-100: 209, 196, 233;
108
+ --palette-deep-purple-200: 179, 157, 219;
109
+ --palette-deep-purple-300: 149, 117, 205;
110
+ --palette-deep-purple-400: 126, 87, 194;
111
+ --palette-deep-purple-500: 103, 58, 183;
112
+ --palette-deep-purple-600: 94, 53, 177;
113
+ --palette-deep-purple-700: 81, 45, 168;
114
+ --palette-deep-purple-800: 69, 39, 160;
115
+ --palette-deep-purple-900: 49, 27, 146;
116
+ --palette-deep-purple-a100: 179, 136, 255;
117
+ --palette-deep-purple-a200: 124, 77, 255;
118
+ --palette-deep-purple-a400: 101, 31, 255;
119
+ --palette-deep-purple-a700: 98, 0, 234;
120
+ --palette-indigo-50: 232, 234, 246;
121
+ --palette-indigo-100: 197, 202, 233;
122
+ --palette-indigo-200: 159, 168, 218;
123
+ --palette-indigo-300: 121, 134, 203;
124
+ --palette-indigo-400: 92, 107, 192;
125
+ --palette-indigo-500: 63, 81, 181;
126
+ --palette-indigo-600: 57, 73, 171;
127
+ --palette-indigo-700: 48, 63, 159;
128
+ --palette-indigo-800: 40, 53, 147;
129
+ --palette-indigo-900: 26, 35, 126;
130
+ --palette-indigo-a100: 140, 158, 255;
131
+ --palette-indigo-a200: 83, 109, 254;
132
+ --palette-indigo-a400: 61, 90, 254;
133
+ --palette-indigo-a700: 48, 79, 254;
134
+ --palette-blue-50: 227, 242, 253;
135
+ --palette-blue-100: 187, 222, 251;
136
+ --palette-blue-200: 144, 202, 249;
137
+ --palette-blue-300: 100, 181, 246;
138
+ --palette-blue-400: 66, 165, 245;
139
+ --palette-blue-500: 33, 150, 243;
140
+ --palette-blue-600: 30, 136, 229;
141
+ --palette-blue-700: 25, 118, 210;
142
+ --palette-blue-800: 21, 101, 192;
143
+ --palette-blue-900: 13, 71, 161;
144
+ --palette-blue-a100: 130, 177, 255;
145
+ --palette-blue-a200: 68, 138, 255;
146
+ --palette-blue-a400: 41, 121, 255;
147
+ --palette-blue-a700: 41, 98, 255;
148
+ --palette-light-blue-50: 225, 245, 254;
149
+ --palette-light-blue-100: 179, 229, 252;
150
+ --palette-light-blue-200: 129, 212, 250;
151
+ --palette-light-blue-300: 79, 195, 247;
152
+ --palette-light-blue-400: 41, 182, 246;
153
+ --palette-light-blue-500: 3, 169, 244;
154
+ --palette-light-blue-600: 3, 155, 229;
155
+ --palette-light-blue-700: 2, 136, 209;
156
+ --palette-light-blue-800: 2, 119, 189;
157
+ --palette-light-blue-900: 1, 87, 155;
158
+ --palette-light-blue-a100: 128, 216, 255;
159
+ --palette-light-blue-a200: 64, 196, 255;
160
+ --palette-light-blue-a400: 0, 176, 255;
161
+ --palette-light-blue-a700: 0, 145, 234;
162
+ --palette-cyan-50: 224, 247, 250;
163
+ --palette-cyan-100: 178, 235, 242;
164
+ --palette-cyan-200: 128, 222, 234;
165
+ --palette-cyan-300: 77, 208, 225;
166
+ --palette-cyan-400: 38, 198, 218;
167
+ --palette-cyan-500: 0, 188, 212;
168
+ --palette-cyan-600: 0, 172, 193;
169
+ --palette-cyan-700: 0, 151, 167;
170
+ --palette-cyan-800: 0, 131, 143;
171
+ --palette-cyan-900: 0, 96, 100;
172
+ --palette-cyan-a100: 132, 255, 255;
173
+ --palette-cyan-a200: 24, 255, 255;
174
+ --palette-cyan-a400: 0, 229, 255;
175
+ --palette-cyan-a700: 0, 184, 212;
176
+ --palette-teal-50: 224, 242, 241;
177
+ --palette-teal-100: 178, 223, 219;
178
+ --palette-teal-200: 128, 203, 196;
179
+ --palette-teal-300: 77, 182, 172;
180
+ --palette-teal-400: 38, 166, 154;
181
+ --palette-teal-500: 0, 150, 136;
182
+ --palette-teal-600: 0, 137, 123;
183
+ --palette-teal-700: 0, 121, 107;
184
+ --palette-teal-800: 0, 105, 92;
185
+ --palette-teal-900: 0, 77, 64;
186
+ --palette-teal-a100: 167, 255, 235;
187
+ --palette-teal-a200: 100, 255, 218;
188
+ --palette-teal-a400: 29, 233, 182;
189
+ --palette-teal-a700: 0, 191, 165;
190
+ --palette-green-50: 232, 245, 233;
191
+ --palette-green-100: 200, 230, 201;
192
+ --palette-green-200: 165, 214, 167;
193
+ --palette-green-300: 129, 199, 132;
194
+ --palette-green-400: 102, 187, 106;
195
+ --palette-green-500: 76, 175, 80;
196
+ --palette-green-600: 67, 160, 71;
197
+ --palette-green-700: 56, 142, 60;
198
+ --palette-green-800: 46, 125, 50;
199
+ --palette-green-900: 27, 94, 32;
200
+ --palette-green-a100: 185, 246, 202;
201
+ --palette-green-a200: 105, 240, 174;
202
+ --palette-green-a400: 0, 230, 118;
203
+ --palette-green-a700: 0, 200, 83;
204
+ --palette-light-green-50: 241, 248, 233;
205
+ --palette-light-green-100: 220, 237, 200;
206
+ --palette-light-green-200: 197, 225, 165;
207
+ --palette-light-green-300: 174, 213, 129;
208
+ --palette-light-green-400: 156, 204, 101;
209
+ --palette-light-green-500: 139, 195, 74;
210
+ --palette-light-green-600: 124, 179, 66;
211
+ --palette-light-green-700: 104, 159, 56;
212
+ --palette-light-green-800: 85, 139, 47;
213
+ --palette-light-green-900: 51, 105, 30;
214
+ --palette-light-green-a100: 204, 255, 144;
215
+ --palette-light-green-a200: 178, 255, 89;
216
+ --palette-light-green-a400: 118, 255, 3;
217
+ --palette-light-green-a700: 100, 221, 23;
218
+ --palette-lime-50: 249, 251, 231;
219
+ --palette-lime-100: 240, 244, 195;
220
+ --palette-lime-200: 230, 238, 156;
221
+ --palette-lime-300: 220, 231, 117;
222
+ --palette-lime-400: 212, 225, 87;
223
+ --palette-lime-500: 205, 220, 57;
224
+ --palette-lime-600: 192, 202, 51;
225
+ --palette-lime-700: 175, 180, 43;
226
+ --palette-lime-800: 158, 157, 36;
227
+ --palette-lime-900: 130, 119, 23;
228
+ --palette-lime-a100: 244, 255, 129;
229
+ --palette-lime-a200: 238, 255, 65;
230
+ --palette-lime-a400: 198, 255, 0;
231
+ --palette-lime-a700: 174, 234, 0;
232
+ --palette-yellow-50: 255, 253, 231;
233
+ --palette-yellow-100: 255, 249, 196;
234
+ --palette-yellow-200: 255, 245, 157;
235
+ --palette-yellow-300: 255, 241, 118;
236
+ --palette-yellow-400: 255, 238, 88;
237
+ --palette-yellow-500: 255, 235, 59;
238
+ --palette-yellow-600: 253, 216, 53;
239
+ --palette-yellow-700: 251, 192, 45;
240
+ --palette-yellow-800: 249, 168, 37;
241
+ --palette-yellow-900: 245, 127, 23;
242
+ --palette-yellow-a100: 255, 255, 141;
243
+ --palette-yellow-a200: 255, 255, 0;
244
+ --palette-yellow-a400: 255, 234, 0;
245
+ --palette-yellow-a700: 255, 214, 0;
246
+ --palette-amber-50: 255, 248, 225;
247
+ --palette-amber-100: 255, 236, 179;
248
+ --palette-amber-200: 255, 224, 130;
249
+ --palette-amber-300: 255, 213, 79;
250
+ --palette-amber-400: 255, 202, 40;
251
+ --palette-amber-500: 255, 193, 7;
252
+ --palette-amber-600: 255, 179, 0;
253
+ --palette-amber-700: 255, 160, 0;
254
+ --palette-amber-800: 255, 143, 0;
255
+ --palette-amber-900: 255, 111, 0;
256
+ --palette-amber-a100: 255, 229, 127;
257
+ --palette-amber-a200: 255, 215, 64;
258
+ --palette-amber-a400: 255, 196, 0;
259
+ --palette-amber-a700: 255, 171, 0;
260
+ --palette-orange-50: 255, 243, 224;
261
+ --palette-orange-100: 255, 224, 178;
262
+ --palette-orange-200: 255, 204, 128;
263
+ --palette-orange-300: 255, 183, 77;
264
+ --palette-orange-400: 255, 167, 38;
265
+ --palette-orange-500: 255, 152, 0;
266
+ --palette-orange-600: 251, 140, 0;
267
+ --palette-orange-700: 245, 124, 0;
268
+ --palette-orange-800: 239, 108, 0;
269
+ --palette-orange-900: 230, 81, 0;
270
+ --palette-orange-a100: 255, 209, 128;
271
+ --palette-orange-a200: 255, 171, 64;
272
+ --palette-orange-a400: 255, 145, 0;
273
+ --palette-orange-a700: 255, 109, 0;
274
+ --palette-deep-orange-50: 251, 233, 231;
275
+ --palette-deep-orange-100: 255, 204, 188;
276
+ --palette-deep-orange-200: 255, 171, 145;
277
+ --palette-deep-orange-300: 255, 138, 101;
278
+ --palette-deep-orange-400: 255, 112, 67;
279
+ --palette-deep-orange-500: 255, 87, 34;
280
+ --palette-deep-orange-600: 244, 81, 30;
281
+ --palette-deep-orange-700: 230, 74, 25;
282
+ --palette-deep-orange-800: 216, 67, 21;
283
+ --palette-deep-orange-900: 191, 54, 12;
284
+ --palette-deep-orange-a100: 255, 158, 128;
285
+ --palette-deep-orange-a200: 255, 110, 64;
286
+ --palette-deep-orange-a400: 255, 61, 0;
287
+ --palette-deep-orange-a700: 221, 44, 0;
288
+ --palette-brown-50: 239, 235, 233;
289
+ --palette-brown-100: 215, 204, 200;
290
+ --palette-brown-200: 188, 170, 164;
291
+ --palette-brown-300: 161, 136, 127;
292
+ --palette-brown-400: 141, 110, 99;
293
+ --palette-brown-500: 121, 85, 72;
294
+ --palette-brown-600: 109, 76, 65;
295
+ --palette-brown-700: 93, 64, 55;
296
+ --palette-brown-800: 78, 52, 46;
297
+ --palette-brown-900: 62, 39, 35;
298
+ --palette-grey-50: 250, 250, 250;
299
+ --palette-grey-100: 245, 245, 245;
300
+ --palette-grey-200: 238, 238, 238;
301
+ --palette-grey-300: 224, 224, 224;
302
+ --palette-grey-400: 189, 189, 189;
303
+ --palette-grey-500: 158, 158, 158;
304
+ --palette-grey-600: 117, 117, 117;
305
+ --palette-grey-700: 97, 97, 97;
306
+ --palette-grey-800: 66, 66, 66;
307
+ --palette-grey-900: 33, 33, 33;
308
+ --palette-blue-grey-50: 236, 239, 241;
309
+ --palette-blue-grey-100: 207, 216, 220;
310
+ --palette-blue-grey-200: 176, 190, 197;
311
+ --palette-blue-grey-300: 144, 164, 174;
312
+ --palette-blue-grey-400: 120, 144, 156;
313
+ --palette-blue-grey-500: 96, 125, 139;
314
+ --palette-blue-grey-600: 84, 110, 122;
315
+ --palette-blue-grey-700: 69, 90, 100;
316
+ --palette-blue-grey-800: 55, 71, 79;
317
+ --palette-blue-grey-900: 38, 50, 56;
318
+ }
319
+
320
+ :root[dark] {
321
+ --color-black: 238, 238, 238;
322
+ --color-white: 11, 11, 11;
323
+ --palette-grey-50: 22, 22, 22;
324
+ --palette-grey-100: 33, 33, 33;
325
+ --palette-grey-200: 44, 44, 44;
326
+ --palette-grey-300: 66, 66, 66;
327
+ --palette-grey-400: 97, 97, 97;
328
+ --palette-grey-500: 117, 117, 117;
329
+ --palette-grey-600: 158, 158, 158;
330
+ --palette-grey-700: 189, 189, 189;
331
+ --palette-grey-800: 224, 224, 224;
332
+ --palette-grey-900: 238, 238, 238;
333
+ }
334
+ :root {
335
+ --color-primary: var(--palette-indigo-500);
336
+ --color-primary-light: var(--palette-indigo-100);
337
+ --color-accent: var(--palette-pink-a200);
338
+ --color-divider: var(--palette-grey-300);
339
+ --preferred-font: "Roboto", "Helvetica", "Arial", sans-serif;
340
+ --font-size: 16px;
341
+ --font-size-small: 14px;
342
+ --font-size-big: 18px;
343
+ --font-weight-semi-bold: 500;
344
+ --font-weight-bold: 700;
345
+ --shadow-2p: 0 2px 2px 0 #00000024, 0 3px 1px -2px #0003, 0 1px 5px 0 #0000001f;
346
+ --shadow-4p: 0 4px 5px 0 #00000024, 0 1px 10px 0 #0000001f, 0 2px 4px -1px #0003;
347
+ --animation-duration: .35s;
348
+ --animation-duration-short: .2s;
349
+ --animation-delay: calc(var(--animation-duration) / 5);
350
+ --animation-curve-fast-out-slow-in: cubic-bezier(.4, 0, .2, 1);
351
+ --animation-curve-fast-out-linear-in: cubic-bezier(.4, 0, 1, 1);
352
+ --animation-curve-focus-ring: cubic-bezier(.2, 0, 0, 1);
353
+ --animation-curve-default: var(--animation-curve-fast-out-slow-in);
354
+ --z-index-highest: 300;
355
+ --z-index-higher: 200;
356
+ --z-index-high: 100;
357
+ --z-index-normal: 1;
358
+ }
359
+
360
+ :root[dark] {
361
+ color-scheme: dark;
362
+ --color-primary: var(--palette-indigo-300);
363
+ --color-primary-light: var(--palette-indigo-900);
364
+ --color-accent: var(--palette-pink-a100);
365
+ }
@@ -0,0 +1,171 @@
1
+ import * as _$react from "react";
2
+ import { ReactNode } from "react";
3
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region src/animation.d.ts
6
+ /** Récupère les paramètres de transition par défaut, à partir des variables CSS correspondantes. */
7
+ declare function getDefaultTransition(): {
8
+ readonly delay: number;
9
+ readonly duration: number;
10
+ readonly ease: [number, number, number, number] | undefined;
11
+ };
12
+ /** Récupère les paramètres de transition "spring" par défaut. */
13
+ declare function getSpringTransition(): {
14
+ readonly type: "spring";
15
+ readonly bounce: 0;
16
+ readonly duration: number;
17
+ };
18
+ //#endregion
19
+ //#region src/config.d.ts
20
+ /** Config Focus de l'application */
21
+ declare const uiConfig: {
22
+ /** Valeur de "autocomplete" sur les inputs pour lesquels on ne veut pas d'autocomplétion. */autocompleteOffValue: string; /** Classe CSS par défaut des icônes. */
23
+ defaultIconClassName: string;
24
+ };
25
+ //#endregion
26
+ //#region src/theme/common.d.ts
27
+ type CSSElement<T> = T & string & {
28
+ _element: void;
29
+ };
30
+ type CSSMod<N extends string, T> = N & T & string & {
31
+ _mod: void;
32
+ };
33
+ type CSSToStrings<T> = { [P in keyof T]?: string };
34
+ type Mods<CSS, E> = { [P in keyof CSS]: CSS[P] extends CSSMod<infer M, E> ? M : never }[keyof CSS];
35
+ type ModNames<CSS, E> = { [P in keyof CSS]: CSS[P] extends CSSMod<infer _, E> ? P : never }[keyof CSS];
36
+ type BemFunction<CSS = any, P extends number | string | symbol = any, E = any> = ((object: true) => { [_ in ModNames<CSS, E> | P]: string }) & (Mods<CSS, E> extends never | undefined ? () => string : (mods?: { [_ in Mods<CSS, E>]?: boolean }) => string);
37
+ interface CSSContext {
38
+ [key: string]: object;
39
+ }
40
+ declare const ThemeContext: _$react.Context<CSSContext>;
41
+ //#endregion
42
+ //#region src/theme/themeable.d.ts
43
+ /** Merges passed themes by concatenating string keys */
44
+ declare function themeable<T extends object>(...themes: T[]): T;
45
+ //#endregion
46
+ //#region src/theme/theme-provider.d.ts
47
+ /** Contient l'ensemble des classes CSS surchargeables (elles le sont toutes), regroupées par composant. */
48
+ interface FocusCSSContext extends CSSContext {
49
+ actionBar: object;
50
+ advancedSearch: object;
51
+ contextualActions: object;
52
+ facet: object;
53
+ facetBox: object;
54
+ group: object;
55
+ list: object;
56
+ listBase: object;
57
+ searchBar: object;
58
+ summary: object;
59
+ table: object;
60
+ timeline: object;
61
+ booleanRadio: object;
62
+ display: object;
63
+ field: object;
64
+ form: object;
65
+ inputDate: object;
66
+ inputFile: object;
67
+ label: object;
68
+ select: object;
69
+ selectCheckbox: object;
70
+ selectChips: object;
71
+ selectRadio: object;
72
+ dialog: object;
73
+ filAriane: object;
74
+ header: object;
75
+ lateralMenu: object;
76
+ layout: object;
77
+ mainMenu: object;
78
+ overlay: object;
79
+ panel: object;
80
+ popin: object;
81
+ scrollable: object;
82
+ scrollspy: object;
83
+ autocomplete: object;
84
+ button: object;
85
+ calendar: object;
86
+ checkbox: object;
87
+ chip: object;
88
+ dropdown: object;
89
+ floatingActionButton: object;
90
+ iconButton: object;
91
+ menu: object;
92
+ progressIndicator: object;
93
+ radio: object;
94
+ ripple: object;
95
+ slider: object;
96
+ snackbar: object;
97
+ supportingText: object;
98
+ switch: object;
99
+ textField: object;
100
+ tabs: object;
101
+ tooltip: object;
102
+ }
103
+ /** Props du ThemeProvider. */
104
+ interface ThemeProviderProps {
105
+ /** Objet faisant correspondre à un identifiant de composant son objet de classes CSS associé. */
106
+ appTheme: Partial<FocusCSSContext>;
107
+ /** Enfants. */
108
+ children: ReactNode;
109
+ }
110
+ /**
111
+ * Le `ThemeProvider` permet d'ajouter des classes CSS aux composants Focus (et autres composants utilisant `useTheme`) posés
112
+ * à l'intérieur (via un context React).
113
+ *
114
+ * Les classes CSS ajoutées dans un `ThemeProvider` s'ajouteront aux éventuelles classes posées par un `ThemeProvider` parent,
115
+ * y compris sur les mêmes composants.
116
+ */
117
+ declare function ThemeProvider({
118
+ appTheme,
119
+ children
120
+ }: ThemeProviderProps): _$react_jsx_runtime0.JSX.Element;
121
+ //#endregion
122
+ //#region src/theme/to-bem.d.ts
123
+ type AllMods<CSS> = { [P in keyof CSS]: CSS[P] extends CSSMod<infer _, infer __> ? P : never }[keyof CSS];
124
+ type ToBem<CSS> = Omit<{ [P in keyof CSS]-?: CSS[P] extends CSSElement<infer E> ? BemFunction<CSS, P, E> : CSS[P] extends CSSMod<infer __, infer ___> ? never : BemFunction<CSS, P, string> }, AllMods<CSS>>;
125
+ type CSSProp<CSS> = CSSToStrings<CSS> | Partial<ToBem<CSS>>;
126
+ /**
127
+ * `toBem` permet de transformer un objet de classes CSS, tel que celui importé d'un module CSS, dont les noms respectent la convention BEM
128
+ * en un objet contenant une fonction par "élément" à laquelle on peut appliquer ses "modificateurs".
129
+ *
130
+ * Par exemple, un objet contenant les classes
131
+ * ```ts
132
+ * ["panel", "panel--editing", "panel--loading", "title", "title--top", "title--bottom"]
133
+ * ```
134
+ * sera transformé en un objet avec 2 fonctions `panel` et `title` :
135
+ * ```ts
136
+ * {
137
+ * panel({editing?: boolean; loading?: boolean}) => string;
138
+ * title({top?: boolean; bottom?: boolean}) => string;
139
+ * }
140
+ * ```
141
+ * Un appel à une fonction retournera la classe CSS de l'"élément", à laquelle seront ajoutées ou non les classes des différents "modificateurs",
142
+ * selon les valeurs des différents booléens.
143
+ *
144
+ * Vous pouvez utiliser `toBem` pour éviter d'avoir à concaténer des classes CSS à la main et pour rendre vos composants et votre CSS plus propres.
145
+ * Son usage est bien évidemment totalement facultatif et à utiliser si cela vous arrange.
146
+ *
147
+ * _Remarque 1 : Les modules CSS importés doivent avoir des définitions Typescript générés par la commande `focus4 cssgen` du module `@focus4/tooling`._
148
+ *
149
+ * _Remarque 2 : Les propriétés `theme` des différents composants Focus acceptent aussi bien un objet CSS classique ou un objet créé par `toBem`._
150
+ */
151
+ declare function toBem<CSS>(css: CSS): ToBem<CSS>;
152
+ /**
153
+ * `fromBem` permet de faire la transformation inverse de `toBem`, à savoir prendre l'objet résultant d'un appel à `toBem` et de ressortir un objet
154
+ * qui contient toutes les classes CSS qui le compose.
155
+ */
156
+ declare function fromBem<T>(css: CSSToStrings<T> | Partial<ToBem<T>> | T): CSSToStrings<T>;
157
+ //#endregion
158
+ //#region src/theme/use-theme.d.ts
159
+ /**
160
+ * `useTheme` permet de récupérer les classes CSS passées dans un éventuel `ThemeProvider` parent et de les fusionner avec d'autres classes CSS
161
+ * passées en paramètre.
162
+ *
163
+ * `useTheme` accepte aussi bien des objets de classes CSS classiques (importés d'un module CSS), que des objets créés avec `toBem`.
164
+ *
165
+ * @param name L'identifiant du composant dans le `appTheme` du `ThemeProvider`
166
+ * @param themes Les objets de classes CSS à fusionner ensemble et avec celui du contexte.
167
+ */
168
+ declare function useTheme<T>(name: string, ...themes: (CSSToStrings<T> | Partial<ToBem<T>> | T | undefined)[]): ToBem<T>;
169
+ //#endregion
170
+ export { type CSSContext, type CSSElement, type CSSMod, type CSSProp, type CSSToStrings, type FocusCSSContext, ThemeContext, ThemeProvider, type ThemeProviderProps, type ToBem, fromBem, getDefaultTransition, getSpringTransition, themeable, toBem, uiConfig, useTheme };
171
+ //# sourceMappingURL=focus4.styling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus4.styling.d.ts","names":[],"sources":["../src/animation.ts","../src/config.ts","../src/theme/common.ts","../src/theme/themeable.ts","../src/theme/theme-provider.tsx","../src/theme/to-bem.ts","../src/theme/use-theme.ts"],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import { createContext, useContext, useMemo } from "react";
2
+ import classNames from "classnames";
3
+ import { pick } from "es-toolkit";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/animation.ts
6
+ function get() {
7
+ const { animationDelay, animationDuration, animationTimingFunction } = window.getComputedStyle(document.body);
8
+ return {
9
+ delay: toMs(animationDelay),
10
+ duration: toMs(animationDuration),
11
+ ease: animationTimingFunction.startsWith("cubic-bezier") ? animationTimingFunction.slice(13).split(",").map(parseFloat) : void 0
12
+ };
13
+ }
14
+ /** Récupère les paramètres de transition par défaut, à partir des variables CSS correspondantes. */
15
+ function getDefaultTransition() {
16
+ const { delay, duration, ease } = get();
17
+ return {
18
+ delay: delay / 1e3,
19
+ duration: duration / 1e3,
20
+ ease
21
+ };
22
+ }
23
+ /** Récupère les paramètres de transition "spring" par défaut. */
24
+ function getSpringTransition() {
25
+ return {
26
+ type: "spring",
27
+ bounce: 0,
28
+ duration: get().duration / 1e3
29
+ };
30
+ }
31
+ function toMs(d) {
32
+ if (d.endsWith("ms")) return +d.slice(0, -2);
33
+ else return +d.slice(0, -1) * 1e3;
34
+ }
35
+ //#endregion
36
+ //#region src/config.ts
37
+ /** Config Focus de l'application */
38
+ const uiConfig = {
39
+ autocompleteOffValue: /Firefox/.test(navigator.userAgent) ? "off" : "one-time-code",
40
+ defaultIconClassName: "material-symbols-outlined"
41
+ };
42
+ //#endregion
43
+ //#region src/theme/common.ts
44
+ const ThemeContext = createContext({});
45
+ //#endregion
46
+ //#region src/theme/themeable.ts
47
+ /** Merges passed themes by concatenating string keys */
48
+ function themeable(...themes) {
49
+ return themes.reduce(merge, {});
50
+ }
51
+ function merge(original = {}, mixin = {}) {
52
+ const result = Object.keys(original).reduce((acc, key) => {
53
+ const value = original[key];
54
+ if (typeof value !== "function") acc[key] = value;
55
+ return acc;
56
+ }, {});
57
+ for (const key in mixin) {
58
+ const originalValue = result[key];
59
+ const mixinValue = mixin[key];
60
+ switch (typeof mixinValue) {
61
+ case "undefined":
62
+ case "function": break;
63
+ default:
64
+ switch (typeof originalValue) {
65
+ case "undefined":
66
+ result[key] = mixinValue;
67
+ break;
68
+ case "function": break;
69
+ default:
70
+ result[key] = [...originalValue.split(" "), ...mixinValue.split(" ")].filter((item, pos, self) => self.indexOf(item) === pos && item !== "").join(" ");
71
+ break;
72
+ }
73
+ break;
74
+ }
75
+ }
76
+ return result;
77
+ }
78
+ //#endregion
79
+ //#region src/theme/to-bem.ts
80
+ /**
81
+ * `toBem` permet de transformer un objet de classes CSS, tel que celui importé d'un module CSS, dont les noms respectent la convention BEM
82
+ * en un objet contenant une fonction par "élément" à laquelle on peut appliquer ses "modificateurs".
83
+ *
84
+ * Par exemple, un objet contenant les classes
85
+ * ```ts
86
+ * ["panel", "panel--editing", "panel--loading", "title", "title--top", "title--bottom"]
87
+ * ```
88
+ * sera transformé en un objet avec 2 fonctions `panel` et `title` :
89
+ * ```ts
90
+ * {
91
+ * panel({editing?: boolean; loading?: boolean}) => string;
92
+ * title({top?: boolean; bottom?: boolean}) => string;
93
+ * }
94
+ * ```
95
+ * Un appel à une fonction retournera la classe CSS de l'"élément", à laquelle seront ajoutées ou non les classes des différents "modificateurs",
96
+ * selon les valeurs des différents booléens.
97
+ *
98
+ * Vous pouvez utiliser `toBem` pour éviter d'avoir à concaténer des classes CSS à la main et pour rendre vos composants et votre CSS plus propres.
99
+ * Son usage est bien évidemment totalement facultatif et à utiliser si cela vous arrange.
100
+ *
101
+ * _Remarque 1 : Les modules CSS importés doivent avoir des définitions Typescript générés par la commande `focus4 cssgen` du module `@focus4/tooling`._
102
+ *
103
+ * _Remarque 2 : Les propriétés `theme` des différents composants Focus acceptent aussi bien un objet CSS classique ou un objet créé par `toBem`._
104
+ */
105
+ function toBem(css) {
106
+ const data = {};
107
+ for (const key in css) {
108
+ const [element, modifier] = key.split("--");
109
+ if (data[element] && modifier) data[element].push(modifier);
110
+ else if (!data[element]) data[element] = modifier ? [modifier] : [];
111
+ }
112
+ return Object.keys(data).reduce((bem, key) => ({
113
+ ...bem,
114
+ [key]: (mods = {}) => {
115
+ if (mods !== true) return classNames(css[key], ...data[key].filter((mod) => mods[mod]).map((mod) => css[`${key}--${mod}`]));
116
+ else return pick(css, [key, ...data[key].map((mod) => `${key}--${mod}`)]);
117
+ }
118
+ }), {});
119
+ }
120
+ /**
121
+ * `fromBem` permet de faire la transformation inverse de `toBem`, à savoir prendre l'objet résultant d'un appel à `toBem` et de ressortir un objet
122
+ * qui contient toutes les classes CSS qui le compose.
123
+ */
124
+ function fromBem(css) {
125
+ const res = {};
126
+ for (const key in css) {
127
+ const value = css[key];
128
+ if (value) if (typeof value === "string") res[key] = value;
129
+ else Object.assign(res, value(true));
130
+ }
131
+ return res;
132
+ }
133
+ //#endregion
134
+ //#region src/theme/theme-provider.tsx
135
+ /**
136
+ * Le `ThemeProvider` permet d'ajouter des classes CSS aux composants Focus (et autres composants utilisant `useTheme`) posés
137
+ * à l'intérieur (via un context React).
138
+ *
139
+ * Les classes CSS ajoutées dans un `ThemeProvider` s'ajouteront aux éventuelles classes posées par un `ThemeProvider` parent,
140
+ * y compris sur les mêmes composants.
141
+ */
142
+ function ThemeProvider({ appTheme, children }) {
143
+ const context = useContext(ThemeContext);
144
+ const mergedContext = useMemo(() => {
145
+ const mc = {};
146
+ for (const key in context) if (key in appTheme && appTheme[key]) mc[key] = themeable(fromBem(context[key]), fromBem(appTheme[key]));
147
+ else mc[key] = context[key];
148
+ for (const key in appTheme) if (!(key in context) && appTheme[key]) mc[key] = appTheme[key];
149
+ return mc;
150
+ }, [appTheme, context]);
151
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, {
152
+ value: mergedContext,
153
+ children
154
+ });
155
+ }
156
+ //#endregion
157
+ //#region src/theme/use-theme.ts
158
+ /**
159
+ * `useTheme` permet de récupérer les classes CSS passées dans un éventuel `ThemeProvider` parent et de les fusionner avec d'autres classes CSS
160
+ * passées en paramètre.
161
+ *
162
+ * `useTheme` accepte aussi bien des objets de classes CSS classiques (importés d'un module CSS), que des objets créés avec `toBem`.
163
+ *
164
+ * @param name L'identifiant du composant dans le `appTheme` du `ThemeProvider`
165
+ * @param themes Les objets de classes CSS à fusionner ensemble et avec celui du contexte.
166
+ */
167
+ function useTheme(name, ...themes) {
168
+ return toBem(themeable(fromBem(useContext(ThemeContext)[name]) || {}, ...themes.filter((x) => x).map((x) => fromBem(x))));
169
+ }
170
+ //#endregion
171
+ export { ThemeContext, ThemeProvider, fromBem, getDefaultTransition, getSpringTransition, themeable, toBem, uiConfig, useTheme };
172
+
173
+ //# sourceMappingURL=focus4.styling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus4.styling.js","names":[],"sources":["../src/animation.ts","../src/config.ts","../src/theme/common.ts","../src/theme/themeable.ts","../src/theme/to-bem.ts","../src/theme/theme-provider.tsx","../src/theme/use-theme.ts"],"sourcesContent":["function get() {\r\n const {animationDelay, animationDuration, animationTimingFunction} = window.getComputedStyle(document.body);\r\n\r\n const delay = toMs(animationDelay);\r\n const duration = toMs(animationDuration);\r\n const ease = animationTimingFunction.startsWith(\"cubic-bezier\")\r\n ? (animationTimingFunction.slice(13).split(\",\").map(parseFloat) as [number, number, number, number])\r\n : undefined;\r\n\r\n return {delay, duration, ease};\r\n}\r\n\r\n/** Récupère les paramètres de transition par défaut, à partir des variables CSS correspondantes. */\r\nexport function getDefaultTransition() {\r\n const {delay, duration, ease} = get();\r\n return {\r\n delay: delay / 1000,\r\n duration: duration / 1000,\r\n ease\r\n } as const;\r\n}\r\n\r\n/** Récupère les paramètres de transition \"spring\" par défaut. */\r\nexport function getSpringTransition() {\r\n return {\r\n type: \"spring\",\r\n bounce: 0,\r\n duration: get().duration / 1000\r\n } as const;\r\n}\r\n\r\nfunction toMs(d: string) {\r\n if (d.endsWith(\"ms\")) {\r\n return +d.slice(0, -2);\r\n } else {\r\n return +d.slice(0, -1) * 1000;\r\n }\r\n}\r\n","/** Config Focus de l'application */\r\nexport const uiConfig = {\r\n /** Valeur de \"autocomplete\" sur les inputs pour lesquels on ne veut pas d'autocomplétion. */\r\n autocompleteOffValue: /Firefox/.test(navigator.userAgent) ? \"off\" : \"one-time-code\",\r\n\r\n /** Classe CSS par défaut des icônes. */\r\n defaultIconClassName: \"material-symbols-outlined\"\r\n};\r\n","import {createContext} from \"react\";\r\n\r\nexport type CSSElement<T> = T & string & {_element: void};\r\nexport type CSSMod<N extends string, T> = N & T & string & {_mod: void};\r\nexport type CSSToStrings<T> = {[P in keyof T]?: string};\r\n\r\nexport type Mods<CSS, E> = {[P in keyof CSS]: CSS[P] extends CSSMod<infer M, E> ? M : never}[keyof CSS];\r\nexport type ModNames<CSS, E> = {[P in keyof CSS]: CSS[P] extends CSSMod<infer _, E> ? P : never}[keyof CSS];\r\nexport type BemFunction<CSS = any, P extends number | string | symbol = any, E = any> = ((object: true) => {\r\n [_ in ModNames<CSS, E> | P]: string;\r\n}) &\r\n (Mods<CSS, E> extends never | undefined ? () => string : (mods?: {[_ in Mods<CSS, E>]?: boolean}) => string);\r\n\r\nexport interface CSSContext {\r\n [key: string]: object;\r\n}\r\n\r\nexport const ThemeContext = createContext<CSSContext>({});\r\n","/** Merges passed themes by concatenating string keys */\r\nexport function themeable<T extends object>(...themes: T[]) {\r\n return themes.reduce(merge, {}) as T;\r\n}\r\n\r\nfunction merge<T extends {[key: string]: string}>(original = {} as T, mixin = {} as T) {\r\n /*\r\n * Make a copy to avoid mutations of nested objects\r\n * also strip all functions injected by isomorphic-style-loader\r\n */\r\n const result = Object.keys(original).reduce(\r\n (acc, key) => {\r\n const value = original[key];\r\n if (typeof value !== \"function\") {\r\n acc[key] = value;\r\n }\r\n return acc;\r\n },\r\n {} as {[key: string]: string}\r\n );\r\n\r\n // Traverse mixin keys and merge them to resulting theme\r\n for (const key in mixin) {\r\n // There's no need to set any defaults here\r\n const originalValue = result[key];\r\n const mixinValue = mixin[key];\r\n\r\n switch (typeof mixinValue) {\r\n case \"undefined\": // Fallthrough - handles accidentally unset values which may come from props\r\n case \"function\":\r\n // This handles issue when isomorphic-style-loader addes helper functions to css-module\r\n break; // Just skip\r\n\r\n default:\r\n // Plain values\r\n switch (typeof originalValue) {\r\n case \"undefined\":\r\n // Mixin key is new to original theme - take it as is\r\n result[key] = mixinValue;\r\n break;\r\n\r\n case \"function\":\r\n // This handles issue when isomorphic-style-loader addes helper functions to css-module\r\n break; // Just skip\r\n\r\n default:\r\n // Finally we can merge\r\n result[key] = [...originalValue.split(\" \"), ...mixinValue.split(\" \")]\r\n .filter((item, pos, self) => self.indexOf(item) === pos && item !== \"\")\r\n .join(\" \");\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","import classNames from \"classnames\";\r\nimport {pick} from \"es-toolkit\";\r\n\r\nimport {BemFunction, CSSElement, CSSMod, CSSToStrings} from \"./common\";\r\n\r\nexport type AllMods<CSS> = {[P in keyof CSS]: CSS[P] extends CSSMod<infer _, infer __> ? P : never}[keyof CSS];\r\nexport type ToBem<CSS> = Omit<\r\n {\r\n [P in keyof CSS]-?: CSS[P] extends CSSElement<infer E>\r\n ? BemFunction<CSS, P, E>\r\n : CSS[P] extends CSSMod<infer __, infer ___>\r\n ? never\r\n : BemFunction<CSS, P, string>;\r\n },\r\n AllMods<CSS>\r\n>;\r\n\r\nexport type CSSProp<CSS> = CSSToStrings<CSS> | Partial<ToBem<CSS>>;\r\n\r\n/**\r\n * `toBem` permet de transformer un objet de classes CSS, tel que celui importé d'un module CSS, dont les noms respectent la convention BEM\r\n * en un objet contenant une fonction par \"élément\" à laquelle on peut appliquer ses \"modificateurs\".\r\n *\r\n * Par exemple, un objet contenant les classes\r\n * ```ts\r\n * [\"panel\", \"panel--editing\", \"panel--loading\", \"title\", \"title--top\", \"title--bottom\"]\r\n * ```\r\n * sera transformé en un objet avec 2 fonctions `panel` et `title` :\r\n * ```ts\r\n * {\r\n * panel({editing?: boolean; loading?: boolean}) => string;\r\n * title({top?: boolean; bottom?: boolean}) => string;\r\n * }\r\n * ```\r\n * Un appel à une fonction retournera la classe CSS de l'\"élément\", à laquelle seront ajoutées ou non les classes des différents \"modificateurs\",\r\n * selon les valeurs des différents booléens.\r\n *\r\n * Vous pouvez utiliser `toBem` pour éviter d'avoir à concaténer des classes CSS à la main et pour rendre vos composants et votre CSS plus propres.\r\n * Son usage est bien évidemment totalement facultatif et à utiliser si cela vous arrange.\r\n *\r\n * _Remarque 1 : Les modules CSS importés doivent avoir des définitions Typescript générés par la commande `focus4 cssgen` du module `@focus4/tooling`._\r\n *\r\n * _Remarque 2 : Les propriétés `theme` des différents composants Focus acceptent aussi bien un objet CSS classique ou un objet créé par `toBem`._\r\n */\r\nexport function toBem<CSS>(css: CSS): ToBem<CSS> {\r\n const data: {[key: string]: string[]} = {};\r\n for (const key in css) {\r\n const [element, modifier] = key.split(\"--\");\r\n if (data[element] && modifier) {\r\n data[element].push(modifier);\r\n } else if (!data[element]) {\r\n data[element] = modifier ? [modifier] : [];\r\n }\r\n }\r\n\r\n return Object.keys(data).reduce(\r\n (bem, key) => ({\r\n ...bem,\r\n [key]: (mods: true | {[key: string]: boolean} = {}) => {\r\n if (mods !== true) {\r\n return classNames(\r\n (css as any)[key],\r\n ...data[key].filter(mod => mods[mod]).map(mod => (css as any)[`${key}--${mod}`])\r\n );\r\n } else {\r\n return pick(css as any, [key, ...data[key].map(mod => `${key}--${mod}`)]);\r\n }\r\n }\r\n }),\r\n {}\r\n ) as ToBem<CSS>;\r\n}\r\n\r\n/**\r\n * `fromBem` permet de faire la transformation inverse de `toBem`, à savoir prendre l'objet résultant d'un appel à `toBem` et de ressortir un objet\r\n * qui contient toutes les classes CSS qui le compose.\r\n */\r\nexport function fromBem<T>(css: CSSToStrings<T> | Partial<ToBem<T>> | T): CSSToStrings<T> {\r\n const res: CSSToStrings<T> = {};\r\n\r\n for (const key in css as any) {\r\n const value = (css as any)[key];\r\n if (value) {\r\n if (typeof value === \"string\") {\r\n (res as any)[key] = value;\r\n } else {\r\n Object.assign(res, value(true));\r\n }\r\n }\r\n }\r\n\r\n return res;\r\n}\r\n","import {ReactNode, useContext, useMemo} from \"react\";\r\n\r\nimport {CSSContext, ThemeContext} from \"./common\";\r\nimport {themeable} from \"./themeable\";\r\nimport {fromBem} from \"./to-bem\";\r\n\r\n/** Contient l'ensemble des classes CSS surchargeables (elles le sont toutes), regroupées par composant. */\r\nexport interface FocusCSSContext extends CSSContext {\r\n // Collections\r\n actionBar: object;\r\n advancedSearch: object;\r\n contextualActions: object;\r\n facet: object;\r\n facetBox: object;\r\n group: object;\r\n list: object;\r\n listBase: object;\r\n searchBar: object;\r\n summary: object;\r\n table: object;\r\n timeline: object;\r\n\r\n // Forms\r\n booleanRadio: object;\r\n display: object;\r\n field: object;\r\n form: object;\r\n inputDate: object;\r\n inputFile: object;\r\n label: object;\r\n select: object;\r\n selectCheckbox: object;\r\n selectChips: object;\r\n selectRadio: object;\r\n\r\n // Layout\r\n dialog: object;\r\n filAriane: object;\r\n header: object;\r\n lateralMenu: object;\r\n layout: object;\r\n mainMenu: object;\r\n overlay: object;\r\n panel: object;\r\n popin: object;\r\n scrollable: object;\r\n scrollspy: object;\r\n\r\n // Toolbox\r\n autocomplete: object;\r\n button: object;\r\n calendar: object;\r\n checkbox: object;\r\n chip: object;\r\n dropdown: object;\r\n floatingActionButton: object;\r\n iconButton: object;\r\n menu: object;\r\n progressIndicator: object;\r\n radio: object;\r\n ripple: object;\r\n slider: object;\r\n snackbar: object;\r\n supportingText: object;\r\n switch: object;\r\n textField: object;\r\n tabs: object;\r\n tooltip: object;\r\n}\r\n\r\n/** Props du ThemeProvider. */\r\nexport interface ThemeProviderProps {\r\n /** Objet faisant correspondre à un identifiant de composant son objet de classes CSS associé. */\r\n appTheme: Partial<FocusCSSContext>;\r\n /** Enfants. */\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * Le `ThemeProvider` permet d'ajouter des classes CSS aux composants Focus (et autres composants utilisant `useTheme`) posés\r\n * à l'intérieur (via un context React).\r\n *\r\n * Les classes CSS ajoutées dans un `ThemeProvider` s'ajouteront aux éventuelles classes posées par un `ThemeProvider` parent,\r\n * y compris sur les mêmes composants.\r\n */\r\nexport function ThemeProvider({appTheme, children}: ThemeProviderProps) {\r\n const context = useContext(ThemeContext);\r\n\r\n const mergedContext = useMemo(() => {\r\n const mc = {} as CSSContext;\r\n\r\n for (const key in context) {\r\n if (key in appTheme && appTheme[key]) {\r\n mc[key] = themeable(fromBem(context[key]), fromBem(appTheme[key]));\r\n } else {\r\n mc[key] = context[key];\r\n }\r\n }\r\n\r\n for (const key in appTheme) {\r\n if (!(key in context) && appTheme[key]) {\r\n mc[key] = appTheme[key]!;\r\n }\r\n }\r\n return mc;\r\n }, [appTheme, context]);\r\n\r\n return <ThemeContext.Provider value={mergedContext}>{children}</ThemeContext.Provider>;\r\n}\r\n","import {useContext} from \"react\";\r\n\r\nimport {CSSToStrings, ThemeContext} from \"./common\";\r\nimport {themeable} from \"./themeable\";\r\nimport {fromBem, toBem, ToBem} from \"./to-bem\";\r\n\r\n/**\r\n * `useTheme` permet de récupérer les classes CSS passées dans un éventuel `ThemeProvider` parent et de les fusionner avec d'autres classes CSS\r\n * passées en paramètre.\r\n *\r\n * `useTheme` accepte aussi bien des objets de classes CSS classiques (importés d'un module CSS), que des objets créés avec `toBem`.\r\n *\r\n * @param name L'identifiant du composant dans le `appTheme` du `ThemeProvider`\r\n * @param themes Les objets de classes CSS à fusionner ensemble et avec celui du contexte.\r\n */\r\nexport function useTheme<T>(\r\n name: string,\r\n ...themes: (CSSToStrings<T> | Partial<ToBem<T>> | T | undefined)[]\r\n): ToBem<T> {\r\n const contextTheme = fromBem(useContext(ThemeContext)[name]) || {};\r\n return toBem(themeable(contextTheme, ...themes.filter(x => x).map(x => fromBem(x!))) as T);\r\n}\r\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@focus4/styling",
3
- "version": "12.11.0",
3
+ "version": "12.11.1",
4
4
  "description": "Focus v4, styling module",
5
5
  "main": "lib/focus4.styling.js",
6
6
  "type": "module",
@@ -26,4 +26,4 @@
26
26
  "react": ">= 19 < 20",
27
27
  "react-dom": ">= 19 < 20"
28
28
  }
29
- }
29
+ }