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.
- package/README.md +131 -29
- package/index.js +20 -4
- package/package.json +3 -2
- package/src/components.css +638 -11
- package/src/feedback.js +273 -0
- package/src/icons.js +16 -0
- package/src/theme.js +57 -0
- package/src/tokens.css +41 -0
package/src/components.css
CHANGED
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
[data-tooltip]::after {
|
|
105
105
|
content: attr(data-tooltip);
|
|
106
106
|
position: absolute;
|
|
107
|
-
z-index:
|
|
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
|
-
|
|
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
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
}
|