flowsvg 0.1.1 → 0.2.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 (67) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/PATTERNS.md +61 -5
  3. package/README.md +149 -461
  4. package/README.zh-CN.md +149 -461
  5. package/dist/adapters/react.d.ts +7 -0
  6. package/dist/adapters/react.js +14 -2
  7. package/dist/adapters/vue.d.ts +29 -3
  8. package/dist/adapters/vue.js +20 -4
  9. package/dist/adapters/web-component.d.ts +14 -2
  10. package/dist/adapters/web-component.js +32 -3
  11. package/dist/browser/controls.d.ts +7 -3
  12. package/dist/browser/controls.js +23 -31
  13. package/dist/browser/export-controls.d.ts +32 -0
  14. package/dist/browser/export-controls.js +151 -0
  15. package/dist/browser/player.d.ts +9 -1
  16. package/dist/browser/player.js +83 -24
  17. package/dist/browser/select-control.d.ts +33 -0
  18. package/dist/browser/select-control.js +171 -0
  19. package/dist/browser.d.ts +2 -1
  20. package/dist/browser.js +2 -1
  21. package/dist/core/diagram.d.ts +4 -2
  22. package/dist/core/diagram.js +111 -21
  23. package/dist/core/edge-geometry.d.ts +16 -3
  24. package/dist/core/edge-geometry.js +264 -37
  25. package/dist/core/model.d.ts +35 -9
  26. package/dist/core/node-content-measurement.d.ts +34 -0
  27. package/dist/core/node-content-measurement.js +66 -0
  28. package/dist/core/node-content.d.ts +17 -0
  29. package/dist/core/node-content.js +30 -6
  30. package/dist/core/timeline.d.ts +11 -3
  31. package/dist/core/timeline.js +29 -5
  32. package/dist/core/validation.d.ts +1 -1
  33. package/dist/core/validation.js +13 -3
  34. package/dist/export/browser.d.ts +9 -0
  35. package/dist/export/browser.js +172 -0
  36. package/dist/export/captions.d.ts +18 -0
  37. package/dist/export/captions.js +44 -0
  38. package/dist/export/plan.d.ts +25 -0
  39. package/dist/export/plan.js +94 -0
  40. package/dist/export/types.d.ts +64 -0
  41. package/dist/export/types.js +9 -0
  42. package/dist/export/worker-source.d.ts +1 -0
  43. package/dist/export/worker-source.js +1 -0
  44. package/dist/export.d.ts +3 -0
  45. package/dist/export.js +2 -0
  46. package/dist/index.d.ts +3 -1
  47. package/dist/index.js +1 -0
  48. package/dist/node/cli.d.ts +2 -0
  49. package/dist/node/cli.js +72 -0
  50. package/dist/node/gif.d.ts +16 -0
  51. package/dist/node/gif.js +184 -0
  52. package/dist/node/html.d.ts +19 -0
  53. package/dist/node/html.js +61 -0
  54. package/dist/node/output.d.ts +2 -0
  55. package/dist/node/output.js +22 -0
  56. package/dist/node.d.ts +6 -0
  57. package/dist/node.js +3 -0
  58. package/dist/portable/LICENSE.esbuild.txt +21 -0
  59. package/dist/portable/LICENSE.flowsvg.txt +21 -0
  60. package/dist/portable/LICENSE.gifenc.txt +21 -0
  61. package/dist/portable/export.js +5 -0
  62. package/dist/portable/manifest.json +36 -0
  63. package/dist/portable/player.js +2 -0
  64. package/dist/portable/styles.css +227 -0
  65. package/dist/styles.css +194 -14
  66. package/docs/images/flowsvg-wordmark.gif +0 -0
  67. package/package.json +37 -6
