weasel-icons 0.14.0 → 0.14.2

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/README.md CHANGED
@@ -8,6 +8,14 @@ Version `0.10.0` contains 874 icons, adding 200 across documents, collaboration,
8
8
 
9
9
  Version `0.7.0` contained 469 icons; `0.6.0` contained 265 icons.
10
10
 
11
+ ## Version 0.14.2
12
+
13
+ Refines Mummy with a clearer eye band and attached fluttering wrap, keeps Tombstone and its RIP lettering fixed while bats pass above it, and gives Candy Corn a rounded silhouette with a distinct concave bite. Public state names, shared props and the 1,034-icon collection remain unchanged. The customization CLI includes the matching editable source.
14
+
15
+ ## Version 0.14.1
16
+
17
+ Refines Vampire with a fixed face, solid hair and mouth, and white fangs; gives Frankenstein swept hair and attached ears. Repairs Can, Fountain, Grill Fork and Rat motion. The customization guide now covers stable anatomy and deliberate outline, ink and neutral paint roles. Public state names and shared props stay compatible; the collection remains at 1,034 icons.
18
+
11
19
  ## Version 0.14.0
12
20
 
13
21
  Adds 10 Halloween icons with three typed states each, bringing the collection to 1,034: cauldron, coffin, witch hat, potion bottle, Frankenstein, tombstone, vampire, mummy, spider web and candy corn. Includes vampire-to-bat transformation, one-shot hat casting, bats above the tombstone and a spider walking out of its web. The existing jack-o’-lantern’s lit state now turns its stalk into an attached flickering flame. Existing state names and shared props remain compatible.
@@ -6,25 +6,40 @@ export declare const canArt: {
6
6
  readonly name: "structure";
7
7
  readonly paths: readonly ["M 21 10.5 a 9 2.5 0 0 1 -18 0 v 8 a 9 2.5 0 0 0 18 0 z", "M 3 10.5 a 9 2.5 0 0 1 6.527 -2.405", "M 9 16.858 a 31 31 0 0 0 6 0"];
8
8
  readonly poses: readonly [{}, {}, {}];
9
+ }, {
10
+ readonly name: "back-rim";
11
+ readonly paths: readonly ["M 9.527 8.095 A 9 2.5 0 0 1 21 10.5"];
12
+ readonly poses: readonly [{
13
+ readonly opacity: 0;
14
+ }, {
15
+ readonly opacity: 0.6;
16
+ }, {}];
9
17
  }, {
10
18
  readonly name: "action";
11
- readonly paths: readonly ["M 21 10.5 A 9 2.5 25.32 0 0 4.59 3.47 9 2.5 25.32 0 0 21 10.5"];
12
- readonly poses: readonly [{}, {}, {
13
- readonly angle: -8;
19
+ readonly paths: readonly ["M 21 10.5 C 20.948544 8.973227 17.278179 6.18817 12.775345 4.259168 C 8.272511 2.330166 4.619688 1.977989 4.59 3.47 C 4.641456 4.996773 8.311821 7.78183 12.814655 9.710832 C 17.317489 11.639834 20.970312 11.992011 21 10.5"];
20
+ readonly pathStates: readonly [readonly ["M 21 10.5 C 20.948544 8.973227 17.278179 6.18817 12.775345 4.259168 C 8.272511 2.330166 4.619688 1.977989 4.59 3.47 C 4.641456 4.996773 8.311821 7.78183 12.814655 9.710832 C 17.317489 11.639834 20.970312 11.992011 21 10.5"], readonly ["M 21 10.5 C 17.8 10 12.1 9.3 11.6 6.3 C 11.2 3.5 16.5 2.7 18.8 4.4 C 21 5.9 21 8 17.6 8.2 C 17.8 9.2 20.1 10.2 21 10.5"], readonly ["M 21 10.5 C 18.9 10 17.2 8.7 16.8 7 C 16 3.2 21.4 2.3 22 5.9 C 22.4 8 20.3 9.4 18.8 8.2 C 18.3 8.4 20 10 21 10.5"]];
21
+ readonly poses: readonly [{
22
+ readonly flex: 0;
23
+ }, {
24
+ readonly flex: 0.6;
25
+ }, {
26
+ readonly flex: 1;
14
27
  }];
15
- readonly gestures: readonly [null, {
16
- readonly duration: 0.75;
17
- readonly repeatAfter: 0.75;
18
- readonly loop: false;
19
- readonly frames: readonly [{
20
- readonly at: 0;
21
- }, {
22
- readonly at: 0.4;
23
- readonly angle: 5;
24
- }, {
25
- readonly at: 1;
26
- }];
27
- }, null];
28
- readonly pivot: readonly [21, 10.5];
28
+ readonly detail: true;
29
+ readonly surface: true;
30
+ }, {
31
+ readonly name: "curl";
32
+ readonly paths: readonly ["M 18.8 8.2 C 17.6 7.7 17.6 5.5 18.8 5.2 C 19.6 4.9 20.5 5.5 20.3 6.5"];
33
+ readonly pathStates: readonly [readonly ["M 12.814655 9.710832 C 12.814655 9.710832 12.814655 9.710832 12.814655 9.710832 C 12.814655 9.710832 12.814655 9.710832 12.814655 9.710832"], readonly ["M 17.6 8.2 C 17.6 8.2 17.6 8.2 17.6 8.2 C 17.6 8.2 17.6 8.2 17.6 8.2"], readonly ["M 18.8 8.2 C 17.6 7.7 17.6 5.5 18.8 5.2 C 19.6 4.9 20.5 5.5 20.3 6.5"]];
34
+ readonly poses: readonly [{
35
+ readonly opacity: 0;
36
+ }, {
37
+ readonly opacity: 0;
38
+ }, {}];
39
+ readonly detail: true;
40
+ readonly revealAfter: {
41
+ readonly part: "action";
42
+ readonly flex: readonly [0.65, 0.95];
43
+ };
29
44
  }];
30
45
  };
