innoboxrr-form-core 2.3.0 → 2.5.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.
@@ -104,7 +104,7 @@
104
104
  [data-tooltip]::after {
105
105
  content: attr(data-tooltip);
106
106
  position: absolute;
107
- z-index: 60;
107
+ z-index: var(--fe-z-tooltip);
108
108
  bottom: calc(100% + var(--fe-space-2));
109
109
  left: 50%;
110
110
  transform: translateX(-50%);
@@ -329,6 +329,38 @@
329
329
  font-size: var(--fe-text-sm);
330
330
  }
331
331
 
332
+ /* Un botón que solo lleva un icono: cerrar un diálogo, abrir el menú de una
333
+ fila. Cuadrado, para que el objetivo no dependa del ancho del glifo. */
334
+ .fe-icon-button {
335
+ display: inline-flex;
336
+ align-items: center;
337
+ justify-content: center;
338
+ width: var(--fe-control-height);
339
+ height: var(--fe-control-height);
340
+ padding: 0;
341
+ color: var(--fe-text-muted);
342
+ background: none;
343
+ border: 1px solid transparent;
344
+ border-radius: var(--fe-radius);
345
+ cursor: pointer;
346
+ transition: background var(--fe-transition), color var(--fe-transition);
347
+ }
348
+
349
+ .fe-icon-button:hover:not(:disabled) {
350
+ color: var(--fe-text);
351
+ background: var(--fe-surface-hover);
352
+ }
353
+
354
+ .fe-icon-button:focus-visible {
355
+ outline: 2px solid var(--fe-focus);
356
+ outline-offset: 2px;
357
+ }
358
+
359
+ .fe-icon-button:disabled {
360
+ opacity: 0.55;
361
+ cursor: not-allowed;
362
+ }
363
+
332
364
  /* El icono que va dentro del control, a la izquierda. Sustituye a
333
365
  `uk-form-icon`, que además de la clase traía el componente de iconos de
334
366
  UIkit. */
@@ -433,6 +465,22 @@
433
465
  text-decoration: underline;
434
466
  }
435
467
 
468
+ /* La tecla de un atajo, en un menú o en la paleta de comandos. */
469
+ .fe-kbd {
470
+ display: inline-flex;
471
+ align-items: center;
472
+ min-width: 1.25rem;
473
+ height: 1.25rem;
474
+ padding: 0 var(--fe-space-1);
475
+ font-family: var(--fe-font-mono);
476
+ font-size: var(--fe-text-xs);
477
+ color: var(--fe-text-muted);
478
+ background: var(--fe-surface-sunk);
479
+ border: 1px solid var(--fe-border);
480
+ border-bottom-width: 2px;
481
+ border-radius: var(--fe-radius-sm);
482
+ }
483
+
436
484
  /* ============================================================
437
485
  SUPERFICIES
438
486
  ============================================================ */
@@ -474,6 +522,30 @@
474
522
  color: var(--fe-text-muted);
475
523
  }
476
524
 
525
+ .fe-badge-primary {
526
+ background: var(--fe-primary-soft);
527
+ color: var(--fe-primary);
528
+ }
529
+
530
+ .fe-badge-success {
531
+ background: var(--fe-success-soft);
532
+ color: var(--fe-success);
533
+ }
534
+
535
+ .fe-badge-danger {
536
+ background: var(--fe-danger-soft);
537
+ color: var(--fe-danger);
538
+ }
539
+
540
+ .fe-badge-warning {
541
+ background: var(--fe-warning-soft);
542
+ color: var(--fe-warning);
543
+ }
544
+
545
+ /* ============================================================
546
+ ESQUELETOS
547
+ ============================================================ */
548
+
477
549
  /* Un esqueleto en vez de un spinner: mantiene la forma de lo que va a
478
550
  llegar, así que la página no salta al cargar. */
479
551
  .fe-skeleton {
@@ -488,6 +560,32 @@
488
560
  animation: fe-skeleton 1.4s ease infinite;
489
561
  }
