zark-design 3.2.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.
@@ -1,4 +1,4 @@
1
- // App.example.jsx exemplo completo demonstrando o design system em uso.
1
+ // App.example.jsx · exemplo completo demonstrando o design system em uso.
2
2
  // Replique a estrutura no seu projeto. Lembre de importar tokens.css + components.css
3
3
  // no entry-point (main.jsx / App.jsx).
4
4
 
@@ -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); }