loading-state-zoo 0.2.0 → 0.4.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/dist/theme.css CHANGED
@@ -151,6 +151,84 @@
151
151
  transform: scale(var(--lz-ellipsis-min, 0.8));
152
152
  }
153
153
  }
154
+ @keyframes lz-orb-breathe {
155
+ 0%, 100% {
156
+ transform: scale(1);
157
+ opacity: 1;
158
+ }
159
+ 50% {
160
+ transform: scale(var(--lz-orb-scale, 1.16));
161
+ opacity: var(--lz-orb-fade, 0.88);
162
+ }
163
+ }
164
+ @keyframes lz-ios-glow {
165
+ 0%, 100% {
166
+ opacity: var(--lz-ios-fade, 0.2);
167
+ transform: scale(var(--lz-ios-min, 0.5));
168
+ }
169
+ 35% {
170
+ opacity: 1;
171
+ transform: scale(var(--lz-ios-peak, 1.25));
172
+ }
173
+ 50% {
174
+ opacity: 1;
175
+ transform: scale(var(--lz-ios-peak, 1.25));
176
+ }
177
+ }
178
+ @keyframes lz-ai-sparkle {
179
+ 0%, 100% {
180
+ opacity: 0;
181
+ transform: scale(0.1) rotate(0deg);
182
+ }
183
+ 20% {
184
+ opacity: 1;
185
+ transform: scale(1) rotate(8deg);
186
+ }
187
+ 45% {
188
+ opacity: 0;
189
+ transform: scale(1.35) rotate(14deg);
190
+ }
191
+ }
192
+ @keyframes lz-waveform {
193
+ 0%, 100% {
194
+ transform: scaleY(var(--lz-wf-min, 0.22));
195
+ }
196
+ 50% {
197
+ transform: scaleY(1);
198
+ }
199
+ }
200
+ @keyframes lz-sonar-ring {
201
+ 0% {
202
+ transform: scale(0.18);
203
+ opacity: var(--lz-sonar-fade, 0.9);
204
+ }
205
+ 100% {
206
+ transform: scale(1);
207
+ opacity: 0;
208
+ }
209
+ }
210
+ @keyframes lz-note-bob {
211
+ 0%, 100% {
212
+ transform: translateY(0);
213
+ }
214
+ 45% {
215
+ transform: translateY(var(--lz-note-bob, 0.35em));
216
+ }
217
+ 60% {
218
+ transform: rotate(4deg) translateY(var(--lz-note-bob, 0.35em));
219
+ }
220
+ 75% {
221
+ transform: rotate(-4deg) translateY(var(--lz-note-bob, 0.35em));
222
+ }
223
+ }
224
+ @keyframes lz-needle-bob {
225
+ 0%, 100% {
226
+ transform: rotate(22deg);
227
+ }
228
+ 50% {
229
+ transform: rotate(27deg);
230
+ }
231
+ }
154
232
  .lz-bouncing-dots {
155
233
  display: flex;
156
234
  gap: 0.7em;
@@ -306,20 +384,57 @@
306
384
  border-radius: 50%;
307
385
  border: 1px solid var(--lz-track, rgba(255, 255, 255, 0.12));
308
386
  }
387
+ .lz-scan-sweep .lz-dial {
388
+ position: absolute;
389
+ inset: 0.075em;
390
+ border-radius: 50%;
391
+ border: 1px dashed rgba(255, 255, 255, 0.1);
392
+ animation: lz-spin-reverse calc(10s * var(--lz-speed, 1)) linear infinite;
393
+ }
309
394
  .lz-scan-sweep .lz-ring-inner {
310
395
  position: absolute;
311
- inset: 0.28em;
396
+ inset: 0.27em;
312
397
  border-radius: 50%;
313
398
  border: 1px solid var(--lz-track-weak, rgba(255, 255, 255, 0.08));
314
399
  }