490
562
 
563
+ /* Las tres formas que aparecen en una vista de administración: una línea de
564
+ texto, un avatar y un bloque. Sin ellas cada vista inventaba su altura. */
565
+ .fe-skeleton-text {
566
+ display: block;
567
+ width: 100%;
568
+ height: 0.875em;
569
+ }
570
+
571
+ .fe-skeleton-text + .fe-skeleton-text {
572
+ margin-top: var(--fe-space-2);
573
+ }
574
+
575
+ .fe-skeleton-circle {
576
+ display: inline-block;
577
+ width: 2.5rem;
578
+ aspect-ratio: 1;
579
+ border-radius: var(--fe-radius-full);
580
+ }
581
+
582
+ .fe-skeleton-block {
583
+ display: block;
584
+ width: 100%;
585
+ height: 6rem;
586
+ border-radius: var(--fe-radius);
587
+ }
588
+
491
589
  @keyframes fe-skeleton {
492
590
  0% {
493
591
  background-position: 100% 50%;
@@ -497,35 +595,181 @@
497
595
  }
498
596
  }
499
597
 
598
+ /* ============================================================
599
+ DIALOGOS Y DRAWERS
600
+ ============================================================ */
601
+
602
+ /*
603
+ * Sobre el elemento <dialog> del navegador, abierto con showModal():
604
+ *
605
+ * <dialog class="fe-dialog">
606
+ * <header class="fe-dialog-header">…</header>
607
+ * <div class="fe-dialog-body">…</div>
608
+ * <footer class="fe-dialog-footer">…</footer>
609
+ * </dialog>
610
+ *
611
+ * El navegador pone lo que antes había que programar: la capa superior sin
612
+ * z-index, el fondo inerte, el foco atrapado dentro, Escape para cerrar y la
613
+ * devolución del foco al cerrar. Aquí solo se dibuja.
614
+ *
615
+ * Nada de lo de aquí fija `display` en el estado cerrado: un <dialog> sin
616
+ * `open` está oculto porque el navegador le pone display: none, y una regla
617
+ * que lo pisara lo dejaría visible siempre.
618
+ */
619
+
500
620
  .fe-overlay {
501
621
  position: fixed;
502
622
  inset: 0;
503
- background: rgba(16, 18, 27, 0.45);
623
+ z-index: var(--fe-z-overlay);
624
+ background: var(--fe-overlay);
504
625
  }
505
626
 
506
627
  .fe-dialog {
628
+ width: min(var(--fe-dialog-width), calc(100vw - 2 * var(--fe-space-4)));
629
+ max-height: 85vh;
630
+ padding: 0;
631
+ color: var(--fe-text);
507
632
  background: var(--fe-surface-raised);
508
633
  border: 1px solid var(--fe-border);
509
634
  border-radius: var(--fe-radius-lg);
510
635
  box-shadow: var(--fe-shadow-lg);
511
- max-height: 85vh;
512
636
  overflow: auto;
513
637
  }
514
638
 
