zark-design 3.1.0 → 3.3.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.
@@ -66,6 +66,41 @@
66
66
  --code-bg: var(--brand-50);
67
67
  --code-fg: var(--brand-700);
68
68
 
69
+ /* ---------- DATA VIZ (charts, KPIs, dashboards) ----------
70
+ Paleta validada (CVD safe, adjacent ΔE ≥ 12 no light surface).
71
+ 8 slots categoricos ordenados; nunca cicle, nunca gere o 9o.
72
+ O brand ember (--brand-500) NAO eh cor de serie: fica reservada
73
+ pra CTA/focus/link. */
74
+ --viz-cat-1: #2a78d6; /* blue */
75
+ --viz-cat-2: #1baf7a; /* aqua */
76
+ --viz-cat-3: #eda100; /* yellow */
77
+ --viz-cat-4: #008300; /* green */
78
+ --viz-cat-5: #4a3aa7; /* violet */
79
+ --viz-cat-6: #e34948; /* red */
80
+ --viz-cat-7: #e87ba4; /* magenta */
81
+ --viz-cat-8: #eb6834; /* orange (viz-only, distinto do brand) */
82
+
83
+ /* Sequential (blue, light -> dark) — magnitude, heatmap, ordinal */
84
+ --viz-seq-100: #cde2fb;
85
+ --viz-seq-200: #9ec5f4;
86
+ --viz-seq-300: #6da7ec;
87
+ --viz-seq-400: #3987e5;
88
+ --viz-seq-500: #256abf;
89
+ --viz-seq-600: #184f95;
90
+ --viz-seq-700: #0d366b;
91
+
92
+ /* Diverging (blue <-> red, warm/cool poles) + neutro no meio */
93
+ --viz-div-pos: var(--viz-cat-1);
94
+ --viz-div-neg: var(--viz-cat-6);
95
+ --viz-div-mid: var(--line-100);
96
+
97
+ /* Chart chrome */
98
+ --viz-surface: var(--surface);
99
+ --viz-grid: var(--line-200);
100
+ --viz-axis: var(--line-300);
101
+ --viz-ink: var(--ink-700);
102
+ --viz-ink-muted: var(--ink-400);
103
+
69
104
  /* ---------- TYPOGRAPHY ---------- */
70
105
  --font-sans: "{{fonts.ui}}", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
71
106
  --font-mono: "{{fonts.mono}}", "SF Mono", Menlo, Consolas, monospace;
@@ -129,7 +164,8 @@ html, body {
129
164
  text-rendering: optimizeLegibility;
130
165
  }
131
166
  ::selection { background: var(--brand-200); color: var(--ink-700); }
132
- a { color: inherit; }
167
+ a { color: inherit; text-decoration: none; }
168
+ a:hover { text-decoration: none; }
133
169
  button { font-family: inherit; }
134
170
 
135
171
  /* ============================================================
@@ -178,6 +214,18 @@ button { font-family: inherit; }
178
214
 
179
215
  --ring-focus: 0 0 0 3px {{brand.ringDark}};
180
216
  --ring-focus-soft: 0 0 0 3px {{brand.ringSoftDark}};
217
+
218
+ /* DATA VIZ — mesmos 8 hues, steppados pra dark surface */
219
+ --viz-cat-1: #3987e5;
220
+ --viz-cat-2: #199e70;
221
+ --viz-cat-3: #c98500;
222
+ --viz-cat-4: #008300;
223
+ --viz-cat-5: #9085e9;
224
+ --viz-cat-6: #e66767;
225
+ --viz-cat-7: #d55181;
226
+ --viz-cat-8: #d95926;
227
+ /* sequential steps ficam iguais (blue funciona no dark); os steps proximos do surface recuam */
228
+ --viz-div-mid: var(--line-200);
181
229
  }
182
230
 
183
231
  @media (prefers-color-scheme: dark) {
@@ -198,5 +246,11 @@ button { font-family: inherit; }
198
246
 
199
247
  --tag-bg: var(--brand-800); --tag-fg: var(--brand-200);
200
248
  --code-bg: var(--brand-900); --code-fg: var(--brand-300);
249
+
250
+ --viz-cat-1: #3987e5; --viz-cat-2: #199e70;
251
+ --viz-cat-3: #c98500; --viz-cat-4: #008300;
252
+ --viz-cat-5: #9085e9; --viz-cat-6: #e66767;
253
+ --viz-cat-7: #d55181; --viz-cat-8: #d95926;
254
+ --viz-div-mid: var(--line-200);
201
255
  }