@@ -1,6 +1,11 @@
1
1
  export const canStates = ['open', 'peel', 'peeled'];
2
- // Open can illustration interaction. The lid lifts slightly once about its existing right attachment and returns; the body and exposed rim never fold together. Retain a distinct pose for this configuration or result.
2
+ // Peel-back lid: preserve the body and the source open ellipse. The thin sheet
3
+ // retracts and curls toward its fixed right-hand attachment at (21, 10.5).
4
+ // The back rim is revealed beneath it; the final curl remains still.
3
5
  // Adapted Lucide geometry; see THIRD_PARTY_NOTICES.md.
6
+ const openLid = 'M 21 10.5 C 20.948544 8.973227 17.278179 6.18817 12.775345 4.259168 C 8.272511 2.330166 4.619688 1.977989 4.59 3.47 C 4.641456 4.996773 8.311821 7.78183 12.814655 9.710832 C 17.317489 11.639834 20.970312 11.992011 21 10.5';
7
+ const peelingLid = 'M 21 10.5 C 17.8 10 12.1 9.3 11.6 6.3 C 11.2 3.5 16.5 2.7 18.8 4.4 C 21 5.9 21 8 17.6 8.2 C 17.8 9.2 20.1 10.2 21 10.5';
8
+ const rolledLid = 'M 21 10.5 C 18.9 10 17.2 8.7 16.8 7 C 16 3.2 21.4 2.3 22 5.9 C 22.4 8 20.3 9.4 18.8 8.2 C 18.3 8.4 20 10 21 10.5';
4
9
  export const canArt = {
5
10
  name: 'can',
6
11
  parts: [
@@ -13,38 +18,32 @@ export const canArt = {
13
18
  ],
14
19
  poses: [{}, {}, {}],
15
20
  },
21
+ {
22
+ name: 'back-rim',
23
+ paths: ['M 9.527 8.095 A 9 2.5 0 0 1 21 10.5'],
24
+ poses: [{ opacity: 0 }, { opacity: 0.6 }, {}],
25
+ },
16
26
  {
17
27
  name: 'action',
18
- paths: ['M 21 10.5 A 9 2.5 25.32 0 0 4.59 3.47 9 2.5 25.32 0 0 21 10.5'],
19
- poses: [
20
- {},
21
- {},
22
- {
23
- angle: -8,
24
- },
25
- ],
26
- gestures: [
27
- null,
28
- {
29
- duration: 0.75,
30
- repeatAfter: 0.75,
31
- loop: false,
32
- frames: [
33
- {
34
- at: 0,
35
- },
36
- {
37
- at: 0.4,
38
- angle: 5,
39
- },
40
- {
41
- at: 1,
42
- },
43
- ],
44
- },
45
- null,
28
+ paths: [openLid],
29
+ pathStates: [[openLid], [peelingLid], [rolledLid]],
30
+ poses: [{ flex: 0 }, { flex: 0.6 }, { flex: 1 }],
31
+ detail: true,
32
+ surface: true,
33
+ },
34
+ {
35
+ name: 'curl',
36
+ paths: ['M 18.8 8.2 C 17.6 7.7 17.6 5.5 18.8 5.2 C 19.6 4.9 20.5 5.5 20.3 6.5'],
37
+ pathStates: [
38
+ [
39
+ 'M 12.814655 9.710832 C 12.814655 9.710832 12.814655 9.710832 12.814655 9.710832 C 12.814655 9.710832 12.814655 9.710832 12.814655 9.710832',
40
+ ],
41
+ ['M 17.6 8.2 C 17.6 8.2 17.6 8.2 17.6 8.2 C 17.6 8.2 17.6 8.2 17.6 8.2'],
42
+ ['M 18.8 8.2 C 17.6 7.7 17.6 5.5 18.8 5.2 C 19.6 4.9 20.5 5.5 20.3 6.5'],
46
43
  ],
47
- pivot: [21, 10.5],
44
+ poses: [{ opacity: 0 }, { opacity: 0 }, {}],
45
+ detail: true,
46
+ revealAfter: { part: 'action', flex: [0.65, 0.95] },
48
47
  },
49
48
  ],
50
49
  };