639
+ .fe-dialog[open] {
640
+ display: flex;
641
+ flex-direction: column;
642
+ animation: fe-dialog-in var(--fe-duration) var(--fe-ease-out);
643
+ }
644
+
645
+ .fe-dialog::backdrop,
646
+ .fe-drawer::backdrop {
647
+ background: var(--fe-overlay);
648
+ animation: fe-backdrop-in var(--fe-duration) var(--fe-ease-out);
649
+ }
650
+
651
+ .fe-dialog-sm {
652
+ --fe-dialog-width: 24rem;
653
+ }
654
+
655
+ .fe-dialog-lg {
656
+ --fe-dialog-width: 48rem;
657
+ }
658
+
659
+ .fe-dialog-header,
660
+ .fe-drawer-header {
661
+ display: flex;
662
+ align-items: center;
663
+ justify-content: space-between;
664
+ gap: var(--fe-space-3);
665
+ padding: var(--fe-space-4) var(--fe-space-5);
666
+ border-bottom: 1px solid var(--fe-border);
667
+ }
668
+
669
+ .fe-dialog-title,
670
+ .fe-drawer-title {
671
+ margin: 0;
672
+ font-size: var(--fe-text-lg);
673
+ font-weight: 600;
674
+ color: var(--fe-text);
675
+ }
676
+
677
+ .fe-dialog-body,
678
+ .fe-drawer-body {
679
+ padding: var(--fe-space-5);
680
+ overflow: auto;
681
+ }
682
+
683
+ .fe-dialog-footer,
684
+ .fe-drawer-footer {
685
+ display: flex;
686
+ flex-wrap: wrap;
687
+ align-items: center;
688
+ justify-content: flex-end;
689
+ gap: var(--fe-space-2);
690
+ padding: var(--fe-space-3) var(--fe-space-5);
691
+ border-top: 1px solid var(--fe-border);
692
+ }
693
+
694
+ /* Un drawer es un <dialog> pegado a un borde. El formulario de crear o
695
+ editar se abre aquí y la tabla sigue a la vista, detrás. */
515
696
  .fe-drawer {
516
- position: fixed;
517
- top: 0;
518
- right: 0;
519
- bottom: 0;
520
- width: min(32rem, 100vw);
697
+ width: min(var(--fe-drawer-width), 100vw);
698
+ max-width: 100vw;
699
+ height: 100dvh;
700
+ max-height: none;
701
+ margin: 0 0 0 auto;
702
+ padding: 0;
703
+ color: var(--fe-text);
521
704
  background: var(--fe-surface);
705
+ border: none;
522
706
  border-left: 1px solid var(--fe-border);
523
707
  box-shadow: var(--fe-shadow-lg);
708
+ overflow: hidden;
709
+ }
710
+
711
+ .fe-drawer[open] {
524
712
  display: flex;
525
713
  flex-direction: column;
526
- overflow: auto;
714
+ animation: fe-drawer-in var(--fe-duration) var(--fe-ease-out);
715
+ }
716
+
717
+ .fe-drawer-body {
718
+ flex: 1 1 auto;
719
+ }
720
+
721
+ .fe-drawer-start {
722
+ margin: 0 auto 0 0;
723
+ border-left: none;
724
+ border-right: 1px solid var(--fe-border);
725
+ }
726
+
727
+ .fe-drawer-start[open] {
728
+ animation-name: fe-drawer-start-in;
729
+ }
730
+
731
+ @keyframes fe-dialog-in {
732
+ from {
733
+ opacity: 0;
734
+ transform: translateY(0.5rem) scale(0.98);
735
+ }
736
+ to {
737
+ opacity: 1;
738
+ transform: none;
739
+ }
740
+ }
741
+
742
+ @keyframes fe-drawer-in {
743
+ from {
744
+ transform: translateX(100%);
745
+ }
746
+ to {
747
+ transform: none;
748
+ }
749
+ }
750
+
751
+ @keyframes fe-drawer-start-in {
752
+ from {
753
+ transform: translateX(-100%);
754
+ }
755
+ to {
756
+ transform: none;
757
+ }
758
+ }
759
+
760
+ @keyframes fe-backdrop-in {
761
+ from {
762
+ opacity: 0;
763
+ }
764
+ to {
765
+ opacity: 1;
766
+ }
527
767
  }
528
768
 
769
+ /* ============================================================
770
+ MENUS
771
+ ============================================================ */
772
+
529
773
  .fe-menu {
530
774
  min-width: 11rem;
531
775
  padding: var(--fe-space-1);
@@ -549,7 +793,7 @@
549
793
  }
550
794
 
551
795
  .fe-menu[popover]:popover-open {
552
- animation: fe-fade-in 120ms ease;
796
+ animation: fe-menu-in var(--fe-duration-fast) ease;
553
797
  }
554
798
 