315
- .lz-scan-sweep .lz-core {
400
+ .lz-scan-sweep .lz-tick-slot {
316
401
  position: absolute;
317
- width: 0.14em;
402
+ left: 50%;
403
+ top: 50%;
404
+ width: 0;
405
+ height: 0;
406
+ }
407
+ .lz-scan-sweep .lz-tick {
408
+ position: absolute;
409
+ left: -0.025em;
410
+ top: 0;
411
+ width: 0.05em;
318
412
  height: 0.14em;
319
- left: 0.43em;
320
- top: 0.43em;
413
+ border-radius: 1px;
414
+ background: var(--lz-color-weak, rgba(245, 245, 247, 0.8));
415
+ }
416
+ .lz-scan-sweep .lz-tick.short {
417
+ height: 0.09em;
418
+ }
419
+ .lz-scan-sweep .lz-core-ring {
420
+ position: absolute;
421
+ left: 50%;
422
+ top: 50%;
423
+ width: 0.26em;
424
+ height: 0.26em;
425
+ margin: -0.13em 0 0 -0.13em;
426
+ border-radius: 50%;
427
+ border: 1px solid var(--lz-track-weak, rgba(255, 255, 255, 0.08));
428
+ }
429
+ .lz-scan-sweep .lz-core {
430
+ position: absolute;
431
+ width: 0.1em;
432
+ height: 0.1em;
433
+ left: 0.45em;
434
+ top: 0.45em;
321
435
  border-radius: 50%;
322
436
  background: var(--lz-color-weak, rgba(245, 245, 247, 0.8));
437
+ box-shadow: 0 0 0.18em 0.03em color-mix(in srgb, var(--lz-color, #f5f5f7) 45%, transparent);
323
438
  }
324
439
  .lz-scan-sweep .lz-sweep {
325
440
  position: absolute;
@@ -329,12 +444,34 @@
329
444
  conic-gradient(
330
445
  from 0deg,
331
446
  var(--lz-color, #f5f5f7) 0deg,
332
- var(--lz-color-sweep, rgba(245, 245, 247, 0.08)) 60deg,
333
- transparent 90deg);
447
+ var(--lz-color-sweep, rgba(245, 245, 247, 0.08)) 8deg,
448
+ color-mix(in srgb, var(--lz-color, #f5f5f7) 5%, transparent) 55deg,
449
+ transparent 95deg);
334
450
  -webkit-mask: radial-gradient(closest-side, #000 100%);
335
451
  mask: radial-gradient(closest-side, #000 100%);
336
452
  animation: lz-spin calc(2.5s * var(--lz-speed, 1)) linear infinite;
337
453
  }
454
+ .lz-scan-sweep .lz-sweep-edge {
455
+ position: absolute;
456
+ inset: 0;
457
+ border-radius: 50%;
458
+ background:
459
+ conic-gradient(
460
+ from 0deg,
461
+ var(--lz-color, #f5f5f7) 0deg,
462
+ transparent 5deg);
463
+ -webkit-mask:
464
+ radial-gradient(
465
+ farthest-side,
466
+ transparent calc(100% - 0.07em),
467
+ #000 calc(100% - 0.07em));
468
+ mask:
469
+ radial-gradient(
470
+ farthest-side,
471
+ transparent calc(100% - 0.07em),
472
+ #000 calc(100% - 0.07em));
473
+ animation: lz-spin calc(2.5s * var(--lz-speed, 1)) linear infinite;
474
+ }
338
475
  .lz-orbit-dots {
339
476
  position: relative;
340
477
  width: var(--lz-size, 44px);
@@ -665,3 +802,414 @@
665
802
  transparent);
666
803
  animation: lz-skeleton-sheen calc(1.4s * var(--lz-speed, 1)) linear infinite;
667
804
  }
805
+ .lz-ios-27-orb {
806
+ position: relative;
807
+ width: var(--lz-size, 44px);
808
+ height: var(--lz-size, 44px);
809
+ }
810
+ .lz-ios-27-orb .lz-slot {
811
+ position: absolute;
812
+ left: 50%;
813
+ top: 50%;
814
+ width: 0;
815
+ height: 0;
816
+ }
817
+ .lz-ios-27-orb .lz-dot {
818
+ position: absolute;
819
+ border-radius: 50%;
820
+ background: currentColor;
821
+ box-shadow: 0 0 0.12em 0.05em currentColor;
822
+ animation: lz-ios-glow calc(3.2s * var(--lz-speed, 1)) ease-in-out infinite;
823
+ }
824
+ .lz-ai-orb {
825
+ position: relative;
826
+ width: var(--lz-size, 44px);
827
+ height: var(--lz-size, 44px);
828
+ }
829
+ .lz-ai-orb .lz-orb {
830
+ position: absolute;
831
+ inset: 0.08em;
832
+ border-radius: 50%;
833
+ background:
834
+ radial-gradient(
835
+ circle at 34% 32%,
836
+ color-mix(in srgb, var(--lz-accent, #0a84ff) 18%, white) 0%,
837
+ var(--lz-accent, #0a84ff) 40%,
838
+ color-mix(in srgb, var(--lz-accent, #0a84ff) 45%, transparent) 74%,
839
+ transparent 100%);
840
+ box-shadow: 0 0 0.5em color-mix(in srgb, var(--lz-accent, #0a84ff) 35%, transparent);
841
+ animation: lz-orb-breathe calc(2.4s * var(--lz-speed, 1)) ease-in-out infinite;
842
+ }
843
+ .lz-ai-orb .lz-orbit {
844
+ position: absolute;
845
+ inset: 0;
846
+ animation: lz-spin calc(4.5s * var(--lz-speed, 1)) linear infinite;
847
+ }
848
+ .lz-ai-orb .lz-light {
849
+ position: absolute;
850
+ left: 50%;
851
+ top: calc(50% - 0.46em);
852
+ width: 0.13em;
853
+ height: 0.13em;
854
+ margin-left: -0.065em;
855
+ border-radius: 50%;
856
+ background: var(--lz-color, #f5f5f7);
857
+ box-shadow: 0 0 0.22em 0.05em color-mix(in srgb, var(--lz-color, #f5f5f7) 55%, transparent);
858
+ animation: lz-pulse-breath calc(1.1s * var(--lz-speed, 1)) ease-in-out infinite;
859
+ }
860
+ .lz-ai-orb .lz-sparkle {
861
+ position: absolute;
862
+ width: 0.28em;
863
+ height: 0.28em;
864
+ animation: lz-ai-sparkle calc(3s * var(--lz-speed, 1)) ease-in-out infinite;
865
+ }
866
+ .lz-ai-orb .lz-sparkle::before,
867
+ .lz-ai-orb .lz-sparkle::after {
868
+ content: "";
869
+ position: absolute;
870
+ inset: 0;
871
+ background: var(--lz-color, #f5f5f7);
872
+ }
873
+ .lz-ai-orb .lz-sparkle::before {
874
+ clip-path: polygon(50% 0, 58% 50%, 50% 100%, 42% 50%);
875
+ }
876
+ .lz-ai-orb .lz-sparkle::after {
877
+ clip-path: polygon(50% 0, 58% 50%, 50% 100%, 42% 50%);
878
+ transform: rotate(90deg);
879
+ }
880
+ .lz-ai-orb .lz-sparkle.a {
881
+ right: 0.01em;
882
+ top: -0.01em;
883
+ }
884
+ .lz-ai-orb .lz-sparkle.b {
885
+ left: -0.01em;
886
+ bottom: 0.02em;
887
+ animation-delay: -1.5s;
888
+ }
889
+ .lz-ai-thinking {
890
+ position: relative;
891
+ width: 2.1em;
892
+ height: 0.66em;
893
+ font-size: var(--lz-size, 40px);
894
+ }
895
+ .lz-ai-thinking .lz-field {
896
+ position: absolute;
897
+ inset: 0;
898
+ display: flex;
899
+ align-items: center;
900
+ justify-content: center;
901
+ gap: 0.32em;
902
+ border-radius: 999px;
903
+ background: var(--lz-surface, rgba(255, 255, 255, 0.07));
904
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--lz-color, #f5f5f7) 12%, transparent);
905
+ }
906
+ .lz-ai-thinking .lz-dot {
907
+ width: 0.16em;
908
+ height: 0.16em;
909
+ border-radius: 50%;
910
+ background: var(--lz-color, #f5f5f7);
911
+ animation: lz-typing-pulse calc(1s * var(--lz-speed, 1)) cubic-bezier(0.28, 0.1, 0.25, 1.15) infinite;
912
+ }
913
+ .lz-ai-thinking .lz-field .lz-dot:nth-child(2) {
914
+ animation-delay: -0.2s;
915
+ }
916
+ .lz-ai-thinking .lz-field .lz-dot:nth-child(3) {
917
+ animation-delay: -0.4s;
918
+ }
919
+ .lz-ai-thinking .lz-aura {
920
+ position: absolute;
921
+ inset: -0.16em;
922
+ border-radius: 999px;
923
+ border: 2px solid transparent;
924
+ background:
925
+ conic-gradient(
926
+ from 0deg,
927
+ transparent 0deg,
928
+ var(--lz-accent, #0a84ff) 8deg,
929
+ color-mix(in srgb, var(--lz-accent, #0a84ff) 30%, transparent) 34deg,
930
+ transparent 92deg) border-box;
931
+ -webkit-mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0);
932
+ -webkit-mask-composite: xor;
933
+ -webkit-mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0);
934
+ mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0);
935
+ -webkit-mask-composite: xor;
936
+ mask-composite: exclude;
937
+ animation: lz-spin calc(1.9s * var(--lz-speed, 1)) linear infinite;
938
+ }
939
+ .lz-ai-neural {
940
+ display: grid;
941
+ grid-template-columns: repeat(5, 1em);
942
+ gap: var(--lz-grid-gap, 10px);
943
+ font-size: var(--lz-size, 6px);
944
+ }
945
+ .lz-ai-neural .lz-dot {
946
+ width: 1em;
947
+ height: 1em;
948
+ border-radius: 50%;
949
+ animation: lz-grid-dot-wave calc(1.5s * var(--lz-speed, 1)) cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite;
950
+ }
951
+ .lz-waveform {
952
+ display: flex;
953
+ align-items: center;
954
+ gap: var(--lz-gap, 4px);
955
+ }
956
+ .lz-waveform .lz-bar {
957
+ width: var(--lz-bar-width, 4px);
958
+ height: var(--lz-size, 32px);
959
+ border-radius: 2px;
960
+ transform-origin: center;
961
+ background: var(--lz-color, #f5f5f7);
962
+ animation: lz-waveform calc(1.6s * var(--lz-speed, 1)) ease-in-out infinite;
963
+ }
964
+ .lz-waveform .lz-bar.accent {
965
+ background: var(--lz-accent, #0a84ff);
966
+ }
967
+ .lz-vinyl {
968
+ position: relative;
969
+ width: 2.2em;
970
+ height: 2.2em;
971
+ font-size: var(--lz-size, 48px);
972
+ }
973
+ .lz-vinyl .lz-disc {
974
+ position: absolute;
975
+ inset: 0;
976
+ border-radius: 50%;
977
+ overflow: hidden;
978
+ background:
979
+ repeating-radial-gradient(
980
+ circle at 50% 50%,
981
+ rgba(255, 255, 255, 0.055) 0 1px,
982
+ transparent 1px 4px),
983
+ radial-gradient(
984
+ circle at 50% 50%,
985
+ rgba(255, 255, 255, 0.05) 0 17%,
986
+ rgba(0, 0, 0, 0.22) 17% 18%,
987
+ transparent 18% 20%,
988
+ rgba(255, 255, 255, 0.045) 20% 21%,
989
+ transparent 21% 100%),
990
+ radial-gradient(circle at 50% 50%, #141216 0 100%);
991
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
992
+ animation: lz-spin calc(3.2s * var(--lz-speed, 1)) linear infinite;
993
+ }
994
+ .lz-vinyl .lz-disc::before {
995
+ content: "";
996
+ position: absolute;
997
+ inset: 0;
998
+ border-radius: 50%;
999
+ background:
1000
+ linear-gradient(
1001
+ 112deg,
1002
+ transparent 26%,
1003
+ rgba(255, 255, 255, 0.17) 40%,
1004
+ rgba(255, 255, 255, 0.04) 49%,
1005
+ transparent 62%);
1006
+ }
1007
+ .lz-vinyl .lz-label {
1008
+ position: absolute;
1009
+ left: 50%;
1010
+ top: 50%;
1011
+ width: 0.5em;
1012
+ height: 0.5em;
1013
+ margin: -0.25em 0 0 -0.25em;
1014
+ border-radius: 50%;
1015
+ background:
1016
+ radial-gradient(
1017
+ circle at 36% 30%,
1018
+ rgba(255, 255, 255, 0.35) 0 5%,
1019
+ transparent 6%),
1020
+ radial-gradient(
1021
+ circle at 63% 68%,
1022
+ rgba(0, 0, 0, 0.4) 0 7%,
1023
+ transparent 8%),
1024
+ var(--lz-accent, #0a84ff);
1025
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.4);
1026
+ }
1027
+ .lz-vinyl .lz-spindle {
1028
+ position: absolute;
1029
+ left: 50%;
1030
+ top: 50%;
1031
+ width: 0.09em;
1032
+ height: 0.09em;
1033
+ margin: -0.045em 0 0 -0.045em;
1034
+ border-radius: 50%;
1035
+ background: rgba(0, 0, 0, 0.9);
1036
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.35);
1037
+ }
1038
+ .lz-vinyl .lz-arm {
1039
+ position: absolute;
1040
+ top: 0.05em;
1041
+ right: 0.06em;
1042
+ width: 0.8em;
1043
+ height: 0.8em;
1044
+ transform-origin: top right;
1045
+ animation: lz-needle-bob calc(1.8s * var(--lz-speed, 1)) ease-in-out infinite;
1046
+ }
1047
+ .lz-vinyl .lz-post {
1048
+ position: absolute;
1049
+ right: -0.01em;
1050
+ top: -0.01em;
1051
+ width: 0.13em;
1052
+ height: 0.13em;
1053
+ border-radius: 50%;
1054
+ background:
1055
+ radial-gradient(
1056
+ circle at 35% 30%,
1057
+ var(--lz-color, #f5f5f7) 0 42%,
1058
+ color-mix(in srgb, var(--lz-color, #f5f5f7) 45%, transparent) 100%);
1059
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.3);
1060
+ }
1061
+ .lz-vinyl .lz-shaft {
1062
+ position: absolute;
1063
+ right: 0.045em;
1064
+ top: 0.02em;
1065
+ width: 0.06em;
1066
+ height: 0.48em;
1067
+ border-radius: 3px;
1068
+ background: linear-gradient(var(--lz-color, #f5f5f7), color-mix(in srgb, var(--lz-color, #f5f5f7) 35%, transparent));
1069
+ box-shadow: inset 0 0 0 0.5px rgba(0, 0, 0, 0.25);
1070
+ transform-origin: top center;
1071
+ transform: rotate(24deg);
1072
+ }
1073
+ .lz-vinyl .lz-shaft::before {
1074
+ content: "";
1075
+ position: absolute;
1076
+ top: -0.035em;
1077
+ left: -0.04em;
1078
+ width: 0.14em;
1079
+ height: 0.14em;
1080
+ border-radius: 50%;
1081
+ background: var(--lz-color, #f5f5f7);
1082
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.25);
1083
+ }
1084
+ .lz-vinyl .lz-shaft::after {
1085
+ content: "";
1086
+ position: absolute;
1087
+ bottom: -0.05em;
1088
+ left: 0.005em;
1089
+ width: 0.05em;
1090
+ height: 0.1em;
1091
+ border-radius: 0 0 3px 3px;
1092
+ background: color-mix(in srgb, var(--lz-accent, #0a84ff) 75%, white);
1093
+ }
1094
+ .lz-sonar {
1095
+ position: relative;
1096
+ width: var(--lz-size, 44px);
1097
+ height: var(--lz-size, 44px);
1098
+ }
1099
+ .lz-sonar .lz-core {
1100
+ position: absolute;
1101
+ left: 50%;
1102
+ top: 50%;
1103
+ width: 0.18em;
1104
+ height: 0.18em;
1105
+ margin: -0.09em 0 0 -0.09em;
1106
+ border-radius: 50%;
1107
+ background: var(--lz-color, #f5f5f7);
1108
+ box-shadow: 0 0 calc(0.2em) color-mix(in srgb, var(--lz-color, #f5f5f7) 50%, transparent);
1109
+ }
1110
+ .lz-sonar .lz-ring {
1111
+ position: absolute;
1112
+ inset: 0.14em;
1113
+ border-radius: 50%;
1114
+ border: 1px solid var(--lz-accent, #0a84ff);
1115
+ animation: lz-sonar-ring calc(3.6s * var(--lz-speed, 1)) cubic-bezier(0.2, 0.6, 0.35, 1) infinite;
1116
+ }
1117
+ .lz-sonar .lz-ring:nth-child(2) {
1118
+ animation-delay: -1.2s;
1119
+ }
1120
+ .lz-sonar .lz-ring:nth-child(3) {
1121
+ animation-delay: -2.4s;
1122
+ }
1123
+ .lz-sonar .lz-ring:nth-child(4) {
1124
+ animation-delay: -0.9s;
1125
+ }
1126
+ .lz-music-note {
1127
+ display: flex;
1128
+ align-items: center;
1129
+ gap: 0.5em;
1130
+ font-size: var(--lz-size, 32px);
1131
+ line-height: 1;
1132
+ }
1133
+ .lz-music-note .lz-note {
1134
+ position: relative;
1135
+ display: inline-block;
1136
+ width: 0.42em;
1137
+ height: 0.88em;
1138
+ animation: lz-note-bob calc(1.4s * var(--lz-speed, 1)) ease-in-out infinite;
1139
+ }
1140
+ .lz-music-note .lz-head {
1141
+ position: absolute;
1142
+ left: 0;
1143
+ bottom: 0.06em;
1144
+ width: 0.3em;
1145
+ height: 0.24em;
1146
+ border-radius: 55% 45% 50% 50%;
1147
+ background: var(--lz-color, #f5f5f7);
1148
+ box-shadow: inset -0.045em -0.02em 0 color-mix(in srgb, var(--lz-color, #f5f5f7) 55%, #000);
1149
+ transform: rotate(-18deg);
1150
+ }
1151
+ .lz-music-note .lz-stem {
1152
+ position: absolute;
1153
+ left: 0.175em;
1154
+ bottom: 0.13em;
1155
+ width: 0.045em;
1156
+ height: 0.6em;
1157
+ border-radius: 2px;
1158
+ background: var(--lz-color, #f5f5f7);
1159
+ }
1160
+ .lz-music-note .lz-flag {
1161
+ position: absolute;
1162
+ left: 0.22em;
1163
+ bottom: 0.61em;
1164
+ width: 0.24em;
1165
+ height: 0.2em;
1166
+ border: 0.045em solid var(--lz-color, #f5f5f7);
1167
+ border-left: none;
1168
+ border-top: none;
1169
+ border-radius: 0 0 0.14em 0.02em / 0 0 0.26em 0.02em;
1170
+ }
1171
+ .lz-music-note .lz-note.second .lz-head {
1172
+ background: color-mix(in srgb, var(--lz-color, #f5f5f7) 45%, var(--lz-accent, #0a84ff));
1173
+ }
1174
+ .lz-activity-rings {
1175
+ width: var(--lz-size, 44px);
1176
+ height: var(--lz-size, 44px);
1177
+ }
1178
+ .lz-activity-rings svg {
1179
+ width: 100%;
1180
+ height: 100%;
1181
+ display: block;
1182
+ }
1183
+ .lz-activity-rings .lz-g {
1184
+ animation: lz-spin calc(2.8s * var(--lz-speed, 1)) linear infinite;
1185
+ transform-origin: center;
1186
+ }
1187
+ .lz-activity-rings .lz-g.mid {
1188
+ animation-duration: calc(3.6s * var(--lz-speed, 1));
1189
+ animation-direction: reverse;
1190
+ }
1191
+ .lz-activity-rings .lz-g.inner {
1192
+ animation-duration: calc(2.1s * var(--lz-speed, 1));
1193
+ }
1194
+ .lz-activity-rings .lz-track {
1195
+ fill: none;
1196
+ stroke: var(--lz-track, rgba(255, 255, 255, 0.08));
1197
+ stroke-width: 5;
1198
+ }
1199
+ .lz-activity-rings .lz-ring {
1200
+ fill: none;
1201
+ stroke-linecap: round;
1202
+ stroke-width: 5;
1203
+ }
1204
+ .lz-activity-rings .lz-outer {
1205
+ stroke: var(--lz-accent, #fa114f);
1206
+ stroke-dasharray: 209 58;
1207
+ }
1208
+ .lz-activity-rings .lz-mid {
1209
+ stroke: var(--lz-color, #30d158);
1210
+ stroke-dasharray: 169 48;
1211
+ }
1212
+ .lz-activity-rings .lz-inner {
1213
+ stroke: var(--lz-color-weak, #32d7ff);
1214
+ stroke-dasharray: 128 39;
1215
+ }
package/docs/AI.md CHANGED
@@ -5,8 +5,8 @@
5
5
  ## Package identity
6
6
 
7
7
  - Package name: `loading-state-zoo`
8
- - Version: `0.1.0`
9
- - 17 loading-pattern UI components. All are *web components* (custom elements) with a thin React wrapper plus a standalone CSS theme.
8
+ - Version: `0.4.0`
9
+ - 30 loading-pattern UI components. All are *web components* (custom elements) with a thin React wrapper plus a standalone CSS theme.
10
10
  - License: MIT. No data collection of any kind.
11
11
 
12
12
  ## Entry points (exact import strings)
@@ -38,17 +38,27 @@
38
38
  - Dots: dot diameter (default 8 → Helix/Grid 6).
39
39
  - Spinners/shapes: the square bounding box (default 44 → Breathing 36).
40
40
  - Bars/skeletons: use `width` + `height` instead (Indeterminate 160×6, Skeleton 120×28), Equalizer uses `size` = bar height (22).
41
- 7. **Progress ring is static** (driven by `percent` 0–100, clamped; `role="progressbar"` with live `aria-valuenow`). It does not animate by itself.
41
+ 7. **Progress ring and progress bar are static** (driven by `percent` 0–100, clamped; `role="progressbar"` with live `aria-valuenow`). They do not animate by themselves.
42
42
 
43
- ## Component registry (17)
43
+ ## Component registry (30)
44
44
 
45
- Dots: `lz-bouncing-dots`, `lz-typing-dots`, `lz-wave-dots`, `lz-helix-dots`, `lz-dot-grid-wave`
46
- Spinners: `lz-arc-spinner`, `lz-material-double-arc`, `lz-scan-sweep`, `lz-orbit-dots`, `lz-orbit-ring-dots`
45
+ Dots: `lz-bouncing-dots`, `lz-typing-dots`, `lz-wave-dots`, `lz-helix-dots`, `lz-dot-grid-wave`, `lz-ellipsis`
46
+ Spinners: `lz-arc-spinner`, `lz-material-double-arc`, `lz-scan-sweep`, `lz-orbit-dots`, `lz-orbit-ring-dots`, `lz-sonar`
47
+ Orbs: `lz-ios-27-orb`
48
+ AI: `lz-ai-orb`, `lz-ai-thinking`, `lz-ai-neural`
47
49
  Shapes: `lz-eyes`, `lz-morphing-square`, `lz-breathing-pulse`
48
- Bars & rings: `lz-equalizer`, `lz-progress-ring`, `lz-indeterminate-progress-bar`
49
- Skeletons: `lz-skeleton-shimmer`
50
+ Bars & rings: `lz-equalizer`, `lz-progress-ring`, `lz-progress-bar`, `lz-indeterminate-progress-bar`, `lz-activity-rings`
51
+ Music: `lz-waveform`, `lz-vinyl`, `lz-music-note`
52
+ Skeletons: `lz-skeleton-shimmer`, `lz-skeleton-card`, `lz-skeleton-list`
50
53
 
51
- Every element: shadow DOM (`mode:"open"`), inline `<style>` per element (shared keyframes string), geometry in `em` relative to host `font-size: var(--lz-size, 44px)`.
54
+ Every element: shadow DOM (`mode:"open"`), inline `<style>` per element (shared keyframes string), geometry in `em` relative to host `font-size: var(--lz-size, 44px)`. Sized elements (progress bars, skeletons) take explicit `width`/`height` instead. New families:
55
+
56
+ - **`lz-ios-27-orb`** renders exactly 27 dots (14 outer + 8 mid + 4 inner + 1 center) wired into a ring/spiral layout. The bright glow travels dot-to-dot (per-dot `lz-ios-glow`, negative delays `-(idx/27)*3.2s`). Dot color mixes between `--lz-color` (cool pole) and `--lz-accent` (warm pole) by angle. Geometry uses inline absolute positioning (`left`/`top` in em, negative margins) so the animated `transform`/`opacity` effects are never overridden. No `count` attribute — 27 is fixed.
57
+ - **AI patterns:** `lz-ai-orb` (breathing gradient sphere + orbiting light dot + sparkles), `lz-ai-thinking` (pill field with typing dots + rotating conic-gradient ring via `mask-composite: exclude`), `lz-ai-neural` (dot grid like `lz-dot-grid-wave` but with a diagonal wave, delays `-(r+c)*0.12s`; details: alternating checking/resting dots via `color-mix` of `--lz-accent` and `--lz-color`).
58
+ - **Orbs** now only `lz-ios-27-orb`: `accent` + `color` pick the two hue poles; `--lz-ios-fade`/`--lz-ios-min`/`--lz-ios-peak` tune the glow.
59
+ - **`lz-sonar`** moved to the Spinners family (radar use).
60
+ - **Music** patterns: `lz-waveform` (`count`, `bar-width`, `gap`), `lz-vinyl` (label/spindle/sheen rotate with the disc; `accent` = label/stylus, `color` = tonearm), `lz-music-note` (drawn note = head + stem + flag, `count` notes).
61
+ - **`lz-activity-rings`** is SVG-based (role `img`), defaults to Apple watch hues: outer `accent` `#fa114f`, middle `color` `#30d158`, inner `color-weak` `#32d7ff`; three rings rotate via `lz-spin` / reverse at distinct durations.
52
62
 
53
63
  ## Minimal valid usage
54
64