@widergy/energy-ui 3.167.1 → 3.168.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/components/UTLoading/README.md +85 -0
  3. package/dist/components/UTLoading/components/Spinner/index.js +1 -1
  4. package/dist/components/UTLoading/index.js +17 -7
  5. package/dist/components/UTLoading/versions/V0/index.js +32 -0
  6. package/dist/components/UTLoading/versions/V1/components/LogoLoader/components/GradientTrack/index.js +65 -0
  7. package/dist/components/UTLoading/versions/V1/components/LogoLoader/constants.js +14 -0
  8. package/dist/components/UTLoading/versions/V1/components/LogoLoader/index.js +54 -0
  9. package/dist/components/UTLoading/versions/V1/components/LogoLoader/styles.module.scss +107 -0
  10. package/dist/components/UTLoading/versions/V1/components/LogoLoader/theme.js +18 -0
  11. package/dist/components/UTLoading/versions/V1/components/Spinner/components/SpinnerTrack/constants.js +7 -0
  12. package/dist/components/UTLoading/versions/V1/components/Spinner/components/SpinnerTrack/index.js +57 -0
  13. package/dist/components/UTLoading/versions/V1/components/Spinner/constants.js +12 -0
  14. package/dist/components/UTLoading/versions/V1/components/Spinner/index.js +56 -0
  15. package/dist/components/UTLoading/versions/V1/components/Spinner/styles.module.scss +39 -0
  16. package/dist/components/UTLoading/versions/V1/components/Spinner/theme.js +21 -0
  17. package/dist/components/UTLoading/versions/V1/constants.js +11 -0
  18. package/dist/components/UTLoading/versions/V1/index.js +30 -0
  19. package/dist/components/UTLoading/versions/V1/stories/UTLoadingV1.mdx +67 -0
  20. package/dist/components/UTLoading/versions/V1/stories/UTLoadingV1.stories.js +369 -0
  21. package/dist/constants/testIds.js +4 -0
  22. package/dist/esm/components/UTLoading/README.md +85 -0
  23. package/dist/esm/components/UTLoading/components/Spinner/index.js +1 -1
  24. package/dist/esm/components/UTLoading/index.js +18 -8
  25. package/dist/esm/components/UTLoading/versions/V0/index.js +25 -0
  26. package/dist/esm/components/UTLoading/versions/V1/components/LogoLoader/components/GradientTrack/index.js +58 -0
  27. package/dist/esm/components/UTLoading/versions/V1/components/LogoLoader/constants.js +8 -0
  28. package/dist/esm/components/UTLoading/versions/V1/components/LogoLoader/index.js +47 -0
  29. package/dist/esm/components/UTLoading/versions/V1/components/LogoLoader/styles.module.scss +107 -0
  30. package/dist/esm/components/UTLoading/versions/V1/components/LogoLoader/theme.js +11 -0
  31. package/dist/esm/components/UTLoading/versions/V1/components/Spinner/components/SpinnerTrack/constants.js +1 -0
  32. package/dist/esm/components/UTLoading/versions/V1/components/Spinner/components/SpinnerTrack/index.js +50 -0
  33. package/dist/esm/components/UTLoading/versions/V1/components/Spinner/constants.js +6 -0
  34. package/dist/esm/components/UTLoading/versions/V1/components/Spinner/index.js +49 -0
  35. package/dist/esm/components/UTLoading/versions/V1/components/Spinner/styles.module.scss +39 -0
  36. package/dist/esm/components/UTLoading/versions/V1/components/Spinner/theme.js +14 -0
  37. package/dist/esm/components/UTLoading/versions/V1/constants.js +5 -0
  38. package/dist/esm/components/UTLoading/versions/V1/index.js +23 -0
  39. package/dist/esm/components/UTLoading/versions/V1/stories/UTLoadingV1.mdx +67 -0
  40. package/dist/esm/components/UTLoading/versions/V1/stories/UTLoadingV1.stories.js +362 -0
  41. package/dist/esm/constants/testIds.js +4 -0
  42. package/dist/esm/utils/hooks/useCSSVariables/constants.js +16 -1
  43. package/dist/utils/hooks/useCSSVariables/constants.js +16 -1
  44. package/package.json +1 -1
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = require("prop-types");
9
+ var _LogoLoader = _interopRequireDefault(require("./components/LogoLoader"));
10
+ var _Spinner = _interopRequireDefault(require("./components/Spinner"));
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const V1 = props => {
13
+ const {
14
+ useUtilityLoading
15
+ } = props;
16
+ return useUtilityLoading ? /*#__PURE__*/_react.default.createElement(_LogoLoader.default, props) : /*#__PURE__*/_react.default.createElement(_Spinner.default, props);
17
+ };
18
+ V1.propTypes = {
19
+ children: _propTypes.node,
20
+ colors: (0, _propTypes.arrayOf)(_propTypes.string),
21
+ dataTestId: _propTypes.string,
22
+ fullScreen: _propTypes.bool,
23
+ loading: _propTypes.bool,
24
+ Logo: _propTypes.string,
25
+ preventUnmount: _propTypes.bool,
26
+ text: _propTypes.string,
27
+ useUtilityLoading: _propTypes.bool,
28
+ wrapperClassName: _propTypes.string
29
+ };
30
+ var _default = exports.default = V1;
@@ -0,0 +1,67 @@
1
+ import { Canvas, Controls, Meta, Story } from '@storybook/blocks';
2
+ import * as UTLoadingV1Stories from './UTLoadingV1.stories';
3
+
4
+ <Meta of={UTLoadingV1Stories} />
5
+
6
+ # UTLoading — V1
7
+
8
+ Nueva versión del componente de carga. Incluye un Spinner custom con línea más gruesa y un LogoLoader con track de gradiente animado usando los colores de identidad del cliente.
9
+
10
+ ## Cómo activar V1
11
+
12
+ Pasar la prop `version="V1"` al componente. Sin esta prop el comportamiento es idéntico al actual (V0).
13
+
14
+ ```jsx
15
+ <UTLoading version="V1" loading useUtilityLoading={false} />
16
+ ```
17
+
18
+ ## Spinner
19
+
20
+ Spinner circular CSS puro. Muestra una línea circular con track de fondo y arco superior en el color de acento del tema. Soporta un label de texto opcional debajo.
21
+
22
+ <Canvas of={UTLoadingV1Stories.SpinnerPlayground} />
23
+ <Controls of={UTLoadingV1Stories.SpinnerPlayground} />
24
+
25
+ ## LogoLoader
26
+
27
+ Loader con track circular de gradiente de 2 colores (colores de identidad del cliente). El logo/isologo del cliente se muestra centrado con una animación de escala sincronizada con la rotación del track.
28
+
29
+ ### Full Screen
30
+
31
+ Cuando `fullScreen=true` el contenedor ocupa toda la pantalla con `position: fixed` y `z-index: 999`.
32
+
33
+ <Canvas of={UTLoadingV1Stories.LogoLoaderFullScreen} />
34
+
35
+ ### En contenedor
36
+
37
+ Cuando `fullScreen=false` el loader se adapta al contenedor padre y se centra dentro de él.
38
+
39
+ <Canvas of={UTLoadingV1Stories.LogoLoaderEnContenedor} />
40
+
41
+ ### Con logo del cliente
42
+
43
+ <Canvas of={UTLoadingV1Stories.LogoLoaderConLogo} />
44
+
45
+ ## Props
46
+
47
+ | Prop | Tipo | Default | Descripción |
48
+ |------|------|---------|-------------|
49
+ | `version` | `string` | `'V0'` | `'V0'` o `'V1'` — versión a renderizar |
50
+ | `loading` | `bool` | — | Muestra el loader cuando `true`, los `children` cuando `false` |
51
+ | `useUtilityLoading` | `bool` | — | `true` → LogoLoader; `false` → Spinner |
52
+ | `fullScreen` | `bool` | `true` | Full screen (`position: fixed`) o adaptado al contenedor |
53
+ | `Logo` | `string` | — | URL del SVG del logo/isologo del cliente |
54
+ | `text` | `string` | `'Cargando...'` | Texto de carga. Pasar `''` para ocultarlo |
55
+ | `dataTestId` | `string` | — | `data-testid` del elemento raíz |
56
+ | `preventUnmount` | `bool` | `false` | Mantiene los children en el DOM cuando `loading=true` (solo Spinner) |
57
+ | `wrapperClassName` | `string` | — | Clase del wrapper de children (solo Spinner) |
58
+
59
+ ## Design tokens
60
+
61
+ | Token | Propiedad | Fallback |
62
+ |-------|-----------|---------|
63
+ | `--UT-loading-track-color-start` | Color inicial del gradiente del track | Color de identidad 1 del cliente |
64
+ | `--UT-loading-track-color-end` | Color final del gradiente del track | Color de identidad 2 del cliente |
65
+ | `--UT-loading-gap` | Gap entre track/spinner y label | `8px` |
66
+
67
+ > Los tokens de color del gradiente se inyectan automáticamente desde los colores de identidad del cliente (`identitySolidTone1` y `identitySolidTone2`).
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.TestSite = exports.SpinnerSinTexto = exports.SpinnerPlayground = exports.SpinnerConGradiente = exports.LogoLoaderSinTexto = exports.LogoLoaderFullScreen = exports.LogoLoaderEnContenedor = exports.LogoLoaderConLogo = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _index = _interopRequireDefault(require("../../../index"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ var _default = exports.default = {
11
+ args: {
12
+ loading: true,
13
+ version: 'V1'
14
+ },
15
+ argTypes: {
16
+ colors: {
17
+ control: 'object',
18
+ description: 'Array de colores para el Spinner. 2 colores → gradiente lineal. 1 color → sólido. Sin prop → usa el color del tema.',
19
+ table: {
20
+ defaultValue: {
21
+ summary: 'undefined'
22
+ },
23
+ type: {
24
+ summary: 'string[]'
25
+ }
26
+ }
27
+ },
28
+ dataTestId: {
29
+ control: 'text',
30
+ description: 'Identificador para pruebas automatizadas.',
31
+ table: {
32
+ defaultValue: {
33
+ summary: 'undefined'
34
+ },
35
+ type: {
36
+ summary: 'string'
37
+ }
38
+ }
39
+ },
40
+ fullScreen: {
41
+ control: 'boolean',
42
+ description: 'Cuando es true el loader ocupa toda la pantalla (position fixed). Cuando es false se adapta al contenedor padre.',
43
+ table: {
44
+ defaultValue: {
45
+ summary: 'true'
46
+ },
47
+ type: {
48
+ summary: 'boolean'
49
+ }
50
+ }
51
+ },
52
+ loading: {
53
+ control: 'boolean',
54
+ description: 'Controla si se muestra el loader o los children.',
55
+ table: {
56
+ defaultValue: {
57
+ summary: 'undefined'
58
+ },
59
+ type: {
60
+ summary: 'boolean'
61
+ }
62
+ }
63
+ },
64
+ Logo: {
65
+ control: 'text',
66
+ description: 'URL del asset SVG del logo/isologo del cliente.',
67
+ table: {
68
+ defaultValue: {
69
+ summary: 'undefined'
70
+ },
71
+ type: {
72
+ summary: 'string'
73
+ }
74
+ }
75
+ },
76
+ text: {
77
+ control: 'text',
78
+ description: 'Texto de carga opcional.',
79
+ table: {
80
+ defaultValue: {
81
+ summary: 'Cargando...'
82
+ },
83
+ type: {
84
+ summary: 'string'
85
+ }
86
+ }
87
+ },
88
+ useUtilityLoading: {
89
+ control: 'boolean',
90
+ description: 'Cuando es true muestra el LogoLoader. Cuando es false muestra el Spinner nuevo.',
91
+ table: {
92
+ defaultValue: {
93
+ summary: 'false'
94
+ },
95
+ type: {
96
+ summary: 'boolean'
97
+ }
98
+ }
99
+ },
100
+ version: {
101
+ control: 'select',
102
+ description: 'Versión del componente a utilizar.',
103
+ options: ['V0', 'V1'],
104
+ table: {
105
+ defaultValue: {
106
+ summary: 'V0'
107
+ },
108
+ type: {
109
+ summary: "'V0' | 'V1'"
110
+ }
111
+ }
112
+ }
113
+ },
114
+ component: _index.default,
115
+ parameters: {
116
+ controls: {
117
+ exclude: ['classes', 'className', 'color', 'size', 'textClassName', 'thickness', 'wrapperClassName']
118
+ },
119
+ docs: {
120
+ description: {
121
+ component: 'UTLoading V1 — Nueva versión del componente de carga. Incluye un Spinner custom con línea gruesa y un LogoLoader con track de gradiente animado y logo del cliente.'
122
+ }
123
+ }
124
+ },
125
+ title: 'Energy-UI/UTLoading/V1'
126
+ };
127
+ const SpinnerPlayground = exports.SpinnerPlayground = {
128
+ args: {
129
+ loading: true,
130
+ text: 'Cargando...',
131
+ useUtilityLoading: false,
132
+ version: 'V1'
133
+ },
134
+ name: 'Spinner — Playground',
135
+ parameters: {
136
+ docs: {
137
+ description: {
138
+ story: 'Spinner circular custom con línea gruesa y label de texto opcional.'
139
+ }
140
+ }
141
+ }
142
+ };
143
+ const SpinnerConGradiente = exports.SpinnerConGradiente = {
144
+ args: {
145
+ colors: ['var(--UT-loading-color-start)', 'var(--UT-loading-color-end)'],
146
+ loading: true,
147
+ text: 'Cargando...',
148
+ useUtilityLoading: false,
149
+ version: 'V1'
150
+ },
151
+ decorators: [Story => /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("style", null, "\n :root {\n --identitySolidTone3: #4D97FA;\n --identitySolidTone2: #7BB8FF;\n --UT-loading-color-start: var(--identitySolidTone3);\n --UT-loading-color-end: var(--identitySolidTone2);\n }\n "), /*#__PURE__*/_react.default.createElement(Story, null))],
152
+ name: 'Spinner — Con gradiente',
153
+ parameters: {
154
+ docs: {
155
+ description: {
156
+ story: 'Spinner con gradiente lineal. Se pasan 2 colores vía prop `colors`. En producción se inyectan desde los design tokens `--UT-loading-color-start` y `--UT-loading-color-end`.'
157
+ }
158
+ }
159
+ }
160
+ };
161
+ const SpinnerSinTexto = exports.SpinnerSinTexto = {
162
+ args: {
163
+ loading: true,
164
+ text: '',
165
+ useUtilityLoading: false,
166
+ version: 'V1'
167
+ },
168
+ name: 'Spinner — Sin texto',
169
+ parameters: {
170
+ docs: {
171
+ description: {
172
+ story: 'Spinner sin label de texto.'
173
+ }
174
+ }
175
+ }
176
+ };
177
+ const LogoLoaderFullScreen = exports.LogoLoaderFullScreen = {
178
+ args: {
179
+ fullScreen: true,
180
+ loading: true,
181
+ Logo: 'https://utilitygo-demo-qa-ev.widergydev.com/favicon.png',
182
+ text: '',
183
+ useUtilityLoading: true,
184
+ version: 'V1'
185
+ },
186
+ name: 'LogoLoader — Full Screen',
187
+ parameters: {
188
+ docs: {
189
+ description: {
190
+ story: 'LogoLoader en modo full screen (position fixed, z-index 999). Muestra el track con gradiente de identidad del cliente rotando.'
191
+ }
192
+ }
193
+ }
194
+ };
195
+ const LogoLoaderEnContenedor = exports.LogoLoaderEnContenedor = {
196
+ args: {
197
+ fullScreen: false,
198
+ loading: true,
199
+ Logo: 'https://utilitygo-demo-qa-ev.widergydev.com/favicon.png',
200
+ text: 'Cargando...',
201
+ useUtilityLoading: true,
202
+ version: 'V1'
203
+ },
204
+ decorators: [Story => /*#__PURE__*/_react.default.createElement("div", {
205
+ style: {
206
+ border: '1px dashed #C1C7D0',
207
+ height: '300px',
208
+ position: 'relative',
209
+ width: '100%'
210
+ }
211
+ }, /*#__PURE__*/_react.default.createElement(Story, null))],
212
+ name: 'LogoLoader — En contenedor',
213
+ parameters: {
214
+ docs: {
215
+ description: {
216
+ story: 'LogoLoader adaptado al contenedor padre (fullScreen=false). Se centra dentro del div contenedor.'
217
+ }
218
+ }
219
+ }
220
+ };
221
+ const LogoLoaderConLogo = exports.LogoLoaderConLogo = {
222
+ args: {
223
+ fullScreen: false,
224
+ loading: true,
225
+ Logo: 'https://utilitygo-demo-qa-ev.widergydev.com/favicon.png',
226
+ text: 'Cargando...',
227
+ useUtilityLoading: true,
228
+ version: 'V1'
229
+ },
230
+ decorators: [Story => /*#__PURE__*/_react.default.createElement("div", {
231
+ style: {
232
+ border: '1px dashed #C1C7D0',
233
+ height: '300px',
234
+ position: 'relative',
235
+ width: '100%'
236
+ }
237
+ }, /*#__PURE__*/_react.default.createElement(Story, null))],
238
+ name: 'LogoLoader — Con logo',
239
+ parameters: {
240
+ docs: {
241
+ description: {
242
+ story: 'LogoLoader con logo SVG del cliente centrado dentro del track.'
243
+ }
244
+ }
245
+ }
246
+ };
247
+ const LogoLoaderSinTexto = exports.LogoLoaderSinTexto = {
248
+ args: {
249
+ fullScreen: false,
250
+ loading: true,
251
+ Logo: 'https://utilitygo-demo-qa-ev.widergydev.com/favicon.png',
252
+ text: '',
253
+ useUtilityLoading: true,
254
+ version: 'V1'
255
+ },
256
+ decorators: [Story => /*#__PURE__*/_react.default.createElement("div", {
257
+ style: {
258
+ border: '1px dashed #C1C7D0',
259
+ height: '300px',
260
+ position: 'relative',
261
+ width: '100%'
262
+ }
263
+ }, /*#__PURE__*/_react.default.createElement(Story, null))],
264
+ name: 'LogoLoader — Sin texto',
265
+ parameters: {
266
+ docs: {
267
+ description: {
268
+ story: 'LogoLoader sin label de texto debajo del track.'
269
+ }
270
+ }
271
+ }
272
+ };
273
+ const TestSite = exports.TestSite = {
274
+ render: () => /*#__PURE__*/_react.default.createElement("div", {
275
+ style: {
276
+ display: 'flex',
277
+ flexDirection: 'column',
278
+ gap: '32px'
279
+ }
280
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
281
+ style: {
282
+ fontFamily: 'sans-serif',
283
+ fontSize: '12px',
284
+ marginBottom: '8px'
285
+ }
286
+ }, "Spinner \u2014 loading true"), /*#__PURE__*/_react.default.createElement("div", {
287
+ style: {
288
+ height: '120px',
289
+ position: 'relative'
290
+ }
291
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
292
+ loading: true,
293
+ useUtilityLoading: false,
294
+ version: "V1"
295
+ }))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
296
+ style: {
297
+ fontFamily: 'sans-serif',
298
+ fontSize: '12px',
299
+ marginBottom: '8px'
300
+ }
301
+ }, "Spinner \u2014 sin texto"), /*#__PURE__*/_react.default.createElement("div", {
302
+ style: {
303
+ height: '120px',
304
+ position: 'relative'
305
+ }
306
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
307
+ loading: true,
308
+ text: "",
309
+ useUtilityLoading: false,
310
+ version: "V1"
311
+ }))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
312
+ style: {
313
+ fontFamily: 'sans-serif',
314
+ fontSize: '12px',
315
+ marginBottom: '8px'
316
+ }
317
+ }, "Spinner \u2014 loading false (muestra children)"), /*#__PURE__*/_react.default.createElement("div", {
318
+ style: {
319
+ height: '120px',
320
+ position: 'relative'
321
+ }
322
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
323
+ loading: false,
324
+ useUtilityLoading: false,
325
+ version: "V1"
326
+ }, /*#__PURE__*/_react.default.createElement("span", null, "Contenido cargado")))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
327
+ style: {
328
+ fontFamily: 'sans-serif',
329
+ fontSize: '12px',
330
+ marginBottom: '8px'
331
+ }
332
+ }, "LogoLoader \u2014 en contenedor (fullScreen=false)"), /*#__PURE__*/_react.default.createElement("div", {
333
+ style: {
334
+ border: '1px dashed #C1C7D0',
335
+ height: '200px',
336
+ position: 'relative'
337
+ }
338
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
339
+ fullScreen: false,
340
+ loading: true,
341
+ Logo: "https://utilitygo-demo-qa-ev.widergydev.com/favicon.png",
342
+ useUtilityLoading: true,
343
+ version: "V1"
344
+ }))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", {
345
+ style: {
346
+ fontFamily: 'sans-serif',
347
+ fontSize: '12px',
348
+ marginBottom: '8px'
349
+ }
350
+ }, "LogoLoader \u2014 loading false (muestra children)"), /*#__PURE__*/_react.default.createElement("div", {
351
+ style: {
352
+ height: '80px',
353
+ position: 'relative'
354
+ }
355
+ }, /*#__PURE__*/_react.default.createElement(_index.default, {
356
+ fullScreen: false,
357
+ loading: false,
358
+ useUtilityLoading: true,
359
+ version: "V1"
360
+ }, /*#__PURE__*/_react.default.createElement("span", null, "Contenido cargado"))))),
361
+ name: 'Test Site',
362
+ parameters: {
363
+ docs: {
364
+ description: {
365
+ story: 'Casos de prueba para el Storybook Test Runner.'
366
+ }
367
+ }
368
+ }
369
+ };
@@ -169,6 +169,10 @@ const TEST_IDS = exports.TEST_IDS = {
169
169
  wrapperObservation: {
170
170
  actionIcon: 'wrapperObservation.actionIcon.'
171
171
  },
172
+ UTLoading: {
173
+ logoLoader: 'UTLoading.logoLoader',
174
+ spinner: 'UTLoading.spinner'
175
+ },
172
176
  UTSnackbar: {
173
177
  closeButton: "".concat(ID_CONSTANTS.UT_SNACKBAR, ".closeButton"),
174
178
  description: "".concat(ID_CONSTANTS.UT_SNACKBAR, ".description"),
@@ -0,0 +1,85 @@
1
+ # UTLoading
2
+
3
+ Componente de carga con soporte de versiones. Muestra un indicador visual de carga mientras se obtienen datos. Soporta dos variantes internas: un Spinner circular y un LogoLoader con el logo/isologo del cliente.
4
+
5
+ ## Versiones
6
+
7
+ ### V0 (default)
8
+
9
+ Comportamiento original. Se activa cuando no se pasa la prop `version` o cuando se pasa `version="V0"`.
10
+
11
+ - `useUtilityLoading=false` → Spinner basado en Material UI `CircularProgress`
12
+ - `useUtilityLoading=true` → AnimatedCircles: logo + 3 puntos animados, siempre full screen
13
+
14
+ ### V1
15
+
16
+ Nueva versión con diseño actualizado. Se activa pasando `version="V1"`.
17
+
18
+ - `useUtilityLoading=false` → Nuevo Spinner CSS puro con línea más gruesa
19
+ - `useUtilityLoading=true` → LogoLoader: track de gradiente animado con logo del cliente, prop `fullScreen` para controlar comportamiento
20
+
21
+ ## Uso básico
22
+
23
+ ```jsx
24
+ import { UTLoading } from '@widergy/energy-ui';
25
+
26
+ // V0 (default — sin cambios)
27
+ <UTLoading loading>
28
+ <MiContenido />
29
+ </UTLoading>
30
+
31
+ // V1 — Spinner
32
+ <UTLoading version="V1" loading useUtilityLoading={false}>
33
+ <MiContenido />
34
+ </UTLoading>
35
+
36
+ // V1 — LogoLoader full screen
37
+ <UTLoading
38
+ version="V1"
39
+ loading
40
+ useUtilityLoading
41
+ Logo="https://mi-dominio.com/logo.svg"
42
+ fullScreen
43
+ />
44
+
45
+ // V1 — LogoLoader en contenedor
46
+ <UTLoading
47
+ version="V1"
48
+ loading
49
+ useUtilityLoading
50
+ fullScreen={false}
51
+ >
52
+ <MiContenido />
53
+ </UTLoading>
54
+ ```
55
+
56
+ ## Props
57
+
58
+ | Prop | Tipo | Default | Descripción |
59
+ |------|------|---------|-------------|
60
+ | `version` | `string` | `'V0'` | `'V0'` o `'V1'` — selecciona la versión a renderizar |
61
+ | `loading` | `bool` | — | Muestra el loader cuando `true`, los `children` cuando `false` |
62
+ | `children` | `node` | — | Contenido a mostrar cuando `loading=false` |
63
+ | `useUtilityLoading` | `bool` | — | `true` → LogoLoader / AnimatedCircles; `false` → Spinner |
64
+ | `fullScreen` | `bool` | `true` | Solo V1 LogoLoader. `true`: `position: fixed` full screen. `false`: adaptado al contenedor |
65
+ | `Logo` | `string` | — | URL del asset SVG del logo/isologo del cliente |
66
+ | `text` | `string` | `'Cargando el contenido...'` | Texto de carga. Pasar `''` para ocultarlo (solo V1) |
67
+ | `dataTestId` | `string` | — | `data-testid` del elemento raíz (solo V1) |
68
+ | `color` | `string` | — | Color CSS explícito del spinner (solo V0 Spinner) |
69
+ | `size` | `number` | — | Tamaño del spinner en px (solo V0) |
70
+ | `thickness` | `number` | — | Grosor del spinner (solo V0) |
71
+ | `preventUnmount` | `bool` | `false` | Mantiene los children en el DOM cuando `loading=true` (Spinner) |
72
+ | `className` | `string` | — | Clase adicional para el spinner (solo V0) |
73
+ | `textClassName` | `string` | — | Clase del texto (solo V0) |
74
+ | `wrapperClassName` | `string` | — | Clase del wrapper de children (Spinner) |
75
+ | `classNames` | `object` | — | Objeto de clases para AnimatedCircles (solo V0) |
76
+
77
+ ## Design tokens — V1
78
+
79
+ | Token | Descripción | Fallback |
80
+ |-------|-------------|---------|
81
+ | `--UT-loading-track-color-start` | Color inicial del gradiente del track | `identitySolidTone1` del cliente |
82
+ | `--UT-loading-track-color-end` | Color final del gradiente del track | `identitySolidTone2` del cliente |
83
+ | `--UT-loading-gap` | Gap entre track/spinner y label | `8px` |
84
+
85
+ > Los tokens de color del gradiente se derivan automáticamente de los colores de identidad de cada cliente. El ajuste de valores exactos queda pendiente de confirmación de Diseño en Figma (CX-2398).
@@ -13,7 +13,7 @@ const Spinner = _ref => {
13
13
  thickness,
14
14
  wrapperClassName
15
15
  } = _ref;
16
- return /*#__PURE__*/React.createElement(Fragment, null, loading && /*#__PURE__*/React.createElement(Loading, {
16
+ return /*#__PURE__*/React.createElement(React.Fragment, null, loading && /*#__PURE__*/React.createElement(Loading, {
17
17
  className: className,
18
18
  size: size,
19
19
  text: text,
@@ -1,17 +1,26 @@
1
1
  import React from 'react';
2
- import { bool, node, number, string } from 'prop-types';
3
- import AnimatedCircles from './components/AnimatedCircles';
4
- import Spinner from './components/Spinner';
5
- const UTLoading = props => {
6
- const {
7
- useUtilityLoading
8
- } = props || {};
9
- return useUtilityLoading ? /*#__PURE__*/React.createElement(AnimatedCircles, props) : /*#__PURE__*/React.createElement(Spinner, props);
2
+ import { arrayOf, bool, node, number, string } from 'prop-types';
3
+ import V0 from './versions/V0';
4
+ import V1 from './versions/V1';
5
+ const COMPONENTS = {
6
+ V0,
7
+ V1
8
+ };
9
+ const UTLoading = _ref => {
10
+ let {
11
+ version = 'V0',
12
+ ...props
13
+ } = _ref;
14
+ const Component = COMPONENTS[version] || V0;
15
+ return /*#__PURE__*/React.createElement(Component, props);
10
16
  };
11
17
  UTLoading.propTypes = {
12
18
  children: node,
13
19
  className: string,
14
20
  color: string,
21
+ colors: arrayOf(string),
22
+ dataTestId: string,
23
+ fullScreen: bool,
15
24
  loading: bool,
16
25
  Logo: string,
17
26
  preventUnmount: bool,
@@ -20,6 +29,7 @@ UTLoading.propTypes = {
20
29
  textClassName: string,
21
30
  thickness: number,
22
31
  useUtilityLoading: bool,
32
+ version: string,
23
33
  wrapperClassName: string
24
34
  };
25
35
  export default UTLoading;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { bool, node, number, string } from 'prop-types';
3
+ import AnimatedCircles from '../../components/AnimatedCircles';
4
+ import Spinner from '../../components/Spinner';
5
+ const V0 = props => {
6
+ const {
7
+ useUtilityLoading
8
+ } = props;
9
+ return useUtilityLoading ? /*#__PURE__*/React.createElement(AnimatedCircles, props) : /*#__PURE__*/React.createElement(Spinner, props);
10
+ };
11
+ V0.propTypes = {
12
+ children: node,
13
+ className: string,
14
+ color: string,
15
+ loading: bool,
16
+ Logo: string,
17
+ preventUnmount: bool,
18
+ size: number,
19
+ text: string,
20
+ textClassName: string,
21
+ thickness: number,
22
+ useUtilityLoading: bool,
23
+ wrapperClassName: string
24
+ };
25
+ export default V0;