@@ -3,11 +3,11 @@ export type CandyCornState = (typeof candyCornStates)[number];
3
3
  export declare const candyCornArt: {
4
4
  readonly name: "candy-corn";
5
5
  readonly parts: readonly [{
6
- readonly name: "kernel";
7
- readonly paths: readonly ["M9.5 6Q9.9 4.9 10.5 4Q12 1.8 13.5 4Q14.1 4.9 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z"];
6
+ readonly name: "kernel-interior";
7
+ readonly paths: readonly ["M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"];
8
8
  readonly poses: readonly [{}, {}, {}];
9
- readonly pathStates: readonly [readonly ["M9.5 6Q9.9 4.9 10.5 4Q12 1.8 13.5 4Q14.1 4.9 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z"], readonly ["M9.5 6Q9.9 4.9 10.5 4Q12 1.8 13.5 4Q14.1 4.9 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z"], readonly ["M9.5 6Q10.3 7.9 11.3 6.3Q12.3 8.3 13.4 6.1Q14 7 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z"]];
10
- readonly pivot: readonly [12, 20];
9
+ readonly pathStates: readonly [readonly ["M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"], readonly ["M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"], readonly ["M9.75 5.7C9.8 7.1 10.6 8 12 8C13.4 8 14.2 7.1 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"]];
10
+ readonly pivot: readonly [12, 20.6];
11
11
  readonly gestures: readonly [null, {
12
12
  readonly duration: 1.1;
13
13
  readonly repeatAfter: 2.5;
@@ -17,24 +17,51 @@ export declare const candyCornArt: {
17
17
  readonly at: 0;
18
18
  }, {
19
19
  readonly at: 0.22;
20
- readonly angle: -11;
20
+ readonly angle: -9;
21
21
  }, {
22
22
  readonly at: 0.52;
23
- readonly angle: 8;
23
+ readonly angle: 6;
24
24
  }, {
25
25
  readonly at: 0.77;
26
- readonly angle: -3;
26
+ readonly angle: -2;
27
27
  }, {
28
28
  readonly at: 1;
29
29
  }];
30
30
  }, null];
31
+ readonly fillOnly: "surface";
31
32
  }, {
32
33
  readonly name: "stripes";
33
- readonly paths: readonly ["M8.1 9.8Q12 10.8 15.9 9.8", "M6.2 15.2Q12 16.2 17.8 15.2"];
34
+ readonly paths: readonly ["M7.745868 10.7Q12 11.5 16.254132 10.7", "M5.942149 15.2Q12 16 18.057851 15.2"];
34
35
  readonly poses: readonly [{}, {}, {}];
35
36
  readonly accent: true;
36
37
  readonly detail: true;
37
- readonly pivot: readonly [12, 20];
38
+ readonly pivot: readonly [12, 20.6];
39
+ readonly gestures: readonly [null, {
40
+ readonly duration: 1.1;
41
+ readonly repeatAfter: 2.5;
42
+ readonly loop: true;
43
+ readonly interpolation: "continuous";
44
+ readonly frames: readonly [{
45
+ readonly at: 0;
46
+ }, {
47
+ readonly at: 0.22;
48
+ readonly angle: -9;
49
+ }, {
50
+ readonly at: 0.52;
51
+ readonly angle: 6;
52
+ }, {
53
+ readonly at: 0.77;
54
+ readonly angle: -2;
55
+ }, {
56
+ readonly at: 1;
57
+ }];
58
+ }, null];
59
+ }, {
60
+ readonly name: "kernel";
61
+ readonly paths: readonly ["M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"];
62
+ readonly poses: readonly [{}, {}, {}];
63
+ readonly pathStates: readonly [readonly ["M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"], readonly ["M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"], readonly ["M9.75 5.7C9.8 7.1 10.6 8 12 8C13.4 8 14.2 7.1 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z"]];
64
+ readonly pivot: readonly [12, 20.6];
38
65
  readonly gestures: readonly [null, {
39
66
  readonly duration: 1.1;
40
67
  readonly repeatAfter: 2.5;
@@ -44,13 +71,13 @@ export declare const candyCornArt: {
44
71
  readonly at: 0;
45
72
  }, {
46
73
  readonly at: 0.22;
47
- readonly angle: -11;
74
+ readonly angle: -9;
48
75
  }, {
49
76
  readonly at: 0.52;
50
- readonly angle: 8;
77
+ readonly angle: 6;
51
78
  }, {
52
79
  readonly at: 0.77;
53
- readonly angle: -3;
80
+ readonly angle: -2;
54
81
  }, {
55
82
  readonly at: 1;
56
83
  }];
@@ -1,26 +1,28 @@
1
- // Original Weasel outline and state choreography. Structural observations are retained in the external review record.
2
- // Rounded triangular kernel, three stripe regions, scalloped bite from the tip.
3
- // whole: Three-part candy kernel is intact
4
- // wobbling: Kernel rocks on its rounded base and settles
5
- // bitten: A small scalloped bite is missing from the tip
1
+ // Original Weasel geometry and state choreography, refined from the existing glyph.
2
+ // Soft rounded tip and shoulders with two attached band boundaries.
3
+ // A scalloped missing tip stays bitten; the filled interior, stripe assembly and outer contour rock together.
6
4
  export const candyCornStates = ['whole', 'wobbling', 'bitten'];
7
5
  export const candyCornArt = {
8
6
  name: 'candy-corn',
9
7
  parts: [
10
8
  {
11
- name: 'kernel',
9
+ name: 'kernel-interior',
12
10
  paths: [
13
- 'M9.5 6Q9.9 4.9 10.5 4Q12 1.8 13.5 4Q14.1 4.9 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z',
11
+ 'M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
14
12
  ],
15
13
  poses: [{}, {}, {}],
16
14
  pathStates: [
17
- ['M9.5 6Q9.9 4.9 10.5 4Q12 1.8 13.5 4Q14.1 4.9 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z'],
18
- ['M9.5 6Q9.9 4.9 10.5 4Q12 1.8 13.5 4Q14.1 4.9 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z'],
19
15
  [
20
- 'M9.5 6Q10.3 7.9 11.3 6.3Q12.3 8.3 13.4 6.1Q14 7 14.5 6L19 18Q20 21 17 21L7 21Q4 21 5 18Z',
16
+ 'M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
17
+ ],
18
+ [
19
+ 'M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
20
+ ],
21
+ [
22
+ 'M9.75 5.7C9.8 7.1 10.6 8 12 8C13.4 8 14.2 7.1 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
21
23
  ],
22
24
  ],
23
- pivot: [12, 20],
25
+ pivot: [12, 20.6],
24
26
  gestures: [
25
27
  null,
26
28
  {
@@ -34,15 +36,15 @@ export const candyCornArt = {
34
36
  },
35
37
  {
36
38
  at: 0.22,
37
- angle: -11,
39
+ angle: -9,
38
40
  },
39
41
  {
40
42
  at: 0.52,
41
- angle: 8,
43
+ angle: 6,
42
44
  },
43
45
  {
44
46
  at: 0.77,
45
- angle: -3,
47
+ angle: -2,
46
48
  },
47
49
  {
48
50
  at: 1,
@@ -51,14 +53,64 @@ export const candyCornArt = {
51
53
  },
52
54
  null,
53
55
  ],
56
+ fillOnly: 'surface',
54
57
  },
55
58
  {
56
59
  name: 'stripes',
57
- paths: ['M8.1 9.8Q12 10.8 15.9 9.8', 'M6.2 15.2Q12 16.2 17.8 15.2'],
60
+ paths: ['M7.745868 10.7Q12 11.5 16.254132 10.7', 'M5.942149 15.2Q12 16 18.057851 15.2'],
58
61
  poses: [{}, {}, {}],
59
62
  accent: true,
60
63
  detail: true,
61
- pivot: [12, 20],
64
+ pivot: [12, 20.6],
65
+ gestures: [
66
+ null,
67
+ {
68
+ duration: 1.1,
69
+ repeatAfter: 2.5,
70
+ loop: true,
71
+ interpolation: 'continuous',
72
+ frames: [
73
+ {
74
+ at: 0,
75
+ },
76
+ {
77
+ at: 0.22,
78
+ angle: -9,
79
+ },
80
+ {
81
+ at: 0.52,
82
+ angle: 6,
83
+ },
84
+ {
85
+ at: 0.77,
86
+ angle: -2,
87
+ },
88
+ {
89
+ at: 1,
90
+ },
91
+ ],
92
+ },
93
+ null,
94
+ ],
95
+ },
96
+ {
97
+ name: 'kernel',
98
+ paths: [
99
+ 'M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
100
+ ],
101
+ poses: [{}, {}, {}],
102
+ pathStates: [
103
+ [
104
+ 'M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
105
+ ],
106
+ [
107
+ 'M9.75 5.7C10.5 3.8 10.8 3 12 3C13.2 3 13.5 3.8 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
108
+ ],
109
+ [
110
+ 'M9.75 5.7C9.8 7.1 10.6 8 12 8C13.4 8 14.2 7.1 14.25 5.7L19.1 17.8Q20.3 20.6 17.1 20.6H6.9Q3.7 20.6 4.9 17.8Z',
111
+ ],
112
+ ],
113
+ pivot: [12, 20.6],
62
114
  gestures: [
63
115
  null,
64
116
  {
@@ -72,15 +124,15 @@ export const candyCornArt = {
72
124
  },
73
125
  {
74
126
  at: 0.22,
75
- angle: -11,
127
+ angle: -9,
76
128
  },
77
129
  {
78
130
  at: 0.52,
79
- angle: 8,
131
+ angle: 6,
80
132
  },
81
133
  {
82
134
  at: 0.77,
83
- angle: -3,
135
+ angle: -2,
84
136
  },
85
137
  {
86
138
  at: 1,
@@ -8,11 +8,37 @@ export declare const fountainArt: {
8
8
  readonly poses: readonly [{}, {}, {}];
9
9
  }, {
10
10
  readonly name: "jets";
11
- readonly paths: readonly ["M9 16v-5a2 2 0 1 0 -4 0", "M15 16v-5a2 2 0 1 1 4 0", "M12 16v-10a3 3 0 0 1 6 0", "M6 6a3 3 0 0 1 6 0"];
11
+ readonly paths: ("M12 16 C12 12.6667 12 9.3333 12 6" | "M12 6 C12 4.343146 13.343146 3 15 3 C16.656854 3 18 4.343146 18 6" | "M12 6 C12 4.343146 10.656854 3 9 3 C7.343146 3 6 4.343146 6 6" | "M9 16 C9 14.3333 9 12.6667 9 11 C9 9.895431 8.104569 9 7 9 C5.895431 9 5 9.895431 5 11" | "M15 16 C15 14.3333 15 12.6667 15 11 C15 9.895431 15.895431 9 17 9 C18.104569 9 19 9.895431 19 11")[];
12
+ readonly pathStates: readonly [("M12 16 C12 12.6667 12 9.3333 12 6" | "M12 6 C12 4.343146 13.343146 3 15 3 C16.656854 3 18 4.343146 18 6" | "M12 6 C12 4.343146 10.656854 3 9 3 C7.343146 3 6 4.343146 6 6" | "M9 16 C9 14.3333 9 12.6667 9 11 C9 9.895431 8.104569 9 7 9 C5.895431 9 5 9.895431 5 11" | "M15 16 C15 14.3333 15 12.6667 15 11 C15 9.895431 15.895431 9 17 9 C18.104569 9 19 9.895431 19 11")[], ("M12 16 C12 12.6667 12 9.3333 12 6" | "M12 6 C12 4.343146 13.343146 3 15 3 C16.656854 3 18 4.343146 18 6" | "M12 6 C12 4.343146 10.656854 3 9 3 C7.343146 3 6 4.343146 6 6" | "M9 16 C9 14.3333 9 12.6667 9 11 C9 9.895431 8.104569 9 7 9 C5.895431 9 5 9.895431 5 11" | "M15 16 C15 14.3333 15 12.6667 15 11 C15 9.895431 15.895431 9 17 9 C18.104569 9 19 9.895431 19 11")[], readonly ["M12 16 C12 14.8 12 13.1 12 11.7", "M12 11.7 C12 9.4 15.2 9.1 16.4 11.1 C17.3 12.1 17.6 14.6 17.4 16", "M12 11.7 C12 9.4 8.8 9.1 7.6 11.1 C6.7 12.1 6.4 14.6 6.6 16"]];
13
+ readonly poses: readonly [{
14
+ readonly opacity: 0;
15
+ }, {}, {}];
16
+ readonly pivot: readonly [12, 16];
17
+ readonly detail: true;
18
+ readonly accent: true;
19
+ readonly gestures: readonly [null, {
20
+ readonly duration: 1.7;
21
+ readonly repeatAfter: 1.9;
22
+ readonly loop: true;
23
+ readonly frames: readonly [{
24
+ readonly at: 0;
25
+ }, {
26
+ readonly at: 0.25;
27
+ readonly scaleY: 0.035;
28
+ }, {
29
+ readonly at: 0.75;
30
+ readonly scaleY: -0.035;
31
+ }, {
32
+ readonly at: 1;
33
+ }];
34
+ }, null];
35
+ }, {
36
+ readonly name: "side-jets";
37
+ readonly paths: ("M12 16 C12 12.6667 12 9.3333 12 6" | "M12 6 C12 4.343146 13.343146 3 15 3 C16.656854 3 18 4.343146 18 6" | "M12 6 C12 4.343146 10.656854 3 9 3 C7.343146 3 6 4.343146 6 6" | "M9 16 C9 14.3333 9 12.6667 9 11 C9 9.895431 8.104569 9 7 9 C5.895431 9 5 9.895431 5 11" | "M15 16 C15 14.3333 15 12.6667 15 11 C15 9.895431 15.895431 9 17 9 C18.104569 9 19 9.895431 19 11")[];
12
38
  readonly poses: readonly [{
13
39
  readonly opacity: 0;
14
40
  }, {}, {
15
- readonly scaleY: 0.55;
41
+ readonly opacity: 0;
16
42
  }];
17
43
  readonly pivot: readonly [12, 16];
18
44
  readonly detail: true;
@@ -1,10 +1,25 @@
1
1
  // Geometry reference: https://raw.githubusercontent.com/tabler/tabler-icons/ed177a085b652fe04ec4f37ced867c94621e7840/icons/outline/fountain.svg
2
2
  // Adaptation and state motion authored for Weasel; see THIRD_PARTY_NOTICES.md.
3
- // The reference water paths all begin at the basin rim y16 and curve into distinct outlets. Jet scaling uses that rim as its fixed baseline, so full and low flow remain connected and visible rather than blinking away.
3
+ // Full flow retains the reference outline, split into a shared centre stem and
4
+ // four arcs. Low flow bends those same paths downward instead of compressing
5
+ // their stroke with scaleY. Low output retains the centre spray while the
6
+ // outer two jets switch off. Visible streams meet the fixed basin rim at y16.
4
7
  // off: Pedestal and basin retained without water jets
5
8
  // flowing: Water rises and arcs into basin
6
9
  // low: Shorter jets remain above basin
7
10
  export const fountainStates = ['off', 'flowing', 'low'];
11
+ const fullJets = [
12
+ 'M12 16 C12 12.6667 12 9.3333 12 6',
13
+ 'M12 6 C12 4.343146 13.343146 3 15 3 C16.656854 3 18 4.343146 18 6',
14
+ 'M12 6 C12 4.343146 10.656854 3 9 3 C7.343146 3 6 4.343146 6 6',
15
+ 'M9 16 C9 14.3333 9 12.6667 9 11 C9 9.895431 8.104569 9 7 9 C5.895431 9 5 9.895431 5 11',
16
+ 'M15 16 C15 14.3333 15 12.6667 15 11 C15 9.895431 15.895431 9 17 9 C18.104569 9 19 9.895431 19 11',
17
+ ];
18
+ const lowJets = [
19
+ 'M12 16 C12 14.8 12 13.1 12 11.7',
20
+ 'M12 11.7 C12 9.4 15.2 9.1 16.4 11.1 C17.3 12.1 17.6 14.6 17.4 16',
21
+ 'M12 11.7 C12 9.4 8.8 9.1 7.6 11.1 C6.7 12.1 6.4 14.6 6.6 16',
22
+ ];
8
23
  export const fountainArt = {
9
24
  name: 'fountain',
10
25
  parts: [
@@ -15,20 +30,14 @@ export const fountainArt = {
15
30
  },
16
31
  {
17
32
  name: 'jets',
18
- paths: [
19
- 'M9 16v-5a2 2 0 1 0 -4 0',
20
- 'M15 16v-5a2 2 0 1 1 4 0',
21
- 'M12 16v-10a3 3 0 0 1 6 0',
22
- 'M6 6a3 3 0 0 1 6 0',
23
- ],
33
+ paths: fullJets.slice(0, 3),
34
+ pathStates: [fullJets.slice(0, 3), fullJets.slice(0, 3), lowJets],
24
35
  poses: [
25
36
  {
26
37
  opacity: 0,
27
38
  },
28
39
  {},
29
- {
30
- scaleY: 0.55,
31
- },
40
+ {},
32
41
  ],
33
42
  pivot: [12, 16],
34
43
  detail: true,
@@ -59,6 +68,24 @@ export const fountainArt = {
59
68
  null,
60
69
  ],
61
70
  },
71
+ {
72
+ name: 'side-jets',
73
+ paths: fullJets.slice(3),
74
+ poses: [{ opacity: 0 }, {}, { opacity: 0 }],
75
+ pivot: [12, 16],
76
+ detail: true,
77
+ accent: true,
78
+ gestures: [
79
+ null,
80
+ {
81
+ duration: 1.7,
82
+ repeatAfter: 1.9,
83
+ loop: true,
84
+ frames: [{ at: 0 }, { at: 0.25, scaleY: 0.035 }, { at: 0.75, scaleY: -0.035 }, { at: 1 }],
85
+ },
86
+ null,
87
+ ],
88
+ },
62
89
  {
63
90
  name: 'basin',
64
91
  paths: ['M3 16h18v2a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-2'],
@@ -4,9 +4,15 @@ export declare const frankensteinArt: {
4
4
  readonly name: "frankenstein";
5
5
  readonly parts: readonly [{
6
6
  readonly name: "neck-bolts";
7
- readonly paths: readonly ["M3 15.5H6", "M3 14.3V16.7", "M18 15.5H21", "M21 14.3V16.7"];
7
+ readonly paths: readonly ["M3 17.5H6", "M3 16.3V18.7", "M18 17.5H21", "M21 16.3V18.7"];
8
8
  readonly poses: readonly [{}, {}, {}];
9
9
  readonly accent: true;
10
+ }, {
11
+ readonly name: "ears";
12
+ readonly paths: readonly ["M6 12.2C3.4 10.5 2.9 14.5 6 15.1Z", "M18 12.2C20.6 10.5 21.1 14.5 18 15.1Z"];
13
+ readonly poses: readonly [{}, {}, {}];
14
+ readonly detail: true;
15
+ readonly surface: true;
10
16
  }, {
11
17
  readonly name: "head";
12
18
  readonly paths: readonly ["M6 5Q6 3 8 3H16Q18 3 18 5V17Q18 21 12 21Q6 21 6 17Z"];
@@ -14,11 +20,17 @@ export declare const frankensteinArt: {
14
20
  readonly surface: true;
15
21
  }, {
16
22
  readonly name: "fringe";
17
- readonly paths: readonly ["M6 7.8H8.3L9.3 9L10.7 7.8H13.3L14.3 9L15.7 7.8H18"];
23
+ readonly paths: readonly ["M6 5.2C5.3 3.5 6.35 2.15 8.5 2.1C9.9 2.05 11.1 2.5 12 3.05C12.9 1.55 15 1.55 16.65 2.2C18 2.75 18.65 4.15 18 5.2Q14.9 4.3 12 4.9Q8.8 4 6 5.2Z"];
24
+ readonly poses: readonly [{}, {}, {}];
25
+ readonly fillOnly: "ink";
26
+ }, {
27
+ readonly name: "hair-part";
28
+ readonly paths: readonly ["M11.8 2.85Q12.1 3.65 12 4.6Q12.35 3.55 12.8 2.5Q12.25 2.6 11.8 2.85Z"];
18
29
  readonly poses: readonly [{}, {}, {}];
30
+ readonly fillOnly: "surface";
19
31
  }, {
20
32
  readonly name: "stitches";
21
- readonly paths: readonly ["M9 5.5H14.5", "M10.7 4.9V6.1", "M13 4.9V6.1"];
33
+ readonly paths: readonly ["M9 6.8H14.5", "M10.7 6.2V7.4", "M13 6.2V7.4"];
22
34
  readonly poses: readonly [{}, {}, {}];
23
35
  readonly detail: true;
24
36
  readonly accent: true;
@@ -42,7 +54,7 @@ export declare const frankensteinArt: {
42
54
  readonly pathStates: readonly [readonly ["M9 17Q12 17 15 17"], readonly ["M9 17Q12 18.3 15 17"], readonly ["M9 17Q12 15.8 15 17"]];
43
55
  }, {
44
56
  readonly name: "left-arc";
45
- readonly paths: readonly ["M2 10.7L3.1 12L1.6 13.2"];
57
+ readonly paths: readonly ["M2 8.2L3.1 9.5L1.6 10.7"];
46
58
  readonly poses: readonly [{
47
59
  readonly opacity: 0;
48
60
  }, {
@@ -75,7 +87,7 @@ export declare const frankensteinArt: {
75
87
  }];
76
88
  }, {
77
89
  readonly name: "right-arc";
78
- readonly paths: readonly ["M22 10.7L20.9 12L22.4 13.2"];
90
+ readonly paths: readonly ["M22 8.2L20.9 9.5L22.4 10.7"];
79
91
  readonly poses: readonly [{
80
92
  readonly opacity: 0;
81
93
  }, {
@@ -1,5 +1,5 @@
1
1
  // Original Weasel outline and state choreography. Structural observations are retained in the external review record.
2
- // Broad flat head, short jagged fringe, forehead stitches and paired neck bolts.
2
+ // Broad fixed face, swept parted hair, rounded ears, forehead stitches and paired neck bolts.
3
3
  // dormant: Eyes rest closed beneath the stitched forehead
4
4
  // awake: Eyes open with a small curious mouth change
5
5
  // charged: Neck bolts hold the accent colour as small electrical arcs flicker beside them
@@ -9,10 +9,17 @@ export const frankensteinArt = {
9
9
  parts: [
10
10
  {
11
11
  name: 'neck-bolts',
12
- paths: ['M3 15.5H6', 'M3 14.3V16.7', 'M18 15.5H21', 'M21 14.3V16.7'],
12
+ paths: ['M3 17.5H6', 'M3 16.3V18.7', 'M18 17.5H21', 'M21 16.3V18.7'],
13
13
  poses: [{}, {}, {}],
14
14
  accent: true,
15
15
  },
16
+ {
17
+ name: 'ears',
18
+ paths: ['M6 12.2C3.4 10.5 2.9 14.5 6 15.1Z', 'M18 12.2C20.6 10.5 21.1 14.5 18 15.1Z'],
19
+ poses: [{}, {}, {}],
20
+ detail: true,
21
+ surface: true,
22
+ },
16
23
  {
17
24
  name: 'head',
18
25
  paths: ['M6 5Q6 3 8 3H16Q18 3 18 5V17Q18 21 12 21Q6 21 6 17Z'],
@@ -21,12 +28,21 @@ export const frankensteinArt = {
21
28
  },
22
29
  {
23
30
  name: 'fringe',
24
- paths: ['M6 7.8H8.3L9.3 9L10.7 7.8H13.3L14.3 9L15.7 7.8H18'],
31
+ paths: [
32
+ 'M6 5.2C5.3 3.5 6.35 2.15 8.5 2.1C9.9 2.05 11.1 2.5 12 3.05C12.9 1.55 15 1.55 16.65 2.2C18 2.75 18.65 4.15 18 5.2Q14.9 4.3 12 4.9Q8.8 4 6 5.2Z',
33
+ ],
34
+ poses: [{}, {}, {}],
35
+ fillOnly: 'ink',
36
+ },
37
+ {
38
+ name: 'hair-part',
39
+ paths: ['M11.8 2.85Q12.1 3.65 12 4.6Q12.35 3.55 12.8 2.5Q12.25 2.6 11.8 2.85Z'],
25
40
  poses: [{}, {}, {}],
41
+ fillOnly: 'surface',
26
42
  },
27
43
  {
28
44
  name: 'stitches',
29
- paths: ['M9 5.5H14.5', 'M10.7 4.9V6.1', 'M13 4.9V6.1'],
45
+ paths: ['M9 6.8H14.5', 'M10.7 6.2V7.4', 'M13 6.2V7.4'],
30
46
  poses: [{}, {}, {}],
31
47
  detail: true,
32
48
  accent: true,
@@ -73,7 +89,7 @@ export const frankensteinArt = {
73
89
  },
74
90
  {
75
91
  name: 'left-arc',
76
- paths: ['M2 10.7L3.1 12L1.6 13.2'],
92
+ paths: ['M2 8.2L3.1 9.5L1.6 10.7'],
77
93
  poses: [
78
94
  {
79
95
  opacity: 0,
@@ -123,7 +139,7 @@ export const frankensteinArt = {
123
139
  },
124
140
  {
125
141
  name: 'right-arc',
126
- paths: ['M22 10.7L20.9 12L22.4 13.2'],
142
+ paths: ['M22 8.2L20.9 9.5L22.4 10.7'],
127
143
  poses: [
128
144
  {
129
145
  opacity: 0,