windcraft-editor 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -2
- package/core/board-layout.js +71 -0
- package/core/class-groups.js +210 -0
- package/core/design-spec.js +303 -0
- package/core/exporters.js +156 -0
- package/core/pages.js +39 -0
- package/core/prop-tailwind.js +158 -0
- package/core/split-sections.js +99 -0
- package/core/theme.js +87 -0
- package/design/agent.js +2118 -0
- package/design/classes-section.js +103 -0
- package/design/code-editor.js +293 -0
- package/design/code-view.js +158 -0
- package/design/color-picker.js +107 -0
- package/design/config.js +5 -0
- package/design/controls.js +132 -0
- package/design/css-props.js +111 -0
- package/design/design-tab.js +120 -0
- package/design/device-frame.js +40 -0
- package/design/editor/add-menu.js +151 -0
- package/design/editor/api.js +47 -0
- package/design/editor/base.js +55 -0
- package/design/editor/code-panel.js +206 -0
- package/design/editor/color-ui.js +135 -0
- package/design/editor/designs.js +606 -0
- package/design/editor/docs.js +121 -0
- package/design/editor/frame-handles.js +223 -0
- package/design/editor/frame-messages.js +195 -0
- package/design/editor/inspector.js +461 -0
- package/design/editor/layers.js +61 -0
- package/design/editor/pages-panel.js +161 -0
- package/design/editor/panel-resize.js +47 -0
- package/design/editor/plane.js +132 -0
- package/design/editor/present.js +52 -0
- package/design/editor/toolbar.js +267 -0
- package/design/editor.js +47 -0
- package/design/figma-sections.js +440 -0
- package/design/float-toolbar.js +163 -0
- package/design/group-controls.js +52 -0
- package/design/host.js +22 -0
- package/design/panel-model.js +130 -0
- package/design/panel-state.js +40 -0
- package/design/panel.js +212 -0
- package/design/presenter.js +312 -0
- package/design/prop-sections.js +18 -0
- package/design/selection-overlay.js +93 -0
- package/design/store.js +29 -0
- package/design/style-sections.js +315 -0
- package/design/tailwind-classes.js +65 -0
- package/embed-frame.js +43 -0
- package/embed.html +15 -0
- package/embed.js +60 -0
- package/index.js +62 -0
- package/package.json +50 -5
- package/playground/component-source.js +124 -0
- package/styles.css +402 -0
- package/template.js +247 -0
- package/vendor/codemirror.js +24 -0
- package/vendor/preact-htm.js +1 -0
- package/vendor/prettier.js +171 -0
package/template.js
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// The editor's page: toolbars, panels, the canvas and the dialogs. mountEditor() puts it in the page; the editor's code finds its parts by id.
|
|
2
|
+
export const editorHtml = `<div class="flex h-full flex-col">
|
|
3
|
+
|
|
4
|
+
<div class="flex min-h-0 flex-1">
|
|
5
|
+
<aside id="leftPanel" class="hidden w-[240px] shrink-0 flex-col border-r border-neutral-200 bg-white">
|
|
6
|
+
<div id="leftHead" class="flex items-center border-b border-neutral-200 px-2 py-2"></div>
|
|
7
|
+
<div id="leftBody" class="min-h-0 flex-1 overflow-auto pb-2">
|
|
8
|
+
<div id="pagesHead" class="sec2"><span>Pages</span><button id="pagesAdd" type="button" title="New page"
|
|
9
|
+
class="flex h-5 w-5 items-center justify-center rounded text-neutral-500 hover:bg-neutral-100"><svg
|
|
10
|
+
class="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"
|
|
11
|
+
stroke-linecap="round">
|
|
12
|
+
<path d="M12 5v14M5 12h14" />
|
|
13
|
+
</svg></button></div>
|
|
14
|
+
<div id="pagesList" class="px-1"></div>
|
|
15
|
+
<div class="mx-2 my-2 h-px bg-neutral-200"></div>
|
|
16
|
+
<div id="layersHead" class="sec2"><span>Layers</span></div>
|
|
17
|
+
<div id="layersHost" class="px-1">
|
|
18
|
+
<div id="layers" class="text-[12px]"></div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</aside>
|
|
22
|
+
|
|
23
|
+
<section class="relative flex min-w-0 flex-1 flex-col">
|
|
24
|
+
<div id="pillL" class="pill absolute left-3 top-3 z-50 flex items-center gap-0.5 p-1"
|
|
25
|
+
style="max-width:calc(100% - 24px)">
|
|
26
|
+
<div id="navGroup" class="flex min-w-0 items-center gap-0.5">
|
|
27
|
+
<a id="backLink" href="#" title="Back" class="tbtn"><svg
|
|
28
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
29
|
+
stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
|
|
30
|
+
<path d="m15 5-7 7 7 7" />
|
|
31
|
+
</svg></a><span id="backLabel" class="hidden">Back</span>
|
|
32
|
+
<span class="mx-0.5 h-5 w-px bg-neutral-200"></span>
|
|
33
|
+
<a id="leftProject" href="#" class="dtl" title="Open the project board"></a>
|
|
34
|
+
<button id="leftBtn" type="button" title="Layers" class="tbtn"><svg
|
|
35
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
36
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
37
|
+
<rect x="3" y="4" width="18" height="16" rx="2" />
|
|
38
|
+
<path d="M10 4v16" />
|
|
39
|
+
</svg></button>
|
|
40
|
+
<span class="mx-0.5 h-5 w-px bg-neutral-200"></span>
|
|
41
|
+
<div class="relative min-w-0 shrink">
|
|
42
|
+
<button id="navMoreBtn" type="button" title="Page details and project" class="tbtn"><svg
|
|
43
|
+
class="mx-auto h-[18px] w-[18px]" viewBox="0 0 24 24" fill="currentColor">
|
|
44
|
+
<circle cx="5.5" cy="12" r="1.6" />
|
|
45
|
+
<circle cx="12" cy="12" r="1.6" />
|
|
46
|
+
<circle cx="18.5" cy="12" r="1.6" />
|
|
47
|
+
</svg></button>
|
|
48
|
+
<button id="designsBtn" type="button"
|
|
49
|
+
class="flex h-8 min-w-0 max-w-[220px] shrink items-center gap-1.5 rounded-lg px-2 text-[13px] font-medium text-neutral-800 hover:bg-neutral-100"
|
|
50
|
+
title="Pages">
|
|
51
|
+
<span id="designsCount"
|
|
52
|
+
class="rounded-full bg-neutral-100 px-1.5 text-[11px] text-neutral-600">1</span>
|
|
53
|
+
<span id="designsName" class="truncate">Design</span>
|
|
54
|
+
<svg class="h-3.5 w-3.5 shrink-0 text-neutral-500" fill="none" viewBox="0 0 24 24"
|
|
55
|
+
stroke="currentColor" stroke-width="2">
|
|
56
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="m6 9 6 6 6-6" />
|
|
57
|
+
</svg>
|
|
58
|
+
</button>
|
|
59
|
+
<div id="designsMenu" class="pop absolute left-0 top-10 z-40 hidden w-64 p-1">
|
|
60
|
+
<div id="designs" class="max-h-72 overflow-auto text-[12px]"></div>
|
|
61
|
+
<button id="newDesignBtn" type="button"
|
|
62
|
+
class="mt-1 flex h-8 w-full items-center gap-2 rounded-lg border-t border-neutral-100 px-2 text-left text-[12px] font-medium text-neutral-700 hover:bg-neutral-100">+
|
|
63
|
+
New page</button>
|
|
64
|
+
<div class="mt-1 border-t border-neutral-100 pt-1">
|
|
65
|
+
<button id="detailsBtn" type="button" title="Name, category, tags and visibility"
|
|
66
|
+
class="hidden h-8 w-full items-center justify-between rounded-lg px-2 text-left text-[12px] font-medium text-neutral-700 hover:bg-neutral-100"><span>Page
|
|
67
|
+
details…</span><span id="versionBadge"
|
|
68
|
+
class="rounded bg-neutral-100 px-1.5 py-0.5 font-mono text-[11px] text-neutral-600"></span></button>
|
|
69
|
+
<span id="titleText" class="hidden"></span><span id="projSep" class="hidden"></span>
|
|
70
|
+
<a id="projLink" href="#"
|
|
71
|
+
class="hidden h-8 w-full items-center justify-between rounded-lg px-2 text-left text-[12px] font-medium text-neutral-700 hover:bg-neutral-100"
|
|
72
|
+
title="Open the project board"></a>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<span id="navSep" class="mx-0.5 h-5 w-px bg-neutral-200"></span>
|
|
78
|
+
<div id="toolbar" class="flex shrink-0 items-center gap-0.5"></div>
|
|
79
|
+
<span class="mx-0.5 h-5 w-px bg-neutral-200"></span>
|
|
80
|
+
<div class="relative">
|
|
81
|
+
<button id="addBtn" type="button" title="Insert a block" class="tbtn"><svg
|
|
82
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
83
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
84
|
+
<path d="M12 5v14M5 12h14" />
|
|
85
|
+
</svg></button>
|
|
86
|
+
<div id="addMenu" class="pop absolute left-0 top-10 z-40 hidden w-48 p-1"></div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div id="pillR" class="pill absolute right-3 top-3 z-40 flex items-center gap-0.5 p-1">
|
|
90
|
+
<button id="undoBtn" type="button" title="Undo (Ctrl/Cmd+Z)" class="tbtn disabled:opacity-30"><svg
|
|
91
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
92
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
93
|
+
<path d="M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3" />
|
|
94
|
+
</svg></button>
|
|
95
|
+
<button id="redoBtn" type="button" title="Redo (Ctrl/Cmd+Shift+Z)" class="tbtn disabled:opacity-30"><svg
|
|
96
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
97
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
98
|
+
<path d="m15 15 6-6m0 0-6-6m6 6H9a6 6 0 0 0 0 12h3" />
|
|
99
|
+
</svg></button>
|
|
100
|
+
<span class="mx-0.5 h-5 w-px bg-neutral-200"></span>
|
|
101
|
+
<button id="codeBtn" type="button" title="View and edit the HTML" class="tbtn"><svg
|
|
102
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
103
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
104
|
+
<path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14" />
|
|
105
|
+
</svg></button>
|
|
106
|
+
<button id="playBtn" type="button" title="Preview the pages one at a time, full screen" class="tbtn"><svg
|
|
107
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
108
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
109
|
+
<path d="M7 5v14l12-7z" />
|
|
110
|
+
</svg></button>
|
|
111
|
+
<button id="panelBtn" type="button" title="Properties and layers" class="tbtn"><svg
|
|
112
|
+
class="mx-auto h-[18px] w-[18px]" fill="none" viewBox="0 0 24 24" stroke="currentColor"
|
|
113
|
+
stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
|
|
114
|
+
<rect x="3" y="4" width="18" height="16" rx="2" />
|
|
115
|
+
<path d="M14 4v16" />
|
|
116
|
+
</svg></button>
|
|
117
|
+
<span class="mx-0.5 h-5 w-px bg-neutral-200"></span>
|
|
118
|
+
<button id="saveBtn" type="button"
|
|
119
|
+
class="ml-0.5 h-8 min-w-[64px] rounded-lg bg-[#111] px-3 text-[13px] font-semibold text-white hover:bg-black disabled:bg-transparent disabled:text-neutral-400 disabled:hover:bg-transparent">Save</button>
|
|
120
|
+
<button id="figmaBtn" type="button"
|
|
121
|
+
class="ml-1 hidden h-8 rounded-lg border border-neutral-200 px-3 text-[13px] font-medium text-neutral-800 hover:bg-neutral-100 disabled:opacity-50"
|
|
122
|
+
title="Convert this design again from the Figma data kept with it">Update from Figma</button>
|
|
123
|
+
<span id="saveState" class="hidden"></span>
|
|
124
|
+
<select id="zoomSel"
|
|
125
|
+
class="h-8 rounded-lg border-0 bg-transparent pl-1 pr-0 text-[13px] font-medium text-neutral-800 hover:bg-neutral-100 focus:outline-none"
|
|
126
|
+
title="Zoom (Shift+1 fit all, Shift+2 fit this design)">
|
|
127
|
+
<option value="fit">Fit all</option>
|
|
128
|
+
<option value="frame">Fit</option>
|
|
129
|
+
<option value="16">1600%</option>
|
|
130
|
+
<option value="8">800%</option>
|
|
131
|
+
<option value="4">400%</option>
|
|
132
|
+
<option value="2">200%</option>
|
|
133
|
+
<option value="1">100%</option>
|
|
134
|
+
<option value="0.75">75%</option>
|
|
135
|
+
<option value="0.5">50%</option>
|
|
136
|
+
<option value="0.25">25%</option>
|
|
137
|
+
</select>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<main id="canvas" class="relative min-h-0 flex-1 overflow-hidden" style="touch-action:none">
|
|
141
|
+
<div id="boot" role="status" aria-live="polite" class="absolute inset-0 z-[40] hidden flex-col items-center justify-center gap-3 bg-neutral-100 text-[13px] text-neutral-500">
|
|
142
|
+
<span class="h-6 w-6 animate-spin rounded-full border-2 border-neutral-300 border-t-neutral-800"></span>
|
|
143
|
+
<span>Opening your design…</span>
|
|
144
|
+
</div>
|
|
145
|
+
<div id="plane" class="absolute left-0 top-0" style="transform-origin:0 0">
|
|
146
|
+
<div id="frames"></div>
|
|
147
|
+
<iframe id="frame" aria-label="Design canvas" sandbox="allow-scripts" class="block bg-white"
|
|
148
|
+
style="border:0;position:absolute;left:0;top:0"></iframe>
|
|
149
|
+
<div id="pgrid" class="pointer-events-none absolute hidden"></div>
|
|
150
|
+
</div>
|
|
151
|
+
<div id="lines" class="pointer-events-none absolute inset-0 z-[14] overflow-hidden"></div>
|
|
152
|
+
<div id="sel" class="pointer-events-none absolute inset-0 z-[15] overflow-hidden"></div>
|
|
153
|
+
<div id="slbl" class="pointer-events-none absolute inset-0 z-[17] overflow-hidden"></div>
|
|
154
|
+
<div id="fsel" class="pointer-events-none absolute inset-0 z-[16] overflow-hidden"></div>
|
|
155
|
+
<div id="marquee" class="pointer-events-none absolute z-20"
|
|
156
|
+
style="display:none;border:1px solid #111;background:rgba(0,0,0,.06)"></div>
|
|
157
|
+
<div id="panShield" class="absolute inset-0 z-20 hidden" style="cursor:grab"></div>
|
|
158
|
+
<div id="ftb" class="pill absolute z-30 hidden items-center gap-0.5 p-1"></div>
|
|
159
|
+
<p id="canvasHint"
|
|
160
|
+
class="pointer-events-none absolute bottom-3 left-1/2 z-10 -translate-x-1/2 whitespace-nowrap rounded-full bg-white/90 px-3 py-1 text-[11px] text-neutral-500 shadow-[0_1px_4px_rgba(0,0,0,.12)]">
|
|
161
|
+
Click to select. Double-click text to edit it. Alt-drag to place freely. Scroll to pan, Ctrl/Cmd + scroll to zoom.</p>
|
|
162
|
+
|
|
163
|
+
</main>
|
|
164
|
+
|
|
165
|
+
<div id="codePanel" class="relative hidden shrink-0 flex-col overflow-hidden border-t border-neutral-200 bg-white" style="height: 256px">
|
|
166
|
+
<div id="codeResize" title="Drag to resize" class="absolute inset-x-0 -top-1 z-10 h-2 cursor-row-resize"></div>
|
|
167
|
+
<div
|
|
168
|
+
class="flex h-8 shrink-0 items-center gap-2 overflow-hidden whitespace-nowrap border-b border-neutral-200 bg-neutral-50 px-3 text-[11px]">
|
|
169
|
+
<span class="shrink-0 font-semibold uppercase tracking-wide text-neutral-500">Code</span>
|
|
170
|
+
<span id="codeLines" class="min-w-0 truncate text-neutral-400"></span>
|
|
171
|
+
<button id="codeWarn" type="button" class="hidden min-w-0 truncate rounded px-1.5 py-0.5 text-left text-amber-700 hover:bg-amber-50" title="Go to the line"></button>
|
|
172
|
+
<span class="ml-auto flex shrink-0 items-center gap-1">
|
|
173
|
+
<button id="codeDock" type="button" class="flex h-6 w-6 items-center justify-center rounded text-neutral-600 hover:bg-neutral-200"></button>
|
|
174
|
+
<button id="codeFind" type="button" title="Find and replace (Ctrl/Cmd+F)" class="rounded px-2 py-0.5 text-neutral-600 hover:bg-neutral-200">Find</button>
|
|
175
|
+
<button id="codeFormat" type="button" title="Tidy the indentation (one undo step)" class="rounded px-2 py-0.5 text-neutral-600 hover:bg-neutral-200">Format</button>
|
|
176
|
+
<button id="codeCopy" type="button" title="Copy all the code" class="rounded px-2 py-0.5 text-neutral-600 hover:bg-neutral-200">Copy</button>
|
|
177
|
+
<button id="codeClose" type="button" title="Close the code" aria-label="Close the code"
|
|
178
|
+
class="flex h-6 w-6 items-center justify-center rounded text-neutral-500 hover:bg-neutral-200"><svg class="h-4 w-4"
|
|
179
|
+
fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.8" stroke-linecap="round">
|
|
180
|
+
<path d="M6 6l12 12M18 6 6 18" />
|
|
181
|
+
</svg></button>
|
|
182
|
+
</span>
|
|
183
|
+
</div>
|
|
184
|
+
<div id="codeMount" class="min-h-0 min-w-0 flex-1 overflow-hidden bg-white"></div>
|
|
185
|
+
</div>
|
|
186
|
+
</section>
|
|
187
|
+
|
|
188
|
+
<aside id="panel" class="hidden w-[240px] shrink-0 flex-col border-l border-neutral-200 bg-white">
|
|
189
|
+
<div id="panelHead" class="hidden items-center gap-1 border-b border-neutral-200 px-2 py-1.5">
|
|
190
|
+
<div id="panelTabs" class="flex gap-0.5">
|
|
191
|
+
<button type="button" data-ptab="props" class="ptab is-on">Properties</button>
|
|
192
|
+
</div>
|
|
193
|
+
<button id="panelClose" type="button" title="Close"
|
|
194
|
+
class="ml-auto flex h-6 w-6 items-center justify-center rounded text-neutral-500 hover:bg-neutral-100">
|
|
195
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.8"
|
|
196
|
+
stroke-linecap="round">
|
|
197
|
+
<path d="M6 6l12 12M18 6 6 18" />
|
|
198
|
+
</svg>
|
|
199
|
+
</button>
|
|
200
|
+
</div>
|
|
201
|
+
<div id="inspector" class="min-h-0 flex-1 overflow-auto"></div>
|
|
202
|
+
</aside>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<dialog id="detailsDlg"
|
|
207
|
+
class="m-auto w-[min(520px,92vw)] rounded-xl border border-neutral-200 p-0 shadow-[0_16px_48px_rgba(0,0,0,.2)] backdrop:bg-black/40">
|
|
208
|
+
<form id="detailsForm" method="dialog">
|
|
209
|
+
<div class="border-b border-neutral-200 px-5 py-3">
|
|
210
|
+
<h3 id="detailsTitle" class="text-sm font-semibold text-neutral-900">Component details</h3>
|
|
211
|
+
</div>
|
|
212
|
+
<div class="space-y-4 p-5">
|
|
213
|
+
<div><label class="mb-1 block text-xs font-medium text-neutral-700" for="dTitle">Title</label><input
|
|
214
|
+
id="dTitle" class="field" style="height:36px" placeholder="Gradient hero section" required></div>
|
|
215
|
+
<div><label class="mb-1 block text-xs font-medium text-neutral-700" for="dCategory">Category</label>
|
|
216
|
+
<select id="dCategory" class="field" style="height:36px" required>
|
|
217
|
+
<option value="" disabled selected>Select a category</option>
|
|
218
|
+
</select>
|
|
219
|
+
</div>
|
|
220
|
+
<div><label class="mb-1 block text-xs font-medium text-neutral-700" for="dDesc">Description (optional)</label><textarea
|
|
221
|
+
id="dDesc" rows="3" class="field" style="font-family:inherit"
|
|
222
|
+
placeholder="What it is and when to use it" required></textarea></div>
|
|
223
|
+
<div><label class="mb-1 block text-xs font-medium text-neutral-700" for="dTags">Tags</label><input
|
|
224
|
+
id="dTags" class="field" style="height:36px" placeholder="hero, dark, saas (comma separated)">
|
|
225
|
+
<p class="mt-1 text-[11px] text-neutral-500">Tags help you, AI and coding agents find it.</p>
|
|
226
|
+
</div>
|
|
227
|
+
<div><label class="mb-1 block text-xs font-medium text-neutral-700" for="dProject">Project</label>
|
|
228
|
+
<select id="dProject" class="field" style="height:36px" required></select>
|
|
229
|
+
</div>
|
|
230
|
+
<div><label class="mb-1 block text-xs font-medium text-neutral-700" for="dVis">Visibility</label>
|
|
231
|
+
<select id="dVis" class="field" style="height:36px">
|
|
232
|
+
<option value="true">Public in the gallery</option>
|
|
233
|
+
<option value="false">Private (only me)</option>
|
|
234
|
+
</select>
|
|
235
|
+
</div>
|
|
236
|
+
<label class="flex cursor-pointer items-start gap-2 text-xs text-neutral-700"><input id="dRef" type="checkbox" checked class="mt-0.5 h-4 w-4 rounded border-neutral-300"><span><span class="font-medium">Use as AI reference</span><br><span class="text-neutral-500">AI tools may use this design as a style reference.</span></span></label>
|
|
237
|
+
<p id="detailsError" class="hidden text-xs text-red-700"></p>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="flex justify-end gap-2 border-t border-neutral-200 px-5 py-3">
|
|
240
|
+
<button type="button" id="detailsCancel"
|
|
241
|
+
class="h-9 rounded-md border border-neutral-300 px-4 text-sm font-medium hover:bg-neutral-50">Cancel</button>
|
|
242
|
+
<button type="submit" id="detailsSave"
|
|
243
|
+
class="h-9 rounded-md bg-black px-4 text-sm font-medium text-white hover:bg-neutral-800 disabled:opacity-50">Save</button>
|
|
244
|
+
</div>
|
|
245
|
+
</form>
|
|
246
|
+
</dialog>
|
|
247
|
+
`;
|