@drawnagency/primitives 0.1.87 → 0.1.89
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-PTVY3Q7P.js → chunk-2QXJ2KGB.js} +1 -1
- package/dist/{chunk-DRCPDOW3.js → chunk-CZ3YXGK5.js} +59 -0
- package/dist/{chunk-NEDOJHHR.js → chunk-J75XGXYD.js} +2 -2
- package/dist/{chunk-6VOIZP2O.js → chunk-L2MAJKKC.js} +220 -207
- package/dist/{chunk-VY5V4HBV.js → chunk-MVX4ULYE.js} +6 -6
- package/dist/{chunk-EO7K45GV.js → chunk-NV4R6VHN.js} +1 -1
- package/dist/{chunk-XDG2K6UT.js → chunk-QFV5TSPO.js} +1 -1
- package/dist/{chunk-OEL57NYV.js → chunk-VK5KNH73.js} +25 -1
- package/dist/{chunk-XPUBUR64.js → chunk-WCBYXNAG.js} +27 -2
- package/dist/{chunk-WA3HFN54.js → chunk-Y24T75HT.js} +1 -1
- package/dist/components/brandguide/Colors.d.ts.map +1 -1
- package/dist/components/brandguide/ColorsEditable.d.ts +20 -0
- package/dist/components/brandguide/ColorsEditable.d.ts.map +1 -0
- package/dist/components/brandguide/ColorsView.d.ts +9 -0
- package/dist/components/brandguide/ColorsView.d.ts.map +1 -0
- package/dist/components/brandguide/colors-shared.d.ts +4 -0
- package/dist/components/brandguide/colors-shared.d.ts.map +1 -0
- package/dist/components/chat/ChatPanel.d.ts +20 -3
- package/dist/components/chat/ChatPanel.d.ts.map +1 -1
- package/dist/components/chat/ChatWidget.d.ts +7 -1
- package/dist/components/chat/ChatWidget.d.ts.map +1 -1
- package/dist/components/chat/chat-history.d.ts +24 -0
- package/dist/components/chat/chat-history.d.ts.map +1 -0
- package/dist/components/editor/index.js +4 -4
- package/dist/components/primitives/index.js +5 -5
- package/dist/components/sections/Colors/index.d.ts.map +1 -1
- package/dist/components/sections/SectionIsland.d.ts +8 -0
- package/dist/components/sections/SectionIsland.d.ts.map +1 -0
- package/dist/components/sections/brand-guide.js +5 -5
- package/dist/components/sections/register-schemas.js +8 -8
- package/dist/components/sections/register.js +8 -8
- package/dist/components/shared/Navigation.d.ts +6 -1
- package/dist/components/shared/Navigation.d.ts.map +1 -1
- package/dist/components/shell/EditorShell.d.ts.map +1 -1
- package/dist/components/shell/MediaLibraryContext.d.ts +3 -1
- package/dist/components/shell/MediaLibraryContext.d.ts.map +1 -1
- package/dist/components/shell/SiteSettingsChatbot.d.ts.map +1 -1
- package/dist/hooks/useCollabSession.d.ts.map +1 -1
- package/dist/hooks/useMediaPipeline.d.ts +5 -1
- package/dist/hooks/useMediaPipeline.d.ts.map +1 -1
- package/dist/index.js +14 -4
- package/dist/lib/chatbot.d.ts +10 -0
- package/dist/lib/chatbot.d.ts.map +1 -0
- package/dist/lib/contrast.d.ts +5 -0
- package/dist/lib/contrast.d.ts.map +1 -1
- package/dist/lib/index.d.ts +2 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +10 -2
- package/dist/lib/registry.d.ts +7 -0
- package/dist/lib/registry.d.ts.map +1 -1
- package/dist/media/compose-preview.d.ts +23 -0
- package/dist/media/compose-preview.d.ts.map +1 -0
- package/dist/media/index.d.ts +1 -0
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +4 -2
- package/dist/media/preview-inputs.d.ts +31 -0
- package/dist/media/preview-inputs.d.ts.map +1 -0
- package/dist/schemas/index.js +2 -2
- package/dist/schemas/media.d.ts +2 -0
- package/dist/schemas/media.d.ts.map +1 -1
- package/dist/schemas/site-config.d.ts +12 -0
- package/dist/schemas/site-config.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/brandguide/Colors.tsx +2 -275
- package/src/components/brandguide/ColorsEditable.tsx +155 -0
- package/src/components/brandguide/ColorsView.tsx +100 -0
- package/src/components/brandguide/colors-shared.ts +17 -0
- package/src/components/chat/ChatPanel.tsx +437 -65
- package/src/components/chat/ChatWidget.tsx +90 -32
- package/src/components/chat/chat-history.ts +105 -0
- package/src/components/sections/Colors/index.tsx +1 -0
- package/src/components/sections/SectionIsland.tsx +21 -0
- package/src/components/shared/Navigation.tsx +18 -5
- package/src/components/shell/EditorShell.tsx +71 -1
- package/src/components/shell/MediaLibraryContext.tsx +1 -1
- package/src/components/shell/SiteSettingsChatbot.tsx +47 -0
- package/src/hooks/useCollabSession.ts +27 -0
- package/src/hooks/useMediaPipeline.ts +7 -3
- package/src/lib/chatbot.ts +30 -0
- package/src/lib/contrast.ts +12 -0
- package/src/lib/index.ts +2 -1
- package/src/lib/registry.ts +7 -0
- package/src/media/compose-preview.ts +90 -0
- package/src/media/index.ts +1 -0
- package/src/media/preview-inputs.ts +77 -0
- package/src/schemas/media.ts +3 -0
- package/src/schemas/site-config.ts +26 -1
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
MediaBlock,
|
|
10
10
|
containerGridClass,
|
|
11
11
|
useEditableCollection
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-J75XGXYD.js";
|
|
13
13
|
import {
|
|
14
14
|
AddIcon,
|
|
15
15
|
DeleteIcon,
|
|
16
16
|
DragHandle,
|
|
17
17
|
IconButton
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-NV4R6VHN.js";
|
|
19
19
|
import {
|
|
20
20
|
DEFAULT_LINK,
|
|
21
21
|
LinkValueSchema
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
import {
|
|
31
31
|
HexColorSchema,
|
|
32
32
|
SingleMediaReferenceSchema
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-WCBYXNAG.js";
|
|
34
34
|
import {
|
|
35
35
|
defineSection
|
|
36
36
|
} from "./chunk-VKAGMEKE.js";
|
|
@@ -55,53 +55,11 @@ var ColorItemSchema = z.object({
|
|
|
55
55
|
spaces: z.array(ColorSpaceSchema).describe("One or more color-space definitions (hex/rgb/cmyk/pantone) for this color.").min(1)
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
-
// src/components/brandguide/
|
|
59
|
-
import { useState as useState2, useEffect } from "react";
|
|
60
|
-
import { Eye, EyeOff } from "lucide-react";
|
|
61
|
-
|
|
62
|
-
// src/components/brandguide/ColorSwatchSettings.tsx
|
|
58
|
+
// src/components/brandguide/ColorsView.tsx
|
|
63
59
|
import { useState } from "react";
|
|
64
|
-
import {
|
|
65
|
-
function mergeSpaces(spaces) {
|
|
66
|
-
return Object.assign({}, ...spaces);
|
|
67
|
-
}
|
|
68
|
-
function ColorSwatchSettings({ color, onChange }) {
|
|
69
|
-
const [localColor, setLocalColor] = useState(() => ({
|
|
70
|
-
...color,
|
|
71
|
-
spaces: [mergeSpaces(color.spaces)]
|
|
72
|
-
}));
|
|
73
|
-
const space = localColor.spaces[0] || {};
|
|
74
|
-
const update = (updated) => {
|
|
75
|
-
setLocalColor(updated);
|
|
76
|
-
onChange(updated);
|
|
77
|
-
};
|
|
78
|
-
const updateSpace = (key, value) => {
|
|
79
|
-
const newSpace = { ...space, [key]: value || void 0 };
|
|
80
|
-
update({ ...localColor, spaces: [newSpace] });
|
|
81
|
-
};
|
|
82
|
-
return /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
83
|
-
/* @__PURE__ */ jsx(
|
|
84
|
-
Input,
|
|
85
|
-
{
|
|
86
|
-
label: "Name",
|
|
87
|
-
value: localColor.name || "",
|
|
88
|
-
onChange: (name) => update({ ...localColor, name })
|
|
89
|
-
}
|
|
90
|
-
),
|
|
91
|
-
["hex", "rgb", "cmyk", "pantone"].map((key) => /* @__PURE__ */ jsx(
|
|
92
|
-
Input,
|
|
93
|
-
{
|
|
94
|
-
label: key.toUpperCase(),
|
|
95
|
-
value: space[key] || "",
|
|
96
|
-
onChange: (value) => updateSpace(key, value)
|
|
97
|
-
},
|
|
98
|
-
key
|
|
99
|
-
))
|
|
100
|
-
] });
|
|
101
|
-
}
|
|
60
|
+
import { Eye, EyeOff } from "lucide-react";
|
|
102
61
|
|
|
103
|
-
// src/components/brandguide/
|
|
104
|
-
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
62
|
+
// src/components/brandguide/colors-shared.ts
|
|
105
63
|
function getContrastClass(hex) {
|
|
106
64
|
if (!hex) return "text-white";
|
|
107
65
|
const h = hex.replace("#", "");
|
|
@@ -116,32 +74,9 @@ var createColorItem = () => ({
|
|
|
116
74
|
name: "",
|
|
117
75
|
spaces: [{ hex: "#cccccc" }]
|
|
118
76
|
});
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
type: "colors",
|
|
123
|
-
content: { colors },
|
|
124
|
-
...label || columns || collapsing !== void 0 || showLabel !== void 0 ? { options: { label, columns, collapsing, showLabel } } : {}
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
function Colors({ colors, columns = 3, label, collapsing, showLabel = true, onChange, openModal, onDelete }) {
|
|
128
|
-
if (onChange && openModal) {
|
|
129
|
-
return /* @__PURE__ */ jsx2(
|
|
130
|
-
ColorsEditable,
|
|
131
|
-
{
|
|
132
|
-
colors,
|
|
133
|
-
columns,
|
|
134
|
-
label,
|
|
135
|
-
collapsing,
|
|
136
|
-
showLabel,
|
|
137
|
-
onChange,
|
|
138
|
-
openModal,
|
|
139
|
-
onDelete
|
|
140
|
-
}
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
return /* @__PURE__ */ jsx2(ColorsView, { colors, columns, label, collapsing, showLabel });
|
|
144
|
-
}
|
|
77
|
+
|
|
78
|
+
// src/components/brandguide/ColorsView.tsx
|
|
79
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
145
80
|
function ColorsView({
|
|
146
81
|
colors,
|
|
147
82
|
columns,
|
|
@@ -149,8 +84,8 @@ function ColorsView({
|
|
|
149
84
|
collapsing,
|
|
150
85
|
showLabel
|
|
151
86
|
}) {
|
|
152
|
-
const [expanded, setExpanded] =
|
|
153
|
-
const [copiedIndex, setCopiedIndex] =
|
|
87
|
+
const [expanded, setExpanded] = useState(!collapsing);
|
|
88
|
+
const [copiedIndex, setCopiedIndex] = useState(null);
|
|
154
89
|
const handleCopy = (value, colorIndex) => {
|
|
155
90
|
if (navigator.clipboard?.writeText) {
|
|
156
91
|
navigator.clipboard.writeText(value);
|
|
@@ -167,38 +102,38 @@ function ColorsView({
|
|
|
167
102
|
setCopiedIndex(colorIndex);
|
|
168
103
|
setTimeout(() => setCopiedIndex(null), 1500);
|
|
169
104
|
};
|
|
170
|
-
return /* @__PURE__ */
|
|
171
|
-
(showLabel && !!label || collapsing) && /* @__PURE__ */
|
|
172
|
-
showLabel && !!label && /* @__PURE__ */
|
|
173
|
-
collapsing && /* @__PURE__ */
|
|
105
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
106
|
+
(showLabel && !!label || collapsing) && /* @__PURE__ */ jsxs("div", { className: "mb-4 flex items-center gap-2", children: [
|
|
107
|
+
showLabel && !!label && /* @__PURE__ */ jsx("span", { className: "text-lg font-bold", children: label }),
|
|
108
|
+
collapsing && /* @__PURE__ */ jsxs(
|
|
174
109
|
"button",
|
|
175
110
|
{
|
|
176
111
|
onClick: () => setExpanded(!expanded),
|
|
177
112
|
className: "cursor-pointer ml-auto flex items-center gap-1.5 text-sm text-base-contrast-light hover:text-base-contrast",
|
|
178
113
|
children: [
|
|
179
|
-
/* @__PURE__ */
|
|
180
|
-
expanded ? /* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ jsx("span", { children: expanded ? "Hide Details" : "Show Details" }),
|
|
115
|
+
expanded ? /* @__PURE__ */ jsx(EyeOff, { size: 16 }) : /* @__PURE__ */ jsx(Eye, { size: 16 })
|
|
181
116
|
]
|
|
182
117
|
}
|
|
183
118
|
)
|
|
184
119
|
] }),
|
|
185
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ jsx("div", { className: "@container", children: /* @__PURE__ */ jsx("div", { className: cn("grid gap-4", containerGridClass[columns] || containerGridClass[3]), children: colors.map((color, i) => {
|
|
186
121
|
const hex = color.spaces[0]?.hex;
|
|
187
122
|
const contrast = getContrastClass(hex);
|
|
188
|
-
return /* @__PURE__ */
|
|
189
|
-
/* @__PURE__ */
|
|
190
|
-
color.name && /* @__PURE__ */
|
|
191
|
-
copiedIndex === i && /* @__PURE__ */
|
|
123
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col overflow-hidden rounded-outer border border-base-200", children: [
|
|
124
|
+
/* @__PURE__ */ jsxs("div", { className: cn("relative flex min-h-[80px] items-end p-3", contrast), style: { backgroundColor: hex || "#ccc" }, children: [
|
|
125
|
+
color.name && /* @__PURE__ */ jsx("span", { className: "text-sm font-bold", children: color.name }),
|
|
126
|
+
copiedIndex === i && /* @__PURE__ */ jsx("span", { className: cn(
|
|
192
127
|
"absolute top-2 right-2 rounded-full px-2.5 py-0.5 text-xs font-medium",
|
|
193
128
|
getContrastClass(hex) === "text-black" ? "bg-black/15 text-black" : "bg-white/25 text-white"
|
|
194
129
|
), children: "Copied!" })
|
|
195
130
|
] }),
|
|
196
131
|
expanded && // flex-1 so every swatch's label block grows to the tallest in its row.
|
|
197
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 space-y-1 bg-base-accent p-3 text-sm", children: color.spaces.map(
|
|
198
133
|
(space, j) => Object.entries(space).map(
|
|
199
|
-
([key, value]) => value ? /* @__PURE__ */
|
|
200
|
-
/* @__PURE__ */
|
|
201
|
-
/* @__PURE__ */
|
|
134
|
+
([key, value]) => value ? /* @__PURE__ */ jsxs("button", { onClick: () => handleCopy(value, i), className: "cursor-pointer flex w-full justify-between hover:text-primary", children: [
|
|
135
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium uppercase", children: key }),
|
|
136
|
+
/* @__PURE__ */ jsx("span", { children: value })
|
|
202
137
|
] }, `${j}-${key}`) : null
|
|
203
138
|
)
|
|
204
139
|
) })
|
|
@@ -206,6 +141,62 @@ function ColorsView({
|
|
|
206
141
|
}) }) })
|
|
207
142
|
] });
|
|
208
143
|
}
|
|
144
|
+
|
|
145
|
+
// src/components/brandguide/ColorsEditable.tsx
|
|
146
|
+
import { useState as useState3, useEffect } from "react";
|
|
147
|
+
import { Eye as Eye2, EyeOff as EyeOff2 } from "lucide-react";
|
|
148
|
+
|
|
149
|
+
// src/components/brandguide/ColorSwatchSettings.tsx
|
|
150
|
+
import { useState as useState2 } from "react";
|
|
151
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
152
|
+
function mergeSpaces(spaces) {
|
|
153
|
+
return Object.assign({}, ...spaces);
|
|
154
|
+
}
|
|
155
|
+
function ColorSwatchSettings({ color, onChange }) {
|
|
156
|
+
const [localColor, setLocalColor] = useState2(() => ({
|
|
157
|
+
...color,
|
|
158
|
+
spaces: [mergeSpaces(color.spaces)]
|
|
159
|
+
}));
|
|
160
|
+
const space = localColor.spaces[0] || {};
|
|
161
|
+
const update = (updated) => {
|
|
162
|
+
setLocalColor(updated);
|
|
163
|
+
onChange(updated);
|
|
164
|
+
};
|
|
165
|
+
const updateSpace = (key, value) => {
|
|
166
|
+
const newSpace = { ...space, [key]: value || void 0 };
|
|
167
|
+
update({ ...localColor, spaces: [newSpace] });
|
|
168
|
+
};
|
|
169
|
+
return /* @__PURE__ */ jsxs2("div", { className: "space-y-3", children: [
|
|
170
|
+
/* @__PURE__ */ jsx2(
|
|
171
|
+
Input,
|
|
172
|
+
{
|
|
173
|
+
label: "Name",
|
|
174
|
+
value: localColor.name || "",
|
|
175
|
+
onChange: (name) => update({ ...localColor, name })
|
|
176
|
+
}
|
|
177
|
+
),
|
|
178
|
+
["hex", "rgb", "cmyk", "pantone"].map((key) => /* @__PURE__ */ jsx2(
|
|
179
|
+
Input,
|
|
180
|
+
{
|
|
181
|
+
label: key.toUpperCase(),
|
|
182
|
+
value: space[key] || "",
|
|
183
|
+
onChange: (value) => updateSpace(key, value)
|
|
184
|
+
},
|
|
185
|
+
key
|
|
186
|
+
))
|
|
187
|
+
] });
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// src/components/brandguide/ColorsEditable.tsx
|
|
191
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
192
|
+
function buildContent(colors, options) {
|
|
193
|
+
const { label, columns, collapsing, showLabel } = options;
|
|
194
|
+
return {
|
|
195
|
+
type: "colors",
|
|
196
|
+
content: { colors },
|
|
197
|
+
...label || columns || collapsing !== void 0 || showLabel !== void 0 ? { options: { label, columns, collapsing, showLabel } } : {}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
209
200
|
function ColorsEditable({
|
|
210
201
|
colors,
|
|
211
202
|
columns,
|
|
@@ -216,7 +207,7 @@ function ColorsEditable({
|
|
|
216
207
|
openModal,
|
|
217
208
|
onDelete
|
|
218
209
|
}) {
|
|
219
|
-
const [expanded, setExpanded] =
|
|
210
|
+
const [expanded, setExpanded] = useState3(!collapsing);
|
|
220
211
|
const options = { label, columns, collapsing, showLabel };
|
|
221
212
|
useEffect(() => {
|
|
222
213
|
setExpanded(!collapsing);
|
|
@@ -225,15 +216,15 @@ function ColorsEditable({
|
|
|
225
216
|
const color = colors[index];
|
|
226
217
|
openModal(
|
|
227
218
|
"Color Settings",
|
|
228
|
-
/* @__PURE__ */
|
|
219
|
+
/* @__PURE__ */ jsx3(ColorSwatchSettings, { color, onChange: (updated) => {
|
|
229
220
|
const newColors = colors.map((c, i) => i === index ? updated : c);
|
|
230
221
|
onChange(buildContent(newColors, options));
|
|
231
222
|
} })
|
|
232
223
|
);
|
|
233
224
|
};
|
|
234
|
-
return /* @__PURE__ */
|
|
235
|
-
(showLabel && !!label || collapsing) && /* @__PURE__ */
|
|
236
|
-
showLabel && !!label && /* @__PURE__ */
|
|
225
|
+
return /* @__PURE__ */ jsxs3("div", { children: [
|
|
226
|
+
(showLabel && !!label || collapsing) && /* @__PURE__ */ jsxs3("div", { className: "mb-4 flex items-center gap-2", children: [
|
|
227
|
+
showLabel && !!label && /* @__PURE__ */ jsx3(
|
|
237
228
|
EditablePlainText,
|
|
238
229
|
{
|
|
239
230
|
tag: "span",
|
|
@@ -243,19 +234,19 @@ function ColorsEditable({
|
|
|
243
234
|
className: "text-lg font-bold"
|
|
244
235
|
}
|
|
245
236
|
),
|
|
246
|
-
collapsing && /* @__PURE__ */
|
|
237
|
+
collapsing && /* @__PURE__ */ jsxs3(
|
|
247
238
|
"button",
|
|
248
239
|
{
|
|
249
240
|
onClick: () => setExpanded(!expanded),
|
|
250
241
|
className: "cursor-pointer ml-auto flex items-center gap-1.5 text-sm text-base-contrast-light hover:text-base-contrast",
|
|
251
242
|
children: [
|
|
252
|
-
/* @__PURE__ */
|
|
253
|
-
expanded ? /* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ jsx3("span", { children: expanded ? "Hide Details" : "Show Details" }),
|
|
244
|
+
expanded ? /* @__PURE__ */ jsx3(EyeOff2, { size: 16 }) : /* @__PURE__ */ jsx3(Eye2, { size: 16 })
|
|
254
245
|
]
|
|
255
246
|
}
|
|
256
247
|
)
|
|
257
248
|
] }),
|
|
258
|
-
/* @__PURE__ */
|
|
249
|
+
/* @__PURE__ */ jsx3(
|
|
259
250
|
EditableGrid,
|
|
260
251
|
{
|
|
261
252
|
items: colors,
|
|
@@ -266,7 +257,7 @@ function ColorsEditable({
|
|
|
266
257
|
createItem: createColorItem,
|
|
267
258
|
isEditMode: true,
|
|
268
259
|
onItemSettings: handleItemSettings,
|
|
269
|
-
renderItem: (color, { index }) => /* @__PURE__ */
|
|
260
|
+
renderItem: (color, { index }) => /* @__PURE__ */ jsx3(
|
|
270
261
|
ColorSwatchEditable,
|
|
271
262
|
{
|
|
272
263
|
color,
|
|
@@ -295,8 +286,8 @@ function ColorSwatchEditable({
|
|
|
295
286
|
const newColors = colors.map((c, i) => i === index ? updated : c);
|
|
296
287
|
onChange(buildContent(newColors, options));
|
|
297
288
|
};
|
|
298
|
-
return /* @__PURE__ */
|
|
299
|
-
/* @__PURE__ */
|
|
289
|
+
return /* @__PURE__ */ jsxs3("div", { className: "flex h-full flex-col overflow-hidden rounded-outer border border-base-200", children: [
|
|
290
|
+
/* @__PURE__ */ jsx3("div", { className: cn("flex min-h-[80px] items-end p-3", contrast), style: { backgroundColor: hex || "#ccc" }, children: /* @__PURE__ */ jsx3(
|
|
300
291
|
EditablePlainText,
|
|
301
292
|
{
|
|
302
293
|
tag: "span",
|
|
@@ -308,17 +299,38 @@ function ColorSwatchEditable({
|
|
|
308
299
|
}
|
|
309
300
|
) }),
|
|
310
301
|
expanded && // flex-1 so every swatch's label block grows to the tallest in its row.
|
|
311
|
-
/* @__PURE__ */
|
|
302
|
+
/* @__PURE__ */ jsx3("div", { className: "flex-1 space-y-1 bg-base-accent p-3 text-sm", children: color.spaces.map(
|
|
312
303
|
(space, j) => Object.entries(space).map(
|
|
313
|
-
([key, value]) => value ? /* @__PURE__ */
|
|
314
|
-
/* @__PURE__ */
|
|
315
|
-
/* @__PURE__ */
|
|
304
|
+
([key, value]) => value ? /* @__PURE__ */ jsxs3("div", { className: "flex w-full justify-between", children: [
|
|
305
|
+
/* @__PURE__ */ jsx3("span", { className: "font-medium uppercase", children: key }),
|
|
306
|
+
/* @__PURE__ */ jsx3("span", { children: value })
|
|
316
307
|
] }, `${j}-${key}`) : null
|
|
317
308
|
)
|
|
318
309
|
) })
|
|
319
310
|
] });
|
|
320
311
|
}
|
|
321
312
|
|
|
313
|
+
// src/components/brandguide/Colors.tsx
|
|
314
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
315
|
+
function Colors({ colors, columns = 3, label, collapsing, showLabel = true, onChange, openModal, onDelete }) {
|
|
316
|
+
if (onChange && openModal) {
|
|
317
|
+
return /* @__PURE__ */ jsx4(
|
|
318
|
+
ColorsEditable,
|
|
319
|
+
{
|
|
320
|
+
colors,
|
|
321
|
+
columns,
|
|
322
|
+
label,
|
|
323
|
+
collapsing,
|
|
324
|
+
showLabel,
|
|
325
|
+
onChange,
|
|
326
|
+
openModal,
|
|
327
|
+
onDelete
|
|
328
|
+
}
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
return /* @__PURE__ */ jsx4(ColorsView, { colors, columns, label, collapsing, showLabel });
|
|
332
|
+
}
|
|
333
|
+
|
|
322
334
|
// src/lib/text.ts
|
|
323
335
|
function stripHtmlToPlainText(html) {
|
|
324
336
|
return html.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1>/gi, "").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
|
|
@@ -332,7 +344,7 @@ function pluralize(n, word) {
|
|
|
332
344
|
}
|
|
333
345
|
|
|
334
346
|
// src/components/sections/Colors/index.tsx
|
|
335
|
-
import { jsx as
|
|
347
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
336
348
|
var schema = z2.object({
|
|
337
349
|
type: z2.literal("colors"),
|
|
338
350
|
content: z2.object({
|
|
@@ -347,12 +359,13 @@ var schema = z2.object({
|
|
|
347
359
|
});
|
|
348
360
|
var Colors_default = defineSection({
|
|
349
361
|
type: "colors",
|
|
362
|
+
interactive: true,
|
|
350
363
|
category: "brand-guide",
|
|
351
364
|
label: "Colors",
|
|
352
|
-
icon: /* @__PURE__ */
|
|
365
|
+
icon: /* @__PURE__ */ jsx5(Palette, { size: 18 }),
|
|
353
366
|
schema,
|
|
354
367
|
authoringNote: "A brand color palette. Each color may carry hex/rgb/cmyk/pantone values. Use to document brand colors with swatches.",
|
|
355
|
-
component: ({ content, options, onChange, openModal, onDelete }) => /* @__PURE__ */
|
|
368
|
+
component: ({ content, options, onChange, openModal, onDelete }) => /* @__PURE__ */ jsx5(
|
|
356
369
|
Colors,
|
|
357
370
|
{
|
|
358
371
|
colors: content.content.colors,
|
|
@@ -390,12 +403,12 @@ import { z as z3 } from "zod";
|
|
|
390
403
|
import { List, Columns2 } from "lucide-react";
|
|
391
404
|
|
|
392
405
|
// src/components/sections/IconList/IconList.tsx
|
|
393
|
-
import { useRef as useRef3, useEffect as useEffect4, useState as
|
|
406
|
+
import { useRef as useRef3, useEffect as useEffect4, useState as useState4, useCallback } from "react";
|
|
394
407
|
import { Check as Check2, CopyPlus, Pencil, X as X2 } from "lucide-react";
|
|
395
408
|
|
|
396
409
|
// src/components/primitives/IconPicker.tsx
|
|
397
410
|
import { useEffect as useEffect2, useRef } from "react";
|
|
398
|
-
import { jsx as
|
|
411
|
+
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
399
412
|
function IconPicker({ selected, onSelect, onClose, showRemove = true }) {
|
|
400
413
|
const panelRef = useRef(null);
|
|
401
414
|
useEffect2(() => {
|
|
@@ -405,16 +418,16 @@ function IconPicker({ selected, onSelect, onClose, showRemove = true }) {
|
|
|
405
418
|
document.addEventListener("mousedown", handleMouseDown);
|
|
406
419
|
return () => document.removeEventListener("mousedown", handleMouseDown);
|
|
407
420
|
}, [onClose]);
|
|
408
|
-
return /* @__PURE__ */
|
|
421
|
+
return /* @__PURE__ */ jsxs4(
|
|
409
422
|
"div",
|
|
410
423
|
{
|
|
411
424
|
ref: panelRef,
|
|
412
425
|
className: "absolute z-50 w-56 rounded-lg border border-base-200 bg-base p-2 shadow-lg",
|
|
413
426
|
children: [
|
|
414
|
-
/* @__PURE__ */
|
|
427
|
+
/* @__PURE__ */ jsx6("div", { className: "grid grid-cols-5 gap-1", children: curatedIcons.map((entry) => {
|
|
415
428
|
const Icon = entry.icon;
|
|
416
429
|
const isSelected = selected === entry.id;
|
|
417
|
-
return /* @__PURE__ */
|
|
430
|
+
return /* @__PURE__ */ jsx6(
|
|
418
431
|
"button",
|
|
419
432
|
{
|
|
420
433
|
"aria-label": entry.label,
|
|
@@ -424,12 +437,12 @@ function IconPicker({ selected, onSelect, onClose, showRemove = true }) {
|
|
|
424
437
|
isSelected && "ring-2 ring-primary bg-base-accent text-primary"
|
|
425
438
|
),
|
|
426
439
|
onClick: () => onSelect(entry.id),
|
|
427
|
-
children: /* @__PURE__ */
|
|
440
|
+
children: /* @__PURE__ */ jsx6(Icon, { size: 18 })
|
|
428
441
|
},
|
|
429
442
|
entry.id
|
|
430
443
|
);
|
|
431
444
|
}) }),
|
|
432
|
-
showRemove && /* @__PURE__ */
|
|
445
|
+
showRemove && /* @__PURE__ */ jsx6(
|
|
433
446
|
"button",
|
|
434
447
|
{
|
|
435
448
|
className: "cursor-pointer mt-2 w-full rounded px-2 py-1.5 text-center text-xs text-base-contrast-light hover:bg-base-accent hover:text-base-contrast",
|
|
@@ -445,7 +458,7 @@ function IconPicker({ selected, onSelect, onClose, showRemove = true }) {
|
|
|
445
458
|
// src/components/sections/IconList/DoDontToggle.tsx
|
|
446
459
|
import { useEffect as useEffect3, useRef as useRef2 } from "react";
|
|
447
460
|
import { Check, X } from "lucide-react";
|
|
448
|
-
import { jsx as
|
|
461
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
449
462
|
function DoDontToggle({ value, onSelect, onClose }) {
|
|
450
463
|
const panelRef = useRef2(null);
|
|
451
464
|
useEffect3(() => {
|
|
@@ -455,13 +468,13 @@ function DoDontToggle({ value, onSelect, onClose }) {
|
|
|
455
468
|
document.addEventListener("mousedown", handleMouseDown);
|
|
456
469
|
return () => document.removeEventListener("mousedown", handleMouseDown);
|
|
457
470
|
}, [onClose]);
|
|
458
|
-
return /* @__PURE__ */
|
|
471
|
+
return /* @__PURE__ */ jsx7(
|
|
459
472
|
"div",
|
|
460
473
|
{
|
|
461
474
|
ref: panelRef,
|
|
462
475
|
className: "absolute z-50 w-44 rounded-lg border border-base-200 bg-base p-2 shadow-lg",
|
|
463
|
-
children: /* @__PURE__ */
|
|
464
|
-
/* @__PURE__ */
|
|
476
|
+
children: /* @__PURE__ */ jsxs5("div", { className: "grid grid-cols-3 gap-2", children: [
|
|
477
|
+
/* @__PURE__ */ jsxs5(
|
|
465
478
|
"button",
|
|
466
479
|
{
|
|
467
480
|
type: "button",
|
|
@@ -473,12 +486,12 @@ function DoDontToggle({ value, onSelect, onClose }) {
|
|
|
473
486
|
),
|
|
474
487
|
onClick: () => onSelect(void 0),
|
|
475
488
|
children: [
|
|
476
|
-
/* @__PURE__ */
|
|
477
|
-
/* @__PURE__ */
|
|
489
|
+
/* @__PURE__ */ jsx7("span", { className: "flex h-5 w-5 items-center justify-center rounded-sm border border-dashed border-base-contrast-light/40" }),
|
|
490
|
+
/* @__PURE__ */ jsx7("span", { className: "text-xs font-medium", children: "None" })
|
|
478
491
|
]
|
|
479
492
|
}
|
|
480
493
|
),
|
|
481
|
-
/* @__PURE__ */
|
|
494
|
+
/* @__PURE__ */ jsxs5(
|
|
482
495
|
"button",
|
|
483
496
|
{
|
|
484
497
|
type: "button",
|
|
@@ -490,12 +503,12 @@ function DoDontToggle({ value, onSelect, onClose }) {
|
|
|
490
503
|
),
|
|
491
504
|
onClick: () => onSelect("do"),
|
|
492
505
|
children: [
|
|
493
|
-
/* @__PURE__ */
|
|
494
|
-
/* @__PURE__ */
|
|
506
|
+
/* @__PURE__ */ jsx7(Check, { size: 20 }),
|
|
507
|
+
/* @__PURE__ */ jsx7("span", { className: "text-xs font-medium", children: "Do" })
|
|
495
508
|
]
|
|
496
509
|
}
|
|
497
510
|
),
|
|
498
|
-
/* @__PURE__ */
|
|
511
|
+
/* @__PURE__ */ jsxs5(
|
|
499
512
|
"button",
|
|
500
513
|
{
|
|
501
514
|
type: "button",
|
|
@@ -507,8 +520,8 @@ function DoDontToggle({ value, onSelect, onClose }) {
|
|
|
507
520
|
),
|
|
508
521
|
onClick: () => onSelect("dont"),
|
|
509
522
|
children: [
|
|
510
|
-
/* @__PURE__ */
|
|
511
|
-
/* @__PURE__ */
|
|
523
|
+
/* @__PURE__ */ jsx7(X, { size: 20 }),
|
|
524
|
+
/* @__PURE__ */ jsx7("span", { className: "text-xs font-medium", children: "Don't" })
|
|
512
525
|
]
|
|
513
526
|
}
|
|
514
527
|
)
|
|
@@ -518,7 +531,7 @@ function DoDontToggle({ value, onSelect, onClose }) {
|
|
|
518
531
|
}
|
|
519
532
|
|
|
520
533
|
// src/components/sections/IconList/IconList.tsx
|
|
521
|
-
import { jsx as
|
|
534
|
+
import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
522
535
|
function IconList({
|
|
523
536
|
items,
|
|
524
537
|
icon = null,
|
|
@@ -544,7 +557,7 @@ function IconList({
|
|
|
544
557
|
[onChange, onItemsChange, icon, showLabel, stackText, dodont]
|
|
545
558
|
);
|
|
546
559
|
if (!isEditMode) {
|
|
547
|
-
return /* @__PURE__ */
|
|
560
|
+
return /* @__PURE__ */ jsx8(
|
|
548
561
|
ViewIconList,
|
|
549
562
|
{
|
|
550
563
|
items,
|
|
@@ -558,7 +571,7 @@ function IconList({
|
|
|
558
571
|
}
|
|
559
572
|
);
|
|
560
573
|
}
|
|
561
|
-
return /* @__PURE__ */
|
|
574
|
+
return /* @__PURE__ */ jsx8(
|
|
562
575
|
EditIconList,
|
|
563
576
|
{
|
|
564
577
|
items,
|
|
@@ -600,10 +613,10 @@ function ViewIconList({
|
|
|
600
613
|
iconClassName
|
|
601
614
|
}) {
|
|
602
615
|
const hasAnyIcon = items.some((item) => resolveIcon(item, defaultIcon, dodont));
|
|
603
|
-
return /* @__PURE__ */
|
|
616
|
+
return /* @__PURE__ */ jsx8("div", { className: "grid gap-4 pb-4", children: items.map((item, i) => {
|
|
604
617
|
const iconEntry = resolveIcon(item, defaultIcon, dodont);
|
|
605
618
|
const iconColor = resolveIconColor(item, iconClassName, dodont);
|
|
606
|
-
return /* @__PURE__ */
|
|
619
|
+
return /* @__PURE__ */ jsxs6(
|
|
607
620
|
"div",
|
|
608
621
|
{
|
|
609
622
|
className: cn(
|
|
@@ -611,25 +624,25 @@ function ViewIconList({
|
|
|
611
624
|
hasAnyIcon ? "grid-cols-[24px_1fr]" : "grid-cols-1"
|
|
612
625
|
),
|
|
613
626
|
children: [
|
|
614
|
-
hasAnyIcon && /* @__PURE__ */
|
|
627
|
+
hasAnyIcon && /* @__PURE__ */ jsx8(
|
|
615
628
|
"div",
|
|
616
629
|
{
|
|
617
630
|
"data-testid": "icon-list-icon",
|
|
618
631
|
className: cn("flex items-start pt-0.5", iconColor),
|
|
619
|
-
children: iconEntry && /* @__PURE__ */
|
|
632
|
+
children: iconEntry && /* @__PURE__ */ jsx8(iconEntry.icon, { size: 18 })
|
|
620
633
|
}
|
|
621
634
|
),
|
|
622
|
-
/* @__PURE__ */
|
|
635
|
+
/* @__PURE__ */ jsxs6(
|
|
623
636
|
"div",
|
|
624
637
|
{
|
|
625
638
|
"data-testid": "icon-list-content",
|
|
626
639
|
className: stackText ? "flex flex-col" : void 0,
|
|
627
640
|
children: [
|
|
628
|
-
showLabel && /* @__PURE__ */
|
|
641
|
+
showLabel && /* @__PURE__ */ jsxs6("span", { className: labelClassName, children: [
|
|
629
642
|
item.label,
|
|
630
643
|
!stackText && " "
|
|
631
644
|
] }),
|
|
632
|
-
/* @__PURE__ */
|
|
645
|
+
/* @__PURE__ */ jsx8("span", { className: textClassName, children: item.text })
|
|
633
646
|
]
|
|
634
647
|
}
|
|
635
648
|
)
|
|
@@ -655,7 +668,7 @@ function EditIconList({
|
|
|
655
668
|
onChange: onItemsChange,
|
|
656
669
|
createItem: () => ({ label: "", text: "" })
|
|
657
670
|
});
|
|
658
|
-
const [dragState, setDragState] =
|
|
671
|
+
const [dragState, setDragState] = useState4({ sourceId: null, targetId: null });
|
|
659
672
|
const updateItem = useCallback(
|
|
660
673
|
(index, patch) => {
|
|
661
674
|
const updated = wrappedItems.map(
|
|
@@ -678,8 +691,8 @@ function EditIconList({
|
|
|
678
691
|
[wrappedItems, onItemsChange]
|
|
679
692
|
);
|
|
680
693
|
const hasAnyIcon = true;
|
|
681
|
-
return /* @__PURE__ */
|
|
682
|
-
wrappedItems.map((wrapped, index) => /* @__PURE__ */
|
|
694
|
+
return /* @__PURE__ */ jsxs6("div", { className: "group/list relative grid gap-4 pb-4", children: [
|
|
695
|
+
wrappedItems.map((wrapped, index) => /* @__PURE__ */ jsx8(
|
|
683
696
|
EditableRow,
|
|
684
697
|
{
|
|
685
698
|
id: wrapped.id,
|
|
@@ -702,7 +715,7 @@ function EditIconList({
|
|
|
702
715
|
},
|
|
703
716
|
wrapped.id
|
|
704
717
|
)),
|
|
705
|
-
/* @__PURE__ */
|
|
718
|
+
/* @__PURE__ */ jsx8(
|
|
706
719
|
TrailingDropZone,
|
|
707
720
|
{
|
|
708
721
|
index: wrappedItems.length,
|
|
@@ -711,10 +724,10 @@ function EditIconList({
|
|
|
711
724
|
onReorder
|
|
712
725
|
}
|
|
713
726
|
),
|
|
714
|
-
/* @__PURE__ */
|
|
727
|
+
/* @__PURE__ */ jsx8(
|
|
715
728
|
IconButton,
|
|
716
729
|
{
|
|
717
|
-
icon: /* @__PURE__ */
|
|
730
|
+
icon: /* @__PURE__ */ jsx8(AddIcon, { size: 16 }),
|
|
718
731
|
label: "Add item",
|
|
719
732
|
size: "lg",
|
|
720
733
|
intent: "primary",
|
|
@@ -745,10 +758,10 @@ function EditableRow({
|
|
|
745
758
|
}) {
|
|
746
759
|
const rowRef = useRef3(null);
|
|
747
760
|
const handleRef = useRef3(null);
|
|
748
|
-
const [iconHover, setIconHover] =
|
|
749
|
-
const [pickerOpen, setPickerOpen] =
|
|
750
|
-
const [dodontOpen, setDodontOpen] =
|
|
751
|
-
const [editingSuppressed, setEditingSuppressed] =
|
|
761
|
+
const [iconHover, setIconHover] = useState4(false);
|
|
762
|
+
const [pickerOpen, setPickerOpen] = useState4(false);
|
|
763
|
+
const [dodontOpen, setDodontOpen] = useState4(false);
|
|
764
|
+
const [editingSuppressed, setEditingSuppressed] = useState4(false);
|
|
752
765
|
const iconEntry = resolveIcon(item, defaultIcon, dodont);
|
|
753
766
|
const effectiveIconId = item.icon ?? defaultIcon ?? null;
|
|
754
767
|
const iconColor = resolveIconColor(item, iconClassName, dodont);
|
|
@@ -796,7 +809,7 @@ function EditableRow({
|
|
|
796
809
|
setEditingSuppressed(true);
|
|
797
810
|
}
|
|
798
811
|
};
|
|
799
|
-
return /* @__PURE__ */
|
|
812
|
+
return /* @__PURE__ */ jsxs6(
|
|
800
813
|
"div",
|
|
801
814
|
{
|
|
802
815
|
ref: rowRef,
|
|
@@ -809,7 +822,7 @@ function EditableRow({
|
|
|
809
822
|
onInput: onEditableActivity,
|
|
810
823
|
onMouseMove: () => setEditingSuppressed(false),
|
|
811
824
|
children: [
|
|
812
|
-
hasAnyIcon && /* @__PURE__ */
|
|
825
|
+
hasAnyIcon && /* @__PURE__ */ jsxs6(
|
|
813
826
|
"div",
|
|
814
827
|
{
|
|
815
828
|
"data-testid": "icon-list-icon",
|
|
@@ -817,7 +830,7 @@ function EditableRow({
|
|
|
817
830
|
onMouseEnter: () => setIconHover(true),
|
|
818
831
|
onMouseLeave: () => setIconHover(false),
|
|
819
832
|
children: [
|
|
820
|
-
/* @__PURE__ */
|
|
833
|
+
/* @__PURE__ */ jsx8(
|
|
821
834
|
"button",
|
|
822
835
|
{
|
|
823
836
|
className: "cursor-pointer transition-opacity hover:opacity-70",
|
|
@@ -826,10 +839,10 @@ function EditableRow({
|
|
|
826
839
|
setPickerOpen((prev) => !prev);
|
|
827
840
|
setDodontOpen(false);
|
|
828
841
|
},
|
|
829
|
-
children: iconHover && !pickerOpen ? /* @__PURE__ */
|
|
842
|
+
children: iconHover && !pickerOpen ? /* @__PURE__ */ jsx8(Pencil, { size: 18, className: "text-base-contrast-light" }) : iconEntry ? /* @__PURE__ */ jsx8(iconEntry.icon, { size: 18 }) : /* @__PURE__ */ jsx8("span", { className: "flex h-[18px] w-[18px] items-center justify-center rounded-sm border border-dashed border-base-contrast-light/40" })
|
|
830
843
|
}
|
|
831
844
|
),
|
|
832
|
-
pickerOpen && /* @__PURE__ */
|
|
845
|
+
pickerOpen && /* @__PURE__ */ jsx8("div", { className: "absolute top-full left-0 z-50 mt-1", children: /* @__PURE__ */ jsx8(
|
|
833
846
|
IconPicker,
|
|
834
847
|
{
|
|
835
848
|
selected: effectiveIconId,
|
|
@@ -848,8 +861,8 @@ function EditableRow({
|
|
|
848
861
|
]
|
|
849
862
|
}
|
|
850
863
|
),
|
|
851
|
-
/* @__PURE__ */
|
|
852
|
-
showLabel && /* @__PURE__ */
|
|
864
|
+
/* @__PURE__ */ jsxs6("div", { className: stackText ? "flex flex-col" : void 0, children: [
|
|
865
|
+
showLabel && /* @__PURE__ */ jsx8(
|
|
853
866
|
EditablePlainText,
|
|
854
867
|
{
|
|
855
868
|
tag: "span",
|
|
@@ -860,7 +873,7 @@ function EditableRow({
|
|
|
860
873
|
className: cn(labelClassName, !stackText && "mr-1")
|
|
861
874
|
}
|
|
862
875
|
),
|
|
863
|
-
/* @__PURE__ */
|
|
876
|
+
/* @__PURE__ */ jsx8(
|
|
864
877
|
EditablePlainText,
|
|
865
878
|
{
|
|
866
879
|
tag: "span",
|
|
@@ -872,7 +885,7 @@ function EditableRow({
|
|
|
872
885
|
}
|
|
873
886
|
)
|
|
874
887
|
] }),
|
|
875
|
-
/* @__PURE__ */
|
|
888
|
+
/* @__PURE__ */ jsxs6(
|
|
876
889
|
"div",
|
|
877
890
|
{
|
|
878
891
|
className: cn(
|
|
@@ -880,8 +893,8 @@ function EditableRow({
|
|
|
880
893
|
editingSuppressed ? "opacity-0 pointer-events-none" : "opacity-0 group-hover/row:opacity-100 no-hover:opacity-100"
|
|
881
894
|
),
|
|
882
895
|
children: [
|
|
883
|
-
/* @__PURE__ */
|
|
884
|
-
/* @__PURE__ */
|
|
896
|
+
/* @__PURE__ */ jsxs6("div", { className: "relative", children: [
|
|
897
|
+
/* @__PURE__ */ jsx8(
|
|
885
898
|
"button",
|
|
886
899
|
{
|
|
887
900
|
"aria-label": "Set do/don't",
|
|
@@ -890,10 +903,10 @@ function EditableRow({
|
|
|
890
903
|
setPickerOpen(false);
|
|
891
904
|
},
|
|
892
905
|
className: "cursor-pointer rounded bg-base/80 p-1 shadow-sm text-base-contrast-light hover:text-primary",
|
|
893
|
-
children: item.dodont === "do" ? /* @__PURE__ */
|
|
906
|
+
children: item.dodont === "do" ? /* @__PURE__ */ jsx8(Check2, { size: 14, className: "text-green-600" }) : item.dodont === "dont" ? /* @__PURE__ */ jsx8(X2, { size: 14, className: "text-red-600" }) : /* @__PURE__ */ jsx8(Pencil, { size: 14 })
|
|
894
907
|
}
|
|
895
908
|
),
|
|
896
|
-
dodontOpen && /* @__PURE__ */
|
|
909
|
+
dodontOpen && /* @__PURE__ */ jsx8("div", { className: "absolute top-full right-0 z-50 mt-1", children: /* @__PURE__ */ jsx8(
|
|
897
910
|
DoDontToggle,
|
|
898
911
|
{
|
|
899
912
|
value: item.dodont,
|
|
@@ -905,30 +918,30 @@ function EditableRow({
|
|
|
905
918
|
}
|
|
906
919
|
) })
|
|
907
920
|
] }),
|
|
908
|
-
/* @__PURE__ */
|
|
921
|
+
/* @__PURE__ */ jsx8(
|
|
909
922
|
IconButton,
|
|
910
923
|
{
|
|
911
924
|
ref: handleRef,
|
|
912
|
-
icon: /* @__PURE__ */
|
|
925
|
+
icon: /* @__PURE__ */ jsx8(DragHandle, { size: 14 }),
|
|
913
926
|
label: "Drag to reorder",
|
|
914
927
|
size: "sm",
|
|
915
928
|
className: "cursor-grab rounded bg-base/80 p-1 shadow-sm text-base-contrast-light/80 hover:text-base-contrast active:cursor-grabbing",
|
|
916
929
|
tabIndex: -1
|
|
917
930
|
}
|
|
918
931
|
),
|
|
919
|
-
/* @__PURE__ */
|
|
932
|
+
/* @__PURE__ */ jsx8(
|
|
920
933
|
"button",
|
|
921
934
|
{
|
|
922
935
|
"aria-label": "Duplicate item",
|
|
923
936
|
onClick: onDuplicate,
|
|
924
937
|
className: "cursor-pointer rounded bg-base/80 p-1 shadow-sm text-base-contrast-light hover:text-primary",
|
|
925
|
-
children: /* @__PURE__ */
|
|
938
|
+
children: /* @__PURE__ */ jsx8(CopyPlus, { size: 14 })
|
|
926
939
|
}
|
|
927
940
|
),
|
|
928
|
-
/* @__PURE__ */
|
|
941
|
+
/* @__PURE__ */ jsx8(
|
|
929
942
|
IconButton,
|
|
930
943
|
{
|
|
931
|
-
icon: /* @__PURE__ */
|
|
944
|
+
icon: /* @__PURE__ */ jsx8(DeleteIcon, { size: 14 }),
|
|
932
945
|
label: "Delete item",
|
|
933
946
|
size: "sm",
|
|
934
947
|
intent: "destructive",
|
|
@@ -978,7 +991,7 @@ function TrailingDropZone({
|
|
|
978
991
|
};
|
|
979
992
|
}, [index, onReorder, setDragState]);
|
|
980
993
|
const isDropTarget = dragState.targetId === trailingId && dragState.sourceId !== null;
|
|
981
|
-
return /* @__PURE__ */
|
|
994
|
+
return /* @__PURE__ */ jsx8(
|
|
982
995
|
"div",
|
|
983
996
|
{
|
|
984
997
|
ref,
|
|
@@ -988,9 +1001,9 @@ function TrailingDropZone({
|
|
|
988
1001
|
}
|
|
989
1002
|
|
|
990
1003
|
// src/components/sections/IconList/IconListSettings.tsx
|
|
991
|
-
import { useState as
|
|
1004
|
+
import { useState as useState5 } from "react";
|
|
992
1005
|
import { Check as Check3, X as X3 } from "lucide-react";
|
|
993
|
-
import { jsx as
|
|
1006
|
+
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
994
1007
|
function IconListSettings({
|
|
995
1008
|
icon: initialIcon,
|
|
996
1009
|
showLabel: initialShowLabel,
|
|
@@ -998,15 +1011,15 @@ function IconListSettings({
|
|
|
998
1011
|
dodont: initialDodont,
|
|
999
1012
|
onChange
|
|
1000
1013
|
}) {
|
|
1001
|
-
const [icon, setIcon] =
|
|
1002
|
-
const [showLabel, setShowLabel] =
|
|
1003
|
-
const [stackText, setStackText] =
|
|
1004
|
-
const [dodont, setDodont] =
|
|
1005
|
-
const [pickerOpen, setPickerOpen] =
|
|
1014
|
+
const [icon, setIcon] = useState5(initialIcon);
|
|
1015
|
+
const [showLabel, setShowLabel] = useState5(initialShowLabel);
|
|
1016
|
+
const [stackText, setStackText] = useState5(initialStackText);
|
|
1017
|
+
const [dodont, setDodont] = useState5(initialDodont);
|
|
1018
|
+
const [pickerOpen, setPickerOpen] = useState5(false);
|
|
1006
1019
|
const emit = (overrides) => onChange({ content: {}, options: { icon, showLabel, stackText, dodont, ...overrides } });
|
|
1007
1020
|
const iconEntry = icon ? getIcon(icon) : null;
|
|
1008
1021
|
const dodontActive = dodont === "do" || dodont === "dont";
|
|
1009
|
-
const tile = (value, label, aria, glyph, tint) => /* @__PURE__ */
|
|
1022
|
+
const tile = (value, label, aria, glyph, tint) => /* @__PURE__ */ jsxs7(
|
|
1010
1023
|
"button",
|
|
1011
1024
|
{
|
|
1012
1025
|
type: "button",
|
|
@@ -1023,29 +1036,29 @@ function IconListSettings({
|
|
|
1023
1036
|
},
|
|
1024
1037
|
children: [
|
|
1025
1038
|
glyph,
|
|
1026
|
-
/* @__PURE__ */
|
|
1039
|
+
/* @__PURE__ */ jsx9("span", { className: "text-xs font-medium", children: label })
|
|
1027
1040
|
]
|
|
1028
1041
|
}
|
|
1029
1042
|
);
|
|
1030
|
-
return /* @__PURE__ */
|
|
1031
|
-
/* @__PURE__ */
|
|
1032
|
-
/* @__PURE__ */
|
|
1033
|
-
/* @__PURE__ */
|
|
1043
|
+
return /* @__PURE__ */ jsxs7("div", { className: "space-y-4", children: [
|
|
1044
|
+
/* @__PURE__ */ jsxs7("div", { children: [
|
|
1045
|
+
/* @__PURE__ */ jsx9(FormLabel, { children: "Do / Don't list" }),
|
|
1046
|
+
/* @__PURE__ */ jsxs7("div", { className: "grid grid-cols-3 gap-2", children: [
|
|
1034
1047
|
tile(
|
|
1035
1048
|
void 0,
|
|
1036
1049
|
"None",
|
|
1037
1050
|
"No do/don't",
|
|
1038
|
-
/* @__PURE__ */
|
|
1051
|
+
/* @__PURE__ */ jsx9("span", { className: "flex h-5 w-5 items-center justify-center rounded-sm border border-dashed border-base-contrast-light/40" }),
|
|
1039
1052
|
"text-base-contrast-light"
|
|
1040
1053
|
),
|
|
1041
|
-
tile("do", "Do", "Do list", /* @__PURE__ */
|
|
1042
|
-
tile("dont", "Don't", "Don't list", /* @__PURE__ */
|
|
1054
|
+
tile("do", "Do", "Do list", /* @__PURE__ */ jsx9(Check3, { size: 20 }), "text-green-600"),
|
|
1055
|
+
tile("dont", "Don't", "Don't list", /* @__PURE__ */ jsx9(X3, { size: 20 }), "text-red-600")
|
|
1043
1056
|
] })
|
|
1044
1057
|
] }),
|
|
1045
|
-
/* @__PURE__ */
|
|
1046
|
-
/* @__PURE__ */
|
|
1047
|
-
/* @__PURE__ */
|
|
1048
|
-
/* @__PURE__ */
|
|
1058
|
+
/* @__PURE__ */ jsxs7("div", { className: "relative", children: [
|
|
1059
|
+
/* @__PURE__ */ jsx9(FormLabel, { htmlFor: "icon-picker-btn", children: "Default Icon" }),
|
|
1060
|
+
/* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2", children: [
|
|
1061
|
+
/* @__PURE__ */ jsxs7(
|
|
1049
1062
|
"button",
|
|
1050
1063
|
{
|
|
1051
1064
|
id: "icon-picker-btn",
|
|
@@ -1058,12 +1071,12 @@ function IconListSettings({
|
|
|
1058
1071
|
if (!dodontActive) setPickerOpen((prev) => !prev);
|
|
1059
1072
|
},
|
|
1060
1073
|
children: [
|
|
1061
|
-
iconEntry && /* @__PURE__ */
|
|
1062
|
-
/* @__PURE__ */
|
|
1074
|
+
iconEntry && /* @__PURE__ */ jsx9(iconEntry.icon, { size: 16 }),
|
|
1075
|
+
/* @__PURE__ */ jsx9("span", { children: iconEntry?.label ?? "None" })
|
|
1063
1076
|
]
|
|
1064
1077
|
}
|
|
1065
1078
|
),
|
|
1066
|
-
icon && !dodontActive && /* @__PURE__ */
|
|
1079
|
+
icon && !dodontActive && /* @__PURE__ */ jsx9(
|
|
1067
1080
|
"button",
|
|
1068
1081
|
{
|
|
1069
1082
|
className: "cursor-pointer text-xs text-base-contrast-light hover:text-base-contrast",
|
|
@@ -1075,8 +1088,8 @@ function IconListSettings({
|
|
|
1075
1088
|
}
|
|
1076
1089
|
)
|
|
1077
1090
|
] }),
|
|
1078
|
-
dodontActive && /* @__PURE__ */
|
|
1079
|
-
pickerOpen && !dodontActive && /* @__PURE__ */
|
|
1091
|
+
dodontActive && /* @__PURE__ */ jsx9("p", { className: "mt-1 text-xs text-base-contrast-light/70", children: "Whole-list Do/Don't overrides the default icon." }),
|
|
1092
|
+
pickerOpen && !dodontActive && /* @__PURE__ */ jsx9("div", { className: "absolute top-full left-0 z-50 mt-1", children: /* @__PURE__ */ jsx9(
|
|
1080
1093
|
IconPicker,
|
|
1081
1094
|
{
|
|
1082
1095
|
selected: icon,
|
|
@@ -1091,7 +1104,7 @@ function IconListSettings({
|
|
|
1091
1104
|
}
|
|
1092
1105
|
) })
|
|
1093
1106
|
] }),
|
|
1094
|
-
/* @__PURE__ */
|
|
1107
|
+
/* @__PURE__ */ jsx9(
|
|
1095
1108
|
Checkbox,
|
|
1096
1109
|
{
|
|
1097
1110
|
checked: showLabel,
|
|
@@ -1102,7 +1115,7 @@ function IconListSettings({
|
|
|
1102
1115
|
label: "Show labels"
|
|
1103
1116
|
}
|
|
1104
1117
|
),
|
|
1105
|
-
showLabel && /* @__PURE__ */
|
|
1118
|
+
showLabel && /* @__PURE__ */ jsx9(
|
|
1106
1119
|
Checkbox,
|
|
1107
1120
|
{
|
|
1108
1121
|
checked: stackText,
|
|
@@ -1117,7 +1130,7 @@ function IconListSettings({
|
|
|
1117
1130
|
}
|
|
1118
1131
|
|
|
1119
1132
|
// src/components/sections/IconList/index.tsx
|
|
1120
|
-
import { jsx as
|
|
1133
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
1121
1134
|
var IconListItemSchema = z3.object({
|
|
1122
1135
|
label: z3.string(),
|
|
1123
1136
|
text: z3.string(),
|
|
@@ -1141,7 +1154,7 @@ var schema2 = z3.object({
|
|
|
1141
1154
|
var doDontListPreset = {
|
|
1142
1155
|
id: "do_dont_list",
|
|
1143
1156
|
label: "Do / Don't list",
|
|
1144
|
-
icon: /* @__PURE__ */
|
|
1157
|
+
icon: /* @__PURE__ */ jsx10(Columns2, { size: 18 }),
|
|
1145
1158
|
build: (newId) => ({
|
|
1146
1159
|
type: "container",
|
|
1147
1160
|
content: {
|
|
@@ -1158,10 +1171,10 @@ var IconList_default = defineSection({
|
|
|
1158
1171
|
type: "icon_list",
|
|
1159
1172
|
category: "brand-guide",
|
|
1160
1173
|
label: "Icon List",
|
|
1161
|
-
icon: /* @__PURE__ */
|
|
1174
|
+
icon: /* @__PURE__ */ jsx10(List, { size: 18 }),
|
|
1162
1175
|
schema: schema2,
|
|
1163
1176
|
authoringNote: "A list of labeled items, optionally with per-item icons and do/don't markers. Use for feature lists, guidelines, or do/don't guidance.",
|
|
1164
|
-
component: ({ content, options, onChange }) => /* @__PURE__ */
|
|
1177
|
+
component: ({ content, options, onChange }) => /* @__PURE__ */ jsx10(
|
|
1165
1178
|
IconList,
|
|
1166
1179
|
{
|
|
1167
1180
|
items: content.content.items,
|
|
@@ -1187,11 +1200,11 @@ import { Image as ImageIcon } from "lucide-react";
|
|
|
1187
1200
|
|
|
1188
1201
|
// src/components/sections/DoDontMedia/DoDontMediaBlock.tsx
|
|
1189
1202
|
import { Check as Check4, X as X4 } from "lucide-react";
|
|
1190
|
-
import { jsx as
|
|
1203
|
+
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1191
1204
|
function DoDontMediaBlock({ refValue, options, link, dodont, isEditMode, onRefChange }) {
|
|
1192
|
-
return /* @__PURE__ */
|
|
1193
|
-
/* @__PURE__ */
|
|
1194
|
-
/* @__PURE__ */
|
|
1205
|
+
return /* @__PURE__ */ jsxs8("div", { children: [
|
|
1206
|
+
/* @__PURE__ */ jsx11("div", { className: "flex h-10 items-center justify-center pb-1", children: dodont === "do" ? /* @__PURE__ */ jsx11(Check4, { size: 28, className: "text-green-600" }) : /* @__PURE__ */ jsx11(X4, { size: 28, className: "text-red-600" }) }),
|
|
1207
|
+
/* @__PURE__ */ jsx11(
|
|
1195
1208
|
MediaBlock,
|
|
1196
1209
|
{
|
|
1197
1210
|
refValue,
|
|
@@ -1205,7 +1218,7 @@ function DoDontMediaBlock({ refValue, options, link, dodont, isEditMode, onRefCh
|
|
|
1205
1218
|
}
|
|
1206
1219
|
|
|
1207
1220
|
// src/components/sections/DoDontMedia/index.tsx
|
|
1208
|
-
import { jsx as
|
|
1221
|
+
import { jsx as jsx12 } from "react/jsx-runtime";
|
|
1209
1222
|
var schema3 = z4.object({
|
|
1210
1223
|
type: z4.literal("dodont_media"),
|
|
1211
1224
|
content: z4.object({
|
|
@@ -1228,10 +1241,10 @@ var DoDontMedia_default = defineSection({
|
|
|
1228
1241
|
type: "dodont_media",
|
|
1229
1242
|
label: "Do / Don't Media",
|
|
1230
1243
|
category: "brand-guide",
|
|
1231
|
-
icon: /* @__PURE__ */
|
|
1244
|
+
icon: /* @__PURE__ */ jsx12(ImageIcon, { size: 18 }),
|
|
1232
1245
|
schema: schema3,
|
|
1233
1246
|
authoringNote: "A single image or video tagged as a 'do' or 'don't' example. Use inside a Container to build side-by-side do/don't comparisons of visual usage.",
|
|
1234
|
-
component: ({ content, options, onChange }) => /* @__PURE__ */
|
|
1247
|
+
component: ({ content, options, onChange }) => /* @__PURE__ */ jsx12(
|
|
1235
1248
|
DoDontMediaBlock,
|
|
1236
1249
|
{
|
|
1237
1250
|
refValue: content.content.ref,
|