555
799
  .fe-menu-list {
@@ -567,6 +811,7 @@
567
811
  font-size: var(--fe-text-sm);
568
812
  color: var(--fe-text);
569
813
  text-align: left;
814
+ text-decoration: none;
570
815
  background: none;
571
816
  border: none;
572
817
  border-radius: var(--fe-radius-sm);
@@ -578,17 +823,159 @@
578
823
  background: var(--fe-surface-hover);
579
824
  }
580
825
 
826
+ .fe-menu-item:focus-visible {
827
+ outline: 2px solid var(--fe-focus);
828
+ outline-offset: -2px;
829
+ }
830
+
831
+ .fe-menu-item-danger {
832
+ color: var(--fe-danger);
833
+ }
834
+
835
+ .fe-menu-item-danger:hover,
836
+ .fe-menu-item-danger[data-highlighted] {
837
+ background: var(--fe-danger-soft);
838
+ }
839
+
840
+ /* Un elemento que no se puede usar se ve y se explica, no desaparece: quien no
841
+ tiene permiso tiene que saber que la acción existe. */
842
+ .fe-menu-item:disabled,
843
+ .fe-menu-item[aria-disabled='true'] {
844
+ color: var(--fe-text-subtle);
845
+ background: none;
846
+ cursor: not-allowed;
847
+ }
848
+
849
+ .fe-menu-item .fe-kbd {
850
+ margin-left: auto;
851
+ }
852
+
853
+ .fe-menu-separator {
854
+ height: 1px;
855
+ margin: var(--fe-space-1) 0;
856
+ background: var(--fe-border);
857
+ border: none;
858
+ }
859
+
860
+ .fe-menu-label {
861
+ padding: var(--fe-space-2) var(--fe-space-3) var(--fe-space-1);
862
+ font-size: var(--fe-text-xs);
863
+ font-weight: 500;
864
+ letter-spacing: 0.05em;
865
+ text-transform: uppercase;
866
+ color: var(--fe-text-subtle);
867
+ }
868
+
869
+ @keyframes fe-menu-in {
870
+ from {
871
+ opacity: 0;
872
+ }
873
+ to {
874
+ opacity: 1;
875
+ }
876
+ }
877
+
878
+ /* ============================================================
879
+ PALETA DE COMANDOS
880
+ ============================================================ */
881
+
882
+ /*
883
+ * Un <dialog class="fe-dialog fe-command"> con un buscador y una lista. Se
884
+ * abre arriba y no centrado: el ojo va a donde se escribe, y la lista crece
885
+ * hacia abajo sin mover el buscador.
886
+ */
887
+
888
+ .fe-command {
889
+ --fe-dialog-width: var(--fe-command-width);
890
+ margin: 12vh auto auto;
891
+ max-height: 70vh;
892
+ }
893
+
894
+ .fe-command-input {
895
+ width: 100%;
896
+ min-height: calc(var(--fe-control-height) * 1.4);
897
+ padding: 0 var(--fe-space-5);
898
+ font-family: var(--fe-font);
899
+ font-size: var(--fe-text-lg);
900
+ color: var(--fe-text);
901
+ background: none;
902
+ border: none;
903
+ border-bottom: 1px solid var(--fe-border);
904
+ }
905
+
906
+ .fe-command-input:focus {
907
+ outline: none;
908
+ }
909
+
910
+ .fe-command-input::placeholder {
911
+ color: var(--fe-text-subtle);
912
+ }
913
+
914
+ .fe-command-list {
915
+ list-style: none;
916
+ margin: 0;
917
+ padding: var(--fe-space-2);
918
+ overflow: auto;
919
+ }
920
+
921
+ .fe-command-group {
922
+ padding: var(--fe-space-2) var(--fe-space-3) var(--fe-space-1);
923
+ font-size: var(--fe-text-xs);
924
+ font-weight: 500;
925
+ letter-spacing: 0.05em;
926
+ text-transform: uppercase;
927
+ color: var(--fe-text-subtle);
928
+ }
929
+
930
+ .fe-command-item {
931
+ display: flex;
932
+ align-items: center;
933
+ gap: var(--fe-space-3);
934
+ width: 100%;
935
+ padding: var(--fe-space-2) var(--fe-space-3);
936
+ font-size: var(--fe-text-base);
937
+ color: var(--fe-text);
938
+ text-align: left;
939
+ background: none;
940
+ border: none;
941
+ border-radius: var(--fe-radius);
942
+ cursor: pointer;
943
+ }
944
+
945
+ .fe-command-item[aria-selected='true'],
946
+ .fe-command-item[data-highlighted] {
947
+ background: var(--fe-primary-soft);
948
+ color: var(--fe-text);
949
+ }
950
+
951
+ .fe-command-item .fe-kbd {
952
+ margin-left: auto;
953
+ }
954
+
955
+ .fe-command-empty {
956
+ padding: var(--fe-space-6) var(--fe-space-4);
957
+ font-size: var(--fe-text-sm);
958
+ text-align: center;
959
+ color: var(--fe-text-muted);
960
+ }
961
+
962
+ /* ============================================================
963
+ AVISOS
964
+ ============================================================ */
965
+
581
966
  .fe-toast {
582
967
  display: flex;
583
968
  align-items: flex-start;
584
969
  gap: var(--fe-space-3);
585
970
  padding: var(--fe-space-3) var(--fe-space-4);
586
971
  font-size: var(--fe-text-sm);
972
+ color: var(--fe-text);
587
973
  background: var(--fe-surface-raised);
588
974
  border: 1px solid var(--fe-border);
589
975
  border-left: 3px solid var(--fe-primary);
590
976
  border-radius: var(--fe-radius);
591
977
  box-shadow: var(--fe-shadow);
978
+ animation: fe-toast-in var(--fe-duration) var(--fe-ease-out);
592
979
  }
