danielgm-ui 0.1.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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +372 -0
  3. package/TABLER-LICENSE.txt +21 -0
  4. package/dist/accordion.d.ts +49 -0
  5. package/dist/accordion.js +14 -0
  6. package/dist/aspect-ratio.d.ts +8 -0
  7. package/dist/aspect-ratio.js +8 -0
  8. package/dist/avatar.d.ts +27 -0
  9. package/dist/avatar.js +15 -0
  10. package/dist/breadcrumbs.d.ts +20 -0
  11. package/dist/breadcrumbs.js +5 -0
  12. package/dist/button.d.ts +44 -0
  13. package/dist/button.js +25 -0
  14. package/dist/carousel.d.ts +19 -0
  15. package/dist/carousel.js +133 -0
  16. package/dist/choice-group.d.ts +36 -0
  17. package/dist/choice-group.js +27 -0
  18. package/dist/combobox.d.ts +37 -0
  19. package/dist/combobox.js +57 -0
  20. package/dist/command-palette.d.ts +28 -0
  21. package/dist/command-palette.js +90 -0
  22. package/dist/container.d.ts +21 -0
  23. package/dist/container.js +10 -0
  24. package/dist/context-menu.d.ts +21 -0
  25. package/dist/context-menu.js +50 -0
  26. package/dist/custom-select.d.ts +45 -0
  27. package/dist/custom-select.js +26 -0
  28. package/dist/data-table.d.ts +53 -0
  29. package/dist/data-table.js +104 -0
  30. package/dist/date-picker.d.ts +43 -0
  31. package/dist/date-picker.js +142 -0
  32. package/dist/display.d.ts +63 -0
  33. package/dist/display.js +43 -0
  34. package/dist/drawer.d.ts +12 -0
  35. package/dist/drawer.js +29 -0
  36. package/dist/dropdown-menu.d.ts +47 -0
  37. package/dist/dropdown-menu.js +24 -0
  38. package/dist/empty-state.d.ts +13 -0
  39. package/dist/empty-state.js +8 -0
  40. package/dist/fields.d.ts +62 -0
  41. package/dist/fields.js +70 -0
  42. package/dist/file-upload.d.ts +33 -0
  43. package/dist/file-upload.js +111 -0
  44. package/dist/index.d.ts +48 -0
  45. package/dist/index.js +48 -0
  46. package/dist/internal/field-open.d.ts +2 -0
  47. package/dist/internal/field-open.js +15 -0
  48. package/dist/internal/focus.d.ts +4 -0
  49. package/dist/internal/focus.js +27 -0
  50. package/dist/internal/icons.d.ts +29 -0
  51. package/dist/internal/icons.js +32 -0
  52. package/dist/internal/navigation-origin.d.ts +2 -0
  53. package/dist/internal/navigation-origin.js +23 -0
  54. package/dist/internal/overlay-layer.d.ts +12 -0
  55. package/dist/internal/overlay-layer.js +14 -0
  56. package/dist/internal/pagination.d.ts +6 -0
  57. package/dist/internal/pagination.js +36 -0
  58. package/dist/internal/scroll-hints.d.ts +8 -0
  59. package/dist/internal/scroll-hints.js +108 -0
  60. package/dist/internal/state.d.ts +2 -0
  61. package/dist/internal/state.js +13 -0
  62. package/dist/internal/trigger-label.d.ts +5 -0
  63. package/dist/internal/trigger-label.js +26 -0
  64. package/dist/loader.d.ts +27 -0
  65. package/dist/loader.js +13 -0
  66. package/dist/modal.d.ts +23 -0
  67. package/dist/modal.js +30 -0
  68. package/dist/multi-select.d.ts +23 -0
  69. package/dist/multi-select.js +63 -0
  70. package/dist/navigation-menu.d.ts +26 -0
  71. package/dist/navigation-menu.js +27 -0
  72. package/dist/number-input.d.ts +14 -0
  73. package/dist/number-input.js +37 -0
  74. package/dist/pagination.d.ts +24 -0
  75. package/dist/pagination.js +60 -0
  76. package/dist/popover.d.ts +30 -0
  77. package/dist/popover.js +27 -0
  78. package/dist/progress.d.ts +18 -0
  79. package/dist/progress.js +9 -0
  80. package/dist/radio-group.d.ts +46 -0
  81. package/dist/radio-group.js +16 -0
  82. package/dist/resizable-panels.d.ts +22 -0
  83. package/dist/resizable-panels.js +70 -0
  84. package/dist/skeleton.d.ts +17 -0
  85. package/dist/skeleton.js +9 -0
  86. package/dist/slider.d.ts +41 -0
  87. package/dist/slider.js +29 -0
  88. package/dist/stepper.d.ts +25 -0
  89. package/dist/stepper.js +25 -0
  90. package/dist/styles.css +3369 -0
  91. package/dist/tabs.d.ts +32 -0
  92. package/dist/tabs.js +8 -0
  93. package/dist/toast.d.ts +54 -0
  94. package/dist/toast.js +107 -0
  95. package/dist/toggle-group.d.ts +32 -0
  96. package/dist/toggle-group.js +16 -0
  97. package/dist/toggles.d.ts +33 -0
  98. package/dist/toggles.js +29 -0
  99. package/dist/tooltip.d.ts +26 -0
  100. package/dist/tooltip.js +16 -0
  101. package/dist/transition.d.ts +27 -0
  102. package/dist/transition.js +148 -0
  103. package/dist/tree-view.d.ts +22 -0
  104. package/dist/tree-view.js +128 -0
  105. package/dist/typography.d.ts +23 -0
  106. package/dist/typography.js +20 -0
  107. package/dist/utils.d.ts +13 -0
  108. package/dist/utils.js +17 -0
  109. package/package.json +73 -0
