@jbpark/live-editor 5.0.0 → 6.0.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.
- package/README.ko.md +34 -32
- package/README.md +34 -32
- package/dist/{boundary-6_nTsWxP.js → boundary-CySnDUs2.js} +5 -4
- package/dist/boundary-CySnDUs2.js.map +1 -0
- package/dist/{compile-DwOyWrmI.js → compile-my0AjsCw.js} +3 -3
- package/dist/{compile-DwOyWrmI.js.map → compile-my0AjsCw.js.map} +1 -1
- package/dist/{constants-D-XKuEY2.js → constants-st9gnJ5g.js} +1 -4
- package/dist/{constants-D-XKuEY2.js.map → constants-st9gnJ5g.js.map} +1 -1
- package/dist/{context-DDR1xVKo.js → context-Bjq0CvBE.js} +3 -3
- package/dist/{context-DDR1xVKo.js.map → context-Bjq0CvBE.js.map} +1 -1
- package/dist/{core-CKazr4tT.js → core-BNVuH8-l.js} +51 -14
- package/dist/core-BNVuH8-l.js.map +1 -0
- package/dist/{detect-typescript-CoAO-QUJ.js → detect-typescript-CMF0FVKD.js} +2 -2
- package/dist/{detect-typescript-CoAO-QUJ.js.map → detect-typescript-CMF0FVKD.js.map} +1 -1
- package/dist/dnd/index.d.ts +2 -1
- package/dist/dnd/index.js +2 -1
- package/dist/{dnd-BlC1gqUy.js → dnd-BvjEDo-x.js} +1208 -1457
- package/dist/dnd-BvjEDo-x.js.map +1 -0
- package/dist/{document-DcwIEHRV.js → document-uHqw0mvr.js} +7 -7
- package/dist/{document-DcwIEHRV.js.map → document-uHqw0mvr.js.map} +1 -1
- package/dist/edit-options-C_r9aCz4.d.ts +100 -0
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.js +2 -2
- package/dist/{editor-Bty5XzpV.js → editor-CvnzrM9J.js} +2 -2
- package/dist/{editor-Bty5XzpV.js.map → editor-CvnzrM9J.js.map} +1 -1
- package/dist/error/index.d.ts +1 -1
- package/dist/error/index.js +2 -2
- package/dist/{error-DyYx2NQ2.js → error-CFzvnLCf.js} +4 -4
- package/dist/error-CFzvnLCf.js.map +1 -0
- package/dist/{index-tAiuHZsC.d.ts → index-BZpZwrxT.d.ts} +2 -2
- package/dist/{index-13BDSrQc.d.ts → index-C93npmTU.d.ts} +4 -6
- package/dist/{index-Cl79M7ZJ.d.ts → index-CqsS207F.d.ts} +2 -10
- package/dist/{index-0VB5C3Jk.d.ts → index-DQcdHg_V.d.ts} +4 -100
- package/dist/{index-kKUjo9lr.d.ts → index-DfIvkht8.d.ts} +3 -3
- package/dist/index.d.ts +8 -7
- package/dist/index.js +6 -6
- package/dist/{messages-Yb3b7YJt.d.ts → messages-BpN3QIhj.d.ts} +4 -1
- package/dist/{messages-Bt5WXKTE.js → messages-DrINcRdG.js} +4 -1
- package/dist/messages-DrINcRdG.js.map +1 -0
- package/dist/preview/index.d.ts +2 -2
- package/dist/preview/index.js +2 -3
- package/dist/{preview-DC0pyOdu.js → preview-B05MkVIQ.js} +16 -13
- package/dist/preview-B05MkVIQ.js.map +1 -0
- package/dist/provider/index.d.ts +2 -2
- package/dist/provider/index.js +2 -2
- package/dist/{sections-4uirsXRU.js → sections-DhH_aVf5.js} +3 -3
- package/dist/{sections-4uirsXRU.js.map → sections-DhH_aVf5.js.map} +1 -1
- package/dist/style.css +801 -5372
- package/dist/ui-kit/index.d.ts +22 -0
- package/dist/ui-kit/index.js +1552 -0
- package/dist/ui-kit/index.js.map +1 -0
- package/dist/ui-kit/style.css +5039 -0
- package/dist/{update-DNInQSM7.js → update-BuYQJqjq.js} +3 -3
- package/dist/{update-DNInQSM7.js.map → update-BuYQJqjq.js.map} +1 -1
- package/dist/{use-dynamic-tailwind-CSYKXDmX.js → use-dynamic-tailwind-B3l1qZRW.js} +21 -18
- package/dist/use-dynamic-tailwind-B3l1qZRW.js.map +1 -0
- package/dist/use-field-state-iQGW0vc6.js +131 -0
- package/dist/use-field-state-iQGW0vc6.js.map +1 -0
- package/dist/utils/ast/index.js +2 -2
- package/dist/utils/index.js +2 -2
- package/package.json +13 -3
- package/dist/boundary-6_nTsWxP.js.map +0 -1
- package/dist/core-CKazr4tT.js.map +0 -1
- package/dist/dnd-BlC1gqUy.js.map +0 -1
- package/dist/error-DyYx2NQ2.js.map +0 -1
- package/dist/messages-Bt5WXKTE.js.map +0 -1
- package/dist/preview-DC0pyOdu.js.map +0 -1
- package/dist/use-dynamic-tailwind-CSYKXDmX.js.map +0 -1
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import { C as isJSXElement, D as isJSXIdentifier, E as isJSXFragment, I as isSpreadElement, L as isStringLiteral, N as isObjectExpression, O as isJSXOpeningElement, P as isObjectProperty, S as isJSXAttribute, a as inspectDocument, at as stringLiteral, b as isExpression, ct as traverseFast, d as applyEdits, dt as parseExpression, k as isJSXSpreadAttribute, l as fillIdsFrom, n as fillSectionIds, ot as templateElement, p as nanoid, st as templateLiteral, t as createSectionPreviewCache, u as replaceIds, x as isIdentifier } from "./document-
|
|
2
|
-
import { r as DATA_ATTR, s as RESERVED_BINDING_PROPERTIES, t as BINDING_PROP } from "./constants-
|
|
3
|
-
import {
|
|
4
|
-
import { i as useLiveMessages } from "./messages-Bt5WXKTE.js";
|
|
1
|
+
import { C as isJSXElement, D as isJSXIdentifier, E as isJSXFragment, I as isSpreadElement, L as isStringLiteral, N as isObjectExpression, O as isJSXOpeningElement, P as isObjectProperty, S as isJSXAttribute, a as inspectDocument, at as stringLiteral, b as isExpression, ct as traverseFast, d as applyEdits, dt as parseExpression, k as isJSXSpreadAttribute, l as fillIdsFrom, n as fillSectionIds, ot as templateElement, p as nanoid, st as templateLiteral, t as createSectionPreviewCache, u as replaceIds, x as isIdentifier } from "./document-uHqw0mvr.js";
|
|
2
|
+
import { r as DATA_ATTR, s as RESERVED_BINDING_PROPERTIES, t as BINDING_PROP } from "./constants-st9gnJ5g.js";
|
|
3
|
+
import { i as useLiveMessages } from "./messages-DrINcRdG.js";
|
|
5
4
|
import { i as usePreview } from "./states-Ci1AvoQ9.js";
|
|
6
|
-
import { _ as parseArrayExpression, a as getChildrenSignatures, b as generateCode, c as removeIndices, d as getStructuredValue, f as readNodeBindings, g as isLosslesslyEvaluable, h as extractObjectProperties, i as valueToExpression, l as findEditableChildren, m as extractNodeValue, n as updateAll, o as extract, p as canLosslesslyEvaluateSource, r as createNodeFromValue, s as moveSelectedIndices, u as getCurrentValue, v as parseValue } from "./update-
|
|
5
|
+
import { _ as parseArrayExpression, a as getChildrenSignatures, b as generateCode, c as removeIndices, d as getStructuredValue, f as readNodeBindings, g as isLosslesslyEvaluable, h as extractObjectProperties, i as valueToExpression, l as findEditableChildren, m as extractNodeValue, n as updateAll, o as extract, p as canLosslesslyEvaluateSource, r as createNodeFromValue, s as moveSelectedIndices, u as getCurrentValue, v as parseValue } from "./update-BuYQJqjq.js";
|
|
7
6
|
import { t as cn } from "./cn-CAnad2vL.js";
|
|
8
|
-
import { r as preloadScripts } from "./compile-
|
|
9
|
-
import { a as replaceSections, i as generateSection, r as extractSections } from "./sections-
|
|
10
|
-
import { n as Error$1, t as ErrorBoundary } from "./boundary-
|
|
11
|
-
import {
|
|
12
|
-
import { t as
|
|
7
|
+
import { r as preloadScripts } from "./compile-my0AjsCw.js";
|
|
8
|
+
import { a as replaceSections, i as generateSection, r as extractSections } from "./sections-DhH_aVf5.js";
|
|
9
|
+
import { n as Error$1, t as ErrorBoundary } from "./boundary-CySnDUs2.js";
|
|
10
|
+
import { a as renderStableComponent, n as useCompiledModule, o as Frame, t as useDynamicTailwind } from "./use-dynamic-tailwind-B3l1qZRW.js";
|
|
11
|
+
import { i as getFieldKind, n as FieldIdsContext, o as FieldError, r as LABELABLE_KINDS, s as fields_module_default, t as useFieldState } from "./use-field-state-iQGW0vc6.js";
|
|
12
|
+
import { t as Core } from "./core-BNVuH8-l.js";
|
|
13
13
|
import { Children, createContext, memo, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
14
14
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
15
15
|
import { DndContext, DragOverlay, KeyboardSensor, MouseSensor, PointerSensor, TouchSensor, closestCenter, useDndContext, useDraggable, useDroppable, useSensor, useSensors } from "@dnd-kit/core";
|
|
16
16
|
import { restrictToParentElement, restrictToVerticalAxis } from "@dnd-kit/modifiers";
|
|
17
17
|
import { SortableContext, arrayMove, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable";
|
|
18
18
|
import { useDebounce, useElementPosition, useKeyPress, useLatest, useMultiSelect, usePendingCommit, useResponsiveSize, useSet, useStableValue } from "@jbpark/use-hooks";
|
|
19
|
-
import { Button, Card, Checkbox, ColorPicker, DatePicker, Drawer, Input, RichTextEditor, Select, Space, Splitter, TimePicker, Toast, Typography } from "@jbpark/ui-kit";
|
|
20
19
|
import { CSS as CSS$1 } from "@dnd-kit/utilities";
|
|
21
20
|
import { ArrowDown, ArrowUp, ChevronDown, ChevronRight, ChevronUp, Copy, Crosshair, GripVertical, LayoutGrid, Plus, Trash, X } from "lucide-react";
|
|
22
21
|
//#region src/constants/palette-sections.ts
|
|
@@ -25,14 +24,8 @@ const PALETTE_SECTIONS = [
|
|
|
25
24
|
id: "hero",
|
|
26
25
|
name: "Hero",
|
|
27
26
|
code: `
|
|
28
|
-
<section
|
|
29
|
-
|
|
30
|
-
className={cn(
|
|
31
|
-
'text-center text-white',
|
|
32
|
-
//
|
|
33
|
-
)}
|
|
34
|
-
>
|
|
35
|
-
<ui.Space
|
|
27
|
+
<section data-name="Hero" className="text-center text-white">
|
|
28
|
+
<div
|
|
36
29
|
data-id=""
|
|
37
30
|
data-binding={[
|
|
38
31
|
{
|
|
@@ -43,33 +36,25 @@ const PALETTE_SECTIONS = [
|
|
|
43
36
|
// fields as a top-level binding.
|
|
44
37
|
render: {
|
|
45
38
|
backgroundColor: { type: 'color', label: 'Background Color' },
|
|
39
|
+
gap: {
|
|
40
|
+
type: 'number',
|
|
41
|
+
label: 'Content Spacing',
|
|
42
|
+
// Constraints the library validates with or without a
|
|
43
|
+
// widget.
|
|
44
|
+
min: 0,
|
|
45
|
+
max: 40,
|
|
46
|
+
// Presentation only: the built-in panel ignores it and
|
|
47
|
+
// shows a number input; a custom panel can switch on
|
|
48
|
+
// widget.type.
|
|
49
|
+
widget: { type: 'slider', step: 4, unit: 'px' },
|
|
50
|
+
},
|
|
46
51
|
},
|
|
47
52
|
// Not a library field, so it arrives as meta.group.
|
|
48
53
|
group: 'layout',
|
|
49
54
|
},
|
|
50
|
-
{
|
|
51
|
-
label: 'Content Spacing',
|
|
52
|
-
property: 'size',
|
|
53
|
-
type: 'number',
|
|
54
|
-
// Constraints the library validates with or without a widget.
|
|
55
|
-
min: 0,
|
|
56
|
-
max: 40,
|
|
57
|
-
// Presentation only: the built-in panel ignores it and shows a
|
|
58
|
-
// number input; a custom panel can switch on widget.type.
|
|
59
|
-
widget: { type: 'slider', step: 4, unit: 'px' },
|
|
60
|
-
group: 'layout',
|
|
61
|
-
},
|
|
62
55
|
]}
|
|
63
|
-
style={{
|
|
64
|
-
|
|
65
|
-
}}
|
|
66
|
-
orientation="vertical"
|
|
67
|
-
size={16}
|
|
68
|
-
align="center"
|
|
69
|
-
className={cn(
|
|
70
|
-
'px-5 py-15',
|
|
71
|
-
//
|
|
72
|
-
)}
|
|
56
|
+
style={{ backgroundColor: '#6366f1', gap: 16 }}
|
|
57
|
+
className="flex flex-col items-center px-5 py-15"
|
|
73
58
|
>
|
|
74
59
|
<h1
|
|
75
60
|
data-id=""
|
|
@@ -81,71 +66,29 @@ const PALETTE_SECTIONS = [
|
|
|
81
66
|
required: true,
|
|
82
67
|
},
|
|
83
68
|
]}
|
|
84
|
-
className=
|
|
85
|
-
'text-5xl font-bold',
|
|
86
|
-
//
|
|
87
|
-
)}
|
|
69
|
+
className="text-5xl font-bold"
|
|
88
70
|
>
|
|
89
71
|
Welcome to Live Editor
|
|
90
72
|
</h1>
|
|
91
73
|
<p
|
|
92
74
|
data-id=""
|
|
93
|
-
data-binding={[
|
|
94
|
-
|
|
95
|
-
label: 'Description',
|
|
96
|
-
type: 'richtext',
|
|
97
|
-
},
|
|
98
|
-
]}
|
|
99
|
-
className={cn(
|
|
100
|
-
'text-xl',
|
|
101
|
-
//
|
|
102
|
-
)}
|
|
75
|
+
data-binding={[{ label: 'Description', type: 'richtext' }]}
|
|
76
|
+
className="text-xl"
|
|
103
77
|
>
|
|
104
78
|
Build <strong>dynamic components</strong> with drag & drop
|
|
105
79
|
</p>
|
|
106
|
-
<
|
|
80
|
+
<a
|
|
107
81
|
data-id=""
|
|
108
82
|
data-binding={[
|
|
109
|
-
{
|
|
110
|
-
|
|
111
|
-
property: 'innerText',
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
label: 'Button Icon',
|
|
115
|
-
property: 'icon',
|
|
116
|
-
type: 'jsx',
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
label: 'Button Size',
|
|
120
|
-
property: 'size',
|
|
121
|
-
options: [
|
|
122
|
-
{ label: 'Small', value: 'small' },
|
|
123
|
-
{ label: 'Middle', value: 'middle' },
|
|
124
|
-
{ label: 'Large', value: 'large' },
|
|
125
|
-
],
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
label: 'Button Variant',
|
|
129
|
-
property: 'variant',
|
|
130
|
-
options: [
|
|
131
|
-
{ label: 'Solid', value: 'solid' },
|
|
132
|
-
{ label: 'Outlined', value: 'outlined' },
|
|
133
|
-
{ label: 'Filled', value: 'filled' },
|
|
134
|
-
],
|
|
135
|
-
},
|
|
83
|
+
{ label: 'Button Text', property: 'innerText' },
|
|
84
|
+
{ label: 'Button Link', property: 'href', type: 'url' },
|
|
136
85
|
]}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
variant="solid"
|
|
140
|
-
className={cn(
|
|
141
|
-
'bg-white text-indigo-500',
|
|
142
|
-
'hover:bg-gray-50',
|
|
143
|
-
//
|
|
144
|
-
)}
|
|
86
|
+
href="https://github.com/pjb0811/live-editor"
|
|
87
|
+
className="rounded-md bg-white px-6 py-3 text-lg font-medium text-indigo-500 hover:bg-gray-50"
|
|
145
88
|
>
|
|
146
|
-
Get Started
|
|
147
|
-
</
|
|
148
|
-
</
|
|
89
|
+
🚀 Get Started
|
|
90
|
+
</a>
|
|
91
|
+
</div>
|
|
149
92
|
</section>
|
|
150
93
|
`
|
|
151
94
|
},
|
|
@@ -153,191 +96,82 @@ const PALETTE_SECTIONS = [
|
|
|
153
96
|
id: "features",
|
|
154
97
|
name: "Features",
|
|
155
98
|
code: `
|
|
156
|
-
<section
|
|
157
|
-
|
|
158
|
-
className={cn(
|
|
159
|
-
'px-5 py-10',
|
|
160
|
-
//
|
|
161
|
-
)}
|
|
162
|
-
>
|
|
163
|
-
<ui.Space
|
|
99
|
+
<section data-name="Features" className="px-5 py-10">
|
|
100
|
+
<div
|
|
164
101
|
data-id=""
|
|
165
|
-
data-binding={[
|
|
166
|
-
|
|
167
|
-
label: 'Feature Cards',
|
|
168
|
-
property: 'children',
|
|
169
|
-
},
|
|
170
|
-
]}
|
|
171
|
-
className={cn(
|
|
172
|
-
'mx-auto max-w-7xl',
|
|
173
|
-
//
|
|
174
|
-
)}
|
|
175
|
-
size="large"
|
|
176
|
-
wrap
|
|
102
|
+
data-binding={[{ label: 'Feature Cards', property: 'children' }]}
|
|
103
|
+
className="mx-auto flex max-w-7xl flex-wrap gap-6"
|
|
177
104
|
>
|
|
178
|
-
<
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
'text-5xl',
|
|
249
|
-
//
|
|
250
|
-
)}
|
|
251
|
-
>
|
|
252
|
-
⚡
|
|
253
|
-
</div>
|
|
254
|
-
<h3
|
|
255
|
-
data-id=""
|
|
256
|
-
data-binding={[
|
|
257
|
-
{
|
|
258
|
-
label: 'Title',
|
|
259
|
-
property: 'innerText',
|
|
260
|
-
},
|
|
261
|
-
]}
|
|
262
|
-
className={cn(
|
|
263
|
-
'text-2xl text-gray-800',
|
|
264
|
-
//
|
|
265
|
-
)}
|
|
266
|
-
>
|
|
267
|
-
Feature 2
|
|
268
|
-
</h3>
|
|
269
|
-
<p
|
|
270
|
-
data-id=""
|
|
271
|
-
data-binding={[
|
|
272
|
-
{
|
|
273
|
-
label: 'Description',
|
|
274
|
-
property: 'innerText',
|
|
275
|
-
},
|
|
276
|
-
]}
|
|
277
|
-
className={cn(
|
|
278
|
-
'text-gray-600',
|
|
279
|
-
//
|
|
280
|
-
)}
|
|
281
|
-
>
|
|
282
|
-
Another great feature
|
|
283
|
-
</p>
|
|
284
|
-
</ui.Space>
|
|
285
|
-
</ui.Card>
|
|
286
|
-
<ui.Card
|
|
287
|
-
className={cn(
|
|
288
|
-
'min-w-70 flex-1 text-center',
|
|
289
|
-
//
|
|
290
|
-
)}
|
|
291
|
-
>
|
|
292
|
-
<ui.Space orientation="vertical" size="middle" align="center">
|
|
293
|
-
<div
|
|
294
|
-
data-id=""
|
|
295
|
-
data-binding={[
|
|
296
|
-
{
|
|
297
|
-
label: 'Icon',
|
|
298
|
-
property: 'innerText',
|
|
299
|
-
},
|
|
300
|
-
]}
|
|
301
|
-
className={cn(
|
|
302
|
-
'text-5xl',
|
|
303
|
-
//
|
|
304
|
-
)}
|
|
305
|
-
>
|
|
306
|
-
✨
|
|
307
|
-
</div>
|
|
308
|
-
<h3
|
|
309
|
-
data-id=""
|
|
310
|
-
data-binding={[
|
|
311
|
-
{
|
|
312
|
-
label: 'Title',
|
|
313
|
-
property: 'innerText',
|
|
314
|
-
},
|
|
315
|
-
]}
|
|
316
|
-
className={cn(
|
|
317
|
-
'text-2xl text-gray-800',
|
|
318
|
-
//
|
|
319
|
-
)}
|
|
320
|
-
>
|
|
321
|
-
Feature 3
|
|
322
|
-
</h3>
|
|
323
|
-
<p
|
|
324
|
-
data-id=""
|
|
325
|
-
data-binding={[
|
|
326
|
-
{
|
|
327
|
-
label: 'Description',
|
|
328
|
-
property: 'innerText',
|
|
329
|
-
},
|
|
330
|
-
]}
|
|
331
|
-
className={cn(
|
|
332
|
-
'text-gray-600',
|
|
333
|
-
//
|
|
334
|
-
)}
|
|
335
|
-
>
|
|
336
|
-
One more awesome thing
|
|
337
|
-
</p>
|
|
338
|
-
</ui.Space>
|
|
339
|
-
</ui.Card>
|
|
340
|
-
</ui.Space>
|
|
105
|
+
<div className="min-w-70 flex-1 rounded-lg border border-gray-200 bg-white p-6 text-center">
|
|
106
|
+
<div
|
|
107
|
+
data-id=""
|
|
108
|
+
data-binding={[{ label: 'Icon', property: 'innerText' }]}
|
|
109
|
+
className="mb-3 text-5xl"
|
|
110
|
+
>
|
|
111
|
+
🚀
|
|
112
|
+
</div>
|
|
113
|
+
<h3
|
|
114
|
+
data-id=""
|
|
115
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
116
|
+
className="mb-2 text-2xl text-gray-800"
|
|
117
|
+
>
|
|
118
|
+
Feature 1
|
|
119
|
+
</h3>
|
|
120
|
+
<p
|
|
121
|
+
data-id=""
|
|
122
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
123
|
+
className="text-gray-600"
|
|
124
|
+
>
|
|
125
|
+
Amazing feature description
|
|
126
|
+
</p>
|
|
127
|
+
</div>
|
|
128
|
+
<div className="min-w-70 flex-1 rounded-lg border border-gray-200 bg-white p-6 text-center">
|
|
129
|
+
<div
|
|
130
|
+
data-id=""
|
|
131
|
+
data-binding={[{ label: 'Icon', property: 'innerText' }]}
|
|
132
|
+
className="mb-3 text-5xl"
|
|
133
|
+
>
|
|
134
|
+
⚡
|
|
135
|
+
</div>
|
|
136
|
+
<h3
|
|
137
|
+
data-id=""
|
|
138
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
139
|
+
className="mb-2 text-2xl text-gray-800"
|
|
140
|
+
>
|
|
141
|
+
Feature 2
|
|
142
|
+
</h3>
|
|
143
|
+
<p
|
|
144
|
+
data-id=""
|
|
145
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
146
|
+
className="text-gray-600"
|
|
147
|
+
>
|
|
148
|
+
Another great feature
|
|
149
|
+
</p>
|
|
150
|
+
</div>
|
|
151
|
+
<div className="min-w-70 flex-1 rounded-lg border border-gray-200 bg-white p-6 text-center">
|
|
152
|
+
<div
|
|
153
|
+
data-id=""
|
|
154
|
+
data-binding={[{ label: 'Icon', property: 'innerText' }]}
|
|
155
|
+
className="mb-3 text-5xl"
|
|
156
|
+
>
|
|
157
|
+
✨
|
|
158
|
+
</div>
|
|
159
|
+
<h3
|
|
160
|
+
data-id=""
|
|
161
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
162
|
+
className="mb-2 text-2xl text-gray-800"
|
|
163
|
+
>
|
|
164
|
+
Feature 3
|
|
165
|
+
</h3>
|
|
166
|
+
<p
|
|
167
|
+
data-id=""
|
|
168
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
169
|
+
className="text-gray-600"
|
|
170
|
+
>
|
|
171
|
+
One more awesome thing
|
|
172
|
+
</p>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
341
175
|
</section>
|
|
342
176
|
`
|
|
343
177
|
},
|
|
@@ -345,60 +179,34 @@ const PALETTE_SECTIONS = [
|
|
|
345
179
|
id: "about",
|
|
346
180
|
name: "About",
|
|
347
181
|
code: `
|
|
348
|
-
<section
|
|
349
|
-
|
|
350
|
-
className={cn(
|
|
351
|
-
'mx-auto max-w-3xl px-5 py-10',
|
|
352
|
-
//
|
|
353
|
-
)}
|
|
354
|
-
>
|
|
355
|
-
<ui.Typography.Title
|
|
182
|
+
<section data-name="About" className="mx-auto max-w-3xl px-5 py-10">
|
|
183
|
+
<h2
|
|
356
184
|
data-id=""
|
|
357
185
|
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
358
|
-
|
|
359
|
-
className={cn(
|
|
360
|
-
'mb-5 text-4xl text-gray-800',
|
|
361
|
-
//
|
|
362
|
-
)}
|
|
186
|
+
className="mb-5 text-4xl font-semibold text-gray-800"
|
|
363
187
|
>
|
|
364
188
|
About Live Editor
|
|
365
|
-
</
|
|
366
|
-
<
|
|
189
|
+
</h2>
|
|
190
|
+
<p
|
|
367
191
|
data-id=""
|
|
368
|
-
data-binding={[
|
|
369
|
-
|
|
370
|
-
label: 'Description 1',
|
|
371
|
-
type: 'richtext',
|
|
372
|
-
},
|
|
373
|
-
]}
|
|
374
|
-
className={cn(
|
|
375
|
-
'mb-4 text-lg leading-relaxed text-gray-600',
|
|
376
|
-
//
|
|
377
|
-
)}
|
|
192
|
+
data-binding={[{ label: 'Description 1', type: 'richtext' }]}
|
|
193
|
+
className="mb-4 text-lg leading-relaxed text-gray-600"
|
|
378
194
|
>
|
|
379
195
|
Live Editor is a powerful visual development tool that enables you to
|
|
380
196
|
create stunning web interfaces through an intuitive drag-and-drop
|
|
381
197
|
experience. Built with modern web technologies, it streamlines your
|
|
382
198
|
workflow and accelerates development cycles.
|
|
383
|
-
</
|
|
384
|
-
<
|
|
199
|
+
</p>
|
|
200
|
+
<p
|
|
385
201
|
data-id=""
|
|
386
|
-
data-binding={[
|
|
387
|
-
|
|
388
|
-
label: 'Description 2',
|
|
389
|
-
type: 'richtext',
|
|
390
|
-
},
|
|
391
|
-
]}
|
|
392
|
-
className={cn(
|
|
393
|
-
'text-lg leading-relaxed text-gray-600',
|
|
394
|
-
//
|
|
395
|
-
)}
|
|
202
|
+
data-binding={[{ label: 'Description 2', type: 'richtext' }]}
|
|
203
|
+
className="text-lg leading-relaxed text-gray-600"
|
|
396
204
|
>
|
|
397
205
|
Whether you're a seasoned developer or just starting out, Live
|
|
398
206
|
Editor provides the flexibility and control you need to bring your
|
|
399
207
|
creative vision to life. Focus on what matters most - building great
|
|
400
208
|
products.
|
|
401
|
-
</
|
|
209
|
+
</p>
|
|
402
210
|
</section>
|
|
403
211
|
`
|
|
404
212
|
},
|
|
@@ -406,89 +214,44 @@ const PALETTE_SECTIONS = [
|
|
|
406
214
|
id: "cta",
|
|
407
215
|
name: "CTA",
|
|
408
216
|
code: `
|
|
409
|
-
<section
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
'bg-gray-50 px-5 py-12 text-center',
|
|
413
|
-
//
|
|
414
|
-
)}
|
|
415
|
-
>
|
|
416
|
-
<div
|
|
417
|
-
className={cn(
|
|
418
|
-
'mx-auto max-w-xl',
|
|
419
|
-
//
|
|
420
|
-
)}
|
|
421
|
-
>
|
|
422
|
-
<ui.Typography.Title
|
|
217
|
+
<section data-name="CTA" className="bg-gray-50 px-5 py-12 text-center">
|
|
218
|
+
<div className="mx-auto max-w-xl">
|
|
219
|
+
<h2
|
|
423
220
|
data-id=""
|
|
424
221
|
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
425
|
-
|
|
426
|
-
className={cn(
|
|
427
|
-
'mb-4 text-3xl text-gray-800',
|
|
428
|
-
//
|
|
429
|
-
)}
|
|
222
|
+
className="mb-4 text-3xl font-semibold text-gray-800"
|
|
430
223
|
>
|
|
431
224
|
Ready to get started?
|
|
432
|
-
</
|
|
433
|
-
<
|
|
225
|
+
</h2>
|
|
226
|
+
<p
|
|
434
227
|
data-id=""
|
|
435
|
-
data-binding={[
|
|
436
|
-
|
|
437
|
-
label: 'Description',
|
|
438
|
-
property: 'innerText',
|
|
439
|
-
},
|
|
440
|
-
]}
|
|
441
|
-
className={cn(
|
|
442
|
-
'mb-6 text-lg text-gray-600',
|
|
443
|
-
//
|
|
444
|
-
)}
|
|
228
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
229
|
+
className="mb-6 text-lg text-gray-600"
|
|
445
230
|
>
|
|
446
231
|
Start exploring what Live Editor can do for your projects
|
|
447
|
-
</
|
|
448
|
-
<
|
|
232
|
+
</p>
|
|
233
|
+
<div
|
|
449
234
|
data-id=""
|
|
450
235
|
data-binding={[{ label: 'Buttons', property: 'children' }]}
|
|
451
|
-
className=
|
|
452
|
-
'flex flex-wrap justify-center gap-4',
|
|
453
|
-
//
|
|
454
|
-
)}
|
|
236
|
+
className="flex flex-wrap justify-center gap-4"
|
|
455
237
|
>
|
|
456
|
-
<
|
|
238
|
+
<a
|
|
457
239
|
data-id=""
|
|
458
|
-
data-binding={[
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
property: 'innerText',
|
|
462
|
-
},
|
|
463
|
-
]}
|
|
464
|
-
size="large"
|
|
465
|
-
className={cn(
|
|
466
|
-
'bg-indigo-500 px-8 text-base text-white',
|
|
467
|
-
'hover:bg-indigo-600',
|
|
468
|
-
//
|
|
469
|
-
)}
|
|
240
|
+
data-binding={[{ label: 'Button 1 Text', property: 'innerText' }]}
|
|
241
|
+
href="#"
|
|
242
|
+
className="rounded-md bg-indigo-500 px-8 py-3 text-base text-white hover:bg-indigo-600"
|
|
470
243
|
>
|
|
471
244
|
View Documentation
|
|
472
|
-
</
|
|
473
|
-
<
|
|
245
|
+
</a>
|
|
246
|
+
<a
|
|
474
247
|
data-id=""
|
|
475
|
-
data-binding={[
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
property: 'innerText',
|
|
479
|
-
},
|
|
480
|
-
]}
|
|
481
|
-
variant="outlined"
|
|
482
|
-
size="large"
|
|
483
|
-
className={cn(
|
|
484
|
-
'border-2 border-indigo-500 px-8 text-base text-indigo-500',
|
|
485
|
-
'hover:bg-indigo-50',
|
|
486
|
-
//
|
|
487
|
-
)}
|
|
248
|
+
data-binding={[{ label: 'Button 2 Text', property: 'innerText' }]}
|
|
249
|
+
href="#"
|
|
250
|
+
className="rounded-md border-2 border-indigo-500 px-8 py-3 text-base text-indigo-500 hover:bg-indigo-50"
|
|
488
251
|
>
|
|
489
252
|
View Examples
|
|
490
|
-
</
|
|
491
|
-
</
|
|
253
|
+
</a>
|
|
254
|
+
</div>
|
|
492
255
|
</div>
|
|
493
256
|
</section>
|
|
494
257
|
`
|
|
@@ -497,266 +260,118 @@ const PALETTE_SECTIONS = [
|
|
|
497
260
|
id: "getting-started",
|
|
498
261
|
name: "Getting Started",
|
|
499
262
|
code: `
|
|
500
|
-
<section
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
'px-5 py-16',
|
|
504
|
-
//
|
|
505
|
-
)}
|
|
506
|
-
>
|
|
507
|
-
<div
|
|
508
|
-
className={cn(
|
|
509
|
-
'mx-auto max-w-5xl',
|
|
510
|
-
//
|
|
511
|
-
)}
|
|
512
|
-
>
|
|
513
|
-
<ui.Typography.Title
|
|
263
|
+
<section data-name="Getting Started" className="px-5 py-16">
|
|
264
|
+
<div className="mx-auto max-w-5xl">
|
|
265
|
+
<h2
|
|
514
266
|
data-id=""
|
|
515
267
|
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
516
|
-
|
|
517
|
-
className={cn(
|
|
518
|
-
'mb-12 text-center text-4xl font-bold text-gray-800',
|
|
519
|
-
//
|
|
520
|
-
)}
|
|
268
|
+
className="mb-12 text-center text-4xl font-bold text-gray-800"
|
|
521
269
|
>
|
|
522
270
|
How to Get Started
|
|
523
|
-
</
|
|
524
|
-
<div
|
|
525
|
-
|
|
526
|
-
'grid gap-8 md:grid-cols-3',
|
|
527
|
-
//
|
|
528
|
-
)}
|
|
529
|
-
>
|
|
530
|
-
<ui.Card
|
|
271
|
+
</h2>
|
|
272
|
+
<div className="grid gap-8 md:grid-cols-3">
|
|
273
|
+
<div
|
|
531
274
|
data-id=""
|
|
532
|
-
data-binding={[
|
|
533
|
-
|
|
534
|
-
label: 'Card 1 Content',
|
|
535
|
-
property: 'children',
|
|
536
|
-
},
|
|
537
|
-
]}
|
|
538
|
-
className={cn(
|
|
539
|
-
'rounded-lg border-2 border-gray-200 bg-white p-8',
|
|
540
|
-
//
|
|
541
|
-
)}
|
|
275
|
+
data-binding={[{ label: 'Card 1 Content', property: 'children' }]}
|
|
276
|
+
className="rounded-lg border-2 border-gray-200 bg-white p-8"
|
|
542
277
|
>
|
|
543
|
-
<
|
|
278
|
+
<h3
|
|
544
279
|
data-id=""
|
|
545
|
-
data-binding={[
|
|
546
|
-
|
|
547
|
-
label: 'Card 1 Title',
|
|
548
|
-
property: 'innerText',
|
|
549
|
-
},
|
|
550
|
-
]}
|
|
551
|
-
level={3}
|
|
552
|
-
className={cn(
|
|
553
|
-
'mb-2 text-2xl font-bold text-gray-800',
|
|
554
|
-
//
|
|
555
|
-
)}
|
|
280
|
+
data-binding={[{ label: 'Card 1 Title', property: 'innerText' }]}
|
|
281
|
+
className="mb-2 text-2xl font-bold text-gray-800"
|
|
556
282
|
>
|
|
557
283
|
Explore
|
|
558
|
-
</
|
|
559
|
-
<
|
|
284
|
+
</h3>
|
|
285
|
+
<p
|
|
560
286
|
data-id=""
|
|
561
|
-
data-binding={[
|
|
562
|
-
|
|
563
|
-
label: 'Card 1 Icon',
|
|
564
|
-
property: 'innerText',
|
|
565
|
-
},
|
|
566
|
-
]}
|
|
567
|
-
className={cn(
|
|
568
|
-
'mb-6 text-4xl font-bold text-indigo-600',
|
|
569
|
-
//
|
|
570
|
-
)}
|
|
287
|
+
data-binding={[{ label: 'Card 1 Icon', property: 'innerText' }]}
|
|
288
|
+
className="mb-6 text-4xl font-bold text-indigo-600"
|
|
571
289
|
>
|
|
572
290
|
📚
|
|
573
|
-
</
|
|
574
|
-
<ul
|
|
575
|
-
className={cn(
|
|
576
|
-
'mb-8 space-y-3 text-gray-600',
|
|
577
|
-
//
|
|
578
|
-
)}
|
|
579
|
-
>
|
|
291
|
+
</p>
|
|
292
|
+
<ul className="mb-8 space-y-3 text-gray-600">
|
|
580
293
|
<li>✓ Read documentation</li>
|
|
581
294
|
<li>✓ Browse examples</li>
|
|
582
295
|
<li>✓ Try the demo</li>
|
|
583
296
|
</ul>
|
|
584
|
-
<
|
|
297
|
+
<a
|
|
585
298
|
data-id=""
|
|
586
|
-
data-binding={[
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
property: 'innerText',
|
|
590
|
-
},
|
|
591
|
-
]}
|
|
592
|
-
variant="outlined"
|
|
593
|
-
size="large"
|
|
594
|
-
block
|
|
595
|
-
className={cn(
|
|
596
|
-
'border-2 border-indigo-500 text-indigo-500',
|
|
597
|
-
'hover:bg-indigo-50',
|
|
598
|
-
//
|
|
599
|
-
)}
|
|
299
|
+
data-binding={[{ label: 'Card 1 Button', property: 'innerText' }]}
|
|
300
|
+
href="#"
|
|
301
|
+
className="block rounded-md border-2 border-indigo-500 px-4 py-2 text-center text-indigo-500 hover:bg-indigo-50"
|
|
600
302
|
>
|
|
601
303
|
View Docs
|
|
602
|
-
</
|
|
603
|
-
</
|
|
604
|
-
<
|
|
304
|
+
</a>
|
|
305
|
+
</div>
|
|
306
|
+
<div
|
|
605
307
|
data-id=""
|
|
606
|
-
data-binding={[
|
|
607
|
-
|
|
608
|
-
label: 'Card 2 Content',
|
|
609
|
-
property: 'children',
|
|
610
|
-
},
|
|
611
|
-
]}
|
|
612
|
-
className={cn(
|
|
613
|
-
'relative rounded-lg border-2 border-indigo-500 bg-white p-8',
|
|
614
|
-
//
|
|
615
|
-
)}
|
|
308
|
+
data-binding={[{ label: 'Card 2 Content', property: 'children' }]}
|
|
309
|
+
className="relative rounded-lg border-2 border-indigo-500 bg-white p-8"
|
|
616
310
|
>
|
|
617
|
-
<div
|
|
618
|
-
className={cn(
|
|
619
|
-
'absolute -top-4 left-1/2 -translate-x-1/2',
|
|
620
|
-
'rounded-full bg-indigo-500 px-4 py-1 text-sm text-white',
|
|
621
|
-
//
|
|
622
|
-
)}
|
|
623
|
-
>
|
|
311
|
+
<div className="absolute -top-4 left-1/2 -translate-x-1/2 rounded-full bg-indigo-500 px-4 py-1 text-sm text-white">
|
|
624
312
|
Recommended
|
|
625
313
|
</div>
|
|
626
|
-
<
|
|
314
|
+
<h3
|
|
627
315
|
data-id=""
|
|
628
|
-
data-binding={[
|
|
629
|
-
|
|
630
|
-
label: 'Card 2 Title',
|
|
631
|
-
property: 'innerText',
|
|
632
|
-
},
|
|
633
|
-
]}
|
|
634
|
-
level={3}
|
|
635
|
-
className={cn(
|
|
636
|
-
'mb-2 text-2xl font-bold text-gray-800',
|
|
637
|
-
//
|
|
638
|
-
)}
|
|
316
|
+
data-binding={[{ label: 'Card 2 Title', property: 'innerText' }]}
|
|
317
|
+
className="mb-2 text-2xl font-bold text-gray-800"
|
|
639
318
|
>
|
|
640
319
|
Practice
|
|
641
|
-
</
|
|
642
|
-
<
|
|
320
|
+
</h3>
|
|
321
|
+
<p
|
|
643
322
|
data-id=""
|
|
644
|
-
data-binding={[
|
|
645
|
-
|
|
646
|
-
label: 'Card 2 Icon',
|
|
647
|
-
property: 'innerText',
|
|
648
|
-
},
|
|
649
|
-
]}
|
|
650
|
-
className={cn(
|
|
651
|
-
'mb-6 text-4xl font-bold text-indigo-600',
|
|
652
|
-
//
|
|
653
|
-
)}
|
|
323
|
+
data-binding={[{ label: 'Card 2 Icon', property: 'innerText' }]}
|
|
324
|
+
className="mb-6 text-4xl font-bold text-indigo-600"
|
|
654
325
|
>
|
|
655
326
|
💻
|
|
656
|
-
</
|
|
657
|
-
<ul
|
|
658
|
-
className={cn(
|
|
659
|
-
'mb-8 space-y-3 text-gray-600',
|
|
660
|
-
//
|
|
661
|
-
)}
|
|
662
|
-
>
|
|
327
|
+
</p>
|
|
328
|
+
<ul className="mb-8 space-y-3 text-gray-600">
|
|
663
329
|
<li>✓ Interactive playground</li>
|
|
664
330
|
<li>✓ Experiment freely</li>
|
|
665
331
|
<li>✓ Build your own</li>
|
|
666
332
|
</ul>
|
|
667
|
-
<
|
|
333
|
+
<a
|
|
668
334
|
data-id=""
|
|
669
|
-
data-binding={[
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
property: 'innerText',
|
|
673
|
-
},
|
|
674
|
-
]}
|
|
675
|
-
size="large"
|
|
676
|
-
block
|
|
677
|
-
className={cn(
|
|
678
|
-
'bg-indigo-500 text-white',
|
|
679
|
-
'hover:bg-indigo-600',
|
|
680
|
-
//
|
|
681
|
-
)}
|
|
335
|
+
data-binding={[{ label: 'Card 2 Button', property: 'innerText' }]}
|
|
336
|
+
href="#"
|
|
337
|
+
className="block rounded-md bg-indigo-500 px-4 py-2 text-center text-white hover:bg-indigo-600"
|
|
682
338
|
>
|
|
683
339
|
Start Building
|
|
684
|
-
</
|
|
685
|
-
</
|
|
686
|
-
<
|
|
340
|
+
</a>
|
|
341
|
+
</div>
|
|
342
|
+
<div
|
|
687
343
|
data-id=""
|
|
688
|
-
data-binding={[
|
|
689
|
-
|
|
690
|
-
label: 'Card 3 Content',
|
|
691
|
-
property: 'children',
|
|
692
|
-
},
|
|
693
|
-
]}
|
|
694
|
-
className={cn(
|
|
695
|
-
'rounded-lg border-2 border-gray-200 bg-white p-8',
|
|
696
|
-
//
|
|
697
|
-
)}
|
|
344
|
+
data-binding={[{ label: 'Card 3 Content', property: 'children' }]}
|
|
345
|
+
className="rounded-lg border-2 border-gray-200 bg-white p-8"
|
|
698
346
|
>
|
|
699
|
-
<
|
|
347
|
+
<h3
|
|
700
348
|
data-id=""
|
|
701
|
-
data-binding={[
|
|
702
|
-
|
|
703
|
-
label: 'Card 3 Title',
|
|
704
|
-
property: 'innerText',
|
|
705
|
-
},
|
|
706
|
-
]}
|
|
707
|
-
level={3}
|
|
708
|
-
className={cn(
|
|
709
|
-
'mb-2 text-2xl font-bold text-gray-800',
|
|
710
|
-
//
|
|
711
|
-
)}
|
|
349
|
+
data-binding={[{ label: 'Card 3 Title', property: 'innerText' }]}
|
|
350
|
+
className="mb-2 text-2xl font-bold text-gray-800"
|
|
712
351
|
>
|
|
713
352
|
Contribute
|
|
714
|
-
</
|
|
715
|
-
<
|
|
353
|
+
</h3>
|
|
354
|
+
<p
|
|
716
355
|
data-id=""
|
|
717
|
-
data-binding={[
|
|
718
|
-
|
|
719
|
-
label: 'Card 3 Icon',
|
|
720
|
-
property: 'innerText',
|
|
721
|
-
},
|
|
722
|
-
]}
|
|
723
|
-
className={cn(
|
|
724
|
-
'mb-6 text-4xl font-bold text-indigo-600',
|
|
725
|
-
//
|
|
726
|
-
)}
|
|
356
|
+
data-binding={[{ label: 'Card 3 Icon', property: 'innerText' }]}
|
|
357
|
+
className="mb-6 text-4xl font-bold text-indigo-600"
|
|
727
358
|
>
|
|
728
359
|
🤝
|
|
729
|
-
</
|
|
730
|
-
<ul
|
|
731
|
-
className={cn(
|
|
732
|
-
'mb-8 space-y-3 text-gray-600',
|
|
733
|
-
//
|
|
734
|
-
)}
|
|
735
|
-
>
|
|
360
|
+
</p>
|
|
361
|
+
<ul className="mb-8 space-y-3 text-gray-600">
|
|
736
362
|
<li>✓ Report issues</li>
|
|
737
363
|
<li>✓ Suggest features</li>
|
|
738
364
|
<li>✓ Submit pull requests</li>
|
|
739
365
|
</ul>
|
|
740
|
-
<
|
|
366
|
+
<a
|
|
741
367
|
data-id=""
|
|
742
|
-
data-binding={[
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
property: 'innerText',
|
|
746
|
-
},
|
|
747
|
-
]}
|
|
748
|
-
variant="outlined"
|
|
749
|
-
size="large"
|
|
750
|
-
block
|
|
751
|
-
className={cn(
|
|
752
|
-
'border-2 border-indigo-500 text-indigo-500',
|
|
753
|
-
'hover:bg-indigo-50',
|
|
754
|
-
//
|
|
755
|
-
)}
|
|
368
|
+
data-binding={[{ label: 'Card 3 Button', property: 'innerText' }]}
|
|
369
|
+
href="#"
|
|
370
|
+
className="block rounded-md border-2 border-indigo-500 px-4 py-2 text-center text-indigo-500 hover:bg-indigo-50"
|
|
756
371
|
>
|
|
757
372
|
View on GitHub
|
|
758
|
-
</
|
|
759
|
-
</
|
|
373
|
+
</a>
|
|
374
|
+
</div>
|
|
760
375
|
</div>
|
|
761
376
|
</div>
|
|
762
377
|
</section>
|
|
@@ -766,96 +381,33 @@ const PALETTE_SECTIONS = [
|
|
|
766
381
|
id: "key-features",
|
|
767
382
|
name: "Key Features",
|
|
768
383
|
code: `
|
|
769
|
-
<section
|
|
770
|
-
|
|
771
|
-
className={cn(
|
|
772
|
-
'bg-indigo-50 px-5 py-16',
|
|
773
|
-
//
|
|
774
|
-
)}
|
|
775
|
-
>
|
|
776
|
-
<div
|
|
777
|
-
className={cn(
|
|
778
|
-
'mx-auto max-w-6xl',
|
|
779
|
-
//
|
|
780
|
-
)}
|
|
781
|
-
>
|
|
384
|
+
<section data-name="Key Features" className="bg-indigo-50 px-5 py-16">
|
|
385
|
+
<div className="mx-auto max-w-6xl">
|
|
782
386
|
<h2
|
|
783
387
|
data-id=""
|
|
784
388
|
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
785
|
-
className=
|
|
786
|
-
'mb-12 text-center text-4xl font-bold text-gray-800',
|
|
787
|
-
//
|
|
788
|
-
)}
|
|
389
|
+
className="mb-12 text-center text-4xl font-bold text-gray-800"
|
|
789
390
|
>
|
|
790
391
|
Key Features
|
|
791
392
|
</h2>
|
|
792
|
-
<div
|
|
793
|
-
className=
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
)}
|
|
797
|
-
>
|
|
798
|
-
<div
|
|
799
|
-
className={cn(
|
|
800
|
-
'rounded-lg bg-white p-8 shadow-md',
|
|
801
|
-
//
|
|
802
|
-
)}
|
|
803
|
-
>
|
|
804
|
-
<div
|
|
805
|
-
className={cn(
|
|
806
|
-
'mb-4 text-4xl',
|
|
807
|
-
//
|
|
808
|
-
)}
|
|
809
|
-
>
|
|
810
|
-
🎨
|
|
811
|
-
</div>
|
|
812
|
-
<h3
|
|
813
|
-
className={cn(
|
|
814
|
-
'mb-4 text-2xl font-bold text-gray-800',
|
|
815
|
-
//
|
|
816
|
-
)}
|
|
817
|
-
>
|
|
393
|
+
<div className="grid gap-8 md:grid-cols-2">
|
|
394
|
+
<div className="rounded-lg bg-white p-8 shadow-md">
|
|
395
|
+
<div className="mb-4 text-4xl">🎨</div>
|
|
396
|
+
<h3 className="mb-4 text-2xl font-bold text-gray-800">
|
|
818
397
|
Visual Editing
|
|
819
398
|
</h3>
|
|
820
|
-
<p
|
|
821
|
-
className={cn(
|
|
822
|
-
'text-gray-600',
|
|
823
|
-
//
|
|
824
|
-
)}
|
|
825
|
-
>
|
|
399
|
+
<p className="text-gray-600">
|
|
826
400
|
See your changes in real-time as you build. Live Editor provides
|
|
827
401
|
instant visual feedback, making it easier to understand how code
|
|
828
402
|
affects your interface.
|
|
829
403
|
</p>
|
|
830
404
|
</div>
|
|
831
|
-
<div
|
|
832
|
-
className=
|
|
833
|
-
|
|
834
|
-
//
|
|
835
|
-
)}
|
|
836
|
-
>
|
|
837
|
-
<div
|
|
838
|
-
className={cn(
|
|
839
|
-
'mb-4 text-4xl',
|
|
840
|
-
//
|
|
841
|
-
)}
|
|
842
|
-
>
|
|
843
|
-
🧩
|
|
844
|
-
</div>
|
|
845
|
-
<h3
|
|
846
|
-
className={cn(
|
|
847
|
-
'mb-4 text-2xl font-bold text-gray-800',
|
|
848
|
-
//
|
|
849
|
-
)}
|
|
850
|
-
>
|
|
405
|
+
<div className="rounded-lg bg-white p-8 shadow-md">
|
|
406
|
+
<div className="mb-4 text-4xl">🧩</div>
|
|
407
|
+
<h3 className="mb-4 text-2xl font-bold text-gray-800">
|
|
851
408
|
Component-Based
|
|
852
409
|
</h3>
|
|
853
|
-
<p
|
|
854
|
-
className={cn(
|
|
855
|
-
'text-gray-600',
|
|
856
|
-
//
|
|
857
|
-
)}
|
|
858
|
-
>
|
|
410
|
+
<p className="text-gray-600">
|
|
859
411
|
Build with reusable components that you can drag, drop, and
|
|
860
412
|
customize. Learn modern development patterns while creating your
|
|
861
413
|
interface.
|
|
@@ -870,199 +422,77 @@ const PALETTE_SECTIONS = [
|
|
|
870
422
|
id: "stats",
|
|
871
423
|
name: "Stats",
|
|
872
424
|
code: `
|
|
873
|
-
<section
|
|
874
|
-
|
|
875
|
-
className={cn(
|
|
876
|
-
'bg-indigo-600 text-white',
|
|
877
|
-
//
|
|
878
|
-
)}
|
|
879
|
-
>
|
|
880
|
-
<ui.Marquees
|
|
425
|
+
<section data-name="Stats" className="bg-indigo-600 px-5 py-16 text-white">
|
|
426
|
+
<div
|
|
881
427
|
data-id=""
|
|
882
|
-
data-binding={[
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
<div
|
|
951
|
-
className={cn(
|
|
952
|
-
'min-w-60 text-center',
|
|
953
|
-
//
|
|
954
|
-
)}
|
|
955
|
-
>
|
|
956
|
-
<p
|
|
957
|
-
data-id=""
|
|
958
|
-
data-binding={[
|
|
959
|
-
{
|
|
960
|
-
label: 'Title',
|
|
961
|
-
property: 'innerText',
|
|
962
|
-
},
|
|
963
|
-
]}
|
|
964
|
-
className={cn(
|
|
965
|
-
'mb-2 text-5xl font-bold',
|
|
966
|
-
//
|
|
967
|
-
)}
|
|
968
|
-
>
|
|
969
|
-
Free
|
|
970
|
-
</p>
|
|
971
|
-
<p
|
|
972
|
-
data-id=""
|
|
973
|
-
data-binding={[
|
|
974
|
-
{
|
|
975
|
-
label: 'Description',
|
|
976
|
-
property: 'innerText',
|
|
977
|
-
},
|
|
978
|
-
]}
|
|
979
|
-
className={cn(
|
|
980
|
-
'text-indigo-200',
|
|
981
|
-
//
|
|
982
|
-
)}
|
|
983
|
-
>
|
|
984
|
-
For Everyone
|
|
985
|
-
</p>
|
|
986
|
-
</div>
|
|
987
|
-
<div
|
|
988
|
-
className={cn(
|
|
989
|
-
'min-w-60 text-center',
|
|
990
|
-
//
|
|
991
|
-
)}
|
|
992
|
-
>
|
|
993
|
-
<p
|
|
994
|
-
data-id=""
|
|
995
|
-
data-binding={[
|
|
996
|
-
{
|
|
997
|
-
label: 'Title',
|
|
998
|
-
property: 'innerText',
|
|
999
|
-
},
|
|
1000
|
-
]}
|
|
1001
|
-
className={cn(
|
|
1002
|
-
'mb-2 text-5xl font-bold',
|
|
1003
|
-
//
|
|
1004
|
-
)}
|
|
1005
|
-
>
|
|
1006
|
-
Active
|
|
1007
|
-
</p>
|
|
1008
|
-
<p
|
|
1009
|
-
data-id=""
|
|
1010
|
-
data-binding={[
|
|
1011
|
-
{
|
|
1012
|
-
label: 'Description',
|
|
1013
|
-
property: 'innerText',
|
|
1014
|
-
},
|
|
1015
|
-
]}
|
|
1016
|
-
className={cn(
|
|
1017
|
-
'text-indigo-200',
|
|
1018
|
-
//
|
|
1019
|
-
)}
|
|
1020
|
-
>
|
|
1021
|
-
Community
|
|
1022
|
-
</p>
|
|
1023
|
-
</div>
|
|
1024
|
-
<div
|
|
1025
|
-
className={cn(
|
|
1026
|
-
'min-w-60 text-center',
|
|
1027
|
-
//
|
|
1028
|
-
)}
|
|
1029
|
-
>
|
|
1030
|
-
<p
|
|
1031
|
-
data-id=""
|
|
1032
|
-
data-binding={[
|
|
1033
|
-
{
|
|
1034
|
-
label: 'Title',
|
|
1035
|
-
property: 'innerText',
|
|
1036
|
-
},
|
|
1037
|
-
]}
|
|
1038
|
-
className={cn(
|
|
1039
|
-
'mb-2 text-5xl font-bold',
|
|
1040
|
-
//
|
|
1041
|
-
)}
|
|
1042
|
-
>
|
|
1043
|
-
Learn
|
|
1044
|
-
</p>
|
|
1045
|
-
<p
|
|
1046
|
-
data-id=""
|
|
1047
|
-
data-binding={[
|
|
1048
|
-
{
|
|
1049
|
-
label: 'Description',
|
|
1050
|
-
property: 'innerText',
|
|
1051
|
-
},
|
|
1052
|
-
]}
|
|
1053
|
-
className={cn(
|
|
1054
|
-
'text-indigo-200',
|
|
1055
|
-
//
|
|
1056
|
-
)}
|
|
1057
|
-
>
|
|
1058
|
-
By Doing
|
|
1059
|
-
</p>
|
|
1060
|
-
</div>
|
|
1061
|
-
</div>
|
|
1062
|
-
),
|
|
1063
|
-
},
|
|
1064
|
-
]}
|
|
1065
|
-
/>
|
|
428
|
+
data-binding={[{ label: 'Stats Cards', property: 'children' }]}
|
|
429
|
+
className="mx-auto flex max-w-6xl flex-wrap justify-center gap-10"
|
|
430
|
+
>
|
|
431
|
+
<div className="min-w-50 flex-1 text-center">
|
|
432
|
+
<p
|
|
433
|
+
data-id=""
|
|
434
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
435
|
+
className="mb-2 text-5xl font-bold"
|
|
436
|
+
>
|
|
437
|
+
Open
|
|
438
|
+
</p>
|
|
439
|
+
<p
|
|
440
|
+
data-id=""
|
|
441
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
442
|
+
className="text-indigo-200"
|
|
443
|
+
>
|
|
444
|
+
Source Project
|
|
445
|
+
</p>
|
|
446
|
+
</div>
|
|
447
|
+
<div className="min-w-50 flex-1 text-center">
|
|
448
|
+
<p
|
|
449
|
+
data-id=""
|
|
450
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
451
|
+
className="mb-2 text-5xl font-bold"
|
|
452
|
+
>
|
|
453
|
+
Free
|
|
454
|
+
</p>
|
|
455
|
+
<p
|
|
456
|
+
data-id=""
|
|
457
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
458
|
+
className="text-indigo-200"
|
|
459
|
+
>
|
|
460
|
+
For Everyone
|
|
461
|
+
</p>
|
|
462
|
+
</div>
|
|
463
|
+
<div className="min-w-50 flex-1 text-center">
|
|
464
|
+
<p
|
|
465
|
+
data-id=""
|
|
466
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
467
|
+
className="mb-2 text-5xl font-bold"
|
|
468
|
+
>
|
|
469
|
+
Active
|
|
470
|
+
</p>
|
|
471
|
+
<p
|
|
472
|
+
data-id=""
|
|
473
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
474
|
+
className="text-indigo-200"
|
|
475
|
+
>
|
|
476
|
+
Community
|
|
477
|
+
</p>
|
|
478
|
+
</div>
|
|
479
|
+
<div className="min-w-50 flex-1 text-center">
|
|
480
|
+
<p
|
|
481
|
+
data-id=""
|
|
482
|
+
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
483
|
+
className="mb-2 text-5xl font-bold"
|
|
484
|
+
>
|
|
485
|
+
Learn
|
|
486
|
+
</p>
|
|
487
|
+
<p
|
|
488
|
+
data-id=""
|
|
489
|
+
data-binding={[{ label: 'Description', property: 'innerText' }]}
|
|
490
|
+
className="text-indigo-200"
|
|
491
|
+
>
|
|
492
|
+
By Doing
|
|
493
|
+
</p>
|
|
494
|
+
</div>
|
|
495
|
+
</div>
|
|
1066
496
|
</section>
|
|
1067
497
|
`
|
|
1068
498
|
},
|
|
@@ -1070,147 +500,311 @@ const PALETTE_SECTIONS = [
|
|
|
1070
500
|
id: "roadmap",
|
|
1071
501
|
name: "Roadmap",
|
|
1072
502
|
code: `
|
|
1073
|
-
<section
|
|
1074
|
-
|
|
1075
|
-
className={cn(
|
|
1076
|
-
'px-5 py-16',
|
|
1077
|
-
//
|
|
1078
|
-
)}
|
|
1079
|
-
>
|
|
1080
|
-
<div
|
|
1081
|
-
className={cn(
|
|
1082
|
-
'mx-auto max-w-3xl',
|
|
1083
|
-
//
|
|
1084
|
-
)}
|
|
1085
|
-
>
|
|
503
|
+
<section data-name="Roadmap" className="px-5 py-16">
|
|
504
|
+
<div className="mx-auto max-w-3xl">
|
|
1086
505
|
<h2
|
|
1087
506
|
data-id=""
|
|
1088
507
|
data-binding={[
|
|
1089
508
|
{ label: 'Title', property: 'innerText', required: true },
|
|
1090
509
|
]}
|
|
1091
|
-
className=
|
|
1092
|
-
'mb-8 text-center text-4xl font-bold text-gray-800',
|
|
1093
|
-
//
|
|
1094
|
-
)}
|
|
510
|
+
className="mb-8 text-center text-4xl font-bold text-gray-800"
|
|
1095
511
|
>
|
|
1096
512
|
Roadmap
|
|
1097
513
|
</h2>
|
|
1098
|
-
<
|
|
514
|
+
<ol
|
|
1099
515
|
data-id=""
|
|
1100
|
-
data-binding={[
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
type: '
|
|
1110
|
-
|
|
1111
|
-
|
|
516
|
+
data-binding={[{ label: 'Milestones', property: 'children' }]}
|
|
517
|
+
>
|
|
518
|
+
<li className="flex items-center gap-4 border-b border-gray-100 py-4">
|
|
519
|
+
<span
|
|
520
|
+
data-id=""
|
|
521
|
+
data-binding={[
|
|
522
|
+
{
|
|
523
|
+
label: 'Accent',
|
|
524
|
+
property: 'style',
|
|
525
|
+
type: 'object',
|
|
526
|
+
render: {
|
|
527
|
+
backgroundColor: { type: 'color', label: 'Accent Color' },
|
|
528
|
+
},
|
|
529
|
+
},
|
|
530
|
+
]}
|
|
531
|
+
style={{ backgroundColor: '#22c55e' }}
|
|
532
|
+
className="size-3 shrink-0 rounded-full"
|
|
533
|
+
/>
|
|
534
|
+
<div className="min-w-0 flex-1">
|
|
535
|
+
<p
|
|
536
|
+
data-id=""
|
|
537
|
+
data-binding={[
|
|
538
|
+
{ label: 'Title', property: 'innerText', required: true },
|
|
539
|
+
]}
|
|
540
|
+
className="font-semibold text-gray-800"
|
|
541
|
+
>
|
|
542
|
+
Visual editing
|
|
543
|
+
</p>
|
|
544
|
+
<p className="text-sm text-gray-500">
|
|
545
|
+
<time
|
|
546
|
+
data-id=""
|
|
547
|
+
data-binding={[
|
|
548
|
+
{
|
|
549
|
+
label: 'Release Date',
|
|
550
|
+
property: 'dateTime',
|
|
551
|
+
type: 'date',
|
|
552
|
+
required: true,
|
|
553
|
+
},
|
|
554
|
+
{ label: 'Date Text', property: 'innerText' },
|
|
555
|
+
]}
|
|
556
|
+
dateTime="2026-03-02"
|
|
557
|
+
>
|
|
558
|
+
March 2, 2026
|
|
559
|
+
</time>
|
|
560
|
+
{' · '}
|
|
561
|
+
<span
|
|
562
|
+
data-id=""
|
|
563
|
+
data-binding={[
|
|
564
|
+
{
|
|
565
|
+
label: 'Status',
|
|
566
|
+
property: 'innerText',
|
|
567
|
+
options: [
|
|
568
|
+
{ label: 'Planned', value: 'Planned' },
|
|
569
|
+
{ label: 'In Progress', value: 'In Progress' },
|
|
570
|
+
{ label: 'Shipped', value: 'Shipped' },
|
|
571
|
+
],
|
|
572
|
+
},
|
|
573
|
+
]}
|
|
574
|
+
>
|
|
575
|
+
Shipped
|
|
576
|
+
</span>
|
|
577
|
+
</p>
|
|
578
|
+
<progress
|
|
579
|
+
data-id=""
|
|
580
|
+
data-binding={[
|
|
581
|
+
{
|
|
582
|
+
label: 'Progress',
|
|
583
|
+
property: 'value',
|
|
584
|
+
type: 'number',
|
|
585
|
+
min: 0,
|
|
586
|
+
max: 100,
|
|
587
|
+
widget: { type: 'slider', step: 10, unit: '%' },
|
|
588
|
+
},
|
|
589
|
+
]}
|
|
590
|
+
value={100}
|
|
591
|
+
max={100}
|
|
592
|
+
className="mt-2 h-2 w-full"
|
|
593
|
+
/>
|
|
594
|
+
</div>
|
|
595
|
+
<a
|
|
596
|
+
data-id=""
|
|
597
|
+
data-binding={[
|
|
598
|
+
{ label: 'Link Text', property: 'innerText' },
|
|
599
|
+
{
|
|
600
|
+
label: 'Link URL',
|
|
601
|
+
property: 'href',
|
|
602
|
+
type: 'url',
|
|
603
|
+
pattern: '^https://',
|
|
604
|
+
// Not a library field, so it arrives as meta.hint.
|
|
605
|
+
hint: 'Must use https',
|
|
1112
606
|
},
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
607
|
+
]}
|
|
608
|
+
href="https://github.com"
|
|
609
|
+
className="text-sm text-indigo-500 hover:underline"
|
|
610
|
+
>
|
|
611
|
+
Release notes
|
|
612
|
+
</a>
|
|
613
|
+
</li>
|
|
614
|
+
<li className="flex items-center gap-4 border-b border-gray-100 py-4">
|
|
615
|
+
<span
|
|
616
|
+
data-id=""
|
|
617
|
+
data-binding={[
|
|
618
|
+
{
|
|
619
|
+
label: 'Accent',
|
|
620
|
+
property: 'style',
|
|
621
|
+
type: 'object',
|
|
622
|
+
render: {
|
|
623
|
+
backgroundColor: { type: 'color', label: 'Accent Color' },
|
|
624
|
+
},
|
|
1122
625
|
},
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
626
|
+
]}
|
|
627
|
+
style={{ backgroundColor: '#6366f1' }}
|
|
628
|
+
className="size-3 shrink-0 rounded-full"
|
|
629
|
+
/>
|
|
630
|
+
<div className="min-w-0 flex-1">
|
|
631
|
+
<p
|
|
632
|
+
data-id=""
|
|
633
|
+
data-binding={[
|
|
634
|
+
{ label: 'Title', property: 'innerText', required: true },
|
|
635
|
+
]}
|
|
636
|
+
className="font-semibold text-gray-800"
|
|
637
|
+
>
|
|
638
|
+
Custom panels
|
|
639
|
+
</p>
|
|
640
|
+
<p className="text-sm text-gray-500">
|
|
641
|
+
<time
|
|
642
|
+
data-id=""
|
|
643
|
+
data-binding={[
|
|
644
|
+
{
|
|
645
|
+
label: 'Release Date',
|
|
646
|
+
property: 'dateTime',
|
|
647
|
+
type: 'date',
|
|
648
|
+
required: true,
|
|
649
|
+
},
|
|
650
|
+
{ label: 'Date Text', property: 'innerText' },
|
|
651
|
+
]}
|
|
652
|
+
dateTime="2026-09-26"
|
|
653
|
+
>
|
|
654
|
+
September 26, 2026
|
|
655
|
+
</time>
|
|
656
|
+
{' · '}
|
|
657
|
+
<span
|
|
658
|
+
data-id=""
|
|
659
|
+
data-binding={[
|
|
660
|
+
{
|
|
661
|
+
label: 'Status',
|
|
662
|
+
property: 'innerText',
|
|
663
|
+
options: [
|
|
664
|
+
{ label: 'Planned', value: 'Planned' },
|
|
665
|
+
{ label: 'In Progress', value: 'In Progress' },
|
|
666
|
+
{ label: 'Shipped', value: 'Shipped' },
|
|
667
|
+
],
|
|
668
|
+
},
|
|
669
|
+
]}
|
|
670
|
+
>
|
|
671
|
+
In Progress
|
|
672
|
+
</span>
|
|
673
|
+
</p>
|
|
674
|
+
<progress
|
|
675
|
+
data-id=""
|
|
676
|
+
data-binding={[
|
|
677
|
+
{
|
|
678
|
+
label: 'Progress',
|
|
679
|
+
property: 'value',
|
|
680
|
+
type: 'number',
|
|
681
|
+
min: 0,
|
|
682
|
+
max: 100,
|
|
683
|
+
widget: { type: 'slider', step: 10, unit: '%' },
|
|
684
|
+
},
|
|
685
|
+
]}
|
|
686
|
+
value={60}
|
|
687
|
+
max={100}
|
|
688
|
+
className="mt-2 h-2 w-full"
|
|
689
|
+
/>
|
|
690
|
+
</div>
|
|
691
|
+
<a
|
|
692
|
+
data-id=""
|
|
693
|
+
data-binding={[
|
|
694
|
+
{ label: 'Link Text', property: 'innerText' },
|
|
695
|
+
{
|
|
696
|
+
label: 'Link URL',
|
|
697
|
+
property: 'href',
|
|
698
|
+
type: 'url',
|
|
699
|
+
pattern: '^https://',
|
|
700
|
+
// Not a library field, so it arrives as meta.hint.
|
|
701
|
+
hint: 'Must use https',
|
|
1129
702
|
},
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
703
|
+
]}
|
|
704
|
+
href="https://github.com"
|
|
705
|
+
className="text-sm text-indigo-500 hover:underline"
|
|
706
|
+
>
|
|
707
|
+
Guide
|
|
708
|
+
</a>
|
|
709
|
+
</li>
|
|
710
|
+
<li className="flex items-center gap-4 border-b border-gray-100 py-4">
|
|
711
|
+
<span
|
|
712
|
+
data-id=""
|
|
713
|
+
data-binding={[
|
|
714
|
+
{
|
|
715
|
+
label: 'Accent',
|
|
716
|
+
property: 'style',
|
|
1135
717
|
type: 'object',
|
|
1136
|
-
label: 'Link',
|
|
1137
718
|
render: {
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
719
|
+
backgroundColor: { type: 'color', label: 'Accent Color' },
|
|
720
|
+
},
|
|
721
|
+
},
|
|
722
|
+
]}
|
|
723
|
+
style={{ backgroundColor: '#f59e0b' }}
|
|
724
|
+
className="size-3 shrink-0 rounded-full"
|
|
725
|
+
/>
|
|
726
|
+
<div className="min-w-0 flex-1">
|
|
727
|
+
<p
|
|
728
|
+
data-id=""
|
|
729
|
+
data-binding={[
|
|
730
|
+
{ label: 'Title', property: 'innerText', required: true },
|
|
731
|
+
]}
|
|
732
|
+
className="font-semibold text-gray-800"
|
|
733
|
+
>
|
|
734
|
+
Collaboration
|
|
735
|
+
</p>
|
|
736
|
+
<p className="text-sm text-gray-500">
|
|
737
|
+
<time
|
|
738
|
+
data-id=""
|
|
739
|
+
data-binding={[
|
|
740
|
+
{
|
|
741
|
+
label: 'Release Date',
|
|
742
|
+
property: 'dateTime',
|
|
743
|
+
type: 'date',
|
|
744
|
+
required: true,
|
|
745
|
+
},
|
|
746
|
+
{ label: 'Date Text', property: 'innerText' },
|
|
747
|
+
]}
|
|
748
|
+
dateTime="2027-01-15"
|
|
749
|
+
>
|
|
750
|
+
January 15, 2027
|
|
751
|
+
</time>
|
|
752
|
+
{' · '}
|
|
753
|
+
<span
|
|
754
|
+
data-id=""
|
|
755
|
+
data-binding={[
|
|
756
|
+
{
|
|
757
|
+
label: 'Status',
|
|
758
|
+
property: 'innerText',
|
|
759
|
+
options: [
|
|
760
|
+
{ label: 'Planned', value: 'Planned' },
|
|
761
|
+
{ label: 'In Progress', value: 'In Progress' },
|
|
762
|
+
{ label: 'Shipped', value: 'Shipped' },
|
|
763
|
+
],
|
|
1145
764
|
},
|
|
765
|
+
]}
|
|
766
|
+
>
|
|
767
|
+
Planned
|
|
768
|
+
</span>
|
|
769
|
+
</p>
|
|
770
|
+
<progress
|
|
771
|
+
data-id=""
|
|
772
|
+
data-binding={[
|
|
773
|
+
{
|
|
774
|
+
label: 'Progress',
|
|
775
|
+
property: 'value',
|
|
776
|
+
type: 'number',
|
|
777
|
+
min: 0,
|
|
778
|
+
max: 100,
|
|
779
|
+
widget: { type: 'slider', step: 10, unit: '%' },
|
|
1146
780
|
},
|
|
1147
|
-
}
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
data={[
|
|
1152
|
-
{
|
|
1153
|
-
title: 'Visual editing',
|
|
1154
|
-
date: '2026-03-02',
|
|
1155
|
-
status: 'shipped',
|
|
1156
|
-
progress: 100,
|
|
1157
|
-
color: '#22c55e',
|
|
1158
|
-
highlight: false,
|
|
1159
|
-
link: { text: 'Release notes', href: 'https://github.com' },
|
|
1160
|
-
},
|
|
1161
|
-
{
|
|
1162
|
-
title: 'Custom panels',
|
|
1163
|
-
date: '2026-09-26',
|
|
1164
|
-
status: 'in-progress',
|
|
1165
|
-
progress: 60,
|
|
1166
|
-
color: '#6366f1',
|
|
1167
|
-
highlight: true,
|
|
1168
|
-
link: { text: 'Guide', href: 'https://github.com' },
|
|
1169
|
-
},
|
|
1170
|
-
{
|
|
1171
|
-
title: 'Collaboration',
|
|
1172
|
-
date: '2027-01-15',
|
|
1173
|
-
status: 'planned',
|
|
1174
|
-
progress: 0,
|
|
1175
|
-
color: '#f59e0b',
|
|
1176
|
-
highlight: false,
|
|
1177
|
-
link: { text: 'Discussion', href: 'https://github.com' },
|
|
1178
|
-
},
|
|
1179
|
-
]}
|
|
1180
|
-
itemKey={item => item.title}
|
|
1181
|
-
renderItem={item => (
|
|
1182
|
-
<div
|
|
1183
|
-
className={cn(
|
|
1184
|
-
'flex items-center gap-4 border-b border-gray-100 py-4',
|
|
1185
|
-
item.highlight && 'rounded-lg bg-indigo-50 px-4',
|
|
1186
|
-
)}
|
|
1187
|
-
>
|
|
1188
|
-
<span
|
|
1189
|
-
className="size-3 shrink-0 rounded-full"
|
|
1190
|
-
style={{ backgroundColor: item.color }}
|
|
781
|
+
]}
|
|
782
|
+
value={0}
|
|
783
|
+
max={100}
|
|
784
|
+
className="mt-2 h-2 w-full"
|
|
1191
785
|
/>
|
|
1192
|
-
<div className="min-w-0 flex-1">
|
|
1193
|
-
<p className="font-semibold text-gray-800">{item.title}</p>
|
|
1194
|
-
<p className="text-sm text-gray-500">
|
|
1195
|
-
{item.date} · {item.status}
|
|
1196
|
-
</p>
|
|
1197
|
-
<ui.Progress value={item.progress} className="mt-2" />
|
|
1198
|
-
</div>
|
|
1199
|
-
<a
|
|
1200
|
-
href={item.link.href}
|
|
1201
|
-
className="text-sm text-indigo-500 hover:underline"
|
|
1202
|
-
>
|
|
1203
|
-
{item.link.text}
|
|
1204
|
-
</a>
|
|
1205
786
|
</div>
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
787
|
+
<a
|
|
788
|
+
data-id=""
|
|
789
|
+
data-binding={[
|
|
790
|
+
{ label: 'Link Text', property: 'innerText' },
|
|
791
|
+
{
|
|
792
|
+
label: 'Link URL',
|
|
793
|
+
property: 'href',
|
|
794
|
+
type: 'url',
|
|
795
|
+
pattern: '^https://',
|
|
796
|
+
// Not a library field, so it arrives as meta.hint.
|
|
797
|
+
hint: 'Must use https',
|
|
798
|
+
},
|
|
799
|
+
]}
|
|
800
|
+
href="https://github.com"
|
|
801
|
+
className="text-sm text-indigo-500 hover:underline"
|
|
802
|
+
>
|
|
803
|
+
Discussion
|
|
804
|
+
</a>
|
|
805
|
+
</li>
|
|
806
|
+
</ol>
|
|
807
|
+
<p className="mt-6 text-center text-sm text-gray-500">
|
|
1214
808
|
Last updated{' '}
|
|
1215
809
|
<time
|
|
1216
810
|
data-id=""
|
|
@@ -1254,179 +848,133 @@ const PALETTE_SECTIONS = [
|
|
|
1254
848
|
id: "faq",
|
|
1255
849
|
name: "FAQ",
|
|
1256
850
|
code: `
|
|
1257
|
-
<section
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
'px-5 py-16',
|
|
1261
|
-
//
|
|
1262
|
-
)}
|
|
1263
|
-
>
|
|
1264
|
-
<div
|
|
1265
|
-
className={cn(
|
|
1266
|
-
'mx-auto max-w-3xl',
|
|
1267
|
-
//
|
|
1268
|
-
)}
|
|
1269
|
-
>
|
|
1270
|
-
<ui.Typography.Title
|
|
851
|
+
<section data-name="FAQ" className="px-5 py-16">
|
|
852
|
+
<div className="mx-auto max-w-3xl">
|
|
853
|
+
<h2
|
|
1271
854
|
data-id=""
|
|
1272
855
|
data-binding={[{ label: 'Title', property: 'innerText' }]}
|
|
1273
|
-
|
|
1274
|
-
className={cn(
|
|
1275
|
-
'mb-12 text-center text-4xl font-bold text-gray-800',
|
|
1276
|
-
//
|
|
1277
|
-
)}
|
|
856
|
+
className="mb-12 text-center text-4xl font-bold text-gray-800"
|
|
1278
857
|
>
|
|
1279
858
|
Frequently Asked Questions
|
|
1280
|
-
</
|
|
1281
|
-
<
|
|
859
|
+
</h2>
|
|
860
|
+
<div
|
|
1282
861
|
data-id=""
|
|
1283
|
-
data-binding={[{ label: 'FAQ Items', property: '
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
property: 'innerText',
|
|
1360
|
-
},
|
|
1361
|
-
]}
|
|
1362
|
-
className={cn('text-lg font-semibold text-gray-800')}
|
|
1363
|
-
>
|
|
1364
|
-
Is it really free?
|
|
1365
|
-
</ui.Typography.Text>
|
|
1366
|
-
),
|
|
1367
|
-
children: (
|
|
1368
|
-
<ui.Typography.Paragraph
|
|
1369
|
-
data-id=""
|
|
1370
|
-
data-binding={[
|
|
1371
|
-
{
|
|
1372
|
-
label: 'Answer 3',
|
|
1373
|
-
type: 'richtext',
|
|
1374
|
-
},
|
|
1375
|
-
]}
|
|
1376
|
-
className={cn('text-gray-600')}
|
|
1377
|
-
>
|
|
1378
|
-
Yes, completely free! Live Editor is an open-source project
|
|
1379
|
-
with no hidden costs or premium tiers. All features are
|
|
1380
|
-
available to everyone.
|
|
1381
|
-
</ui.Typography.Paragraph>
|
|
1382
|
-
),
|
|
1383
|
-
},
|
|
1384
|
-
{
|
|
1385
|
-
key: '4',
|
|
1386
|
-
label: (
|
|
1387
|
-
<ui.Typography.Text
|
|
1388
|
-
data-id=""
|
|
1389
|
-
data-binding={[
|
|
1390
|
-
{
|
|
1391
|
-
label: 'Question 4',
|
|
1392
|
-
property: 'innerText',
|
|
1393
|
-
},
|
|
1394
|
-
]}
|
|
1395
|
-
className={cn('text-lg font-semibold text-gray-800')}
|
|
1396
|
-
>
|
|
1397
|
-
How can I contribute?
|
|
1398
|
-
</ui.Typography.Text>
|
|
1399
|
-
),
|
|
1400
|
-
children: (
|
|
1401
|
-
<ui.Typography.Paragraph
|
|
1402
|
-
data-id=""
|
|
1403
|
-
data-binding={[
|
|
1404
|
-
{
|
|
1405
|
-
label: 'Answer 4',
|
|
1406
|
-
type: 'richtext',
|
|
1407
|
-
},
|
|
1408
|
-
]}
|
|
1409
|
-
className={cn('text-gray-600')}
|
|
1410
|
-
>
|
|
1411
|
-
You can contribute by reporting bugs, suggesting features,
|
|
1412
|
-
sharing your projects, or contributing code. Check our
|
|
1413
|
-
GitHub repository for more details.
|
|
1414
|
-
</ui.Typography.Paragraph>
|
|
1415
|
-
),
|
|
1416
|
-
},
|
|
1417
|
-
]}
|
|
1418
|
-
/>
|
|
862
|
+
data-binding={[{ label: 'FAQ Items', property: 'children' }]}
|
|
863
|
+
className="divide-y divide-gray-200"
|
|
864
|
+
>
|
|
865
|
+
<details className="py-4">
|
|
866
|
+
<summary
|
|
867
|
+
data-id=""
|
|
868
|
+
data-binding={[{ label: 'Question 1', property: 'innerText' }]}
|
|
869
|
+
className="cursor-pointer text-lg font-semibold text-gray-800"
|
|
870
|
+
>
|
|
871
|
+
What is Live Editor?
|
|
872
|
+
</summary>
|
|
873
|
+
<p
|
|
874
|
+
data-id=""
|
|
875
|
+
data-binding={[{ label: 'Answer 1', type: 'richtext' }]}
|
|
876
|
+
className="mt-3 text-gray-600"
|
|
877
|
+
>
|
|
878
|
+
Live Editor is an open-source tool for building web
|
|
879
|
+
interfaces visually. It helps you learn web development by
|
|
880
|
+
providing instant feedback as you build components.
|
|
881
|
+
</p>
|
|
882
|
+
</details>
|
|
883
|
+
<details className="py-4">
|
|
884
|
+
<summary
|
|
885
|
+
data-id=""
|
|
886
|
+
data-binding={[{ label: 'Question 2', property: 'innerText' }]}
|
|
887
|
+
className="cursor-pointer text-lg font-semibold text-gray-800"
|
|
888
|
+
>
|
|
889
|
+
Do I need coding experience?
|
|
890
|
+
</summary>
|
|
891
|
+
<p
|
|
892
|
+
data-id=""
|
|
893
|
+
data-binding={[{ label: 'Answer 2', type: 'richtext' }]}
|
|
894
|
+
className="mt-3 text-gray-600"
|
|
895
|
+
>
|
|
896
|
+
No! Live Editor is designed for all skill levels. Beginners
|
|
897
|
+
can learn through visual editing, while experienced
|
|
898
|
+
developers can work directly with code.
|
|
899
|
+
</p>
|
|
900
|
+
</details>
|
|
901
|
+
<details className="py-4">
|
|
902
|
+
<summary
|
|
903
|
+
data-id=""
|
|
904
|
+
data-binding={[{ label: 'Question 3', property: 'innerText' }]}
|
|
905
|
+
className="cursor-pointer text-lg font-semibold text-gray-800"
|
|
906
|
+
>
|
|
907
|
+
Is it really free?
|
|
908
|
+
</summary>
|
|
909
|
+
<p
|
|
910
|
+
data-id=""
|
|
911
|
+
data-binding={[{ label: 'Answer 3', type: 'richtext' }]}
|
|
912
|
+
className="mt-3 text-gray-600"
|
|
913
|
+
>
|
|
914
|
+
Yes, completely free! Live Editor is an open-source project
|
|
915
|
+
with no hidden costs or premium tiers. All features are
|
|
916
|
+
available to everyone.
|
|
917
|
+
</p>
|
|
918
|
+
</details>
|
|
919
|
+
<details className="py-4">
|
|
920
|
+
<summary
|
|
921
|
+
data-id=""
|
|
922
|
+
data-binding={[{ label: 'Question 4', property: 'innerText' }]}
|
|
923
|
+
className="cursor-pointer text-lg font-semibold text-gray-800"
|
|
924
|
+
>
|
|
925
|
+
How can I contribute?
|
|
926
|
+
</summary>
|
|
927
|
+
<p
|
|
928
|
+
data-id=""
|
|
929
|
+
data-binding={[{ label: 'Answer 4', type: 'richtext' }]}
|
|
930
|
+
className="mt-3 text-gray-600"
|
|
931
|
+
>
|
|
932
|
+
You can contribute by reporting bugs, suggesting features,
|
|
933
|
+
sharing your projects, or contributing code. Check our
|
|
934
|
+
GitHub repository for more details.
|
|
935
|
+
</p>
|
|
936
|
+
</details>
|
|
937
|
+
</div>
|
|
1419
938
|
</div>
|
|
1420
939
|
</section>
|
|
1421
940
|
`
|
|
1422
941
|
}
|
|
1423
942
|
];
|
|
1424
943
|
//#endregion
|
|
944
|
+
//#region src/components/dnd/canvas/canvas.module.css
|
|
945
|
+
var canvas_module_default = {
|
|
946
|
+
"dropArea": "vaEhUG_dropArea",
|
|
947
|
+
"dropAreaOver": "vaEhUG_dropAreaOver",
|
|
948
|
+
"dropBottom": "vaEhUG_dropBottom",
|
|
949
|
+
"dropBottomOver": "vaEhUG_dropBottomOver",
|
|
950
|
+
"empty": "vaEhUG_empty",
|
|
951
|
+
"fill": "vaEhUG_fill",
|
|
952
|
+
"notice": "vaEhUG_notice",
|
|
953
|
+
"section": "vaEhUG_section",
|
|
954
|
+
"sectionDropTarget": "vaEhUG_sectionDropTarget",
|
|
955
|
+
"sectionSelected": "vaEhUG_sectionSelected",
|
|
956
|
+
"sectionShield": "vaEhUG_sectionShield",
|
|
957
|
+
"sectionToolbar": "vaEhUG_sectionToolbar",
|
|
958
|
+
"stale": "vaEhUG_stale"
|
|
959
|
+
};
|
|
960
|
+
//#endregion
|
|
961
|
+
//#region src/components/dnd/layout.module.css
|
|
962
|
+
var layout_module_default = {
|
|
963
|
+
"canvas": "_4QZ3lW_canvas",
|
|
964
|
+
"card": "_4QZ3lW_card",
|
|
965
|
+
"palette": "_4QZ3lW_palette",
|
|
966
|
+
"paletteButton": "_4QZ3lW_paletteButton",
|
|
967
|
+
"paletteItems": "_4QZ3lW_paletteItems",
|
|
968
|
+
"panel": "_4QZ3lW_panel",
|
|
969
|
+
"picker": "_4QZ3lW_picker",
|
|
970
|
+
"pickerDock": "_4QZ3lW_pickerDock",
|
|
971
|
+
"root": "_4QZ3lW_root"
|
|
972
|
+
};
|
|
973
|
+
//#endregion
|
|
1425
974
|
//#region src/components/dnd/canvas/canvas-notice.tsx
|
|
1426
|
-
const CanvasNotice = ({ title, detail }) => /* @__PURE__ */ jsxs(
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
children: [/* @__PURE__ */ jsx(Typography.Paragraph, { children: title }), /* @__PURE__ */ jsx(Typography.Text, { children: detail })]
|
|
975
|
+
const CanvasNotice = ({ title, detail }) => /* @__PURE__ */ jsxs("div", {
|
|
976
|
+
className: canvas_module_default.notice,
|
|
977
|
+
children: [/* @__PURE__ */ jsx("p", { children: title }), /* @__PURE__ */ jsx("span", { children: detail })]
|
|
1430
978
|
});
|
|
1431
979
|
//#endregion
|
|
1432
980
|
//#region src/components/dnd/palette/palette-drag.ts
|
|
@@ -1450,14 +998,11 @@ const Droppable = ({ children, className }) => {
|
|
|
1450
998
|
const messages = useLiveMessages();
|
|
1451
999
|
return /* @__PURE__ */ jsxs("div", {
|
|
1452
1000
|
ref: setNodeRef,
|
|
1453
|
-
className: cn(
|
|
1001
|
+
className: cn(canvas_module_default.dropArea, shouldHighlight && canvas_module_default.dropAreaOver, className),
|
|
1454
1002
|
children: [children, isPaletteSectionDragging && /* @__PURE__ */ jsx("div", {
|
|
1455
1003
|
ref: setBottomRef,
|
|
1456
|
-
className: cn(
|
|
1457
|
-
children:
|
|
1458
|
-
className: "text-sm text-gray-500",
|
|
1459
|
-
children: shouldHighlightBottom ? messages.canvas.dropHere : messages.canvas.dropAtBottom
|
|
1460
|
-
})
|
|
1004
|
+
className: cn(canvas_module_default.dropBottom, shouldHighlightBottom && canvas_module_default.dropBottomOver),
|
|
1005
|
+
children: shouldHighlightBottom ? messages.canvas.dropHere : messages.canvas.dropAtBottom
|
|
1461
1006
|
})]
|
|
1462
1007
|
});
|
|
1463
1008
|
};
|
|
@@ -1507,11 +1052,11 @@ const DraggableItem = ({ item, children }) => {
|
|
|
1507
1052
|
};
|
|
1508
1053
|
const DefaultDraggableItem = ({ item, onAdd, tapToAdd = false }) => /* @__PURE__ */ jsx(DraggableItem, {
|
|
1509
1054
|
item,
|
|
1510
|
-
children: ({ ref, dragProps, isDragging }) => /* @__PURE__ */ jsx(
|
|
1055
|
+
children: ({ ref, dragProps, isDragging }) => /* @__PURE__ */ jsx("div", {
|
|
1511
1056
|
ref,
|
|
1512
1057
|
style: { opacity: isDragging ? .5 : 1 },
|
|
1513
1058
|
...dragProps,
|
|
1514
|
-
className:
|
|
1059
|
+
className: layout_module_default.card,
|
|
1515
1060
|
onClick: tapToAdd && onAdd ? () => onAdd(item) : void 0,
|
|
1516
1061
|
onDoubleClick: onAdd ? () => onAdd(item) : void 0,
|
|
1517
1062
|
onKeyDown: (event) => {
|
|
@@ -1587,7 +1132,10 @@ const Renderer = ({ preview, sectionId = "", sectionName = "", sectionCode = pre
|
|
|
1587
1132
|
autoHeight: true,
|
|
1588
1133
|
children: (container) => /* @__PURE__ */ jsx("div", {
|
|
1589
1134
|
ref: wrapperRef,
|
|
1590
|
-
|
|
1135
|
+
style: {
|
|
1136
|
+
width: "100%",
|
|
1137
|
+
overflowX: "hidden"
|
|
1138
|
+
},
|
|
1591
1139
|
"data-editor-mode": true,
|
|
1592
1140
|
children: /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
1593
1141
|
resetKeys: [preview],
|
|
@@ -1603,7 +1151,7 @@ const Renderer = ({ preview, sectionId = "", sectionName = "", sectionCode = pre
|
|
|
1603
1151
|
title: messages.errors.rendering
|
|
1604
1152
|
})
|
|
1605
1153
|
}),
|
|
1606
|
-
children: renderProvider(/* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1154
|
+
children: renderProvider(/* @__PURE__ */ jsxs(Fragment, { children: [renderStableComponent(Component, preview, {
|
|
1607
1155
|
headers,
|
|
1608
1156
|
container
|
|
1609
1157
|
}), dynamicTailwind && dynamicCSS && /* @__PURE__ */ jsx("style", { children: dynamicCSS })] }))
|
|
@@ -1630,6 +1178,28 @@ const arePropsEqual = (prev, next) => {
|
|
|
1630
1178
|
};
|
|
1631
1179
|
var renderer_default = memo(Renderer, arePropsEqual);
|
|
1632
1180
|
//#endregion
|
|
1181
|
+
//#region src/components/dnd/button.module.css
|
|
1182
|
+
var button_module_default = {
|
|
1183
|
+
"button": "_49iObG_button",
|
|
1184
|
+
"circle": "_49iObG_circle",
|
|
1185
|
+
"danger": "_49iObG_danger",
|
|
1186
|
+
"iconOnly": "_49iObG_iconOnly",
|
|
1187
|
+
"outlined": "_49iObG_outlined",
|
|
1188
|
+
"primary": "_49iObG_primary",
|
|
1189
|
+
"small": "_49iObG_small",
|
|
1190
|
+
"solid": "_49iObG_solid",
|
|
1191
|
+
"success": "_49iObG_success",
|
|
1192
|
+
"text": "_49iObG_text"
|
|
1193
|
+
};
|
|
1194
|
+
//#endregion
|
|
1195
|
+
//#region src/components/dnd/button.tsx
|
|
1196
|
+
const Button = ({ variant = "outlined", tone = "neutral", size = "middle", shape = "default", icon, className, children, ...restProps }) => /* @__PURE__ */ jsxs("button", {
|
|
1197
|
+
type: "button",
|
|
1198
|
+
className: cn(button_module_default.button, button_module_default[variant], tone !== "neutral" && button_module_default[tone], size === "small" && button_module_default.small, shape === "circle" && button_module_default.circle, icon && !children && button_module_default.iconOnly, className),
|
|
1199
|
+
...restProps,
|
|
1200
|
+
children: [icon, children]
|
|
1201
|
+
});
|
|
1202
|
+
//#endregion
|
|
1633
1203
|
//#region src/components/dnd/canvas/section-handlers.ts
|
|
1634
1204
|
const SectionHandlersContext = createContext(null);
|
|
1635
1205
|
const useSectionHandlers = () => useContext(SectionHandlersContext);
|
|
@@ -1691,10 +1261,10 @@ const Sortable = ({ id, children, selected, onClick, onDelete, onCopy, onMoveUp,
|
|
|
1691
1261
|
...listeners,
|
|
1692
1262
|
onKeyDown,
|
|
1693
1263
|
onClick,
|
|
1694
|
-
className: cn(
|
|
1264
|
+
className: cn(canvas_module_default.section, selected && canvas_module_default.sectionSelected, isPaletteSectionOver && canvas_module_default.sectionDropTarget),
|
|
1695
1265
|
children: [
|
|
1696
1266
|
/* @__PURE__ */ jsx("div", {
|
|
1697
|
-
className:
|
|
1267
|
+
className: canvas_module_default.sectionShield,
|
|
1698
1268
|
onPointerMove: inspecting ? (e) => handlers?.onInspectMove(e.currentTarget.parentElement, e.currentTarget, e.clientX, e.clientY) : void 0,
|
|
1699
1269
|
onPointerLeave: inspecting ? handlers?.onInspectLeave : void 0,
|
|
1700
1270
|
onClick: inspecting ? (e) => {
|
|
@@ -1703,8 +1273,8 @@ const Sortable = ({ id, children, selected, onClick, onDelete, onCopy, onMoveUp,
|
|
|
1703
1273
|
} : void 0
|
|
1704
1274
|
}),
|
|
1705
1275
|
children,
|
|
1706
|
-
selected && /* @__PURE__ */ jsxs(
|
|
1707
|
-
className:
|
|
1276
|
+
selected && /* @__PURE__ */ jsxs("div", {
|
|
1277
|
+
className: canvas_module_default.sectionToolbar,
|
|
1708
1278
|
children: [
|
|
1709
1279
|
onMoveUp && /* @__PURE__ */ jsx(Button, {
|
|
1710
1280
|
icon: /* @__PURE__ */ jsx(ChevronUp, {}),
|
|
@@ -1724,7 +1294,7 @@ const Sortable = ({ id, children, selected, onClick, onDelete, onCopy, onMoveUp,
|
|
|
1724
1294
|
"aria-label": messages.section.duplicate
|
|
1725
1295
|
}),
|
|
1726
1296
|
/* @__PURE__ */ jsx(Button, {
|
|
1727
|
-
|
|
1297
|
+
tone: "danger",
|
|
1728
1298
|
icon: /* @__PURE__ */ jsx(Trash, {}),
|
|
1729
1299
|
onClick: press(() => onDelete?.(id)),
|
|
1730
1300
|
"aria-label": messages.section.delete
|
|
@@ -1762,9 +1332,51 @@ const Overlay = ({ sections, isForced, renderProps }) => {
|
|
|
1762
1332
|
return null;
|
|
1763
1333
|
};
|
|
1764
1334
|
//#endregion
|
|
1335
|
+
//#region src/components/dnd/toast.module.css
|
|
1336
|
+
var toast_module_default = {
|
|
1337
|
+
"description": "YlF_3q_description",
|
|
1338
|
+
"region": "YlF_3q_region",
|
|
1339
|
+
"title": "YlF_3q_title",
|
|
1340
|
+
"toast": "YlF_3q_toast"
|
|
1341
|
+
};
|
|
1342
|
+
//#endregion
|
|
1343
|
+
//#region src/components/dnd/toast.ts
|
|
1344
|
+
const TOAST_DURATION = 6e3;
|
|
1345
|
+
let region = null;
|
|
1346
|
+
const getRegion = () => {
|
|
1347
|
+
if (region?.isConnected) return region;
|
|
1348
|
+
region = document.createElement("div");
|
|
1349
|
+
region.className = toast_module_default.region;
|
|
1350
|
+
document.body.append(region);
|
|
1351
|
+
return region;
|
|
1352
|
+
};
|
|
1353
|
+
const showErrorToast = (title, description) => {
|
|
1354
|
+
if (typeof document === "undefined") return;
|
|
1355
|
+
const toast = document.createElement("div");
|
|
1356
|
+
toast.className = toast_module_default.toast;
|
|
1357
|
+
toast.setAttribute("role", "alert");
|
|
1358
|
+
const heading = document.createElement("div");
|
|
1359
|
+
heading.className = toast_module_default.title;
|
|
1360
|
+
heading.textContent = title;
|
|
1361
|
+
toast.append(heading);
|
|
1362
|
+
if (description) {
|
|
1363
|
+
const detail = document.createElement("div");
|
|
1364
|
+
detail.className = toast_module_default.description;
|
|
1365
|
+
detail.textContent = description;
|
|
1366
|
+
toast.append(detail);
|
|
1367
|
+
}
|
|
1368
|
+
const remove = () => {
|
|
1369
|
+
window.clearTimeout(timer);
|
|
1370
|
+
toast.remove();
|
|
1371
|
+
};
|
|
1372
|
+
const timer = window.setTimeout(remove, TOAST_DURATION);
|
|
1373
|
+
toast.addEventListener("click", remove);
|
|
1374
|
+
getRegion().append(toast);
|
|
1375
|
+
};
|
|
1376
|
+
//#endregion
|
|
1765
1377
|
//#region src/components/dnd/edit-options.ts
|
|
1766
1378
|
const toastEditError = (error) => {
|
|
1767
|
-
|
|
1379
|
+
showErrorToast(error.title, error.description);
|
|
1768
1380
|
};
|
|
1769
1381
|
const DndEditOptionsContext = createContext({ reportError: toastEditError });
|
|
1770
1382
|
const useDndEditOptions = () => useContext(DndEditOptionsContext);
|
|
@@ -1824,6 +1436,65 @@ const viewportRect = (element) => {
|
|
|
1824
1436
|
return new DOMRect(x, y, rect.width, rect.height);
|
|
1825
1437
|
};
|
|
1826
1438
|
//#endregion
|
|
1439
|
+
//#region src/components/dnd/drawer.module.css
|
|
1440
|
+
var drawer_module_default = {
|
|
1441
|
+
"body": "_ty1rG_body",
|
|
1442
|
+
"content": "_ty1rG_content",
|
|
1443
|
+
"drawer": "_ty1rG_drawer",
|
|
1444
|
+
"header": "_ty1rG_header",
|
|
1445
|
+
"slide-up": "_ty1rG_slide-up",
|
|
1446
|
+
"title": "_ty1rG_title"
|
|
1447
|
+
};
|
|
1448
|
+
//#endregion
|
|
1449
|
+
//#region src/components/dnd/drawer.tsx
|
|
1450
|
+
const Drawer = ({ open, title, closeLabel, onClose, children }) => {
|
|
1451
|
+
const titleId = useId();
|
|
1452
|
+
const dialogRef = useRef(null);
|
|
1453
|
+
useEffect(() => {
|
|
1454
|
+
const dialog = dialogRef.current;
|
|
1455
|
+
if (!dialog || !open) return;
|
|
1456
|
+
if (typeof dialog.showModal === "function") dialog.showModal();
|
|
1457
|
+
else dialog.setAttribute("open", "");
|
|
1458
|
+
return () => {
|
|
1459
|
+
if (typeof dialog.close === "function") dialog.close();
|
|
1460
|
+
else dialog.removeAttribute("open");
|
|
1461
|
+
};
|
|
1462
|
+
}, [open]);
|
|
1463
|
+
if (!open) return null;
|
|
1464
|
+
return /* @__PURE__ */ jsx("dialog", {
|
|
1465
|
+
ref: dialogRef,
|
|
1466
|
+
className: drawer_module_default.drawer,
|
|
1467
|
+
"aria-labelledby": titleId,
|
|
1468
|
+
onCancel: (e) => {
|
|
1469
|
+
e.preventDefault();
|
|
1470
|
+
onClose();
|
|
1471
|
+
},
|
|
1472
|
+
onClick: (e) => {
|
|
1473
|
+
if (e.target === e.currentTarget) onClose();
|
|
1474
|
+
},
|
|
1475
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
1476
|
+
className: drawer_module_default.content,
|
|
1477
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
1478
|
+
className: drawer_module_default.header,
|
|
1479
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
1480
|
+
id: titleId,
|
|
1481
|
+
className: drawer_module_default.title,
|
|
1482
|
+
children: title
|
|
1483
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
1484
|
+
variant: "text",
|
|
1485
|
+
size: "small",
|
|
1486
|
+
icon: /* @__PURE__ */ jsx(X, {}),
|
|
1487
|
+
"aria-label": closeLabel,
|
|
1488
|
+
onClick: onClose
|
|
1489
|
+
})]
|
|
1490
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
1491
|
+
className: drawer_module_default.body,
|
|
1492
|
+
children
|
|
1493
|
+
})]
|
|
1494
|
+
})
|
|
1495
|
+
});
|
|
1496
|
+
};
|
|
1497
|
+
//#endregion
|
|
1827
1498
|
//#region src/components/dnd/layout-context.ts
|
|
1828
1499
|
const DndRegionContext = createContext(null);
|
|
1829
1500
|
const useDndRegions = (subject) => {
|
|
@@ -1835,6 +1506,25 @@ const useDndPalette = () => useDndRegions("useDndPalette()").palette;
|
|
|
1835
1506
|
const useDndPanel = () => useDndRegions("useDndPanel()").panel;
|
|
1836
1507
|
const useDndLayout = () => useDndRegions("useDndLayout()");
|
|
1837
1508
|
//#endregion
|
|
1509
|
+
//#region src/components/dnd/panel/panel.module.css
|
|
1510
|
+
var panel_module_default = {
|
|
1511
|
+
"actions": "gbKovW_actions",
|
|
1512
|
+
"binding": "gbKovW_binding",
|
|
1513
|
+
"bindingLabel": "gbKovW_bindingLabel",
|
|
1514
|
+
"bindingProperty": "gbKovW_bindingProperty",
|
|
1515
|
+
"bindings": "gbKovW_bindings",
|
|
1516
|
+
"element": "gbKovW_element",
|
|
1517
|
+
"elementHeader": "gbKovW_elementHeader",
|
|
1518
|
+
"elementTag": "gbKovW_elementTag",
|
|
1519
|
+
"elementText": "gbKovW_elementText",
|
|
1520
|
+
"empty": "gbKovW_empty",
|
|
1521
|
+
"header": "gbKovW_header",
|
|
1522
|
+
"note": "gbKovW_note",
|
|
1523
|
+
"panel": "gbKovW_panel",
|
|
1524
|
+
"readOnly": "gbKovW_readOnly",
|
|
1525
|
+
"title": "gbKovW_title"
|
|
1526
|
+
};
|
|
1527
|
+
//#endregion
|
|
1838
1528
|
//#region src/components/dnd/panel/element-selection.ts
|
|
1839
1529
|
const ElementSelectionContext = createContext({ ids: /* @__PURE__ */ new Set() });
|
|
1840
1530
|
//#endregion
|
|
@@ -1924,9 +1614,40 @@ const withPanelCommit = (bindings, commit) => bindings.map((binding) => ({
|
|
|
1924
1614
|
})
|
|
1925
1615
|
}));
|
|
1926
1616
|
//#endregion
|
|
1617
|
+
//#region src/components/dnd/panel/structure.module.css
|
|
1618
|
+
var structure_module_default = {
|
|
1619
|
+
"card": "lH7pXW_card",
|
|
1620
|
+
"cardCompact": "lH7pXW_cardCompact",
|
|
1621
|
+
"children": "lH7pXW_children",
|
|
1622
|
+
"dragging": "lH7pXW_dragging",
|
|
1623
|
+
"element": "lH7pXW_element",
|
|
1624
|
+
"elementTag": "lH7pXW_elementTag",
|
|
1625
|
+
"handle": "lH7pXW_handle",
|
|
1626
|
+
"heading": "lH7pXW_heading",
|
|
1627
|
+
"indented": "lH7pXW_indented",
|
|
1628
|
+
"items": "lH7pXW_items",
|
|
1629
|
+
"label": "lH7pXW_label",
|
|
1630
|
+
"muted": "lH7pXW_muted",
|
|
1631
|
+
"nested": "lH7pXW_nested",
|
|
1632
|
+
"notice": "lH7pXW_notice",
|
|
1633
|
+
"noticeDanger": "lH7pXW_noticeDanger",
|
|
1634
|
+
"noticeWarning": "lH7pXW_noticeWarning",
|
|
1635
|
+
"propertyLabel": "lH7pXW_propertyLabel",
|
|
1636
|
+
"row": "lH7pXW_row",
|
|
1637
|
+
"rowStart": "lH7pXW_rowStart",
|
|
1638
|
+
"stack": "lH7pXW_stack",
|
|
1639
|
+
"stackLoose": "lH7pXW_stackLoose",
|
|
1640
|
+
"stackTight": "lH7pXW_stackTight",
|
|
1641
|
+
"toggle": "lH7pXW_toggle",
|
|
1642
|
+
"valueType": "lH7pXW_valueType"
|
|
1643
|
+
};
|
|
1644
|
+
//#endregion
|
|
1645
|
+
//#region src/components/dnd/panel/row-controls.module.css
|
|
1646
|
+
var row_controls_module_default = { "controls": "q9alSq_controls" };
|
|
1647
|
+
//#endregion
|
|
1927
1648
|
//#region src/components/dnd/panel/row-controls.tsx
|
|
1928
1649
|
const RowControls = ({ index, count, labels, disabled = false, deleteDisabled = false, onMove, onDelete }) => /* @__PURE__ */ jsxs("div", {
|
|
1929
|
-
className:
|
|
1650
|
+
className: row_controls_module_default.controls,
|
|
1930
1651
|
children: [
|
|
1931
1652
|
/* @__PURE__ */ jsx(Button, {
|
|
1932
1653
|
size: "small",
|
|
@@ -1943,7 +1664,7 @@ const RowControls = ({ index, count, labels, disabled = false, deleteDisabled =
|
|
|
1943
1664
|
onClick: () => onMove(index + 1)
|
|
1944
1665
|
}),
|
|
1945
1666
|
/* @__PURE__ */ jsx(Button, {
|
|
1946
|
-
|
|
1667
|
+
tone: "danger",
|
|
1947
1668
|
size: "small",
|
|
1948
1669
|
icon: /* @__PURE__ */ jsx(X, {}),
|
|
1949
1670
|
"aria-label": labels.delete,
|
|
@@ -1954,17 +1675,26 @@ const RowControls = ({ index, count, labels, disabled = false, deleteDisabled =
|
|
|
1954
1675
|
]
|
|
1955
1676
|
});
|
|
1956
1677
|
//#endregion
|
|
1678
|
+
//#region src/components/dnd/panel/selection/selection.module.css
|
|
1679
|
+
var selection_module_default = {
|
|
1680
|
+
"actions": "ZTKonW_actions",
|
|
1681
|
+
"bar": "ZTKonW_bar",
|
|
1682
|
+
"checkbox": "ZTKonW_checkbox",
|
|
1683
|
+
"count": "ZTKonW_count",
|
|
1684
|
+
"selectAll": "ZTKonW_selectAll"
|
|
1685
|
+
};
|
|
1686
|
+
//#endregion
|
|
1957
1687
|
//#region src/components/dnd/panel/selection/bulk-actions-bar.tsx
|
|
1958
1688
|
const BulkActionsBar = ({ count, disabled = false, duplicateDisabled = false, deleteDisabled = false, onDuplicate, onMoveUp, onMoveDown, onDelete, onClear }) => {
|
|
1959
1689
|
const messages = useLiveMessages();
|
|
1960
1690
|
if (count === 0) return null;
|
|
1961
1691
|
return /* @__PURE__ */ jsxs("div", {
|
|
1962
|
-
className:
|
|
1692
|
+
className: selection_module_default.bar,
|
|
1963
1693
|
children: [/* @__PURE__ */ jsx("div", {
|
|
1964
|
-
className:
|
|
1694
|
+
className: selection_module_default.count,
|
|
1965
1695
|
children: messages.selection.count(count)
|
|
1966
1696
|
}), /* @__PURE__ */ jsxs("div", {
|
|
1967
|
-
className:
|
|
1697
|
+
className: selection_module_default.actions,
|
|
1968
1698
|
children: [
|
|
1969
1699
|
/* @__PURE__ */ jsx(Button, {
|
|
1970
1700
|
size: "small",
|
|
@@ -1988,7 +1718,7 @@ const BulkActionsBar = ({ count, disabled = false, duplicateDisabled = false, de
|
|
|
1988
1718
|
onClick: onMoveDown
|
|
1989
1719
|
}),
|
|
1990
1720
|
/* @__PURE__ */ jsx(Button, {
|
|
1991
|
-
|
|
1721
|
+
tone: "danger",
|
|
1992
1722
|
size: "small",
|
|
1993
1723
|
icon: /* @__PURE__ */ jsx(X, {}),
|
|
1994
1724
|
title: messages.selection.delete,
|
|
@@ -2008,27 +1738,33 @@ const BulkActionsBar = ({ count, disabled = false, duplicateDisabled = false, de
|
|
|
2008
1738
|
//#region src/components/dnd/panel/selection/select-all-checkbox.tsx
|
|
2009
1739
|
const SelectAllCheckbox = ({ total, selected, disabled = false, onSelectAll, onClear }) => {
|
|
2010
1740
|
const messages = useLiveMessages();
|
|
1741
|
+
const inputRef = useRef(null);
|
|
2011
1742
|
const isAllSelected = total > 0 && selected >= total;
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
children:
|
|
1743
|
+
const isIndeterminate = selected > 0 && !isAllSelected;
|
|
1744
|
+
useEffect(() => {
|
|
1745
|
+
if (inputRef.current) inputRef.current.indeterminate = isIndeterminate;
|
|
1746
|
+
}, [isIndeterminate]);
|
|
1747
|
+
return /* @__PURE__ */ jsxs("label", {
|
|
1748
|
+
className: selection_module_default.selectAll,
|
|
1749
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
1750
|
+
ref: inputRef,
|
|
1751
|
+
type: "checkbox",
|
|
1752
|
+
className: selection_module_default.checkbox,
|
|
1753
|
+
checked: isAllSelected,
|
|
1754
|
+
disabled,
|
|
1755
|
+
onChange: () => isAllSelected ? onClear() : onSelectAll()
|
|
1756
|
+
}), messages.selection.selectAll]
|
|
2019
1757
|
});
|
|
2020
1758
|
};
|
|
2021
1759
|
//#endregion
|
|
2022
1760
|
//#region src/components/dnd/panel/selection/selection-checkbox.tsx
|
|
2023
|
-
const SelectionCheckbox = ({ checked, disabled = false, onToggle }) => /* @__PURE__ */ jsx("
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
disabled
|
|
2031
|
-
})
|
|
1761
|
+
const SelectionCheckbox = ({ checked, disabled = false, onToggle }) => /* @__PURE__ */ jsx("input", {
|
|
1762
|
+
type: "checkbox",
|
|
1763
|
+
className: selection_module_default.checkbox,
|
|
1764
|
+
checked,
|
|
1765
|
+
disabled,
|
|
1766
|
+
readOnly: true,
|
|
1767
|
+
onClick: (e) => onToggle(e.shiftKey)
|
|
2032
1768
|
});
|
|
2033
1769
|
//#endregion
|
|
2034
1770
|
//#region src/components/dnd/panel/selection/use-structural-selection.ts
|
|
@@ -2140,16 +1876,16 @@ const Children$1 = ({ value, onChange, onNodeChange }) => {
|
|
|
2140
1876
|
return map;
|
|
2141
1877
|
}, [items]);
|
|
2142
1878
|
return /* @__PURE__ */ jsxs("div", {
|
|
2143
|
-
className:
|
|
1879
|
+
className: cn(structure_module_default.children, structure_module_default.stackLoose),
|
|
2144
1880
|
children: [
|
|
2145
1881
|
/* @__PURE__ */ jsxs("div", {
|
|
2146
|
-
className:
|
|
1882
|
+
className: structure_module_default.row,
|
|
2147
1883
|
children: [/* @__PURE__ */ jsx("div", {
|
|
2148
|
-
className:
|
|
1884
|
+
className: structure_module_default.heading,
|
|
2149
1885
|
children: messages.children.heading(items.length)
|
|
2150
1886
|
}), /* @__PURE__ */ jsx(Button, {
|
|
2151
1887
|
size: "small",
|
|
2152
|
-
|
|
1888
|
+
tone: "success",
|
|
2153
1889
|
icon: /* @__PURE__ */ jsx(Plus, {}),
|
|
2154
1890
|
onClick: actions.add,
|
|
2155
1891
|
children: messages.children.add
|
|
@@ -2170,17 +1906,17 @@ const Children$1 = ({ value, onChange, onNodeChange }) => {
|
|
|
2170
1906
|
onClear: selection.clear
|
|
2171
1907
|
}),
|
|
2172
1908
|
items.map((item, itemIndex) => /* @__PURE__ */ jsxs("div", {
|
|
2173
|
-
className:
|
|
1909
|
+
className: structure_module_default.card,
|
|
2174
1910
|
children: [
|
|
2175
1911
|
/* @__PURE__ */ jsxs("div", {
|
|
2176
|
-
className:
|
|
1912
|
+
className: structure_module_default.row,
|
|
2177
1913
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
2178
|
-
className:
|
|
1914
|
+
className: structure_module_default.rowStart,
|
|
2179
1915
|
children: [/* @__PURE__ */ jsx(SelectionCheckbox, {
|
|
2180
1916
|
checked: selection.isSelected(itemIndex),
|
|
2181
1917
|
onToggle: (shiftKey) => selection.toggle(itemIndex, shiftKey)
|
|
2182
1918
|
}), /* @__PURE__ */ jsx("div", {
|
|
2183
|
-
className:
|
|
1919
|
+
className: structure_module_default.label,
|
|
2184
1920
|
children: messages.children.child(itemIndex + 1, item.tagName || "fragment")
|
|
2185
1921
|
})]
|
|
2186
1922
|
}), /* @__PURE__ */ jsx(RowControls, {
|
|
@@ -2192,17 +1928,17 @@ const Children$1 = ({ value, onChange, onNodeChange }) => {
|
|
|
2192
1928
|
})]
|
|
2193
1929
|
}),
|
|
2194
1930
|
editableChildrenMap.has(itemIndex) && /* @__PURE__ */ jsxs("div", {
|
|
2195
|
-
className:
|
|
1931
|
+
className: structure_module_default.stack,
|
|
2196
1932
|
children: [/* @__PURE__ */ jsx("div", {
|
|
2197
|
-
className:
|
|
1933
|
+
className: structure_module_default.label,
|
|
2198
1934
|
children: messages.children.editableBindings
|
|
2199
1935
|
}), editableChildrenMap.get(itemIndex).map((editableNode, idx) => {
|
|
2200
1936
|
const nodeId = editableNode.dataAttributes.find((a) => a.name === "data-id")?.value;
|
|
2201
1937
|
return /* @__PURE__ */ jsx(ElementFields, {
|
|
2202
1938
|
id: nodeId ?? void 0,
|
|
2203
|
-
className:
|
|
1939
|
+
className: structure_module_default.element,
|
|
2204
1940
|
header: /* @__PURE__ */ jsx("div", {
|
|
2205
|
-
className:
|
|
1941
|
+
className: structure_module_default.elementTag,
|
|
2206
1942
|
children: editableNode.tagName
|
|
2207
1943
|
}),
|
|
2208
1944
|
bindings: bindingsOf(editableNode, onNodeChange),
|
|
@@ -2211,12 +1947,12 @@ const Children$1 = ({ value, onChange, onNodeChange }) => {
|
|
|
2211
1947
|
})]
|
|
2212
1948
|
}),
|
|
2213
1949
|
!!item.children && !editableChildrenMap.has(itemIndex) && /* @__PURE__ */ jsxs("div", {
|
|
2214
|
-
className:
|
|
1950
|
+
className: structure_module_default.stackTight,
|
|
2215
1951
|
children: [/* @__PURE__ */ jsx("div", {
|
|
2216
|
-
className:
|
|
1952
|
+
className: structure_module_default.label,
|
|
2217
1953
|
children: messages.children.childNodes
|
|
2218
1954
|
}), item.children.map((node, nodeIndex) => /* @__PURE__ */ jsx(ElementFields, {
|
|
2219
|
-
className:
|
|
1955
|
+
className: cn(structure_module_default.element, structure_module_default.indented),
|
|
2220
1956
|
bindings: bindingsOf(node, onNodeChange),
|
|
2221
1957
|
onNodeChange
|
|
2222
1958
|
}, `node-${itemIndex}-${nodeIndex}`))]
|
|
@@ -2227,14 +1963,18 @@ const Children$1 = ({ value, onChange, onNodeChange }) => {
|
|
|
2227
1963
|
});
|
|
2228
1964
|
};
|
|
2229
1965
|
//#endregion
|
|
2230
|
-
//#region src/components/dnd/panel/fields/color-
|
|
1966
|
+
//#region src/components/dnd/panel/fields/color-field.tsx
|
|
2231
1967
|
const COLOR_COMMIT_DELAY = 75;
|
|
2232
1968
|
const normalizeToHex = (value) => {
|
|
2233
1969
|
const trimmed = value.trim();
|
|
2234
|
-
if (/^#
|
|
1970
|
+
if (/^#[0-9A-Fa-f]{6}$/.test(trimmed)) return trimmed;
|
|
1971
|
+
if (/^#[0-9A-Fa-f]{3}$/.test(trimmed)) {
|
|
1972
|
+
const [, r, g, b] = trimmed;
|
|
1973
|
+
return `#${r}${r}${g}${g}${b}${b}`;
|
|
1974
|
+
}
|
|
2235
1975
|
return "#000000";
|
|
2236
1976
|
};
|
|
2237
|
-
const
|
|
1977
|
+
const ColorField = ({ value: source, onChange, ...controlProps }) => {
|
|
2238
1978
|
const value = normalizeToHex(source);
|
|
2239
1979
|
const [liveValue, setLiveValue] = useState(value);
|
|
2240
1980
|
const [prevValue, setPrevValue] = useState(value);
|
|
@@ -2255,66 +1995,25 @@ const ColorPickerField = ({ value: source, onChange, label }) => {
|
|
|
2255
1995
|
delay: COLOR_COMMIT_DELAY,
|
|
2256
1996
|
autoInvoke: false
|
|
2257
1997
|
});
|
|
2258
|
-
return /* @__PURE__ */
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
1998
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
1999
|
+
className: fields_module_default.color,
|
|
2000
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
2001
|
+
...controlProps,
|
|
2002
|
+
type: "color",
|
|
2003
|
+
value: liveValue,
|
|
2004
|
+
className: cn(fields_module_default.control, fields_module_default.colorSwatch),
|
|
2005
|
+
onChange: (e) => {
|
|
2006
|
+
setLiveValue(e.target.value);
|
|
2007
|
+
debouncedCommit();
|
|
2008
|
+
},
|
|
2009
|
+
onBlur: () => commit(liveValue)
|
|
2010
|
+
}), /* @__PURE__ */ jsx("code", {
|
|
2011
|
+
className: fields_module_default.colorSource,
|
|
2012
|
+
children: source
|
|
2013
|
+
})]
|
|
2269
2014
|
});
|
|
2270
2015
|
};
|
|
2271
2016
|
//#endregion
|
|
2272
|
-
//#region src/components/dnd/panel/fields/field-ids.ts
|
|
2273
|
-
const FieldIdsContext = createContext(null);
|
|
2274
|
-
const useFieldIds = () => {
|
|
2275
|
-
const labelledId = useContext(FieldIdsContext);
|
|
2276
|
-
const fallbackId = useId();
|
|
2277
|
-
const controlId = labelledId ?? fallbackId;
|
|
2278
|
-
return {
|
|
2279
|
-
controlId,
|
|
2280
|
-
errorId: `${controlId}-error`,
|
|
2281
|
-
isLabelled: labelledId !== null
|
|
2282
|
-
};
|
|
2283
|
-
};
|
|
2284
|
-
const LABELABLE_KINDS = /* @__PURE__ */ new Set([
|
|
2285
|
-
"text",
|
|
2286
|
-
"number",
|
|
2287
|
-
"url",
|
|
2288
|
-
"email",
|
|
2289
|
-
"tel",
|
|
2290
|
-
"time"
|
|
2291
|
-
]);
|
|
2292
|
-
//#endregion
|
|
2293
|
-
//#region src/components/dnd/panel/fields/field-kind.ts
|
|
2294
|
-
const isColorProperty = (property) => property.toLowerCase().includes("color");
|
|
2295
|
-
const getFieldKind = (binding) => {
|
|
2296
|
-
const { property, type, value } = binding;
|
|
2297
|
-
if (binding.canEditValue === false) return "readonly";
|
|
2298
|
-
if (property === "items" || property === "data" || type === "array") return "items";
|
|
2299
|
-
if (type === "richtext") return "richtext";
|
|
2300
|
-
if (property === BINDING_PROP.INNER_HTML) return "html";
|
|
2301
|
-
if (type === "jsx") return "jsx";
|
|
2302
|
-
if (property === "children" && Array.isArray(value)) return "children";
|
|
2303
|
-
if (typeof value === "object" && value !== null && !Array.isArray(value)) return "object";
|
|
2304
|
-
if (type === "boolean" || typeof value === "boolean") return "boolean";
|
|
2305
|
-
if (binding.options && Array.isArray(binding.options)) return "select";
|
|
2306
|
-
if (type === "color" || isColorProperty(property)) return "color";
|
|
2307
|
-
if (type === "date") return "date";
|
|
2308
|
-
if (type === "time") return "time";
|
|
2309
|
-
if (type === "datetime") return "datetime";
|
|
2310
|
-
if (type === "url") return "url";
|
|
2311
|
-
if (type === "email") return "email";
|
|
2312
|
-
if (type === "tel") return "tel";
|
|
2313
|
-
if (type === "number" || typeof value === "number") return "number";
|
|
2314
|
-
return "text";
|
|
2315
|
-
};
|
|
2316
|
-
const isStructuralFieldKind = (kind) => kind === "items" || kind === "children";
|
|
2317
|
-
//#endregion
|
|
2318
2017
|
//#region src/components/dnd/panel/fields/jsx-editor-field.tsx
|
|
2319
2018
|
const JSXEditorField = ({ value, isHTML, onSave }) => {
|
|
2320
2019
|
const selectionRef = useRef(null);
|
|
@@ -2350,10 +2049,15 @@ const JSXEditorField = ({ value, isHTML, onSave }) => {
|
|
|
2350
2049
|
//#region src/components/dnd/panel/fields/labeled-field.tsx
|
|
2351
2050
|
const LabeledField = ({ binding, label, labelClassName, children }) => {
|
|
2352
2051
|
const controlId = useId();
|
|
2052
|
+
const labelId = `${controlId}-label`;
|
|
2353
2053
|
const isLabelable = LABELABLE_KINDS.has(getFieldKind(binding));
|
|
2354
2054
|
return /* @__PURE__ */ jsxs(FieldIdsContext.Provider, {
|
|
2355
|
-
value:
|
|
2055
|
+
value: {
|
|
2056
|
+
controlId,
|
|
2057
|
+
labelId
|
|
2058
|
+
},
|
|
2356
2059
|
children: [/* @__PURE__ */ jsx("label", {
|
|
2060
|
+
id: labelId,
|
|
2357
2061
|
htmlFor: isLabelable ? controlId : void 0,
|
|
2358
2062
|
className: labelClassName,
|
|
2359
2063
|
children: label
|
|
@@ -2395,7 +2099,7 @@ const SortableItems = ({ items, disabled, onMove, children }) => {
|
|
|
2395
2099
|
strategy: verticalListSortingStrategy,
|
|
2396
2100
|
disabled,
|
|
2397
2101
|
children: /* @__PURE__ */ jsx("div", {
|
|
2398
|
-
className:
|
|
2102
|
+
className: structure_module_default.stackLoose,
|
|
2399
2103
|
children: items.map(children)
|
|
2400
2104
|
})
|
|
2401
2105
|
})
|
|
@@ -2413,11 +2117,11 @@ const ItemCard = ({ id, title, disabled, expanded, onToggle, checkbox, controls,
|
|
|
2413
2117
|
transform: CSS$1.Translate.toString(transform),
|
|
2414
2118
|
transition
|
|
2415
2119
|
},
|
|
2416
|
-
className: cn(className, isDragging &&
|
|
2120
|
+
className: cn(className, isDragging && structure_module_default.dragging),
|
|
2417
2121
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
2418
|
-
className:
|
|
2122
|
+
className: structure_module_default.row,
|
|
2419
2123
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
2420
|
-
className:
|
|
2124
|
+
className: structure_module_default.rowStart,
|
|
2421
2125
|
children: [
|
|
2422
2126
|
/* @__PURE__ */ jsx("button", {
|
|
2423
2127
|
type: "button",
|
|
@@ -2426,7 +2130,7 @@ const ItemCard = ({ id, title, disabled, expanded, onToggle, checkbox, controls,
|
|
|
2426
2130
|
...listeners,
|
|
2427
2131
|
"aria-label": messages.items.reorder(title),
|
|
2428
2132
|
disabled,
|
|
2429
|
-
className:
|
|
2133
|
+
className: structure_module_default.handle,
|
|
2430
2134
|
children: /* @__PURE__ */ jsx(GripVertical, { size: 14 })
|
|
2431
2135
|
}),
|
|
2432
2136
|
checkbox,
|
|
@@ -2434,7 +2138,7 @@ const ItemCard = ({ id, title, disabled, expanded, onToggle, checkbox, controls,
|
|
|
2434
2138
|
type: "button",
|
|
2435
2139
|
"aria-expanded": expanded,
|
|
2436
2140
|
onClick: onToggle,
|
|
2437
|
-
className:
|
|
2141
|
+
className: structure_module_default.toggle,
|
|
2438
2142
|
children: [expanded ? /* @__PURE__ */ jsx(ChevronDown, { size: 14 }) : /* @__PURE__ */ jsx(ChevronRight, { size: 14 }), /* @__PURE__ */ jsx("span", { children: title })]
|
|
2439
2143
|
})
|
|
2440
2144
|
]
|
|
@@ -3024,9 +2728,9 @@ const useDndItems = (value, { render, onChange, onNodeChange, minItems, maxItems
|
|
|
3024
2728
|
//#region src/components/dnd/panel/items/items.tsx
|
|
3025
2729
|
const NestedGroup = ({ group, onNodeChange }) => {
|
|
3026
2730
|
if (group.fallback) return /* @__PURE__ */ jsxs("div", {
|
|
3027
|
-
className:
|
|
2731
|
+
className: structure_module_default.stack,
|
|
3028
2732
|
children: [/* @__PURE__ */ jsx("div", {
|
|
3029
|
-
className:
|
|
2733
|
+
className: structure_module_default.label,
|
|
3030
2734
|
children: group.property
|
|
3031
2735
|
}), /* @__PURE__ */ jsx(Field, {
|
|
3032
2736
|
binding: group.fallback,
|
|
@@ -3034,9 +2738,9 @@ const NestedGroup = ({ group, onNodeChange }) => {
|
|
|
3034
2738
|
})]
|
|
3035
2739
|
});
|
|
3036
2740
|
return /* @__PURE__ */ jsxs("div", {
|
|
3037
|
-
className:
|
|
2741
|
+
className: structure_module_default.stack,
|
|
3038
2742
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
3039
|
-
className:
|
|
2743
|
+
className: structure_module_default.label,
|
|
3040
2744
|
children: [
|
|
3041
2745
|
group.property,
|
|
3042
2746
|
" Bindings (",
|
|
@@ -3045,9 +2749,9 @@ const NestedGroup = ({ group, onNodeChange }) => {
|
|
|
3045
2749
|
]
|
|
3046
2750
|
}), group.elements.map((element) => /* @__PURE__ */ jsx(ElementFields, {
|
|
3047
2751
|
id: element.id,
|
|
3048
|
-
className:
|
|
2752
|
+
className: structure_module_default.element,
|
|
3049
2753
|
header: /* @__PURE__ */ jsxs("div", {
|
|
3050
|
-
className:
|
|
2754
|
+
className: structure_module_default.elementTag,
|
|
3051
2755
|
children: [
|
|
3052
2756
|
"<",
|
|
3053
2757
|
element.tagName,
|
|
@@ -3069,31 +2773,31 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3069
2773
|
maxItems
|
|
3070
2774
|
});
|
|
3071
2775
|
const header = /* @__PURE__ */ jsxs("div", {
|
|
3072
|
-
className:
|
|
2776
|
+
className: structure_module_default.row,
|
|
3073
2777
|
children: [/* @__PURE__ */ jsx("div", {
|
|
3074
|
-
className:
|
|
2778
|
+
className: structure_module_default.heading,
|
|
3075
2779
|
children: messages.items.heading(items.length)
|
|
3076
2780
|
}), items.length > 0 && canEditStructure && /* @__PURE__ */ jsx(Button, {
|
|
3077
2781
|
size: "small",
|
|
3078
2782
|
icon: /* @__PURE__ */ jsx(Plus, {}),
|
|
3079
2783
|
variant: "solid",
|
|
3080
|
-
|
|
2784
|
+
tone: "success",
|
|
3081
2785
|
disabled: !canAddItems(),
|
|
3082
2786
|
onClick: actions.add,
|
|
3083
2787
|
children: messages.items.add
|
|
3084
2788
|
})]
|
|
3085
2789
|
});
|
|
3086
2790
|
if (parseError) return /* @__PURE__ */ jsxs("div", {
|
|
3087
|
-
className:
|
|
2791
|
+
className: cn(structure_module_default.items, structure_module_default.stackLoose),
|
|
3088
2792
|
children: [header, /* @__PURE__ */ jsx("div", {
|
|
3089
|
-
className:
|
|
2793
|
+
className: structure_module_default.noticeDanger,
|
|
3090
2794
|
children: messages.items.unreadable
|
|
3091
2795
|
})]
|
|
3092
2796
|
});
|
|
3093
2797
|
if (items.length === 0) return /* @__PURE__ */ jsxs("div", {
|
|
3094
|
-
className:
|
|
2798
|
+
className: cn(structure_module_default.items, structure_module_default.stackLoose),
|
|
3095
2799
|
children: [header, /* @__PURE__ */ jsx("div", {
|
|
3096
|
-
className:
|
|
2800
|
+
className: structure_module_default.notice,
|
|
3097
2801
|
children: messages.items.empty
|
|
3098
2802
|
})]
|
|
3099
2803
|
});
|
|
@@ -3109,12 +2813,12 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3109
2813
|
onClear: selection.clear
|
|
3110
2814
|
});
|
|
3111
2815
|
const objectBody = (item) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
3112
|
-
className:
|
|
2816
|
+
className: structure_module_default.stack,
|
|
3113
2817
|
children: item.properties.map((binding) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
|
|
3114
|
-
className:
|
|
2818
|
+
className: structure_module_default.stack,
|
|
3115
2819
|
children: /* @__PURE__ */ jsx(LabeledField, {
|
|
3116
2820
|
binding,
|
|
3117
|
-
labelClassName:
|
|
2821
|
+
labelClassName: structure_module_default.propertyLabel,
|
|
3118
2822
|
label: binding.label,
|
|
3119
2823
|
children: /* @__PURE__ */ jsx(Field, {
|
|
3120
2824
|
binding,
|
|
@@ -3122,7 +2826,7 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3122
2826
|
})
|
|
3123
2827
|
})
|
|
3124
2828
|
}), /* @__PURE__ */ jsxs("span", {
|
|
3125
|
-
className:
|
|
2829
|
+
className: structure_module_default.valueType,
|
|
3126
2830
|
children: [
|
|
3127
2831
|
"(",
|
|
3128
2832
|
String(binding.meta?.valueType),
|
|
@@ -3130,12 +2834,12 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3130
2834
|
]
|
|
3131
2835
|
})] }, `${item.id}-${binding.property}-${binding.label}`))
|
|
3132
2836
|
}), /* @__PURE__ */ jsx("div", {
|
|
3133
|
-
className:
|
|
2837
|
+
className: structure_module_default.nested,
|
|
3134
2838
|
children: item.nested.length ? item.nested.map((group) => /* @__PURE__ */ jsx(NestedGroup, {
|
|
3135
2839
|
group,
|
|
3136
2840
|
onNodeChange: onChildChange
|
|
3137
2841
|
}, group.property)) : /* @__PURE__ */ jsxs("div", {
|
|
3138
|
-
className:
|
|
2842
|
+
className: structure_module_default.muted,
|
|
3139
2843
|
children: [
|
|
3140
2844
|
/* @__PURE__ */ jsx("span", {
|
|
3141
2845
|
"aria-hidden": "true",
|
|
@@ -3148,11 +2852,11 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3148
2852
|
})] });
|
|
3149
2853
|
const allExpanded = expansion.expandedIds.length === items.length;
|
|
3150
2854
|
return /* @__PURE__ */ jsxs("div", {
|
|
3151
|
-
className:
|
|
2855
|
+
className: cn(structure_module_default.items, structure_module_default.stackLoose),
|
|
3152
2856
|
children: [
|
|
3153
2857
|
header,
|
|
3154
2858
|
/* @__PURE__ */ jsxs("div", {
|
|
3155
|
-
className:
|
|
2859
|
+
className: structure_module_default.row,
|
|
3156
2860
|
children: [/* @__PURE__ */ jsx(SelectAllCheckbox, {
|
|
3157
2861
|
total: items.length,
|
|
3158
2862
|
selected: selection.selected.size,
|
|
@@ -3168,7 +2872,7 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3168
2872
|
}),
|
|
3169
2873
|
bulkBar,
|
|
3170
2874
|
!canEditStructure && /* @__PURE__ */ jsx("div", {
|
|
3171
|
-
className:
|
|
2875
|
+
className: structure_module_default.noticeWarning,
|
|
3172
2876
|
children: messages.items.structureLocked
|
|
3173
2877
|
}),
|
|
3174
2878
|
/* @__PURE__ */ jsx(SortableItems, {
|
|
@@ -3195,7 +2899,7 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3195
2899
|
onMove: (toIndex) => actions.move(item.elementIndex, toIndex),
|
|
3196
2900
|
onDelete: () => actions.remove(item.elementIndex)
|
|
3197
2901
|
}),
|
|
3198
|
-
className: kind === "primitive"
|
|
2902
|
+
className: cn(structure_module_default.card, kind === "primitive" && structure_module_default.cardCompact),
|
|
3199
2903
|
children: kind === "primitive" ? /* @__PURE__ */ jsx(Field, {
|
|
3200
2904
|
binding: item.value,
|
|
3201
2905
|
onNodeChange: onChildChange
|
|
@@ -3207,74 +2911,22 @@ const Items = ({ value, render, minItems, maxItems, onChange, onChildChange }) =
|
|
|
3207
2911
|
};
|
|
3208
2912
|
//#endregion
|
|
3209
2913
|
//#region src/components/dnd/panel/field.tsx
|
|
3210
|
-
const parseDateValue = (value) => {
|
|
3211
|
-
const match = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2}))?$/.exec(value.trim());
|
|
3212
|
-
if (!match) return;
|
|
3213
|
-
const [, year, month, day, hours = "0", minutes = "0"] = match;
|
|
3214
|
-
const date = new Date(Number(year), Number(month) - 1, Number(day), Number(hours), Number(minutes));
|
|
3215
|
-
return Number.isNaN(date.getTime()) ? void 0 : date;
|
|
3216
|
-
};
|
|
3217
|
-
const pad = (value) => String(value).padStart(2, "0");
|
|
3218
|
-
const formatDateValue = (date, withTime = false) => {
|
|
3219
|
-
const day = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
3220
|
-
return withTime ? `${day}T${pad(date.getHours())}:${pad(date.getMinutes())}` : day;
|
|
3221
|
-
};
|
|
3222
|
-
const RICHTEXT_TOOLBAR = [
|
|
3223
|
-
"bold",
|
|
3224
|
-
"italic",
|
|
3225
|
-
"underline",
|
|
3226
|
-
"bulletList",
|
|
3227
|
-
"orderedList",
|
|
3228
|
-
"link"
|
|
3229
|
-
];
|
|
3230
|
-
const FieldError = ({ id, message }) => message ? /* @__PURE__ */ jsx("p", {
|
|
3231
|
-
id,
|
|
3232
|
-
role: "alert",
|
|
3233
|
-
className: "mt-1 mb-0 text-xs text-red-500",
|
|
3234
|
-
children: message
|
|
3235
|
-
}) : null;
|
|
3236
2914
|
const BuiltinField = ({ binding, onNodeChange }) => {
|
|
3237
2915
|
const messages = useLiveMessages();
|
|
3238
|
-
const validationOptions = { messages: messages.validation };
|
|
3239
2916
|
const { id, value, rawValue, onChange } = binding;
|
|
3240
|
-
const
|
|
3241
|
-
const { controlId, errorId, isLabelled } = useFieldIds();
|
|
3242
|
-
const controlProps = {
|
|
3243
|
-
id: controlId,
|
|
3244
|
-
"aria-label": isLabelled ? void 0 : binding.label,
|
|
3245
|
-
"aria-invalid": validationError ? true : void 0,
|
|
3246
|
-
"aria-describedby": validationError ? errorId : void 0
|
|
3247
|
-
};
|
|
3248
|
-
const [text, setText] = useState(rawValue);
|
|
3249
|
-
const [prevRawValue, setPrevRawValue] = useState(rawValue);
|
|
3250
|
-
if (rawValue !== prevRawValue) {
|
|
3251
|
-
setPrevRawValue(rawValue);
|
|
3252
|
-
setText(rawValue);
|
|
3253
|
-
}
|
|
2917
|
+
const { text, setText, validationError, errorId, controlProps, commitIfChanged, validateAndCommit } = useFieldState(binding);
|
|
3254
2918
|
const kind = getFieldKind(binding);
|
|
3255
2919
|
if (kind === "readonly") return /* @__PURE__ */ jsxs("div", {
|
|
3256
|
-
className:
|
|
2920
|
+
className: fields_module_default.readonly,
|
|
3257
2921
|
children: [
|
|
3258
2922
|
/* @__PURE__ */ jsx("div", { children: messages.panel.expressionPreserved }),
|
|
3259
2923
|
/* @__PURE__ */ jsx("code", {
|
|
3260
|
-
className:
|
|
2924
|
+
className: fields_module_default.readonlyCode,
|
|
3261
2925
|
children: rawValue
|
|
3262
2926
|
}),
|
|
3263
2927
|
/* @__PURE__ */ jsx("div", { children: messages.panel.useCodeEditor })
|
|
3264
2928
|
]
|
|
3265
2929
|
});
|
|
3266
|
-
const commitIfChanged = (next) => {
|
|
3267
|
-
if (next !== (typeof next === "string" ? rawValue : value)) onChange(next);
|
|
3268
|
-
};
|
|
3269
|
-
const validateAndCommit = (next) => {
|
|
3270
|
-
const result = validateBindingValue(binding, next, validationOptions);
|
|
3271
|
-
if (!result.valid) {
|
|
3272
|
-
setValidationError(result.message ?? messages.panel.invalidValue);
|
|
3273
|
-
return;
|
|
3274
|
-
}
|
|
3275
|
-
setValidationError(null);
|
|
3276
|
-
commitIfChanged(next);
|
|
3277
|
-
};
|
|
3278
2930
|
if (kind === "items") return /* @__PURE__ */ jsx(Items, {
|
|
3279
2931
|
value: rawValue,
|
|
3280
2932
|
render: binding.render,
|
|
@@ -3283,10 +2935,13 @@ const BuiltinField = ({ binding, onNodeChange }) => {
|
|
|
3283
2935
|
onChange,
|
|
3284
2936
|
onChildChange: onNodeChange
|
|
3285
2937
|
});
|
|
3286
|
-
if (kind === "richtext") return /* @__PURE__ */ jsx(
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
2938
|
+
if (kind === "richtext") return /* @__PURE__ */ jsx("textarea", {
|
|
2939
|
+
...controlProps,
|
|
2940
|
+
rows: 4,
|
|
2941
|
+
value: text,
|
|
2942
|
+
className: cn(fields_module_default.control, fields_module_default.mono),
|
|
2943
|
+
onChange: (e) => setText(e.target.value),
|
|
2944
|
+
onBlur: (e) => commitIfChanged(e.target.value)
|
|
3290
2945
|
});
|
|
3291
2946
|
if (kind === "html" || kind === "jsx") return /* @__PURE__ */ jsx(JSXEditorField, {
|
|
3292
2947
|
value: rawValue,
|
|
@@ -3301,17 +2956,17 @@ const BuiltinField = ({ binding, onNodeChange }) => {
|
|
|
3301
2956
|
if (kind === "object") {
|
|
3302
2957
|
const objectValue = value;
|
|
3303
2958
|
return /* @__PURE__ */ jsx("div", {
|
|
3304
|
-
className:
|
|
2959
|
+
className: fields_module_default.object,
|
|
3305
2960
|
children: Object.entries(objectValue).map(([key, val]) => {
|
|
3306
2961
|
const nested = resolveRenderEntry(binding.render, key);
|
|
3307
2962
|
return /* @__PURE__ */ jsx("div", {
|
|
3308
|
-
className:
|
|
2963
|
+
className: fields_module_default.stack,
|
|
3309
2964
|
children: /* @__PURE__ */ jsx(LabeledField, {
|
|
3310
2965
|
binding: {
|
|
3311
2966
|
...nested,
|
|
3312
2967
|
value: val
|
|
3313
2968
|
},
|
|
3314
|
-
labelClassName:
|
|
2969
|
+
labelClassName: fields_module_default.label,
|
|
3315
2970
|
label: nested.label,
|
|
3316
2971
|
children: /* @__PURE__ */ jsx(Field, {
|
|
3317
2972
|
binding: {
|
|
@@ -3333,47 +2988,45 @@ const BuiltinField = ({ binding, onNodeChange }) => {
|
|
|
3333
2988
|
})
|
|
3334
2989
|
});
|
|
3335
2990
|
}
|
|
3336
|
-
if (kind === "boolean") return /* @__PURE__ */ jsx(
|
|
2991
|
+
if (kind === "boolean") return /* @__PURE__ */ jsx("input", {
|
|
2992
|
+
...controlProps,
|
|
2993
|
+
type: "checkbox",
|
|
3337
2994
|
checked: value === true || value === "true",
|
|
3338
|
-
|
|
3339
|
-
|
|
2995
|
+
className: fields_module_default.checkbox,
|
|
2996
|
+
onChange: (e) => {
|
|
2997
|
+
onChange(e.target.checked);
|
|
3340
2998
|
}
|
|
3341
2999
|
});
|
|
3342
|
-
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3000
|
+
if (kind === "select") return /* @__PURE__ */ jsx("select", {
|
|
3001
|
+
...controlProps,
|
|
3002
|
+
value: rawValue,
|
|
3003
|
+
className: fields_module_default.control,
|
|
3004
|
+
onChange: (e) => commitIfChanged(e.target.value),
|
|
3005
|
+
children: (binding.options ?? []).map((option) => /* @__PURE__ */ jsx("option", {
|
|
3006
|
+
value: option.value,
|
|
3007
|
+
children: option.label
|
|
3008
|
+
}, option.value))
|
|
3348
3009
|
});
|
|
3349
|
-
if (kind === "color") return /* @__PURE__ */ jsx(
|
|
3350
|
-
|
|
3351
|
-
|
|
3010
|
+
if (kind === "color") return /* @__PURE__ */ jsx(ColorField, {
|
|
3011
|
+
...controlProps,
|
|
3012
|
+
value: rawValue,
|
|
3352
3013
|
onChange: commitIfChanged
|
|
3353
3014
|
});
|
|
3354
|
-
if (kind === "date" || kind === "datetime") {
|
|
3355
|
-
const withTime = kind === "datetime";
|
|
3356
|
-
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(DatePicker, {
|
|
3357
|
-
value: parseDateValue(stringValue),
|
|
3358
|
-
showTime: withTime,
|
|
3359
|
-
onChange: (date) => validateAndCommit(date ? formatDateValue(date, withTime) : "")
|
|
3360
|
-
}), /* @__PURE__ */ jsx(FieldError, {
|
|
3361
|
-
id: errorId,
|
|
3362
|
-
message: validationError
|
|
3363
|
-
})] });
|
|
3364
|
-
}
|
|
3365
|
-
if (kind === "time") return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(TimePicker, {
|
|
3015
|
+
if (kind === "date" || kind === "datetime" || kind === "time") return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("input", {
|
|
3366
3016
|
...controlProps,
|
|
3367
|
-
|
|
3368
|
-
|
|
3017
|
+
type: kind === "datetime" ? "datetime-local" : kind,
|
|
3018
|
+
value: rawValue,
|
|
3019
|
+
className: fields_module_default.control,
|
|
3020
|
+
onChange: (e) => validateAndCommit(e.target.value)
|
|
3369
3021
|
}), /* @__PURE__ */ jsx(FieldError, {
|
|
3370
3022
|
id: errorId,
|
|
3371
3023
|
message: validationError
|
|
3372
3024
|
})] });
|
|
3373
|
-
if (kind === "url" || kind === "email" || kind === "tel") return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(
|
|
3025
|
+
if (kind === "url" || kind === "email" || kind === "tel") return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("input", {
|
|
3374
3026
|
...controlProps,
|
|
3375
3027
|
type: kind,
|
|
3376
3028
|
value: text,
|
|
3029
|
+
className: fields_module_default.control,
|
|
3377
3030
|
onChange: (e) => setText(e.target.value),
|
|
3378
3031
|
placeholder: kind === "url" ? messages.panel.urlPlaceholder : kind === "email" ? messages.panel.emailPlaceholder : messages.panel.telPlaceholder,
|
|
3379
3032
|
onBlur: (e) => validateAndCommit(e.target.value.trim())
|
|
@@ -3381,11 +3034,12 @@ const BuiltinField = ({ binding, onNodeChange }) => {
|
|
|
3381
3034
|
id: errorId,
|
|
3382
3035
|
message: validationError
|
|
3383
3036
|
})] });
|
|
3384
|
-
if (kind === "number") return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(
|
|
3037
|
+
if (kind === "number") return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("input", {
|
|
3385
3038
|
...controlProps,
|
|
3386
3039
|
type: "number",
|
|
3387
3040
|
step: binding.step,
|
|
3388
3041
|
value: text,
|
|
3042
|
+
className: fields_module_default.control,
|
|
3389
3043
|
onChange: (e) => setText(e.target.value),
|
|
3390
3044
|
placeholder: messages.panel.numberPlaceholder,
|
|
3391
3045
|
onBlur: (e) => {
|
|
@@ -3397,9 +3051,11 @@ const BuiltinField = ({ binding, onNodeChange }) => {
|
|
|
3397
3051
|
id: errorId,
|
|
3398
3052
|
message: validationError
|
|
3399
3053
|
})] });
|
|
3400
|
-
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx(
|
|
3054
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("textarea", {
|
|
3401
3055
|
...controlProps,
|
|
3056
|
+
rows: 2,
|
|
3402
3057
|
value: text,
|
|
3058
|
+
className: fields_module_default.control,
|
|
3403
3059
|
onChange: (e) => setText(e.target.value),
|
|
3404
3060
|
placeholder: messages.panel.textPlaceholder,
|
|
3405
3061
|
onBlur: (e) => {
|
|
@@ -3449,29 +3105,26 @@ const ElementFields = ({ id, header, bindings, onNodeChange, children, ...props
|
|
|
3449
3105
|
children: [
|
|
3450
3106
|
header,
|
|
3451
3107
|
bindings.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
3452
|
-
className:
|
|
3453
|
-
children: /* @__PURE__ */ jsx("div", {
|
|
3454
|
-
className:
|
|
3455
|
-
children:
|
|
3456
|
-
|
|
3457
|
-
|
|
3108
|
+
className: panel_module_default.bindings,
|
|
3109
|
+
children: bindings.map((binding) => /* @__PURE__ */ jsx("div", {
|
|
3110
|
+
className: panel_module_default.binding,
|
|
3111
|
+
children: /* @__PURE__ */ jsx(LabeledField, {
|
|
3112
|
+
binding,
|
|
3113
|
+
labelClassName: panel_module_default.bindingLabel,
|
|
3114
|
+
label: /* @__PURE__ */ jsxs(Fragment, { children: [binding.label, /* @__PURE__ */ jsxs("span", {
|
|
3115
|
+
className: panel_module_default.bindingProperty,
|
|
3116
|
+
children: [
|
|
3117
|
+
"(",
|
|
3118
|
+
binding.property,
|
|
3119
|
+
")"
|
|
3120
|
+
]
|
|
3121
|
+
})] }),
|
|
3122
|
+
children: /* @__PURE__ */ jsx(Field, {
|
|
3458
3123
|
binding,
|
|
3459
|
-
|
|
3460
|
-
label: /* @__PURE__ */ jsxs(Fragment, { children: [binding.label, /* @__PURE__ */ jsxs("span", {
|
|
3461
|
-
className: "ml-1 text-gray-400",
|
|
3462
|
-
children: [
|
|
3463
|
-
"(",
|
|
3464
|
-
binding.property,
|
|
3465
|
-
")"
|
|
3466
|
-
]
|
|
3467
|
-
})] }),
|
|
3468
|
-
children: /* @__PURE__ */ jsx(Field, {
|
|
3469
|
-
binding,
|
|
3470
|
-
onNodeChange
|
|
3471
|
-
})
|
|
3124
|
+
onNodeChange
|
|
3472
3125
|
})
|
|
3473
|
-
}
|
|
3474
|
-
})
|
|
3126
|
+
})
|
|
3127
|
+
}, `${binding.property}-${binding.label}`))
|
|
3475
3128
|
}),
|
|
3476
3129
|
children
|
|
3477
3130
|
]
|
|
@@ -3516,8 +3169,8 @@ const Panel$1 = ({ item, onDelete, onMoveUp, onMoveDown, canMoveUp = false, canM
|
|
|
3516
3169
|
ids: new Set(pickedId ? [pickedId] : []),
|
|
3517
3170
|
scrollRootRef: rootRef
|
|
3518
3171
|
}), [pickedId]);
|
|
3519
|
-
if (!item) return /* @__PURE__ */ jsx(
|
|
3520
|
-
className:
|
|
3172
|
+
if (!item) return /* @__PURE__ */ jsx("p", {
|
|
3173
|
+
className: panel_module_default.empty,
|
|
3521
3174
|
children: messages.panel.selectSection
|
|
3522
3175
|
});
|
|
3523
3176
|
return /* @__PURE__ */ jsxs("div", {
|
|
@@ -3528,15 +3181,15 @@ const Panel$1 = ({ item, onDelete, onMoveUp, onMoveDown, canMoveUp = false, canM
|
|
|
3528
3181
|
onBlur: (e) => {
|
|
3529
3182
|
if (!e.currentTarget.contains(e.relatedTarget)) setFocusedId(null);
|
|
3530
3183
|
},
|
|
3531
|
-
className:
|
|
3184
|
+
className: panel_module_default.panel,
|
|
3532
3185
|
children: [
|
|
3533
3186
|
/* @__PURE__ */ jsxs("div", {
|
|
3534
|
-
className:
|
|
3535
|
-
children: [/* @__PURE__ */ jsx(
|
|
3536
|
-
className:
|
|
3187
|
+
className: panel_module_default.header,
|
|
3188
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
3189
|
+
className: panel_module_default.title,
|
|
3537
3190
|
children: item.name
|
|
3538
3191
|
}), /* @__PURE__ */ jsxs("div", {
|
|
3539
|
-
className:
|
|
3192
|
+
className: panel_module_default.actions,
|
|
3540
3193
|
children: [
|
|
3541
3194
|
onMoveUp && /* @__PURE__ */ jsx(Button, {
|
|
3542
3195
|
icon: /* @__PURE__ */ jsx(ChevronUp, {}),
|
|
@@ -3551,7 +3204,7 @@ const Panel$1 = ({ item, onDelete, onMoveUp, onMoveDown, canMoveUp = false, canM
|
|
|
3551
3204
|
"aria-label": messages.section.moveDown
|
|
3552
3205
|
}),
|
|
3553
3206
|
onDelete && /* @__PURE__ */ jsx(Button, {
|
|
3554
|
-
|
|
3207
|
+
tone: "danger",
|
|
3555
3208
|
icon: /* @__PURE__ */ jsx(Trash, {}),
|
|
3556
3209
|
onClick: () => onDelete(item.id),
|
|
3557
3210
|
"aria-label": messages.section.delete
|
|
@@ -3559,13 +3212,13 @@ const Panel$1 = ({ item, onDelete, onMoveUp, onMoveDown, canMoveUp = false, canM
|
|
|
3559
3212
|
]
|
|
3560
3213
|
})]
|
|
3561
3214
|
}),
|
|
3562
|
-
readOnly && /* @__PURE__ */ jsx(
|
|
3215
|
+
readOnly && /* @__PURE__ */ jsx("span", {
|
|
3563
3216
|
role: "status",
|
|
3564
|
-
className:
|
|
3217
|
+
className: panel_module_default.readOnly,
|
|
3565
3218
|
children: messages.panel.readOnly
|
|
3566
3219
|
}),
|
|
3567
|
-
!groups.length && /* @__PURE__ */ jsx(
|
|
3568
|
-
className:
|
|
3220
|
+
!groups.length && /* @__PURE__ */ jsx("span", {
|
|
3221
|
+
className: panel_module_default.note,
|
|
3569
3222
|
children: messages.panel.noEditableElements
|
|
3570
3223
|
}),
|
|
3571
3224
|
/* @__PURE__ */ jsx(ElementSelectionContext.Provider, {
|
|
@@ -3576,14 +3229,14 @@ const Panel$1 = ({ item, onDelete, onMoveUp, onMoveDown, canMoveUp = false, canM
|
|
|
3576
3229
|
id: group[0].id,
|
|
3577
3230
|
role: "group",
|
|
3578
3231
|
"aria-label": element.label,
|
|
3579
|
-
className:
|
|
3232
|
+
className: panel_module_default.element,
|
|
3580
3233
|
header: groups.length > 1 && /* @__PURE__ */ jsxs("div", {
|
|
3581
|
-
className:
|
|
3234
|
+
className: panel_module_default.elementHeader,
|
|
3582
3235
|
children: [/* @__PURE__ */ jsx("code", {
|
|
3583
|
-
className:
|
|
3236
|
+
className: panel_module_default.elementTag,
|
|
3584
3237
|
children: element.tagName
|
|
3585
3238
|
}), element.text && /* @__PURE__ */ jsx("span", {
|
|
3586
|
-
className:
|
|
3239
|
+
className: panel_module_default.elementText,
|
|
3587
3240
|
children: element.text
|
|
3588
3241
|
})]
|
|
3589
3242
|
}),
|
|
@@ -3596,12 +3249,126 @@ const Panel$1 = ({ item, onDelete, onMoveUp, onMoveDown, canMoveUp = false, canM
|
|
|
3596
3249
|
});
|
|
3597
3250
|
};
|
|
3598
3251
|
//#endregion
|
|
3252
|
+
//#region src/components/dnd/split-panes.module.css
|
|
3253
|
+
var split_panes_module_default = {
|
|
3254
|
+
"center": "s-4F9W_center",
|
|
3255
|
+
"container": "s-4F9W_container",
|
|
3256
|
+
"handle": "s-4F9W_handle",
|
|
3257
|
+
"pane": "s-4F9W_pane"
|
|
3258
|
+
};
|
|
3259
|
+
//#endregion
|
|
3260
|
+
//#region src/components/dnd/split-panes.tsx
|
|
3261
|
+
const DEFAULT_SIZE = 20;
|
|
3262
|
+
const MIN_SIZE = 15;
|
|
3263
|
+
const MAX_SIZE = 35;
|
|
3264
|
+
const KEYBOARD_STEP = 2;
|
|
3265
|
+
const clampSize = (size) => {
|
|
3266
|
+
if (size < MIN_SIZE / 2) return 0;
|
|
3267
|
+
return Math.min(MAX_SIZE, Math.max(MIN_SIZE, size));
|
|
3268
|
+
};
|
|
3269
|
+
const SplitPanes = ({ start, center, end, labels }) => {
|
|
3270
|
+
const containerRef = useRef(null);
|
|
3271
|
+
const [sizes, setSizes] = useState({
|
|
3272
|
+
start: DEFAULT_SIZE,
|
|
3273
|
+
end: DEFAULT_SIZE
|
|
3274
|
+
});
|
|
3275
|
+
const restoreRef = useRef({
|
|
3276
|
+
start: DEFAULT_SIZE,
|
|
3277
|
+
end: DEFAULT_SIZE
|
|
3278
|
+
});
|
|
3279
|
+
const resize = (side, size) => {
|
|
3280
|
+
if (size > 0) restoreRef.current[side] = size;
|
|
3281
|
+
setSizes((prev) => ({
|
|
3282
|
+
...prev,
|
|
3283
|
+
[side]: size
|
|
3284
|
+
}));
|
|
3285
|
+
};
|
|
3286
|
+
const onPointerDown = (side) => (e) => {
|
|
3287
|
+
const container = containerRef.current;
|
|
3288
|
+
if (!container || e.button !== 0) return;
|
|
3289
|
+
e.preventDefault();
|
|
3290
|
+
const handle = e.currentTarget;
|
|
3291
|
+
const width = container.getBoundingClientRect().width;
|
|
3292
|
+
const startX = e.clientX;
|
|
3293
|
+
const startSize = sizes[side];
|
|
3294
|
+
handle.setPointerCapture(e.pointerId);
|
|
3295
|
+
const onMove = (move) => {
|
|
3296
|
+
const delta = (move.clientX - startX) / width * 100;
|
|
3297
|
+
resize(side, clampSize(startSize + (side === "start" ? delta : -delta)));
|
|
3298
|
+
};
|
|
3299
|
+
const onUp = () => {
|
|
3300
|
+
handle.removeEventListener("pointermove", onMove);
|
|
3301
|
+
handle.removeEventListener("pointerup", onUp);
|
|
3302
|
+
handle.removeEventListener("pointercancel", onUp);
|
|
3303
|
+
};
|
|
3304
|
+
handle.addEventListener("pointermove", onMove);
|
|
3305
|
+
handle.addEventListener("pointerup", onUp);
|
|
3306
|
+
handle.addEventListener("pointercancel", onUp);
|
|
3307
|
+
};
|
|
3308
|
+
const onKeyDown = (side) => (e) => {
|
|
3309
|
+
const grow = side === "start" ? "ArrowRight" : "ArrowLeft";
|
|
3310
|
+
const shrink = side === "start" ? "ArrowLeft" : "ArrowRight";
|
|
3311
|
+
const size = sizes[side];
|
|
3312
|
+
if (e.key === grow || e.key === shrink) {
|
|
3313
|
+
e.preventDefault();
|
|
3314
|
+
const step = e.key === grow ? KEYBOARD_STEP : -2;
|
|
3315
|
+
resize(side, Math.min(MAX_SIZE, Math.max(MIN_SIZE, size + step)));
|
|
3316
|
+
return;
|
|
3317
|
+
}
|
|
3318
|
+
if (e.key === "Home" || e.key === "End") {
|
|
3319
|
+
e.preventDefault();
|
|
3320
|
+
resize(side, e.key === "Home" ? MIN_SIZE : MAX_SIZE);
|
|
3321
|
+
return;
|
|
3322
|
+
}
|
|
3323
|
+
if (e.key === "Enter") {
|
|
3324
|
+
e.preventDefault();
|
|
3325
|
+
resize(side, size > 0 ? 0 : restoreRef.current[side]);
|
|
3326
|
+
}
|
|
3327
|
+
};
|
|
3328
|
+
const handle = (side) => /* @__PURE__ */ jsx("div", {
|
|
3329
|
+
role: "separator",
|
|
3330
|
+
tabIndex: 0,
|
|
3331
|
+
"aria-orientation": "vertical",
|
|
3332
|
+
"aria-label": labels[side],
|
|
3333
|
+
"aria-valuenow": Math.round(sizes[side]),
|
|
3334
|
+
"aria-valuemin": 0,
|
|
3335
|
+
"aria-valuemax": MAX_SIZE,
|
|
3336
|
+
className: split_panes_module_default.handle,
|
|
3337
|
+
onPointerDown: onPointerDown(side),
|
|
3338
|
+
onKeyDown: onKeyDown(side),
|
|
3339
|
+
onDoubleClick: () => resize(side, sizes[side] > 0 ? 0 : restoreRef.current[side])
|
|
3340
|
+
});
|
|
3341
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
3342
|
+
ref: containerRef,
|
|
3343
|
+
className: split_panes_module_default.container,
|
|
3344
|
+
children: [
|
|
3345
|
+
/* @__PURE__ */ jsx("div", {
|
|
3346
|
+
className: split_panes_module_default.pane,
|
|
3347
|
+
style: { flexBasis: `${sizes.start}%` },
|
|
3348
|
+
hidden: sizes.start === 0,
|
|
3349
|
+
children: start
|
|
3350
|
+
}),
|
|
3351
|
+
handle("start"),
|
|
3352
|
+
/* @__PURE__ */ jsx("div", {
|
|
3353
|
+
className: split_panes_module_default.center,
|
|
3354
|
+
children: center
|
|
3355
|
+
}),
|
|
3356
|
+
handle("end"),
|
|
3357
|
+
/* @__PURE__ */ jsx("div", {
|
|
3358
|
+
className: split_panes_module_default.pane,
|
|
3359
|
+
style: { flexBasis: `${sizes.end}%` },
|
|
3360
|
+
hidden: sizes.end === 0,
|
|
3361
|
+
children: end
|
|
3362
|
+
})
|
|
3363
|
+
]
|
|
3364
|
+
});
|
|
3365
|
+
};
|
|
3366
|
+
//#endregion
|
|
3599
3367
|
//#region src/components/dnd/layout.tsx
|
|
3600
3368
|
const PaletteItems = ({ subject }) => {
|
|
3601
3369
|
const { palette: { items, onAdd }, isMobile } = useDndRegions(subject);
|
|
3602
|
-
return /* @__PURE__ */ jsx(
|
|
3603
|
-
|
|
3604
|
-
align: "start",
|
|
3370
|
+
return /* @__PURE__ */ jsx("div", {
|
|
3371
|
+
className: layout_module_default.paletteItems,
|
|
3605
3372
|
children: items.map((item) => /* @__PURE__ */ jsx(DefaultDraggableItem, {
|
|
3606
3373
|
item,
|
|
3607
3374
|
onAdd,
|
|
@@ -3624,7 +3391,7 @@ const PanelFields = ({ subject }) => {
|
|
|
3624
3391
|
});
|
|
3625
3392
|
};
|
|
3626
3393
|
const Palette = ({ className, ...restProps }) => /* @__PURE__ */ jsx("div", {
|
|
3627
|
-
className: cn(
|
|
3394
|
+
className: cn(layout_module_default.palette, className),
|
|
3628
3395
|
...restProps,
|
|
3629
3396
|
children: /* @__PURE__ */ jsx(PaletteItems, { subject: "<Live.Dnd.Palette>" })
|
|
3630
3397
|
});
|
|
@@ -3633,7 +3400,7 @@ const Canvas = ({ className, style, ...restProps }) => {
|
|
|
3633
3400
|
const inspector = useDndInspector();
|
|
3634
3401
|
const messages = useLiveMessages();
|
|
3635
3402
|
return /* @__PURE__ */ jsxs("div", {
|
|
3636
|
-
className: cn(
|
|
3403
|
+
className: cn(layout_module_default.canvas, className),
|
|
3637
3404
|
"data-frame-container": true,
|
|
3638
3405
|
style: {
|
|
3639
3406
|
isolation: "isolate",
|
|
@@ -3643,12 +3410,12 @@ const Canvas = ({ className, style, ...restProps }) => {
|
|
|
3643
3410
|
},
|
|
3644
3411
|
...restProps,
|
|
3645
3412
|
children: [canvas, !documentError && /* @__PURE__ */ jsx("div", {
|
|
3646
|
-
className:
|
|
3413
|
+
className: layout_module_default.pickerDock,
|
|
3647
3414
|
children: /* @__PURE__ */ jsx("div", {
|
|
3648
|
-
className:
|
|
3415
|
+
className: layout_module_default.picker,
|
|
3649
3416
|
children: /* @__PURE__ */ jsx(Button, {
|
|
3650
3417
|
icon: /* @__PURE__ */ jsx(Crosshair, {}),
|
|
3651
|
-
|
|
3418
|
+
tone: "primary",
|
|
3652
3419
|
variant: inspector.active ? "solid" : "outlined",
|
|
3653
3420
|
"aria-pressed": inspector.active,
|
|
3654
3421
|
"aria-label": messages.canvas.pickElement,
|
|
@@ -3660,7 +3427,7 @@ const Canvas = ({ className, style, ...restProps }) => {
|
|
|
3660
3427
|
});
|
|
3661
3428
|
};
|
|
3662
3429
|
const Panel = ({ className, ...restProps }) => /* @__PURE__ */ jsx("div", {
|
|
3663
|
-
className: cn(
|
|
3430
|
+
className: cn(layout_module_default.panel, className),
|
|
3664
3431
|
...restProps,
|
|
3665
3432
|
children: /* @__PURE__ */ jsx(PanelFields, { subject: "<Live.Dnd.Panel>" })
|
|
3666
3433
|
});
|
|
@@ -3668,52 +3435,36 @@ const Layout = ({ palette, panel }) => {
|
|
|
3668
3435
|
const { isMobile, selectedId, clearSelection, paletteOpen, setPaletteOpen } = useDndRegions("<Live.Dnd.Layout>");
|
|
3669
3436
|
const messages = useLiveMessages();
|
|
3670
3437
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3671
|
-
isMobile ? /* @__PURE__ */ jsx(Canvas, {}) : /* @__PURE__ */
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
|
|
3678
|
-
|
|
3679
|
-
collapsible: true,
|
|
3680
|
-
children: palette ?? /* @__PURE__ */ jsx(Palette, {})
|
|
3681
|
-
}),
|
|
3682
|
-
/* @__PURE__ */ jsx(Splitter.Panel, {
|
|
3683
|
-
defaultSize: "60%",
|
|
3684
|
-
children: /* @__PURE__ */ jsx(Canvas, {})
|
|
3685
|
-
}),
|
|
3686
|
-
/* @__PURE__ */ jsx(Splitter.Panel, {
|
|
3687
|
-
defaultSize: "20%",
|
|
3688
|
-
minSize: "15%",
|
|
3689
|
-
maxSize: "35%",
|
|
3690
|
-
collapsible: true,
|
|
3691
|
-
children: panel ?? /* @__PURE__ */ jsx(Panel, {})
|
|
3692
|
-
})
|
|
3693
|
-
]
|
|
3438
|
+
isMobile ? /* @__PURE__ */ jsx(Canvas, {}) : /* @__PURE__ */ jsx(SplitPanes, {
|
|
3439
|
+
start: palette ?? /* @__PURE__ */ jsx(Palette, {}),
|
|
3440
|
+
center: /* @__PURE__ */ jsx(Canvas, {}),
|
|
3441
|
+
end: panel ?? /* @__PURE__ */ jsx(Panel, {}),
|
|
3442
|
+
labels: {
|
|
3443
|
+
start: messages.canvas.resizePalette,
|
|
3444
|
+
end: messages.canvas.resizePanel
|
|
3445
|
+
}
|
|
3694
3446
|
}),
|
|
3695
3447
|
/* @__PURE__ */ jsx(Button, {
|
|
3696
|
-
|
|
3448
|
+
variant: "solid",
|
|
3449
|
+
tone: "primary",
|
|
3697
3450
|
shape: "circle",
|
|
3698
3451
|
icon: /* @__PURE__ */ jsx(LayoutGrid, {}),
|
|
3699
3452
|
"aria-label": messages.canvas.palette,
|
|
3700
|
-
className:
|
|
3453
|
+
className: layout_module_default.paletteButton,
|
|
3701
3454
|
onClick: () => setPaletteOpen(true)
|
|
3702
3455
|
}),
|
|
3703
3456
|
/* @__PURE__ */ jsx(Drawer, {
|
|
3704
3457
|
open: isMobile && paletteOpen,
|
|
3705
3458
|
onClose: () => setPaletteOpen(false),
|
|
3706
|
-
direction: "bottom",
|
|
3707
|
-
size: "large",
|
|
3708
3459
|
title: messages.canvas.palette,
|
|
3460
|
+
closeLabel: messages.canvas.close,
|
|
3709
3461
|
children: palette ?? /* @__PURE__ */ jsx(PaletteItems, { subject: "<Live.Dnd.Layout>" })
|
|
3710
3462
|
}),
|
|
3711
3463
|
/* @__PURE__ */ jsx(Drawer, {
|
|
3712
3464
|
open: isMobile && Boolean(selectedId),
|
|
3713
3465
|
onClose: clearSelection,
|
|
3714
|
-
direction: "bottom",
|
|
3715
|
-
size: "large",
|
|
3716
3466
|
title: messages.canvas.properties,
|
|
3467
|
+
closeLabel: messages.canvas.close,
|
|
3717
3468
|
children: panel ?? /* @__PURE__ */ jsx(PanelFields, { subject: "<Live.Dnd.Layout>" })
|
|
3718
3469
|
})
|
|
3719
3470
|
] });
|
|
@@ -4338,13 +4089,13 @@ const Dnd$1 = ({ value: _value, props, modules: _modules = NO_MODULES, onChange:
|
|
|
4338
4089
|
children: [
|
|
4339
4090
|
stale && /* @__PURE__ */ jsx("div", {
|
|
4340
4091
|
role: "status",
|
|
4341
|
-
className:
|
|
4092
|
+
className: canvas_module_default.stale,
|
|
4342
4093
|
children: messages.canvas.stale
|
|
4343
4094
|
}),
|
|
4344
4095
|
/* @__PURE__ */ jsx(Droppable, {
|
|
4345
|
-
className: cn(!sections.length &&
|
|
4096
|
+
className: cn(!sections.length && canvas_module_default.fill),
|
|
4346
4097
|
children: !sections.length ? /* @__PURE__ */ jsx("div", {
|
|
4347
|
-
className:
|
|
4098
|
+
className: canvas_module_default.empty,
|
|
4348
4099
|
children: /* @__PURE__ */ jsx(CanvasNotice, { ...emptyCanvasNotice(messages, problem, isMobile) })
|
|
4349
4100
|
}) : /* @__PURE__ */ jsx(SortableContext, {
|
|
4350
4101
|
items: sections.map((s) => s.id),
|
|
@@ -4390,7 +4141,7 @@ const Dnd$1 = ({ value: _value, props, modules: _modules = NO_MODULES, onChange:
|
|
|
4390
4141
|
modifiers: [conditionalModifiers],
|
|
4391
4142
|
onDragEnd,
|
|
4392
4143
|
children: [/* @__PURE__ */ jsx("div", {
|
|
4393
|
-
className: cn(
|
|
4144
|
+
className: cn(layout_module_default.root, className),
|
|
4394
4145
|
...restProps,
|
|
4395
4146
|
children: /* @__PURE__ */ jsx(DndEditOptionsContext.Provider, {
|
|
4396
4147
|
value: {
|
|
@@ -4441,6 +4192,6 @@ Dnd.Canvas = Canvas;
|
|
|
4441
4192
|
Dnd.Panel = Panel;
|
|
4442
4193
|
Dnd.Layout = Layout;
|
|
4443
4194
|
//#endregion
|
|
4444
|
-
export {
|
|
4195
|
+
export { Panel as a, useDndChildren as c, useDndLayout as d, useDndPalette as f, DraggableItem as h, Palette as i, resolvePanelBindings as l, useDndInspector as m, Canvas as n, Field as o, useDndPanel as p, Layout as r, useDndItems as s, Dnd as t, withPanelCommit as u };
|
|
4445
4196
|
|
|
4446
|
-
//# sourceMappingURL=dnd-
|
|
4197
|
+
//# sourceMappingURL=dnd-BvjEDo-x.js.map
|