weasel-icons 0.17.0 → 0.18.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.
Files changed (206) hide show
  1. package/README.md +4 -0
  2. package/dist/icons/air-quality/air-quality-icon.d.ts +5 -0
  3. package/dist/icons/air-quality/air-quality-icon.js +9 -0
  4. package/dist/icons/air-quality/air-quality-rig.d.ts +37 -0
  5. package/dist/icons/air-quality/air-quality-rig.js +92 -0
  6. package/dist/icons/astrolabe/astrolabe-icon.d.ts +5 -0
  7. package/dist/icons/astrolabe/astrolabe-icon.js +9 -0
  8. package/dist/icons/astrolabe/astrolabe-rig.d.ts +140 -0
  9. package/dist/icons/astrolabe/astrolabe-rig.js +117 -0
  10. package/dist/icons/aurora/aurora-icon.d.ts +5 -0
  11. package/dist/icons/aurora/aurora-icon.js +9 -0
  12. package/dist/icons/aurora/aurora-rig.d.ts +64 -0
  13. package/dist/icons/aurora/aurora-rig.js +102 -0
  14. package/dist/icons/brain-computer-interface/brain-computer-interface-icon.d.ts +5 -0
  15. package/dist/icons/brain-computer-interface/brain-computer-interface-icon.js +9 -0
  16. package/dist/icons/brain-computer-interface/brain-computer-interface-rig.d.ts +112 -0
  17. package/dist/icons/brain-computer-interface/brain-computer-interface-rig.js +177 -0
  18. package/dist/icons/carbon-capture/carbon-capture-icon.d.ts +5 -0
  19. package/dist/icons/carbon-capture/carbon-capture-icon.js +9 -0
  20. package/dist/icons/carbon-capture/carbon-capture-rig.d.ts +165 -0
  21. package/dist/icons/carbon-capture/carbon-capture-rig.js +173 -0
  22. package/dist/icons/content-credentials/content-credentials-icon.d.ts +5 -0
  23. package/dist/icons/content-credentials/content-credentials-icon.js +9 -0
  24. package/dist/icons/content-credentials/content-credentials-rig.d.ts +106 -0
  25. package/dist/icons/content-credentials/content-credentials-rig.js +89 -0
  26. package/dist/icons/coral-reef/coral-reef-icon.d.ts +5 -0
  27. package/dist/icons/coral-reef/coral-reef-icon.js +9 -0
  28. package/dist/icons/coral-reef/coral-reef-rig.d.ts +60 -0
  29. package/dist/icons/coral-reef/coral-reef-rig.js +71 -0
  30. package/dist/icons/cultivated-meat/cultivated-meat-icon.d.ts +5 -0
  31. package/dist/icons/cultivated-meat/cultivated-meat-icon.js +9 -0
  32. package/dist/icons/cultivated-meat/cultivated-meat-rig.d.ts +68 -0
  33. package/dist/icons/cultivated-meat/cultivated-meat-rig.js +119 -0
  34. package/dist/icons/data-center/data-center-icon.d.ts +5 -0
  35. package/dist/icons/data-center/data-center-icon.js +9 -0
  36. package/dist/icons/data-center/data-center-rig.d.ts +48 -0
  37. package/dist/icons/data-center/data-center-rig.js +66 -0
  38. package/dist/icons/deepfake/deepfake-icon.d.ts +5 -0
  39. package/dist/icons/deepfake/deepfake-icon.js +9 -0
  40. package/dist/icons/deepfake/deepfake-rig.d.ts +97 -0
  41. package/dist/icons/deepfake/deepfake-rig.js +92 -0
  42. package/dist/icons/drought/drought-icon.d.ts +5 -0
  43. package/dist/icons/drought/drought-icon.js +9 -0
  44. package/dist/icons/drought/drought-rig.d.ts +86 -0
  45. package/dist/icons/drought/drought-rig.js +83 -0
  46. package/dist/icons/excavation/excavation-icon.d.ts +5 -0
  47. package/dist/icons/excavation/excavation-icon.js +9 -0
  48. package/dist/icons/excavation/excavation-rig.d.ts +121 -0
  49. package/dist/icons/excavation/excavation-rig.js +81 -0
  50. package/dist/icons/exoplanet-transit/exoplanet-transit-icon.d.ts +5 -0
  51. package/dist/icons/exoplanet-transit/exoplanet-transit-icon.js +9 -0
  52. package/dist/icons/exoplanet-transit/exoplanet-transit-rig.d.ts +271 -0
  53. package/dist/icons/exoplanet-transit/exoplanet-transit-rig.js +134 -0
  54. package/dist/icons/fusion-reactor/fusion-reactor-icon.d.ts +5 -0
  55. package/dist/icons/fusion-reactor/fusion-reactor-icon.js +9 -0
  56. package/dist/icons/fusion-reactor/fusion-reactor-rig.d.ts +149 -0
  57. package/dist/icons/fusion-reactor/fusion-reactor-rig.js +146 -0
  58. package/dist/icons/gene-editing/gene-editing-icon.d.ts +5 -0
  59. package/dist/icons/gene-editing/gene-editing-icon.js +9 -0
  60. package/dist/icons/gene-editing/gene-editing-rig.d.ts +113 -0
  61. package/dist/icons/gene-editing/gene-editing-rig.js +152 -0
  62. package/dist/icons/glacier-melt/glacier-melt-icon.d.ts +5 -0
  63. package/dist/icons/glacier-melt/glacier-melt-icon.js +9 -0
  64. package/dist/icons/glacier-melt/glacier-melt-rig.d.ts +116 -0
  65. package/dist/icons/glacier-melt/glacier-melt-rig.js +159 -0
  66. package/dist/icons/gramophone/gramophone-icon.d.ts +5 -0
  67. package/dist/icons/gramophone/gramophone-icon.js +9 -0
  68. package/dist/icons/gramophone/gramophone-rig.d.ts +66 -0
  69. package/dist/icons/gramophone/gramophone-rig.js +88 -0
  70. package/dist/icons/green-hydrogen/green-hydrogen-icon.d.ts +5 -0
  71. package/dist/icons/green-hydrogen/green-hydrogen-icon.js +9 -0
  72. package/dist/icons/green-hydrogen/green-hydrogen-rig.d.ts +48 -0
  73. package/dist/icons/green-hydrogen/green-hydrogen-rig.js +93 -0
  74. package/dist/icons/grid-battery/grid-battery-icon.d.ts +5 -0
  75. package/dist/icons/grid-battery/grid-battery-icon.js +9 -0
  76. package/dist/icons/grid-battery/grid-battery-rig.d.ts +76 -0
  77. package/dist/icons/grid-battery/grid-battery-rig.js +92 -0
  78. package/dist/icons/heat-pump/heat-pump-icon.d.ts +5 -0
  79. package/dist/icons/heat-pump/heat-pump-icon.js +9 -0
  80. package/dist/icons/heat-pump/heat-pump-rig.d.ts +57 -0
  81. package/dist/icons/heat-pump/heat-pump-rig.js +124 -0
  82. package/dist/icons/humanoid-robot/humanoid-robot-icon.d.ts +5 -0
  83. package/dist/icons/humanoid-robot/humanoid-robot-icon.js +9 -0
  84. package/dist/icons/humanoid-robot/humanoid-robot-rig.d.ts +162 -0
  85. package/dist/icons/humanoid-robot/humanoid-robot-rig.js +266 -0
  86. package/dist/icons/injection-pen/injection-pen-icon.d.ts +5 -0
  87. package/dist/icons/injection-pen/injection-pen-icon.js +9 -0
  88. package/dist/icons/injection-pen/injection-pen-rig.d.ts +159 -0
  89. package/dist/icons/injection-pen/injection-pen-rig.js +142 -0
  90. package/dist/icons/liberty-bell/liberty-bell-icon.d.ts +5 -0
  91. package/dist/icons/liberty-bell/liberty-bell-icon.js +9 -0
  92. package/dist/icons/liberty-bell/liberty-bell-rig.d.ts +153 -0
  93. package/dist/icons/liberty-bell/liberty-bell-rig.js +98 -0
  94. package/dist/icons/longship/longship-icon.d.ts +5 -0
  95. package/dist/icons/longship/longship-icon.js +9 -0
  96. package/dist/icons/longship/longship-rig.d.ts +78 -0
  97. package/dist/icons/longship/longship-rig.js +93 -0
  98. package/dist/icons/lunar-lander/lunar-lander-icon.d.ts +5 -0
  99. package/dist/icons/lunar-lander/lunar-lander-icon.js +9 -0
  100. package/dist/icons/lunar-lander/lunar-lander-rig.d.ts +160 -0
  101. package/dist/icons/lunar-lander/lunar-lander-rig.js +97 -0
  102. package/dist/icons/mars-rover/mars-rover-icon.d.ts +5 -0
  103. package/dist/icons/mars-rover/mars-rover-icon.js +9 -0
  104. package/dist/icons/mars-rover/mars-rover-rig.d.ts +138 -0
  105. package/dist/icons/mars-rover/mars-rover-rig.js +146 -0
  106. package/dist/icons/methane-leak/methane-leak-icon.d.ts +5 -0
  107. package/dist/icons/methane-leak/methane-leak-icon.js +9 -0
  108. package/dist/icons/methane-leak/methane-leak-rig.d.ts +137 -0
  109. package/dist/icons/methane-leak/methane-leak-rig.js +102 -0
  110. package/dist/icons/microplastics/microplastics-icon.d.ts +5 -0
  111. package/dist/icons/microplastics/microplastics-icon.js +9 -0
  112. package/dist/icons/microplastics/microplastics-rig.d.ts +129 -0
  113. package/dist/icons/microplastics/microplastics-rig.js +141 -0
  114. package/dist/icons/passkey/passkey-icon.d.ts +5 -0
  115. package/dist/icons/passkey/passkey-icon.js +9 -0
  116. package/dist/icons/passkey/passkey-rig.d.ts +104 -0
  117. package/dist/icons/passkey/passkey-rig.js +105 -0
  118. package/dist/icons/pollinator/pollinator-icon.d.ts +5 -0
  119. package/dist/icons/pollinator/pollinator-icon.js +9 -0
  120. package/dist/icons/pollinator/pollinator-rig.d.ts +67 -0
  121. package/dist/icons/pollinator/pollinator-rig.js +160 -0
  122. package/dist/icons/printing-press/printing-press-icon.d.ts +5 -0
  123. package/dist/icons/printing-press/printing-press-icon.js +9 -0
  124. package/dist/icons/printing-press/printing-press-rig.d.ts +157 -0
  125. package/dist/icons/printing-press/printing-press-rig.js +102 -0
  126. package/dist/icons/prompt-injection/prompt-injection-icon.d.ts +5 -0
  127. package/dist/icons/prompt-injection/prompt-injection-icon.js +9 -0
  128. package/dist/icons/prompt-injection/prompt-injection-rig.d.ts +68 -0
  129. package/dist/icons/prompt-injection/prompt-injection-rig.js +71 -0
  130. package/dist/icons/qubit/qubit-icon.d.ts +5 -0
  131. package/dist/icons/qubit/qubit-icon.js +9 -0
  132. package/dist/icons/qubit/qubit-rig.d.ts +45 -0
  133. package/dist/icons/qubit/qubit-rig.js +108 -0
  134. package/dist/icons/reforestation/reforestation-icon.d.ts +5 -0
  135. package/dist/icons/reforestation/reforestation-icon.js +9 -0
  136. package/dist/icons/reforestation/reforestation-rig.d.ts +59 -0
  137. package/dist/icons/reforestation/reforestation-rig.js +71 -0
  138. package/dist/icons/robotaxi/robotaxi-icon.d.ts +5 -0
  139. package/dist/icons/robotaxi/robotaxi-icon.js +9 -0
  140. package/dist/icons/robotaxi/robotaxi-rig.d.ts +105 -0
  141. package/dist/icons/robotaxi/robotaxi-rig.js +128 -0
  142. package/dist/icons/roman-aqueduct/roman-aqueduct-icon.d.ts +5 -0
  143. package/dist/icons/roman-aqueduct/roman-aqueduct-icon.js +9 -0
  144. package/dist/icons/roman-aqueduct/roman-aqueduct-rig.d.ts +53 -0
  145. package/dist/icons/roman-aqueduct/roman-aqueduct-rig.js +144 -0
  146. package/dist/icons/rosetta-stone/rosetta-stone-icon.d.ts +5 -0
  147. package/dist/icons/rosetta-stone/rosetta-stone-icon.js +9 -0
  148. package/dist/icons/rosetta-stone/rosetta-stone-rig.d.ts +85 -0
  149. package/dist/icons/rosetta-stone/rosetta-stone-rig.js +99 -0
  150. package/dist/icons/satellite-constellation/satellite-constellation-icon.d.ts +5 -0
  151. package/dist/icons/satellite-constellation/satellite-constellation-icon.js +9 -0
  152. package/dist/icons/satellite-constellation/satellite-constellation-rig.d.ts +140 -0
  153. package/dist/icons/satellite-constellation/satellite-constellation-rig.js +186 -0
  154. package/dist/icons/sea-level-rise/sea-level-rise-icon.d.ts +5 -0
  155. package/dist/icons/sea-level-rise/sea-level-rise-icon.js +9 -0
  156. package/dist/icons/sea-level-rise/sea-level-rise-rig.d.ts +83 -0
  157. package/dist/icons/sea-level-rise/sea-level-rise-rig.js +71 -0
  158. package/dist/icons/sextant/sextant-icon.d.ts +5 -0
  159. package/dist/icons/sextant/sextant-icon.js +9 -0
  160. package/dist/icons/sextant/sextant-rig.d.ts +113 -0
  161. package/dist/icons/sextant/sextant-rig.js +106 -0
  162. package/dist/icons/smart-glasses/smart-glasses-icon.d.ts +5 -0
  163. package/dist/icons/smart-glasses/smart-glasses-icon.js +9 -0
  164. package/dist/icons/smart-glasses/smart-glasses-rig.d.ts +42 -0
  165. package/dist/icons/smart-glasses/smart-glasses-rig.js +55 -0
  166. package/dist/icons/space-debris/space-debris-icon.d.ts +5 -0
  167. package/dist/icons/space-debris/space-debris-icon.js +9 -0
  168. package/dist/icons/space-debris/space-debris-rig.d.ts +146 -0
  169. package/dist/icons/space-debris/space-debris-rig.js +160 -0
  170. package/dist/icons/space-telescope/space-telescope-icon.d.ts +5 -0
  171. package/dist/icons/space-telescope/space-telescope-icon.js +9 -0
  172. package/dist/icons/space-telescope/space-telescope-rig.d.ts +103 -0
  173. package/dist/icons/space-telescope/space-telescope-rig.js +99 -0
  174. package/dist/icons/sundial/sundial-icon.d.ts +5 -0
  175. package/dist/icons/sundial/sundial-icon.js +9 -0
  176. package/dist/icons/sundial/sundial-rig.d.ts +57 -0
  177. package/dist/icons/sundial/sundial-rig.js +73 -0
  178. package/dist/icons/telegraph/telegraph-icon.d.ts +5 -0
  179. package/dist/icons/telegraph/telegraph-icon.js +9 -0
  180. package/dist/icons/telegraph/telegraph-rig.d.ts +61 -0
  181. package/dist/icons/telegraph/telegraph-rig.js +145 -0
  182. package/dist/icons/time-capsule/time-capsule-icon.d.ts +5 -0
  183. package/dist/icons/time-capsule/time-capsule-icon.js +9 -0
  184. package/dist/icons/time-capsule/time-capsule-rig.d.ts +139 -0
  185. package/dist/icons/time-capsule/time-capsule-rig.js +161 -0
  186. package/dist/icons/trebuchet/trebuchet-icon.d.ts +5 -0
  187. package/dist/icons/trebuchet/trebuchet-icon.js +9 -0
  188. package/dist/icons/trebuchet/trebuchet-rig.d.ts +119 -0
  189. package/dist/icons/trebuchet/trebuchet-rig.js +106 -0
  190. package/dist/icons/vertical-farm/vertical-farm-icon.d.ts +5 -0
  191. package/dist/icons/vertical-farm/vertical-farm-icon.js +9 -0
  192. package/dist/icons/vertical-farm/vertical-farm-rig.d.ts +73 -0
  193. package/dist/icons/vertical-farm/vertical-farm-rig.js +83 -0
  194. package/dist/icons/wildfire/wildfire-icon.d.ts +5 -0
  195. package/dist/icons/wildfire/wildfire-icon.js +9 -0
  196. package/dist/icons/wildfire/wildfire-rig.d.ts +139 -0
  197. package/dist/icons/wildfire/wildfire-rig.js +119 -0
  198. package/dist/icons/wind-turbine/wind-turbine-icon.d.ts +5 -0
  199. package/dist/icons/wind-turbine/wind-turbine-icon.js +9 -0
  200. package/dist/icons/wind-turbine/wind-turbine-rig.d.ts +78 -0
  201. package/dist/icons/wind-turbine/wind-turbine-rig.js +84 -0
  202. package/dist/index.d.ts +50 -0
  203. package/dist/index.js +50 -0
  204. package/dist/shared/icon-colors.d.ts +50 -0
  205. package/dist/source.json +1 -1
  206. package/package.json +251 -1
