@newtonedev/editor 0.1.10 → 0.1.12
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/Editor.d.ts +1 -1
- package/dist/Editor.d.ts.map +1 -1
- package/dist/components/EditorHeader.d.ts +10 -2
- package/dist/components/EditorHeader.d.ts.map +1 -1
- package/dist/components/PrimaryNav.d.ts +3 -1
- package/dist/components/PrimaryNav.d.ts.map +1 -1
- package/dist/components/Sidebar.d.ts +1 -10
- package/dist/components/Sidebar.d.ts.map +1 -1
- package/dist/components/sections/ColorsSection.d.ts.map +1 -1
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/index.cjs +190 -199
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +190 -199
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/sections/ColorsSection.tsx +15 -32
package/dist/Editor.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { EditorProps } from "./types";
|
|
2
|
-
export declare function Editor({ initialState, initialIsPublished, initialPresets, initialActivePresetId, initialPublishedPresetId, defaultState, chromeThemeConfig, persistence, headerSlots, onNavigate, initialPreviewView, manifestUrl, fontCatalog, }: EditorProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function Editor({ initialState, initialIsPublished, initialPresets, initialActivePresetId, initialPublishedPresetId, defaultState, chromeThemeConfig, persistence, headerSlots, navFooter, onNavigate, initialPreviewView, manifestUrl, fontCatalog, }: EditorProps): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=Editor.d.ts.map
|
package/dist/Editor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../src/Editor.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAgB,MAAM,CAAC,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,WAAW,GACZ,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../src/Editor.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAgB,MAAM,CAAC,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,WAAW,GACZ,EAAE,WAAW,2CAwJb"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from "react";
|
|
2
|
-
import type { SaveStatus } from "../types";
|
|
2
|
+
import type { SaveStatus, Preset } from "../types";
|
|
3
3
|
interface EditorHeaderProps {
|
|
4
4
|
readonly saveStatus: SaveStatus;
|
|
5
5
|
readonly isPublished: boolean;
|
|
@@ -10,7 +10,15 @@ interface EditorHeaderProps {
|
|
|
10
10
|
readonly left?: ReactNode;
|
|
11
11
|
readonly right?: ReactNode;
|
|
12
12
|
};
|
|
13
|
+
readonly presets: readonly Preset[];
|
|
14
|
+
readonly activePresetId: string;
|
|
15
|
+
readonly publishedPresetId: string | null;
|
|
16
|
+
readonly onSwitchPreset: (presetId: string) => void;
|
|
17
|
+
readonly onCreatePreset: (name: string) => Promise<string>;
|
|
18
|
+
readonly onRenamePreset: (presetId: string, name: string) => void;
|
|
19
|
+
readonly onDeletePreset: (presetId: string) => Promise<void>;
|
|
20
|
+
readonly onDuplicatePreset: (presetId: string, name: string) => Promise<string>;
|
|
13
21
|
}
|
|
14
|
-
export declare function EditorHeader({ saveStatus, isPublished, publishing, onPublish, onRetry, headerSlots, }: EditorHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function EditorHeader({ saveStatus, isPublished, publishing, onPublish, onRetry, headerSlots, presets, activePresetId, publishedPresetId, onSwitchPreset, onCreatePreset, onRenamePreset, onDeletePreset, onDuplicatePreset, }: EditorHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
15
23
|
export {};
|
|
16
24
|
//# sourceMappingURL=EditorHeader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorHeader.d.ts","sourceRoot":"","sources":["../../src/components/EditorHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"EditorHeader.d.ts","sourceRoot":"","sources":["../../src/components/EditorHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGnD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,QAAQ,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACjF;AASD,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,EAAE,iBAAiB,2CAgEnB"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
1
2
|
interface PrimaryNavProps {
|
|
2
3
|
readonly activeSectionId: string | null;
|
|
3
4
|
readonly onSelectSection: (sectionId: string) => void;
|
|
5
|
+
readonly footer?: ReactNode;
|
|
4
6
|
}
|
|
5
|
-
export declare function PrimaryNav({ activeSectionId, onSelectSection }: PrimaryNavProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function PrimaryNav({ activeSectionId, onSelectSection, footer }: PrimaryNavProps): import("react/jsx-runtime").JSX.Element;
|
|
6
8
|
export {};
|
|
7
9
|
//# sourceMappingURL=PrimaryNav.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PrimaryNav.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryNav.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PrimaryNav.d.ts","sourceRoot":"","sources":["../../src/components/PrimaryNav.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,eAAe;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAID,wBAAgB,UAAU,CAAC,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,eAAe,2CAqEvF"}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import type { Preset } from "../types";
|
|
2
1
|
interface SidebarProps {
|
|
3
2
|
readonly isDirty: boolean;
|
|
4
3
|
readonly onRevert: () => void;
|
|
5
|
-
readonly presets: readonly Preset[];
|
|
6
|
-
readonly activePresetId: string;
|
|
7
|
-
readonly publishedPresetId: string | null;
|
|
8
|
-
readonly onSwitchPreset: (presetId: string) => void;
|
|
9
|
-
readonly onCreatePreset: (name: string) => Promise<string>;
|
|
10
|
-
readonly onRenamePreset: (presetId: string, name: string) => void;
|
|
11
|
-
readonly onDeletePreset: (presetId: string) => Promise<void>;
|
|
12
|
-
readonly onDuplicatePreset: (presetId: string, name: string) => Promise<string>;
|
|
13
4
|
}
|
|
14
|
-
export declare function Sidebar({ isDirty, onRevert,
|
|
5
|
+
export declare function Sidebar({ isDirty, onRevert, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
15
6
|
export {};
|
|
16
7
|
//# sourceMappingURL=Sidebar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../src/components/Sidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../src/components/Sidebar.tsx"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,GACT,EAAE,YAAY,2CA+Ed"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorsSection.d.ts","sourceRoot":"","sources":["../../../src/components/sections/ColorsSection.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,SAAS,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAenE,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACvD;AAYD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,aAAa,EACb,SAAS,EACT,iBAAiB,GAClB,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"ColorsSection.d.ts","sourceRoot":"","sources":["../../../src/components/sections/ColorsSection.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,SAAS,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAenE,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACvD;AAYD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,aAAa,EACb,SAAS,EACT,iBAAiB,GAClB,EAAE,kBAAkB,2CA6ZpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEditorState.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditorState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,EAC7B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,GACZ,EAAE,qBAAqB;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useEditorState.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditorState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,EAC7B,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,WAAW,GACZ,EAAE,qBAAqB;;;;;;;;;gCAwON,iBAAiB;;;;2CA3GxB,WAAW;8CAsBN,MAAM;8CA8BN,MAAM;2CAwFX,SAAS;;;;;4CA3DL,MAAM,SAAS,OAAO;;;;;;;;;;;;;;;EAkMpC"}
|
package/dist/index.cjs
CHANGED
|
@@ -266,11 +266,12 @@ function useEditorState({
|
|
|
266
266
|
const [colorMode, setColorMode] = react.useState(
|
|
267
267
|
initialState.preview.mode
|
|
268
268
|
);
|
|
269
|
+
const defaultCategoryId = components.CATEGORIES[0]?.id ?? "colors";
|
|
269
270
|
const [previewView, setPreviewView] = react.useState(
|
|
270
|
-
initialPreviewView ?? { kind: "
|
|
271
|
+
initialPreviewView ?? { kind: "category", categoryId: defaultCategoryId }
|
|
271
272
|
);
|
|
272
273
|
const [activeSectionId, setActiveSectionId] = react.useState(
|
|
273
|
-
|
|
274
|
+
(initialPreviewView?.kind === "category" ? initialPreviewView.categoryId : void 0) ?? defaultCategoryId
|
|
274
275
|
);
|
|
275
276
|
const [sidebarSelection, setSidebarSelection] = react.useState(null);
|
|
276
277
|
const [propOverrides, setPropOverrides] = react.useState(
|
|
@@ -370,11 +371,10 @@ function useEditorState({
|
|
|
370
371
|
(sectionId) => {
|
|
371
372
|
setActiveSectionId(sectionId);
|
|
372
373
|
const sectionComponents = components.getComponentsByCategory(sectionId);
|
|
374
|
+
onNavigate?.({ kind: "category", categoryId: sectionId });
|
|
373
375
|
if (sectionComponents.length === 1) {
|
|
374
376
|
const comp = sectionComponents[0];
|
|
375
|
-
|
|
376
|
-
setPreviewView(view);
|
|
377
|
-
onNavigate?.(view);
|
|
377
|
+
setPreviewView({ kind: "component", componentId: comp.id });
|
|
378
378
|
const firstVariantId = comp.variants[0]?.id;
|
|
379
379
|
setSidebarSelection(
|
|
380
380
|
firstVariantId ? { scope: "variant", componentId: comp.id, variantId: firstVariantId } : { scope: "component", componentId: comp.id }
|
|
@@ -383,7 +383,6 @@ function useEditorState({
|
|
|
383
383
|
} else {
|
|
384
384
|
const view = { kind: "category", categoryId: sectionId };
|
|
385
385
|
setPreviewView(view);
|
|
386
|
-
onNavigate?.(view);
|
|
387
386
|
setSidebarSelection(null);
|
|
388
387
|
setPropOverrides({});
|
|
389
388
|
}
|
|
@@ -639,6 +638,94 @@ function EditorShell({
|
|
|
639
638
|
}
|
|
640
639
|
);
|
|
641
640
|
}
|
|
641
|
+
var SIDEBAR_WIDTH2 = 360;
|
|
642
|
+
function Sidebar({
|
|
643
|
+
isDirty,
|
|
644
|
+
onRevert
|
|
645
|
+
}) {
|
|
646
|
+
const tokens = components.useTokens();
|
|
647
|
+
const borderColor = newtone.srgbToHex(tokens.border.srgb);
|
|
648
|
+
const bgColor = newtone.srgbToHex(tokens.background.srgb);
|
|
649
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
650
|
+
"div",
|
|
651
|
+
{
|
|
652
|
+
style: {
|
|
653
|
+
width: SIDEBAR_WIDTH2,
|
|
654
|
+
flexShrink: 0,
|
|
655
|
+
display: "flex",
|
|
656
|
+
flexDirection: "column",
|
|
657
|
+
height: "100vh",
|
|
658
|
+
borderLeft: `1px solid ${borderColor}`,
|
|
659
|
+
backgroundColor: bgColor
|
|
660
|
+
},
|
|
661
|
+
children: [
|
|
662
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
663
|
+
"div",
|
|
664
|
+
{
|
|
665
|
+
style: {
|
|
666
|
+
flexShrink: 0,
|
|
667
|
+
padding: "16px 20px",
|
|
668
|
+
borderBottom: `1px solid ${borderColor}`,
|
|
669
|
+
display: "flex",
|
|
670
|
+
alignItems: "center"
|
|
671
|
+
},
|
|
672
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
673
|
+
"span",
|
|
674
|
+
{
|
|
675
|
+
style: {
|
|
676
|
+
fontSize: 16,
|
|
677
|
+
fontWeight: 700,
|
|
678
|
+
color: newtone.srgbToHex(tokens.textPrimary.srgb)
|
|
679
|
+
},
|
|
680
|
+
children: "newtone"
|
|
681
|
+
}
|
|
682
|
+
)
|
|
683
|
+
}
|
|
684
|
+
),
|
|
685
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
686
|
+
"div",
|
|
687
|
+
{
|
|
688
|
+
style: {
|
|
689
|
+
flex: 1,
|
|
690
|
+
overflowY: "auto",
|
|
691
|
+
overflowX: "hidden"
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
),
|
|
695
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
696
|
+
"div",
|
|
697
|
+
{
|
|
698
|
+
style: {
|
|
699
|
+
flexShrink: 0,
|
|
700
|
+
padding: "12px 20px",
|
|
701
|
+
borderTop: `1px solid ${borderColor}`
|
|
702
|
+
},
|
|
703
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
704
|
+
"button",
|
|
705
|
+
{
|
|
706
|
+
disabled: !isDirty,
|
|
707
|
+
onClick: onRevert,
|
|
708
|
+
"aria-label": "Revert all changes to the last saved version",
|
|
709
|
+
style: {
|
|
710
|
+
width: "100%",
|
|
711
|
+
padding: "8px 16px",
|
|
712
|
+
borderRadius: 6,
|
|
713
|
+
border: `1px solid ${borderColor}`,
|
|
714
|
+
backgroundColor: "transparent",
|
|
715
|
+
color: isDirty ? newtone.srgbToHex(tokens.textPrimary.srgb) : newtone.srgbToHex(tokens.textSecondary.srgb),
|
|
716
|
+
fontSize: 13,
|
|
717
|
+
cursor: isDirty ? "pointer" : "not-allowed",
|
|
718
|
+
opacity: isDirty ? 1 : 0.5
|
|
719
|
+
},
|
|
720
|
+
children: "Revert Changes"
|
|
721
|
+
}
|
|
722
|
+
)
|
|
723
|
+
}
|
|
724
|
+
)
|
|
725
|
+
]
|
|
726
|
+
}
|
|
727
|
+
);
|
|
728
|
+
}
|
|
642
729
|
function PresetSelector({
|
|
643
730
|
presets,
|
|
644
731
|
activePresetId,
|
|
@@ -1042,118 +1129,6 @@ function PresetSelector({
|
|
|
1042
1129
|
)
|
|
1043
1130
|
] });
|
|
1044
1131
|
}
|
|
1045
|
-
var SIDEBAR_WIDTH2 = 360;
|
|
1046
|
-
function Sidebar({
|
|
1047
|
-
isDirty,
|
|
1048
|
-
onRevert,
|
|
1049
|
-
presets,
|
|
1050
|
-
activePresetId,
|
|
1051
|
-
publishedPresetId,
|
|
1052
|
-
onSwitchPreset,
|
|
1053
|
-
onCreatePreset,
|
|
1054
|
-
onRenamePreset,
|
|
1055
|
-
onDeletePreset,
|
|
1056
|
-
onDuplicatePreset
|
|
1057
|
-
}) {
|
|
1058
|
-
const tokens = components.useTokens();
|
|
1059
|
-
const borderColor = newtone.srgbToHex(tokens.border.srgb);
|
|
1060
|
-
const bgColor = newtone.srgbToHex(tokens.background.srgb);
|
|
1061
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1062
|
-
"div",
|
|
1063
|
-
{
|
|
1064
|
-
style: {
|
|
1065
|
-
width: SIDEBAR_WIDTH2,
|
|
1066
|
-
flexShrink: 0,
|
|
1067
|
-
display: "flex",
|
|
1068
|
-
flexDirection: "column",
|
|
1069
|
-
height: "100vh",
|
|
1070
|
-
borderLeft: `1px solid ${borderColor}`,
|
|
1071
|
-
backgroundColor: bgColor
|
|
1072
|
-
},
|
|
1073
|
-
children: [
|
|
1074
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1075
|
-
"div",
|
|
1076
|
-
{
|
|
1077
|
-
style: {
|
|
1078
|
-
flexShrink: 0,
|
|
1079
|
-
padding: "16px 20px",
|
|
1080
|
-
borderBottom: `1px solid ${borderColor}`,
|
|
1081
|
-
display: "flex",
|
|
1082
|
-
alignItems: "center",
|
|
1083
|
-
justifyContent: "space-between"
|
|
1084
|
-
},
|
|
1085
|
-
children: [
|
|
1086
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1087
|
-
"span",
|
|
1088
|
-
{
|
|
1089
|
-
style: {
|
|
1090
|
-
fontSize: 16,
|
|
1091
|
-
fontWeight: 700,
|
|
1092
|
-
color: newtone.srgbToHex(tokens.textPrimary.srgb)
|
|
1093
|
-
},
|
|
1094
|
-
children: "newtone"
|
|
1095
|
-
}
|
|
1096
|
-
),
|
|
1097
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1098
|
-
PresetSelector,
|
|
1099
|
-
{
|
|
1100
|
-
presets,
|
|
1101
|
-
activePresetId,
|
|
1102
|
-
publishedPresetId,
|
|
1103
|
-
onSwitchPreset,
|
|
1104
|
-
onCreatePreset,
|
|
1105
|
-
onRenamePreset,
|
|
1106
|
-
onDeletePreset,
|
|
1107
|
-
onDuplicatePreset
|
|
1108
|
-
}
|
|
1109
|
-
)
|
|
1110
|
-
]
|
|
1111
|
-
}
|
|
1112
|
-
),
|
|
1113
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1114
|
-
"div",
|
|
1115
|
-
{
|
|
1116
|
-
style: {
|
|
1117
|
-
flex: 1,
|
|
1118
|
-
overflowY: "auto",
|
|
1119
|
-
overflowX: "hidden"
|
|
1120
|
-
}
|
|
1121
|
-
}
|
|
1122
|
-
),
|
|
1123
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1124
|
-
"div",
|
|
1125
|
-
{
|
|
1126
|
-
style: {
|
|
1127
|
-
flexShrink: 0,
|
|
1128
|
-
padding: "12px 20px",
|
|
1129
|
-
borderTop: `1px solid ${borderColor}`
|
|
1130
|
-
},
|
|
1131
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1132
|
-
"button",
|
|
1133
|
-
{
|
|
1134
|
-
disabled: !isDirty,
|
|
1135
|
-
onClick: onRevert,
|
|
1136
|
-
"aria-label": "Revert all changes to the last saved version",
|
|
1137
|
-
style: {
|
|
1138
|
-
width: "100%",
|
|
1139
|
-
padding: "8px 16px",
|
|
1140
|
-
borderRadius: 6,
|
|
1141
|
-
border: `1px solid ${borderColor}`,
|
|
1142
|
-
backgroundColor: "transparent",
|
|
1143
|
-
color: isDirty ? newtone.srgbToHex(tokens.textPrimary.srgb) : newtone.srgbToHex(tokens.textSecondary.srgb),
|
|
1144
|
-
fontSize: 13,
|
|
1145
|
-
cursor: isDirty ? "pointer" : "not-allowed",
|
|
1146
|
-
opacity: isDirty ? 1 : 0.5
|
|
1147
|
-
},
|
|
1148
|
-
children: "Revert Changes"
|
|
1149
|
-
}
|
|
1150
|
-
)
|
|
1151
|
-
}
|
|
1152
|
-
)
|
|
1153
|
-
]
|
|
1154
|
-
}
|
|
1155
|
-
);
|
|
1156
|
-
}
|
|
1157
1132
|
var STATUS_LABEL = {
|
|
1158
1133
|
saved: "Saved",
|
|
1159
1134
|
saving: "Saving...",
|
|
@@ -1166,7 +1141,15 @@ function EditorHeader({
|
|
|
1166
1141
|
publishing,
|
|
1167
1142
|
onPublish,
|
|
1168
1143
|
onRetry,
|
|
1169
|
-
headerSlots
|
|
1144
|
+
headerSlots,
|
|
1145
|
+
presets,
|
|
1146
|
+
activePresetId,
|
|
1147
|
+
publishedPresetId,
|
|
1148
|
+
onSwitchPreset,
|
|
1149
|
+
onCreatePreset,
|
|
1150
|
+
onRenamePreset,
|
|
1151
|
+
onDeletePreset,
|
|
1152
|
+
onDuplicatePreset
|
|
1170
1153
|
}) {
|
|
1171
1154
|
const tokens = components.useTokens();
|
|
1172
1155
|
const borderColor = newtone.srgbToHex(tokens.border.srgb);
|
|
@@ -1189,7 +1172,22 @@ function EditorHeader({
|
|
|
1189
1172
|
flexShrink: 0
|
|
1190
1173
|
},
|
|
1191
1174
|
children: [
|
|
1192
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1175
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 16 }, children: [
|
|
1176
|
+
headerSlots?.left,
|
|
1177
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1178
|
+
PresetSelector,
|
|
1179
|
+
{
|
|
1180
|
+
presets,
|
|
1181
|
+
activePresetId,
|
|
1182
|
+
publishedPresetId,
|
|
1183
|
+
onSwitchPreset,
|
|
1184
|
+
onCreatePreset,
|
|
1185
|
+
onRenamePreset,
|
|
1186
|
+
onDeletePreset,
|
|
1187
|
+
onDuplicatePreset
|
|
1188
|
+
}
|
|
1189
|
+
)
|
|
1190
|
+
] }),
|
|
1193
1191
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 12 }, children: [
|
|
1194
1192
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1195
1193
|
"span",
|
|
@@ -1221,7 +1219,7 @@ function EditorHeader({
|
|
|
1221
1219
|
);
|
|
1222
1220
|
}
|
|
1223
1221
|
var NAV_WIDTH = 60;
|
|
1224
|
-
function PrimaryNav({ activeSectionId, onSelectSection }) {
|
|
1222
|
+
function PrimaryNav({ activeSectionId, onSelectSection, footer }) {
|
|
1225
1223
|
const tokens = components.useTokens();
|
|
1226
1224
|
const [hoveredId, setHoveredId] = react.useState(null);
|
|
1227
1225
|
const bg = newtone.srgbToHex(tokens.background.srgb);
|
|
@@ -1229,7 +1227,7 @@ function PrimaryNav({ activeSectionId, onSelectSection }) {
|
|
|
1229
1227
|
const activeBg = newtone.srgbToHex(tokens.backgroundInteractive.srgb);
|
|
1230
1228
|
const iconColor = newtone.srgbToHex(tokens.textSecondary.srgb);
|
|
1231
1229
|
const activeIconColor = newtone.srgbToHex(tokens.textPrimary.srgb);
|
|
1232
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
1230
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1233
1231
|
"nav",
|
|
1234
1232
|
{
|
|
1235
1233
|
"aria-label": "Section navigation",
|
|
@@ -1244,41 +1242,44 @@ function PrimaryNav({ activeSectionId, onSelectSection }) {
|
|
|
1244
1242
|
backgroundColor: bg,
|
|
1245
1243
|
borderRight: `1px solid ${borderColor}`
|
|
1246
1244
|
},
|
|
1247
|
-
children:
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1245
|
+
children: [
|
|
1246
|
+
components.CATEGORIES.map((category) => {
|
|
1247
|
+
const isActive = activeSectionId === category.id;
|
|
1248
|
+
const isHovered = hoveredId === category.id;
|
|
1249
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1250
|
+
"button",
|
|
1251
|
+
{
|
|
1252
|
+
onClick: () => onSelectSection(category.id),
|
|
1253
|
+
onMouseEnter: () => setHoveredId(category.id),
|
|
1254
|
+
onMouseLeave: () => setHoveredId(null),
|
|
1255
|
+
title: category.name,
|
|
1256
|
+
"aria-current": isActive ? "page" : void 0,
|
|
1257
|
+
style: {
|
|
1258
|
+
display: "flex",
|
|
1259
|
+
alignItems: "center",
|
|
1260
|
+
justifyContent: "center",
|
|
1261
|
+
width: 44,
|
|
1262
|
+
height: 44,
|
|
1263
|
+
borderRadius: 12,
|
|
1264
|
+
border: "none",
|
|
1265
|
+
backgroundColor: isActive ? activeBg : isHovered ? `${borderColor}20` : "transparent",
|
|
1266
|
+
cursor: "pointer",
|
|
1267
|
+
transition: "background-color 150ms"
|
|
1268
|
+
},
|
|
1269
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1270
|
+
components.Icon,
|
|
1271
|
+
{
|
|
1272
|
+
name: category.icon ?? "circle",
|
|
1273
|
+
size: 24,
|
|
1274
|
+
color: isActive ? activeIconColor : iconColor
|
|
1275
|
+
}
|
|
1276
|
+
)
|
|
1269
1277
|
},
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
color: isActive ? activeIconColor : iconColor
|
|
1276
|
-
}
|
|
1277
|
-
)
|
|
1278
|
-
},
|
|
1279
|
-
category.id
|
|
1280
|
-
);
|
|
1281
|
-
})
|
|
1278
|
+
category.id
|
|
1279
|
+
);
|
|
1280
|
+
}),
|
|
1281
|
+
footer && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: "auto", paddingBottom: 12 }, children: footer })
|
|
1282
|
+
]
|
|
1282
1283
|
}
|
|
1283
1284
|
);
|
|
1284
1285
|
}
|
|
@@ -1586,33 +1587,21 @@ function ColorsSection({
|
|
|
1586
1587
|
editableValue: true
|
|
1587
1588
|
}
|
|
1588
1589
|
),
|
|
1589
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
components.Toggle,
|
|
1605
|
-
{
|
|
1606
|
-
value: palette.desaturationDirection === "dark",
|
|
1607
|
-
onValueChange: (v) => dispatch({
|
|
1608
|
-
type: "SET_PALETTE_DESAT_DIRECTION",
|
|
1609
|
-
index: activePaletteIndex,
|
|
1610
|
-
direction: v ? "dark" : "light"
|
|
1611
|
-
}),
|
|
1612
|
-
label: "Invert"
|
|
1613
|
-
}
|
|
1614
|
-
) })
|
|
1615
|
-
] }),
|
|
1590
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1591
|
+
components.Slider,
|
|
1592
|
+
{
|
|
1593
|
+
value: Math.round((palette.desaturation ?? 0) * 100),
|
|
1594
|
+
onValueChange: (v) => dispatch({
|
|
1595
|
+
type: "SET_PALETTE_DESATURATION",
|
|
1596
|
+
index: activePaletteIndex,
|
|
1597
|
+
desaturation: v / 100
|
|
1598
|
+
}),
|
|
1599
|
+
min: -100,
|
|
1600
|
+
max: 100,
|
|
1601
|
+
label: "Desaturation",
|
|
1602
|
+
editableValue: true
|
|
1603
|
+
}
|
|
1604
|
+
),
|
|
1616
1605
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 12, alignItems: "flex-end" }, children: [
|
|
1617
1606
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1 }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1618
1607
|
components.Select,
|
|
@@ -2588,7 +2577,7 @@ function OthersSection({ state, dispatch }) {
|
|
|
2588
2577
|
] })
|
|
2589
2578
|
] });
|
|
2590
2579
|
}
|
|
2591
|
-
var PANEL_WIDTH =
|
|
2580
|
+
var PANEL_WIDTH = 360;
|
|
2592
2581
|
function ConfiguratorPanel({
|
|
2593
2582
|
activeSectionId,
|
|
2594
2583
|
state,
|
|
@@ -2635,7 +2624,7 @@ function ConfiguratorPanel({
|
|
|
2635
2624
|
}
|
|
2636
2625
|
);
|
|
2637
2626
|
}
|
|
2638
|
-
var TOC_WIDTH =
|
|
2627
|
+
var TOC_WIDTH = 360;
|
|
2639
2628
|
function TableOfContents({
|
|
2640
2629
|
activeSectionId,
|
|
2641
2630
|
activeView,
|
|
@@ -3570,7 +3559,7 @@ function ComponentDetailView({
|
|
|
3570
3559
|
scopeFontMap
|
|
3571
3560
|
}) {
|
|
3572
3561
|
const tokens = components.useTokens();
|
|
3573
|
-
const { config } = components.useNewtoneTheme();
|
|
3562
|
+
const { config, mode } = components.useNewtoneTheme();
|
|
3574
3563
|
const component = components.getComponent(componentId);
|
|
3575
3564
|
const [hoveredId, setHoveredId] = react.useState(null);
|
|
3576
3565
|
const [previewBreakpoint, setPreviewBreakpoint] = react.useState("lg");
|
|
@@ -3713,7 +3702,7 @@ function ComponentDetailView({
|
|
|
3713
3702
|
);
|
|
3714
3703
|
}) })
|
|
3715
3704
|
] }),
|
|
3716
|
-
component.previewLayout === "list" ? /* @__PURE__ */ jsxRuntime.jsx(components.NewtoneProvider, { config: scaledConfig, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: component.variants.map((variant) => {
|
|
3705
|
+
component.previewLayout === "list" ? /* @__PURE__ */ jsxRuntime.jsx(components.NewtoneProvider, { config: scaledConfig, initialMode: mode, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: component.variants.map((variant) => {
|
|
3717
3706
|
const isSelected = selectedVariantId === variant.id;
|
|
3718
3707
|
const isHovered = hoveredId === variant.id;
|
|
3719
3708
|
const borderColor = isSelected ? interactiveColor : isHovered ? `${interactiveColor}66` : newtone.srgbToHex(tokens.border.srgb);
|
|
@@ -3806,7 +3795,7 @@ function ComponentDetailView({
|
|
|
3806
3795
|
},
|
|
3807
3796
|
variant.id
|
|
3808
3797
|
);
|
|
3809
|
-
}) }) }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3798
|
+
}) }) }, mode) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3810
3799
|
"div",
|
|
3811
3800
|
{
|
|
3812
3801
|
style: {
|
|
@@ -4446,6 +4435,7 @@ function Editor({
|
|
|
4446
4435
|
chromeThemeConfig,
|
|
4447
4436
|
persistence,
|
|
4448
4437
|
headerSlots,
|
|
4438
|
+
navFooter,
|
|
4449
4439
|
onNavigate,
|
|
4450
4440
|
initialPreviewView,
|
|
4451
4441
|
manifestUrl,
|
|
@@ -4491,15 +4481,7 @@ function Editor({
|
|
|
4491
4481
|
Sidebar,
|
|
4492
4482
|
{
|
|
4493
4483
|
isDirty: editor.isDirty,
|
|
4494
|
-
onRevert: editor.handleRevert
|
|
4495
|
-
presets: editor.presets,
|
|
4496
|
-
activePresetId: editor.activePresetId,
|
|
4497
|
-
publishedPresetId: editor.publishedPresetId,
|
|
4498
|
-
onSwitchPreset: editor.switchPreset,
|
|
4499
|
-
onCreatePreset: editor.createPreset,
|
|
4500
|
-
onRenamePreset: editor.renamePreset,
|
|
4501
|
-
onDeletePreset: editor.deletePreset,
|
|
4502
|
-
onDuplicatePreset: editor.duplicatePreset
|
|
4484
|
+
onRevert: editor.handleRevert
|
|
4503
4485
|
}
|
|
4504
4486
|
),
|
|
4505
4487
|
navbar: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -4510,7 +4492,15 @@ function Editor({
|
|
|
4510
4492
|
publishing: editor.publishing,
|
|
4511
4493
|
onPublish: editor.handlePublish,
|
|
4512
4494
|
onRetry: () => editor.saveDraft(editor.latestStateRef.current),
|
|
4513
|
-
headerSlots
|
|
4495
|
+
headerSlots,
|
|
4496
|
+
presets: editor.presets,
|
|
4497
|
+
activePresetId: editor.activePresetId,
|
|
4498
|
+
publishedPresetId: editor.publishedPresetId,
|
|
4499
|
+
onSwitchPreset: editor.switchPreset,
|
|
4500
|
+
onCreatePreset: editor.createPreset,
|
|
4501
|
+
onRenamePreset: editor.renamePreset,
|
|
4502
|
+
onDeletePreset: editor.deletePreset,
|
|
4503
|
+
onDuplicatePreset: editor.duplicatePreset
|
|
4514
4504
|
}
|
|
4515
4505
|
),
|
|
4516
4506
|
content: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -4527,7 +4517,8 @@ function Editor({
|
|
|
4527
4517
|
PrimaryNav,
|
|
4528
4518
|
{
|
|
4529
4519
|
activeSectionId: editor.activeSectionId,
|
|
4530
|
-
onSelectSection: editor.handleSectionChange
|
|
4520
|
+
onSelectSection: editor.handleSectionChange,
|
|
4521
|
+
footer: navFooter
|
|
4531
4522
|
}
|
|
4532
4523
|
),
|
|
4533
4524
|
editor.activeSectionId === "components" ? /* @__PURE__ */ jsxRuntime.jsx(
|