593
980
 
594
981
  .fe-toast-danger {
@@ -599,6 +986,61 @@
599
986
  border-left-color: var(--fe-success);
600
987
  }
601
988
 
989
+ .fe-toast-warning {
990
+ border-left-color: var(--fe-warning);
991
+ }
992
+
993
+ .fe-toast-title {
994
+ display: block;
995
+ font-weight: 600;
996
+ }
997
+
998
+ .fe-toast-close {
999
+ margin-left: auto;
1000
+ }
1001
+
1002
+ /*
1003
+ * La región donde se apilan los avisos. Va con el atributo popover="manual"
1004
+ * para vivir en la capa superior: un aviso que llega mientras hay un drawer
1005
+ * abierto con showModal() quedaría debajo del fondo inerte, y justo ahí es
1006
+ * donde se guarda un formulario.
1007
+ */
1008
+ .fe-toast-region {
1009
+ position: fixed;
1010
+ right: var(--fe-space-4);
1011
+ bottom: var(--fe-space-4);
1012
+ z-index: var(--fe-z-toast);
1013
+ display: flex;
1014
+ flex-direction: column;
1015
+ gap: var(--fe-space-2);
1016
+ width: min(24rem, calc(100vw - 2 * var(--fe-space-4)));
1017
+ pointer-events: none;
1018
+ }
1019
+
1020
+ .fe-toast-region[popover] {
1021
+ inset: auto var(--fe-space-4) var(--fe-space-4) auto;
1022
+ margin: 0;
1023
+ padding: 0;
1024
+ overflow: visible;
1025
+ background: transparent;
1026
+ border: none;
1027
+ }
1028
+
1029
+ .fe-toast-region > * {
1030
+ pointer-events: auto;
1031
+ }
1032
+
1033
+ @keyframes fe-toast-in {
1034
+ from {
1035
+ opacity: 0;
1036
+ transform: translateY(0.5rem);
1037
+ }
1038
+ to {
1039
+ opacity: 1;
1040
+ transform: none;
1041
+ }
1042
+ }
1043
+
602
1044
  /* ============================================================
603
1045
  TABLA
604
1046
  ============================================================ */
@@ -610,6 +1052,7 @@
610
1052
  }
611
1053
 