@@ -0,0 +1,3369 @@
1
+ /* Estilos públicos de danielgm-ui. Importar una sola vez en el layout o entrada de la aplicación. */
2
+ /* Las secciones finales incorporan menús, radios, notificaciones y marcadores de carga. */
3
+ /* Los componentes compuestos usan los mismos tokens, foco y áreas táctiles que los controles básicos. */
4
+ /* 1. Tokens públicos. Se pueden sobrescribir en :root o heredar desde un contenedor. */
5
+ :root {
6
+ --dgm-primary: #4f46e5;
7
+ --dgm-primary-hover: #4338ca;
8
+ --dgm-on-primary: #fff;
9
+ --dgm-text: #182230;
10
+ --dgm-muted: #536176;
11
+ --dgm-surface: #fff;
12
+ --dgm-subtle: #f3f5f9;
13
+ /* Fondo y texto se personalizan juntos; el hover neutro no sustituye una selección. */
14
+ --dgm-hover: #eef1f7;
15
+ --dgm-on-hover: var(--dgm-text);
16
+ --dgm-border: #ccd3df;
17
+ --dgm-control-border: #7c8ba1;
18
+ --dgm-danger: #b42318;
19
+ --dgm-danger-surface: #b42318;
20
+ --dgm-danger-hover: #912018;
21
+ --dgm-on-danger: #fff;
22
+ --dgm-radius: 0.625rem;
23
+ /* Escala pública y roles: la aplicación puede adaptar toda la tipografía desde la raíz. */
24
+ --dgm-font: inherit;
25
+ --dgm-font-mono: 'Cascadia Code', 'SFMono-Regular', Consolas, monospace;
26
+ --dgm-font-size-xs: 0.75rem;
27
+ --dgm-font-size-sm: 0.875rem;
28
+ --dgm-font-size-md: 0.9375rem;
29
+ --dgm-font-size-base: 1rem;
30
+ --dgm-font-size-lg: 1.125rem;
31
+ --dgm-font-size-xl: 1.25rem;
32
+ --dgm-font-size-2xl: 1.5rem;
33
+ --dgm-font-weight-regular: 400;
34
+ --dgm-font-weight-medium: 500;
35
+ --dgm-font-weight-semibold: 600;
36
+ --dgm-font-weight-bold: 700;
37
+ --dgm-leading-tight: 1.25;
38
+ --dgm-leading-normal: 1.5;
39
+ --dgm-leading-relaxed: 1.65;
40
+ --dgm-tracking-normal: 0;
41
+ --dgm-tracking-heading: -0.035em;
42
+ --dgm-tracking-label: 0.06em;
43
+ --dgm-text-body: var(--dgm-font-size-base);
44
+ --dgm-text-control: var(--dgm-font-size-base);
45
+ --dgm-text-label: var(--dgm-font-size-md);
46
+ --dgm-text-action: var(--dgm-font-size-md);
47
+ --dgm-text-help: var(--dgm-font-size-sm);
48
+ --dgm-text-caption: var(--dgm-font-size-xs);
49
+ --dgm-text-title: var(--dgm-font-size-xl);
50
+ /* Geometría común de campos y selectores; permite crecer a los textos largos. */
51
+ --dgm-control-min-height: 3rem;
52
+ /* Márgenes simétricos de listas y contenido de sus opciones. */
53
+ --dgm-list-padding: 0.5rem;
54
+ --dgm-option-padding-inline: 0.75rem;
55
+ /* Una capa por panel anidado: el overlay ocupa su base y el contenido la siguiente. */
56
+ --dgm-layer-base: 1100;
57
+ --dgm-layer-step: 10;
58
+ --dgm-layer-toast: 2100;
59
+ /* Misma respuesta al entrar y salir del hover, con texto o solo con un icono.
60
+ * No incluye transform ni el contorno de foco: pulsar no cambia el tamaño. */
61
+ --dgm-hover-transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
62
+ /* Ritmo común de los paneles; el origen lo determina cada anclaje. */
63
+ --dgm-panel-duration-in: 180ms;
64
+ --dgm-panel-duration-out: 140ms;
65
+ --dgm-panel-scale: 0.96;
66
+ --dgm-panel-easing-in: cubic-bezier(0.16, 1, 0.3, 1);
67
+ --dgm-panel-easing-out: ease-in;
68
+ /* Scrollbars neutras; pueden personalizarse sin cambiar los colores de las acciones. */
69
+ --dgm-scrollbar-thumb: #7c8ba1;
70
+ --dgm-scrollbar-thumb-hover: #536176;
71
+ --dgm-scrollbar-track: transparent;
72
+ }
73
+
74
+ /* Scroll nativo compartido. El prefijo limita el estilo a nuestros componentes;
75
+ * dgm-scrollbars permite aplicarlo también a una página o contenedor del consumidor.
76
+ * La especificidad supera la regla que Radix inyecta para ocultar la barra de Select.
77
+ * Carousel conserva su navegación por gestos y controles, con la barra oculta.
78
+ * No imponemos overflow ni altura: cada componente decide cuándo necesita scroll. */
79
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
80
+ .dgm-carousel-viewport
81
+ ) {
82
+ scrollbar-width: thin;
83
+ scrollbar-color: var(--dgm-scrollbar-thumb) var(--dgm-scrollbar-track);
84
+ scrollbar-gutter: auto;
85
+ }
86
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
87
+ .dgm-carousel-viewport
88
+ ):hover {
89
+ scrollbar-color: var(--dgm-scrollbar-thumb-hover) var(--dgm-scrollbar-track);
90
+ }
91
+ /* En Chromium y WebKit usamos su geometría personalizable para quitar los botones.
92
+ * Los valores estándar distintos de auto anulan estos pseudoelementos: por eso se
93
+ * restablecen aquí, incluido el hover. Firefox conserva su barra nativa fina. */
94
+ @supports selector(::-webkit-scrollbar) {
95
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
96
+ .dgm-carousel-viewport
97
+ ),
98
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
99
+ .dgm-carousel-viewport
100
+ ):hover {
101
+ scrollbar-width: auto;
102
+ scrollbar-color: auto;
103
+ }
104
+ }
105
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
106
+ .dgm-carousel-viewport
107
+ )::-webkit-scrollbar {
108
+ display: block;
109
+ width: 10px;
110
+ height: 10px;
111
+ }
112
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
113
+ .dgm-carousel-viewport
114
+ )::-webkit-scrollbar-button {
115
+ display: none;
116
+ width: 0;
117
+ height: 0;
118
+ }
119
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
120
+ .dgm-carousel-viewport
121
+ )::-webkit-scrollbar-track,
122
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
123
+ .dgm-carousel-viewport
124
+ )::-webkit-scrollbar-corner {
125
+ background: var(--dgm-scrollbar-track);
126
+ }
127
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
128
+ .dgm-carousel-viewport
129
+ )::-webkit-scrollbar-thumb {
130
+ background: var(--dgm-scrollbar-thumb);
131
+ border: 2px solid transparent;
132
+ background-clip: padding-box;
133
+ border-radius: 999px;
134
+ }
135
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
136
+ .dgm-carousel-viewport
137
+ )::-webkit-scrollbar-thumb:hover {
138
+ background-color: var(--dgm-scrollbar-thumb-hover);
139
+ }
140
+ @media (forced-colors: active) {
141
+ :is(.dgm-scrollbars, .dgm-scrollbars *, [class^='dgm-'], [class*=' dgm-']):not(
142
+ .dgm-carousel-viewport
143
+ ) {
144
+ --dgm-scrollbar-thumb: ButtonText;
145
+ --dgm-scrollbar-thumb-hover: Highlight;
146
+ --dgm-scrollbar-track: Canvas;
147
+ /* El modo de contraste del sistema prevalece también durante el hover. */
148
+ scrollbar-color: auto !important;
149
+ }
150
+ }
151
+ /* 2. Base acotada al prefijo dgm. No resetea elementos de la aplicación consumidora. */
152
+ .dgm-button,
153
+ .dgm-input,
154
+ .dgm-field,
155
+ .dgm-choice,
156
+ .dgm-badge,
157
+ .dgm-card,
158
+ .dgm-alert,
159
+ .dgm-separator {
160
+ box-sizing: border-box;
161
+ font-family: var(--dgm-font, inherit);
162
+ }
163
+ /* Las raíces textuales comparten familia y ritmo, también fuera de la documentación.
164
+ * La especificidad baja permite personalizar una pieza sin resetear HTML ajeno ni
165
+ * los bloques pre/code que aporte el consumidor. Los portales leen los tokens de :root. */
166
+ :where(
167
+ .dgm-button,
168
+ .dgm-input,
169
+ .dgm-field,
170
+ .dgm-choice,
171
+ .dgm-badge,
172
+ .dgm-card,
173
+ .dgm-alert,
174
+ .dgm-custom-menu,
175
+ .dgm-modal,
176
+ .dgm-tooltip,
177
+ .dgm-tabs,
178
+ .dgm-accordion,
179
+ .dgm-dropdown,
180
+ .dgm-radio-group,
181
+ .dgm-toast,
182
+ .dgm-loader,
183
+ .dgm-popover,
184
+ .dgm-combobox-panel,
185
+ .dgm-calendar-panel,
186
+ .dgm-drawer,
187
+ .dgm-command,
188
+ .dgm-pagination,
189
+ .dgm-breadcrumbs,
190
+ .dgm-avatar,
191
+ .dgm-progress,
192
+ .dgm-choice-group,
193
+ .dgm-data-table,
194
+ .dgm-file-upload,
195
+ .dgm-stepper,
196
+ .dgm-empty-state,
197
+ .dgm-toggle-group,
198
+ .dgm-navigation,
199
+ .dgm-multi-select,
200
+ .dgm-resizable,
201
+ .dgm-tree,
202
+ .dgm-carousel
203
+ ) {
204
+ font-family: var(--dgm-font, inherit);
205
+ font-size: var(--dgm-text-body);
206
+ font-weight: var(--dgm-font-weight-regular);
207
+ line-height: var(--dgm-leading-normal);
208
+ letter-spacing: var(--dgm-tracking-normal);
209
+ }
210
+ /* Typography: la variante visual no impone la jerarquía HTML ni el espaciado del layout. */
211
+ .dgm-typography {
212
+ margin: 0;
213
+ min-width: 0;
214
+ font-family: var(--dgm-font, inherit);
215
+ font-size: var(--dgm-text-body);
216
+ font-weight: var(--dgm-font-weight-regular);
217
+ line-height: var(--dgm-leading-relaxed);
218
+ letter-spacing: var(--dgm-tracking-normal);
219
+ overflow-wrap: anywhere;
220
+ }
221
+ .dgm-typography--title,
222
+ .dgm-typography--subtitle {
223
+ font-weight: var(--dgm-font-weight-semibold);
224
+ line-height: var(--dgm-leading-tight);
225
+ letter-spacing: var(--dgm-tracking-heading);
226
+ text-wrap: balance;
227
+ }
228
+ .dgm-typography--title {
229
+ font-size: var(--dgm-font-size-2xl);
230
+ font-weight: var(--dgm-font-weight-bold);
231
+ }
232
+ .dgm-typography--subtitle {
233
+ font-size: var(--dgm-text-title);
234
+ }
235
+ .dgm-typography--lead {
236
+ font-size: var(--dgm-font-size-lg);
237
+ }
238
+ .dgm-typography--label {
239
+ font-size: var(--dgm-text-label);
240
+ font-weight: var(--dgm-font-weight-semibold);
241
+ line-height: var(--dgm-leading-normal);
242
+ }
243
+ .dgm-typography--caption {
244
+ font-size: var(--dgm-text-caption);
245
+ line-height: var(--dgm-leading-normal);
246
+ }
247
+ .dgm-typography--code {
248
+ font-family: var(--dgm-font-mono);
249
+ font-size: var(--dgm-text-help);
250
+ line-height: var(--dgm-leading-normal);
251
+ }
252
+ .dgm-typography--default {
253
+ color: var(--dgm-text);
254
+ }
255
+ .dgm-typography--muted {
256
+ color: var(--dgm-muted);
257
+ }
258
+ .dgm-typography--primary {
259
+ color: var(--dgm-primary);
260
+ }
261
+ .dgm-typography--danger {
262
+ color: var(--dgm-danger);
263
+ }
264
+ .dgm-typography--inherit {
265
+ color: inherit;
266
+ }
267
+
268
+ /* Container: border-box incluye los gutters en el límite; min-inline-size evita mínimos de flex/grid.
269
+ Las propiedades lógicas sirven también para contenido RTL. No recortamos menús ni tooltips.
270
+ No se usa una variable heredable para el tamaño: cada Container anidado conserva su propia opción. */
271
+ .dgm-container {
272
+ box-sizing: border-box;
273
+ inline-size: 100%;
274
+ min-inline-size: 0;
275
+ margin-inline: auto;
276
+ padding-inline: clamp(1rem, 3vw, 2rem);
277
+ }
278
+ .dgm-container--sm {
279
+ max-inline-size: 40rem;
280
+ }
281
+ .dgm-container--md {
282
+ max-inline-size: 48rem;
283
+ }
284
+ .dgm-container--lg {
285
+ max-inline-size: 64rem;
286
+ }
287
+ .dgm-container--xl {
288
+ max-inline-size: 80rem;
289
+ }
290
+ .dgm-container--full {
291
+ max-inline-size: none;
292
+ }
293
+ .dgm-container--flush {
294
+ padding-inline: 0;
295
+ }
296
+
297
+ /* 3. Botones: jerarquías, tamaños y ancho. Se conserva el texto durante la carga. */
298
+ /* Los controles internos (cierre, calendario, contraseña, etc.) comparten el hover
299
+ * aunque no usen Button. La baja especificidad preserva sus transiciones propias. */
300
+ :where(
301
+ button[class^='dgm-'],
302
+ button[class*=' dgm-'],
303
+ .dgm-calendar button,
304
+ .dgm-tree-row,
305
+ .dgm-navigation-link,
306
+ .dgm-custom-option,
307
+ .dgm-command-item,
308
+ .dgm-dropdown-item,
309
+ .dgm-breadcrumbs a,
310
+ .dgm-multi-tags button,
311
+ .dgm-carousel-indicators button
312
+ ) {
313
+ transition: var(--dgm-hover-transition);
314
+ }
315
+ .dgm-button {
316
+ display: inline-flex;
317
+ align-items: center;
318
+ justify-content: center;
319
+ gap: 0.5rem;
320
+ border: 1px solid transparent;
321
+ border-radius: var(--dgm-radius);
322
+ min-height: 2.75rem;
323
+ padding: 0.625rem 1rem;
324
+ font-size: var(--dgm-text-action);
325
+ font-weight: var(--dgm-font-weight-semibold);
326
+ line-height: var(--dgm-leading-tight);
327
+ cursor: pointer;
328
+ text-decoration: none;
329
+ transition: var(--dgm-hover-transition);
330
+ }
331
+ .dgm-button--primary {
332
+ color: var(--dgm-on-primary);
333
+ background: var(--dgm-primary);
334
+ }
335
+ .dgm-button--primary:hover:not(:disabled),
336
+ .dgm-toggle-item[data-state='on']:hover:not(:disabled),
337
+ .dgm-tree [aria-selected='true']:not([aria-disabled='true']) > .dgm-tree-row:hover,
338
+ .dgm-calendar .rdp-selected:not(.rdp-range_middle) .rdp-day_button:hover:not(:disabled) {
339
+ background: var(--dgm-primary-hover);
340
+ color: var(--dgm-on-primary);
341
+ }
342
+ .dgm-button--secondary {
343
+ color: var(--dgm-text);
344
+ background: var(--dgm-subtle);
345
+ }
346
+ .dgm-button--outline {
347
+ color: var(--dgm-text);
348
+ background: var(--dgm-surface);
349
+ border-color: var(--dgm-border);
350
+ }
351
+ .dgm-button--ghost {
352
+ color: var(--dgm-text);
353
+ background: transparent;
354
+ }
355
+ .dgm-button--secondary:hover:not(:disabled),
356
+ .dgm-button--outline:hover:not(:disabled),
357
+ .dgm-button--ghost:hover:not(:disabled) {
358
+ border-color: var(--dgm-border);
359
+ }
360
+ /* Una única pareja neutra para acciones y opciones. Los estados seleccionados
361
+ * rellenos usan la pareja primaria anterior; los desactivados nunca se resaltan. */
362
+ .dgm-button--secondary:hover:not(:disabled),
363
+ .dgm-button--outline:hover:not(:disabled),
364
+ .dgm-button--ghost:hover:not(:disabled),
365
+ .dgm-icon-close:hover:not(:disabled),
366
+ .dgm-password-toggle:hover:not(:disabled),
367
+ .dgm-multi-tags button:hover:not(:disabled),
368
+ .dgm-carousel-indicators button:hover:not(:disabled),
369
+ button.dgm-step:hover:not(:disabled),
370
+ .dgm-accordion-trigger:hover:not(:disabled),
371
+ .dgm-toggle-item[data-state='off']:hover:not(:disabled),
372
+ .dgm-navigation-trigger:hover:not(:disabled),
373
+ .dgm-navigation-link:hover:not([aria-disabled='true']),
374
+ .dgm-tree
375
+ [role='treeitem']:not([aria-selected='true']):not([aria-disabled='true'])
376
+ > .dgm-tree-row:hover,
377
+ .dgm-calendar :is(.rdp-button_previous, .rdp-button_next):hover:not(:disabled),
378
+ .dgm-calendar .rdp-day:not(.rdp-selected) .rdp-day_button:hover:not(:disabled),
379
+ .dgm-calendar .rdp-range_middle .rdp-day_button:hover:not(:disabled),
380
+ .dgm-custom-option[data-highlighted]:not([data-disabled]),
381
+ .dgm-dropdown-item[data-highlighted]:not([data-disabled]),
382
+ .dgm-command:not(.dgm-command--palette)
383
+ .dgm-command-item[data-selected='true']:not([data-disabled='true']),
384
+ .dgm-command--palette[data-input-mode='keyboard']
385
+ .dgm-command-item[data-selected='true']:not([data-disabled='true']),
386
+ .dgm-command--palette:not([data-input-mode='keyboard'])
387
+ .dgm-command-item:hover:not([data-disabled='true']) {
388
+ background: var(--dgm-hover);
389
+ color: var(--dgm-interaction-text, var(--dgm-on-hover));
390
+ }
391
+ .dgm-button--danger {
392
+ color: var(--dgm-on-danger);
393
+ background: var(--dgm-danger-surface);
394
+ }
395
+ /* Acciones de texto: conserva su jerarquía y utiliza el mismo acento de hover. */
396
+ .dgm-text-action:hover:not(:disabled) {
397
+ color: var(--dgm-primary-hover);
398
+ }
399
+ .dgm-button--danger:hover:not(:disabled) {
400
+ background: var(--dgm-danger-hover);
401
+ color: var(--dgm-on-danger);
402
+ }
403
+ .dgm-button--sm {
404
+ min-height: 2.25rem;
405
+ padding: 0.375rem 0.75rem;
406
+ font-size: var(--dgm-font-size-sm);
407
+ }
408
+ .dgm-button--lg {
409
+ min-height: 3.125rem;
410
+ padding: 0.75rem 1.375rem;
411
+ font-size: var(--dgm-font-size-base);
412
+ }
413
+ .dgm-full {
414
+ width: 100%;
415
+ }
416
+ /* Un tamaño cuadrado evita que el padding lateral desplace el icono o el indicador. */
417
+ .dgm-button--icon-only {
418
+ width: 2.75rem;
419
+ height: 2.75rem;
420
+ padding: 0;
421
+ flex-shrink: 0;
422
+ gap: 0;
423
+ }
424
+ .dgm-button--icon-only.dgm-button--sm {
425
+ width: 2.25rem;
426
+ height: 2.25rem;
427
+ }
428
+ .dgm-button--icon-only.dgm-button--lg {
429
+ width: 3.125rem;
430
+ height: 3.125rem;
431
+ }
432
+ .dgm-button-icon {
433
+ display: inline-flex;
434
+ align-items: center;
435
+ justify-content: center;
436
+ width: 1.25em;
437
+ height: 1.25em;
438
+ /* Caja de icono: la unidad geométrica evita añadir una línea de texto al SVG. */
439
+ line-height: 1;
440
+ }
441
+ .dgm-button-icon > svg {
442
+ display: block;
443
+ width: 100%;
444
+ height: 100%;
445
+ }
446
+ /* 4. Estados compartidos. disabled es nativo; focus-visible distingue el foco de teclado. */
447
+ .dgm-button:disabled,
448
+ .dgm-input:disabled,
449
+ .dgm-checkbox:disabled,
450
+ .dgm-switch:disabled {
451
+ cursor: not-allowed;
452
+ opacity: 0.55;
453
+ }
454
+ .dgm-button:focus-visible,
455
+ .dgm-checkbox:focus-visible,
456
+ .dgm-switch:focus-visible {
457
+ outline: 3px solid var(--dgm-primary);
458
+ outline-offset: 3px;
459
+ }
460
+ /* Un contorno interior debe contrastar con el relleno primario, incluso en hover. */
461
+ .dgm-tree [role='treeitem'][aria-selected='true']:focus-visible > .dgm-tree-row,
462
+ .dgm-calendar .rdp-selected:not(.rdp-range_middle) .rdp-day_button:focus-visible {
463
+ outline-color: var(--dgm-on-primary);
464
+ }
465
+ /* Indicador decorativo. El nombre accesible permanece en el texto del botón. */
466
+ .dgm-spinner {
467
+ width: 0.9em;
468
+ height: 0.9em;
469
+ border: 2px solid currentColor;
470
+ border-right-color: transparent;
471
+ border-radius: 50%;
472
+ animation: dgm-spin 0.7s linear infinite;
473
+ }
474
+ @keyframes dgm-spin {
475
+ to {
476
+ transform: rotate(360deg);
477
+ }
478
+ }
479
+ /* 5. Campos. min-width: 0 permite encoger dentro de grid/flex; el borde de control tiene su propio token. */
480
+ .dgm-field {
481
+ display: flex;
482
+ flex-direction: column;
483
+ gap: 0.45rem;
484
+ width: 100%;
485
+ min-width: 0;
486
+ color: var(--dgm-text);
487
+ }
488
+ .dgm-label {
489
+ font-size: var(--dgm-text-label);
490
+ font-weight: var(--dgm-font-weight-semibold);
491
+ line-height: var(--dgm-leading-normal);
492
+ cursor: pointer;
493
+ }
494
+ .dgm-input {
495
+ /* Tokens internos: el error cambia la línea y el foco sin duplicar las sombras. */
496
+ --dgm-field-line: var(--dgm-control-border);
497
+ --dgm-field-focus: var(--dgm-primary);
498
+ width: 100%;
499
+ min-width: 0;
500
+ min-height: var(--dgm-control-min-height);
501
+ border: 0;
502
+ border-radius: var(--dgm-radius);
503
+ background: var(--dgm-surface);
504
+ color: var(--dgm-text);
505
+ /* Compensa el antiguo borde para conservar el tamaño y la posición del texto. */
506
+ padding: calc(0.65rem + 1px) calc(0.8rem + 1px);
507
+ font-size: var(--dgm-text-control);
508
+ font-weight: var(--dgm-font-weight-regular);
509
+ line-height: var(--dgm-leading-normal);
510
+ outline: 3px solid transparent;
511
+ outline-offset: 3px;
512
+ /* Ambas capas existen en reposo para que el navegador interpole su tamaño y color. */
513
+ box-shadow:
514
+ inset 0 0 0 1px var(--dgm-field-line),
515
+ 0 0 0 0 transparent;
516
+ transition: box-shadow 0.18s ease-out;
517
+ }
518
+ .dgm-input:focus-visible {
519
+ box-shadow:
520
+ inset 0 0 0 2px var(--dgm-field-focus),
521
+ 0 0 0 3px color-mix(in srgb, var(--dgm-field-focus) 22%, transparent);
522
+ }
523
+ .dgm-input::placeholder {
524
+ color: var(--dgm-muted);
525
+ opacity: 1;
526
+ }
527
+ .dgm-input[aria-invalid='true'] {
528
+ --dgm-field-line: var(--dgm-danger);
529
+ --dgm-field-focus: var(--dgm-danger);
530
+ }
531
+ /* El range conserva su pista y thumb nativos, sin la caja de los campos de texto.
532
+ Mantiene el área táctil del Input y un indicador de foco visible para teclado. */
533
+ .dgm-input[type='range'] {
534
+ margin: 0;
535
+ padding: 0;
536
+ border-radius: 0;
537
+ background: transparent;
538
+ box-shadow: none;
539
+ accent-color: var(--dgm-primary);
540
+ }
541
+ .dgm-input[type='range']:focus-visible {
542
+ outline-color: var(--dgm-field-focus);
543
+ }
544
+ .dgm-textarea {
545
+ resize: vertical;
546
+ }
547
+ .dgm-select {
548
+ cursor: pointer;
549
+ }
550
+ /* La flecha es decorativa; el select conserva su teclado y selector nativo móvil. */
551
+ .dgm-select-control {
552
+ position: relative;
553
+ min-width: 0;
554
+ color: var(--dgm-text);
555
+ }
556
+ .dgm-select-control--dropdown .dgm-select {
557
+ appearance: none;
558
+ -webkit-appearance: none;
559
+ padding-inline-end: 2.5rem;
560
+ }
561
+ .dgm-select-control--dropdown::after {
562
+ content: '';
563
+ position: absolute;
564
+ inset-inline-end: 1rem;
565
+ top: 50%;
566
+ width: 0.4rem;
567
+ height: 0.4rem;
568
+ border-right: 2px solid currentColor;
569
+ border-bottom: 2px solid currentColor;
570
+ transform: translateY(-70%) rotate(45deg);
571
+ pointer-events: none;
572
+ }
573
+ .dgm-description,
574
+ .dgm-error {
575
+ display: block;
576
+ font-size: var(--dgm-text-help);
577
+ line-height: var(--dgm-leading-normal);
578
+ overflow-wrap: anywhere;
579
+ }
580
+ .dgm-description {
581
+ color: var(--dgm-muted);
582
+ }
583
+ .dgm-error {
584
+ color: var(--dgm-danger);
585
+ }
586
+ /* 6. Opciones booleanas: input nativo, etiqueta clicable y ayuda que puede envolver líneas. */
587
+ .dgm-choice {
588
+ display: flex;
589
+ align-items: flex-start;
590
+ gap: 0.7rem;
591
+ min-height: 2.75rem;
592
+ color: var(--dgm-text);
593
+ }
594
+ .dgm-choice-text {
595
+ min-width: 0;
596
+ }
597
+ .dgm-choice-text .dgm-label {
598
+ display: block;
599
+ padding-bottom: 0.2rem;
600
+ }
601
+ .dgm-checkbox {
602
+ width: 1.15rem;
603
+ height: 1.15rem;
604
+ margin: 0.15rem 0 0;
605
+ accent-color: var(--dgm-primary);
606
+ flex-shrink: 0;
607
+ cursor: pointer;
608
+ }
609
+ /* El checkbox conserva su tamaño durante la interacción. */
610
+ /* El interruptor usa appearance: none solo para la vista; checked y los eventos siguen siendo nativos. */
611
+ .dgm-switch {
612
+ appearance: none;
613
+ -webkit-appearance: none;
614
+ width: 2.75rem;
615
+ height: 1.5rem;
616
+ margin: 0.1rem 0 0;
617
+ border: 1px solid var(--dgm-muted);
618
+ background: var(--dgm-muted);
619
+ border-radius: 2rem;
620
+ flex-shrink: 0;
621
+ cursor: pointer;
622
+ position: relative;
623
+ transition: background-color 0.15s;
624
+ }
625
+ .dgm-switch::before {
626
+ content: '';
627
+ position: absolute;
628
+ width: 1.125rem;
629
+ height: 1.125rem;
630
+ border-radius: 50%;
631
+ top: 2px;
632
+ left: 2px;
633
+ background: #fff;
634
+ transition: transform 0.15s;
635
+ }
636
+ .dgm-switch:checked {
637
+ background: var(--dgm-primary);
638
+ border-color: var(--dgm-primary);
639
+ }
640
+ .dgm-switch:checked::before {
641
+ transform: translateX(1.25rem);
642
+ }
643
+ /* 7. Tonos semánticos compartidos por Badge y Alert. El texto aporta el significado además del color. */
644
+ .dgm-tone--neutral {
645
+ --dgm-tone-fg: #3d4b60;
646
+ --dgm-tone-bg: #f0f3f7;
647
+ --dgm-tone-border: #d9e0ea;
648
+ }
649
+ .dgm-tone--info {
650
+ --dgm-tone-fg: #3730a3;
651
+ --dgm-tone-bg: #eef2ff;
652
+ --dgm-tone-border: #c7d2fe;
653
+ }
654
+ .dgm-tone--success {
655
+ --dgm-tone-fg: #166444;
656
+ --dgm-tone-bg: #edfbf3;
657
+ --dgm-tone-border: #b9e8cc;
658
+ }
659
+ .dgm-tone--warning {
660
+ --dgm-tone-fg: #854d0e;
661
+ --dgm-tone-bg: #fff9e8;
662
+ --dgm-tone-border: #f1d48a;
663
+ }
664
+ .dgm-tone--danger {
665
+ --dgm-tone-fg: #a2221a;
666
+ --dgm-tone-bg: #fff1f0;
667
+ --dgm-tone-border: #ffc9c5;
668
+ }
669
+ /* 8. Composición: etiquetas, tarjetas y avisos. Las cajas y el texto pueden adaptarse al ancho disponible. */
670
+ .dgm-badge {
671
+ display: inline-flex;
672
+ align-items: center;
673
+ /* Separa iconos y texto sin depender de espacios en blanco dentro de los hijos. */
674
+ gap: 0.25rem;
675
+ padding: 0.2rem 0.6rem;
676
+ border: 1px solid var(--dgm-tone-border);
677
+ border-radius: 0.4rem;
678
+ font-size: var(--dgm-text-caption);
679
+ font-weight: var(--dgm-font-weight-semibold);
680
+ line-height: var(--dgm-leading-normal);
681
+ background: var(--dgm-tone-bg);
682
+ color: var(--dgm-tone-fg);
683
+ }
684
+ .dgm-card {
685
+ min-width: 0;
686
+ width: 100%;
687
+ border: 1px solid var(--dgm-border);
688
+ border-radius: calc(var(--dgm-radius) + 0.25rem);
689
+ background: var(--dgm-surface);
690
+ color: var(--dgm-text);
691
+ overflow-wrap: anywhere;
692
+ }
693
+ .dgm-card-header,
694
+ .dgm-card-content,
695
+ .dgm-card-footer {
696
+ padding: 1.25rem;
697
+ }
698
+ .dgm-card-header + .dgm-card-content {
699
+ padding-top: 0;
700
+ }
701
+ .dgm-card-footer {
702
+ display: flex;
703
+ flex-wrap: wrap;
704
+ align-items: center;
705
+ gap: 0.75rem;
706
+ border-top: 1px solid var(--dgm-border);
707
+ }
708
+ .dgm-alert {
709
+ position: relative;
710
+ display: flex;
711
+ gap: 0.8rem;
712
+ padding: 1rem;
713
+ border: 1px solid var(--dgm-tone-border);
714
+ border-radius: var(--dgm-radius);
715
+ color: var(--dgm-tone-fg);
716
+ background: var(--dgm-tone-bg);
717
+ line-height: var(--dgm-leading-relaxed);
718
+ overflow-wrap: anywhere;
719
+ }
720
+
721
+ .dgm-alert > div {
722
+ min-width: 0;
723
+ }
724
+ .dgm-alert-symbol {
725
+ display: inline-flex;
726
+ align-items: center;
727
+ justify-content: center;
728
+ flex-shrink: 0;
729
+ width: 1.25rem;
730
+ height: 1.25rem;
731
+ margin-top: 0.15rem;
732
+ font-size: var(--dgm-text-caption);
733
+ font-weight: var(--dgm-font-weight-bold);
734
+ }
735
+ .dgm-alert-title {
736
+ font-weight: var(--dgm-font-weight-semibold);
737
+ }
738
+ .dgm-alert-content {
739
+ font-size: var(--dgm-text-body);
740
+ }
741
+ .dgm-alert-title + .dgm-alert-content {
742
+ margin-top: 0.25rem;
743
+ }
744
+ /* 9. Separadores. La variante vertical se estira en un contenedor flex. */
745
+ .dgm-separator {
746
+ border: 0;
747
+ margin: 0;
748
+ background: var(--dgm-border);
749
+ flex-shrink: 0;
750
+ }
751
+ .dgm-separator--horizontal {
752
+ height: 1px;
753
+ width: 100%;
754
+ }
755
+ .dgm-separator--vertical {
756
+ width: 1px;
757
+ height: auto;
758
+ min-height: 1.25rem;
759
+ align-self: stretch;
760
+ }
761
+ /* 10. Preferencias de accesibilidad: evita movimiento y recupera la apariencia nativa en alto contraste. */
762
+ @media (prefers-reduced-motion: reduce) {
763
+ :root {
764
+ --dgm-hover-transition: none;
765
+ }
766
+ .dgm-button,
767
+ .dgm-input,
768
+ .dgm-checkbox,
769
+ .dgm-switch,
770
+ .dgm-switch::before {
771
+ transition: none;
772
+ }
773
+ .dgm-spinner,
774
+ .dgm-alert {
775
+ animation: none;
776
+ }
777
+ }
778
+ @media (forced-colors: active) {
779
+ /* Las sombras se suprimen en este modo: el contorno mantiene visible el control. */
780
+ .dgm-input {
781
+ box-shadow: none;
782
+ outline: 1px solid ButtonText;
783
+ outline-offset: -1px;
784
+ }
785
+ .dgm-input:disabled {
786
+ outline-color: GrayText;
787
+ }
788
+ .dgm-input:focus-visible {
789
+ box-shadow: none;
790
+ outline: 3px solid Highlight;
791
+ outline-offset: 3px;
792
+ }
793
+ .dgm-select-control--dropdown .dgm-select {
794
+ appearance: auto;
795
+ -webkit-appearance: auto;
796
+ }
797
+ .dgm-select-control--dropdown::after {
798
+ display: none;
799
+ }
800
+ .dgm-switch {
801
+ appearance: auto;
802
+ -webkit-appearance: auto;
803
+ }
804
+ .dgm-switch::before {
805
+ display: none;
806
+ }
807
+ }
808
+
809
+ /* 11. Selector enriquecido: posicionamiento y teclado proceden de Radix; la vista es propia. */
810
+ .dgm-custom-trigger,
811
+ .dgm-custom-menu {
812
+ /* Evita seleccionar texto con doble clic o arrastre, también en el menú del portal. */
813
+ -webkit-user-select: none;
814
+ user-select: none;
815
+ }
816
+ .dgm-custom-trigger,
817
+ .dgm-combobox-trigger,
818
+ .dgm-date-trigger {
819
+ display: flex;
820
+ align-items: center;
821
+ justify-content: space-between;
822
+ gap: 0.75rem;
823
+ cursor: pointer;
824
+ text-align: start;
825
+ user-select: none;
826
+ -webkit-user-select: none;
827
+ }
828
+ .dgm-custom-trigger > span:first-child,
829
+ .dgm-combobox-trigger > span:first-child,
830
+ .dgm-date-trigger > span:first-child {
831
+ min-width: 0;
832
+ overflow-wrap: anywhere;
833
+ }
834
+ .dgm-custom-trigger[data-placeholder] {
835
+ color: var(--dgm-muted);
836
+ }
837
+ .dgm-custom-value {
838
+ /* Radix copia este contenido dentro de Value. Un inline-flex anidado añade
839
+ * espacio de línea base que no existe en el valor directo de Combobox. */
840
+ display: flex;
841
+ align-items: center;
842
+ gap: 0.6rem;
843
+ min-width: 0;
844
+ overflow-wrap: anywhere;
845
+ }
846
+ .dgm-option-icon {
847
+ display: inline-flex;
848
+ flex-shrink: 0;
849
+ }
850
+ .dgm-option-icon svg {
851
+ width: 1.1em;
852
+ height: 1.1em;
853
+ }
854
+ .dgm-custom-chevron {
855
+ display: inline-flex;
856
+ align-items: center;
857
+ justify-content: center;
858
+ width: 1.125rem;
859
+ height: 1.125rem;
860
+ flex-shrink: 0;
861
+ margin-inline-start: auto;
862
+ transform-origin: center;
863
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
864
+ }
865
+ .dgm-chevron-svg {
866
+ display: block;
867
+ width: 1.125rem;
868
+ height: 1.125rem;
869
+ }
870
+ .dgm-custom-trigger[data-state='open'] .dgm-custom-chevron {
871
+ transform: rotate(180deg);
872
+ }
873
+ .dgm-custom-menu {
874
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step) + 1);
875
+ box-sizing: border-box;
876
+ min-width: var(--radix-select-trigger-width);
877
+ max-width: calc(100vw - 24px);
878
+ /* Seis opciones y su padding superaban por pocos píxeles el antiguo límite de
879
+ * 20rem. Este es solo un máximo: las listas cortas conservan su altura natural
880
+ * y Radix limita el panel al espacio real disponible, también en móvil. */
881
+ max-height: min(24rem, var(--radix-select-content-available-height));
882
+ /* El viewport añade 0.125rem: ambos niveles suman el margen común en cada lado.
883
+ * La región solo ajusta el lado donde se haya medido una scrollbar real. */
884
+ padding: max(0px, calc(var(--dgm-list-padding) - 0.125rem));
885
+ overflow: hidden;
886
+ background: var(--dgm-surface);
887
+ color: var(--dgm-text);
888
+ border: 1px solid var(--dgm-border);
889
+ border-radius: var(--dgm-radius);
890
+ box-shadow: 0 12px 32px #0003;
891
+ font-family: var(--dgm-font, inherit);
892
+ }
893
+ .dgm-scroll-region {
894
+ position: relative;
895
+ display: flex;
896
+ flex: 1;
897
+ min-height: 0;
898
+ min-width: 0;
899
+ }
900
+ .dgm-custom-scroll-region {
901
+ /* Acerca ligeramente la barra al borde sin desequilibrar las listas cortas.
902
+ * Las medidas del viewport distinguen barras nativas, superpuestas y RTL. */
903
+ margin-left: calc(-1 * min(0.125rem, var(--dgm-scrollbar-left, 0px)));
904
+ margin-right: calc(-1 * min(0.125rem, var(--dgm-scrollbar-right, 0px)));
905
+ }
906
+ .dgm-scroll-region > :not(style):not(script) {
907
+ flex: 1;
908
+ min-width: 0;
909
+ min-height: 0;
910
+ }
911
+ .dgm-scroll-region {
912
+ --dgm-scroll-fade-top: 0px;
913
+ --dgm-scroll-fade-bottom: 0px;
914
+ }
915
+ .dgm-scroll-region[data-more-above] {
916
+ --dgm-scroll-fade-top: 1.25rem;
917
+ }
918
+ .dgm-scroll-region[data-more-below] {
919
+ --dgm-scroll-fade-bottom: 1.25rem;
920
+ }
921
+ .dgm-scroll-region:is([data-more-above], [data-more-below]) > :not(style):not(script) {
922
+ /* La máscara modifica el alfa del contenido: no pinta un color sobre el fondo.
923
+ Dos franjas opacas conservan la scrollbar nativa fuera del desvanecimiento. */
924
+ --dgm-scroll-mask:
925
+ linear-gradient(
926
+ to bottom,
927
+ transparent,
928
+ #000 var(--dgm-scroll-fade-top),
929
+ #000 calc(100% - var(--dgm-scroll-fade-bottom)),
930
+ transparent
931
+ ),
932
+ linear-gradient(#000, #000), linear-gradient(#000, #000);
933
+ -webkit-mask-image: var(--dgm-scroll-mask);
934
+ mask-image: var(--dgm-scroll-mask);
935
+ mask-mode: alpha;
936
+ -webkit-mask-size:
937
+ 100% 100%,
938
+ var(--dgm-scrollbar-left, 0px) 100%,
939
+ var(--dgm-scrollbar-right, 0px) 100%;
940
+ mask-size:
941
+ 100% 100%,
942
+ var(--dgm-scrollbar-left, 0px) 100%,
943
+ var(--dgm-scrollbar-right, 0px) 100%;
944
+ -webkit-mask-position: center, left, right;
945
+ mask-position: center, left, right;
946
+ -webkit-mask-repeat: no-repeat;
947
+ mask-repeat: no-repeat;
948
+ -webkit-mask-composite: source-over;
949
+ mask-composite: add;
950
+ }
951
+ @media (forced-colors: active) {
952
+ .dgm-scroll-region:is([data-more-above], [data-more-below]) > :not(style):not(script) {
953
+ -webkit-mask-image: none;
954
+ mask-image: none;
955
+ }
956
+ }
957
+ .dgm-custom-viewport[data-radix-select-viewport] {
958
+ padding: 0.125rem;
959
+ /* El estilo compartido recupera la barra nativa que Radix oculta por defecto. */
960
+ min-height: 0;
961
+ }
962
+ .dgm-custom-option {
963
+ font-size: var(--dgm-text-control);
964
+ font-weight: var(--dgm-font-weight-regular);
965
+ line-height: var(--dgm-leading-normal);
966
+ display: flex;
967
+ align-items: center;
968
+ gap: 0.75rem;
969
+ padding: 0.7rem var(--dgm-option-padding-inline);
970
+ min-height: 2.75rem;
971
+ box-sizing: border-box;
972
+ border-radius: 0.4rem;
973
+ cursor: pointer;
974
+ outline: none;
975
+ overflow-wrap: anywhere;
976
+ }
977
+ .dgm-custom-option[data-highlighted]:not([data-disabled]) {
978
+ box-shadow: inset 0 0 0 2px var(--dgm-primary);
979
+ }
980
+ .dgm-custom-option[data-disabled] {
981
+ opacity: 0.45;
982
+ cursor: not-allowed;
983
+ }
984
+ .dgm-custom-check {
985
+ /* Centrado geométrico del SVG, sin el espacio de línea base de un icono inline. */
986
+ display: flex;
987
+ align-items: center;
988
+ justify-content: center;
989
+ flex-shrink: 0;
990
+ width: 1.25rem;
991
+ height: 1.25rem;
992
+ margin-inline-start: auto;
993
+ color: var(--dgm-primary);
994
+ }
995
+ .dgm-custom-check > svg {
996
+ display: block;
997
+ }
998
+
999
+ /* 12. Modal: overlay y contenido comparten la capa, con cuerpo desplazable independiente. */
1000
+ .dgm-modal-overlay {
1001
+ position: fixed;
1002
+ inset: 0;
1003
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step));
1004
+ background: #0008;
1005
+ }
1006
+ .dgm-modal {
1007
+ position: fixed;
1008
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step) + 1);
1009
+ top: 50%;
1010
+ left: 50%;
1011
+ translate: -50% -50%;
1012
+ /* El centrado es constante: la animación solo modifica la escala alrededor del centro. */
1013
+ width: min(32rem, calc(100vw - 2rem));
1014
+ max-height: calc(100dvh - 2rem);
1015
+ display: flex;
1016
+ flex-direction: column;
1017
+ border: 1px solid var(--dgm-border);
1018
+ border-radius: calc(var(--dgm-radius) + 0.25rem);
1019
+ background: var(--dgm-surface);
1020
+ color: var(--dgm-text);
1021
+ box-shadow: 0 24px 80px #0005;
1022
+ font-family: var(--dgm-font, inherit);
1023
+ box-sizing: border-box;
1024
+ }
1025
+ .dgm-modal-header {
1026
+ position: relative;
1027
+ padding: 1.5rem 4rem 1rem 1.5rem;
1028
+ }
1029
+ .dgm-modal-title {
1030
+ font-size: var(--dgm-text-title);
1031
+ font-weight: var(--dgm-font-weight-semibold);
1032
+ line-height: var(--dgm-leading-tight);
1033
+ letter-spacing: var(--dgm-tracking-heading);
1034
+ margin: 0 0 0.5rem;
1035
+ }
1036
+ .dgm-modal-header .dgm-description {
1037
+ margin: 0;
1038
+ }
1039
+ .dgm-modal-body {
1040
+ padding: 0.5rem 1.5rem 1.5rem;
1041
+ min-height: 0;
1042
+ overflow-y: auto;
1043
+ overscroll-behavior: contain;
1044
+ }
1045
+ .dgm-modal-footer {
1046
+ display: flex;
1047
+ justify-content: flex-end;
1048
+ flex-wrap: wrap;
1049
+ gap: 0.75rem;
1050
+ padding: 1rem 1.5rem;
1051
+ border-top: 1px solid var(--dgm-border);
1052
+ }
1053
+ .dgm-modal-overlay[data-state='open'] {
1054
+ animation: dgm-fade-in var(--dgm-panel-duration-in) var(--dgm-panel-easing-in);
1055
+ }
1056
+ .dgm-modal-overlay[data-state='closed'] {
1057
+ animation: dgm-fade-out var(--dgm-panel-duration-out) var(--dgm-panel-easing-out) forwards;
1058
+ }
1059
+ /* Botón compacto de cierre compartido por modal y notificaciones; conserva un área de 40px. */
1060
+ .dgm-icon-close {
1061
+ position: absolute;
1062
+ top: 0.5rem;
1063
+ right: 0.5rem;
1064
+ width: 2.5rem;
1065
+ height: 2.5rem;
1066
+ display: grid;
1067
+ place-items: center;
1068
+ padding: 0;
1069
+ border: 0;
1070
+ border-radius: 0.5rem;
1071
+ background: transparent;
1072
+ color: inherit;
1073
+ font: inherit;
1074
+ /* Centra el símbolo; no es el interlineado de un contenido textual. */
1075
+ line-height: 1;
1076
+ cursor: pointer;
1077
+ }
1078
+ /* Caja simétrica centrada por grid, independiente de la línea base y métricas de la fuente. */
1079
+ .dgm-icon-close > svg {
1080
+ display: block;
1081
+ width: 1.125rem;
1082
+ height: 1.125rem;
1083
+ }
1084
+ .dgm-icon-close:focus-visible {
1085
+ outline: 3px solid var(--dgm-primary);
1086
+ outline-offset: 2px;
1087
+ }
1088
+
1089
+ @keyframes dgm-fade-in {
1090
+ from {
1091
+ opacity: 0;
1092
+ }
1093
+ to {
1094
+ opacity: 1;
1095
+ }
1096
+ }
1097
+ @keyframes dgm-fade-out {
1098
+ to {
1099
+ opacity: 0;
1100
+ }
1101
+ }
1102
+ @media (prefers-reduced-motion: reduce) {
1103
+ .dgm-custom-menu[data-state],
1104
+ .dgm-modal[data-state],
1105
+ .dgm-modal-overlay[data-state] {
1106
+ animation: none;
1107
+ }
1108
+ .dgm-custom-chevron {
1109
+ transition: none;
1110
+ }
1111
+ }
1112
+
1113
+ /* 13. Tooltip: ayuda flotante que hereda la paleta de la aplicación. */
1114
+ .dgm-tooltip {
1115
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step) + 1);
1116
+ max-width: min(20rem, calc(100vw - 1.5rem));
1117
+ box-sizing: border-box;
1118
+ padding: 0.55rem 0.75rem;
1119
+ border: 1px solid var(--dgm-border);
1120
+ border-radius: 0.5rem;
1121
+ background: var(--dgm-surface);
1122
+ color: var(--dgm-text);
1123
+ box-shadow: 0 6px 20px #0002;
1124
+ font-family: var(--dgm-font, inherit);
1125
+ font-size: var(--dgm-text-help);
1126
+ line-height: var(--dgm-leading-normal);
1127
+ overflow-wrap: anywhere;
1128
+ }
1129
+
1130
+ /* 14. Tabs: la orientación visual conserva el contrato de flechas incluso en móvil. */
1131
+ .dgm-tabs {
1132
+ min-width: 0;
1133
+ width: 100%;
1134
+ color: var(--dgm-text);
1135
+ font-family: var(--dgm-font, inherit);
1136
+ }
1137
+ .dgm-tabs-list {
1138
+ display: flex;
1139
+ gap: 0.25rem;
1140
+ padding: 0.35rem;
1141
+ box-sizing: border-box;
1142
+ overflow-x: auto;
1143
+ background: var(--dgm-subtle);
1144
+ border-radius: var(--dgm-radius);
1145
+ }
1146
+ .dgm-tabs-trigger {
1147
+ flex-shrink: 0;
1148
+ display: inline-flex;
1149
+ align-items: center;
1150
+ justify-content: center;
1151
+ gap: 0.5rem;
1152
+ min-height: 2.75rem;
1153
+ padding: 0.6rem 1rem;
1154
+ border: 0;
1155
+ border-radius: 0.4rem;
1156
+ background: transparent;
1157
+ color: var(--dgm-muted);
1158
+ font: inherit;
1159
+ font-size: var(--dgm-text-action);
1160
+ line-height: var(--dgm-leading-normal);
1161
+ font-weight: var(--dgm-font-weight-semibold);
1162
+ cursor: pointer;
1163
+ transition: var(--dgm-hover-transition);
1164
+ }
1165
+ .dgm-tabs-trigger:not([data-state='active']):hover:not(:disabled) {
1166
+ color: var(--dgm-on-hover);
1167
+ background: var(--dgm-hover);
1168
+ }
1169
+ .dgm-tabs-trigger[data-state='active'] {
1170
+ color: var(--dgm-primary);
1171
+ background: var(--dgm-surface);
1172
+ box-shadow: inset 0 -2px 0 var(--dgm-primary);
1173
+ }
1174
+ .dgm-tabs-trigger[data-state='active']:hover:not(:disabled) {
1175
+ color: var(--dgm-primary-hover);
1176
+ }
1177
+ .dgm-tabs-trigger:disabled {
1178
+ opacity: 0.45;
1179
+ cursor: not-allowed;
1180
+ }
1181
+ .dgm-tabs-trigger:focus-visible {
1182
+ outline: 2px solid var(--dgm-primary);
1183
+ outline-offset: -2px;
1184
+ }
1185
+ .dgm-tabs-panel {
1186
+ padding: 1.25rem 0.25rem 0.25rem;
1187
+ min-width: 0;
1188
+ overflow-wrap: anywhere;
1189
+ }
1190
+ .dgm-tabs-panel:focus-visible {
1191
+ outline: 2px solid var(--dgm-primary);
1192
+ outline-offset: 2px;
1193
+ border-radius: 0.4rem;
1194
+ }
1195
+ .dgm-tabs[data-orientation='vertical'] {
1196
+ display: grid;
1197
+ grid-template-columns: minmax(7rem, 12rem) minmax(0, 1fr);
1198
+ gap: 1rem;
1199
+ }
1200
+ .dgm-tabs-list[data-orientation='vertical'] {
1201
+ flex-direction: column;
1202
+ align-self: start;
1203
+ }
1204
+ .dgm-tabs-trigger[data-orientation='vertical'] {
1205
+ justify-content: flex-start;
1206
+ text-align: start;
1207
+ overflow-wrap: anywhere;
1208
+ }
1209
+ .dgm-tabs-panel[data-orientation='vertical'] {
1210
+ padding: 0.5rem 0.25rem;
1211
+ }
1212
+ @media (max-width: 480px) {
1213
+ .dgm-tabs[data-orientation='vertical'] {
1214
+ grid-template-columns: minmax(0, 1fr);
1215
+ }
1216
+ }
1217
+
1218
+ /* 15. Accordion: las alturas medidas animan contenido variable sin límites artificiales. */
1219
+ .dgm-accordion {
1220
+ border: 1px solid var(--dgm-border);
1221
+ border-radius: var(--dgm-radius);
1222
+ background: var(--dgm-surface);
1223
+ color: var(--dgm-text);
1224
+ font-family: var(--dgm-font, inherit);
1225
+ min-width: 0;
1226
+ width: 100%;
1227
+ box-sizing: border-box;
1228
+ }
1229
+ .dgm-accordion-item + .dgm-accordion-item {
1230
+ border-top: 1px solid var(--dgm-border);
1231
+ }
1232
+ .dgm-accordion-heading {
1233
+ margin: 0;
1234
+ font: inherit;
1235
+ }
1236
+ .dgm-accordion-trigger {
1237
+ display: flex;
1238
+ align-items: center;
1239
+ justify-content: space-between;
1240
+ gap: 1rem;
1241
+ width: 100%;
1242
+ padding: 1rem;
1243
+ border: 0;
1244
+ background: transparent;
1245
+ color: inherit;
1246
+ font: inherit;
1247
+ font-size: var(--dgm-text-action);
1248
+ line-height: var(--dgm-leading-normal);
1249
+ font-weight: var(--dgm-font-weight-semibold);
1250
+ text-align: start;
1251
+ cursor: pointer;
1252
+ transition: var(--dgm-hover-transition);
1253
+ box-sizing: border-box;
1254
+ }
1255
+ .dgm-accordion-trigger > span {
1256
+ min-width: 0;
1257
+ overflow-wrap: anywhere;
1258
+ }
1259
+ .dgm-accordion-trigger:disabled {
1260
+ opacity: 0.45;
1261
+ cursor: not-allowed;
1262
+ }
1263
+ .dgm-accordion-trigger:focus-visible {
1264
+ outline: 2px solid var(--dgm-primary);
1265
+ outline-offset: -3px;
1266
+ border-radius: 0.5rem;
1267
+ }
1268
+ .dgm-accordion-chevron {
1269
+ width: 1.125rem;
1270
+ height: 1.125rem;
1271
+ flex-shrink: 0;
1272
+ transition: transform 0.3s ease;
1273
+ }
1274
+ .dgm-accordion-trigger[data-state='open'] .dgm-accordion-chevron {
1275
+ transform: rotate(180deg);
1276
+ }
1277
+ .dgm-accordion-content {
1278
+ overflow: hidden;
1279
+ }
1280
+ .dgm-accordion-content[data-state='open'] {
1281
+ animation: dgm-accordion-open 0.3s ease;
1282
+ }
1283
+ .dgm-accordion-content[data-state='closed'] {
1284
+ animation: dgm-accordion-close 0.3s ease;
1285
+ }
1286
+ .dgm-accordion-body {
1287
+ padding: 0.25rem 1rem 1rem;
1288
+ line-height: var(--dgm-leading-relaxed);
1289
+ overflow-wrap: anywhere;
1290
+ }
1291
+ @keyframes dgm-accordion-open {
1292
+ from {
1293
+ height: 0;
1294
+ }
1295
+ to {
1296
+ height: var(--radix-accordion-content-height);
1297
+ }
1298
+ }
1299
+ @keyframes dgm-accordion-close {
1300
+ from {
1301
+ height: var(--radix-accordion-content-height);
1302
+ }
1303
+ to {
1304
+ height: 0;
1305
+ }
1306
+ }
1307
+
1308
+ /* 16. Transition conserva la caja durante la salida; no anima contenido estático al cargar. */
1309
+ /* La fila flexible pasa de cero a la altura del contenido y permite invertir el recorrido.
1310
+ min-height: 0 impide que el tamaño mínimo del hijo mantenga abierto el contenedor. */
1311
+ .dgm-transition-collapse {
1312
+ display: grid;
1313
+ min-width: 0;
1314
+ grid-template-rows: 0fr;
1315
+ transition: grid-template-rows var(--dgm-transition-duration, 240ms) ease;
1316
+ }
1317
+ .dgm-transition-collapse[data-expanded] {
1318
+ grid-template-rows: 1fr;
1319
+ }
1320
+ .dgm-transition-clip {
1321
+ min-height: 0;
1322
+ min-width: 0;
1323
+ overflow: hidden;
1324
+ }
1325
+ .dgm-transition-collapse[data-state='closed'] {
1326
+ pointer-events: none;
1327
+ }
1328
+ .dgm-transition {
1329
+ min-width: 0;
1330
+ animation-duration: var(--dgm-transition-duration, 240ms);
1331
+ animation-timing-function: ease;
1332
+ animation-fill-mode: both;
1333
+ transform-origin: center;
1334
+ }
1335
+ .dgm-transition[data-state='closed'] {
1336
+ pointer-events: none;
1337
+ }
1338
+ /* Reservar/recoger espacio conserva la altura natural, pero no reproduce todavía el efecto. */
1339
+ .dgm-transition[data-state='hidden'] {
1340
+ visibility: hidden;
1341
+ opacity: 0;
1342
+ pointer-events: none;
1343
+ }
1344
+ .dgm-transition[data-state='open'][data-enter][data-variant='fade'] {
1345
+ animation-name: dgm-transition-fade-in;
1346
+ }
1347
+ .dgm-transition[data-state='closed'][data-variant='fade'] {
1348
+ animation-name: dgm-transition-fade-out;
1349
+ }
1350
+ .dgm-transition[data-state='open'][data-enter][data-variant='scale'] {
1351
+ animation-name: dgm-transition-scale-in;
1352
+ }
1353
+ .dgm-transition[data-state='closed'][data-variant='scale'] {
1354
+ animation-name: dgm-transition-scale-out;
1355
+ }
1356
+ .dgm-transition[data-state='open'][data-enter][data-variant='slide'] {
1357
+ animation-name: dgm-transition-slide-in;
1358
+ }
1359
+ .dgm-transition[data-state='closed'][data-variant='slide'] {
1360
+ animation-name: dgm-transition-slide-out;
1361
+ }
1362
+ @keyframes dgm-transition-fade-in {
1363
+ from {
1364
+ opacity: 0;
1365
+ }
1366
+ to {
1367
+ opacity: 1;
1368
+ }
1369
+ }
1370
+ @keyframes dgm-transition-fade-out {
1371
+ from {
1372
+ opacity: 1;
1373
+ }
1374
+ to {
1375
+ opacity: 0;
1376
+ }
1377
+ }
1378
+ @keyframes dgm-transition-scale-in {
1379
+ from {
1380
+ opacity: 0;
1381
+ transform: scale(0.96);
1382
+ }
1383
+ to {
1384
+ opacity: 1;
1385
+ transform: scale(1);
1386
+ }
1387
+ }
1388
+ @keyframes dgm-transition-scale-out {
1389
+ from {
1390
+ opacity: 1;
1391
+ transform: scale(1);
1392
+ }
1393
+ to {
1394
+ opacity: 0;
1395
+ transform: scale(0.96);
1396
+ }
1397
+ }
1398
+ @keyframes dgm-transition-slide-in {
1399
+ from {
1400
+ opacity: 0;
1401
+ transform: translateY(8px);
1402
+ }
1403
+ to {
1404
+ opacity: 1;
1405
+ transform: translateY(0);
1406
+ }
1407
+ }
1408
+ @keyframes dgm-transition-slide-out {
1409
+ from {
1410
+ opacity: 1;
1411
+ transform: translateY(0);
1412
+ }
1413
+ to {
1414
+ opacity: 0;
1415
+ transform: translateY(8px);
1416
+ }
1417
+ }
1418
+ @media (prefers-reduced-motion: reduce) {
1419
+ .dgm-transition-collapse {
1420
+ transition: none;
1421
+ }
1422
+ .dgm-transition,
1423
+ .dgm-tooltip[data-state],
1424
+ .dgm-accordion-content[data-state] {
1425
+ animation: none;
1426
+ }
1427
+ .dgm-tabs-trigger,
1428
+ .dgm-accordion-trigger,
1429
+ .dgm-accordion-chevron {
1430
+ transition: none;
1431
+ }
1432
+ }
1433
+ @media (forced-colors: active) {
1434
+ .dgm-tabs-trigger[data-state='active'] {
1435
+ outline: 2px solid Highlight;
1436
+ outline-offset: -2px;
1437
+ }
1438
+ }
1439
+
1440
+ /* 17. Menú de acciones. El portal limita ancho y altura al espacio disponible. */
1441
+ .dgm-dropdown {
1442
+ box-sizing: border-box;
1443
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step) + 1);
1444
+ min-width: min(12rem, calc(100vw - 1.5rem));
1445
+ max-width: min(24rem, calc(100vw - 1.5rem));
1446
+ max-height: var(--radix-dropdown-menu-content-available-height);
1447
+ overflow-y: auto;
1448
+ padding: var(--dgm-list-padding);
1449
+ border: 1px solid var(--dgm-border);
1450
+ border-radius: var(--dgm-radius);
1451
+ background: var(--dgm-surface);
1452
+ color: var(--dgm-text);
1453
+ font-family: var(--dgm-font, inherit);
1454
+ box-shadow: 0 12px 32px #0002;
1455
+ -webkit-user-select: none;
1456
+ user-select: none;
1457
+ }
1458
+ .dgm-context-menu {
1459
+ max-width: min(24rem, calc(100vw - 1.5rem), var(--radix-context-menu-content-available-width));
1460
+ max-height: var(--radix-context-menu-content-available-height);
1461
+ }
1462
+ .dgm-context-trigger:focus-visible {
1463
+ outline: 2px solid var(--dgm-primary);
1464
+ outline-offset: 3px;
1465
+ }
1466
+ .dgm-dropdown-item {
1467
+ display: flex;
1468
+ align-items: center;
1469
+ gap: 0.65rem;
1470
+ min-height: 2.75rem;
1471
+ padding: 0.5rem var(--dgm-option-padding-inline);
1472
+ box-sizing: border-box;
1473
+ border-radius: 0.375rem;
1474
+ outline: none;
1475
+ font-size: var(--dgm-text-control);
1476
+ font-weight: var(--dgm-font-weight-regular);
1477
+ line-height: var(--dgm-leading-normal);
1478
+ cursor: pointer;
1479
+ transition: var(--dgm-hover-transition);
1480
+ }
1481
+ .dgm-dropdown-item[data-highlighted]:not([data-disabled]) {
1482
+ outline: 2px solid var(--dgm-primary);
1483
+ outline-offset: -2px;
1484
+ }
1485
+ .dgm-dropdown-item[data-disabled] {
1486
+ opacity: 0.5;
1487
+ cursor: not-allowed;
1488
+ }
1489
+ .dgm-dropdown-item--danger {
1490
+ --dgm-interaction-text: var(--dgm-danger);
1491
+ color: var(--dgm-danger);
1492
+ }
1493
+ .dgm-dropdown-text {
1494
+ flex: 1;
1495
+ min-width: 0;
1496
+ overflow-wrap: anywhere;
1497
+ }
1498
+ .dgm-dropdown-shortcut {
1499
+ color: var(--dgm-muted);
1500
+ font-size: var(--dgm-text-caption);
1501
+ }
1502
+ .dgm-dropdown-label {
1503
+ padding: 0.625rem var(--dgm-option-padding-inline);
1504
+ color: var(--dgm-muted);
1505
+ font-size: var(--dgm-text-label);
1506
+ font-weight: var(--dgm-font-weight-semibold);
1507
+ }
1508
+ .dgm-dropdown-separator {
1509
+ height: 1px;
1510
+ background: var(--dgm-border);
1511
+ margin: 0.375rem calc(-1 * var(--dgm-list-padding));
1512
+ }
1513
+
1514
+ /* 18. Radios. Un punto siempre montado transiciona al seleccionar, sin animar SSR. */
1515
+ .dgm-radio-group {
1516
+ display: flex;
1517
+ flex-direction: column;
1518
+ gap: 0.5rem;
1519
+ min-width: 0;
1520
+ }
1521
+ .dgm-radio-group[data-orientation='horizontal'] {
1522
+ flex-direction: row;
1523
+ flex-wrap: wrap;
1524
+ gap: 0.5rem 1.5rem;
1525
+ }
1526
+ .dgm-radio-option {
1527
+ display: flex;
1528
+ align-items: flex-start;
1529
+ gap: 0.65rem;
1530
+ min-height: 2.75rem;
1531
+ padding: 0.5rem 0;
1532
+ box-sizing: border-box;
1533
+ color: var(--dgm-text);
1534
+ cursor: pointer;
1535
+ }
1536
+ .dgm-radio-option[data-disabled] {
1537
+ opacity: 0.55;
1538
+ cursor: not-allowed;
1539
+ }
1540
+ .dgm-radio-copy {
1541
+ display: grid;
1542
+ gap: 0.25rem;
1543
+ line-height: var(--dgm-leading-normal);
1544
+ min-width: 0;
1545
+ overflow-wrap: anywhere;
1546
+ }
1547
+ .dgm-radio-control {
1548
+ display: grid;
1549
+ place-items: center;
1550
+ flex-shrink: 0;
1551
+ width: 1.25rem;
1552
+ height: 1.25rem;
1553
+ margin: 0.125rem 0 0;
1554
+ padding: 0;
1555
+ border: 0;
1556
+ border-radius: 50%;
1557
+ background: var(--dgm-surface);
1558
+ box-shadow: inset 0 0 0 1px var(--dgm-control-border);
1559
+ color: var(--dgm-primary);
1560
+ cursor: inherit;
1561
+ transition: box-shadow 0.18s ease;
1562
+ }
1563
+ .dgm-radio-control[data-state='checked'] {
1564
+ box-shadow: inset 0 0 0 2px var(--dgm-primary);
1565
+ }
1566
+ .dgm-radio-control:focus-visible {
1567
+ outline: 3px solid var(--dgm-primary);
1568
+ outline-offset: 3px;
1569
+ }
1570
+ .dgm-radio-dot {
1571
+ width: 0.625rem;
1572
+ height: 0.625rem;
1573
+ border-radius: 50%;
1574
+ background: currentColor;
1575
+ opacity: 0;
1576
+ transition: opacity 0.18s ease;
1577
+ }
1578
+ .dgm-radio-control[data-state='checked'] .dgm-radio-dot {
1579
+ opacity: 1;
1580
+ }
1581
+ .dgm-radio-group[aria-invalid='true'] .dgm-radio-control {
1582
+ box-shadow: inset 0 0 0 1px var(--dgm-danger);
1583
+ }
1584
+
1585
+ /* 19. Notificaciones. El margen interior contiene el movimiento: no genera scrollbar. */
1586
+ .dgm-toast-viewport {
1587
+ position: fixed;
1588
+ z-index: var(--dgm-layer-toast);
1589
+ bottom: max(0.5rem, env(safe-area-inset-bottom));
1590
+ right: max(0.5rem, env(safe-area-inset-right));
1591
+ display: flex;
1592
+ flex-direction: column;
1593
+ gap: 0.75rem;
1594
+ box-sizing: border-box;
1595
+ width: min(26rem, calc(100vw - 1rem));
1596
+ max-height: calc(100dvh - 1rem);
1597
+ margin: 0;
1598
+ padding: 0.5rem;
1599
+ overflow-x: hidden;
1600
+ overflow-y: auto;
1601
+ list-style: none;
1602
+ pointer-events: none;
1603
+ }
1604
+ .dgm-toast-viewport:empty {
1605
+ padding: 0;
1606
+ }
1607
+ .dgm-toast-viewport:focus-visible {
1608
+ outline: 2px solid var(--dgm-primary);
1609
+ outline-offset: -2px;
1610
+ border-radius: var(--dgm-radius);
1611
+ }
1612
+ .dgm-toast {
1613
+ position: relative;
1614
+ flex-shrink: 0;
1615
+ min-width: 0;
1616
+ outline: none;
1617
+ color: var(--dgm-tone-fg);
1618
+ border-radius: var(--dgm-radius);
1619
+ pointer-events: auto;
1620
+ touch-action: pan-y;
1621
+ }
1622
+ .dgm-toast > .dgm-alert {
1623
+ padding-inline-end: 3.25rem;
1624
+ }
1625
+ .dgm-toast[data-state='closed'] {
1626
+ pointer-events: none;
1627
+ }
1628
+ .dgm-toast[data-swipe='move'] {
1629
+ transform: translateX(var(--radix-toast-swipe-move-x));
1630
+ }
1631
+ .dgm-toast[data-swipe='cancel'] {
1632
+ transform: translateX(0);
1633
+ transition: transform 0.2s ease;
1634
+ }
1635
+ .dgm-toast-action {
1636
+ margin-top: 0.75rem;
1637
+ }
1638
+ .dgm-toast:focus-visible {
1639
+ outline: 3px solid var(--dgm-primary);
1640
+ outline-offset: 2px;
1641
+ }
1642
+
1643
+ /* 20. Skeleton: reserva dimensiones reales y se mantiene fuera del árbol accesible. */
1644
+ /* Loaders: la caja conserva sus dimensiones durante toda la animación.
1645
+ Los efectos solo alteran transform/opacity y nunca desplazan el contenido. */
1646
+ .dgm-loader {
1647
+ --dgm-loader-size: 1.5rem;
1648
+ display: inline-flex;
1649
+ align-items: center;
1650
+ justify-content: center;
1651
+ gap: 0.75rem;
1652
+ max-width: 100%;
1653
+ vertical-align: middle;
1654
+ font-family: var(--dgm-font, inherit);
1655
+ }
1656
+ .dgm-loader--sm {
1657
+ --dgm-loader-size: 1rem;
1658
+ }
1659
+ .dgm-loader--lg {
1660
+ --dgm-loader-size: 2.5rem;
1661
+ }
1662
+ .dgm-loader--xl {
1663
+ --dgm-loader-size: 3.5rem;
1664
+ }
1665
+ .dgm-loader-figure {
1666
+ display: inline-flex;
1667
+ position: relative;
1668
+ width: var(--dgm-loader-size);
1669
+ height: var(--dgm-loader-size);
1670
+ flex: 0 0 var(--dgm-loader-size);
1671
+ align-items: center;
1672
+ justify-content: space-between;
1673
+ box-sizing: border-box;
1674
+ }
1675
+ .dgm-loader-piece {
1676
+ display: block;
1677
+ background: currentColor;
1678
+ animation-delay: calc(var(--dgm-loader-index) * -0.16s);
1679
+ }
1680
+ .dgm-loader--spinner .dgm-loader-figure {
1681
+ border: max(2px, calc(var(--dgm-loader-size) * 0.085)) solid currentColor;
1682
+ border-inline-end-color: transparent;
1683
+ border-radius: 50%;
1684
+ animation: dgm-loader-turn 0.9s linear infinite;
1685
+ }
1686
+ .dgm-loader--dots .dgm-loader-piece {
1687
+ width: 23%;
1688
+ height: 23%;
1689
+ border-radius: 50%;
1690
+ animation-name: dgm-loader-dots;
1691
+ animation-duration: 1.2s;
1692
+ animation-timing-function: ease-in-out;
1693
+ animation-iteration-count: infinite;
1694
+ }
1695
+ .dgm-loader--bars .dgm-loader-piece {
1696
+ width: 22%;
1697
+ height: 85%;
1698
+ border-radius: 999px;
1699
+ animation-name: dgm-loader-bars;
1700
+ animation-duration: 1s;
1701
+ animation-timing-function: ease-in-out;
1702
+ animation-iteration-count: infinite;
1703
+ }
1704
+ .dgm-loader--pulse .dgm-loader-piece {
1705
+ position: absolute;
1706
+ inset: 0;
1707
+ border: 2px solid currentColor;
1708
+ background: none;
1709
+ border-radius: 50%;
1710
+ animation-name: dgm-loader-ripple;
1711
+ animation-duration: 1.8s;
1712
+ animation-delay: calc(var(--dgm-loader-index) * -0.6s);
1713
+ animation-timing-function: ease-out;
1714
+ animation-iteration-count: infinite;
1715
+ }
1716
+ .dgm-loader-label {
1717
+ color: var(--dgm-text);
1718
+ min-width: 0;
1719
+ overflow-wrap: anywhere;
1720
+ font-size: var(--dgm-text-help);
1721
+ }
1722
+ .dgm-loader-label-hidden {
1723
+ position: absolute;
1724
+ width: 1px;
1725
+ height: 1px;
1726
+ padding: 0;
1727
+ margin: -1px;
1728
+ overflow: hidden;
1729
+ clip-path: inset(50%);
1730
+ white-space: nowrap;
1731
+ border: 0;
1732
+ }
1733
+ @keyframes dgm-loader-turn {
1734
+ to {
1735
+ transform: rotate(360deg);
1736
+ }
1737
+ }
1738
+ @keyframes dgm-loader-dots {
1739
+ 0%,
1740
+ 80%,
1741
+ 100% {
1742
+ opacity: 0.35;
1743
+ transform: translateY(0);
1744
+ }
1745
+ 40% {
1746
+ opacity: 1;
1747
+ transform: translateY(-35%);
1748
+ }
1749
+ }
1750
+ @keyframes dgm-loader-bars {
1751
+ 0%,
1752
+ 80%,
1753
+ 100% {
1754
+ transform: scaleY(0.4);
1755
+ opacity: 0.5;
1756
+ }
1757
+ 40% {
1758
+ transform: scaleY(1);
1759
+ opacity: 1;
1760
+ }
1761
+ }
1762
+ @keyframes dgm-loader-ripple {
1763
+ from {
1764
+ transform: scale(0.2);
1765
+ opacity: 0.85;
1766
+ }
1767
+ to {
1768
+ transform: scale(1);
1769
+ opacity: 0;
1770
+ }
1771
+ }
1772
+ /* Un loader inmóvil sigue siendo reconocible y conserva su anuncio textual. */
1773
+ .dgm-loader--static .dgm-loader-figure,
1774
+ .dgm-loader--static .dgm-loader-piece {
1775
+ animation: none;
1776
+ }
1777
+ @media (prefers-reduced-motion: reduce) {
1778
+ .dgm-loader .dgm-loader-figure,
1779
+ .dgm-loader .dgm-loader-piece {
1780
+ animation: none;
1781
+ }
1782
+ }
1783
+
1784
+ .dgm-skeleton {
1785
+ display: block;
1786
+ box-sizing: border-box;
1787
+ flex-shrink: 0;
1788
+ max-width: 100%;
1789
+ background: var(--dgm-border);
1790
+ border-radius: 0.25rem;
1791
+ }
1792
+ .dgm-skeleton--rectangular {
1793
+ border-radius: var(--dgm-radius);
1794
+ }
1795
+ .dgm-skeleton--circular {
1796
+ border-radius: 50%;
1797
+ }
1798
+ .dgm-skeleton--animated {
1799
+ animation: dgm-skeleton-pulse 1.6s ease infinite;
1800
+ }
1801
+ @keyframes dgm-skeleton-pulse {
1802
+ 0%,
1803
+ 100% {
1804
+ opacity: 0.45;
1805
+ }
1806
+ 50% {
1807
+ opacity: 0.85;
1808
+ }
1809
+ }
1810
+ @media (prefers-reduced-motion: reduce) {
1811
+ .dgm-dropdown[data-state],
1812
+ .dgm-toast[data-state],
1813
+ .dgm-skeleton--animated {
1814
+ animation: none;
1815
+ }
1816
+ .dgm-dropdown-item,
1817
+ .dgm-radio-control,
1818
+ .dgm-radio-dot,
1819
+ .dgm-toast[data-swipe] {
1820
+ transition: none;
1821
+ }
1822
+ }
1823
+ @media (forced-colors: active) {
1824
+ .dgm-radio-control {
1825
+ border: 1px solid ButtonText;
1826
+ }
1827
+ .dgm-radio-dot {
1828
+ background: Highlight;
1829
+ forced-color-adjust: none;
1830
+ }
1831
+ .dgm-skeleton {
1832
+ background: GrayText;
1833
+ forced-color-adjust: none;
1834
+ }
1835
+ }
1836
+
1837
+ /* El botón de contraseña queda dentro del campo; el padding reserva su área completa. */
1838
+ .dgm-input-control {
1839
+ position: relative;
1840
+ min-width: 0;
1841
+ }
1842
+ .dgm-input.dgm-input--password {
1843
+ padding-inline-end: 3.25rem;
1844
+ }
1845
+ .dgm-password-toggle {
1846
+ position: absolute;
1847
+ inset-inline-end: 0.25rem;
1848
+ top: 50%;
1849
+ transform: translateY(-50%);
1850
+ display: grid;
1851
+ place-items: center;
1852
+ width: 2.5rem;
1853
+ height: 2.5rem;
1854
+ padding: 0;
1855
+ border: 0;
1856
+ border-radius: 0.5rem;
1857
+ background: transparent;
1858
+ color: var(--dgm-muted);
1859
+ cursor: pointer;
1860
+ }
1861
+ .dgm-password-toggle:focus-visible {
1862
+ outline: 2px solid var(--dgm-primary);
1863
+ outline-offset: -2px;
1864
+ }
1865
+ .dgm-password-toggle:disabled {
1866
+ cursor: not-allowed;
1867
+ opacity: 0.5;
1868
+ }
1869
+ /* Evita duplicar el botón de visibilidad que algunos navegadores añaden por su cuenta. */
1870
+ .dgm-input--password::-ms-reveal {
1871
+ display: none;
1872
+ }
1873
+
1874
+ /* Movimiento compartido de superficies. Las variables de Radix reflejan el lado
1875
+ final tras las colisiones; el zoom no impone una traslación vertical fija. */
1876
+ .dgm-custom-menu {
1877
+ --dgm-panel-origin: var(--radix-select-content-transform-origin, center top);
1878
+ }
1879
+ .dgm-dropdown {
1880
+ --dgm-panel-origin: var(--radix-dropdown-menu-content-transform-origin, center top);
1881
+ }
1882
+ .dgm-context-menu {
1883
+ --dgm-panel-origin: var(--radix-context-menu-content-transform-origin, left top);
1884
+ }
1885
+ .dgm-popover,
1886
+ .dgm-combobox-panel,
1887
+ .dgm-calendar-panel {
1888
+ --dgm-panel-origin: var(--radix-popover-content-transform-origin, center top);
1889
+ }
1890
+ .dgm-tooltip {
1891
+ --dgm-panel-origin: var(--radix-tooltip-content-transform-origin, center bottom);
1892
+ }
1893
+ .dgm-navigation-content {
1894
+ --dgm-panel-origin: var(--dgm-navigation-origin-x, 50%) top;
1895
+ }
1896
+ .dgm-modal,
1897
+ .dgm-alert--animated {
1898
+ --dgm-panel-origin: center;
1899
+ }
1900
+ .dgm-toast {
1901
+ --dgm-panel-origin: right bottom;
1902
+ }
1903
+ :is(
1904
+ .dgm-custom-menu,
1905
+ .dgm-dropdown,
1906
+ .dgm-popover,
1907
+ .dgm-combobox-panel,
1908
+ .dgm-calendar-panel,
1909
+ .dgm-tooltip,
1910
+ .dgm-navigation-content,
1911
+ .dgm-modal,
1912
+ .dgm-toast,
1913
+ .dgm-alert--animated
1914
+ ) {
1915
+ transform-origin: var(--dgm-panel-origin);
1916
+ }
1917
+ :is(
1918
+ .dgm-custom-menu,
1919
+ .dgm-dropdown,
1920
+ .dgm-popover,
1921
+ .dgm-combobox-panel,
1922
+ .dgm-calendar-panel,
1923
+ .dgm-tooltip,
1924
+ .dgm-navigation-content,
1925
+ .dgm-modal,
1926
+ .dgm-toast
1927
+ ):is([data-state='open'], [data-state='instant-open'], [data-state='delayed-open']),
1928
+ .dgm-alert--animated {
1929
+ animation: dgm-panel-in var(--dgm-panel-duration-in) var(--dgm-panel-easing-in);
1930
+ }
1931
+ :is(
1932
+ .dgm-custom-menu,
1933
+ .dgm-dropdown,
1934
+ .dgm-popover,
1935
+ .dgm-combobox-panel,
1936
+ .dgm-calendar-panel,
1937
+ .dgm-tooltip,
1938
+ .dgm-navigation-content,
1939
+ .dgm-modal,
1940
+ .dgm-toast
1941
+ )[data-state='closed'] {
1942
+ animation: dgm-panel-out var(--dgm-panel-duration-out) var(--dgm-panel-easing-out) forwards;
1943
+ }
1944
+ @keyframes dgm-panel-in {
1945
+ from {
1946
+ opacity: 0;
1947
+ transform: scale(var(--dgm-panel-scale));
1948
+ }
1949
+ to {
1950
+ opacity: 1;
1951
+ transform: scale(1);
1952
+ }
1953
+ }
1954
+ @keyframes dgm-panel-out {
1955
+ from {
1956
+ opacity: 1;
1957
+ transform: scale(1);
1958
+ }
1959
+ to {
1960
+ opacity: 0;
1961
+ transform: scale(var(--dgm-panel-scale));
1962
+ }
1963
+ }
1964
+ @media (prefers-reduced-motion: reduce) {
1965
+ :is(
1966
+ .dgm-custom-menu,
1967
+ .dgm-dropdown,
1968
+ .dgm-popover,
1969
+ .dgm-combobox-panel,
1970
+ .dgm-calendar-panel,
1971
+ .dgm-tooltip,
1972
+ .dgm-navigation-content,
1973
+ .dgm-modal,
1974
+ .dgm-toast
1975
+ )[data-state],
1976
+ .dgm-alert--animated {
1977
+ animation: none;
1978
+ }
1979
+ }
1980
+
1981
+ /* Componentes compuestos: esta hoja se distribuye unida a styles.css, sin imports adicionales. */
1982
+ .dgm-visually-hidden,
1983
+ .dgm-form-value {
1984
+ position: absolute;
1985
+ width: 1px;
1986
+ height: 1px;
1987
+ padding: 0;
1988
+ border: 0;
1989
+ margin: -1px;
1990
+ overflow: hidden;
1991
+ clip-path: inset(50%);
1992
+ white-space: nowrap;
1993
+ }
1994
+ .dgm-popover,
1995
+ .dgm-combobox-panel,
1996
+ .dgm-calendar-panel {
1997
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step) + 1);
1998
+ box-sizing: border-box;
1999
+ border: 1px solid var(--dgm-border);
2000
+ border-radius: var(--dgm-radius);
2001
+ color: var(--dgm-text);
2002
+ background: var(--dgm-surface);
2003
+ box-shadow: 0 12px 32px #0002;
2004
+ font-family: var(--dgm-font, inherit);
2005
+ max-width: calc(100vw - 1.5rem);
2006
+ max-height: var(--radix-popover-content-available-height);
2007
+ overflow: auto;
2008
+ }
2009
+ .dgm-popover {
2010
+ position: relative;
2011
+ width: 22rem;
2012
+ padding: 1.25rem;
2013
+ }
2014
+ .dgm-popover-heading {
2015
+ font-size: var(--dgm-text-title);
2016
+ font-weight: var(--dgm-font-weight-semibold);
2017
+ line-height: var(--dgm-leading-tight);
2018
+ letter-spacing: var(--dgm-tracking-heading);
2019
+ padding-inline-end: 2.5rem;
2020
+ margin-bottom: 1rem;
2021
+ overflow-wrap: anywhere;
2022
+ }
2023
+ .dgm-popover-body {
2024
+ min-width: 0;
2025
+ }
2026
+ .dgm-drawer {
2027
+ --dgm-drawer-x: 0;
2028
+ --dgm-drawer-y: 0;
2029
+ position: fixed;
2030
+ /* Un nivel sobre el overlay de su profundidad, igual que Modal. */
2031
+ z-index: calc(var(--dgm-layer-base) + var(--dgm-layer-depth, 0) * var(--dgm-layer-step) + 1);
2032
+ box-sizing: border-box;
2033
+ display: flex;
2034
+ flex-direction: column;
2035
+ max-height: 100dvh;
2036
+ background: var(--dgm-surface);
2037
+ color: var(--dgm-text);
2038
+ font-family: var(--dgm-font, inherit);
2039
+ border: 1px solid var(--dgm-border);
2040
+ box-shadow: 0 0 40px #0003;
2041
+ }
2042
+ .dgm-drawer--right {
2043
+ --dgm-drawer-x: 100%;
2044
+ inset: 0 0 0 auto;
2045
+ width: min(28rem, calc(100vw - 1rem));
2046
+ }
2047
+ .dgm-drawer--left {
2048
+ --dgm-drawer-x: -100%;
2049
+ inset: 0 auto 0 0;
2050
+ width: min(28rem, calc(100vw - 1rem));
2051
+ }
2052
+ .dgm-drawer--bottom {
2053
+ --dgm-drawer-y: 100%;
2054
+ inset: auto 0 0;
2055
+ max-height: 85dvh;
2056
+ border-radius: 1rem 1rem 0 0;
2057
+ }
2058
+ .dgm-drawer--top {
2059
+ --dgm-drawer-y: -100%;
2060
+ inset: 0 0 auto;
2061
+ max-height: 85dvh;
2062
+ border-radius: 0 0 1rem 1rem;
2063
+ }
2064
+ .dgm-drawer .dgm-modal-header {
2065
+ position: relative;
2066
+ flex-shrink: 0;
2067
+ }
2068
+ .dgm-drawer .dgm-modal-body {
2069
+ flex: 1;
2070
+ min-height: 0;
2071
+ }
2072
+ .dgm-drawer .dgm-modal-footer {
2073
+ flex-shrink: 0;
2074
+ }
2075
+ .dgm-drawer[data-state='open'] {
2076
+ animation: dgm-drawer-in var(--dgm-panel-duration-in) var(--dgm-panel-easing-in);
2077
+ }
2078
+ .dgm-drawer[data-state='closed'] {
2079
+ animation: dgm-drawer-out var(--dgm-panel-duration-out) var(--dgm-panel-easing-out) forwards;
2080
+ }
2081
+ @keyframes dgm-drawer-in {
2082
+ from {
2083
+ transform: translate(var(--dgm-drawer-x), var(--dgm-drawer-y));
2084
+ }
2085
+ to {
2086
+ transform: translate(0, 0);
2087
+ }
2088
+ }
2089
+ @keyframes dgm-drawer-out {
2090
+ from {
2091
+ transform: translate(0, 0);
2092
+ }
2093
+ to {
2094
+ transform: translate(var(--dgm-drawer-x), var(--dgm-drawer-y));
2095
+ }
2096
+ }
2097
+ .dgm-combobox-panel {
2098
+ width: max(var(--radix-popover-trigger-width), 16rem);
2099
+ }
2100
+ .dgm-command {
2101
+ font-family: var(--dgm-font, inherit);
2102
+ color: var(--dgm-text);
2103
+ min-width: 0;
2104
+ }
2105
+ .dgm-command-input {
2106
+ display: block;
2107
+ width: 100%;
2108
+ box-sizing: border-box;
2109
+ border: 0;
2110
+ border-bottom: 1px solid var(--dgm-border);
2111
+ padding: 0.875rem;
2112
+ border-radius: 0;
2113
+ font: inherit;
2114
+ font-size: var(--dgm-text-control);
2115
+ font-weight: var(--dgm-font-weight-regular);
2116
+ line-height: var(--dgm-leading-normal);
2117
+ color: inherit;
2118
+ background: transparent;
2119
+ outline: none;
2120
+ }
2121
+ .dgm-command-input:focus-visible {
2122
+ box-shadow: inset 0 -2px var(--dgm-primary);
2123
+ }
2124
+ .dgm-command-list {
2125
+ overflow-y: auto;
2126
+ max-height: min(20rem, 50dvh);
2127
+ padding: var(--dgm-list-padding);
2128
+ }
2129
+ .dgm-command-item {
2130
+ font-size: var(--dgm-text-control);
2131
+ font-weight: var(--dgm-font-weight-regular);
2132
+ line-height: var(--dgm-leading-normal);
2133
+ display: flex;
2134
+ align-items: center;
2135
+ gap: 0.75rem;
2136
+ padding: 0.75rem var(--dgm-option-padding-inline);
2137
+ min-height: 2.75rem;
2138
+ box-sizing: border-box;
2139
+ border-radius: 0.4rem;
2140
+ cursor: pointer;
2141
+ user-select: none;
2142
+ overflow-wrap: anywhere;
2143
+ }
2144
+ /* Combobox conserva su selección inicial. En la paleta, hover y foco de teclado
2145
+ son estados distintos: la apertura por sí sola no resalta ninguna acción. */
2146
+ .dgm-command:not(.dgm-command--palette)
2147
+ .dgm-command-item[data-selected='true']:not([data-disabled='true']),
2148
+ .dgm-command--palette[data-input-mode='keyboard']
2149
+ .dgm-command-item[data-selected='true']:not([data-disabled='true']) {
2150
+ outline: 2px solid var(--dgm-primary);
2151
+ outline-offset: -2px;
2152
+ }
2153
+ .dgm-command-item[data-disabled='true'] {
2154
+ opacity: 0.45;
2155
+ cursor: not-allowed;
2156
+ }
2157
+ .dgm-command-check {
2158
+ margin-inline-start: auto;
2159
+ }
2160
+ .dgm-command-empty {
2161
+ padding: 1rem;
2162
+ color: var(--dgm-muted);
2163
+ }
2164
+ .dgm-command [cmdk-group-heading] {
2165
+ padding: 0.75rem var(--dgm-option-padding-inline);
2166
+ font-weight: var(--dgm-font-weight-semibold);
2167
+ color: var(--dgm-muted);
2168
+ font-size: var(--dgm-text-label);
2169
+ }
2170
+ .dgm-text-action {
2171
+ border: 0;
2172
+ padding: 0.375rem 0;
2173
+ min-height: 2.25rem;
2174
+ background: transparent;
2175
+ color: var(--dgm-primary);
2176
+ font: inherit;
2177
+ font-size: var(--dgm-text-action);
2178
+ font-weight: var(--dgm-font-weight-regular);
2179
+ line-height: var(--dgm-leading-normal);
2180
+ cursor: pointer;
2181
+ align-self: flex-start;
2182
+ }
2183
+ .dgm-text-action:disabled {
2184
+ opacity: 0.5;
2185
+ cursor: not-allowed;
2186
+ }
2187
+ .dgm-text-action:focus-visible {
2188
+ outline: 2px solid var(--dgm-primary);
2189
+ outline-offset: 2px;
2190
+ }
2191
+ .dgm-pagination,
2192
+ .dgm-pagination-part {
2193
+ display: flex;
2194
+ flex-wrap: nowrap;
2195
+ align-items: center;
2196
+ gap: 0.25rem;
2197
+ }
2198
+ .dgm-pagination {
2199
+ --dgm-page-size: 2.25rem;
2200
+ font-family: var(--dgm-font, inherit);
2201
+ width: fit-content;
2202
+ max-width: 100%;
2203
+ min-width: 0;
2204
+ box-sizing: border-box;
2205
+ /* Conserva una fila en espacios pequeños, sin desbordar la página.
2206
+ El margen interior deja espacio para el contorno de foco del teclado. */
2207
+ overflow-x: auto;
2208
+ padding: 0.25rem;
2209
+ }
2210
+ .dgm-pagination--md {
2211
+ --dgm-page-size: 2.75rem;
2212
+ }
2213
+ .dgm-pagination--lg {
2214
+ --dgm-page-size: 3.125rem;
2215
+ }
2216
+ .dgm-pagination > * {
2217
+ flex-shrink: 0;
2218
+ }
2219
+ .dgm-pagination .dgm-button {
2220
+ min-width: var(--dgm-page-size);
2221
+ padding-inline: 0.5rem;
2222
+ flex-shrink: 0;
2223
+ font-variant-numeric: tabular-nums;
2224
+ }
2225
+ .dgm-pagination--full {
2226
+ width: 100%;
2227
+ justify-content: center;
2228
+ /* Celdas estables, incluso al pasar de 9 a 10 o de 99 a 100. La medición
2229
+ utiliza este ancho real para reservar también el espacio de las elipsis. */
2230
+ --dgm-page-cell: max(var(--dgm-page-size), calc(var(--dgm-page-digits) * 1ch + 1rem));
2231
+ }
2232
+ .dgm-pagination--full .dgm-pagination-part .dgm-button,
2233
+ .dgm-pagination--full .dgm-pagination-gap {
2234
+ width: var(--dgm-page-cell);
2235
+ box-sizing: border-box;
2236
+ text-align: center;
2237
+ }
2238
+ .dgm-pagination-gap {
2239
+ padding: 0.5rem 0.25rem;
2240
+ color: var(--dgm-muted);
2241
+ }
2242
+ .dgm-breadcrumbs {
2243
+ color: var(--dgm-text);
2244
+ font-family: var(--dgm-font, inherit);
2245
+ }
2246
+ .dgm-breadcrumbs ol {
2247
+ list-style: none;
2248
+ padding: 0;
2249
+ margin: 0;
2250
+ display: flex;
2251
+ flex-wrap: wrap;
2252
+ gap: 0.5rem;
2253
+ }
2254
+ .dgm-breadcrumbs li {
2255
+ display: flex;
2256
+ align-items: baseline;
2257
+ gap: 0.5rem;
2258
+ min-width: 0;
2259
+ overflow-wrap: anywhere;
2260
+ }
2261
+ .dgm-breadcrumbs a {
2262
+ color: var(--dgm-muted);
2263
+ text-decoration: none;
2264
+ }
2265
+ .dgm-breadcrumbs a:hover {
2266
+ color: var(--dgm-primary);
2267
+ text-decoration: underline;
2268
+ }
2269
+ .dgm-breadcrumbs a:focus-visible {
2270
+ outline: 2px solid var(--dgm-primary);
2271
+ outline-offset: 3px;
2272
+ }
2273
+ .dgm-breadcrumbs [aria-current] {
2274
+ font-weight: var(--dgm-font-weight-semibold);
2275
+ }
2276
+ .dgm-breadcrumb-separator {
2277
+ color: var(--dgm-muted);
2278
+ }
2279
+ .dgm-avatar {
2280
+ position: relative;
2281
+ display: inline-flex;
2282
+ align-items: center;
2283
+ justify-content: center;
2284
+ flex-shrink: 0;
2285
+ vertical-align: middle;
2286
+ background: var(--dgm-subtle);
2287
+ color: var(--dgm-text);
2288
+ font-family: var(--dgm-font, inherit);
2289
+ font-weight: var(--dgm-font-weight-semibold);
2290
+ border: 1px solid var(--dgm-border);
2291
+ box-sizing: border-box;
2292
+ }
2293
+ .dgm-avatar--sm {
2294
+ --dgm-avatar-status-size: 0.625rem;
2295
+ width: 2rem;
2296
+ height: 2rem;
2297
+ font-size: var(--dgm-font-size-xs);
2298
+ }
2299
+ .dgm-avatar--md {
2300
+ --dgm-avatar-status-size: 0.75rem;
2301
+ width: 2.75rem;
2302
+ height: 2.75rem;
2303
+ font-size: var(--dgm-font-size-base);
2304
+ }
2305
+ .dgm-avatar--lg {
2306
+ --dgm-avatar-status-size: 1rem;
2307
+ width: 4rem;
2308
+ height: 4rem;
2309
+ font-size: var(--dgm-font-size-2xl);
2310
+ }
2311
+ .dgm-avatar--circle {
2312
+ border-radius: 50%;
2313
+ }
2314
+ .dgm-avatar--square {
2315
+ border-radius: var(--dgm-radius);
2316
+ }
2317
+ .dgm-avatar-content {
2318
+ display: grid;
2319
+ place-items: center;
2320
+ width: 100%;
2321
+ height: 100%;
2322
+ overflow: hidden;
2323
+ border-radius: inherit;
2324
+ }
2325
+ .dgm-avatar-image {
2326
+ display: block;
2327
+ width: 100%;
2328
+ height: 100%;
2329
+ object-fit: cover;
2330
+ }
2331
+ .dgm-avatar-fallback {
2332
+ display: grid;
2333
+ place-items: center;
2334
+ width: 100%;
2335
+ height: 100%;
2336
+ }
2337
+ /* La presencia conserva su significado aunque cambie el color principal del tema.
2338
+ * El anillo separa el punto de la foto y usa la superficie del contenedor. */
2339
+ .dgm-avatar-status {
2340
+ position: absolute;
2341
+ inset-inline-end: 0;
2342
+ bottom: 0;
2343
+ width: var(--dgm-avatar-status-size);
2344
+ height: var(--dgm-avatar-status-size);
2345
+ box-sizing: border-box;
2346
+ border: 2px solid var(--dgm-surface);
2347
+ border-radius: 50%;
2348
+ }
2349
+ .dgm-avatar-status[data-status='online'] {
2350
+ background: var(--dgm-avatar-online, #15803d);
2351
+ }
2352
+ .dgm-avatar-status[data-status='busy'] {
2353
+ background: var(--dgm-avatar-busy, #dc2626);
2354
+ }
2355
+ .dgm-avatar-status[data-status='away'] {
2356
+ background: var(--dgm-avatar-away, #d97706);
2357
+ }
2358
+ .dgm-avatar-status[data-status='offline'] {
2359
+ background: var(--dgm-avatar-offline, #64748b);
2360
+ }
2361
+ .dgm-progress {
2362
+ display: grid;
2363
+ gap: 0.5rem;
2364
+ width: 100%;
2365
+ color: var(--dgm-text);
2366
+ font-family: var(--dgm-font, inherit);
2367
+ }
2368
+ .dgm-progress-label {
2369
+ display: flex;
2370
+ justify-content: space-between;
2371
+ gap: 1rem;
2372
+ font-size: var(--dgm-text-label);
2373
+ font-weight: var(--dgm-font-weight-semibold);
2374
+ }
2375
+ .dgm-progress progress {
2376
+ appearance: none;
2377
+ display: block;
2378
+ border: 0;
2379
+ width: 100%;
2380
+ height: 0.625rem;
2381
+ border-radius: 999px;
2382
+ overflow: hidden;
2383
+ background: var(--dgm-subtle);
2384
+ color: var(--dgm-primary);
2385
+ }
2386
+ .dgm-progress--sm progress {
2387
+ height: 0.25rem;
2388
+ }
2389
+ .dgm-progress--lg progress {
2390
+ height: 1rem;
2391
+ }
2392
+ .dgm-progress progress::-webkit-progress-bar {
2393
+ background: var(--dgm-subtle);
2394
+ border-radius: 999px;
2395
+ }
2396
+ .dgm-progress progress::-webkit-progress-value {
2397
+ background: var(--dgm-primary);
2398
+ border-radius: 999px;
2399
+ transition: width 0.2s ease;
2400
+ }
2401
+ .dgm-progress progress::-moz-progress-bar {
2402
+ background: var(--dgm-primary);
2403
+ border-radius: 999px;
2404
+ }
2405
+ .dgm-progress progress:indeterminate {
2406
+ animation: dgm-skeleton-pulse 1.4s ease infinite;
2407
+ background: var(--dgm-primary);
2408
+ }
2409
+ .dgm-progress progress:indeterminate::-webkit-progress-bar {
2410
+ background: linear-gradient(90deg, var(--dgm-subtle), var(--dgm-primary), var(--dgm-subtle));
2411
+ }
2412
+ .dgm-choice-group {
2413
+ border: 0;
2414
+ padding: 0;
2415
+ margin: 0;
2416
+ min-width: 0;
2417
+ color: var(--dgm-text);
2418
+ font-family: var(--dgm-font, inherit);
2419
+ }
2420
+ .dgm-choice-group legend {
2421
+ padding: 0;
2422
+ margin-bottom: 0.75rem;
2423
+ }
2424
+ .dgm-choice-group-options {
2425
+ display: flex;
2426
+ flex-direction: column;
2427
+ gap: 1rem;
2428
+ }
2429
+ .dgm-choice-group-options[data-orientation='horizontal'] {
2430
+ flex-direction: row;
2431
+ flex-wrap: wrap;
2432
+ gap: 1rem 1.5rem;
2433
+ }
2434
+ .dgm-choice-group > p {
2435
+ margin: 0 0 0.75rem;
2436
+ }
2437
+ .dgm-choice-group > .dgm-error {
2438
+ margin: 0.75rem 0 0;
2439
+ }
2440
+ /* SwitchGroup se presenta como un panel de ajustes. El fieldset y su legend
2441
+ conservan la semántica del grupo; el borde pertenece únicamente a las opciones.
2442
+ No usamos overflow:hidden para que el foco de los controles no quede recortado. */
2443
+ .dgm-choice-group--switch .dgm-choice-group-options {
2444
+ gap: 0;
2445
+ border: 1px solid var(--dgm-border);
2446
+ border-radius: var(--dgm-radius);
2447
+ background: var(--dgm-surface);
2448
+ }
2449
+ .dgm-choice-group--switch .dgm-choice {
2450
+ box-sizing: border-box;
2451
+ min-width: 0;
2452
+ padding: 1rem;
2453
+ flex-direction: row-reverse;
2454
+ align-items: center;
2455
+ gap: 1rem;
2456
+ }
2457
+ .dgm-choice-group--switch .dgm-choice-text {
2458
+ flex: 1;
2459
+ overflow-wrap: anywhere;
2460
+ }
2461
+ .dgm-choice-group--switch .dgm-switch {
2462
+ margin: 0;
2463
+ }
2464
+ .dgm-choice-group--switch .dgm-choice:has(.dgm-switch:disabled) .dgm-choice-text {
2465
+ opacity: 0.6;
2466
+ }
2467
+ .dgm-choice-group--switch
2468
+ .dgm-choice-group-options[data-orientation='vertical']
2469
+ > .dgm-choice
2470
+ + .dgm-choice {
2471
+ border-block-start: 1px solid var(--dgm-border);
2472
+ }
2473
+ /* La orientación horizontal conserva el wrap: cada opción tiene su propia tarjeta,
2474
+ de modo que al pasar a varias filas no quedan separadores en posiciones arbitrarias. */
2475
+ .dgm-choice-group--switch .dgm-choice-group-options[data-orientation='horizontal'] {
2476
+ gap: 1rem;
2477
+ border: 0;
2478
+ background: transparent;
2479
+ }
2480
+ .dgm-choice-group--switch .dgm-choice-group-options[data-orientation='horizontal'] > .dgm-choice {
2481
+ flex: 1 1 14rem;
2482
+ border: 1px solid var(--dgm-border);
2483
+ border-radius: var(--dgm-radius);
2484
+ background: var(--dgm-surface);
2485
+ }
2486
+ .dgm-calendar-panel {
2487
+ width: 21rem;
2488
+ padding: 0.75rem;
2489
+ }
2490
+ .dgm-calendar {
2491
+ position: relative;
2492
+ width: 100%;
2493
+ }
2494
+ .dgm-calendar .rdp-months,
2495
+ .dgm-calendar .rdp-month {
2496
+ width: 100%;
2497
+ }
2498
+ .dgm-calendar .rdp-nav {
2499
+ position: absolute;
2500
+ top: 0;
2501
+ inset-inline-end: 0;
2502
+ display: flex;
2503
+ }
2504
+ .dgm-calendar .rdp-month_caption {
2505
+ min-height: 2.75rem;
2506
+ padding-inline-end: 5.5rem;
2507
+ display: flex;
2508
+ align-items: center;
2509
+ font-weight: var(--dgm-font-weight-semibold);
2510
+ font-size: var(--dgm-text-label);
2511
+ }
2512
+ .dgm-calendar .rdp-button_previous,
2513
+ .dgm-calendar .rdp-button_next {
2514
+ display: grid;
2515
+ place-items: center;
2516
+ width: 2.5rem;
2517
+ height: 2.5rem;
2518
+ border: 0;
2519
+ border-radius: 0.375rem;
2520
+ color: var(--dgm-text);
2521
+ background: transparent;
2522
+ cursor: pointer;
2523
+ }
2524
+ .dgm-calendar .rdp-chevron {
2525
+ fill: currentColor;
2526
+ width: 1rem;
2527
+ height: 1rem;
2528
+ }
2529
+ .dgm-calendar .rdp-month_grid {
2530
+ table-layout: fixed;
2531
+ width: 100%;
2532
+ border-collapse: collapse;
2533
+ }
2534
+ .dgm-calendar .rdp-weekday {
2535
+ /* Alineación explícita: no depende de los estilos de tablas de la aplicación consumidora. */
2536
+ text-align: center;
2537
+ vertical-align: middle;
2538
+ padding: 0.75rem 0;
2539
+ font-size: var(--dgm-text-caption);
2540
+ font-weight: var(--dgm-font-weight-medium);
2541
+ color: var(--dgm-muted);
2542
+ }
2543
+ .dgm-calendar .rdp-day {
2544
+ padding: 0.125rem;
2545
+ text-align: center;
2546
+ }
2547
+ .dgm-calendar .rdp-day_button {
2548
+ display: grid;
2549
+ place-items: center;
2550
+ width: 100%;
2551
+ height: 2.5rem;
2552
+ padding: 0;
2553
+ border: 0;
2554
+ border-radius: 0.375rem;
2555
+ font: inherit;
2556
+ font-size: var(--dgm-text-control);
2557
+ font-weight: var(--dgm-font-weight-regular);
2558
+ line-height: var(--dgm-leading-normal);
2559
+ color: inherit;
2560
+ background: transparent;
2561
+ cursor: pointer;
2562
+ }
2563
+ .dgm-calendar button:focus-visible {
2564
+ outline: 2px solid var(--dgm-primary);
2565
+ outline-offset: -2px;
2566
+ }
2567
+ .dgm-calendar .rdp-selected .rdp-day_button {
2568
+ background: var(--dgm-primary);
2569
+ color: var(--dgm-on-primary);
2570
+ }
2571
+ .dgm-calendar .rdp-range_middle {
2572
+ background: var(--dgm-subtle);
2573
+ }
2574
+ .dgm-calendar .rdp-range_middle .rdp-day_button {
2575
+ background: transparent;
2576
+ color: var(--dgm-text);
2577
+ }
2578
+ .dgm-calendar .rdp-today:not(.rdp-selected) .rdp-day_button {
2579
+ box-shadow: inset 0 0 0 1px var(--dgm-primary);
2580
+ }
2581
+ .dgm-calendar .rdp-disabled,
2582
+ .dgm-calendar button:disabled {
2583
+ opacity: 0.4;
2584
+ cursor: not-allowed;
2585
+ }
2586
+ .dgm-calendar .rdp-outside {
2587
+ color: var(--dgm-muted);
2588
+ }
2589
+ .dgm-calendar .rdp-hidden {
2590
+ visibility: hidden;
2591
+ }
2592
+ .dgm-data-table {
2593
+ display: grid;
2594
+ gap: 1rem;
2595
+ min-width: 0;
2596
+ width: 100%;
2597
+ font-family: var(--dgm-font, inherit);
2598
+ color: var(--dgm-text);
2599
+ }
2600
+ .dgm-table-scroll {
2601
+ overflow-x: auto;
2602
+ border: 1px solid var(--dgm-border);
2603
+ border-radius: var(--dgm-radius);
2604
+ background: var(--dgm-surface);
2605
+ }
2606
+ .dgm-table-scroll:focus-visible {
2607
+ outline: 2px solid var(--dgm-primary);
2608
+ outline-offset: 2px;
2609
+ }
2610
+ .dgm-data-table table {
2611
+ table-layout: fixed;
2612
+ width: 100%;
2613
+ border-collapse: collapse;
2614
+ text-align: start;
2615
+ }
2616
+ .dgm-data-table caption {
2617
+ text-align: start;
2618
+ padding: 1rem;
2619
+ font-weight: var(--dgm-font-weight-semibold);
2620
+ }
2621
+ .dgm-data-table th,
2622
+ .dgm-data-table td {
2623
+ padding: 0.75rem 1rem;
2624
+ border-top: 1px solid var(--dgm-border);
2625
+ overflow-wrap: anywhere;
2626
+ }
2627
+ .dgm-data-table th {
2628
+ font-weight: var(--dgm-font-weight-semibold);
2629
+ background: var(--dgm-subtle);
2630
+ }
2631
+ .dgm-data-table th .dgm-button {
2632
+ padding-inline: 0;
2633
+ }
2634
+ .dgm-data-table tr[data-selected] {
2635
+ background: var(--dgm-subtle);
2636
+ }
2637
+ .dgm-data-table .dgm-choice {
2638
+ gap: 0;
2639
+ }
2640
+ .dgm-data-table .dgm-choice-text {
2641
+ width: 0;
2642
+ }
2643
+ .dgm-table-footer {
2644
+ display: flex;
2645
+ align-items: center;
2646
+ justify-content: space-between;
2647
+ gap: 1rem;
2648
+ flex-wrap: wrap;
2649
+ }
2650
+ .dgm-table-footer p {
2651
+ margin: 0;
2652
+ color: var(--dgm-muted);
2653
+ font-size: var(--dgm-text-help);
2654
+ }
2655
+ .dgm-table-empty {
2656
+ text-align: center;
2657
+ padding: 2rem !important;
2658
+ color: var(--dgm-muted);
2659
+ }
2660
+ .dgm-file-upload {
2661
+ display: grid;
2662
+ gap: 0.75rem;
2663
+ color: var(--dgm-text);
2664
+ font-family: var(--dgm-font, inherit);
2665
+ min-width: 0;
2666
+ }
2667
+ .dgm-file-dropzone {
2668
+ padding: 1.5rem;
2669
+ text-align: center;
2670
+ border: 1px dashed var(--dgm-control-border);
2671
+ border-radius: var(--dgm-radius);
2672
+ background: var(--dgm-surface);
2673
+ transition:
2674
+ background-color 0.18s ease,
2675
+ border-color 0.18s ease;
2676
+ }
2677
+ .dgm-file-dropzone p {
2678
+ margin: 0 0 1rem;
2679
+ }
2680
+ .dgm-file-dropzone[data-dragging] {
2681
+ background: var(--dgm-subtle);
2682
+ border-color: var(--dgm-primary);
2683
+ }
2684
+ .dgm-file-dropzone[data-disabled] {
2685
+ opacity: 0.5;
2686
+ }
2687
+ .dgm-file-list {
2688
+ display: grid;
2689
+ gap: 0.5rem;
2690
+ list-style: none;
2691
+ margin: 0;
2692
+ padding: 0;
2693
+ }
2694
+ .dgm-file-list li {
2695
+ display: flex;
2696
+ gap: 0.75rem;
2697
+ align-items: center;
2698
+ padding: 0.5rem;
2699
+ border: 1px solid var(--dgm-border);
2700
+ border-radius: var(--dgm-radius);
2701
+ }
2702
+ .dgm-file-preview {
2703
+ object-fit: cover;
2704
+ width: 3rem;
2705
+ height: 3rem;
2706
+ border-radius: 0.375rem;
2707
+ }
2708
+ .dgm-file-name {
2709
+ min-width: 0;
2710
+ flex: 1;
2711
+ overflow-wrap: anywhere;
2712
+ font-size: var(--dgm-text-help);
2713
+ }
2714
+ .dgm-file-name small {
2715
+ display: block;
2716
+ font-size: var(--dgm-text-caption);
2717
+ line-height: var(--dgm-leading-normal);
2718
+ color: var(--dgm-muted);
2719
+ margin-top: 0.25rem;
2720
+ }
2721
+ .dgm-file-upload > p {
2722
+ margin: 0;
2723
+ }
2724
+ .dgm-stepper {
2725
+ color: var(--dgm-text);
2726
+ font-family: var(--dgm-font, inherit);
2727
+ }
2728
+ .dgm-stepper ol {
2729
+ display: flex;
2730
+ gap: 1rem;
2731
+ list-style: none;
2732
+ margin: 0;
2733
+ padding: 0;
2734
+ }
2735
+ .dgm-stepper li {
2736
+ flex: 1;
2737
+ min-width: 0;
2738
+ }
2739
+ .dgm-step {
2740
+ display: flex;
2741
+ gap: 0.75rem;
2742
+ align-items: flex-start;
2743
+ width: 100%;
2744
+ box-sizing: border-box;
2745
+ padding: 0.5rem;
2746
+ border: 0;
2747
+ border-radius: var(--dgm-radius);
2748
+ background: transparent;
2749
+ color: inherit;
2750
+ font: inherit;
2751
+ text-align: start;
2752
+ }
2753
+ button.dgm-step {
2754
+ cursor: pointer;
2755
+ }
2756
+ button.dgm-step:disabled {
2757
+ cursor: not-allowed;
2758
+ opacity: 0.5;
2759
+ }
2760
+ .dgm-step:focus-visible {
2761
+ outline: 2px solid var(--dgm-primary);
2762
+ outline-offset: 2px;
2763
+ }
2764
+ .dgm-step-number {
2765
+ display: grid;
2766
+ place-items: center;
2767
+ flex-shrink: 0;
2768
+ width: 2rem;
2769
+ height: 2rem;
2770
+ border: 1px solid var(--dgm-border);
2771
+ border-radius: 50%;
2772
+ color: var(--dgm-muted);
2773
+ }
2774
+ .dgm-step-copy {
2775
+ display: grid;
2776
+ gap: 0.375rem;
2777
+ min-width: 0;
2778
+ overflow-wrap: anywhere;
2779
+ padding-top: 0.25rem;
2780
+ }
2781
+ .dgm-stepper [data-current] .dgm-step-number,
2782
+ .dgm-stepper [data-complete] .dgm-step-number {
2783
+ background: var(--dgm-primary);
2784
+ color: var(--dgm-on-primary);
2785
+ border-color: var(--dgm-primary);
2786
+ }
2787
+ .dgm-step-copy > span:first-child {
2788
+ /* El indicador comunica el paso actual; la tipografía conserva sus métricas. */
2789
+ font-size: var(--dgm-text-label);
2790
+ font-weight: var(--dgm-font-weight-semibold);
2791
+ }
2792
+ .dgm-stepper[data-orientation='vertical'] ol {
2793
+ flex-direction: column;
2794
+ }
2795
+ @media (max-width: 600px) {
2796
+ .dgm-stepper ol {
2797
+ flex-direction: column;
2798
+ }
2799
+ }
2800
+ @media (prefers-reduced-motion: reduce) {
2801
+ .dgm-popover[data-state],
2802
+ .dgm-combobox-panel[data-state],
2803
+ .dgm-calendar-panel[data-state],
2804
+ .dgm-drawer[data-state],
2805
+ .dgm-progress progress:indeterminate {
2806
+ animation: none;
2807
+ }
2808
+ .dgm-file-dropzone,
2809
+ .dgm-progress progress::-webkit-progress-value {
2810
+ transition: none;
2811
+ }
2812
+ }
2813
+ @media (forced-colors: active) {
2814
+ .dgm-calendar .rdp-selected .rdp-day_button,
2815
+ .dgm-stepper [data-current] .dgm-step-number {
2816
+ outline: 2px solid Highlight;
2817
+ }
2818
+ .dgm-progress progress {
2819
+ appearance: auto;
2820
+ }
2821
+ }
2822
+
2823
+ /* Nuevos controles y estructuras. Tokens compartidos: cada componente funciona con el tema del consumidor. */
2824
+ .dgm-slider-heading {
2825
+ display: flex;
2826
+ justify-content: space-between;
2827
+ gap: 1rem;
2828
+ flex-wrap: wrap;
2829
+ }
2830
+ .dgm-slider {
2831
+ position: relative;
2832
+ display: flex;
2833
+ align-items: center;
2834
+ height: 2.75rem;
2835
+ touch-action: none;
2836
+ user-select: none;
2837
+ }
2838
+ .dgm-slider-track {
2839
+ position: relative;
2840
+ flex: 1;
2841
+ height: 0.375rem;
2842
+ background: var(--dgm-border);
2843
+ border-radius: 1rem;
2844
+ }
2845
+ .dgm-slider-range {
2846
+ position: absolute;
2847
+ height: 100%;
2848
+ background: var(--dgm-primary);
2849
+ border-radius: inherit;
2850
+ }
2851
+ .dgm-slider-thumb {
2852
+ display: block;
2853
+ width: 1.25rem;
2854
+ height: 1.25rem;
2855
+ box-sizing: border-box;
2856
+ background: var(--dgm-surface);
2857
+ border: 2px solid var(--dgm-primary);
2858
+ border-radius: 50%;
2859
+ box-shadow: 0 2px 5px #0002;
2860
+ cursor: grab;
2861
+ }
2862
+ .dgm-slider-thumb::after {
2863
+ content: '';
2864
+ position: absolute;
2865
+ inset: -0.7rem;
2866
+ }
2867
+ .dgm-slider[data-disabled] {
2868
+ opacity: 0.5;
2869
+ }
2870
+ .dgm-slider[data-disabled] .dgm-slider-thumb {
2871
+ cursor: not-allowed;
2872
+ }
2873
+ .dgm-slider-marks {
2874
+ position: relative;
2875
+ height: 1.5rem;
2876
+ color: var(--dgm-muted);
2877
+ font-size: var(--dgm-text-caption);
2878
+ margin-inline: 0.625rem;
2879
+ }
2880
+ .dgm-slider-marks > span {
2881
+ position: absolute;
2882
+ transform: translateX(-50%);
2883
+ }
2884
+ .dgm-slider-marks > span:first-child {
2885
+ transform: none;
2886
+ }
2887
+ .dgm-slider-marks > span:last-child {
2888
+ transform: translateX(-100%);
2889
+ }
2890
+ .dgm-number-field {
2891
+ display: grid;
2892
+ gap: 0.5rem;
2893
+ min-width: 0;
2894
+ }
2895
+ .dgm-number-actions {
2896
+ display: flex;
2897
+ gap: 0.5rem;
2898
+ justify-content: flex-end;
2899
+ }
2900
+ .dgm-number-field input {
2901
+ appearance: textfield;
2902
+ }
2903
+ .dgm-number-field input::-webkit-inner-spin-button {
2904
+ appearance: none;
2905
+ }
2906
+ .dgm-empty-state {
2907
+ display: grid;
2908
+ justify-items: center;
2909
+ gap: 1rem;
2910
+ padding: clamp(1.5rem, 5vw, 3rem);
2911
+ border: 1px dashed var(--dgm-border);
2912
+ border-radius: var(--dgm-radius);
2913
+ background: var(--dgm-surface);
2914
+ color: var(--dgm-text);
2915
+ text-align: center;
2916
+ overflow-wrap: anywhere;
2917
+ }
2918
+ .dgm-empty-state h2,
2919
+ .dgm-empty-state h3,
2920
+ .dgm-empty-state h4,
2921
+ .dgm-empty-state p {
2922
+ margin: 0;
2923
+ }
2924
+ .dgm-empty-state > :is(h2, h3, h4) {
2925
+ /* El nivel HTML cambia la jerarquía accesible, no el rol visual del título. */
2926
+ font-size: var(--dgm-text-title);
2927
+ font-weight: var(--dgm-font-weight-semibold);
2928
+ line-height: var(--dgm-leading-tight);
2929
+ letter-spacing: var(--dgm-tracking-heading);
2930
+ }
2931
+ .dgm-empty-icon {
2932
+ display: grid;
2933
+ place-items: center;
2934
+ width: 3rem;
2935
+ height: 3rem;
2936
+ background: var(--dgm-subtle);
2937
+ border-radius: var(--dgm-radius);
2938
+ font-size: var(--dgm-font-size-2xl);
2939
+ }
2940
+ .dgm-empty-action {
2941
+ display: flex;
2942
+ justify-content: center;
2943
+ flex-wrap: wrap;
2944
+ gap: 0.75rem;
2945
+ }
2946
+ .dgm-aspect-ratio {
2947
+ position: relative;
2948
+ width: 100%;
2949
+ min-width: 0;
2950
+ }
2951
+ .dgm-aspect-content {
2952
+ position: absolute;
2953
+ inset: 0;
2954
+ }
2955
+ .dgm-aspect-content > img,
2956
+ .dgm-aspect-content > video,
2957
+ .dgm-aspect-content > iframe {
2958
+ display: block;
2959
+ width: 100%;
2960
+ height: 100%;
2961
+ object-fit: cover;
2962
+ border: 0;
2963
+ }
2964
+ .dgm-toggle-group {
2965
+ display: inline-flex;
2966
+ flex-wrap: wrap;
2967
+ gap: 0.25rem;
2968
+ padding: 0.25rem;
2969
+ border: 1px solid var(--dgm-border);
2970
+ border-radius: var(--dgm-radius);
2971
+ background: var(--dgm-surface);
2972
+ }
2973
+ .dgm-toggle-group[data-orientation='vertical'] {
2974
+ flex-direction: column;
2975
+ }
2976
+ .dgm-toggle-item {
2977
+ display: inline-flex;
2978
+ align-items: center;
2979
+ justify-content: center;
2980
+ gap: 0.5rem;
2981
+ min-height: 2.75rem;
2982
+ padding: 0.5rem 1rem;
2983
+ border: 0;
2984
+ border-radius: calc(var(--dgm-radius) - 0.2rem);
2985
+ background: transparent;
2986
+ color: var(--dgm-muted);
2987
+ font: inherit;
2988
+ font-size: var(--dgm-text-control);
2989
+ font-weight: var(--dgm-font-weight-regular);
2990
+ line-height: var(--dgm-leading-normal);
2991
+ cursor: pointer;
2992
+ transition: var(--dgm-hover-transition);
2993
+ }
2994
+ .dgm-toggle-item--sm {
2995
+ font-size: var(--dgm-font-size-sm);
2996
+ padding-inline: 0.75rem;
2997
+ }
2998
+ .dgm-toggle-item--lg {
2999
+ min-height: 3rem;
3000
+ padding-inline: 1.25rem;
3001
+ }
3002
+ .dgm-toggle-item--icon {
3003
+ min-width: 2.75rem;
3004
+ padding-inline: 0.5rem;
3005
+ }
3006
+ .dgm-toggle-item[data-state='on'] {
3007
+ color: var(--dgm-on-primary);
3008
+ background: var(--dgm-primary);
3009
+ }
3010
+ .dgm-toggle-item:disabled {
3011
+ opacity: 0.5;
3012
+ cursor: not-allowed;
3013
+ }
3014
+ .dgm-navigation {
3015
+ position: relative;
3016
+ z-index: 2;
3017
+ width: 100%;
3018
+ }
3019
+ .dgm-navigation-list {
3020
+ display: flex;
3021
+ flex-wrap: wrap;
3022
+ list-style: none;
3023
+ margin: 0;
3024
+ padding: 0;
3025
+ gap: 0.5rem;
3026
+ }
3027
+ .dgm-navigation-trigger,
3028
+ .dgm-navigation-link {
3029
+ display: flex;
3030
+ align-items: center;
3031
+ gap: 0.5rem;
3032
+ min-height: 2.75rem;
3033
+ padding: 0.5rem 0.85rem;
3034
+ box-sizing: border-box;
3035
+ color: var(--dgm-text);
3036
+ background: var(--dgm-surface);
3037
+ border: 1px solid var(--dgm-border);
3038
+ border-radius: var(--dgm-radius);
3039
+ text-decoration: none;
3040
+ font: inherit;
3041
+ font-size: var(--dgm-text-control);
3042
+ font-weight: var(--dgm-font-weight-regular);
3043
+ line-height: var(--dgm-leading-normal);
3044
+ cursor: pointer;
3045
+ }
3046
+ .dgm-navigation-trigger svg {
3047
+ width: 1rem;
3048
+ height: 1rem;
3049
+ }
3050
+ .dgm-navigation-link[data-active],
3051
+ .dgm-navigation-trigger[data-state='open'] {
3052
+ background: var(--dgm-subtle);
3053
+ }
3054
+ .dgm-navigation-content {
3055
+ /* Misma separación inicial que Popover y los selectores que lo componen. */
3056
+ --dgm-navigation-gap: 8px;
3057
+ position: absolute;
3058
+ top: calc(100% + var(--dgm-navigation-gap));
3059
+ inset-inline-start: 0;
3060
+ box-sizing: border-box;
3061
+ width: min(100%, 28rem);
3062
+ padding: var(--dgm-list-padding);
3063
+ border: 1px solid var(--dgm-border);
3064
+ border-radius: var(--dgm-radius);
3065
+ background: var(--dgm-surface);
3066
+ box-shadow: 0 12px 32px #0002;
3067
+ z-index: 10;
3068
+ }
3069
+ /* El puente transparente mantiene el área de hover al cruzar la separación.
3070
+ Incluye el píxel del borde para que no quede una franja sin interacción. */
3071
+ .dgm-navigation-content::before {
3072
+ content: '';
3073
+ position: absolute;
3074
+ inset-inline: -1px;
3075
+ top: calc(-1 * (var(--dgm-navigation-gap) + 1px));
3076
+ height: calc(var(--dgm-navigation-gap) + 1px);
3077
+ }
3078
+ .dgm-navigation-content ul {
3079
+ list-style: none;
3080
+ margin: 0;
3081
+ padding: 0;
3082
+ display: grid;
3083
+ gap: 0.35rem;
3084
+ }
3085
+ .dgm-navigation-content .dgm-navigation-link {
3086
+ border-color: transparent;
3087
+ padding-inline: var(--dgm-option-padding-inline);
3088
+ }
3089
+ .dgm-navigation-link small {
3090
+ display: block;
3091
+ color: var(--dgm-muted);
3092
+ font-size: var(--dgm-text-help);
3093
+ margin-top: 0.25rem;
3094
+ }
3095
+ .dgm-multi-trigger {
3096
+ display: flex;
3097
+ align-items: center;
3098
+ gap: 0.5rem;
3099
+ width: 100%;
3100
+ min-height: var(--dgm-control-min-height);
3101
+ justify-content: space-between;
3102
+ text-align: start;
3103
+ /* Seleccionar valores es un campo: mantiene la tipografía de los otros disparadores. */
3104
+ font-size: var(--dgm-text-control);
3105
+ font-weight: var(--dgm-font-weight-regular);
3106
+ line-height: var(--dgm-leading-normal);
3107
+ letter-spacing: var(--dgm-tracking-normal);
3108
+ cursor: pointer;
3109
+ }
3110
+ .dgm-multi-trigger svg {
3111
+ flex-shrink: 0;
3112
+ width: 1rem;
3113
+ height: 1rem;
3114
+ }
3115
+ .dgm-multi-panel {
3116
+ width: 24rem;
3117
+ }
3118
+ .dgm-multi-scroll-region {
3119
+ /* Separa las opciones del campo y deja respirar su anillo de foco. */
3120
+ margin-block-start: 0.75rem;
3121
+ }
3122
+ .dgm-multi-options {
3123
+ display: grid;
3124
+ gap: 0.5rem;
3125
+ max-height: 16rem;
3126
+ overflow-y: auto;
3127
+ padding: var(--dgm-list-padding);
3128
+ }
3129
+ .dgm-multi-options .dgm-label {
3130
+ /* Son valores de una lista, no la etiqueta que nombra al campo completo. */
3131
+ font-size: var(--dgm-text-control);
3132
+ font-weight: var(--dgm-font-weight-regular);
3133
+ line-height: var(--dgm-leading-normal);
3134
+ }
3135
+ .dgm-option-label {
3136
+ display: inline-flex;
3137
+ gap: 0.5rem;
3138
+ align-items: center;
3139
+ }
3140
+ .dgm-multi-tags {
3141
+ display: flex;
3142
+ flex-wrap: wrap;
3143
+ list-style: none;
3144
+ margin: 0;
3145
+ padding: 0;
3146
+ gap: 0.5rem;
3147
+ }
3148
+ .dgm-multi-tags li {
3149
+ display: inline-flex;
3150
+ align-items: center;
3151
+ gap: 0.25rem;
3152
+ padding-inline-start: 0.75rem;
3153
+ background: var(--dgm-subtle);
3154
+ color: var(--dgm-text);
3155
+ border: 1px solid var(--dgm-border);
3156
+ border-radius: var(--dgm-radius);
3157
+ overflow-wrap: anywhere;
3158
+ }
3159
+ .dgm-multi-tags button {
3160
+ display: grid;
3161
+ place-items: center;
3162
+ flex-shrink: 0;
3163
+ width: 2.75rem;
3164
+ height: 2.75rem;
3165
+ border: 0;
3166
+ border-radius: var(--dgm-radius);
3167
+ color: inherit;
3168
+ background: transparent;
3169
+ cursor: pointer;
3170
+ }
3171
+ .dgm-multi-tags button svg {
3172
+ width: 1rem;
3173
+ height: 1rem;
3174
+ }
3175
+ .dgm-multi-tags button:disabled {
3176
+ opacity: 0.5;
3177
+ cursor: not-allowed;
3178
+ }
3179
+ .dgm-resizable {
3180
+ display: grid;
3181
+ min-width: 0;
3182
+ min-height: 12rem;
3183
+ height: 22rem;
3184
+ border: 1px solid var(--dgm-border);
3185
+ border-radius: var(--dgm-radius);
3186
+ background: var(--dgm-surface);
3187
+ overflow: hidden;
3188
+ }
3189
+ .dgm-resizable-panel {
3190
+ min-width: 0;
3191
+ min-height: 0;
3192
+ overflow: auto;
3193
+ padding: 1rem;
3194
+ overflow-wrap: anywhere;
3195
+ }
3196
+ .dgm-resize-handle {
3197
+ display: grid;
3198
+ place-items: center;
3199
+ touch-action: none;
3200
+ user-select: none;
3201
+ cursor: col-resize;
3202
+ background: var(--dgm-subtle);
3203
+ }
3204
+ .dgm-resize-handle > span {
3205
+ display: block;
3206
+ height: 2rem;
3207
+ width: 0.25rem;
3208
+ border-radius: 1rem;
3209
+ background: var(--dgm-control-border);
3210
+ }
3211
+ .dgm-resizable[data-orientation='vertical'] .dgm-resize-handle {
3212
+ cursor: row-resize;
3213
+ }
3214
+ .dgm-resizable[data-orientation='vertical'] .dgm-resize-handle > span {
3215
+ width: 2rem;
3216
+ height: 0.25rem;
3217
+ }
3218
+ .dgm-resize-handle[aria-disabled] {
3219
+ cursor: default;
3220
+ opacity: 0.5;
3221
+ }
3222
+ .dgm-resize-handle:focus-visible {
3223
+ outline-offset: -3px;
3224
+ }
3225
+ .dgm-tree,
3226
+ .dgm-tree ul {
3227
+ list-style: none;
3228
+ padding: 0;
3229
+ margin: 0;
3230
+ }
3231
+ .dgm-tree {
3232
+ border: 1px solid var(--dgm-border);
3233
+ border-radius: var(--dgm-radius);
3234
+ padding: var(--dgm-list-padding);
3235
+ color: var(--dgm-text);
3236
+ background: var(--dgm-surface);
3237
+ }
3238
+ .dgm-tree-row {
3239
+ display: flex;
3240
+ align-items: center;
3241
+ gap: 0.5rem;
3242
+ min-height: 2.75rem;
3243
+ padding-inline-end: 0.5rem;
3244
+ border-radius: calc(var(--dgm-radius) - 0.25rem);
3245
+ cursor: pointer;
3246
+ overflow-wrap: anywhere;
3247
+ }
3248
+ .dgm-tree [aria-selected='true'] > .dgm-tree-row {
3249
+ background: var(--dgm-primary);
3250
+ color: var(--dgm-on-primary);
3251
+ }
3252
+ .dgm-tree [aria-disabled] > .dgm-tree-row {
3253
+ opacity: 0.5;
3254
+ cursor: not-allowed;
3255
+ }
3256
+ .dgm-tree-expander {
3257
+ display: grid;
3258
+ place-items: center;
3259
+ flex-shrink: 0;
3260
+ width: 2.25rem;
3261
+ min-height: 2.75rem;
3262
+ }
3263
+ .dgm-tree-expander svg {
3264
+ width: 1.25rem;
3265
+ height: 1.25rem;
3266
+ }
3267
+ .dgm-tree [role='treeitem']:focus-visible {
3268
+ outline: none;
3269
+ }
3270
+ .dgm-tree [role='treeitem']:focus-visible > .dgm-tree-row {
3271
+ outline: 2px solid var(--dgm-primary);
3272
+ outline-offset: -2px;
3273
+ }
3274
+ .dgm-carousel {
3275
+ min-width: 0;
3276
+ width: 100%;
3277
+ }
3278
+ .dgm-carousel-viewport {
3279
+ position: relative;
3280
+ display: flex;
3281
+ gap: 1rem;
3282
+ overflow-x: auto;
3283
+ scroll-snap-type: x mandatory;
3284
+ scrollbar-width: none;
3285
+ border-radius: var(--dgm-radius);
3286
+ }
3287
+ .dgm-carousel-viewport::-webkit-scrollbar {
3288
+ display: none;
3289
+ }
3290
+ .dgm-carousel-slide {
3291
+ flex: 0 0 100%;
3292
+ min-width: 0;
3293
+ box-sizing: border-box;
3294
+ scroll-snap-align: start;
3295
+ overflow-wrap: anywhere;
3296
+ }
3297
+ .dgm-carousel-controls {
3298
+ display: flex;
3299
+ justify-content: space-between;
3300
+ align-items: center;
3301
+ gap: 0.5rem;
3302
+ margin-top: 1rem;
3303
+ flex-wrap: wrap;
3304
+ }
3305
+ .dgm-carousel-indicators {
3306
+ display: flex;
3307
+ justify-content: center;
3308
+ flex-wrap: wrap;
3309
+ }
3310
+ .dgm-carousel-indicators button {
3311
+ display: grid;
3312
+ place-items: center;
3313
+ min-width: 2.75rem;
3314
+ min-height: 2.75rem;
3315
+ border: 0;
3316
+ background: transparent;
3317
+ border-radius: var(--dgm-radius);
3318
+ cursor: pointer;
3319
+ }
3320
+ .dgm-carousel-indicators span {
3321
+ width: 0.5rem;
3322
+ height: 0.5rem;
3323
+ background: var(--dgm-control-border);
3324
+ border-radius: 100%;
3325
+ }
3326
+ .dgm-carousel-indicators [aria-current] span {
3327
+ background: var(--dgm-primary);
3328
+ }
3329
+ .dgm-slider-thumb:focus-visible,
3330
+ .dgm-toggle-item:focus-visible,
3331
+ .dgm-navigation-trigger:focus-visible,
3332
+ .dgm-navigation-link:focus-visible,
3333
+ .dgm-multi-tags button:focus-visible,
3334
+ .dgm-resize-handle:focus-visible,
3335
+ .dgm-carousel-viewport:focus-visible,
3336
+ .dgm-carousel-indicators button:focus-visible {
3337
+ outline: 2px solid var(--dgm-primary);
3338
+ outline-offset: 2px;
3339
+ }
3340
+ .dgm-resize-handle:focus-visible {
3341
+ outline-offset: -3px;
3342
+ }
3343
+ @media (prefers-reduced-motion: reduce) {
3344
+ .dgm-navigation-content {
3345
+ animation: none;
3346
+ }
3347
+ .dgm-toggle-item {
3348
+ transition: none;
3349
+ }
3350
+ }
3351
+ @media (forced-colors: active) {
3352
+ .dgm-slider-track,
3353
+ .dgm-slider-range,
3354
+ .dgm-carousel-indicators span {
3355
+ background: ButtonText;
3356
+ }
3357
+ .dgm-slider-thumb {
3358
+ border-color: Highlight;
3359
+ }
3360
+ .dgm-tree [aria-selected='true'] > .dgm-tree-row,
3361
+ .dgm-toggle-item[data-state='on'] {
3362
+ outline: 2px solid Highlight;
3363
+ }
3364
+ }
3365
+
3366
+ .dgm-tree-node-icon {
3367
+ display: inline-flex;
3368
+ flex-shrink: 0;
3369
+ }