@@ -0,0 +1,112 @@
1
+ /**
2
+ * The implant itself, in cross-section. The upper curve of the brain fills the lower canvas: a
3
+ * bold outline of five gyri meeting at sulcus cusps, over a light tissue tint. A flat implant
4
+ * chip sits on the crown of the middle gyrus and three flexible electrode threads (drawn faint,
5
+ * inside the tissue) run down from it. Spikes climb the threads into the chip; the chip then
6
+ * lights and transmits wirelessly as two arcs radiating up from it.
7
+ */
8
+ export declare const brainComputerInterfaceStates: readonly ["idle", "recording", "transmitting"];
9
+ export type BrainComputerInterfaceState = (typeof brainComputerInterfaceStates)[number];
10
+ export declare const brainComputerInterfaceArt: {
11
+ name: string;
12
+ parts: ({
13
+ name: string;
14
+ paths: string[];
15
+ accent: boolean;
16
+ pivot: readonly [number, number];
17
+ poses: ({
18
+ opacity: number;
19
+ } | {
20
+ opacity?: undefined;
21
+ })[];
22
+ gestures: ({
23
+ interpolation: "continuous";
24
+ frames: {
25
+ at: number;
26
+ x: number;
27
+ y: number;
28
+ opacity: number;
29
+ }[];
30
+ duration: number;
31
+ repeatAfter: number;
32
+ } | null)[];
33
+ } | {
34
+ name: string;
35
+ paths: string[];
36
+ fillOnly: "ink";
37
+ poses: {
38
+ opacity: number;
39
+ }[];
40
+ detail?: undefined;
41
+ accent?: undefined;
42
+ pivot?: undefined;
43
+ gestures?: undefined;
44
+ } | {
45
+ name: string;
46
+ paths: string[];
47
+ poses: {}[];
48
+ fillOnly?: undefined;
49
+ detail?: undefined;
50
+ accent?: undefined;
51
+ pivot?: undefined;
52
+ gestures?: undefined;
53
+ } | {
54
+ name: string;
55
+ paths: string[];
56
+ detail: true;
57
+ poses: {
58
+ opacity: number;
59
+ }[];
60
+ fillOnly?: undefined;
61
+ accent?: undefined;
62
+ pivot?: undefined;
63
+ gestures?: undefined;
64
+ } | {
65
+ name: string;
66
+ paths: string[];
67
+ fillOnly: "ink";
68
+ poses: {}[];
69
+ detail?: undefined;
70
+ accent?: undefined;
71
+ pivot?: undefined;
72
+ gestures?: undefined;
73
+ } | {
74
+ name: string;
75
+ paths: string[];
76
+ fillOnly: "ink";
77
+ accent: true;
78
+ pivot: [number, number];
79
+ poses: ({
80
+ opacity: number;
81
+ scaleX: number;
82
+ } | {
83
+ opacity?: undefined;
84
+ scaleX?: undefined;
85
+ })[];
86
+ detail?: undefined;
87
+ gestures?: undefined;
88
+ } | {
89
+ name: string;
90
+ paths: string[];
91
+ accent: true;
92
+ pivot: readonly [number, number];
93
+ poses: {}[];
94
+ gestures: ({
95
+ frames: ({
96
+ at: number;
97
+ opacity?: undefined;
98
+ scaleX?: undefined;
99
+ scaleY?: undefined;
100
+ } | {
101
+ at: number;
102
+ opacity: number;
103
+ scaleX: number;
104
+ scaleY: number;
105
+ })[];
106
+ duration: number;
107
+ repeatAfter: number;
108
+ } | null)[];
109
+ fillOnly?: undefined;
110
+ detail?: undefined;
111
+ })[];
112
+ };
@@ -0,0 +1,177 @@
1
+ /**
2
+ * The implant itself, in cross-section. The upper curve of the brain fills the lower canvas: a
3
+ * bold outline of five gyri meeting at sulcus cusps, over a light tissue tint. A flat implant
4
+ * chip sits on the crown of the middle gyrus and three flexible electrode threads (drawn faint,
5
+ * inside the tissue) run down from it. Spikes climb the threads into the chip; the chip then
6
+ * lights and transmits wirelessly as two arcs radiating up from it.
7
+ */
8
+ export const brainComputerInterfaceStates = ['idle', 'recording', 'transmitting'];
9
+ const n = (v) => +v.toFixed(3);
10
+ /** Rounded rectangle with cubic corners. */
11
+ const rr = (x1, y1, x2, y2, r) => {
12
+ const k = n(0.5523 * r);
13
+ return (`M${n(x1 + r)} ${y1}H${n(x2 - r)}C${n(x2 - r + k)} ${y1} ${x2} ${n(y1 + r - k)} ${x2} ${n(y1 + r)}` +
14
+ `V${n(y2 - r)}C${x2} ${n(y2 - r + k)} ${n(x2 - r + k)} ${y2} ${n(x2 - r)} ${y2}` +
15
+ `H${n(x1 + r)}C${n(x1 + r - k)} ${y2} ${x1} ${n(y2 - r + k)} ${x1} ${n(y2 - r)}` +
16
+ `V${n(y1 + r)}C${x1} ${n(y1 + r - k)} ${n(x1 + r - k)} ${y1} ${n(x1 + r)} ${y1}Z`);
17
+ };
18
+ // Cortex: the upper curve of the brain in section, five gyri meeting at sulcus cusps, with the
19
+ // chip on the crown of the middle one.
20
+ const DOME = { cx: 12, cy: 22.4, rx: 9.2, ry: 10.4, bump: 1.7, gyrus: 36 };
21
+ const SURFACE = (() => {
22
+ const steps = 90;
23
+ const pts = Array.from({ length: steps + 1 }, (_, i) => {
24
+ const th = 180 - (180 * i) / steps;
25
+ const b = Math.sqrt(Math.abs(Math.cos((Math.PI * (th - 90)) / DOME.gyrus)));
26
+ const k = 1 + (DOME.bump * b) / DOME.ry;
27
+ const x = DOME.cx + DOME.rx * k * Math.cos((th * Math.PI) / 180);
28
+ const y = DOME.cy - DOME.ry * k * Math.sin((th * Math.PI) / 180);
29
+ return `${n(x)} ${n(Math.min(y, 21.6))}`;
30
+ });
31
+ return `M${pts[0]}L${pts.slice(1).join('L')}`;
32
+ })();
33
+ /** The tissue under the surface, cut off by the frame of the section. */
34
+ const TISSUE = `${SURFACE}Z`;
35
+ // Chip seated on the crown of the middle gyrus.
36
+ const CHIP = { x1: 8.6, y1: 7.2, x2: 15.4, y2: 10.4 };
37
+ const END = 18.2;
38
+ const THREADS = [
39
+ { x0: 10.2, dx: -1.6, sway: 0.3 },
40
+ { x0: 12, dx: 0, sway: -0.3 },
41
+ { x0: 13.8, dx: 1.6, sway: 0.3 },
42
+ ];
43
+ const threadX = (t, y) => {
44
+ const u = (y - CHIP.y2) / (END - CHIP.y2);
45
+ return t.x0 + t.dx * u + t.sway * Math.sin(Math.PI * 2 * u);
46
+ };
47
+ const threadPath = (t) => {
48
+ const steps = 10;
49
+ const pts = Array.from({ length: steps + 1 }, (_, i) => {
50
+ const y = CHIP.y2 + ((END - CHIP.y2) * i) / steps;
51
+ return `${n(threadX(t, y))} ${n(y)}`;
52
+ });
53
+ return `M${pts[0]}L${pts.slice(1).join('L')}`;
54
+ };
55
+ const SPIKE_HALF = 0.75;
56
+ const BURST = { duration: 2.4, repeatAfter: 3.2 };
57
+ // Spike centres climb from near the thread tip to just under the chip.
58
+ const RUN = [CHIP.y2 + 1.1, END - 0.6];
59
+ /**
60
+ * Constant-speed climb along a thread from the rest centre c: up to the chip, wrap to the
61
+ * thread tip, back to c. The x offset follows the thread's sway so the spike stays on it.
62
+ */
63
+ function climb(t, c) {
64
+ const len = RUN[1] - RUN[0];
65
+ const ahead = c - RUN[0];
66
+ const fade = (y) => {
67
+ const e = Math.max(0, Math.min(1, Math.min(y - RUN[0], RUN[1] - y) / 1.1));
68
+ return e * e * (3 - 2 * e);
69
+ };
70
+ const wrap = ahead / len;
71
+ const pos = (u) => {
72
+ const d = u * len;
73
+ return d <= ahead ? c - d : RUN[1] - (d - ahead);
74
+ };
75
+ const cx = threadX(t, c);
76
+ const frame = (when, y, opacity) => ({
77
+ at: n(when),
78
+ x: n(threadX(t, y) - cx),
79
+ y: n(y - c),
80
+ opacity: n(opacity),
81
+ });
82
+ const times = Array.from({ length: 25 }, (_, i) => i / 24).filter((u) => Math.abs(u - wrap) > 0.02);
83
+ const frames = times.map((u) => frame(u, pos(u), fade(pos(u)) - fade(c)));
84
+ frames.push(frame(wrap - 0.004, RUN[0], -1), frame(wrap + 0.004, RUN[1], -1));
85
+ frames.sort((a, b) => a.at - b.at);
86
+ frames[0] = { at: 0, x: 0, y: 0, opacity: 0 };
87
+ frames[frames.length - 1] = { at: 1, x: 0, y: 0, opacity: 0 };
88
+ return { ...BURST, interpolation: 'continuous', frames };
89
+ }
90
+ const spikePart = (name, t, c) => {
91
+ const x = n(threadX(t, c));
92
+ return {
93
+ name,
94
+ paths: [`M${x} ${n(c - SPIKE_HALF)}V${n(c + SPIKE_HALF)}`],
95
+ accent: true,
96
+ pivot: [x, c],
97
+ poses: [{ opacity: 0 }, {}, { opacity: 0 }],
98
+ gestures: [null, climb(t, c), null],
99
+ };
100
+ };
101
+ // Wireless arcs: concentric about a point inside the chip.
102
+ const ARC_C = [12, 8.8];
103
+ const arc = (r, half) => {
104
+ const a = (half * Math.PI) / 180;
105
+ const dx = n(r * Math.sin(a));
106
+ const dy = n(r * Math.cos(a));
107
+ return `M${n(ARC_C[0] - dx)} ${n(ARC_C[1] - dy)}A${r} ${r} 0 0 1 ${n(ARC_C[0] + dx)} ${n(ARC_C[1] - dy)}`;
108
+ };
109
+ /** A pulse leaving the chip: the arc fades, then grows back out from the chip. */
110
+ const pulse = (start) => ({
111
+ ...BURST,
112
+ frames: [
113
+ { at: 0 },
114
+ { at: start, opacity: -1, scaleX: -0.3, scaleY: -0.3 },
115
+ { at: n(start + 0.35) },
116
+ { at: 1 },
117
+ ],
118
+ });
119
+ const hidden = { opacity: 0, scaleX: 0.7, scaleY: 0.7 };
120
+ export const brainComputerInterfaceArt = {
121
+ name: 'brain-computer-interface',
122
+ parts: [
123
+ {
124
+ // The tissue below the surface, as a light tint down to the bottom of the canvas.
125
+ name: 'tissue',
126
+ paths: [TISSUE],
127
+ fillOnly: 'ink',
128
+ poses: [{ opacity: 0.22 }, { opacity: 0.22 }, { opacity: 0.22 }],
129
+ },
130
+ {
131
+ // The folded cortex surface.
132
+ name: 'cortex',
133
+ paths: [SURFACE],
134
+ poses: [{}, {}, {}],
135
+ },
136
+ {
137
+ name: 'threads',
138
+ paths: [THREADS.map(threadPath).join('')],
139
+ detail: true,
140
+ poses: [{ opacity: 0.5 }, { opacity: 0.5 }, { opacity: 0.5 }],
141
+ },
142
+ spikePart('spike-a', THREADS[0], 13.2),
143
+ spikePart('spike-b', THREADS[1], 15.4),
144
+ spikePart('spike-c', THREADS[2], 14.4),
145
+ {
146
+ name: 'chip',
147
+ paths: [rr(CHIP.x1, CHIP.y1, CHIP.x2, CHIP.y2, 1)],
148
+ fillOnly: 'ink',
149
+ poses: [{}, {}, {}],
150
+ },
151
+ {
152
+ // Lit when the chip is sending: the interior fills with the accent.
153
+ name: 'chip-light',
154
+ paths: [rr(CHIP.x1 + 0.8, CHIP.y1 + 0.8, CHIP.x2 - 0.8, CHIP.y2 - 0.8, 0.4)],
155
+ fillOnly: 'ink',
156
+ accent: true,
157
+ pivot: [12, (CHIP.y1 + CHIP.y2) / 2],
158
+ poses: [{ opacity: 0, scaleX: 0.3 }, { opacity: 0, scaleX: 0.3 }, {}],
159
+ },
160
+ {
161
+ name: 'arc-inner',
162
+ paths: [arc(4.4, 34)],
163
+ accent: true,
164
+ pivot: ARC_C,
165
+ poses: [hidden, hidden, {}],
166
+ gestures: [null, null, pulse(0.08)],
167
+ },
168
+ {
169
+ name: 'arc-outer',
170
+ paths: [arc(7.2, 34)],
171
+ accent: true,
172
+ pivot: ARC_C,
173
+ poses: [hidden, hidden, {}],
174
+ gestures: [null, null, pulse(0.3)],
175
+ },
176
+ ],
177
+ };
@@ -0,0 +1,5 @@
1
+ import type { StatefulIconProps } from "../../shared/icon-types.js";
2
+ import { type CarbonCaptureState } from "./carbon-capture-rig.js";
3
+ export { carbonCaptureStates, type CarbonCaptureState } from "./carbon-capture-rig.js";
4
+ export type CarbonCaptureIconProps = StatefulIconProps<CarbonCaptureState>;
5
+ export declare const CarbonCaptureIcon: import("react").NamedExoticComponent<CarbonCaptureIconProps>;
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { memo } from 'react';
4
+ import { ArticulatedIcon } from "../../shared/articulated-icon.js";
5
+ import { carbonCaptureArt, carbonCaptureStates, } from "./carbon-capture-rig.js";
6
+ export { carbonCaptureStates } from "./carbon-capture-rig.js";
7
+ export const CarbonCaptureIcon = memo(function CarbonCaptureIcon(props) {
8
+ return _jsx(ArticulatedIcon, { art: carbonCaptureArt, states: carbonCaptureStates, ...props });
9
+ });
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Direct air capture with geological storage, as a cross-section. A fan-driven capture unit
3
+ * stands on the ground and pulls an O=C=O molecule out of the air. Below the surface is solid
4
+ * rock; the captured CO2 runs down the injection well into a porous storage layer (the white
5
+ * cavity under a thick caprock) and spreads sideways from the well until the layer is full.
6
+ */
7
+ export declare const carbonCaptureStates: readonly ["airborne", "capturing", "stored"];
8
+ export type CarbonCaptureState = (typeof carbonCaptureStates)[number];
9
+ export declare const carbonCaptureArt: {
10
+ name: string;
11
+ parts: ({
12
+ name: string;
13
+ paths: string[];
14
+ fillOnly: "ink";
15
+ accent: true;
16
+ poses: ({
17
+ x?: undefined;
18
+ opacity?: undefined;
19
+ } | {
20
+ x: number;
21
+ opacity?: undefined;
22
+ } | {
23
+ x: number;
24
+ opacity: number;
25
+ })[];
26
+ gestures: ({
27
+ duration: number;
28
+ repeatAfter: number;
29
+ frames: ({
30
+ at: number;
31
+ x?: undefined;
32
+ opacity?: undefined;
33
+ } | {
34
+ at: number;
35
+ x: number;
36
+ opacity?: undefined;
37
+ } | {
38
+ at: number;
39
+ x: number;
40
+ opacity: number;
41
+ })[];
42
+ } | null)[];
43
+ surface?: undefined;
44
+ pivot?: undefined;
45
+ spin?: undefined;
46
+ pathStates?: undefined;
47
+ pathOffsets?: undefined;
48
+ } | {
49
+ name: string;
50
+ paths: string[];
51
+ surface: true;
52
+ poses: {}[];
53
+ fillOnly?: undefined;
54
+ accent?: undefined;
55
+ gestures?: undefined;
56
+ pivot?: undefined;
57
+ spin?: undefined;
58
+ pathStates?: undefined;
59
+ pathOffsets?: undefined;
60
+ } | {
61
+ name: string;
62
+ paths: string[];
63
+ fillOnly: "ink";
64
+ pivot: readonly [number, number];
65
+ spin: {
66
+ state: number;
67
+ degreesPerSecond: number;
68
+ };
69
+ poses: {}[];
70
+ accent?: undefined;
71
+ gestures?: undefined;
72
+ surface?: undefined;
73
+ pathStates?: undefined;
74
+ pathOffsets?: undefined;
75
+ } | {
76
+ name: string;
77
+ paths: string[];
78
+ fillOnly: "ink";
79
+ poses: {}[];
80
+ accent?: undefined;
81
+ gestures?: undefined;
82
+ surface?: undefined;
83
+ pivot?: undefined;
84
+ spin?: undefined;
85
+ pathStates?: undefined;
86
+ pathOffsets?: undefined;
87
+ } | {
88
+ name: string;
89
+ paths: string[];
90
+ fillOnly: "surface";
91
+ poses: {}[];
92
+ accent?: undefined;
93
+ gestures?: undefined;
94
+ surface?: undefined;
95
+ pivot?: undefined;
96
+ spin?: undefined;
97
+ pathStates?: undefined;
98
+ pathOffsets?: undefined;
99
+ } | {
100
+ name: string;
101
+ paths: string[];
102
+ pathStates: string[][];
103
+ pathOffsets: number[][];
104
+ fillOnly: "ink";
105
+ accent: true;
106
+ poses: ({
107
+ opacity: number;
108
+ } | {
109
+ opacity?: undefined;
110
+ })[];
111
+ gestures: ({
112
+ duration: number;
113
+ repeatAfter: number;
114
+ loop: false;
115
+ frames: ({
116
+ at: number;
117
+ flex: number;
118
+ } | {
119
+ at: number;
120
+ flex?: undefined;
121
+ })[];
122
+ } | null)[];
123
+ surface?: undefined;
124
+ pivot?: undefined;
125
+ spin?: undefined;
126
+ } | {
127
+ name: string;
128
+ paths: string[];
129
+ fillOnly: "ink";
130
+ accent: true;
131
+ pivot: [number, number];
132
+ poses: ({
133
+ scaleY: number;
134
+ opacity: number;
135
+ } | {
136
+ scaleY?: undefined;
137
+ opacity?: undefined;
138
+ })[];
139
+ gestures: ({
140
+ duration: number;
141
+ repeatAfter: number;
142
+ frames: ({
143
+ at: number;
144
+ opacity?: undefined;
145
+ scaleY?: undefined;
146
+ } | {
147
+ at: number;
148
+ opacity: number;
149
+ scaleY?: undefined;
150
+ } | {
151
+ at: number;
152
+ opacity: number;
153
+ scaleY: number;
154
+ } | {
155
+ at: number;
156
+ scaleY: number;
157
+ opacity?: undefined;
158
+ })[];
159
+ } | null)[];
160
+ surface?: undefined;
161
+ spin?: undefined;
162
+ pathStates?: undefined;
163
+ pathOffsets?: undefined;
164
+ })[];
165
+ };
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Direct air capture with geological storage, as a cross-section. A fan-driven capture unit
3
+ * stands on the ground and pulls an O=C=O molecule out of the air. Below the surface is solid
4
+ * rock; the captured CO2 runs down the injection well into a porous storage layer (the white
5
+ * cavity under a thick caprock) and spreads sideways from the well until the layer is full.
6
+ */
7
+ export const carbonCaptureStates = ['airborne', 'capturing', 'stored'];
8
+ const n = (v) => +v.toFixed(3);
9
+ /** Cubic circle. */
10
+ const disc = (cx, cy, r) => {
11
+ const k = 0.5523 * r;
12
+ return (`M${n(cx + r)} ${n(cy)}C${n(cx + r)} ${n(cy + k)} ${n(cx + k)} ${n(cy + r)} ${n(cx)} ${n(cy + r)}` +
13
+ `C${n(cx - k)} ${n(cy + r)} ${n(cx - r)} ${n(cy + k)} ${n(cx - r)} ${n(cy)}` +
14
+ `C${n(cx - r)} ${n(cy - k)} ${n(cx - k)} ${n(cy - r)} ${n(cx)} ${n(cy - r)}` +
15
+ `C${n(cx + k)} ${n(cy - r)} ${n(cx + r)} ${n(cy - k)} ${n(cx + r)} ${n(cy)}Z`);
16
+ };
17
+ /** Horizontal pill with cubic ends; morph-safe (no arcs). */
18
+ const pill = (left, right, top, bottom) => {
19
+ const h = (bottom - top) / 2;
20
+ const k = n(0.5523 * h);
21
+ const m = n(top + h);
22
+ return (`M${n(left + h)} ${top}H${n(right - h)}C${n(right - h + k)} ${top} ${right} ${n(m - k)} ${right} ${m}` +
23
+ `C${right} ${n(m + k)} ${n(right - h + k)} ${bottom} ${n(right - h)} ${bottom}H${n(left + h)}` +
24
+ `C${n(left + h - k)} ${bottom} ${left} ${n(m + k)} ${left} ${m}C${left} ${n(m - k)} ${n(left + h - k)} ${top} ${n(left + h)} ${top}Z`);
25
+ };
26
+ /** Ground surface: the top of the rock. */
27
+ const GROUND = 12.8;
28
+ const UNIT = { left: 11.2, top: 2.6, right: 21.4, r: 1.8 };
29
+ const FAN = [16.3, 7.9];
30
+ const BLADE = 3;
31
+ const MOLECULE_Y = FAN[1];
32
+ /** Capturing: the molecule is half inside the unit's intake face. */
33
+ const INTAKE = 3.6;
34
+ /** Fully behind the unit's face. */
35
+ const SWALLOWED = 9.4;
36
+ const WELL_X = FAN[0];
37
+ const WELL_HALF = 1;
38
+ const LAYER = { left: 4.2, right: 19.8, top: 16.2, bottom: 19.8 };
39
+ const layer = (left) => pill(left, LAYER.right, LAYER.top, LAYER.bottom);
40
+ const EMPTY_LEFT = LAYER.right - (LAYER.bottom - LAYER.top);
41
+ const NUMBERS = /[-+]?(?:\d*\.\d+|\d+\.?\d*)/g;
42
+ /** Flex 1 pulls the CO2's far edge all the way back to the well end of the layer. */
43
+ const RETRACT = ((a, b) => {
44
+ const to = a.match(NUMBERS).map(Number);
45
+ return b.match(NUMBERS).map((v, i) => n(to[i] - Number(v)));
46
+ })(layer(EMPTY_LEFT), layer(LAYER.left));
47
+ // Spread slowly after the state change instead of riding the 0.4 s state spring. These flex
48
+ // values cancel most of the spring's path blend from the usual neighbouring state.
49
+ const HOLD_STORED = n((10.6 - LAYER.left) / (EMPTY_LEFT - LAYER.left));
50
+ /** One broad fan blade from the hub, rotated about the hub. */
51
+ const blade = (deg) => {
52
+ const a = (deg * Math.PI) / 180;
53
+ const p = (x, y) => `${n(x * Math.cos(a) - y * Math.sin(a) + FAN[0])} ${n(x * Math.sin(a) + y * Math.cos(a) + FAN[1])}`;
54
+ return `M${p(0, 0)}C${p(-1.75, -0.75)} ${p(-1.55, -BLADE)} ${p(0, -BLADE)}C${p(1.55, -BLADE)} ${p(1.75, -0.75)} ${p(0, 0)}Z`;
55
+ };
56
+ const WELL_SLOT = `M${WELL_X - WELL_HALF} ${GROUND - 0.1}H${WELL_X + WELL_HALF}V${LAYER.top + 1}H${WELL_X - WELL_HALF}Z`;
57
+ export const carbonCaptureArt = {
58
+ name: 'carbon-capture',
59
+ parts: [
60
+ {
61
+ // O=C=O in the air, drawn below the unit so its intake face swallows it.
62
+ name: 'co2',
63
+ paths: [disc(3.8, MOLECULE_Y, 1.2), disc(5.8, MOLECULE_Y, 1.55), disc(7.8, MOLECULE_Y, 1.2)],
64
+ fillOnly: 'ink',
65
+ accent: true,
66
+ poses: [{}, { x: INTAKE }, { x: SWALLOWED, opacity: 0 }],
67
+ gestures: [
68
+ null,
69
+ {
70
+ // Pulled in through the fan; the next molecule drifts in from the air.
71
+ duration: 3,
72
+ repeatAfter: 3.6,
73
+ frames: [
74
+ { at: 0 },
75
+ { at: 0.08 },
76
+ { at: 0.36, x: SWALLOWED - INTAKE },
77
+ { at: 0.4, x: SWALLOWED - INTAKE, opacity: -1 },
78
+ { at: 0.48, x: -5.2, opacity: -1 },
79
+ { at: 0.92 },
80
+ { at: 1 },
81
+ ],
82
+ },
83
+ null,
84
+ ],
85
+ },
86
+ {
87
+ name: 'unit',
88
+ paths: [
89
+ `M${UNIT.left} ${GROUND}V${n(UNIT.top + UNIT.r)}A${UNIT.r} ${UNIT.r} 0 0 1 ${n(UNIT.left + UNIT.r)} ${UNIT.top}` +
90
+ `H${n(UNIT.right - UNIT.r)}A${UNIT.r} ${UNIT.r} 0 0 1 ${UNIT.right} ${n(UNIT.top + UNIT.r)}V${GROUND}Z`,
91
+ ],
92
+ surface: true,
93
+ poses: [{}, {}, {}],
94
+ },
95
+ {
96
+ name: 'fan',
97
+ paths: [blade(0), blade(120), blade(240)],
98
+ fillOnly: 'ink',
99
+ pivot: FAN,
100
+ spin: { state: 1, degreesPerSecond: 140 },
101
+ poses: [{}, {}, {}],
102
+ },
103
+ {
104
+ // Solid rock below the ground surface.
105
+ name: 'rock',
106
+ paths: [
107
+ `M2.6 ${GROUND}H21.4V20.2C21.4 20.86 20.86 21.4 20.2 21.4H3.8C3.14 21.4 2.6 20.86 2.6 20.2Z`,
108
+ ],
109
+ fillOnly: 'ink',
110
+ poses: [{}, {}, {}],
111
+ },
112
+ {
113
+ // The injection well and the porous storage layer under the caprock.
114
+ name: 'reservoir',
115
+ paths: [WELL_SLOT, layer(LAYER.left)],
116
+ fillOnly: 'surface',
117
+ poses: [{}, {}, {}],
118
+ },
119
+ {
120
+ // CO2 spreading through the storage layer from the well.
121
+ name: 'stored-co2',
122
+ paths: [layer(LAYER.left)],
123
+ pathStates: [[layer(EMPTY_LEFT)], [layer(10.6)], [layer(LAYER.left)]],
124
+ pathOffsets: [RETRACT],
125
+ fillOnly: 'ink',
126
+ accent: true,
127
+ poses: [{ opacity: 0 }, {}, {}],
128
+ gestures: [
129
+ {
130
+ // Emptied: fade where it is, then shrink back unseen.
131
+ duration: 1.6,
132
+ repeatAfter: 1.6,
133
+ loop: false,
134
+ frames: [{ at: 0, flex: -0.5 }, { at: 0.3, flex: -0.5 }, { at: 1 }],
135
+ },
136
+ null,
137
+ {
138
+ // The layer fills outward from the well over about two seconds.
139
+ duration: 2.4,
140
+ repeatAfter: 2.4,
141
+ loop: false,
142
+ frames: [{ at: 0, flex: HOLD_STORED }, { at: 0.12, flex: HOLD_STORED }, { at: 1 }],
143
+ },
144
+ ],
145
+ },
146
+ {
147
+ // Injection under way: captured CO2 runs down the well.
148
+ name: 'injection',
149
+ paths: [WELL_SLOT],
150
+ fillOnly: 'ink',
151
+ accent: true,
152
+ pivot: [WELL_X, GROUND],
153
+ poses: [{ scaleY: 0, opacity: 0 }, {}, { scaleY: 0, opacity: 0 }],
154
+ gestures: [
155
+ null,
156
+ {
157
+ duration: 3,
158
+ repeatAfter: 3.6,
159
+ frames: [
160
+ { at: 0 },
161
+ { at: 0.3 },
162
+ { at: 0.36, opacity: -1 },
163
+ { at: 0.4, opacity: -1, scaleY: -1 },
164
+ { at: 0.44, scaleY: -1 },
165
+ { at: 0.74 },
166
+ { at: 1 },
167
+ ],
168
+ },
169
+ null,
170
+ ],
171
+ },
172
+ ],
173
+ };
@@ -0,0 +1,5 @@
1
+ import type { StatefulIconProps } from "../../shared/icon-types.js";
2
+ import { type ContentCredentialsState } from "./content-credentials-rig.js";
3
+ export { contentCredentialsStates, type ContentCredentialsState } from "./content-credentials-rig.js";
4
+ export type ContentCredentialsIconProps = StatefulIconProps<ContentCredentialsState>;
5
+ export declare const ContentCredentialsIcon: import("react").NamedExoticComponent<ContentCredentialsIconProps>;
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { memo } from 'react';
4
+ import { ArticulatedIcon } from "../../shared/articulated-icon.js";
5
+ import { contentCredentialsArt, contentCredentialsStates, } from "./content-credentials-rig.js";
6
+ export { contentCredentialsStates } from "./content-credentials-rig.js";
7
+ export const ContentCredentialsIcon = memo(function ContentCredentialsIcon(props) {
8
+ return (_jsx(ArticulatedIcon, { art: contentCredentialsArt, states: contentCredentialsStates, ...props }));
9
+ });