@withwiz/block-editor 0.1.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 (40) hide show
  1. package/README.md +219 -0
  2. package/dist/blocks/built-in.d.ts +6 -0
  3. package/dist/blocks/built-in.js +11 -0
  4. package/dist/chunk-3R3HAGQL.js +102 -0
  5. package/dist/chunk-62BAOSP6.js +100 -0
  6. package/dist/chunk-CJGZUEQO.js +270 -0
  7. package/dist/chunk-CLC3FEL2.js +313 -0
  8. package/dist/chunk-CYMYM7LP.js +25 -0
  9. package/dist/chunk-EERQYNER.js +123 -0
  10. package/dist/chunk-G6J2DCC5.js +77 -0
  11. package/dist/chunk-N3ETBM74.js +24 -0
  12. package/dist/chunk-PPVXNJWI.js +28 -0
  13. package/dist/chunk-QR225IXX.js +148 -0
  14. package/dist/chunk-VIJV6FLT.js +250 -0
  15. package/dist/components/ArtistEditor.d.ts +12 -0
  16. package/dist/components/ArtistEditor.js +11 -0
  17. package/dist/components/BlockEditor.d.ts +24 -0
  18. package/dist/components/BlockEditor.js +16 -0
  19. package/dist/components/BlockRenderer.d.ts +10 -0
  20. package/dist/components/BlockRenderer.js +12 -0
  21. package/dist/components/ImageUploadField.d.ts +11 -0
  22. package/dist/components/ImageUploadField.js +11 -0
  23. package/dist/context/BlockEditorProvider.d.ts +21 -0
  24. package/dist/context/BlockEditorProvider.js +10 -0
  25. package/dist/core/html-renderer.d.ts +13 -0
  26. package/dist/core/html-renderer.js +11 -0
  27. package/dist/core/image-resize.d.ts +17 -0
  28. package/dist/core/image-resize.js +11 -0
  29. package/dist/core/serializer.d.ts +9 -0
  30. package/dist/core/serializer.js +7 -0
  31. package/dist/hooks/useImageDropZone.d.ts +23 -0
  32. package/dist/hooks/useImageDropZone.js +10 -0
  33. package/dist/index.d.ts +11 -0
  34. package/dist/index.js +57 -0
  35. package/dist/types.d.ts +67 -0
  36. package/dist/types.js +0 -0
  37. package/package.json +43 -0
  38. package/styles/artist.css +332 -0
  39. package/styles/editor.css +394 -0
  40. package/styles/preview.css +203 -0