202
256
  }
@@ -617,8 +617,10 @@
617
617
  cursor: pointer;
618
618
  transition: all var(--t-fast) var(--ease-out);
619
619
  position: relative;
620
+ text-decoration: none;
620
621
  }
621
- .zk-sidebar-link:hover { background: var(--ink-50); color: var(--ink-700); }
622
+ .zk-sidebar-link:hover { background: var(--ink-50); color: var(--ink-700); text-decoration: none; }
623
+ .zk-sidebar-link:visited { color: inherit; text-decoration: none; }
622
624
  .zk-sidebar-link.active {
623
625
  color: var(--brand-700);
624
626
  background: var(--brand-50);
@@ -738,3 +740,553 @@
738
740
  .zk-table-row .url { color: var(--ink-600); font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
739
741
  .zk-table-row .num { color: var(--ink-500); font-family: var(--font-mono); }
740
742
  .zk-table-row .date { color: var(--ink-400); font-family: var(--font-mono); font-size: var(--fs-xs); }
743
+
744
+ /* ============================================================
745
+ ADVANCED COMPONENTS v3.3 — adaptados de referencias externas
746
+ pra identidade ZARK (warm, hairline, sem pill, sem glow, sem
747
+ backdrop-blur decorativo, sem gradient colorido).
748
+ ============================================================ */
749
+
750
+ /* ---------- USER DROPDOWN (menu do usuario, rico) ----------
751
+ Uso: trigger avatar; abre um card 320px com header (avatar+nome+status),
752
+ grupos separados por hairline, items com icone+label+direita. */
753
+
754
+ .zk-user-menu {
755
+ position: relative;
756
+ display: inline-block;
757
+ }
758
+ .zk-user-menu-trigger {
759
+ display: inline-flex;
760
+ align-items: center;
761
+ justify-content: center;
762
+ width: 40px; height: 40px;
763
+ border-radius: 50%;
764
+ border: 1px solid var(--line-200);
765
+ background: var(--surface);
766
+ cursor: pointer;
767
+ overflow: hidden;
768
+ transition: box-shadow var(--t-fast) var(--ease-out);
769
+ }
770
+ .zk-user-menu-trigger:focus-visible {
771
+ outline: none;
772
+ box-shadow: var(--ring-focus);
773
+ }
774
+ .zk-user-menu-trigger img {
775
+ width: 100%; height: 100%;
776
+ object-fit: cover;
777
+ }
778
+
779
+ .zk-user-menu-panel {
780
+ position: absolute;
781
+ top: calc(100% + 8px);
782
+ right: 0;
783
+ width: 320px;
784
+ background: var(--surface);
785
+ border: 1px solid var(--line-200);
786
+ border-radius: var(--r-lg);
787
+ box-shadow: var(--shadow-lg);
788
+ padding: 4px;
789
+ z-index: 60;
790
+ }
791
+ .zk-user-menu-panel .head {
792
+ display: flex;
793
+ align-items: center;
794
+ gap: 12px;
795
+ padding: 12px 12px 10px;
796
+ }
797
+ .zk-user-menu-panel .head .avatar {
798
+ width: 40px; height: 40px; border-radius: 50%;
799
+ border: 1px solid var(--line-200); overflow: hidden;
800
+ flex-shrink: 0;
801
+ }
802
+ .zk-user-menu-panel .head .avatar img { width: 100%; height: 100%; object-fit: cover; }
803
+ .zk-user-menu-panel .head .who { flex: 1; min-width: 0; }
804
+ .zk-user-menu-panel .head .name {
805
+ font-size: var(--fs-md);
806
+ font-weight: 600;
807
+ color: var(--ink-700);
808
+ line-height: 1.2;
809
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
810
+ }
811
+ .zk-user-menu-panel .head .handle {
812
+ font-size: var(--fs-xs);
813
+ color: var(--ink-400);
814
+ font-family: var(--font-mono);
815
+ margin-top: 2px;
816
+ }
817
+ .zk-user-menu-panel .head .status-badge {
818
+ font-family: var(--font-mono);
819
+ font-size: var(--fs-2xs);
820
+ text-transform: uppercase;
821
+ letter-spacing: var(--ls-wider);
822
+ padding: 2px 8px;
823
+ border-radius: var(--r-xs);
824
+ font-weight: 600;
825
+ }
826
+ .zk-user-menu-panel .head .status-badge.online { background: var(--success-50); color: var(--success-700); }
827
+ .zk-user-menu-panel .head .status-badge.busy { background: var(--danger-50); color: var(--danger-700); }
828
+ .zk-user-menu-panel .head .status-badge.offline{ background: var(--ink-50); color: var(--ink-500); }
829
+
830
+ .zk-user-menu-sep {
831
+ height: 1px;
832
+ background: var(--line-100);
833
+ margin: 4px 0;
834
+ }
835
+
836
+ .zk-user-menu-group {
837
+ display: flex; flex-direction: column;
838
+ padding: 2px;
839
+ }
840
+ .zk-user-menu-item {
841
+ display: flex;
842
+ align-items: center;
843
+ gap: 10px;
844
+ padding: 8px 10px;
845
+ border-radius: var(--r-sm);
846
+ font-size: var(--fs-md);
847
+ color: var(--ink-700);
848
+ cursor: pointer;
849
+ transition: background var(--t-fast);
850
+ text-decoration: none;
851
+ border: none;
852
+ background: transparent;
853
+ text-align: left;
854
+ width: 100%;
855
+ font-family: inherit;
856
+ }
857
+ .zk-user-menu-item:hover { background: var(--ink-50); }
858
+ .zk-user-menu-item .icon {
859
+ width: 18px; height: 18px;
860
+ color: var(--ink-400);
861
+ flex-shrink: 0;
862
+ display: inline-flex; align-items: center; justify-content: center;
863
+ }
864
+ .zk-user-menu-item .label { flex: 1; min-width: 0; }
865
+ .zk-user-menu-item .right {
866
+ color: var(--ink-400);
867
+ font-size: var(--fs-xs);
868
+ font-family: var(--font-mono);
869
+ display: inline-flex; align-items: center; gap: 6px;
870
+ }
871
+ .zk-user-menu-item.is-danger { color: var(--danger-700); }
872
+ .zk-user-menu-item.is-danger:hover { background: var(--danger-50); }
873
+ .zk-user-menu-item.is-brand .icon { color: var(--brand-500); }
874
+ .zk-user-menu-item .badge-off {
875
+ font-family: var(--font-mono);
876
+ font-size: var(--fs-2xs);
877
+ padding: 2px 6px;
878
+ border-radius: var(--r-xs);
879
+ background: var(--brand-50);
880
+ color: var(--brand-700);
881
+ font-weight: 600;
882
+ text-transform: uppercase;
883
+ letter-spacing: var(--ls-wider);
884
+ }
885
+
886
+ /* ---------- TOOLBAR DOCK (barra flutuante de icones) ----------
887
+ Uso: floating action dock. Icones circulares 32px em container r-lg
888
+ (nao pill 999px). Toggle pinado. Sem backdrop-blur.
889
+ Extensivel com Motion em React pra collapse animado. */
890
+
891
+ .zk-dock {
892
+ display: inline-flex;
893
+ align-items: center;
894
+ gap: 4px;
895
+ background: var(--surface);
896
+ border: 1px solid var(--line-200);
897
+ border-radius: var(--r-lg);
898
+ padding: 6px;
899
+ box-shadow: var(--shadow-md);
900
+ height: 44px;
901
+ font-family: var(--font-sans);
902
+ }
903
+ .zk-dock.dark {
904
+ background: var(--ink-800);
905
+ border-color: var(--ink-700);
906
+ color: var(--ink-50);
907
+ }
908
+ .zk-dock-btn {
909
+ position: relative;
910
+ width: 32px; height: 32px;
911
+ display: inline-flex; align-items: center; justify-content: center;
912
+ padding: 6px;
913
+ border-radius: var(--r-md);
914
+ background: transparent;
915
+ border: none;
916
+ color: inherit;
917
+ cursor: pointer;
918
+ transition: background var(--t-fast);
919
+ }
920
+ .zk-dock-btn:hover { background: var(--ink-50); }
921
+ .zk-dock.dark .zk-dock-btn:hover { background: rgba(255,255,255,0.08); }
922
+ .zk-dock-btn:focus-visible {
923
+ outline: none;
924
+ box-shadow: var(--ring-focus);
925
+ }
926
+ .zk-dock-btn svg { width: 18px; height: 18px; stroke: currentColor; stroke-width: 1.5; fill: none; }
927
+ .zk-dock-btn .dot {
928
+ position: absolute;
929
+ top: 4px; right: 4px;
930
+ width: 6px; height: 6px;
931
+ border-radius: 50%;
932
+ background: var(--brand-500);
933
+ border: 1.5px solid var(--surface);
934
+ }
935
+ .zk-dock.dark .zk-dock-btn .dot { border-color: var(--ink-800); }
936
+ .zk-dock-sep {
937
+ width: 1px; height: 20px;
938
+ background: var(--line-200);
939
+ margin: 0 2px;
940
+ flex-shrink: 0;
941
+ }
942
+ .zk-dock.dark .zk-dock-sep { background: var(--ink-700); }
943
+
944
+ /* ---------- CHART CARD (viz card com hover reveal) ----------
945
+ Uso: card 356px width com area de viz 180px em cima + body embaixo.
946
+ Barras SVG mudam de altura no hover (CSS transition). Sem gradient
947
+ colorido, sem drop-shadow-xl. Grid sutil hairline. */
948
+
949
+ .zk-chart-card {
950
+ position: relative;
951
+ width: 356px;
952
+ background: var(--surface);
953
+ border: 1px solid var(--line-200);
954
+ border-radius: var(--r-xl);
955
+ overflow: hidden;
956
+ box-shadow: var(--shadow-sm);
957
+ transition: box-shadow var(--t-base) var(--ease-out);
958
+ font-family: var(--font-sans);
959
+ }
960
+ .zk-chart-card:hover { box-shadow: var(--shadow-md); }
961
+
962
+ .zk-chart-card-viz {
963
+ position: relative;
964
+ height: 180px;
965
+ background: var(--paper);
966
+ overflow: hidden;
967
+ background-image:
968
+ linear-gradient(to right, var(--line-100) 1px, transparent 1px),
969
+ linear-gradient(to bottom, var(--line-100) 1px, transparent 1px);
970
+ background-size: 20px 20px;
971
+ -webkit-mask-image: radial-gradient(ellipse 60% 60% at 50% 50%, #000 60%, transparent 100%);
972
+ mask-image: radial-gradient(ellipse 60% 60% at 50% 50%, #000 60%, transparent 100%);
973
+ }
974
+ .zk-chart-card-viz svg {
975
+ position: absolute; inset: 0;
976
+ width: 100%; height: 100%;
977
+ overflow: visible;
978
+ }
979
+ .zk-chart-card-viz svg rect {
980
+ transition: y 400ms var(--ease-out), height 400ms var(--ease-out), fill 400ms var(--ease-out);
981
+ }
982
+ .zk-chart-card-viz .tags {
983
+ position: absolute;
984
+ top: 12px; left: 12px;
985
+ display: flex; gap: 6px;
986
+ z-index: 4;
987
+ transition: opacity var(--t-slow) var(--ease-out);
988
+ }
989
+ .zk-chart-card-viz .tag {
990
+ display: inline-flex; align-items: center; gap: 6px;
991
+ padding: 3px 8px;
992
+ border-radius: var(--r-sm);
993
+ background: var(--surface);
994
+ border: 1px solid var(--line-200);
995
+ font-size: var(--fs-2xs);
996
+ font-family: var(--font-mono);
997
+ color: var(--ink-600);
998
+ font-weight: 600;
999
+ }
1000
+ .zk-chart-card-viz .tag .dot {
1001
+ width: 6px; height: 6px; border-radius: 50%;
1002
+ }
1003
+ .zk-chart-card:hover .zk-chart-card-viz .tags { opacity: 0; }
1004
+
1005
+ .zk-chart-card-body {
1006
+ padding: 14px 16px 16px;
1007
+ border-top: 1px solid var(--line-200);
1008
+ display: flex; flex-direction: column; gap: 4px;
1009
+ position: relative;
1010
+ }
1011
+ .zk-chart-card-body .title {
1012
+ font-family: var(--font-display);
1013
+ font-size: var(--fs-lg);
1014
+ font-weight: 600;
1015
+ color: var(--ink-700);
1016
+ line-height: 1.15;
1017
+ letter-spacing: var(--ls-snug);
1018
+ }
1019
+ .zk-chart-card-body .desc {
1020
+ font-size: var(--fs-sm);
1021
+ color: var(--ink-400);
1022
+ line-height: 1.4;
1023
+ }
1024
+
1025
+ /* ---------- ORBIT CARD (KPI card com dots orbitais) ----------
1026
+ Uso: card KPI grande com 2 aneis de dots concentricos, valor total
1027
+ no centro, 2 sub-metricas embaixo, botao secondary full-width.
1028
+ ZARK: sem gradient colorido, sem shadow-lg exagerado. */
1029
+
1030
+ .zk-orbit-card {
1031
+ width: 320px;
1032
+ background: var(--surface);
1033
+ border: 1px solid var(--line-200);
1034
+ border-radius: var(--r-xl);
1035
+ overflow: hidden;
1036
+ box-shadow: var(--shadow-sm);
1037
+ font-family: var(--font-sans);
1038
+ }
1039
+ .zk-orbit-card-viz {
1040
+ position: relative;
1041
+ width: 100%;
1042
+ aspect-ratio: 1 / 0.85;
1043
+ overflow: hidden;
1044
+ background: var(--paper);
1045
+ }
1046
+ .zk-orbit-card-viz svg {
1047
+ position: absolute;
1048
+ inset: 0;
1049
+ width: 100%; height: 100%;
1050
+ }
1051
+ .zk-orbit-card-viz svg circle {
1052
+ opacity: 0.6;
1053
+ }
1054
+ .zk-orbit-card-viz .center {
1055
+ position: absolute;
1056
+ top: 32%; left: 50%;
1057
+ transform: translate(-50%, -50%);
1058
+ text-align: center;
1059
+ pointer-events: none;
1060
+ }
1061
+ .zk-orbit-card-viz .center .kicker {
1062
+ font-family: var(--font-mono);
1063
+ font-size: var(--fs-2xs);
1064
+ text-transform: uppercase;
1065
+ letter-spacing: var(--ls-widest);
1066
+ color: var(--ink-400);
1067
+ margin-bottom: 4px;
1068
+ }
1069
+ .zk-orbit-card-viz .center .value {
1070
+ font-family: var(--font-display);
1071
+ font-size: var(--fs-4xl);
1072
+ font-weight: 800;
1073
+ color: var(--ink-700);
1074
+ line-height: 1;
1075
+ letter-spacing: var(--ls-tight);
1076
+ }
1077
+ .zk-orbit-card-viz .fade {
1078
+ position: absolute;
1079
+ bottom: 0; left: 0; right: 0;
1080
+ height: 55%;
1081
+ background: linear-gradient(to bottom, transparent 0%, var(--surface) 70%);
1082
+ pointer-events: none;
1083
+ }
1084
+ .zk-orbit-card-body {
1085
+ padding: 0 20px 16px;
1086
+ margin-top: -32px;
1087
+ position: relative;
1088
+ z-index: 2;
1089
+ }
1090
+ .zk-orbit-card-metrics {
1091
+ display: flex;
1092
+ justify-content: space-between;
1093
+ gap: 12px;
1094
+ margin-bottom: 16px;
1095
+ }
1096
+ .zk-orbit-card-metric {
1097
+ display: flex; flex-direction: column; gap: 4px;
1098
+ }
1099
+ .zk-orbit-card-metric .head {
1100
+ display: flex; align-items: center; gap: 8px;
1101
+ }
1102
+ .zk-orbit-card-metric .bar {
1103
+ width: 2px; height: 14px; border-radius: 1px;
1104
+ }
1105
+ .zk-orbit-card-metric .label {
1106
+ font-size: var(--fs-sm);
1107
+ color: var(--ink-400);
1108
+ font-weight: 500;
1109
+ }
1110
+ .zk-orbit-card-metric .value {
1111
+ font-size: var(--fs-xl);
1112
+ font-weight: 700;
1113
+ color: var(--ink-700);
1114
+ font-family: var(--font-sans);
1115
+ }
1116
+ .zk-orbit-card-metric .delta {
1117
+ font-size: var(--fs-xs);
1118
+ font-family: var(--font-mono);
1119
+ color: var(--success-700);
1120
+ }
1121
+
1122
+ /* ---------- WHEEL PICKER (radial time picker) ----------
1123
+ Uso: input central + wheel de 8 wedges com atalhos de +/- tempo.
1124
+ Wheel aparece em hover. ZARK: sem pill 999px no input; usa r-md.
1125
+ Sem drop-shadow-xl; sombra warm sm/md. */
1126
+
1127
+ .zk-wheel-picker {
1128
+ position: relative;
1129
+ width: 340px; height: 340px;
1130
+ display: flex;
1131
+ align-items: center; justify-content: center;
1132
+ font-family: var(--font-sans);
1133
+ }
1134
+ .zk-wheel-picker-wheel {
1135
+ position: absolute;
1136
+ inset: 0;
1137
+ display: flex; align-items: center; justify-content: center;
1138
+ opacity: 0;
1139
+ transform: scale(0.9) rotate(-8deg);
1140
+ transform-origin: center;
1141
+ transition:
1142
+ opacity var(--t-slow) var(--ease-out),
1143
+ transform var(--t-slow) var(--ease-out);
1144
+ pointer-events: none;
1145
+ z-index: 10;
1146
+ }
1147
+ .zk-wheel-picker:hover .zk-wheel-picker-wheel {
1148
+ opacity: 1;
1149
+ transform: scale(1) rotate(0);
1150
+ pointer-events: auto;
1151
+ }
1152
+ .zk-wheel-picker-wheel svg { width: 100%; height: 100%; overflow: visible; }
1153
+ .zk-wheel-picker-wheel .wedge {
1154
+ fill: var(--surface);
1155
+ stroke: var(--paper);
1156
+ stroke-width: 3;
1157
+ cursor: pointer;
1158
+ transition: fill var(--t-fast) var(--ease-out);
1159
+ }
1160
+ .zk-wheel-picker-wheel .wedge:hover { fill: var(--ink-50); }
1161
+ .zk-wheel-picker-wheel .wedge.pos:hover { fill: var(--brand-50); }
1162
+ .zk-wheel-picker-wheel .wedge-label {
1163
+ font-family: var(--font-mono);
1164
+ font-size: 13px;
1165
+ font-weight: 700;
1166
+ pointer-events: none;
1167
+ fill: var(--ink-500);
1168
+ }
1169
+ .zk-wheel-picker-wheel .wedge-label.pos { fill: var(--brand-700); }
1170
+ .zk-wheel-picker-input {
1171
+ position: relative;
1172
+ z-index: 20;
1173
+ background: var(--surface);
1174
+ border: 1px solid var(--line-300);
1175
+ border-radius: var(--r-md);
1176
+ box-shadow: var(--shadow-sm);
1177
+ padding: 12px 20px;
1178
+ display: inline-flex;
1179
+ align-items: center;
1180
+ transition: box-shadow var(--t-fast) var(--ease-out), border-color var(--t-fast);
1181
+ }
1182
+ .zk-wheel-picker-input:focus-within {
1183
+ border-color: var(--brand-400);
1184
+ box-shadow: var(--ring-focus);
1185
+ }
1186
+ .zk-wheel-picker-input input {
1187
+ width: 112px;
1188
+ border: none;
1189
+ outline: none;
1190
+ background: transparent;
1191
+ font-family: var(--font-display);
1192
+ font-size: var(--fs-2xl);
1193
+ font-weight: 700;
1194
+ color: var(--ink-700);
1195
+ text-align: center;
1196
+ letter-spacing: var(--ls-snug);
1197
+ }
1198
+
1199
+ /* ---------- Advanced components · ANIMATIONS ---------- */
1200
+
1201
+ /* ChartCard: 13 barras com hover targets (bar-1 ... bar-13).
1202
+ Rest state fica no SVG (y/height inline como attrs). Hover state
1203
+ define y/height diferentes via CSS. Transition ja esta na regra
1204
+ base .zk-chart-card-viz svg rect. */
1205
+ .zk-chart-card:hover .bar-1 { y: 130; height: 20; fill: var(--viz-cat-1); }
1206
+ .zk-chart-card:hover .bar-2 { y: 130; height: 20; }
1207
+ .zk-chart-card:hover .bar-3 { y: 120; height: 30; }
1208
+ .zk-chart-card:hover .bar-4 { y: 100; height: 50; }
1209
+ .zk-chart-card:hover .bar-5 { y: 110; height: 40; fill: var(--viz-cat-1); }
1210
+ .zk-chart-card:hover .bar-6 { y: 120; height: 30; }
1211
+ .zk-chart-card:hover .bar-7 { y: 130; height: 20; }
1212
+ .zk-chart-card:hover .bar-8 { y: 110; height: 40; fill: var(--viz-cat-1); }
1213
+ .zk-chart-card:hover .bar-9 { y: 90; height: 60; }
1214
+ .zk-chart-card:hover .bar-10 { y: 80; height: 70; fill: var(--viz-cat-1); }
1215
+ .zk-chart-card:hover .bar-11 { y: 100; height: 40; }
1216
+ .zk-chart-card:hover .bar-12 { y: 70; height: 80; fill: var(--viz-cat-1); }
1217
+ .zk-chart-card:hover .bar-13 { y: 100; height: 50; fill: var(--viz-cat-1); }
1218
+
1219
+ /* Detalhe flutuante que aparece no hover (sobre a viz) */
1220
+ .zk-chart-card-detail {
1221
+ position: absolute;
1222
+ bottom: 12px;
1223
+ left: 50%;
1224
+ transform: translate(-50%, 12px);
1225
+ background: var(--surface);
1226
+ border: 1px solid var(--line-200);
1227
+ border-radius: var(--r-sm);
1228
+ padding: 8px 12px;
1229
+ box-shadow: var(--shadow-sm);
1230
+ opacity: 0;
1231
+ transition: opacity var(--t-slow) var(--ease-out), transform var(--t-slow) var(--ease-out);
1232
+ pointer-events: none;
1233
+ z-index: 6;
1234
+ min-width: 180px;
1235
+ }
1236
+ .zk-chart-card:hover .zk-chart-card-detail {
1237
+ opacity: 1;
1238
+ transform: translate(-50%, 0);
1239
+ }
1240
+ .zk-chart-card-detail .row { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); }
1241
+ .zk-chart-card-detail .row .dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
1242
+ .zk-chart-card-detail .row .label { color: var(--ink-700); font-weight: 500; }
1243
+ .zk-chart-card-detail .row .value { color: var(--ink-400); font-family: var(--font-mono); margin-left: auto; font-size: var(--fs-2xs); }
1244
+
1245
+ /* OrbitCard: fade-in dos dots ao entrar em view (load animation).
1246
+ Usa animation-delay via inline --i pra criar stagger de ripple. */
1247
+ .zk-orbit-card-viz circle {
1248
+ animation: zk-orbit-in 0.6s var(--ease-out) both;
1249
+ animation-delay: calc(var(--i, 0) * 15ms);
1250
+ transform-origin: center;
1251
+ transform-box: fill-box;
1252
+ }
1253
+ @keyframes zk-orbit-in {
1254
+ from { opacity: 0; transform: scale(0.3); }
1255
+ to { opacity: 0.6; transform: scale(1); }
1256
+ }
1257
+
1258
+ /* Center overlay (Total + valor) aparece depois dos dots */
1259
+ .zk-orbit-card-viz .center {
1260
+ animation: zk-orbit-center-in 0.5s var(--ease-out) 0.7s both;
1261
+ }
1262
+ @keyframes zk-orbit-center-in {
1263
+ from { opacity: 0; transform: translate(-50%, -40%); }
1264
+ to { opacity: 1; transform: translate(-50%, -50%); }
1265
+ }
1266
+
1267
+ /* Metrics slide up depois do centro */
1268
+ .zk-orbit-card-metric {
1269
+ animation: zk-orbit-metric-in 0.45s var(--ease-out) 1.05s both;
1270
+ }
1271
+ .zk-orbit-card-metric:nth-child(2) { animation-delay: 1.25s; }
1272
+ @keyframes zk-orbit-metric-in {
1273
+ from { opacity: 0; transform: translateY(12px); }
1274
+ to { opacity: 1; transform: translateY(0); }
1275
+ }
1276
+
1277
+ /* UserDropdown: mount animation da panel (fade + drop) */
1278
+ .zk-user-menu-panel {
1279
+ animation: zk-menu-in var(--t-base) var(--ease-out) both;
1280
+ transform-origin: top right;
1281
+ }
1282
+ @keyframes zk-menu-in {
1283
+ from { opacity: 0; transform: translateY(-6px) scale(0.98); }
1284
+ to { opacity: 1; transform: translateY(0) scale(1); }
1285
+ }
1286
+ /* Items do menu com hover state ja funciona; adiciona micro-slide no icone */
1287
+ .zk-user-menu-item .icon { transition: transform var(--t-fast) var(--ease-out); }
1288
+ .zk-user-menu-item:hover .icon { transform: translateX(2px); }
1289
+
1290
+ /* ToolbarDock: micro-scale no botao pressed */
1291
+ .zk-dock-btn { transition: background var(--t-fast), transform 90ms var(--ease-out); }
1292
+ .zk-dock-btn:active { transform: scale(0.92); }