loading-state-zoo 0.3.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/docs/AI.md CHANGED
@@ -5,8 +5,8 @@
5
5
  ## Package identity
6
6
 
7
7
  - Package name: `loading-state-zoo`
8
- - Version: `0.3.0`
9
- - 32 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)
@@ -40,24 +40,26 @@
40
40
  - Bars/skeletons: use `width` + `height` instead (Indeterminate 160×6, Skeleton 120×28), Equalizer uses `size` = bar height (22).
41
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 (32)
43
+ ## Component registry (30)
44
44
 
45
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`
47
- Orbs: `lz-pulsing-orb`, `lz-morphing-orb`, `lz-siri-orb`, `lz-dot-orb`, `lz-planet-orb`, `lz-aura-orb`
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`
48
49
  Shapes: `lz-eyes`, `lz-morphing-square`, `lz-breathing-pulse`
49
50
  Bars & rings: `lz-equalizer`, `lz-progress-ring`, `lz-progress-bar`, `lz-indeterminate-progress-bar`, `lz-activity-rings`
50
- Music: `lz-waveform`, `lz-vinyl`, `lz-sonar`, `lz-music-note`
51
+ Music: `lz-waveform`, `lz-vinyl`, `lz-music-note`
51
52
  Skeletons: `lz-skeleton-shimmer`, `lz-skeleton-card`, `lz-skeleton-list`
52
53
 
53
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:
54
55
 
55
- - **Orbs** use `accent` as their primary hue (default `#0a84ff`); `lz-dot-orb` and `lz-planet-orb` also accept `count`; `lz-planet-orb`/`lz-aura-orb` use `color` for moons/second orb.
56
- - **Music** patterns: `lz-waveform` (`count`, `bar-width`, `gap`), `lz-vinyl` (`accent` = label/stylus, `color` = tonearm), `lz-sonar` (`count` rings, `accent` = ring, `color` = core), `lz-music-note` (`count` notes).
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).
57
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.
58
62
 
59
- 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.
60
-
61
63
  ## Minimal valid usage
62
64
 
