@fastlabai/design-editor 1.0.0-beta.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.
package/dist/theme.css ADDED
@@ -0,0 +1,282 @@
1
+ /* @fastlabai/design-editor theme tokens */
2
+ :root {
3
+ --de-color-bg: #ffffff;
4
+ --de-color-bg-elevated: #f5f5f7;
5
+ --de-color-fg: #18181b;
6
+ --de-color-fg-muted: #71717a;
7
+ --de-color-border: #e4e4e7;
8
+ --de-color-primary: #2563eb;
9
+ --de-color-primary-fg: #ffffff;
10
+ --de-color-danger: #dc2626;
11
+
12
+ --de-radius-sm: 4px;
13
+ --de-radius-md: 8px;
14
+ --de-radius-lg: 12px;
15
+
16
+ --de-space-1: 4px;
17
+ --de-space-2: 8px;
18
+ --de-space-3: 12px;
19
+ --de-space-4: 16px;
20
+
21
+ --de-font-sm: 12px;
22
+ --de-font-md: 14px;
23
+ --de-font-lg: 16px;
24
+
25
+ --de-shadow-sm: 0 1px 2px rgba(0,0,0,0.08);
26
+ --de-shadow-md: 0 4px 12px rgba(0,0,0,0.12);
27
+ }
28
+
29
+ [data-de-theme="dark"] {
30
+ --de-color-bg: #18181b;
31
+ --de-color-bg-elevated: #27272a;
32
+ --de-color-fg: #fafafa;
33
+ --de-color-fg-muted: #a1a1aa;
34
+ --de-color-border: #3f3f46;
35
+ }
36
+
37
+ .de-reset, .de-reset * { box-sizing: border-box; }
38
+
39
+ /* Button styles */
40
+ .de-btn {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ border: none;
45
+ border-radius: var(--de-radius-md);
46
+ cursor: pointer;
47
+ font-family: inherit;
48
+ font-weight: 500;
49
+ transition: all 0.2s ease;
50
+ padding: 0 var(--de-space-3);
51
+ gap: var(--de-space-2);
52
+ }
53
+
54
+ .de-btn[data-size="sm"] {
55
+ height: 24px;
56
+ font-size: var(--de-font-sm);
57
+ padding: 0 var(--de-space-2);
58
+ }
59
+
60
+ .de-btn[data-size="md"] {
61
+ height: 32px;
62
+ font-size: var(--de-font-md);
63
+ }
64
+
65
+ .de-btn[data-size="lg"] {
66
+ height: 40px;
67
+ font-size: var(--de-font-lg);
68
+ }
69
+
70
+ .de-btn[data-icon-only] {
71
+ padding: 0;
72
+ width: var(--de-btn-height, 32px);
73
+ }
74
+ .de-btn[data-icon-only][data-size="sm"] { width: 24px; }
75
+ .de-btn[data-icon-only][data-size="lg"] { width: 40px; }
76
+
77
+ /* Variants */
78
+ .de-btn[data-variant="primary"] {
79
+ background: var(--de-color-primary);
80
+ color: var(--de-color-primary-fg);
81
+ }
82
+ .de-btn[data-variant="primary"]:hover {
83
+ filter: brightness(1.1);
84
+ }
85
+
86
+ .de-btn[data-variant="secondary"] {
87
+ background: var(--de-color-bg-elevated);
88
+ color: var(--de-color-fg);
89
+ border: 1px solid var(--de-color-border);
90
+ }
91
+ .de-btn[data-variant="secondary"]:hover {
92
+ background: var(--de-color-border);
93
+ }
94
+
95
+ .de-btn[data-variant="ghost"] {
96
+ background: transparent;
97
+ color: var(--de-color-fg);
98
+ }
99
+ .de-btn[data-variant="ghost"]:hover {
100
+ background: var(--de-color-bg-elevated);
101
+ }
102
+
103
+ .de-btn[data-variant="danger"] {
104
+ background: transparent;
105
+ color: var(--de-color-danger);
106
+ border: 1px solid var(--de-color-danger);
107
+ }
108
+ .de-btn[data-variant="danger"]:hover {
109
+ background: var(--de-color-danger);
110
+ color: var(--de-color-bg);
111
+ }
112
+
113
+ .de-btn:disabled {
114
+ opacity: 0.5;
115
+ cursor: not-allowed;
116
+ }
117
+
118
+ /* Slider styles */
119
+ .de-slider-root {
120
+ position: relative;
121
+ display: flex;
122
+ align-items: center;
123
+ user-select: none;
124
+ touch-action: none;
125
+ width: 100%;
126
+ height: 20px;
127
+ }
128
+ .de-slider-track {
129
+ background-color: var(--de-color-border);
130
+ position: relative;
131
+ flex-grow: 1;
132
+ border-radius: 9999px;
133
+ height: 4px;
134
+ }
135
+ .de-slider-range {
136
+ position: absolute;
137
+ background-color: var(--de-color-primary);
138
+ border-radius: 9999px;
139
+ height: 100%;
140
+ }
141
+ .de-slider-thumb {
142
+ display: block;
143
+ width: 16px;
144
+ height: 16px;
145
+ background-color: var(--de-color-bg);
146
+ border: 2px solid var(--de-color-primary);
147
+ box-shadow: var(--de-shadow-sm);
148
+ border-radius: 10px;
149
+ }
150
+ .de-slider-thumb:hover {
151
+ background-color: var(--de-color-bg-elevated);
152
+ }
153
+ .de-slider-thumb:focus {
154
+ outline: none;
155
+ box-shadow: 0 0 0 2px var(--de-color-bg), 0 0 0 4px var(--de-color-primary);
156
+ }
157
+
158
+ /* Input styles */
159
+ .de-input {
160
+ box-sizing: border-box;
161
+ width: 100%;
162
+ height: 32px;
163
+ padding: 0 var(--de-space-2);
164
+ border-radius: var(--de-radius-md);
165
+ border: 1px solid var(--de-color-border);
166
+ background: var(--de-color-bg);
167
+ color: var(--de-color-fg);
168
+ font-size: var(--de-font-md);
169
+ font-family: inherit;
170
+ transition: border-color 0.2s, box-shadow 0.2s;
171
+ }
172
+ .de-input:focus {
173
+ outline: none;
174
+ border-color: var(--de-color-primary);
175
+ box-shadow: 0 0 0 1px var(--de-color-primary);
176
+ }
177
+ .de-input:disabled {
178
+ opacity: 0.5;
179
+ cursor: not-allowed;
180
+ background: var(--de-color-bg-elevated);
181
+ }
182
+ .de-input[data-size="sm"] {
183
+ height: 24px;
184
+ font-size: var(--de-font-sm);
185
+ }
186
+
187
+ /* Popover styles */
188
+ .de-popover-content {
189
+ border-radius: var(--de-radius-md);
190
+ padding: var(--de-space-3);
191
+ width: var(--radix-popover-trigger-width, auto);
192
+ background-color: var(--de-color-bg);
193
+ box-shadow: var(--de-shadow-md);
194
+ border: 1px solid var(--de-color-border);
195
+ animation-duration: 400ms;
196
+ animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
197
+ will-change: transform, opacity;
198
+ z-index: 1000;
199
+ }
200
+ .de-popover-arrow {
201
+ fill: var(--de-color-bg);
202
+ stroke: var(--de-color-border);
203
+ stroke-width: 1px;
204
+ }
205
+
206
+ /* Tooltip styles */
207
+ .de-tooltip-content {
208
+ border-radius: var(--de-radius-sm);
209
+ padding: var(--de-space-1) var(--de-space-2);
210
+ font-size: var(--de-font-sm);
211
+ line-height: 1;
212
+ color: var(--de-color-bg);
213
+ background-color: var(--de-color-fg);
214
+ box-shadow: var(--de-shadow-sm);
215
+ user-select: none;
216
+ animation-duration: 200ms;
217
+ animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
218
+ will-change: transform, opacity;
219
+ z-index: 1000;
220
+ }
221
+ .de-tooltip-arrow {
222
+ fill: var(--de-color-fg);
223
+ }
224
+
225
+ /* Select styles */
226
+ .de-select-trigger {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ justify-content: space-between;
230
+ border-radius: var(--de-radius-md);
231
+ padding: 0 var(--de-space-3);
232
+ font-size: var(--de-font-md);
233
+ line-height: 1;
234
+ height: 32px;
235
+ gap: var(--de-space-2);
236
+ background-color: var(--de-color-bg);
237
+ color: var(--de-color-fg);
238
+ border: 1px solid var(--de-color-border);
239
+ cursor: pointer;
240
+ }
241
+ .de-select-trigger:focus {
242
+ outline: none;
243
+ border-color: var(--de-color-primary);
244
+ box-shadow: 0 0 0 1px var(--de-color-primary);
245
+ }
246
+ .de-select-content {
247
+ overflow: hidden;
248
+ background-color: var(--de-color-bg);
249
+ border-radius: var(--de-radius-md);
250
+ border: 1px solid var(--de-color-border);
251
+ box-shadow: var(--de-shadow-md);
252
+ z-index: 1000;
253
+ }
254
+ .de-select-viewport {
255
+ padding: var(--de-space-1);
256
+ }
257
+ .de-select-item {
258
+ font-size: var(--de-font-md);
259
+ line-height: 1;
260
+ color: var(--de-color-fg);
261
+ border-radius: var(--de-radius-sm);
262
+ display: flex;
263
+ align-items: center;
264
+ height: 32px;
265
+ padding: 0 var(--de-space-3);
266
+ position: relative;
267
+ user-select: none;
268
+ cursor: pointer;
269
+ }
270
+ .de-select-item[data-highlighted] {
271
+ outline: none;
272
+ background-color: var(--de-color-primary);
273
+ color: var(--de-color-primary-fg);
274
+ }
275
+ .de-select-item-indicator {
276
+ position: absolute;
277
+ left: 0;
278
+ width: 24px;
279
+ display: inline-flex;
280
+ align-items: center;
281
+ justify-content: center;
282
+ }
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@fastlabai/design-editor",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "Open-source image design editor for React and Next.js",
5
+ "license": "MIT",
6
+ "author": "fastlab.ai",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/fastlabai/design-editor.git"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js",
22
+ "require": "./dist/index.cjs"
23
+ },
24
+ "./theme.css": "./dist/theme.css"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md",
29
+ "LICENSE",
30
+ "CHANGELOG.md"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsup && node scripts/postbuild-use-client.mjs",
34
+ "dev": "tsup --watch",
35
+ "typecheck": "tsc --noEmit",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest",
38
+ "lint": "eslint src",
39
+ "size": "size-limit"
40
+ },
41
+ "peerDependencies": {
42
+ "react": ">=18",
43
+ "react-dom": ">=18"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "@imgly/background-removal": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "dependencies": {
51
+ "@ant-design/icons": "^6.2.3",
52
+ "@radix-ui/react-popover": "^1.1.15",
53
+ "@radix-ui/react-select": "^2.2.6",
54
+ "@radix-ui/react-slider": "^1.3.6",
55
+ "@radix-ui/react-slot": "^1.2.4",
56
+ "@radix-ui/react-tooltip": "^1.2.8",
57
+ "antd": "^5.29.3",
58
+ "clsx": "^2.1.1",
59
+ "fabric": "^5.5.2",
60
+ "sonner": "^2.0.7"
61
+ },
62
+ "devDependencies": {
63
+ "@size-limit/preset-small-lib": "^11.1.6",
64
+ "@testing-library/jest-dom": "^6.9.1",
65
+ "@testing-library/react": "^16.3.2",
66
+ "@types/fabric": "^5.3.11",
67
+ "@types/lodash": "^4.17.24",
68
+ "@types/react": "^18.3.12",
69
+ "@types/react-dom": "^18.3.1",
70
+ "@vitest/coverage-v8": "^4.1.7",
71
+ "jsdom": "^29.1.1",
72
+ "lodash": "^4.18.1",
73
+ "react": "^18.3.1",
74
+ "react-dom": "^18.3.1",
75
+ "resize-observer-polyfill": "^1.5.1",
76
+ "size-limit": "^11.1.6",
77
+ "tsup": "^8.3.5",
78
+ "typescript": "^5.7.2",
79
+ "vitest": "^2.1.8"
80
+ },
81
+ "pnpm": {
82
+ "overrides": {
83
+ "postcss": "^8.5.0",
84
+ "nanoid": "^3.3.7"
85
+ }
86
+ }
87
+ }