@@ -0,0 +1,332 @@
1
+ /* ═══════════════════════════════════════════════
2
+ @withwiz/block-editor — Artist Editor Styles
3
+ CSS prefix: abe-*
4
+ ═══════════════════════════════════════════════ */
5
+
6
+ .abe-wrapper {
7
+ --abe-bg: #f7f6f4;
8
+ --abe-s: #fff;
9
+ --abe-b: #e2dfd9;
10
+ --abe-bh: #ccc8c0;
11
+ --abe-t: #4a4540;
12
+ --abe-td: #9a958d;
13
+ --abe-tb: #2a2520;
14
+ --abe-a: #8c7444;
15
+ --abe-al: #7a6538;
16
+ /* Preview */
17
+ --abe-pvbg: #faf9f7;
18
+ --abe-pvbgw: #f5f3ef;
19
+ --abe-gold: #8c7444;
20
+ --abe-gl: #c9a96e;
21
+ --abe-th: #2a2520;
22
+ --abe-tmid: #3a3530;
23
+ --abe-tm: #6a6358;
24
+ --abe-pvtd: #7a756c;
25
+ --abe-dv: rgba(140,116,68,0.15);
26
+
27
+ display: grid;
28
+ grid-template-columns: 1fr 1fr;
29
+ height: 520px;
30
+ border: 1px solid #ddd;
31
+ font-family: 'Noto Sans KR', sans-serif;
32
+ }
33
+
34
+ /* ═══ Editor Pane ═══ */
35
+ .abe-editor {
36
+ background: var(--abe-bg);
37
+ overflow-y: auto;
38
+ padding: 16px 20px;
39
+ color: var(--abe-t);
40
+ }
41
+
42
+ .abe-section {
43
+ margin-bottom: 16px;
44
+ }
45
+ .abe-section:last-child {
46
+ margin-bottom: 0;
47
+ }
48
+
49
+ .abe-section-label {
50
+ font-size: 9px;
51
+ letter-spacing: 2px;
52
+ text-transform: uppercase;
53
+ color: var(--abe-al);
54
+ margin-bottom: 8px;
55
+ padding-bottom: 5px;
56
+ border-bottom: 1px solid var(--abe-b);
57
+ }
58
+
59
+ /* ═══ Editor Fields ═══ */
60
+ .abe-textarea {
61
+ width: 100%;
62
+ padding: 10px 12px;
63
+ font-size: 12.5px;
64
+ line-height: 1.8;
65
+ background: var(--abe-s);
66
+ border: 1px solid var(--abe-b);
67
+ color: var(--abe-tb);
68
+ font-family: inherit;
69
+ font-weight: 300;
70
+ resize: vertical;
71
+ min-height: 100px;
72
+ outline: none;
73
+ transition: border-color 0.2s;
74
+ box-sizing: border-box;
75
+ }
76
+ .abe-textarea:focus { border-color: var(--abe-a); }
77
+ .abe-textarea::placeholder { color: var(--abe-td); }
78
+
79
+ /* ═══ Main Image Upload ═══ */
80
+ .abe-main-img-upload {
81
+ width: 140px;
82
+ aspect-ratio: 3/4;
83
+ border: 1px dashed var(--abe-b);
84
+ display: flex;
85
+ flex-direction: column;
86
+ align-items: center;
87
+ justify-content: center;
88
+ cursor: pointer;
89
+ background: var(--abe-s);
90
+ position: relative;
91
+ overflow: hidden;
92
+ transition: border-color 0.2s;
93
+ }
94
+ .abe-main-img-upload:hover { border-color: var(--abe-a); }
95
+ .abe-main-img-upload.has-image { cursor: default; }
96
+
97
+ .abe-upload-text {
98
+ font-size: 10px;
99
+ color: var(--abe-td);
100
+ text-align: center;
101
+ line-height: 1.6;
102
+ }
103
+ .abe-main-img-upload.has-image .abe-upload-text { display: none; }
104
+
105
+ .abe-main-img-upload img {
106
+ position: absolute;
107
+ inset: 0;
108
+ width: 100%;
109
+ height: 100%;
110
+ object-fit: cover;
111
+ }
112
+
113
+ .abe-img-remove-btn {
114
+ position: absolute;
115
+ top: 4px;
116
+ right: 4px;
117
+ width: 22px;
118
+ height: 22px;
119
+ background: rgba(0,0,0,0.6);
120
+ color: #fff;
121
+ border: none;
122
+ cursor: pointer;
123
+ font-size: 13px;
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ z-index: 1;
128
+ opacity: 0;
129
+ transition: opacity 0.2s;
130
+ }
131
+ .abe-main-img-upload:hover .abe-img-remove-btn,
132
+ .abe-gallery-item:hover .abe-img-remove-btn {
133
+ opacity: 1;
134
+ }
135
+
136
+ /* ═══ Gallery Grid (Editor) ═══ */
137
+ .abe-gallery-grid {
138
+ display: grid;
139
+ grid-template-columns: repeat(5, 1fr);
140
+ gap: 6px;
141
+ margin-bottom: 8px;
142
+ }
143
+
144
+ .abe-gallery-item {
145
+ aspect-ratio: 1/1;
146
+ border: 1px solid var(--abe-b);
147
+ display: flex;
148
+ flex-direction: column;
149
+ align-items: center;
150
+ justify-content: center;
151
+ background: var(--abe-s);
152
+ position: relative;
153
+ overflow: hidden;
154
+ }
155
+ .abe-gallery-item .abe-upload-text {
156
+ font-size: 18px;
157
+ color: var(--abe-td);
158
+ display: none;
159
+ }
160
+ .abe-gallery-item.has-image .abe-upload-text { display: none; }
161
+
162
+ .abe-gallery-item img {
163
+ position: absolute;
164
+ inset: 0;
165
+ width: 100%;
166
+ height: 100%;
167
+ object-fit: cover;
168
+ }
169
+
170
+ .abe-gallery-add-btn {
171
+ width: 100%;
172
+ padding: 10px;
173
+ font-size: 11px;
174
+ font-family: inherit;
175
+ background: var(--abe-s);
176
+ border: 1px dashed var(--abe-b);
177
+ color: var(--abe-td);
178
+ cursor: pointer;
179
+ transition: border-color 0.2s, color 0.2s;
180
+ }
181
+ .abe-gallery-add-btn:hover {
182
+ border-color: var(--abe-a);
183
+ color: var(--abe-al);
184
+ }
185
+
186
+ /* ═══ Preview Pane ═══ */
187
+ .abe-preview {
188
+ background: #edeae5;
189
+ overflow-y: auto;
190
+ border-left: 1px solid #ddd;
191
+ padding: 16px 20px;
192
+ }
193
+
194
+ .abe-pv-label {
195
+ font-size: 9px;
196
+ letter-spacing: 3px;
197
+ text-transform: uppercase;
198
+ color: #8a857d;
199
+ text-align: center;
200
+ margin-bottom: 14px;
201
+ }
202
+
203
+ .abe-pv-article {
204
+ max-width: 400px;
205
+ margin: 0 auto;
206
+ background: var(--abe-pvbg);
207
+ box-shadow: 0 1px 24px rgba(0,0,0,0.06);
208
+ font-family: 'Noto Sans KR', sans-serif;
209
+ }
210
+
211
+ .abe-pv-body {
212
+ padding: 20px 24px 24px;
213
+ }
214
+
215
+ /* ═══ Preview: Bio + Main Image Layout ═══ */
216
+ .abe-pv-intro {
217
+ display: grid;
218
+ grid-template-columns: 1fr 120px;
219
+ gap: 16px;
220
+ align-items: start;
221
+ margin-bottom: 20px;
222
+ }
223
+
224
+ .abe-pv-bio {
225
+ font-size: 11.5px;
226
+ line-height: 2;
227
+ font-weight: 300;
228
+ color: var(--abe-tmid);
229
+ }
230
+
231
+ .abe-pv-main-img { overflow: hidden; }
232
+ .abe-pv-main-img img {
233
+ width: 100%;
234
+ display: block;
235
+ aspect-ratio: 3/4;
236
+ object-fit: cover;
237
+ }
238
+
239
+ /* ═══ Preview: Gallery ═══ */
240
+ .abe-pv-gallery {
241
+ margin-top: 16px;
242
+ padding-top: 14px;
243
+ border-top: 1px solid var(--abe-dv);
244
+ }
245
+
246
+ .abe-pv-gallery-label {
247
+ font-family: 'Cormorant Garamond', serif;
248
+ font-size: 9px;
249
+ letter-spacing: 2.5px;
250
+ text-transform: uppercase;
251
+ color: var(--abe-gold);
252
+ margin-bottom: 8px;
253
+ }
254
+
255
+ /* Gallery Grid: adaptive layout by image count */
256
+ .abe-pv-gallery-grid {
257
+ display: grid;
258
+ gap: 3px;
259
+ }
260
+ .abe-pv-gallery-grid img {
261
+ width: 100%;
262
+ height: 100%;
263
+ display: block;
264
+ object-fit: cover;
265
+ }
266
+
267
+ /* 1 image */
268
+ .abe-pv-gallery-grid.layout-1 { grid-template-columns: 1fr; }
269
+ .abe-pv-gallery-grid.layout-1 img { aspect-ratio: 16/9; }
270
+
271
+ /* 2 images */
272
+ .abe-pv-gallery-grid.layout-2 { grid-template-columns: 1fr 1fr; }
273
+ .abe-pv-gallery-grid.layout-2 img { aspect-ratio: 4/5; }
274
+
275
+ /* 3 images: large left + two stacked right */
276
+ .abe-pv-gallery-grid.layout-3 {
277
+ grid-template-columns: 3fr 2fr;
278
+ grid-template-rows: 1fr 1fr;
279
+ }
280
+ .abe-pv-gallery-grid.layout-3 .abe-gi-0 { grid-row: 1 / 3; }
281
+ .abe-pv-gallery-grid.layout-3 .abe-gi-1,
282
+ .abe-pv-gallery-grid.layout-3 .abe-gi-2 { aspect-ratio: auto; }
283
+
284
+ /* 4 images: 2x2 grid */
285
+ .abe-pv-gallery-grid.layout-4 { grid-template-columns: 1fr 1fr; }
286
+ .abe-pv-gallery-grid.layout-4 img { aspect-ratio: 4/3; }
287
+
288
+ /* 5 images: top 2 large + bottom 3 small */
289
+ .abe-pv-gallery-grid.layout-5 {
290
+ grid-template-columns: 1fr 1fr 1fr;
291
+ grid-template-rows: auto auto;
292
+ }
293
+ .abe-pv-gallery-grid.layout-5 .abe-gi-0 { grid-column: 1 / 2; aspect-ratio: 3/4; }
294
+ .abe-pv-gallery-grid.layout-5 .abe-gi-1 { grid-column: 2 / 4; aspect-ratio: 16/9; }
295
+ .abe-pv-gallery-grid.layout-5 .abe-gi-2,
296
+ .abe-pv-gallery-grid.layout-5 .abe-gi-3,
297
+ .abe-pv-gallery-grid.layout-5 .abe-gi-4 { aspect-ratio: 1/1; }
298
+
299
+ /* ═══ Preview: Empty State ═══ */
300
+ .abe-pv-empty {
301
+ text-align: center;
302
+ padding: 40px 20px;
303
+ font-size: 11px;
304
+ color: var(--abe-pvtd);
305
+ font-weight: 300;
306
+ }
307
+
308
+ /* ═══ Responsive ═══ */
309
+ @media (max-width: 1100px) {
310
+ .abe-wrapper {
311
+ grid-template-columns: 1fr;
312
+ height: auto;
313
+ max-height: none;
314
+ }
315
+ .abe-preview { display: none; }
316
+ }
317
+
318
+ @media (max-width: 768px) {
319
+ .abe-wrapper {
320
+ grid-template-columns: 1fr;
321
+ height: auto;
322
+ max-height: none;
323
+ }
324
+ .abe-preview { display: none; }
325
+ .abe-editor { padding: 12px; }
326
+ .abe-gallery-grid { grid-template-columns: repeat(3, 1fr); }
327
+ .abe-main-img-upload { width: 110px; }
328
+ }
329
+
330
+ @media (max-width: 480px) {
331
+ .abe-gallery-grid { grid-template-columns: repeat(2, 1fr); }
332
+ }
@@ -0,0 +1,394 @@
1
+ /* ═══════════════════════════════════════════════
2
+ @withwiz/block-editor — Editor UI Styles
3
+ Prefix: be-*
4
+ ═══════════════════════════════════════════════ */
5
+
6
+ /* ═══ CSS Variables (override in host project) ═══ */
7
+ :root {
8
+ --be-bg: #ffffff;
9
+ --be-surface: #f7f6f4;
10
+ --be-surface2: #f0efec;
11
+ --be-border: rgba(0,0,0,0.10);
12
+ --be-border-hover: rgba(0,0,0,0.20);
13
+ --be-text: #2a2520;
14
+ --be-text-dim: #6a6560;
15
+ --be-text-bold: #1a1510;
16
+ --be-accent: #8a8070;
17
+ --be-accent-light: #736b60;
18
+ }
19
+
20
+ /* ═══ Mode Bar ═══ */
21
+ .be-mode-bar {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: 6px;
25
+ margin-bottom: 16px;
26
+ padding: 8px 10px;
27
+ background: var(--be-surface);
28
+ border: 1px solid var(--be-border);
29
+ }
30
+ .be-mode-label {
31
+ font-size: 11px;
32
+ letter-spacing: 0.5px;
33
+ color: var(--be-text);
34
+ font-weight: 500;
35
+ margin-right: 2px;
36
+ }
37
+ .be-mode-btn {
38
+ padding: 4px 12px;
39
+ font-size: 11px;
40
+ background: #fff;
41
+ border: 1px solid var(--be-border);
42
+ color: var(--be-text-dim);
43
+ cursor: pointer;
44
+ font-family: inherit;
45
+ transition: 0.2s;
46
+ }
47
+ .be-mode-btn:hover {
48
+ border-color: var(--be-accent);
49
+ color: var(--be-accent-light);
50
+ }
51
+ .be-mode-hint {
52
+ font-size: 10px;
53
+ color: var(--be-text-dim);
54
+ margin-left: auto;
55
+ font-style: italic;
56
+ }
57
+
58
+ .be-empty {
59
+ text-align: center;
60
+ padding: 14px 16px;
61
+ background: var(--be-surface);
62
+ border: 1px dashed var(--be-border);
63
+ margin-bottom: 10px;
64
+ font-size: 11px;
65
+ color: var(--be-text);
66
+ line-height: 1.7;
67
+ }
68
+
69
+ /* ═══ Blocks ═══ */
70
+ .be-blocks { min-height: 40px; }
71
+
72
+ .be-block {
73
+ background: var(--be-surface);
74
+ border: 1px solid var(--be-border);
75
+ margin-bottom: 8px;
76
+ transition: 0.2s;
77
+ }
78
+ .be-block:hover { border-color: var(--be-border-hover); }
79
+ .be-block.be-dragging { opacity: 0.4; border-color: var(--be-accent); }
80
+ .be-block.be-drag-over.be-drag-above { border-top: 2px solid var(--be-accent); margin-top: 6px; }
81
+ .be-block.be-drag-over.be-drag-below { border-bottom: 2px solid var(--be-accent); margin-bottom: 6px; }
82
+
83
+ .be-block-header {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ padding: 6px 10px;
88
+ background: rgba(0,0,0,0.02);
89
+ border-bottom: 1px solid var(--be-border);
90
+ cursor: grab;
91
+ }
92
+ .be-block-header:active { cursor: grabbing; }
93
+
94
+ .be-block-type {
95
+ font-size: 12.5px;
96
+ letter-spacing: 0.5px;
97
+ color: var(--be-text);
98
+ display: flex;
99
+ align-items: center;
100
+ gap: 6px;
101
+ font-weight: 500;
102
+ }
103
+ .be-block-drag { color: var(--be-text-dim); font-size: 12px; }
104
+
105
+ .be-block-actions { display: flex; gap: 2px; }
106
+ .be-block-btn {
107
+ width: 24px;
108
+ height: 24px;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ background: none;
113
+ border: none;
114
+ color: var(--be-text-dim);
115
+ cursor: pointer;
116
+ font-size: 14px;
117
+ transition: 0.2s;
118
+ }
119
+ .be-block-btn:hover { color: var(--be-text); }
120
+ .be-block-btn-del:hover { color: #c45; }
121
+
122
+ .be-block-body { padding: 10px; }
123
+
124
+ /* ═══ Editor Fields ═══ */
125
+ .be-input {
126
+ width: 100%;
127
+ padding: 8px 12px;
128
+ font-size: 13px;
129
+ background: #fff;
130
+ border: 1px solid var(--be-border);
131
+ color: var(--be-text-bold);
132
+ font-family: inherit;
133
+ font-weight: 400;
134
+ outline: none;
135
+ transition: 0.2s;
136
+ box-sizing: border-box;
137
+ }
138
+ .be-input:focus { border-color: var(--be-accent); }
139
+ .be-input::placeholder { color: #aaa; }
140
+
141
+ .be-textarea {
142
+ width: 100%;
143
+ padding: 10px 12px;
144
+ font-size: 12.5px;
145
+ line-height: 1.8;
146
+ background: #fff;
147
+ border: 1px solid var(--be-border);
148
+ color: var(--be-text-bold);
149
+ font-family: inherit;
150
+ font-weight: 400;
151
+ resize: vertical;
152
+ min-height: 60px;
153
+ outline: none;
154
+ transition: 0.2s;
155
+ box-sizing: border-box;
156
+ }
157
+ .be-textarea:focus { border-color: var(--be-accent); }
158
+ .be-textarea::placeholder { color: #aaa; }
159
+
160
+ /* KV Rows */
161
+ .be-kv-row {
162
+ display: grid;
163
+ grid-template-columns: 90px 1fr 22px;
164
+ gap: 4px;
165
+ margin-bottom: 4px;
166
+ align-items: center;
167
+ }
168
+ .be-kv-key {
169
+ padding: 5px 8px;
170
+ font-size: 11px;
171
+ background: var(--be-surface2);
172
+ border: 1px solid var(--be-border);
173
+ color: var(--be-text-bold);
174
+ font-family: inherit;
175
+ font-weight: 500;
176
+ outline: none;
177
+ box-sizing: border-box;
178
+ }
179
+ .be-kv-key:focus,
180
+ .be-kv-value:focus { border-color: var(--be-accent); }
181
+ .be-kv-value {
182
+ padding: 5px 8px;
183
+ font-size: 11px;
184
+ background: #fff;
185
+ border: 1px solid var(--be-border);
186
+ color: var(--be-text-bold);
187
+ font-family: inherit;
188
+ font-weight: 400;
189
+ outline: none;
190
+ box-sizing: border-box;
191
+ }
192
+ .be-kv-delete {
193
+ width: 22px;
194
+ height: 22px;
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: center;
198
+ background: none;
199
+ border: none;
200
+ color: var(--be-text-dim);
201
+ cursor: pointer;
202
+ font-size: 12px;
203
+ }
204
+ .be-kv-delete:hover { color: #c45; }
205
+ .be-stats-row {
206
+ display: grid;
207
+ grid-template-columns: 80px 1fr 22px;
208
+ gap: 4px;
209
+ margin-bottom: 4px;
210
+ align-items: center;
211
+ }
212
+ .be-add-row-btn {
213
+ padding: 4px 10px;
214
+ font-size: 10px;
215
+ background: none;
216
+ border: 1px solid var(--be-border);
217
+ color: var(--be-text-dim);
218
+ cursor: pointer;
219
+ font-family: inherit;
220
+ margin-top: 3px;
221
+ transition: 0.2s;
222
+ }
223
+ .be-add-row-btn:hover {
224
+ border-color: var(--be-accent);
225
+ color: var(--be-accent-light);
226
+ }
227
+
228
+ /* Quote Area */
229
+ .be-quote-area {
230
+ border-left: 2px solid var(--be-accent);
231
+ padding-left: 10px;
232
+ }
233
+
234
+ /* Image Upload */
235
+ .be-img-upload {
236
+ width: 100%;
237
+ aspect-ratio: 16/9;
238
+ border: 1px dashed rgba(0,0,0,0.2);
239
+ display: flex;
240
+ flex-direction: column;
241
+ align-items: center;
242
+ justify-content: center;
243
+ cursor: pointer;
244
+ background: var(--be-surface);
245
+ margin-bottom: 6px;
246
+ position: relative;
247
+ overflow: hidden;
248
+ transition: 0.2s;
249
+ }
250
+ .be-img-upload:hover { border-color: var(--be-accent); }
251
+ .be-img-upload-text { font-size: 12px; color: var(--be-text-dim); }
252
+ .be-img-upload-hint { font-size: 10px; color: var(--be-text-dim); opacity: 0.6; display: block; margin-top: 3px; }
253
+ .be-img-upload.has-image .be-img-upload-text,
254
+ .be-img-upload.has-image .be-img-upload-hint { display: none; }
255
+ .be-img-upload img {
256
+ position: absolute;
257
+ inset: 0;
258
+ width: 100%;
259
+ height: 100%;
260
+ object-fit: cover;
261
+ }
262
+ .be-img-upload.small { aspect-ratio: 4/3; }
263
+ .be-img-upload.square { aspect-ratio: 1/1; }
264
+ .be-img-upload.portrait { width: 120px; aspect-ratio: 3/4; }
265
+
266
+ .be-img-pair-grid {
267
+ display: grid;
268
+ grid-template-columns: 1fr 1fr;
269
+ gap: 6px;
270
+ margin-bottom: 6px;
271
+ }
272
+ .be-img-gallery-grid {
273
+ display: grid;
274
+ grid-template-columns: 1fr 1fr 1fr;
275
+ gap: 4px;
276
+ margin-bottom: 6px;
277
+ }
278
+ .be-img-remove-btn {
279
+ position: absolute;
280
+ top: 4px;
281
+ right: 4px;
282
+ width: 20px;
283
+ height: 20px;
284
+ background: rgba(0,0,0,0.6);
285
+ color: #fff;
286
+ border: none;
287
+ cursor: pointer;
288
+ font-size: 12px;
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ z-index: 1;
293
+ opacity: 0;
294
+ transition: opacity 0.2s;
295
+ }
296
+ .be-img-upload:hover .be-img-remove-btn { opacity: 1; }
297
+
298
+ /* Upload state */
299
+ .be-img-upload.is-drag-over { border-color: var(--be-accent); background: rgba(138,128,112,0.08); }
300
+ .be-img-upload.is-uploading,
301
+ .be-img-upload.is-resizing { opacity: 0.7; pointer-events: none; }
302
+ .be-upload-spinner { font-size: 11px; color: var(--be-accent); }
303
+ .be-drag-hint { font-size: 11px; color: var(--be-accent); font-weight: 500; }
304
+ .be-error { font-size: 10px; color: #c45; margin-top: 2px; }
305
+
306
+ /* Sub-item Cards */
307
+ .be-subitem-card {
308
+ border: 1px solid var(--be-border);
309
+ padding: 8px;
310
+ margin-bottom: 4px;
311
+ }
312
+ .be-subitem-header {
313
+ display: flex;
314
+ justify-content: space-between;
315
+ align-items: center;
316
+ margin-bottom: 4px;
317
+ }
318
+ .be-subitem-label { font-size: 9px; color: var(--be-accent-light); }
319
+ .be-subitem-2col {
320
+ display: grid;
321
+ grid-template-columns: 1fr 1fr;
322
+ gap: 3px;
323
+ margin: 4px 0;
324
+ }
325
+ .be-timeline-card {
326
+ border: 1px solid var(--be-border);
327
+ padding: 8px;
328
+ margin-bottom: 4px;
329
+ border-left: 2px solid var(--be-accent);
330
+ }
331
+
332
+ /* Add Block Bar */
333
+ .be-add-bar {
334
+ display: flex;
335
+ flex-wrap: wrap;
336
+ gap: 5px;
337
+ padding: 8px 0;
338
+ margin-top: 4px;
339
+ }
340
+ .be-add-btn {
341
+ padding: 7px 14px;
342
+ font-size: 12px;
343
+ background: #fff;
344
+ border: 1px solid var(--be-border);
345
+ color: var(--be-text);
346
+ cursor: pointer;
347
+ font-family: inherit;
348
+ transition: 0.2s;
349
+ white-space: nowrap;
350
+ position: relative;
351
+ }
352
+ .be-add-btn:hover {
353
+ border-color: var(--be-accent);
354
+ color: var(--be-accent-light);
355
+ background: rgba(138,128,112,0.06);
356
+ }
357
+ .be-add-btn[title]:hover::after {
358
+ content: attr(title);
359
+ position: absolute;
360
+ bottom: calc(100% + 6px);
361
+ left: 50%;
362
+ transform: translateX(-50%);
363
+ background: #2a2520;
364
+ color: #fff;
365
+ padding: 5px 10px;
366
+ font-size: 9px;
367
+ white-space: nowrap;
368
+ z-index: 10;
369
+ pointer-events: none;
370
+ line-height: 1.4;
371
+ }
372
+ .be-add-btn[title]:hover::before {
373
+ content: '';
374
+ position: absolute;
375
+ bottom: calc(100% + 2px);
376
+ left: 50%;
377
+ transform: translateX(-50%);
378
+ border: 4px solid transparent;
379
+ border-top-color: #2a2520;
380
+ z-index: 10;
381
+ }
382
+
383
+ /* ═══ Responsive ═══ */
384
+ @media (max-width: 768px) {
385
+ .be-mode-bar { flex-wrap: wrap; padding: 6px 8px; }
386
+ .be-mode-hint { margin-left: 0; width: 100%; font-size: 9px; }
387
+ .be-add-bar { gap: 4px; }
388
+ .be-add-btn { padding: 5px 10px; font-size: 11px; }
389
+ .be-img-pair-grid { grid-template-columns: 1fr; }
390
+ .be-img-gallery-grid { grid-template-columns: 1fr 1fr; }
391
+ .be-kv-row { grid-template-columns: 70px 1fr 22px; }
392
+ .be-stats-row { grid-template-columns: 60px 1fr 22px; }
393
+ .be-subitem-2col { grid-template-columns: 1fr; }
394
+ }