612
1054
  .fe-table th {
1055
+ position: relative;
613
1056
  padding: var(--fe-space-2) var(--fe-space-3);
614
1057
  font-size: var(--fe-text-xs);
615
1058
  font-weight: 500;
@@ -641,18 +1084,202 @@
641
1084
  text-align: right;
642
1085
  }
643
1086
 
1087
+ /* Una columna ordenable lo dice antes de pulsarla. */
1088
+ .fe-table th[aria-sort] {
1089
+ cursor: pointer;
1090
+ user-select: none;
1091
+ }
1092
+
1093
+ .fe-table th[aria-sort='ascending'],
1094
+ .fe-table th[aria-sort='descending'] {
1095
+ color: var(--fe-text);
1096
+ }
1097
+
1098
+ /* La cabecera se queda arriba al desplazar un listado largo. */
1099
+ .fe-table-sticky thead th {
1100
+ position: sticky;
1101
+ top: 0;
1102
+ z-index: var(--fe-z-sticky);
1103
+ background: var(--fe-surface);
1104
+ }
1105
+
1106
+ /* La columna de las casillas de selección: tan estrecha como la casilla. */
1107
+ .fe-table-select {
1108
+ width: 1%;
1109
+ white-space: nowrap;
1110
+ }
1111
+
1112
+ /* El tirador para cambiar el ancho de una columna. */
1113
+ .fe-table-resizer {
1114
+ position: absolute;
1115
+ top: 0;
1116
+ right: 0;
1117
+ width: 6px;
1118
+ height: 100%;
1119
+ cursor: col-resize;
1120
+ user-select: none;
1121
+ touch-action: none;
1122
+ }
1123
+
1124
+ .fe-table-resizer:hover,
1125
+ .fe-table-resizer[data-resizing='true'] {
1126
+ background: var(--fe-focus);
1127
+ }
1128
+
1129
+ /* Una tabla sin filas dice por qué, en el sitio de las filas. */
1130
+ .fe-table-empty {
1131
+ padding: var(--fe-space-6) var(--fe-space-4);
1132
+ text-align: center;
1133
+ color: var(--fe-text-muted);
1134
+ }
1135
+
1136
+ /*
1137
+ * La barra que aparece al seleccionar filas: cuántas hay y qué se puede hacer
1138
+ * con todas a la vez. Sustituye a la barra de herramientas mientras dura la
1139
+ * selección, en el mismo sitio, para que la tabla no salte.
1140
+ */
1141
+ .fe-bulk-bar {
1142
+ display: flex;
1143
+ flex-wrap: wrap;
1144
+ align-items: center;
1145
+ gap: var(--fe-space-3);
1146
+ padding: var(--fe-space-2) var(--fe-space-4);
1147
+ color: var(--fe-text);
1148
+ background: var(--fe-primary-soft);
1149
+ border-radius: var(--fe-radius);
1150
+ }
1151
+
1152
+ .fe-bulk-count {
1153
+ font-size: var(--fe-text-sm);
1154
+ font-weight: 500;
1155
+ font-variant-numeric: tabular-nums;
1156
+ }
1157
+
1158
+ /* ============================================================
1159
+ EDICION EN LINEA
1160
+ ============================================================ */
1161
+
1162
+ /* Un valor que se edita donde está. Se distingue del texto normal solo al
1163
+ pasar o enfocar, para que una tabla editable no parezca un formulario. */
1164
+ .fe-editable {
1165
+ display: inline-flex;
1166
+ align-items: center;
1167
+ gap: var(--fe-space-1);
1168
+ min-height: 1.5em;
1169
+ padding: 0 var(--fe-space-1);
1170
+ margin: 0 calc(-1 * var(--fe-space-1));
1171
+ border-radius: var(--fe-radius-sm);
1172
+ border-bottom: 1px dashed transparent;
1173
+ cursor: text;
1174
+ }
1175
+
1176
+ .fe-editable:hover {
1177
+ border-bottom-color: var(--fe-border-strong);
1178
+ }
1179
+
1180
+ .fe-editable:focus-visible {
1181
+ outline: 2px solid var(--fe-focus);
1182
+ outline-offset: 1px;
1183
+ }
1184
+
1185
+ .fe-editable[data-saving='true'] {
1186
+ opacity: 0.6;
1187
+ cursor: progress;
1188
+ }
1189
+
1190
+ .fe-editable[data-invalid='true'] {
1191
+ border-bottom-color: var(--fe-danger);
1192
+ }
1193
+
1194
+ /* ============================================================
1195
+ SHELL DE APLICACION
1196
+ ============================================================ */
1197
+
1198
+ /*
1199
+ * La forma de una aplicación de escritorio: cabecera, barra lateral y el área
1200
+ * de trabajo, que es lo único que cambia al navegar.
1201
+ *
1202
+ * <div class="fe-shell">
1203
+ * <header class="fe-shell-header">…</header>
1204
+ * <nav class="fe-shell-sidebar">…</nav>
1205
+ * <main class="fe-shell-main">…</main>
1206
+ * </div>
1207
+ */
1208
+
1209
+ .fe-shell {
1210
+ display: grid;
1211
+ grid-template-columns: var(--fe-sidebar-width) minmax(0, 1fr);
1212
+ grid-template-rows: auto minmax(0, 1fr);
1213
+ min-height: 100dvh;
1214
+ color: var(--fe-text);
1215
+ background: var(--fe-bg);
1216
+ }
1217
+
1218
+ .fe-shell-header {
1219
+ grid-column: 1 / -1;
1220
+ display: flex;
1221
+ align-items: center;
1222
+ gap: var(--fe-space-3);
1223
+ padding: var(--fe-space-2) var(--fe-space-4);
1224
+ background: var(--fe-surface);
1225
+ border-bottom: 1px solid var(--fe-border);
1226
+ }
1227
+
1228
+ .fe-shell-sidebar {
1229
+ padding: var(--fe-space-3);
1230
+ overflow: auto;
1231
+ background: var(--fe-surface);
1232
+ border-right: 1px solid var(--fe-border);
1233
+ }
1234
+
1235
+ .fe-shell-main {
1236
+ min-width: 0;
1237
+ padding: var(--fe-space-5);
1238
+ overflow: auto;
1239
+ }
1240
+
1241
+ /* En pantallas estrechas la barra lateral sale del flujo y se abre encima. */
1242
+ @media (max-width: 959px) {
1243
+ .fe-shell {
1244
+ grid-template-columns: minmax(0, 1fr);
1245
+ }
1246
+
1247
+ .fe-shell-sidebar {
1248
+ display: none;
1249
+ }
1250
+
1251
+ .fe-shell[data-sidebar-open='true'] .fe-shell-sidebar {
1252
+ display: block;
1253
+ position: fixed;
1254
+ inset: 0 auto 0 0;
1255
+ z-index: var(--fe-z-overlay);
1256
+ width: min(var(--fe-sidebar-width), 85vw);
1257
+ box-shadow: var(--fe-shadow-lg);
1258
+ }
1259
+ }
1260
+
644
1261
  @media (prefers-reduced-motion: reduce) {
645
1262
  .fe-skeleton {
646
1263
  animation: none;
647
1264
  }
648
1265
 
1266
+ .fe-dialog[open],
1267
+ .fe-drawer[open],
1268
+ .fe-dialog::backdrop,
1269
+ .fe-drawer::backdrop,
1270
+ .fe-menu[popover]:popover-open,
1271
+ .fe-toast {
1272
+ animation: none;
1273
+ }
1274
+
649
1275
  .fe-input,
650
1276
  .fe-select,
651
1277
  .fe-textarea,
652
1278
  .fe-button,
653
1279
  .fe-button-secondary,
654
1280
  .fe-button-danger,
655
- .fe-button-link {
1281
+ .fe-button-link,
1282
+ .fe-icon-button {
656
1283
  transition: none;
657
1284
  }
658
1285
  }