@zero-transfer/sdk 0.1.0-alpha.0 → 0.1.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.
@@ -1,201 +1,201 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 200" width="880" height="200" role="img" aria-label="Zero Transfer">
2
- <defs>
3
- <!--
4
- The 3D ring illusion works by COMBINING two animations on each ring:
5
- 1. animateTransform rotate on the GROUP → the ring's plane tilts/gyrates in 2D
6
- 2. animate ry on the ELLIPSE → ry oscillates 22→56→22→5→22
7
- This approximates the projection of a 3D ring rotating through one full turn:
8
- 56≈face-on (near), 22≈tilted, 5≈edge-on (far). The human visual system reads
9
- the compound motion as genuine 3D rotation.
10
- -->
11
-
12
- <!-- Color-shifting accent – the stop-colors drift between cyan/indigo/violet -->
13
- <linearGradient id="gAccent" x1="0%" y1="0%" x2="100%" y2="0%">
14
- <stop offset="0%" stop-color="#22d3ee">
15
- <animate attributeName="stop-color"
16
- values="#22d3ee;#818cf8;#22d3ee" dur="7s" repeatCount="indefinite"/>
17
- </stop>
18
- <stop offset="100%" stop-color="#c084fc">
19
- <animate attributeName="stop-color"
20
- values="#c084fc;#06b6d4;#c084fc" dur="7s" repeatCount="indefinite"/>
21
- </stop>
22
- </linearGradient>
23
-
24
- <!-- Nucleus glow -->
25
- <filter id="nucGlow" x="-100%" y="-100%" width="300%" height="300%">
26
- <feGaussianBlur stdDeviation="4" result="b"/>
27
- <feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
28
- </filter>
29
-
30
- <!-- Sweep bar glow -->
31
- <filter id="sweepGlow" x="-50%" y="-300%" width="200%" height="700%">
32
- <feGaussianBlur stdDeviation="2.5" result="b"/>
33
- <feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
34
- </filter>
35
-
36
- <!-- Clips the sweep highlight so it never exits the track bounds -->
37
- <clipPath id="barClip">
38
- <rect x="0" y="145" width="600" height="12"/>
39
- </clipPath>
40
- </defs>
41
-
42
- <!-- ╔══════════════════════════════════════════════╗ -->
43
- <!-- ║ ATOM MARK (centred at 106,100) ║ -->
44
- <!-- ╚══════════════════════════════════════════════╝ -->
45
- <g transform="translate(106,100)">
46
-
47
- <!-- Soft breathing halo — gives the mark a "live energy" feel -->
48
- <circle r="70" fill="none" stroke="url(#gAccent)" stroke-width="1" opacity="0.06">
49
- <animate attributeName="r" values="66;76;66" dur="5.5s" repeatCount="indefinite"/>
50
- <animate attributeName="opacity" values="0.03;0.11;0.03" dur="5.5s" repeatCount="indefinite"/>
51
- </circle>
52
-
53
- <!-- Ambient particles around the mark (twinkle, no motion to keep it clean) -->
54
- <circle cx="-67" cy="-20" r="1.8" fill="#22d3ee">
55
- <animate attributeName="opacity" values="0.12;0.65;0.12" dur="2.4s" repeatCount="indefinite"/>
56
- </circle>
57
- <circle cx="69" cy="14" r="1.4" fill="#c084fc">
58
- <animate attributeName="opacity" values="0.08;0.5;0.08" dur="3.2s" begin="0.9s" repeatCount="indefinite"/>
59
- </circle>
60
- <circle cx="-28" cy="67" r="1.6" fill="#818cf8">
61
- <animate attributeName="opacity" values="0.1;0.55;0.1" dur="2.9s" begin="1.6s" repeatCount="indefinite"/>
62
- </circle>
63
- <circle cx="44" cy="-60" r="1.4" fill="#22d3ee">
64
- <animate attributeName="opacity" values="0.1;0.45;0.1" dur="3.7s" begin="0.5s" repeatCount="indefinite"/>
65
- </circle>
66
- <circle cx="55" cy="-38" r="1.2" fill="#c084fc">
67
- <animate attributeName="opacity" values="0.08;0.4;0.08" dur="2.1s" begin="1.2s" repeatCount="indefinite"/>
68
- </circle>
69
-
70
- <!-- ─── RING A (cyan, plane gyrates CW 18 s, ry starts phase 0) ─── -->
71
- <g>
72
- <animateTransform attributeName="transform" type="rotate"
73
- from="0" to="360" dur="18s" repeatCount="indefinite"/>
74
- <!-- ghost track -->
75
- <ellipse rx="62" ry="22" fill="none" stroke="#22d3ee" stroke-width="0.75" opacity="0.1"/>
76
- <!-- 3D-tipping ring -->
77
- <ellipse rx="62" ry="22" fill="none" stroke="#22d3ee" stroke-linecap="round">
78
- <animate attributeName="ry"
79
- values="22;56;22;5;22" keyTimes="0;0.25;0.5;0.75;1"
80
- dur="7s" repeatCount="indefinite"
81
- calcMode="spline"
82
- keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1"/>
83
- <animate attributeName="stroke-width"
84
- values="1.5;3.2;1.5;0.7;1.5" keyTimes="0;0.25;0.5;0.75;1" dur="7s" repeatCount="indefinite"/>
85
- <animate attributeName="stroke-opacity"
86
- values="0.28;0.95;0.28;0.5;0.28" keyTimes="0;0.25;0.5;0.75;1" dur="7s" repeatCount="indefinite"/>
87
- </ellipse>
88
- <!-- comet dash -->
89
- <ellipse rx="62" ry="22" fill="none" stroke="#22d3ee"
90
- stroke-width="3" stroke-dasharray="68 232" stroke-linecap="round" opacity="0.85">
91
- <animate attributeName="stroke-dashoffset" values="0;-300" dur="2.2s" repeatCount="indefinite"/>
92
- </ellipse>
93
- </g>
94
-
95
- <!-- ─── RING B (indigo, plane gyrates CCW 24 s, ry phase +2.33 s) ─── -->
96
- <g>
97
- <animateTransform attributeName="transform" type="rotate"
98
- from="60" to="-300" dur="24s" repeatCount="indefinite"/>
99
- <ellipse rx="62" ry="22" fill="none" stroke="#818cf8" stroke-width="0.75" opacity="0.1"/>
100
- <ellipse rx="62" ry="22" fill="none" stroke="#818cf8" stroke-linecap="round">
101
- <animate attributeName="ry"
102
- values="22;56;22;5;22" keyTimes="0;0.25;0.5;0.75;1"
103
- dur="7s" begin="2.33s" repeatCount="indefinite"
104
- calcMode="spline"
105
- keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1"/>
106
- <animate attributeName="stroke-width"
107
- values="1.5;3.2;1.5;0.7;1.5" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="2.33s" repeatCount="indefinite"/>
108
- <animate attributeName="stroke-opacity"
109
- values="0.28;0.95;0.28;0.5;0.28" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="2.33s" repeatCount="indefinite"/>
110
- </ellipse>
111
- <ellipse rx="62" ry="22" fill="none" stroke="#818cf8"
112
- stroke-width="3" stroke-dasharray="68 232" stroke-linecap="round" opacity="0.85">
113
- <animate attributeName="stroke-dashoffset" values="0;-300" dur="2.8s" repeatCount="indefinite"/>
114
- </ellipse>
115
- </g>
116
-
117
- <!-- ─── RING C (violet, plane gyrates CW 21 s, ry phase +4.67 s) ─── -->
118
- <g>
119
- <animateTransform attributeName="transform" type="rotate"
120
- from="120" to="480" dur="21s" repeatCount="indefinite"/>
121
- <ellipse rx="62" ry="22" fill="none" stroke="#c084fc" stroke-width="0.75" opacity="0.1"/>
122
- <ellipse rx="62" ry="22" fill="none" stroke="#c084fc" stroke-linecap="round">
123
- <animate attributeName="ry"
124
- values="22;56;22;5;22" keyTimes="0;0.25;0.5;0.75;1"
125
- dur="7s" begin="4.67s" repeatCount="indefinite"
126
- calcMode="spline"
127
- keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1"/>
128
- <animate attributeName="stroke-width"
129
- values="1.5;3.2;1.5;0.7;1.5" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="4.67s" repeatCount="indefinite"/>
130
- <animate attributeName="stroke-opacity"
131
- values="0.28;0.95;0.28;0.5;0.28" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="4.67s" repeatCount="indefinite"/>
132
- </ellipse>
133
- <ellipse rx="62" ry="22" fill="none" stroke="#c084fc"
134
- stroke-width="3" stroke-dasharray="68 232" stroke-linecap="round" opacity="0.85">
135
- <animate attributeName="stroke-dashoffset" values="0;-300" dur="3.4s" repeatCount="indefinite"/>
136
- </ellipse>
137
- </g>
138
-
139
- <!-- Nucleus — sits on top of all rings, dark fill masks ring backs for z-depth -->
140
- <circle r="14" fill="#08111e"/>
141
- <circle r="14" fill="none" stroke="url(#gAccent)" stroke-width="2" filter="url(#nucGlow)">
142
- <animate attributeName="r" values="13;15;13" dur="4s" repeatCount="indefinite"/>
143
- <animate attributeName="stroke-opacity" values="0.5;1;0.5" dur="4s" repeatCount="indefinite"/>
144
- </circle>
145
- <!-- Z glyph — no fill, no stroke beyond the gradient line -->
146
- <path d="M -7,-5 L 7,-5 L -7,5 L 7,5"
147
- fill="none" stroke="url(#gAccent)"
148
- stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round">
149
- <animate attributeName="opacity" values="0.65;1;0.65" dur="4s" repeatCount="indefinite"/>
150
- </path>
151
- </g>
152
-
153
- <!-- ╔══════════════════════════════════════════════╗ -->
154
- <!-- ║ WORDMARK ║ -->
155
- <!-- ╚══════════════════════════════════════════════╝ -->
156
- <g transform="translate(220,0)"
157
- font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, system-ui, sans-serif">
158
-
159
- <!-- "zero" — clean off-white, gentle breath (no stroke, no shadow) -->
160
- <g>
161
- <animate attributeName="opacity" values="0.82;1;0.82" dur="5.5s" repeatCount="indefinite"/>
162
- <text x="0" y="108" font-size="62" font-weight="800"
163
- fill="#f1f5f9" letter-spacing="-2">zero</text>
164
- </g>
165
-
166
- <!-- "transfer" — animated gradient, out-of-phase with "zero" -->
167
- <g>
168
- <animate attributeName="opacity" values="1;0.86;1" dur="5.5s" repeatCount="indefinite"/>
169
- <text x="153" y="108" font-size="62" font-weight="800"
170
- fill="url(#gAccent)" letter-spacing="-2">transfer</text>
171
- </g>
172
-
173
- <!-- Tagline -->
174
- <g>
175
- <animate attributeName="opacity" values="0.55;0.85;0.55" dur="8s" repeatCount="indefinite"/>
176
- <text x="3" y="138" font-size="11.5" font-weight="600" letter-spacing="2.5">
177
- <tspan fill="#94a3b8">UNIVERSAL TRANSFER SDK</tspan>
178
- <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">FTP</tspan>
179
- <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">FTPS</tspan>
180
- <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">SFTP</tspan>
181
- <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">S3</tspan>
182
- <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">HTTP</tspan>
183
- </text>
184
- </g>
185
-
186
- <!-- Static track -->
187
- <rect x="0" y="153" width="600" height="1.5" rx="1" fill="#1c2a3a"/>
188
-
189
- <!-- Sweep highlight — clipped so it never exits the track -->
190
- <g clip-path="url(#barClip)">
191
- <rect x="-130" y="152.5" width="130" height="2" rx="1"
192
- fill="url(#gAccent)" filter="url(#sweepGlow)">
193
- <animate attributeName="x"
194
- values="-130;600;-130" dur="5.5s" repeatCount="indefinite"/>
195
- <animate attributeName="opacity"
196
- values="0;0.85;1;0.85;0" keyTimes="0;0.07;0.5;0.93;1"
197
- dur="5.5s" repeatCount="indefinite"/>
198
- </rect>
199
- </g>
200
- </g>
201
- </svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 200" width="880" height="200" role="img" aria-label="Zero Transfer">
2
+ <defs>
3
+ <!--
4
+ The 3D ring illusion works by COMBINING two animations on each ring:
5
+ 1. animateTransform rotate on the GROUP → the ring's plane tilts/gyrates in 2D
6
+ 2. animate ry on the ELLIPSE → ry oscillates 22→56→22→5→22
7
+ This approximates the projection of a 3D ring rotating through one full turn:
8
+ 56≈face-on (near), 22≈tilted, 5≈edge-on (far). The human visual system reads
9
+ the compound motion as genuine 3D rotation.
10
+ -->
11
+
12
+ <!-- Color-shifting accent – the stop-colors drift between cyan/indigo/violet -->
13
+ <linearGradient id="gAccent" x1="0%" y1="0%" x2="100%" y2="0%">
14
+ <stop offset="0%" stop-color="#22d3ee">
15
+ <animate attributeName="stop-color"
16
+ values="#22d3ee;#818cf8;#22d3ee" dur="7s" repeatCount="indefinite"/>
17
+ </stop>
18
+ <stop offset="100%" stop-color="#c084fc">
19
+ <animate attributeName="stop-color"
20
+ values="#c084fc;#06b6d4;#c084fc" dur="7s" repeatCount="indefinite"/>
21
+ </stop>
22
+ </linearGradient>
23
+
24
+ <!-- Nucleus glow -->
25
+ <filter id="nucGlow" x="-100%" y="-100%" width="300%" height="300%">
26
+ <feGaussianBlur stdDeviation="4" result="b"/>
27
+ <feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
28
+ </filter>
29
+
30
+ <!-- Sweep bar glow -->
31
+ <filter id="sweepGlow" x="-50%" y="-300%" width="200%" height="700%">
32
+ <feGaussianBlur stdDeviation="2.5" result="b"/>
33
+ <feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge>
34
+ </filter>
35
+
36
+ <!-- Clips the sweep highlight so it never exits the track bounds -->
37
+ <clipPath id="barClip">
38
+ <rect x="0" y="145" width="600" height="12"/>
39
+ </clipPath>
40
+ </defs>
41
+
42
+ <!-- ╔══════════════════════════════════════════════╗ -->
43
+ <!-- ║ ATOM MARK (centred at 106,100) ║ -->
44
+ <!-- ╚══════════════════════════════════════════════╝ -->
45
+ <g transform="translate(106,100)">
46
+
47
+ <!-- Soft breathing halo — gives the mark a "live energy" feel -->
48
+ <circle r="70" fill="none" stroke="url(#gAccent)" stroke-width="1" opacity="0.06">
49
+ <animate attributeName="r" values="66;76;66" dur="5.5s" repeatCount="indefinite"/>
50
+ <animate attributeName="opacity" values="0.03;0.11;0.03" dur="5.5s" repeatCount="indefinite"/>
51
+ </circle>
52
+
53
+ <!-- Ambient particles around the mark (twinkle, no motion to keep it clean) -->
54
+ <circle cx="-67" cy="-20" r="1.8" fill="#22d3ee">
55
+ <animate attributeName="opacity" values="0.12;0.65;0.12" dur="2.4s" repeatCount="indefinite"/>
56
+ </circle>
57
+ <circle cx="69" cy="14" r="1.4" fill="#c084fc">
58
+ <animate attributeName="opacity" values="0.08;0.5;0.08" dur="3.2s" begin="0.9s" repeatCount="indefinite"/>
59
+ </circle>
60
+ <circle cx="-28" cy="67" r="1.6" fill="#818cf8">
61
+ <animate attributeName="opacity" values="0.1;0.55;0.1" dur="2.9s" begin="1.6s" repeatCount="indefinite"/>
62
+ </circle>
63
+ <circle cx="44" cy="-60" r="1.4" fill="#22d3ee">
64
+ <animate attributeName="opacity" values="0.1;0.45;0.1" dur="3.7s" begin="0.5s" repeatCount="indefinite"/>
65
+ </circle>
66
+ <circle cx="55" cy="-38" r="1.2" fill="#c084fc">
67
+ <animate attributeName="opacity" values="0.08;0.4;0.08" dur="2.1s" begin="1.2s" repeatCount="indefinite"/>
68
+ </circle>
69
+
70
+ <!-- ─── RING A (cyan, plane gyrates CW 18 s, ry starts phase 0) ─── -->
71
+ <g>
72
+ <animateTransform attributeName="transform" type="rotate"
73
+ from="0" to="360" dur="18s" repeatCount="indefinite"/>
74
+ <!-- ghost track -->
75
+ <ellipse rx="62" ry="22" fill="none" stroke="#22d3ee" stroke-width="0.75" opacity="0.1"/>
76
+ <!-- 3D-tipping ring -->
77
+ <ellipse rx="62" ry="22" fill="none" stroke="#22d3ee" stroke-linecap="round">
78
+ <animate attributeName="ry"
79
+ values="22;56;22;5;22" keyTimes="0;0.25;0.5;0.75;1"
80
+ dur="7s" repeatCount="indefinite"
81
+ calcMode="spline"
82
+ keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1"/>
83
+ <animate attributeName="stroke-width"
84
+ values="1.5;3.2;1.5;0.7;1.5" keyTimes="0;0.25;0.5;0.75;1" dur="7s" repeatCount="indefinite"/>
85
+ <animate attributeName="stroke-opacity"
86
+ values="0.28;0.95;0.28;0.5;0.28" keyTimes="0;0.25;0.5;0.75;1" dur="7s" repeatCount="indefinite"/>
87
+ </ellipse>
88
+ <!-- comet dash -->
89
+ <ellipse rx="62" ry="22" fill="none" stroke="#22d3ee"
90
+ stroke-width="3" stroke-dasharray="68 232" stroke-linecap="round" opacity="0.85">
91
+ <animate attributeName="stroke-dashoffset" values="0;-300" dur="2.2s" repeatCount="indefinite"/>
92
+ </ellipse>
93
+ </g>
94
+
95
+ <!-- ─── RING B (indigo, plane gyrates CCW 24 s, ry phase +2.33 s) ─── -->
96
+ <g>
97
+ <animateTransform attributeName="transform" type="rotate"
98
+ from="60" to="-300" dur="24s" repeatCount="indefinite"/>
99
+ <ellipse rx="62" ry="22" fill="none" stroke="#818cf8" stroke-width="0.75" opacity="0.1"/>
100
+ <ellipse rx="62" ry="22" fill="none" stroke="#818cf8" stroke-linecap="round">
101
+ <animate attributeName="ry"
102
+ values="22;56;22;5;22" keyTimes="0;0.25;0.5;0.75;1"
103
+ dur="7s" begin="2.33s" repeatCount="indefinite"
104
+ calcMode="spline"
105
+ keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1"/>
106
+ <animate attributeName="stroke-width"
107
+ values="1.5;3.2;1.5;0.7;1.5" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="2.33s" repeatCount="indefinite"/>
108
+ <animate attributeName="stroke-opacity"
109
+ values="0.28;0.95;0.28;0.5;0.28" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="2.33s" repeatCount="indefinite"/>
110
+ </ellipse>
111
+ <ellipse rx="62" ry="22" fill="none" stroke="#818cf8"
112
+ stroke-width="3" stroke-dasharray="68 232" stroke-linecap="round" opacity="0.85">
113
+ <animate attributeName="stroke-dashoffset" values="0;-300" dur="2.8s" repeatCount="indefinite"/>
114
+ </ellipse>
115
+ </g>
116
+
117
+ <!-- ─── RING C (violet, plane gyrates CW 21 s, ry phase +4.67 s) ─── -->
118
+ <g>
119
+ <animateTransform attributeName="transform" type="rotate"
120
+ from="120" to="480" dur="21s" repeatCount="indefinite"/>
121
+ <ellipse rx="62" ry="22" fill="none" stroke="#c084fc" stroke-width="0.75" opacity="0.1"/>
122
+ <ellipse rx="62" ry="22" fill="none" stroke="#c084fc" stroke-linecap="round">
123
+ <animate attributeName="ry"
124
+ values="22;56;22;5;22" keyTimes="0;0.25;0.5;0.75;1"
125
+ dur="7s" begin="4.67s" repeatCount="indefinite"
126
+ calcMode="spline"
127
+ keySplines="0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1;0.42 0 0.58 1"/>
128
+ <animate attributeName="stroke-width"
129
+ values="1.5;3.2;1.5;0.7;1.5" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="4.67s" repeatCount="indefinite"/>
130
+ <animate attributeName="stroke-opacity"
131
+ values="0.28;0.95;0.28;0.5;0.28" keyTimes="0;0.25;0.5;0.75;1" dur="7s" begin="4.67s" repeatCount="indefinite"/>
132
+ </ellipse>
133
+ <ellipse rx="62" ry="22" fill="none" stroke="#c084fc"
134
+ stroke-width="3" stroke-dasharray="68 232" stroke-linecap="round" opacity="0.85">
135
+ <animate attributeName="stroke-dashoffset" values="0;-300" dur="3.4s" repeatCount="indefinite"/>
136
+ </ellipse>
137
+ </g>
138
+
139
+ <!-- Nucleus — sits on top of all rings, dark fill masks ring backs for z-depth -->
140
+ <circle r="14" fill="#08111e"/>
141
+ <circle r="14" fill="none" stroke="url(#gAccent)" stroke-width="2" filter="url(#nucGlow)">
142
+ <animate attributeName="r" values="13;15;13" dur="4s" repeatCount="indefinite"/>
143
+ <animate attributeName="stroke-opacity" values="0.5;1;0.5" dur="4s" repeatCount="indefinite"/>
144
+ </circle>
145
+ <!-- Z glyph — no fill, no stroke beyond the gradient line -->
146
+ <path d="M -7,-5 L 7,-5 L -7,5 L 7,5"
147
+ fill="none" stroke="url(#gAccent)"
148
+ stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round">
149
+ <animate attributeName="opacity" values="0.65;1;0.65" dur="4s" repeatCount="indefinite"/>
150
+ </path>
151
+ </g>
152
+
153
+ <!-- ╔══════════════════════════════════════════════╗ -->
154
+ <!-- ║ WORDMARK ║ -->
155
+ <!-- ╚══════════════════════════════════════════════╝ -->
156
+ <g transform="translate(220,0)"
157
+ font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, system-ui, sans-serif">
158
+
159
+ <!-- "zero" — clean off-white, gentle breath (no stroke, no shadow) -->
160
+ <g>
161
+ <animate attributeName="opacity" values="0.82;1;0.82" dur="5.5s" repeatCount="indefinite"/>
162
+ <text x="0" y="108" font-size="62" font-weight="800"
163
+ fill="#f1f5f9" letter-spacing="-2">zero</text>
164
+ </g>
165
+
166
+ <!-- "transfer" — animated gradient, out-of-phase with "zero" -->
167
+ <g>
168
+ <animate attributeName="opacity" values="1;0.86;1" dur="5.5s" repeatCount="indefinite"/>
169
+ <text x="153" y="108" font-size="62" font-weight="800"
170
+ fill="url(#gAccent)" letter-spacing="-2">transfer</text>
171
+ </g>
172
+
173
+ <!-- Tagline -->
174
+ <g>
175
+ <animate attributeName="opacity" values="0.55;0.85;0.55" dur="8s" repeatCount="indefinite"/>
176
+ <text x="3" y="138" font-size="11.5" font-weight="600" letter-spacing="2.5">
177
+ <tspan fill="#94a3b8">UNIVERSAL TRANSFER SDK</tspan>
178
+ <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">FTP</tspan>
179
+ <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">FTPS</tspan>
180
+ <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">SFTP</tspan>
181
+ <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">S3</tspan>
182
+ <tspan fill="#2d3f55"> · </tspan><tspan fill="#64748b">HTTP</tspan>
183
+ </text>
184
+ </g>
185
+
186
+ <!-- Static track -->
187
+ <rect x="0" y="153" width="600" height="1.5" rx="1" fill="#1c2a3a"/>
188
+
189
+ <!-- Sweep highlight — clipped so it never exits the track -->
190
+ <g clip-path="url(#barClip)">
191
+ <rect x="-130" y="152.5" width="130" height="2" rx="1"
192
+ fill="url(#gAccent)" filter="url(#sweepGlow)">
193
+ <animate attributeName="x"
194
+ values="-130;600;-130" dur="5.5s" repeatCount="indefinite"/>
195
+ <animate attributeName="opacity"
196
+ values="0;0.85;1;0.85;0" keyTimes="0;0.07;0.5;0.93;1"
197
+ dur="5.5s" repeatCount="indefinite"/>
198
+ </rect>
199
+ </g>
200
+ </g>
201
+ </svg>
package/dist/index.cjs CHANGED
@@ -3634,7 +3634,8 @@ function normalizeFeatureLines(input) {
3634
3634
  // src/providers/classic/sftp/SftpProvider.ts
3635
3635
  var import_node_buffer4 = require("buffer");
3636
3636
  var import_node_crypto = require("crypto");
3637
- var import_ssh2 = require("ssh2");
3637
+ var import_ssh2 = __toESM(require("ssh2"));
3638
+ var { Client: SshClientCtor, utils } = import_ssh2.default;
3638
3639
  var SFTP_PROVIDER_ID = "sftp";
3639
3640
  var SFTP_DEFAULT_PORT = 22;
3640
3641
  var SFTP_PROVIDER_CAPABILITIES = {
@@ -3794,7 +3795,7 @@ var SftpFileSystem = class {
3794
3795
  }
3795
3796
  };
3796
3797
  async function connectSshClient(profile, options, username, authentication) {
3797
- const client = new import_ssh2.Client();
3798
+ const client = new SshClientCtor();
3798
3799
  let config;
3799
3800
  try {
3800
3801
  config = await createConnectConfig(profile, options, username, authentication);
@@ -3993,7 +3994,7 @@ function parseKnownHostsLine(line, lineNumber) {
3993
3994
  };
3994
3995
  }
3995
3996
  function parseKnownHostPublicKey(value, lineNumber) {
3996
- const parsed = import_ssh2.utils.parseKey(value);
3997
+ const parsed = utils.parseKey(value);
3997
3998
  if (parsed instanceof Error) {
3998
3999
  throw createKnownHostsConfigurationError(lineNumber, parsed.message);
3999
4000
  }
@@ -4510,7 +4511,8 @@ function noop() {
4510
4511
 
4511
4512
  // src/providers/classic/sftp/jumpHost.ts
4512
4513
  var import_node_buffer5 = require("buffer");
4513
- var import_ssh22 = require("ssh2");
4514
+ var import_ssh22 = __toESM(require("ssh2"));
4515
+ var { Client: SshClientCtor2 } = import_ssh22.default;
4514
4516
  function createSftpJumpHostSocketFactory(options) {
4515
4517
  if (options.bastion === void 0 && options.buildBastion === void 0) {
4516
4518
  throw new ConfigurationError({
@@ -4531,7 +4533,7 @@ function createSftpJumpHostSocketFactory(options) {
4531
4533
  }
4532
4534
  function openJumpHostChannel(options) {
4533
4535
  const { bastionConfig, context } = options;
4534
- const client = options.createClient ? options.createClient() : new import_ssh22.Client();
4536
+ const client = options.createClient ? options.createClient() : new SshClientCtor2();
4535
4537
  if (context.signal?.aborted === true) {
4536
4538
  return Promise.reject(
4537
4539
  new AbortError({
@@ -7180,6 +7182,11 @@ function normalizeLocalProviderPath(input) {
7180
7182
  }
7181
7183
  function resolveLocalPath(rootPath, remotePath) {
7182
7184
  const normalizedRemotePath = normalizeLocalProviderPath(remotePath);
7185
+ const resolvedRootPath = import_node_path2.default.resolve(rootPath);
7186
+ const candidateAbsolute = import_node_path2.default.resolve(normalizedRemotePath.split("/").join(import_node_path2.default.sep));
7187
+ if (candidateAbsolute === resolvedRootPath || candidateAbsolute.startsWith(resolvedRootPath + import_node_path2.default.sep)) {
7188
+ return candidateAbsolute;
7189
+ }
7183
7190
  const relativePath = normalizedRemotePath === "/" ? "." : normalizedRemotePath.slice(1);
7184
7191
  const resolvedPath = import_node_path2.default.resolve(rootPath, relativePath.split("/").join(import_node_path2.default.sep));
7185
7192
  const relativeToRoot = import_node_path2.default.relative(rootPath, resolvedPath);