loading-state-zoo 0.4.0 → 0.4.1

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
@@ -161,34 +161,6 @@
161
161
  opacity: var(--lz-orb-fade, 0.88);
162
162
  }
163
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
164
  @keyframes lz-waveform {
193
165
  0%, 100% {
194
166
  transform: scaleY(var(--lz-wf-min, 0.22));
@@ -389,7 +361,7 @@
389
361
  inset: 0.075em;
390
362
  border-radius: 50%;
391
363
  border: 1px dashed rgba(255, 255, 255, 0.1);
392
- animation: lz-spin-reverse calc(10s * var(--lz-speed, 1)) linear infinite;
364
+ animation: lz-spin-reverse calc(12s * var(--lz-speed, 1)) linear infinite;
393
365
  }
394
366
  .lz-scan-sweep .lz-ring-inner {
395
367
  position: absolute;
@@ -449,7 +421,7 @@
449
421
  transparent 95deg);
450
422
  -webkit-mask: radial-gradient(closest-side, #000 100%);
451
423
  mask: radial-gradient(closest-side, #000 100%);
452
- animation: lz-spin calc(2.5s * var(--lz-speed, 1)) linear infinite;
424
+ animation: lz-spin calc(4s * var(--lz-speed, 1)) linear infinite;
453
425
  }
454
426
  .lz-scan-sweep .lz-sweep-edge {
455
427
  position: absolute;
@@ -470,7 +442,7 @@
470
442
  farthest-side,
471
443
  transparent calc(100% - 0.07em),
472
444
  #000 calc(100% - 0.07em));
473
- animation: lz-spin calc(2.5s * var(--lz-speed, 1)) linear infinite;
445
+ animation: lz-spin calc(4s * var(--lz-speed, 1)) linear infinite;
474
446
  }
475
447
  .lz-orbit-dots {
476
448
  position: relative;
@@ -802,152 +774,6 @@
802
774
  transparent);
803
775
  animation: lz-skeleton-sheen calc(1.4s * var(--lz-speed, 1)) linear infinite;
804
776
  }
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
777
  .lz-waveform {
952
778
  display: flex;
953
779
  align-items: center;
@@ -989,7 +815,7 @@
989
815
  transparent 21% 100%),
990
816
  radial-gradient(circle at 50% 50%, #141216 0 100%);
991
817
  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;
818
+ animation: lz-spin calc(7s * var(--lz-speed, 1)) linear infinite;
993
819
  }
994
820
  .lz-vinyl .lz-disc::before {
995
821
  content: "";
@@ -1042,7 +868,7 @@
1042
868
  width: 0.8em;
1043
869
  height: 0.8em;
1044
870
  transform-origin: top right;
1045
- animation: lz-needle-bob calc(1.8s * var(--lz-speed, 1)) ease-in-out infinite;
871
+ animation: lz-needle-bob calc(2.4s * var(--lz-speed, 1)) ease-in-out infinite;
1046
872
  }
1047
873
  .lz-vinyl .lz-post {
1048
874
  position: absolute;
package/docs/AI.md CHANGED
@@ -5,9 +5,10 @@
5
5
  ## Package identity
6
6
 
7
7
  - Package name: `loading-state-zoo`
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.
8
+ - Version: `0.4.1`
9
+ - 26 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
+ - **Recommended production version:** `^0.4.1` is the stable line; use it for production installs.
11
12
 
12
13
  ## Entry points (exact import strings)
13
14
 
@@ -40,24 +41,20 @@
40
41
  - Bars/skeletons: use `width` + `height` instead (Indeterminate 160×6, Skeleton 120×28), Equalizer uses `size` = bar height (22).
41
42
  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
43
 
43
- ## Component registry (30)
44
+ ## Component registry (26)
44
45
 
45
46
  Dots: `lz-bouncing-dots`, `lz-typing-dots`, `lz-wave-dots`, `lz-helix-dots`, `lz-dot-grid-wave`, `lz-ellipsis`
46
47
  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`
49
48
  Shapes: `lz-eyes`, `lz-morphing-square`, `lz-breathing-pulse`
50
49
  Bars & rings: `lz-equalizer`, `lz-progress-ring`, `lz-progress-bar`, `lz-indeterminate-progress-bar`, `lz-activity-rings`
51
50
  Music: `lz-waveform`, `lz-vinyl`, `lz-music-note`
52
51
  Skeletons: `lz-skeleton-shimmer`, `lz-skeleton-card`, `lz-skeleton-list`
53
52
 
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:
53
+ 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. Family notes:
55
54
 
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).
55
+ - **`lz-sonar`** lives in the Spinners family (radar use).
56
+ - **Music** patterns: `lz-waveform` (`count`, `bar-width`, `gap`), `lz-vinyl` (label/spindle/sheen rotate with a slow-spinning disc; `accent` = label/stylus, `color` = tonearm — disc spins over 7s so the motion reads as a record turning, not a blur), `lz-music-note` (drawn note = head + stem + flag, `count` notes).
57
+ - **`lz-scan-sweep`** radar sweep rotates over 4s (dial counter-rotates over 12s). Slower means calmer — the sweep stays legible instead of whipping round.
61
58
  - **`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.
62
59
 
63
60
  ## Minimal valid usage