63
65
  Web:
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$comment": "loading-state-zoo v0.3.0 — machine-readable spec. Source of truth for all 32 components. Defaults match the rendered site.",
3
+ "$comment": "loading-state-zoo v0.4.0 — machine-readable spec. Source of truth for all 30 components. Defaults match the rendered site.",
4
4
  "package": {
5
5
  "name": "loading-state-zoo",
6
- "version": "0.3.0",
6
+ "version": "0.4.0",
7
7
  "entrypoints": {
8
8
  "webComponents": "loading-state-zoo",
9
9
  "react": "loading-state-zoo/react",
@@ -287,7 +287,7 @@
287
287
  "reactComponent": "ScanSweep",
288
288
  "category": "Spinners",
289
289
  "role": "status",
290
- "description": "Concentric rings with a sweeping radar beam.",
290
+ "description": "Concentric rings with crosshair ticks, a counter-rotating dial and a sweeping radar beam.",
291
291
  "useCases": ["scanning", "searching", "syncing"],
292
292
  "defaults": { "size": 44, "color": "#f5f5f7", "speed": 1 },
293
293
  "attributes": [
@@ -648,159 +648,120 @@
648
648
  }
649
649
  },
650
650
  {
651
- "id": "pulsing-orb",
652
- "tag": "lz-pulsing-orb",
653
- "reactComponent": "PulsingOrb",
651
+ "id": "ios-27-orb",
652
+ "tag": "lz-ios-27-orb",
653
+ "reactComponent": "Ios27Orb",
654
654
  "category": "Orbs",
655
655
  "role": "status",
656
- "description": "A glowing gradient orb that breathes in and out.",
657
- "useCases": ["ambient loads", "hero panels", "app splash"],
658
- "defaults": { "size": 44, "accent": "#0a84ff", "speed": 1 },
656
+ "description": "An orb of 27 dots where a bright glow travels from one touched dot to the next, spiraling inward like an iOS listening animation.",
657
+ "useCases": ["voice assistants", "AI thinking", "holographic waits"],
658
+ "defaults": { "size": 44, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
659
659
  "attributes": [
660
660
  { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
661
661
  { "name": "accent", "reactProp": "accent", "type": "string", "default": "#0a84ff" },
662
+ { "name": "color", "reactProp": "color", "type": "string", "default": "#f5f5f7" },
662
663
  { "name": "speed", "reactProp": "speed", "type": "number", "default": 1 }
663
664
  ],
664
665
  "cssVars": [
665
666
  { "name": "--lz-size", "default": "44px", "purpose": "Orb diameter" },
666
- { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Orb glow color" }
667
+ { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Warm pole hue" },
668
+ { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Cool pole hue" }
667
669
  ],
668
670
  "keyframeVars": [
669
- { "name": "--lz-orb-scale", "default": "1.16", "purpose": "Peak breathe scale" },
670
- { "name": "--lz-orb-fade", "default": "0.88", "purpose": "Peak breathe opacity" }
671
- ],
672
- "examples": {
673
- "html": "<lz-pulsing-orb size=\"64\" accent=\"#ff375f\"></lz-pulsing-orb>",
674
- "react": "<PulsingOrb size={64} accent=\"#ff375f\" />"
675
- }
676
- },
677
- {
678
- "id": "morphing-orb",
679
- "tag": "lz-morphing-orb",
680
- "reactComponent": "MorphingOrb",
681
- "category": "Orbs",
682
- "role": "status",
683
- "description": "A blob that continuously morphs its silhouette between rounded shapes.",
684
- "useCases": ["creative waits", "brand moments", "game loading"],
685
- "defaults": { "size": 44, "accent": "#0a84ff", "speed": 1 },
686
- "attributes": [
687
- { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
688
- { "name": "accent", "reactProp": "accent", "type": "string", "default": "#0a84ff" },
689
- { "name": "speed", "reactProp": "speed", "type": "number", "default": 1 }
690
- ],
691
- "cssVars": [
692
- { "name": "--lz-size", "default": "44px", "purpose": "Blob box size" },
693
- { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Blob color" }
671
+ { "name": "--lz-ios-fade", "default": "0.2", "purpose": "Resting dot opacity" },
672
+ { "name": "--lz-ios-min", "default": "0.5", "purpose": "Resting dot scale" },
673
+ { "name": "--lz-ios-peak", "default": "1.25", "purpose": "Glowing dot scale" }
694
674
  ],
695
- "keyframeVars": [],
696
675
  "examples": {
697
- "html": "<lz-morphing-orb size=\"64\" accent=\"#30d158\"></lz-morphing-orb>",
698
- "react": "<MorphingOrb size={64} accent=\"#30d158\" />"
676
+ "html": "<lz-ios-27-orb size=\"64\" accent=\"#64d2ff\" color=\"#bf5af2\"></lz-ios-27-orb>",
677
+ "react": "<Ios27Orb size={64} accent=\"#64d2ff\" color=\"#bf5af2\" />"
699
678
  }
700
679
  },
701
680
  {
702
- "id": "siri-orb",
703
- "tag": "lz-siri-orb",
704
- "reactComponent": "SiriOrb",
705
- "category": "Orbs",
681
+ "id": "ai-orb",
682
+ "tag": "lz-ai-orb",
683
+ "reactComponent": "AiOrb",
684
+ "category": "AI",
706
685
  "role": "status",
707
- "description": "A Siri-style orb with a multicolored conic sheen swirling inside.",
708
- "useCases": ["voice assistants", "AI thinking", "smart waits"],
709
- "defaults": { "size": 44, "accent": "#0a84ff", "speed": 1 },
686
+ "description": "A breathing gradient sphere with an orbiting light dot and twinkling sparkles — an AI assist orb.",
687
+ "useCases": ["AI assistants", "generative waits", "smart ready states"],
688
+ "defaults": { "size": 44, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
710
689
  "attributes": [
711
690
  { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
712
691
  { "name": "accent", "reactProp": "accent", "type": "string", "default": "#0a84ff" },
713
- { "name": "speed", "reactProp": "speed", "type": "number", "default": 1 }
714
- ],
715
- "cssVars": [
716
- { "name": "--lz-size", "default": "44px", "purpose": "Orb diameter" },
717
- { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Sheen hue" }
718
- ],
719
- "keyframeVars": [],
720
- "examples": {
721
- "html": "<lz-siri-orb size=\"72\" accent=\"#64d2ff\"></lz-siri-orb>",
722
- "react": "<SiriOrb size={72} accent=\"#64d2ff\" />"
723
- }
724
- },
725
- {
726
- "id": "dot-orb",
727
- "tag": "lz-dot-orb",
728
- "reactComponent": "DotOrb",
729
- "category": "Orbs",
730
- "role": "status",
731
- "description": "A ring of shimmering dots arranged into an orb silhouette.",
732
- "useCases": ["orbit waits", "spatial loading", "gaming screens"],
733
- "defaults": { "size": 44, "count": 8, "color": "#f5f5f7", "speed": 1 },
734
- "attributes": [
735
- { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
736
- { "name": "count", "reactProp": "count", "type": "number", "unit": "dots", "default": 8 },
737
692
  { "name": "color", "reactProp": "color", "type": "string", "default": "#f5f5f7" },
738
693
  { "name": "speed", "reactProp": "speed", "type": "number", "default": 1 }
739
694
  ],
740
695
  "cssVars": [
741
696
  { "name": "--lz-size", "default": "44px", "purpose": "Orb diameter" },
742
- { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Dot color" }
743
- ],
744
- "keyframeVars": [
745
- { "name": "--lz-dot-min", "default": "0.7", "purpose": "Resting dot scale" },
746
- { "name": "--lz-orb-fade", "default": "0.14", "purpose": "Resting dot opacity" }
697
+ { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Orb gradient hue" },
698
+ { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Sparkle color" }
747
699
  ],
700
+ "keyframeVars": [],
748
701
  "examples": {
749
- "html": "<lz-dot-orb count=\"12\" color=\"#ff9f0a\"></lz-dot-orb>",
750
- "react": "<DotOrb count={12} color=\"#ff9f0a\" />"
702
+ "html": "<lz-ai-orb size=\"64\" accent=\"#bf5af2\"></lz-ai-orb>",
703
+ "react": "<AiOrb size={64} accent=\"#bf5af2\" />"
751
704
  }
752
705
  },
753
706
  {
754
- "id": "planet-orb",
755
- "tag": "lz-planet-orb",
756
- "reactComponent": "PlanetOrb",
757
- "category": "Orbs",
707
+ "id": "ai-thinking",
708
+ "tag": "lz-ai-thinking",
709
+ "reactComponent": "AiThinking",
710
+ "category": "AI",
758
711
  "role": "status",
759
- "description": "A glowing planet core with small moons orbiting it.",
760
- "useCases": ["space motifs", "science apps", "sci-fi waits"],
761
- "defaults": { "size": 44, "accent": "#0a84ff", "color": "#f5f5f7", "count": 2, "speed": 1 },
712
+ "description": "A rounded thinking field with typing dots wrapped in a rotating accent ring.",
713
+ "useCases": ["chat completions", "AI replies", "waiting on answers"],
714
+ "defaults": { "size": 40, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
762
715
  "attributes": [
763
- { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
716
+ { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 40 },
764
717
  { "name": "accent", "reactProp": "accent", "type": "string", "default": "#0a84ff" },
765
718
  { "name": "color", "reactProp": "color", "type": "string", "default": "#f5f5f7" },
766
- { "name": "count", "reactProp": "count", "type": "number", "unit": "moons", "default": 2 },
767
719
  { "name": "speed", "reactProp": "speed", "type": "number", "default": 1 }
768
720
  ],
769
721
  "cssVars": [
770
- { "name": "--lz-size", "default": "44px", "purpose": "Orb box size" },
771
- { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Planet color" },
772
- { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Moon color" }
722
+ { "name": "--lz-size", "default": "40px", "purpose": "Field height" },
723
+ { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Rotating ring color" },
724
+ { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Typing dot color" },
725
+ { "name": "--lz-surface", "default": "rgba(255,255,255,0.07)", "purpose": "Field background" }
773
726
  ],
774
727
  "keyframeVars": [],
775
728
  "examples": {
776
- "html": "<lz-planet-orb count=\"3\" accent=\"#bf5af2\" color=\"#64d2ff\"></lz-planet-orb>",
777
- "react": "<PlanetOrb count={3} accent=\"#bf5af2\" color=\"#64d2ff\" />"
729
+ "html": "<lz-ai-thinking size=\"44\" accent=\"#30d158\"></lz-ai-thinking>",
730
+ "react": "<AiThinking size={44} accent=\"#30d158\" />"
778
731
  }
779
732
  },
780
733
  {
781
- "id": "aura-orb",
782
- "tag": "lz-aura-orb",
783
- "reactComponent": "AuraOrb",
784
- "category": "Orbs",
734
+ "id": "ai-neural",
735
+ "tag": "lz-ai-neural",
736
+ "reactComponent": "AiNeural",
737
+ "category": "AI",
785
738
  "role": "status",
786
- "description": "Two tinted orbs counter-rotating in overlapping orbits.",
787
- "useCases": ["gradient waits", "brand palettes", "hero backgrounds"],
788
- "defaults": { "size": 44, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
739
+ "description": "A grid of dots pulsing like an artificial neural network with a diagonal activation wave.",
740
+ "useCases": ["neural nets", "model training", "data pipelines"],
741
+ "defaults": { "size": 6, "rows": 3, "cols": 5, "gap": 10, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
789
742
  "attributes": [
790
- { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
743
+ { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 6 },
744
+ { "name": "rows", "reactProp": "rows", "type": "number", "unit": "rows", "default": 3 },
745
+ { "name": "cols", "reactProp": "cols", "type": "number", "unit": "cols", "default": 5 },
746
+ { "name": "gap", "reactProp": "gap", "type": "number", "unit": "px", "default": 10 },
791
747
  { "name": "accent", "reactProp": "accent", "type": "string", "default": "#0a84ff" },
792
748
  { "name": "color", "reactProp": "color", "type": "string", "default": "#f5f5f7" },
793
749
  { "name": "speed", "reactProp": "speed", "type": "number", "default": 1 }
794
750
  ],
795
751
  "cssVars": [
796
- { "name": "--lz-size", "default": "44px", "purpose": "Orb box size" },
797
- { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Counter orb color" },
798
- { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Primary orb color" }
752
+ { "name": "--lz-size", "default": "6px", "purpose": "Dot diameter" },
753
+ { "name": "--lz-cols", "default": "5", "purpose": "Grid column count" },
754
+ { "name": "--lz-grid-gap", "default": "10px", "purpose": "Grid gap" },
755
+ { "name": "--lz-accent", "default": "#0a84ff", "purpose": "Checking neurons color" },
756
+ { "name": "--lz-color", "default": "#f5f5f7", "purpose": "Resting neurons color" }
757
+ ],
758
+ "keyframeVars": [
759
+ { "name": "--lz-grid-min", "default": "0.3", "purpose": "Resting dot scale" },
760
+ { "name": "--lz-grid-fade", "default": "0.15", "purpose": "Resting dot opacity" }
799
761
  ],
800
- "keyframeVars": [],
801
762
  "examples": {
802
- "html": "<lz-aura-orb accent=\"#ff375f\" color=\"#64d2ff\"></lz-aura-orb>",
803
- "react": "<AuraOrb accent=\"#ff375f\" color=\"#64d2ff\" />"
763
+ "html": "<lz-ai-neural rows=\"4\" cols=\"7\" accent=\"#fa114f\"></lz-ai-neural>",
764
+ "react": "<AiNeural rows={4} cols={7} accent=\"#fa114f\" />"
804
765
  }
805
766
  },
806
767
  {
@@ -838,7 +799,7 @@
838
799
  "reactComponent": "Vinyl",
839
800
  "category": "Music",
840
801
  "role": "status",
841
- "description": "A spinning record with a gently bobbing tonearm.",
802
+ "description": "A spinning record with a light sheen, label, spindle and a gently bobbing tonearm.",
842
803
  "useCases": ["music apps", "retro waits", "album screens"],
843
804
  "defaults": { "size": 48, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
844
805
  "attributes": [
@@ -862,10 +823,10 @@
862
823
  "id": "sonar",
863
824
  "tag": "lz-sonar",
864
825
  "reactComponent": "Sonar",
865
- "category": "Music",
826
+ "category": "Spinners",
866
827
  "role": "status",
867
828
  "description": "A pulsing core emitting expanding sonar rings.",
868
- "useCases": ["audio pulses", "location pings", "motion waits"],
829
+ "useCases": ["radar pings", "location detection", "motion waits"],
869
830
  "defaults": { "size": 44, "count": 3, "accent": "#0a84ff", "color": "#f5f5f7", "speed": 1 },
870
831
  "attributes": [
871
832
  { "name": "size", "reactProp": "size", "type": "number", "unit": "px", "default": 44 },
@@ -893,7 +854,7 @@
893
854
  "reactComponent": "MusicNote",
894
855
  "category": "Music",
895
856
  "role": "status",
896
- "description": "Musical note glyphs bobbing in a sing-song rhythm.",
857
+ "description": "Drawn musical notes with heads, stems and flags bobbing in a sing-song rhythm.",
897
858
  "useCases": ["music players", "karaoke", "playful waits"],
898
859
  "defaults": { "size": 32, "count": 2, "color": "#f5f5f7", "speed": 1 },
899
860
  "attributes": [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loading-state-zoo",
3
- "version": "0.3.0",
4
- "description": "32 smooth, transform-only loading patterns as framework-agnostic web components with a thin React wrapper. Works in React, plain web, iOS and Android WebViews.",
3
+ "version": "0.4.0",
4
+ "description": "30 smooth, transform-only loading patterns as framework-agnostic web components with a thin React wrapper. Works in React, plain web, iOS and Android WebViews.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",