@gyramais/gyra-design 0.2.43 → 0.2.45
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/dist/components/Card/Card.d.ts +7 -1
- package/dist/components/Card/index.js +6 -6
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Empty/Empty.d.ts +18 -1
- package/dist/components/Empty/index.js +2 -40
- package/dist/components/Empty/index.js.map +1 -1
- package/dist/components/FloatingCard/index.js +7 -7
- package/dist/components/FloatingCard/index.js.map +1 -1
- package/dist/components/List/index.js +2 -40
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.d.ts +31 -9
- package/dist/components/Skeleton/index.js +1 -1
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/SyncChip/index.js +1 -1
- package/dist/components/SyncChip/index.js.map +1 -1
- package/dist/components/Table/index.js +2 -40
- package/dist/components/Table/index.js.map +1 -1
- package/dist/emails/balance-sheet-finalized/components/Card/Card.d.ts +7 -1
- package/dist/emails/balance-sheet-finalized/components/Empty/Empty.d.ts +18 -1
- package/dist/emails/balance-sheet-finalized/components/Skeleton/Skeleton.d.ts +31 -9
- package/dist/emails/balance-sheet-finalized/index.d.ts +1 -1
- package/dist/emails/email/components/Card/Card.d.ts +7 -1
- package/dist/emails/email/components/Empty/Empty.d.ts +18 -1
- package/dist/emails/email/components/Skeleton/Skeleton.d.ts +31 -9
- package/dist/emails/email/index.d.ts +1 -1
- package/dist/index.css +153 -132
- package/package.json +1 -1
|
@@ -15,6 +15,12 @@ type CardProps = {
|
|
|
15
15
|
media?: React.ReactNode;
|
|
16
16
|
disabled?: boolean;
|
|
17
17
|
loading?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Placeholder exibido no lugar do conteudo enquanto `loading`. O padrao e um
|
|
20
|
+
* skeleton de linhas de texto; passe um skeleton com a forma do conteudo real
|
|
21
|
+
* (grafico, tabela, lista) quando isso ajudar a evitar o pulo de layout.
|
|
22
|
+
*/
|
|
23
|
+
loadingContent?: React.ReactNode;
|
|
18
24
|
collapsible?: boolean;
|
|
19
25
|
defaultCollapsed?: boolean;
|
|
20
26
|
collapsed?: boolean;
|
|
@@ -23,5 +29,5 @@ type CardProps = {
|
|
|
23
29
|
headerContent?: React.ReactNode;
|
|
24
30
|
children?: React.ReactNode;
|
|
25
31
|
};
|
|
26
|
-
declare const Card: ({ id, type, className, title, subtitle, media, disabled, loading, collapsible, defaultCollapsed, collapsed, onCollapse, onClick, headerContent, children, }: CardProps) => React.JSX.Element;
|
|
32
|
+
declare const Card: ({ id, type, className, title, subtitle, media, disabled, loading, loadingContent, collapsible, defaultCollapsed, collapsed, onCollapse, onClick, headerContent, children, }: CardProps) => React.JSX.Element;
|
|
27
33
|
export { Card };
|
|
@@ -3,8 +3,25 @@ import "./index.css";
|
|
|
3
3
|
type EmptyProps = {
|
|
4
4
|
id?: string;
|
|
5
5
|
className?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Ilustracao opcional. Use SO em zero state de pagina ou area inteira, do
|
|
8
|
+
* tipo "primeiro uso, ainda nao ha nada aqui", onde ela vem acompanhada de
|
|
9
|
+
* um titulo e de uma acao.
|
|
10
|
+
*
|
|
11
|
+
* Dentro de card ou de tabela de seção o padrao e' texto puro, sem grafico:
|
|
12
|
+
* a mesma ilustracao repetida dezenas de vezes na mesma pagina vira ruido e
|
|
13
|
+
* compete com o dado que importa. E' o que Stripe e Linear fazem em tabela.
|
|
14
|
+
*/
|
|
6
15
|
icon?: React.ReactNode;
|
|
7
16
|
text?: string;
|
|
8
17
|
};
|
|
9
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Estado vazio: diz que nao ha nada ali, sem roubar a atencao do que ha.
|
|
20
|
+
*
|
|
21
|
+
* Discreto de proposito, em texto secundario. Uma lista vazia raramente e' o
|
|
22
|
+
* assunto da tela, e num relatorio de credito ela costuma ate ser boa noticia
|
|
23
|
+
* ("nenhuma sanção encontrada"), entao nao deve parecer erro nem falha de
|
|
24
|
+
* carregamento.
|
|
25
|
+
*/
|
|
26
|
+
declare const Empty: ({ id, className, icon, text }: EmptyProps) => React.JSX.Element;
|
|
10
27
|
export { Empty };
|
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import "./index.css";
|
|
3
|
-
type SkeletonVariant = "text" | "rect" | "circle";
|
|
4
3
|
type SkeletonProps = {
|
|
5
4
|
id?: string;
|
|
6
5
|
className?: string;
|
|
7
|
-
/**
|
|
8
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Forma do placeholder:
|
|
8
|
+
* - `text`: linhas de texto (a ultima sai mais curta, como um paragrafo real)
|
|
9
|
+
* - `block`: retangulo cheio (grafico, mapa, tabela, imagem)
|
|
10
|
+
* - `circle`: avatar, badge, icone
|
|
11
|
+
*/
|
|
12
|
+
variant?: "text" | "block" | "circle";
|
|
13
|
+
/** Quantidade de linhas. So vale para `variant="text"`. */
|
|
14
|
+
lines?: number;
|
|
15
|
+
/** Diametro do circulo. So vale para `variant="circle"`. */
|
|
16
|
+
size?: number;
|
|
9
17
|
width?: number | string;
|
|
10
18
|
height?: number | string;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Liga o brilho que varre o bloco. Padrao `true`.
|
|
21
|
+
*
|
|
22
|
+
* Passe `false` para o que esta ESPERANDO em vez de acontecendo (item na
|
|
23
|
+
* fila, seção que ainda nao comecou). O bloco parado marca o espaco sem
|
|
24
|
+
* prometer trabalho que nao esta em curso, e o movimento fica reservado
|
|
25
|
+
* para o que de fato esta sendo processado.
|
|
26
|
+
*/
|
|
27
|
+
animated?: boolean;
|
|
15
28
|
};
|
|
16
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Placeholder de carregamento no formato do conteudo que esta chegando.
|
|
31
|
+
*
|
|
32
|
+
* Substitui o spinner: em vez de um indicador generico no meio da tela, o
|
|
33
|
+
* usuario ve a silhueta do que vai aparecer, entao o layout nao pula quando o
|
|
34
|
+
* dado chega. E o padrao dos apps modernos (Stripe, Linear, GitHub).
|
|
35
|
+
*
|
|
36
|
+
* A animacao e um brilho que varre o bloco, desligado sob
|
|
37
|
+
* `prefers-reduced-motion`.
|
|
38
|
+
*/
|
|
39
|
+
declare const Skeleton: ({ id, className, variant, lines, size, width, height, animated, }: SkeletonProps) => React.JSX.Element;
|
|
17
40
|
export { Skeleton };
|
|
18
|
-
export type { SkeletonProps };
|
|
@@ -45,12 +45,12 @@ import "./components/SegmentedToggle/index.css";
|
|
|
45
45
|
import "./components/Select/index.css";
|
|
46
46
|
import "./components/Selector/index.css";
|
|
47
47
|
import "./components/SelectTree/index.css";
|
|
48
|
+
import "./components/Skeleton/index.css";
|
|
48
49
|
import "./components/PickerPopover/index.css";
|
|
49
50
|
import "./components/MultiSelectPicker/index.css";
|
|
50
51
|
import "./components/RuleSearchPicker/index.css";
|
|
51
52
|
import "./components/OperatorPicker/index.css";
|
|
52
53
|
import "./components/ContextMenu/index.css";
|
|
53
|
-
import "./components/Skeleton/index.css";
|
|
54
54
|
import "./components/StatusTag/index.css";
|
|
55
55
|
import "./components/Switch/index.css";
|
|
56
56
|
import "./components/SyncChip/index.css";
|
|
@@ -15,6 +15,12 @@ type CardProps = {
|
|
|
15
15
|
media?: React.ReactNode;
|
|
16
16
|
disabled?: boolean;
|
|
17
17
|
loading?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Placeholder exibido no lugar do conteudo enquanto `loading`. O padrao e um
|
|
20
|
+
* skeleton de linhas de texto; passe um skeleton com a forma do conteudo real
|
|
21
|
+
* (grafico, tabela, lista) quando isso ajudar a evitar o pulo de layout.
|
|
22
|
+
*/
|
|
23
|
+
loadingContent?: React.ReactNode;
|
|
18
24
|
collapsible?: boolean;
|
|
19
25
|
defaultCollapsed?: boolean;
|
|
20
26
|
collapsed?: boolean;
|
|
@@ -23,5 +29,5 @@ type CardProps = {
|
|
|
23
29
|
headerContent?: React.ReactNode;
|
|
24
30
|
children?: React.ReactNode;
|
|
25
31
|
};
|
|
26
|
-
declare const Card: ({ id, type, className, title, subtitle, media, disabled, loading, collapsible, defaultCollapsed, collapsed, onCollapse, onClick, headerContent, children, }: CardProps) => React.JSX.Element;
|
|
32
|
+
declare const Card: ({ id, type, className, title, subtitle, media, disabled, loading, loadingContent, collapsible, defaultCollapsed, collapsed, onCollapse, onClick, headerContent, children, }: CardProps) => React.JSX.Element;
|
|
27
33
|
export { Card };
|
|
@@ -3,8 +3,25 @@ import "./index.css";
|
|
|
3
3
|
type EmptyProps = {
|
|
4
4
|
id?: string;
|
|
5
5
|
className?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Ilustracao opcional. Use SO em zero state de pagina ou area inteira, do
|
|
8
|
+
* tipo "primeiro uso, ainda nao ha nada aqui", onde ela vem acompanhada de
|
|
9
|
+
* um titulo e de uma acao.
|
|
10
|
+
*
|
|
11
|
+
* Dentro de card ou de tabela de seção o padrao e' texto puro, sem grafico:
|
|
12
|
+
* a mesma ilustracao repetida dezenas de vezes na mesma pagina vira ruido e
|
|
13
|
+
* compete com o dado que importa. E' o que Stripe e Linear fazem em tabela.
|
|
14
|
+
*/
|
|
6
15
|
icon?: React.ReactNode;
|
|
7
16
|
text?: string;
|
|
8
17
|
};
|
|
9
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Estado vazio: diz que nao ha nada ali, sem roubar a atencao do que ha.
|
|
20
|
+
*
|
|
21
|
+
* Discreto de proposito, em texto secundario. Uma lista vazia raramente e' o
|
|
22
|
+
* assunto da tela, e num relatorio de credito ela costuma ate ser boa noticia
|
|
23
|
+
* ("nenhuma sanção encontrada"), entao nao deve parecer erro nem falha de
|
|
24
|
+
* carregamento.
|
|
25
|
+
*/
|
|
26
|
+
declare const Empty: ({ id, className, icon, text }: EmptyProps) => React.JSX.Element;
|
|
10
27
|
export { Empty };
|
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import "./index.css";
|
|
3
|
-
type SkeletonVariant = "text" | "rect" | "circle";
|
|
4
3
|
type SkeletonProps = {
|
|
5
4
|
id?: string;
|
|
6
5
|
className?: string;
|
|
7
|
-
/**
|
|
8
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Forma do placeholder:
|
|
8
|
+
* - `text`: linhas de texto (a ultima sai mais curta, como um paragrafo real)
|
|
9
|
+
* - `block`: retangulo cheio (grafico, mapa, tabela, imagem)
|
|
10
|
+
* - `circle`: avatar, badge, icone
|
|
11
|
+
*/
|
|
12
|
+
variant?: "text" | "block" | "circle";
|
|
13
|
+
/** Quantidade de linhas. So vale para `variant="text"`. */
|
|
14
|
+
lines?: number;
|
|
15
|
+
/** Diametro do circulo. So vale para `variant="circle"`. */
|
|
16
|
+
size?: number;
|
|
9
17
|
width?: number | string;
|
|
10
18
|
height?: number | string;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Liga o brilho que varre o bloco. Padrao `true`.
|
|
21
|
+
*
|
|
22
|
+
* Passe `false` para o que esta ESPERANDO em vez de acontecendo (item na
|
|
23
|
+
* fila, seção que ainda nao comecou). O bloco parado marca o espaco sem
|
|
24
|
+
* prometer trabalho que nao esta em curso, e o movimento fica reservado
|
|
25
|
+
* para o que de fato esta sendo processado.
|
|
26
|
+
*/
|
|
27
|
+
animated?: boolean;
|
|
15
28
|
};
|
|
16
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Placeholder de carregamento no formato do conteudo que esta chegando.
|
|
31
|
+
*
|
|
32
|
+
* Substitui o spinner: em vez de um indicador generico no meio da tela, o
|
|
33
|
+
* usuario ve a silhueta do que vai aparecer, entao o layout nao pula quando o
|
|
34
|
+
* dado chega. E o padrao dos apps modernos (Stripe, Linear, GitHub).
|
|
35
|
+
*
|
|
36
|
+
* A animacao e um brilho que varre o bloco, desligado sob
|
|
37
|
+
* `prefers-reduced-motion`.
|
|
38
|
+
*/
|
|
39
|
+
declare const Skeleton: ({ id, className, variant, lines, size, width, height, animated, }: SkeletonProps) => React.JSX.Element;
|
|
17
40
|
export { Skeleton };
|
|
18
|
-
export type { SkeletonProps };
|
|
@@ -45,12 +45,12 @@ import "./components/SegmentedToggle/index.css";
|
|
|
45
45
|
import "./components/Select/index.css";
|
|
46
46
|
import "./components/Selector/index.css";
|
|
47
47
|
import "./components/SelectTree/index.css";
|
|
48
|
+
import "./components/Skeleton/index.css";
|
|
48
49
|
import "./components/PickerPopover/index.css";
|
|
49
50
|
import "./components/MultiSelectPicker/index.css";
|
|
50
51
|
import "./components/RuleSearchPicker/index.css";
|
|
51
52
|
import "./components/OperatorPicker/index.css";
|
|
52
53
|
import "./components/ContextMenu/index.css";
|
|
53
|
-
import "./components/Skeleton/index.css";
|
|
54
54
|
import "./components/StatusTag/index.css";
|
|
55
55
|
import "./components/Switch/index.css";
|
|
56
56
|
import "./components/SyncChip/index.css";
|
package/dist/index.css
CHANGED
|
@@ -696,6 +696,12 @@ video {
|
|
|
696
696
|
.w-\[360px\] {
|
|
697
697
|
width: 360px;
|
|
698
698
|
}
|
|
699
|
+
.w-\[420px\] {
|
|
700
|
+
width: 420px;
|
|
701
|
+
}
|
|
702
|
+
.w-\[560px\] {
|
|
703
|
+
width: 560px;
|
|
704
|
+
}
|
|
699
705
|
.w-\[800px\] {
|
|
700
706
|
width: 800px;
|
|
701
707
|
}
|
|
@@ -770,6 +776,15 @@ video {
|
|
|
770
776
|
.gap-2 {
|
|
771
777
|
gap: 0.5rem;
|
|
772
778
|
}
|
|
779
|
+
.gap-3 {
|
|
780
|
+
gap: 0.75rem;
|
|
781
|
+
}
|
|
782
|
+
.gap-4 {
|
|
783
|
+
gap: 1rem;
|
|
784
|
+
}
|
|
785
|
+
.gap-6 {
|
|
786
|
+
gap: 1.5rem;
|
|
787
|
+
}
|
|
773
788
|
.gap-x-1 {
|
|
774
789
|
-moz-column-gap: 0.25rem;
|
|
775
790
|
column-gap: 0.25rem;
|
|
@@ -804,6 +819,9 @@ video {
|
|
|
804
819
|
.rounded-\[6px\] {
|
|
805
820
|
border-radius: 6px;
|
|
806
821
|
}
|
|
822
|
+
.rounded-\[var\(--radius-lg\)\] {
|
|
823
|
+
border-radius: var(--radius-lg);
|
|
824
|
+
}
|
|
807
825
|
.rounded-full {
|
|
808
826
|
border-radius: 9999px;
|
|
809
827
|
}
|
|
@@ -816,6 +834,9 @@ video {
|
|
|
816
834
|
.border {
|
|
817
835
|
border-width: 1px;
|
|
818
836
|
}
|
|
837
|
+
.border-\[var\(--color-border-secondary\)\] {
|
|
838
|
+
border-color: var(--color-border-secondary);
|
|
839
|
+
}
|
|
819
840
|
.bg-\[var\(--background-color\)\] {
|
|
820
841
|
background-color: var(--background-color);
|
|
821
842
|
}
|
|
@@ -840,6 +861,10 @@ video {
|
|
|
840
861
|
--tw-bg-opacity: 1;
|
|
841
862
|
background-color: rgb(254 202 202 / var(--tw-bg-opacity, 1));
|
|
842
863
|
}
|
|
864
|
+
.bg-white {
|
|
865
|
+
--tw-bg-opacity: 1;
|
|
866
|
+
background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
|
|
867
|
+
}
|
|
843
868
|
.fill-current {
|
|
844
869
|
fill: currentColor;
|
|
845
870
|
}
|
|
@@ -929,6 +954,9 @@ video {
|
|
|
929
954
|
.text-\[var\(--color-text-secondary\)\] {
|
|
930
955
|
color: var(--color-text-secondary);
|
|
931
956
|
}
|
|
957
|
+
.text-\[var\(--color-text-tertiary\)\] {
|
|
958
|
+
color: var(--color-text-tertiary);
|
|
959
|
+
}
|
|
932
960
|
.text-\[var\(--primary-button-color\)\] {
|
|
933
961
|
color: var(--primary-button-color);
|
|
934
962
|
}
|
|
@@ -4382,25 +4410,26 @@ h6 {
|
|
|
4382
4410
|
padding-top: 1rem;
|
|
4383
4411
|
}
|
|
4384
4412
|
.gyramais-card.gyramais-card-loading .gyramais-card-content {
|
|
4385
|
-
min-height:
|
|
4413
|
+
min-height: 6rem;
|
|
4386
4414
|
}
|
|
4387
4415
|
|
|
4416
|
+
/* Estado de carregando: o skeleton entra NO FLUXO, nao sobreposto. Assim ele
|
|
4417
|
+
e' quem dita a altura do card, e um `loadingContent` alto (grafico, tabela)
|
|
4418
|
+
nao fica cortado pela altura do conteudo vazio que ele esta substituindo.
|
|
4419
|
+
O conteudo real continua montado, so escondido pela regra abaixo, para nao
|
|
4420
|
+
perder estado no meio do carregamento. */
|
|
4388
4421
|
.gyramais-card .gyramais-card-loading {
|
|
4389
|
-
position: absolute;
|
|
4390
|
-
top: 0px;
|
|
4391
|
-
left: 0px;
|
|
4392
|
-
z-index: 10;
|
|
4393
4422
|
display: flex;
|
|
4394
|
-
height: 100%;
|
|
4395
4423
|
width: 100%;
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4424
|
+
flex-direction: column;
|
|
4425
|
+
align-items: stretch;
|
|
4426
|
+
background-color: var(--color-surface-primary);
|
|
4427
|
+
}
|
|
4428
|
+
|
|
4429
|
+
.gyramais-card.gyramais-card-loading
|
|
4430
|
+
.gyramais-card-content
|
|
4431
|
+
> *:not(.gyramais-card-loading) {
|
|
4432
|
+
display: none;
|
|
4404
4433
|
}
|
|
4405
4434
|
|
|
4406
4435
|
.gyramais-chart .recharts-legend-item {
|
|
@@ -5724,30 +5753,33 @@ h6 {
|
|
|
5724
5753
|
}
|
|
5725
5754
|
|
|
5726
5755
|
.gyramais-empty {
|
|
5727
|
-
|
|
5728
|
-
|
|
5756
|
+
display: flex;
|
|
5757
|
+
flex-direction: column;
|
|
5758
|
+
align-items: center;
|
|
5759
|
+
justify-content: center;
|
|
5760
|
+
gap: 0.75rem;
|
|
5761
|
+
padding-left: 1rem;
|
|
5762
|
+
padding-right: 1rem;
|
|
5763
|
+
padding-top: 1.5rem;
|
|
5764
|
+
padding-bottom: 1.5rem
|
|
5729
5765
|
}
|
|
5766
|
+
|
|
5730
5767
|
.gyramais-empty .gyramais-empty-icon {
|
|
5731
|
-
|
|
5732
|
-
|
|
5733
|
-
|
|
5734
|
-
|
|
5735
|
-
font-size: 40px;
|
|
5736
|
-
--tw-text-opacity: 1;
|
|
5737
|
-
color: rgb(184 184 184 / var(--tw-text-opacity, 1))
|
|
5768
|
+
display: flex;
|
|
5769
|
+
justify-content: center;
|
|
5770
|
+
font-size: 40px;
|
|
5771
|
+
color: var(--color-text-quaternary)
|
|
5738
5772
|
}
|
|
5773
|
+
|
|
5774
|
+
/* Texto secundario, nao preto: lista vazia informa, nao anuncia. Em preto ela
|
|
5775
|
+
pesava igual ao dado de verdade da tabela ao lado. */
|
|
5739
5776
|
.gyramais-empty .gyramais-empty-text {
|
|
5740
|
-
|
|
5741
|
-
|
|
5742
|
-
|
|
5743
|
-
|
|
5744
|
-
font-size: 0.875rem;
|
|
5745
|
-
line-height: 1.25rem;
|
|
5746
|
-
font-weight: 400;
|
|
5747
|
-
line-height: 22px;
|
|
5748
|
-
--tw-text-opacity: 1;
|
|
5749
|
-
color: rgb(0 0 0 / var(--tw-text-opacity, 1))
|
|
5777
|
+
text-align: center;
|
|
5778
|
+
font-size: var(--fs-subheadline);
|
|
5779
|
+
line-height: var(--lh-normal);
|
|
5780
|
+
color: var(--color-text-tertiary)
|
|
5750
5781
|
}
|
|
5782
|
+
|
|
5751
5783
|
.gyramais-filter .gyramais-filter-button-container {
|
|
5752
5784
|
position: relative;
|
|
5753
5785
|
width: -moz-fit-content;
|
|
@@ -8879,6 +8911,68 @@ h6 {
|
|
|
8879
8911
|
left: 0.5rem !important
|
|
8880
8912
|
}
|
|
8881
8913
|
|
|
8914
|
+
.gyramais-skeleton {
|
|
8915
|
+
position: relative;
|
|
8916
|
+
display: block;
|
|
8917
|
+
overflow: hidden;
|
|
8918
|
+
background-color: var(--color-gray-100);
|
|
8919
|
+
border-radius: var(--radius-sm);
|
|
8920
|
+
}
|
|
8921
|
+
|
|
8922
|
+
/* O brilho que varre o bloco. Pseudo-elemento para nao exigir um filho no DOM. */
|
|
8923
|
+
.gyramais-skeleton::after {
|
|
8924
|
+
position: absolute;
|
|
8925
|
+
inset: 0px;
|
|
8926
|
+
content: "";
|
|
8927
|
+
transform: translateX(-100%);
|
|
8928
|
+
background-image: linear-gradient(
|
|
8929
|
+
90deg,
|
|
8930
|
+
rgba(255, 255, 255, 0) 0%,
|
|
8931
|
+
rgba(255, 255, 255, 0.7) 50%,
|
|
8932
|
+
rgba(255, 255, 255, 0) 100%
|
|
8933
|
+
);
|
|
8934
|
+
animation: gyramais-skeleton-shimmer 1.6s ease-in-out infinite;
|
|
8935
|
+
}
|
|
8936
|
+
|
|
8937
|
+
/* Parado de proposito: item na fila, nao em processamento. */
|
|
8938
|
+
.gyramais-skeleton.gyramais-skeleton-static::after {
|
|
8939
|
+
animation: none;
|
|
8940
|
+
}
|
|
8941
|
+
|
|
8942
|
+
.gyramais-skeleton.gyramais-skeleton-circle {
|
|
8943
|
+
flex-shrink: 0;
|
|
8944
|
+
border-radius: var(--radius-full);
|
|
8945
|
+
}
|
|
8946
|
+
|
|
8947
|
+
.gyramais-skeleton.gyramais-skeleton-block {
|
|
8948
|
+
border-radius: var(--radius-md);
|
|
8949
|
+
}
|
|
8950
|
+
|
|
8951
|
+
.gyramais-skeleton-lines {
|
|
8952
|
+
display: flex;
|
|
8953
|
+
width: 100%;
|
|
8954
|
+
flex-direction: column;
|
|
8955
|
+
gap: 0.75rem;
|
|
8956
|
+
}
|
|
8957
|
+
|
|
8958
|
+
.gyramais-skeleton-lines .gyramais-skeleton-line {
|
|
8959
|
+
height: 0.75rem;
|
|
8960
|
+
}
|
|
8961
|
+
|
|
8962
|
+
@keyframes gyramais-skeleton-shimmer {
|
|
8963
|
+
100% {
|
|
8964
|
+
transform: translateX(100%);
|
|
8965
|
+
}
|
|
8966
|
+
}
|
|
8967
|
+
|
|
8968
|
+
/* Sem animacao para quem pediu menos movimento: o bloco continua marcando o
|
|
8969
|
+
espaco, so nao pulsa. */
|
|
8970
|
+
@media (prefers-reduced-motion: reduce) {
|
|
8971
|
+
.gyramais-skeleton::after {
|
|
8972
|
+
animation: none;
|
|
8973
|
+
}
|
|
8974
|
+
}
|
|
8975
|
+
|
|
8882
8976
|
/* PickerPopover — shell base de popovers tipo command-palette / tag-picker. */
|
|
8883
8977
|
|
|
8884
8978
|
/* Container override do Popover base — chrome flat com elevação de dropdown */
|
|
@@ -9851,72 +9945,6 @@ h6 {
|
|
|
9851
9945
|
height: 16px;
|
|
9852
9946
|
}
|
|
9853
9947
|
|
|
9854
|
-
/* Skeleton shimmer — silhueta cinza do conteudo que carrega */
|
|
9855
|
-
|
|
9856
|
-
.gyramais-skeleton {
|
|
9857
|
-
position: relative;
|
|
9858
|
-
display: block;
|
|
9859
|
-
overflow: hidden;
|
|
9860
|
-
background-color: var(--color-border-subtle);
|
|
9861
|
-
border-radius: 6px;
|
|
9862
|
-
}
|
|
9863
|
-
.gyramais-skeleton::after {
|
|
9864
|
-
position: absolute;
|
|
9865
|
-
inset: 0px;
|
|
9866
|
-
--tw-content: '';
|
|
9867
|
-
content: var(--tw-content);
|
|
9868
|
-
transform: translateX(-100%);
|
|
9869
|
-
background: linear-gradient(
|
|
9870
|
-
90deg,
|
|
9871
|
-
transparent,
|
|
9872
|
-
rgba(255, 255, 255, 0.55),
|
|
9873
|
-
transparent
|
|
9874
|
-
);
|
|
9875
|
-
animation: gyramais-skeleton-sweep 1.4s ease-in-out infinite;
|
|
9876
|
-
}
|
|
9877
|
-
.gyramais-skeleton-text {
|
|
9878
|
-
height: 12px;
|
|
9879
|
-
width: 100%;
|
|
9880
|
-
}
|
|
9881
|
-
.gyramais-skeleton-rect {
|
|
9882
|
-
height: 64px;
|
|
9883
|
-
width: 100%;
|
|
9884
|
-
}
|
|
9885
|
-
.gyramais-skeleton-circle {
|
|
9886
|
-
border-radius: 9999px;
|
|
9887
|
-
}
|
|
9888
|
-
.gyramais-skeleton-stack {
|
|
9889
|
-
display: flex;
|
|
9890
|
-
width: 100%;
|
|
9891
|
-
flex-direction: column;
|
|
9892
|
-
gap: 8px;
|
|
9893
|
-
}
|
|
9894
|
-
|
|
9895
|
-
@keyframes gyramais-skeleton-sweep {
|
|
9896
|
-
100% {
|
|
9897
|
-
transform: translateX(100%);
|
|
9898
|
-
}
|
|
9899
|
-
}
|
|
9900
|
-
|
|
9901
|
-
/* Sem movimento deslizante pra quem pediu menos animacao: pulso de opacidade */
|
|
9902
|
-
@media (prefers-reduced-motion: reduce) {
|
|
9903
|
-
.gyramais-skeleton::after {
|
|
9904
|
-
animation: none;
|
|
9905
|
-
}
|
|
9906
|
-
.gyramais-skeleton {
|
|
9907
|
-
animation: gyramais-skeleton-pulse 1.6s ease-in-out infinite;
|
|
9908
|
-
}
|
|
9909
|
-
}
|
|
9910
|
-
@keyframes gyramais-skeleton-pulse {
|
|
9911
|
-
0%,
|
|
9912
|
-
100% {
|
|
9913
|
-
opacity: 1;
|
|
9914
|
-
}
|
|
9915
|
-
50% {
|
|
9916
|
-
opacity: 0.55;
|
|
9917
|
-
}
|
|
9918
|
-
}
|
|
9919
|
-
|
|
9920
9948
|
.gyramais-status-tag {
|
|
9921
9949
|
|
|
9922
9950
|
display: inline-flex;
|
|
@@ -10057,27 +10085,23 @@ h6 {
|
|
|
10057
10085
|
color: var(--color-text-primary);
|
|
10058
10086
|
font-feature-settings: "tnum";
|
|
10059
10087
|
}
|
|
10060
|
-
|
|
10061
|
-
|
|
10062
|
-
|
|
10063
|
-
|
|
10064
|
-
|
|
10065
|
-
|
|
10066
|
-
|
|
10067
|
-
}
|
|
10068
|
-
.gyramais-sync-chip .gyramais-sync-chip-dots-dot {
|
|
10069
|
-
height: 5px;
|
|
10070
|
-
width: 5px;
|
|
10071
|
-
flex-shrink: 0;
|
|
10072
|
-
border-radius: 9999px;
|
|
10073
|
-
background-color: var(--color-text-tertiary);
|
|
10074
|
-
animation: gyramais-sync-chip-pulse 1.2s ease-in-out infinite;
|
|
10075
|
-
}
|
|
10076
|
-
.gyramais-sync-chip .gyramais-sync-chip-dots-dot:nth-child(2) {
|
|
10077
|
-
animation-delay: 0.15s;
|
|
10088
|
+
.gyramais-sync-chip .gyramais-sync-chip-loading {
|
|
10089
|
+
position: relative;
|
|
10090
|
+
height: 4px;
|
|
10091
|
+
width: 64px;
|
|
10092
|
+
overflow: hidden;
|
|
10093
|
+
border-radius: 2px;
|
|
10094
|
+
background-color: var(--color-border-subtle);
|
|
10078
10095
|
}
|
|
10079
|
-
.gyramais-sync-chip .gyramais-sync-chip-
|
|
10080
|
-
|
|
10096
|
+
.gyramais-sync-chip .gyramais-sync-chip-loading::after {
|
|
10097
|
+
position: absolute;
|
|
10098
|
+
height: 100%;
|
|
10099
|
+
width: 32px;
|
|
10100
|
+
border-radius: 2px;
|
|
10101
|
+
background-color: var(--gyra-blue);
|
|
10102
|
+
--tw-content: '';
|
|
10103
|
+
content: var(--tw-content);
|
|
10104
|
+
animation: gyramais-sync-chip-bar 1.6s ease-in-out infinite;
|
|
10081
10105
|
}
|
|
10082
10106
|
|
|
10083
10107
|
.gyramais-sync-chip.gyramais-sync-chip-error {
|
|
@@ -10089,13 +10113,10 @@ h6 {
|
|
|
10089
10113
|
.gyramais-sync-chip.gyramais-sync-chip-error .gyramais-sync-chip-label {
|
|
10090
10114
|
color: var(--status-danger-text);
|
|
10091
10115
|
}
|
|
10092
|
-
/* "Sincronizando" e' status neutro (em andamento), nao warning: pilula,
|
|
10093
|
-
ponto e pulse em cinza — sincronizar nao sinaliza problema. Erro fica
|
|
10094
|
-
vermelho e sucesso verde; so o em-andamento saiu do laranja. */
|
|
10095
10116
|
.gyramais-sync-chip.gyramais-sync-chip-warning {
|
|
10096
|
-
border-color:
|
|
10097
|
-
background-color:
|
|
10098
|
-
color: var(--color
|
|
10117
|
+
border-color: rgba(255,159,10,0.20);
|
|
10118
|
+
background-color: rgba(255,159,10,0.08);
|
|
10119
|
+
color: var(--warning-color);
|
|
10099
10120
|
}
|
|
10100
10121
|
.gyramais-sync-chip.gyramais-sync-chip-success {
|
|
10101
10122
|
border-color: rgba(52,199,89,0.18);
|
|
@@ -10109,15 +10130,15 @@ h6 {
|
|
|
10109
10130
|
background-color: var(--status-danger-text);
|
|
10110
10131
|
}
|
|
10111
10132
|
|
|
10112
|
-
@keyframes gyramais-sync-chip-
|
|
10113
|
-
0
|
|
10114
|
-
|
|
10115
|
-
transform: scale(0.5);
|
|
10116
|
-
opacity: 0.3;
|
|
10133
|
+
@keyframes gyramais-sync-chip-bar {
|
|
10134
|
+
0% {
|
|
10135
|
+
transform: translateX(-32px);
|
|
10117
10136
|
}
|
|
10118
10137
|
50% {
|
|
10119
|
-
transform:
|
|
10120
|
-
|
|
10138
|
+
transform: translateX(64px);
|
|
10139
|
+
}
|
|
10140
|
+
100% {
|
|
10141
|
+
transform: translateX(-32px);
|
|
10121
10142
|
}
|
|
10122
10143
|
}
|
|
10123
10144
|
|