@@ -0,0 +1,227 @@
1
+ /* CSS variables style playback and custom choices; core themes own diagram colors. */
2
+ .flowsvg-canvas:focus-visible {
3
+ outline: 3px solid #2563eb;
4
+ outline-offset: 3px;
5
+ }
6
+
7
+ .flowsvg-controls {
8
+ display: flex;
9
+ flex-wrap: wrap;
10
+ align-items: center;
11
+ gap: 0.5rem;
12
+ padding: 0.875rem 1rem;
13
+ border-top: 1px solid var(--flowsvg-control-border, #e2e8f0);
14
+ color: var(--flowsvg-control-color, #172033);
15
+ background: var(--flowsvg-control-background, #ffffff);
16
+ font: 500 0.8125rem/1.4 system-ui, sans-serif;
17
+ font-variant-numeric: tabular-nums;
18
+ }
19
+
20
+ .flowsvg-controls :is(button, input) {
21
+ box-sizing: border-box;
22
+ min-height: var(--flowsvg-control-height, 2.75rem);
23
+ max-width: 100%;
24
+ color: var(--flowsvg-control-color, #172033);
25
+ background: var(--flowsvg-control-background, #ffffff);
26
+ border: 1px solid var(--flowsvg-control-border, #d8dee8);
27
+ border-radius: 0.5rem;
28
+ font: inherit;
29
+ accent-color: var(--flowsvg-control-accent, #2563eb);
30
+ transition: background-color 160ms ease, border-color 160ms ease;
31
+ }
32
+
33
+ .flowsvg-controls button {
34
+ padding: var(--flowsvg-control-padding, 0.5rem 0.75rem);
35
+ cursor: pointer;
36
+ }
37
+
38
+ .flowsvg-controls button:enabled:hover,
39
+ .flowsvg-select-trigger:enabled:hover {
40
+ background: color-mix(in srgb, var(--flowsvg-control-color, #172033) 4%, var(--flowsvg-control-background, #ffffff));
41
+ border-color: color-mix(in srgb, var(--flowsvg-control-color, #172033) 25%, var(--flowsvg-control-border, #d8dee8));
42
+ }
43
+
44
+ .flowsvg-controls button:enabled:active,
45
+ .flowsvg-select-trigger:enabled:active {
46
+ background: color-mix(in srgb, var(--flowsvg-control-color, #172033) 8%, var(--flowsvg-control-background, #ffffff));
47
+ }
48
+
49
+ .flowsvg-controls .flowsvg-play-toggle {
50
+ min-width: 4.5rem;
51
+ color: var(--flowsvg-control-accent, #2563eb);
52
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 10%, var(--flowsvg-control-background, #ffffff));
53
+ border-color: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 35%, var(--flowsvg-control-border, #d8dee8));
54
+ font-weight: 650;
55
+ }
56
+
57
+ .flowsvg-controls .flowsvg-play-toggle:enabled:hover {
58
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 17%, var(--flowsvg-control-background, #ffffff));
59
+ }
60
+
61
+ .flowsvg-controls .flowsvg-play-toggle:enabled:active {
62
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 23%, var(--flowsvg-control-background, #ffffff));
63
+ }
64
+
65
+ .flowsvg-controls .flowsvg-loop-toggle[aria-pressed="true"] {
66
+ color: var(--flowsvg-control-accent, #2563eb);
67
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 10%, var(--flowsvg-control-background, #ffffff));
68
+ border-color: var(--flowsvg-control-accent, #2563eb);
69
+ }
70
+
71
+ .flowsvg-controls :is(button, input):focus-visible {
72
+ outline: 2px solid var(--flowsvg-control-focus, #2563eb);
73
+ outline-offset: 2px;
74
+ }
75
+
76
+ .flowsvg-controls :disabled {
77
+ opacity: 0.45;
78
+ cursor: not-allowed;
79
+ }
80
+
81
+ .flowsvg-controls input[type="range"] {
82
+ flex: 1 1 10rem;
83
+ min-width: 4rem;
84
+ margin: 0 0.375rem;
85
+ padding: 0;
86
+ border: 0;
87
+ border-radius: 0;
88
+ background: transparent;
89
+ cursor: pointer;
90
+ }
91
+
92
+ .flowsvg-controls input[type="range"]:disabled {
93
+ cursor: not-allowed;
94
+ }
95
+
96
+ .flowsvg-export-controls {
97
+ display: inline-flex;
98
+ flex-wrap: wrap;
99
+ align-items: center;
100
+ gap: 0.5rem;
101
+ margin-inline-start: auto;
102
+ max-width: 100%;
103
+ }
104
+
105
+ .flowsvg-export-controls progress {
106
+ max-width: 7rem;
107
+ height: 0.375rem;
108
+ accent-color: var(--flowsvg-control-accent, #2563eb);
109
+ }
110
+
111
+ .flowsvg-export-controls [role="status"] {
112
+ font-size: 0.75rem;
113
+ }
114
+
115
+ .flowsvg-export-controls [role="status"]:empty {
116
+ display: none;
117
+ }
118
+
119
+ @media (max-width: 640px) {
120
+ .flowsvg-controls { padding: 0.75rem; }
121
+ .flowsvg-controls input[type="range"] { flex-basis: 100%; margin: 0; }
122
+ .flowsvg-export-controls { margin-inline-start: 0; }
123
+ }
124
+
125
+ @media (prefers-reduced-motion: reduce) {
126
+ .flowsvg-controls :is(button, input) { transition: none; }
127
+ }
128
+
129
+ /* Apply to a host or ancestor; sizing affects controls only, never diagram geometry. */
130
+ .flowsvg-compact {
131
+ --flowsvg-control-height: 2rem;
132
+ --flowsvg-control-padding: 0.3125rem 0.625rem;
133
+ }
134
+
135
+ .flowsvg-select {
136
+ position: relative;
137
+ display: inline-flex;
138
+ max-width: 100%;
139
+ color: var(--flowsvg-control-color, #172033);
140
+ font: 500 0.8125rem/1.4 system-ui, sans-serif;
141
+ font-variant-numeric: tabular-nums;
142
+ }
143
+
144
+ .flowsvg-select .flowsvg-select-trigger {
145
+ box-sizing: border-box;
146
+ display: inline-flex;
147
+ align-items: center;
148
+ justify-content: space-between;
149
+ gap: 1rem;
150
+ width: 100%;
151
+ min-height: var(--flowsvg-control-height, 2.75rem);
152
+ padding: var(--flowsvg-control-padding, 0.5rem 0.75rem);
153
+ color: inherit;
154
+ background: var(--flowsvg-control-background, #ffffff);
155
+ border: 1px solid var(--flowsvg-control-border, #d8dee8);
156
+ border-radius: 0.5rem;
157
+ font: inherit;
158
+ text-align: start;
159
+ cursor: pointer;
160
+ }
161
+
162
+ .flowsvg-select-trigger::after {
163
+ content: "";
164
+ width: 0.375rem;
165
+ height: 0.375rem;
166
+ margin: -0.1875rem 0.125rem 0 0;
167
+ border-right: 1.5px solid currentColor;
168
+ border-bottom: 1.5px solid currentColor;
169
+ transform: rotate(45deg);
170
+ }
171
+
172
+ .flowsvg-select-trigger:focus-visible {
173
+ outline: 2px solid var(--flowsvg-control-focus, #2563eb);
174
+ outline-offset: 2px;
175
+ }
176
+
177
+ .flowsvg-select-trigger:disabled { opacity: 0.45; cursor: not-allowed; }
178
+
179
+ .flowsvg-select-options {
180
+ box-sizing: border-box;
181
+ position: absolute;
182
+ z-index: 2;
183
+ inset-block-start: calc(100% + 0.375rem);
184
+ inset-inline-end: 0;
185
+ width: max-content;
186
+ min-width: 100%;
187
+ max-width: min(22rem, calc(100vw - 2.5rem));
188
+ max-height: 14rem;
189
+ overflow-y: auto;
190
+ overscroll-behavior: contain;
191
+ padding: 0.25rem;
192
+ color: var(--flowsvg-control-color, #172033);
193
+ background: var(--flowsvg-control-background, #ffffff);
194
+ border: 1px solid var(--flowsvg-control-border, #d8dee8);
195
+ border-radius: 0.625rem;
196
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--flowsvg-control-color, #172033) 14%, transparent);
197
+ }
198
+
199
+ .flowsvg-controls .flowsvg-select-options {
200
+ inset-block-start: auto;
201
+ inset-block-end: calc(100% + 0.375rem);
202
+ }
203
+
204
+ .flowsvg-select-options [role="option"] {
205
+ position: relative;
206
+ padding: 0.5rem 1.875rem 0.5rem 0.625rem;
207
+ border-radius: 0.375rem;
208
+ overflow-wrap: anywhere;
209
+ cursor: pointer;
210
+ }
211
+
212
+ .flowsvg-select-options [role="option"]:is(:hover, [data-active]) {
213
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 9%, var(--flowsvg-control-background, #ffffff));
214
+ }
215
+
216
+ .flowsvg-select-options [aria-selected="true"] {
217
+ color: var(--flowsvg-control-accent, #2563eb);
218
+ font-weight: 650;
219
+ }
220
+
221
+ .flowsvg-select-options [aria-selected="true"]::after {
222
+ content: "✓";
223
+ position: absolute;
224
+ inset-inline-end: 0.625rem;
225
+ }
226
+
227
+ .flowsvg-compact .flowsvg-play-toggle { min-width: 4rem; }
package/dist/styles.css CHANGED
@@ -1,4 +1,4 @@
1
- /* Control and canvas focus styles; CSS variables customize controls only. The core theme resolves diagram colors. */
1
+ /* CSS variables style playback and custom choices; core themes own diagram colors. */
2
2
  .flowsvg-canvas:focus-visible {
3
3
  outline: 3px solid #2563eb;
4
4
  outline-offset: 3px;
@@ -9,39 +9,219 @@
9
9
  flex-wrap: wrap;
10
10
  align-items: center;
11
11
  gap: 0.5rem;
12
- padding: 0.75rem;
12
+ padding: 0.875rem 1rem;
13
+ border-top: 1px solid var(--flowsvg-control-border, #e2e8f0);
13
14
  color: var(--flowsvg-control-color, #172033);
14
15
  background: var(--flowsvg-control-background, #ffffff);
15
- font: 1rem/1.4 system-ui, sans-serif;
16
+ font: 500 0.8125rem/1.4 system-ui, sans-serif;
17
+ font-variant-numeric: tabular-nums;
16
18
  }
17
19
 
18
- .flowsvg-controls :is(button, input, select) {
20
+ .flowsvg-controls :is(button, input) {
19
21
  box-sizing: border-box;
20
- min-height: 2.75rem;
22
+ min-height: var(--flowsvg-control-height, 2.75rem);
21
23
  max-width: 100%;
22
24
  color: var(--flowsvg-control-color, #172033);
23
25
  background: var(--flowsvg-control-background, #ffffff);
24
- border: 1px solid var(--flowsvg-control-border, #64748b);
25
- border-radius: 0.25rem;
26
+ border: 1px solid var(--flowsvg-control-border, #d8dee8);
27
+ border-radius: 0.5rem;
26
28
  font: inherit;
27
29
  accent-color: var(--flowsvg-control-accent, #2563eb);
30
+ transition: background-color 160ms ease, border-color 160ms ease;
28
31
  }
29
32
 
30
- .flowsvg-controls :is(button, select) {
31
- padding: 0.5rem 0.75rem;
33
+ .flowsvg-controls button {
34
+ padding: var(--flowsvg-control-padding, 0.5rem 0.75rem);
35
+ cursor: pointer;
32
36
  }
33
37
 
34
- .flowsvg-controls :is(button, input, select):focus-visible {
35
- outline: 3px solid var(--flowsvg-control-focus, #2563eb);
36
- outline-offset: 3px;
38
+ .flowsvg-controls button:enabled:hover,
39
+ .flowsvg-select-trigger:enabled:hover {
40
+ background: color-mix(in srgb, var(--flowsvg-control-color, #172033) 4%, var(--flowsvg-control-background, #ffffff));
41
+ border-color: color-mix(in srgb, var(--flowsvg-control-color, #172033) 25%, var(--flowsvg-control-border, #d8dee8));
42
+ }
43
+
44
+ .flowsvg-controls button:enabled:active,
45
+ .flowsvg-select-trigger:enabled:active {
46
+ background: color-mix(in srgb, var(--flowsvg-control-color, #172033) 8%, var(--flowsvg-control-background, #ffffff));
47
+ }
48
+
49
+ .flowsvg-controls .flowsvg-play-toggle {
50
+ min-width: 4.5rem;
51
+ color: var(--flowsvg-control-accent, #2563eb);
52
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 10%, var(--flowsvg-control-background, #ffffff));
53
+ border-color: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 35%, var(--flowsvg-control-border, #d8dee8));
54
+ font-weight: 650;
55
+ }
56
+
57
+ .flowsvg-controls .flowsvg-play-toggle:enabled:hover {
58
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 17%, var(--flowsvg-control-background, #ffffff));
59
+ }
60
+
61
+ .flowsvg-controls .flowsvg-play-toggle:enabled:active {
62
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 23%, var(--flowsvg-control-background, #ffffff));
63
+ }
64
+
65
+ .flowsvg-controls .flowsvg-loop-toggle[aria-pressed="true"] {
66
+ color: var(--flowsvg-control-accent, #2563eb);
67
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 10%, var(--flowsvg-control-background, #ffffff));
68
+ border-color: var(--flowsvg-control-accent, #2563eb);
69
+ }
70
+
71
+ .flowsvg-controls :is(button, input):focus-visible {
72
+ outline: 2px solid var(--flowsvg-control-focus, #2563eb);
73
+ outline-offset: 2px;
37
74
  }
38
75
 
39
76
  .flowsvg-controls :disabled {
40
- opacity: 0.55;
41
- cursor: default;
77
+ opacity: 0.45;
78
+ cursor: not-allowed;
42
79
  }
43
80
 
44
81
  .flowsvg-controls input[type="range"] {
45
82
  flex: 1 1 10rem;
46
83
  min-width: 4rem;
84
+ margin: 0 0.375rem;
85
+ padding: 0;
86
+ border: 0;
87
+ border-radius: 0;
88
+ background: transparent;
89
+ cursor: pointer;
47
90
  }
91
+
92
+ .flowsvg-controls input[type="range"]:disabled {
93
+ cursor: not-allowed;
94
+ }
95
+
96
+ .flowsvg-export-controls {
97
+ display: inline-flex;
98
+ flex-wrap: wrap;
99
+ align-items: center;
100
+ gap: 0.5rem;
101
+ margin-inline-start: auto;
102
+ max-width: 100%;
103
+ }
104
+
105
+ .flowsvg-export-controls progress {
106
+ max-width: 7rem;
107
+ height: 0.375rem;
108
+ accent-color: var(--flowsvg-control-accent, #2563eb);
109
+ }
110
+
111
+ .flowsvg-export-controls [role="status"] {
112
+ font-size: 0.75rem;
113
+ }
114
+
115
+ .flowsvg-export-controls [role="status"]:empty {
116
+ display: none;
117
+ }
118
+
119
+ @media (max-width: 640px) {
120
+ .flowsvg-controls { padding: 0.75rem; }
121
+ .flowsvg-controls input[type="range"] { flex-basis: 100%; margin: 0; }
122
+ .flowsvg-export-controls { margin-inline-start: 0; }
123
+ }
124
+
125
+ @media (prefers-reduced-motion: reduce) {
126
+ .flowsvg-controls :is(button, input) { transition: none; }
127
+ }
128
+
129
+ /* Apply to a host or ancestor; sizing affects controls only, never diagram geometry. */
130
+ .flowsvg-compact {
131
+ --flowsvg-control-height: 2rem;
132
+ --flowsvg-control-padding: 0.3125rem 0.625rem;
133
+ }
134
+
135
+ .flowsvg-select {
136
+ position: relative;
137
+ display: inline-flex;
138
+ max-width: 100%;
139
+ color: var(--flowsvg-control-color, #172033);
140
+ font: 500 0.8125rem/1.4 system-ui, sans-serif;
141
+ font-variant-numeric: tabular-nums;
142
+ }
143
+
144
+ .flowsvg-select .flowsvg-select-trigger {
145
+ box-sizing: border-box;
146
+ display: inline-flex;
147
+ align-items: center;
148
+ justify-content: space-between;
149
+ gap: 1rem;
150
+ width: 100%;
151
+ min-height: var(--flowsvg-control-height, 2.75rem);
152
+ padding: var(--flowsvg-control-padding, 0.5rem 0.75rem);
153
+ color: inherit;
154
+ background: var(--flowsvg-control-background, #ffffff);
155
+ border: 1px solid var(--flowsvg-control-border, #d8dee8);
156
+ border-radius: 0.5rem;
157
+ font: inherit;
158
+ text-align: start;
159
+ cursor: pointer;
160
+ }
161
+
162
+ .flowsvg-select-trigger::after {
163
+ content: "";
164
+ width: 0.375rem;
165
+ height: 0.375rem;
166
+ margin: -0.1875rem 0.125rem 0 0;
167
+ border-right: 1.5px solid currentColor;
168
+ border-bottom: 1.5px solid currentColor;
169
+ transform: rotate(45deg);
170
+ }
171
+
172
+ .flowsvg-select-trigger:focus-visible {
173
+ outline: 2px solid var(--flowsvg-control-focus, #2563eb);
174
+ outline-offset: 2px;
175
+ }
176
+
177
+ .flowsvg-select-trigger:disabled { opacity: 0.45; cursor: not-allowed; }
178
+
179
+ .flowsvg-select-options {
180
+ box-sizing: border-box;
181
+ position: absolute;
182
+ z-index: 2;
183
+ inset-block-start: calc(100% + 0.375rem);
184
+ inset-inline-end: 0;
185
+ width: max-content;
186
+ min-width: 100%;
187
+ max-width: min(22rem, calc(100vw - 2.5rem));
188
+ max-height: 14rem;
189
+ overflow-y: auto;
190
+ overscroll-behavior: contain;
191
+ padding: 0.25rem;
192
+ color: var(--flowsvg-control-color, #172033);
193
+ background: var(--flowsvg-control-background, #ffffff);
194
+ border: 1px solid var(--flowsvg-control-border, #d8dee8);
195
+ border-radius: 0.625rem;
196
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--flowsvg-control-color, #172033) 14%, transparent);
197
+ }
198
+
199
+ .flowsvg-controls .flowsvg-select-options {
200
+ inset-block-start: auto;
201
+ inset-block-end: calc(100% + 0.375rem);
202
+ }
203
+
204
+ .flowsvg-select-options [role="option"] {
205
+ position: relative;
206
+ padding: 0.5rem 1.875rem 0.5rem 0.625rem;
207
+ border-radius: 0.375rem;
208
+ overflow-wrap: anywhere;
209
+ cursor: pointer;
210
+ }
211
+
212
+ .flowsvg-select-options [role="option"]:is(:hover, [data-active]) {
213
+ background: color-mix(in srgb, var(--flowsvg-control-accent, #2563eb) 9%, var(--flowsvg-control-background, #ffffff));
214
+ }
215
+
216
+ .flowsvg-select-options [aria-selected="true"] {
217
+ color: var(--flowsvg-control-accent, #2563eb);
218
+ font-weight: 650;
219
+ }
220
+
221
+ .flowsvg-select-options [aria-selected="true"]::after {
222
+ content: "✓";
223
+ position: absolute;
224
+ inset-inline-end: 0.625rem;
225
+ }
226
+
227
+ .flowsvg-compact .flowsvg-play-toggle { min-width: 4rem; }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowsvg",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Declarative SVG player for logic and architecture diagrams, with scenes, beats, static export and browser framework adapters.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -13,7 +13,16 @@
13
13
  "bugs": {
14
14
  "url": "https://github.com/yokingma/FlowSVG/issues"
15
15
  },
16
- "keywords": ["svg", "diagram", "architecture", "animation", "timeline", "web-component", "react", "vue"],
16
+ "keywords": [
17
+ "svg",
18
+ "diagram",
19
+ "architecture",
20
+ "animation",
21
+ "timeline",
22
+ "web-component",
23
+ "react",
24
+ "vue"
25
+ ],
17
26
  "publishConfig": {
18
27
  "access": "public",
19
28
  "registry": "https://registry.npmjs.org/"
@@ -44,32 +53,47 @@
44
53
  "./vue": {
45
54
  "types": "./dist/vue.d.ts",
46
55
  "import": "./dist/vue.js"
56
+ },
57
+ "./node": {
58
+ "types": "./dist/node.d.ts",
59
+ "import": "./dist/node.js"
60
+ },
61
+ "./export": {
62
+ "types": "./dist/export.d.ts",
63
+ "import": "./dist/export.js"
47
64
  }
48
65
  },
49
66
  "files": [
50
67
  "dist",
51
68
  "docs/images/*.png",
69
+ "docs/images/*.gif",
52
70
  "README.md",
53
71
  "README.zh-CN.md",
54
72
  "CHANGELOG.md",
55
73
  "PATTERNS.md",
56
74
  "LICENSE"
57
75
  ],
58
- "sideEffects": ["./dist/styles.css"],
76
+ "sideEffects": [
77
+ "./dist/styles.css"
78
+ ],
59
79
  "engines": {
60
80
  "node": ">=18"
61
81
  },
62
82
  "scripts": {
63
- "build": "rm -rf dist && tsc -p tsconfig.core.json && tsc -p tsconfig.browser.json && tsc -p tsconfig.react.json && tsc -p tsconfig.vue.json && cp src/styles.css dist/styles.css",
64
- "typecheck": "tsc -p tsconfig.core.json --noEmit && tsc -p tsconfig.browser.json --noEmit && tsc -p tsconfig.react.json --noEmit && tsc -p tsconfig.vue.json --noEmit",
83
+ "build": "rm -rf dist && tsc -p tsconfig.core.json && tsc -p tsconfig.browser.json && tsc -p tsconfig.react.json && tsc -p tsconfig.vue.json && cp src/styles.css dist/styles.css && tsc -p tsconfig.node.json && tsc -p tsconfig.worker.json && node scripts/build-portable.mjs",
84
+ "typecheck": "tsc -p tsconfig.core.json --noEmit && tsc -p tsconfig.browser.json --noEmit && tsc -p tsconfig.react.json --noEmit && tsc -p tsconfig.vue.json --noEmit && tsc -p tsconfig.node.json --noEmit && tsc -p tsconfig.worker.json",
65
85
  "test": "vitest run",
66
86
  "prepack": "pnpm --silent build",
67
87
  "prepublishOnly": "pnpm typecheck && pnpm test",
68
- "release:verify": "node ../../scripts/verify-release.mjs"
88
+ "release:verify": "node ../../scripts/verify-release.mjs",
89
+ "test:browser": "vitest run tests/sdk-browser.test.ts"
69
90
  },
70
91
  "devDependencies": {
92
+ "@types/node": "22.19.1",
71
93
  "@types/react": "^19.3.0",
72
94
  "@types/react-dom": "^19.3.0",
95
+ "esbuild": "0.25.12",
96
+ "gifuct-js": "2.1.2",
73
97
  "jsdom": "^26.1.0",
74
98
  "react": "^19.3.0",
75
99
  "react-dom": "^19.3.0",
@@ -86,5 +110,12 @@
86
110
  "vue": {
87
111
  "optional": true
88
112
  }
113
+ },
114
+ "bin": {
115
+ "flowsvg": "./dist/node/cli.js"
116
+ },
117
+ "dependencies": {
118
+ "gifenc": "1.0.3",
119
+ "playwright-core": "1.58.2"
89
120
  }
90
121
  }