@snowcone-app/canvas 0.23.0 → 0.27.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/ERROR_CONTRACT.md +638 -0
- package/README.md +2 -1
- package/STYLING_CONTRACT.md +59 -8
- package/dist/{CanvasRenderer-6_HhR4-q.js → CanvasRenderer-yszzrDfo.js} +4 -4
- package/dist/{CanvasRenderer-6_HhR4-q.js.map → CanvasRenderer-yszzrDfo.js.map} +1 -1
- package/dist/{CanvasStateV1-DmZ1Qvvn.js → CanvasStateV1-BTbCD_xC.js} +3 -3
- package/dist/{CanvasStateV1-DmZ1Qvvn.js.map → CanvasStateV1-BTbCD_xC.js.map} +1 -1
- package/dist/{ContextualToolbars-BDEt9ND0.js → ContextualToolbars-BHjYsril.js} +6 -6
- package/dist/{ContextualToolbars-BDEt9ND0.js.map → ContextualToolbars-BHjYsril.js.map} +1 -1
- package/dist/{EditorCanvasImpl-Ckg7WO2j.js → EditorCanvasImpl-Ui8Ceb-h.js} +8 -8
- package/dist/{EditorCanvasImpl-Ckg7WO2j.js.map → EditorCanvasImpl-Ui8Ceb-h.js.map} +1 -1
- package/dist/{ExportManager-DoU4VK6h.js → ExportManager-BTcyj4cf.js} +2 -2
- package/dist/{ExportManager-DoU4VK6h.js.map → ExportManager-BTcyj4cf.js.map} +1 -1
- package/dist/{FontAnalyzer-CwIpgTGd.js → FontAnalyzer-EF3gLPr8.js} +30 -20
- package/dist/{FontAnalyzer-CwIpgTGd.js.map → FontAnalyzer-EF3gLPr8.js.map} +1 -1
- package/dist/{ImagePanel-BwqFDKvW.js → ImagePanel-CIk6z41z.js} +6 -6
- package/dist/{ImagePanel-BwqFDKvW.js.map → ImagePanel-CIk6z41z.js.map} +1 -1
- package/dist/{SnowconeCanvas-D1sLcIja.js → SnowconeCanvas-DuWALOAt.js} +10 -10
- package/dist/{SnowconeCanvas-D1sLcIja.js.map → SnowconeCanvas-DuWALOAt.js.map} +1 -1
- package/dist/{UnifiedFontService-CC3CSmH5.js → UnifiedFontService-CHVYDBDW.js} +869 -836
- package/dist/{UnifiedFontService-CC3CSmH5.js.map → UnifiedFontService-CHVYDBDW.js.map} +1 -1
- package/dist/advanced.mjs +14 -14
- package/dist/api/embed.d.ts +6 -2
- package/dist/components/editor/EditorLoadingOverlay.d.ts +12 -0
- package/dist/components/editor/EditorPlacements.d.ts +14 -0
- package/dist/components/editor/EditorPreview.d.ts +32 -8
- package/dist/components/editor/EditorRoot.d.ts +12 -0
- package/dist/components/editor/PreviewPrismOverlay.d.ts +23 -0
- package/dist/components/editor/RootInternals.d.ts +31 -0
- package/dist/components/editor/editorAudit.d.ts +66 -0
- package/dist/components/editor/index.d.ts +14 -0
- package/dist/components/editor/usePlacements.d.ts +14 -0
- package/dist/components/embed-realtime/context.d.ts +11 -2
- package/dist/components/embed-realtime/validateEmbed.d.ts +20 -1
- package/dist/contexts/EditorContext.d.ts +34 -0
- package/dist/core/HybridHistoryManager.d.ts +7 -0
- package/dist/core/elementGuards.d.ts +19 -0
- package/dist/{custom-icons-BW6hqmkL.js → custom-icons-CcLMyybv.js} +7 -7
- package/dist/{custom-icons-BW6hqmkL.js.map → custom-icons-CcLMyybv.js.map} +1 -1
- package/dist/design/design-builder.d.ts +41 -3
- package/dist/design/product-config.d.ts +10 -0
- package/dist/{design-builder-2VUjfmdt.js → design-builder-cZY958Rw.js} +109 -61
- package/dist/design-builder-cZY958Rw.js.map +1 -0
- package/dist/editorErrors-BhrZ_nwj.js +1219 -0
- package/dist/editorErrors-BhrZ_nwj.js.map +1 -0
- package/dist/embed-CJswRZte.js +1586 -0
- package/dist/embed-CJswRZte.js.map +1 -0
- package/dist/embed.mjs +42 -34
- package/dist/errors/editorError.d.ts +29 -1
- package/dist/{guards-8rkFAMBs.js → guards-DIX8aXWM.js} +2 -2
- package/dist/{guards-8rkFAMBs.js.map → guards-DIX8aXWM.js.map} +1 -1
- package/dist/hooks/elementPatch.d.ts +96 -0
- package/dist/hooks/useCommands.d.ts +20 -0
- package/dist/index.mjs +8 -8
- package/dist/internals.mjs +9 -9
- package/dist/style.css +1 -1
- package/dist/template-fields-BXl29sgh.js +716 -0
- package/dist/template-fields-BXl29sgh.js.map +1 -0
- package/dist/testing.mjs +4 -4
- package/dist/{usePieceGuideBundle-CbJJg66S.js → usePieceGuideBundle-DE21DQGZ.js} +2 -2
- package/dist/{usePieceGuideBundle-CbJJg66S.js.map → usePieceGuideBundle-DE21DQGZ.js.map} +1 -1
- package/dist/{validation-C9Fe9ahK.js → validation-DGXAQmUC.js} +11 -11
- package/dist/{validation-C9Fe9ahK.js.map → validation-DGXAQmUC.js.map} +1 -1
- package/example/package.json +1 -1
- package/llms.txt +3 -0
- package/package.json +7 -4
- package/dist/design-builder-2VUjfmdt.js.map +0 -1
- package/dist/editorErrors-B2mb1sVN.js +0 -1208
- package/dist/editorErrors-B2mb1sVN.js.map +0 -1
- package/dist/embed-DxsaqZJF.js +0 -1226
- package/dist/embed-DxsaqZJF.js.map +0 -1
- package/dist/template-fields-CQ6n2P4V.js +0 -548
- package/dist/template-fields-CQ6n2P4V.js.map +0 -1
package/dist/advanced.mjs
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { D as te, T as M, h as D, B as re, I as q, i as I, j as ne, e as se } from "./UnifiedFontService-
|
|
2
|
-
import { k as at, L as it, M as ct, l as lt, S as dt, m as ut, s as mt, n as ft } from "./UnifiedFontService-
|
|
3
|
-
import { r as oe, v as ae } from "./validation-
|
|
4
|
-
import { a as pt, b as xt, c as gt, d as bt, D as yt, e as vt, f as wt, G as St, K as Ct, g as Tt, L as Et, S as $t, T as kt, Z as At, h as Ft, i as Pt, j as Nt, k as Rt, l as Bt, m as Mt, n as Dt, u as It, o as zt, p as Ot } from "./validation-
|
|
5
|
-
import { ImagePanel as Wt } from "./ImagePanel-
|
|
6
|
-
import { P as ie, a as ce, b as le } from "./ContextualToolbars-
|
|
7
|
-
import { A as Gt, B as _t, c as Ut, C as jt, d as Jt, e as qt, F as Zt, f as Vt, I as Xt, g as Yt, M as Ht, h as Qt, S as er, T as tr, i as rr, j as nr, k as sr, U as or, l as ar, u as ir, m as cr } from "./ContextualToolbars-
|
|
8
|
-
import { u as Z } from "./editorErrors-
|
|
9
|
-
import { E as dr, P as ur, p as mr, s as fr, b as hr, c as pr, d as xr, e as gr, f as br, a as yr } from "./editorErrors-
|
|
1
|
+
import { D as te, T as M, h as D, B as re, I as q, i as I, j as ne, e as se } from "./UnifiedFontService-CHVYDBDW.js";
|
|
2
|
+
import { k as at, L as it, M as ct, l as lt, S as dt, m as ut, s as mt, n as ft } from "./UnifiedFontService-CHVYDBDW.js";
|
|
3
|
+
import { r as oe, v as ae } from "./validation-DGXAQmUC.js";
|
|
4
|
+
import { a as pt, b as xt, c as gt, d as bt, D as yt, e as vt, f as wt, G as St, K as Ct, g as Tt, L as Et, S as $t, T as kt, Z as At, h as Ft, i as Pt, j as Nt, k as Rt, l as Bt, m as Mt, n as Dt, u as It, o as zt, p as Ot } from "./validation-DGXAQmUC.js";
|
|
5
|
+
import { ImagePanel as Wt } from "./ImagePanel-CIk6z41z.js";
|
|
6
|
+
import { P as ie, a as ce, b as le } from "./ContextualToolbars-BHjYsril.js";
|
|
7
|
+
import { A as Gt, B as _t, c as Ut, C as jt, d as Jt, e as qt, F as Zt, f as Vt, I as Xt, g as Yt, M as Ht, h as Qt, S as er, T as tr, i as rr, j as nr, k as sr, U as or, l as ar, u as ir, m as cr } from "./ContextualToolbars-BHjYsril.js";
|
|
8
|
+
import { u as Z } from "./editorErrors-BhrZ_nwj.js";
|
|
9
|
+
import { E as dr, P as ur, p as mr, s as fr, b as hr, c as pr, d as xr, e as gr, f as br, a as yr } from "./editorErrors-BhrZ_nwj.js";
|
|
10
10
|
import { T as wr, u as Sr } from "./ThemeContext-Rjz25x9X.js";
|
|
11
|
-
import { c as de, G as ue, F as me, g as fe, r as he, u as pe } from "./FontAnalyzer-
|
|
12
|
-
import { A as Tr, B as Er, I as $r, P as kr, R as Ar, S as Fr, T as Pr, h as Nr, a as Rr, b as Br, i as Mr, d as Dr, e as Ir, f as zr, j as Or, k as Lr, l as Wr, m as Kr, n as Gr, o as _r, p as Ur, q as jr, s as Jr, t as qr, v as Zr, w as Vr, x as Xr } from "./FontAnalyzer-
|
|
13
|
-
import { i as Hr, a as Qr, b as en, c as tn, d as rn } from "./guards-
|
|
11
|
+
import { c as de, G as ue, F as me, g as fe, r as he, u as pe } from "./FontAnalyzer-EF3gLPr8.js";
|
|
12
|
+
import { A as Tr, B as Er, I as $r, P as kr, R as Ar, S as Fr, T as Pr, h as Nr, a as Rr, b as Br, i as Mr, d as Dr, e as Ir, f as zr, j as Or, k as Lr, l as Wr, m as Kr, n as Gr, o as _r, p as Ur, q as jr, s as Jr, t as qr, v as Zr, w as Vr, x as Xr } from "./FontAnalyzer-EF3gLPr8.js";
|
|
13
|
+
import { i as Hr, a as Qr, b as en, c as tn, d as rn } from "./guards-DIX8aXWM.js";
|
|
14
14
|
import { useState as A, useCallback as y, useEffect as V, useMemo as X, useRef as B, memo as xe } from "react";
|
|
15
|
-
import { I as ge } from "./ExportManager-
|
|
15
|
+
import { I as ge } from "./ExportManager-BTcyj4cf.js";
|
|
16
16
|
import { e as be, c as ye } from "./compose-DtQL_oit.js";
|
|
17
17
|
import { jsxs as b, jsx as a, Fragment as ve } from "react/jsx-runtime";
|
|
18
|
-
import { P as sn, p as on, u as an } from "./usePieceGuideBundle-
|
|
18
|
+
import { P as sn, p as on, u as an } from "./usePieceGuideBundle-DE21DQGZ.js";
|
|
19
19
|
const ze = ({
|
|
20
20
|
title: e,
|
|
21
21
|
icon: t,
|
package/dist/api/embed.d.ts
CHANGED
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
*
|
|
35
35
|
* @packageDocumentation
|
|
36
36
|
*/
|
|
37
|
-
export { Editor, DesignStateStore, useProductSelection } from '../components/editor/index.js';
|
|
38
|
-
export type { EditorRootProps, EditorRootBaseProps, EditorCanvasProps, EditorPreviewProps, EditorTextFieldProps, EditorBuyProps, EditorBuyPayload, BuyMissingReason, DesignState, EditorLayersProps, EditorControlsProps, EditorHistoryProps, EditorMenuProps, EditorAddProps, ProductSelectionApi, ProductOptionChoice, ProductSelectionAttribute, } from '../components/editor/index.js';
|
|
37
|
+
export { Editor, DesignStateStore, useProductSelection, usePlacements, auditEditor } from '../components/editor/index.js';
|
|
38
|
+
export type { EditorAuditReport, EditorAuditFinding, EditorAuditFindingCode, EditorRootProps, EditorRootBaseProps, EditorCanvasProps, EditorPlacementsProps, PlacementInfo, UsePlacementsReturn, EditorPreviewProps, EditorLoadingOverlayProps, EditorTextFieldProps, EditorBuyProps, EditorBuyPayload, BuyMissingReason, DesignState, EditorLayersProps, EditorControlsProps, EditorHistoryProps, EditorMenuProps, EditorAddProps, ProductSelectionApi, ProductOptionChoice, ProductSelectionAttribute, } from '../components/editor/index.js';
|
|
39
39
|
export { EditorError, isEditorError } from '../errors/editorError.js';
|
|
40
40
|
export type { EditorErrorCode, EditorErrorData } from '../errors/editorError.js';
|
|
41
41
|
export { RealtimeEmbed } from '../components/embed-realtime/RealtimeEmbed.js';
|
|
@@ -55,10 +55,14 @@ export { design, DesignBuilder, isLayerToken, isColorToken } from '../design/des
|
|
|
55
55
|
export type { Anchor, ShapeKind, DesignArtboard, StateArtboard, FromStateOptions, AnyDesign, LayerKind, LayerToken, ColorToken, } from '../design/design-builder.js';
|
|
56
56
|
export { useEditor } from '../contexts/EditorContext.js';
|
|
57
57
|
export type { EditorContextValue, EditorProviderProps } from '../contexts/EditorContext.js';
|
|
58
|
+
export type { EditorElement, AddElementSpec, ElementHandle } from '../contexts/EditorContext.js';
|
|
59
|
+
export { isTextElement, isImageElement, isShapeElement, isGroupElement, isPathElement, editorElementKind, } from '../core/elementGuards.js';
|
|
60
|
+
export type { EditorElementKind } from '../core/elementGuards.js';
|
|
58
61
|
export { useLayers } from '../hooks/useLayers.js';
|
|
59
62
|
export type { LayerInfo, UseLayersOptions, UseLayersReturn } from '../hooks/useLayers.js';
|
|
60
63
|
export { useCommands } from '../hooks/useCommands.js';
|
|
61
64
|
export type { UseCommandsReturn } from '../hooks/useCommands.js';
|
|
65
|
+
export type { ElementPatch, UpdateElementOptions } from '../hooks/elementPatch.js';
|
|
62
66
|
export { useArtboards } from '../hooks/useArtboards.js';
|
|
63
67
|
export type { ArtboardInfo, UseArtboardsReturn } from '../hooks/useArtboards.js';
|
|
64
68
|
export { useExport } from '../hooks/useExport.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { default as React, CSSProperties } from 'react';
|
|
2
|
+
export interface EditorLoadingOverlayProps {
|
|
3
|
+
/** "dark" (default): screen-blended neon bands for image/dark surfaces.
|
|
4
|
+
* "light": multiply-blended candy bands for light cards. */
|
|
5
|
+
variant?: 'dark' | 'light';
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: CSSProperties;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Stable since ADR-0085 P4 (additive); part name: `loading-overlay`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function EditorLoadingOverlay({ variant, className, style, }: EditorLoadingOverlayProps): React.ReactElement | null;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { default as React, CSSProperties } from 'react';
|
|
2
|
+
export interface EditorPlacementsProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
style?: CSSProperties;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Placement tabs for a multi-placement design.
|
|
8
|
+
*
|
|
9
|
+
* Styling contract: `data-sc-part="placements"` on the row,
|
|
10
|
+
* `data-sc-part="placements-item"` + `data-sc-active="true|false"` +
|
|
11
|
+
* `aria-pressed` per tab — restyle via those hooks and the `.sc-root` tokens;
|
|
12
|
+
* the built-in styling is deliberately minimal.
|
|
13
|
+
*/
|
|
14
|
+
export declare function EditorPlacements({ className, style }: EditorPlacementsProps): React.ReactElement | null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { default as React, CSSProperties, ReactNode } from 'react';
|
|
1
|
+
import { default as React, CSSProperties, ReactElement, ReactNode } from 'react';
|
|
2
2
|
export interface EditorPreviewProps {
|
|
3
3
|
/** Which mockup scene to show (a `product.mockupIds` entry). Defaults to the
|
|
4
4
|
* first mockup that has rendered. */
|
|
@@ -8,6 +8,36 @@ export interface EditorPreviewProps {
|
|
|
8
8
|
fallback?: ReactNode;
|
|
9
9
|
/** Alt text for the rendered image. */
|
|
10
10
|
alt?: string;
|
|
11
|
+
/**
|
|
12
|
+
* The render-in-flight loading treatment. A mockup preview ALWAYS has one:
|
|
13
|
+
* a server render takes real time, and the loader paints OVER the
|
|
14
|
+
* still-visible previous mockup — it never blanks or replaces it.
|
|
15
|
+
*
|
|
16
|
+
* **Defaults to `"dark"`** — the snowcone rainbow (the www PDP's prism
|
|
17
|
+
* loader): screen-blended neon bands shimmering over the previous mockup,
|
|
18
|
+
* with a 200ms show-delay (cached/instant renders never flash it) and a
|
|
19
|
+
* 400ms post-render linger. `"light"`: multiply-blended candy bands on an
|
|
20
|
+
* opaque light plate, for previews on light cards. Pass a custom
|
|
21
|
+
* `ReactElement` to render your own indicator instead — it mounts inside
|
|
22
|
+
* the frame (absolutely positioned over the image) with the same
|
|
23
|
+
* show-delay/linger choreography.
|
|
24
|
+
*
|
|
25
|
+
* In all of the above the part is a positioned stage:
|
|
26
|
+
* `data-sc-part="preview"` is a `.sc-preview-frame` div (which receives
|
|
27
|
+
* `className`/`style`), the `<img>` inside is
|
|
28
|
+
* `data-sc-part="preview-image"`, and the loading layer is
|
|
29
|
+
* `data-sc-part="preview-loading"`.
|
|
30
|
+
*
|
|
31
|
+
* `"host-owned"` reverts to the bare `<img>` DOM with no overlay — pass it
|
|
32
|
+
* ONLY when the host renders its own indicator, via the styling contract
|
|
33
|
+
* (`data-sc-preview-state="rendering"`) or the standalone
|
|
34
|
+
* `<Editor.LoadingOverlay>` part.
|
|
35
|
+
*
|
|
36
|
+
* Anything else (`false`, `"none"`, …) throws `E_PREVIEW_NO_LOADER`, dev
|
|
37
|
+
* AND prod: a mockup surface with no loading affordance is a composition
|
|
38
|
+
* mistake (silent emptiness, then pop-in), not a preference.
|
|
39
|
+
*/
|
|
40
|
+
loadingOverlay?: true | 'dark' | 'light' | 'host-owned' | ReactElement;
|
|
11
41
|
className?: string;
|
|
12
42
|
style?: CSSProperties;
|
|
13
43
|
}
|
|
@@ -31,10 +61,4 @@ export declare function suggestRenderWidth(devicePx: number): number;
|
|
|
31
61
|
* {@link RESOLUTION_MISMATCH_RATIO}) or either measurement is unusable.
|
|
32
62
|
*/
|
|
33
63
|
export declare function resolutionMismatchHint(naturalWidth: number, devicePx: number): string | null;
|
|
34
|
-
|
|
35
|
-
* The live product mockup. Mount as many as you need under one Root.
|
|
36
|
-
*
|
|
37
|
-
* Stable since ADR-0085 P4 (the default editor is rebuilt from this public
|
|
38
|
-
* surface, CI-gated); additive-only from here.
|
|
39
|
-
*/
|
|
40
|
-
export declare function EditorPreview({ mockupId, fallback, alt, className, style, }: EditorPreviewProps): React.ReactElement;
|
|
64
|
+
export declare function EditorPreview({ mockupId, fallback, alt, loadingOverlay, className, style, }: EditorPreviewProps): React.ReactElement;
|
|
@@ -3,6 +3,7 @@ import { RenderProduct, MockupResult, RealtimeGrant } from '@snowcone-app/sdk';
|
|
|
3
3
|
import { AnyDesign } from '../../design/design-builder.js';
|
|
4
4
|
import { CanvasServices } from '../../contexts/CanvasServicesContext.js';
|
|
5
5
|
import { EmbedIssue } from '../embed-realtime/validateEmbed.js';
|
|
6
|
+
import { EditorAuditReport } from './editorAudit.js';
|
|
6
7
|
/**
|
|
7
8
|
* How the session authorizes. Provide exactly one — the discriminated union makes
|
|
8
9
|
* "I forgot the grant" a compile error rather than a silent runtime hang.
|
|
@@ -52,6 +53,17 @@ export type EditorRootBaseProps = {
|
|
|
52
53
|
* boundary.)
|
|
53
54
|
*/
|
|
54
55
|
onIssue?: (issue: EmbedIssue) => void;
|
|
56
|
+
/**
|
|
57
|
+
* The composition-audit channel (`Editor.audit()`, agentic-DX #10): fires
|
|
58
|
+
* ONCE after mount settles (every part's layout-effect registration is in,
|
|
59
|
+
* the design store holds its first snapshot), dev AND prod — like
|
|
60
|
+
* `onIssue`, a machine-readable callback, never console output. The report
|
|
61
|
+
* lists structured findings (stable `A_*` codes, each with the fix) plus a
|
|
62
|
+
* census of mounted parts. It fires even when a composition mistake throws
|
|
63
|
+
* into Root's boundary, carrying the registry state the throw saw. For a
|
|
64
|
+
* fresh report after interacting, call `auditEditor()`.
|
|
65
|
+
*/
|
|
66
|
+
onAudit?: (report: EditorAuditReport) => void;
|
|
55
67
|
/** Override the realtime WS endpoint (defaults to the SDK's prod URL). */
|
|
56
68
|
wsUrl?: string;
|
|
57
69
|
/**
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface PreviewPrismOverlayProps {
|
|
3
|
+
/** When false, fade out then call onExited (use it to unmount). */
|
|
4
|
+
visible?: boolean;
|
|
5
|
+
onExited?: () => void;
|
|
6
|
+
/** "dark" (default): screen-blended neon bands for image/dark stages.
|
|
7
|
+
* "light": multiply-blended candy bands on an opaque light plate. */
|
|
8
|
+
variant?: 'dark' | 'light';
|
|
9
|
+
}
|
|
10
|
+
export declare const PreviewPrismOverlay: React.NamedExoticComponent<PreviewPrismOverlayProps>;
|
|
11
|
+
/**
|
|
12
|
+
* Show/hide choreography for a render-in-flight overlay: show-delayed mount
|
|
13
|
+
* (fast renders never flash it), post-render linger, fade-out unmount.
|
|
14
|
+
* Mirrors @snowcone-app/ui's `useLoadingOverlay` + the PDP hero's linger.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useRenderLoadingOverlay(isLoading: boolean): {
|
|
17
|
+
/** Mount the overlay? */
|
|
18
|
+
showOverlay: boolean;
|
|
19
|
+
/** The overlay's `visible` prop (false starts the fade-out). */
|
|
20
|
+
overlayVisible: boolean;
|
|
21
|
+
/** Pass as `onExited` — unmounts after the fade. */
|
|
22
|
+
handleExited: () => void;
|
|
23
|
+
};
|
|
@@ -14,11 +14,24 @@ export interface TextFieldRegistration {
|
|
|
14
14
|
name: string;
|
|
15
15
|
optional: boolean;
|
|
16
16
|
}
|
|
17
|
+
/** Audit-relevant facts a part declares alongside its census registration
|
|
18
|
+
* (`Editor.audit()`, #10). Every key is optional — most parts have none. */
|
|
19
|
+
export interface EditorPartMeta {
|
|
20
|
+
/** `Editor.Preview`: the pinned mockup scene, when the prop was given. */
|
|
21
|
+
mockupId?: string;
|
|
22
|
+
/** `Editor.Canvas`: the `floatingToolbar` prop value (default `true`). */
|
|
23
|
+
floatingToolbar?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface EditorPartRegistration {
|
|
26
|
+
name: string;
|
|
27
|
+
meta: EditorPartMeta;
|
|
28
|
+
}
|
|
17
29
|
export declare class EditorPartsRegistry {
|
|
18
30
|
private canvasIds;
|
|
19
31
|
private requirements;
|
|
20
32
|
private textFields;
|
|
21
33
|
private controls;
|
|
34
|
+
private parts;
|
|
22
35
|
private bridge;
|
|
23
36
|
private listeners;
|
|
24
37
|
private version;
|
|
@@ -51,6 +64,15 @@ export declare class EditorPartsRegistry {
|
|
|
51
64
|
* suppressing (it declares today's default explicitly). */
|
|
52
65
|
registerControls(instanceId: string, placement: 'docked' | 'floating'): () => void;
|
|
53
66
|
hasDockedControls(): boolean;
|
|
67
|
+
/** Census registration (`Editor.audit()`, #10): every mounted part records
|
|
68
|
+
* its public name + audit-relevant meta. Purely observational — nothing
|
|
69
|
+
* validates through this map. */
|
|
70
|
+
registerPart(instanceId: string, name: string, meta?: EditorPartMeta): () => void;
|
|
71
|
+
/** Every mounted part's census entry (audit input). */
|
|
72
|
+
getParts(): EditorPartRegistration[];
|
|
73
|
+
/** Unique public names of mounted parts that declared a canvas requirement
|
|
74
|
+
* (audit input — same data `validate()` throws `E_REQUIRES_CANVAS` from). */
|
|
75
|
+
requiresCanvasPartNames(): string[];
|
|
54
76
|
registerCanvasBridge(bridge: CanvasBridge): () => void;
|
|
55
77
|
getCanvasBridge(): CanvasBridge | null;
|
|
56
78
|
private bump;
|
|
@@ -89,6 +111,15 @@ export declare function useEditorRootInternals(partName: string): EditorRootInte
|
|
|
89
111
|
* `E_REQUIRES_CANVAS`, validated race-free by Root once per commit).
|
|
90
112
|
*/
|
|
91
113
|
export declare function useRequiresCanvas(partName: string): void;
|
|
114
|
+
/**
|
|
115
|
+
* Census registration for the composition audit (`Editor.audit()`, #10):
|
|
116
|
+
* every `Editor.*` part calls this with its public name (+ audit-relevant
|
|
117
|
+
* meta) so the audit report can list what is mounted. Deliberately TOLERANT
|
|
118
|
+
* of a missing Root (no `E_OUTSIDE_ROOT` here): the parts that require a Root
|
|
119
|
+
* already enforce it through their own hooks, and `Editor.Preview` stays
|
|
120
|
+
* mountable under the legacy wrappers without a new throw path.
|
|
121
|
+
*/
|
|
122
|
+
export declare function useRegisterEditorPart(partName: string, meta?: EditorPartMeta): void;
|
|
92
123
|
/** Shared impl of the invariant channel. @internal */
|
|
93
124
|
export declare function makeInvariantReporter(routeToErrorState: (error: EditorError) => void): {
|
|
94
125
|
reportInvariant: (error: EditorError) => void;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { RenderProduct } from '@snowcone-app/sdk';
|
|
2
|
+
import { DesignStateStore } from './designStateStore.js';
|
|
3
|
+
import { EditorPartsRegistry } from './RootInternals.js';
|
|
4
|
+
/** Stable audit finding codes — the test/agent contract. */
|
|
5
|
+
export type EditorAuditFindingCode =
|
|
6
|
+
/** Requires-canvas parts (Controls/History/Menu/Add) are mounted with no
|
|
7
|
+
* `Editor.Canvas` — the same composition `E_REQUIRES_CANVAS` throws on. */
|
|
8
|
+
'A_REQUIRES_CANVAS'
|
|
9
|
+
/** A docked `Editor.Controls` is mounted while `Editor.Canvas` still has
|
|
10
|
+
* `floatingToolbar` true (the default) — contextual-zone ownership is
|
|
11
|
+
* implied by mount order (spooky), not declared in the type surface. */
|
|
12
|
+
| 'A_CONTROLS_INERT'
|
|
13
|
+
/** `Editor.Preview` without `mockupId` while the product renders more than
|
|
14
|
+
* one mockup scene — which scene the preview shows is ambiguous. */
|
|
15
|
+
| 'A_PREVIEW_AMBIGUOUS'
|
|
16
|
+
/** `Editor.TextField` parts are mounted but no `Editor.Buy` — there is no
|
|
17
|
+
* commerce gate enforcing completeness before checkout. */
|
|
18
|
+
| 'A_NO_BUY'
|
|
19
|
+
/** A mounted `Editor.TextField`'s layer matches zero elements in the
|
|
20
|
+
* CURRENT design snapshot — the binding is dead; writes will fail. */
|
|
21
|
+
| 'A_LAYER_UNMATCHED'
|
|
22
|
+
/** Every required (non-`optional`) `Editor.TextField` still equals its
|
|
23
|
+
* seed value — Buy's completeness rule C3 gates checkout until edited. */
|
|
24
|
+
| 'A_TEXT_AT_SEED'
|
|
25
|
+
/** Zero renderable elements in the design — every mockup renders blank. */
|
|
26
|
+
| 'A_EMPTY_DESIGN';
|
|
27
|
+
export interface EditorAuditFinding {
|
|
28
|
+
code: EditorAuditFindingCode;
|
|
29
|
+
severity: 'error' | 'warn' | 'info';
|
|
30
|
+
/** What is wrong, with the facts (part names, layer names, scene ids). */
|
|
31
|
+
message: string;
|
|
32
|
+
/** The exact prop/part change that resolves the finding. */
|
|
33
|
+
fix: string;
|
|
34
|
+
}
|
|
35
|
+
export interface EditorAuditReport {
|
|
36
|
+
findings: EditorAuditFinding[];
|
|
37
|
+
/** Census of mounted parts, e.g. `{ name: 'Editor.Preview', count: 2 }`.
|
|
38
|
+
* Sorted by name for determinism. */
|
|
39
|
+
parts: Array<{
|
|
40
|
+
name: string;
|
|
41
|
+
count: number;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
/** @internal */
|
|
45
|
+
export interface EditorAuditInput {
|
|
46
|
+
registry: EditorPartsRegistry;
|
|
47
|
+
store: DesignStateStore;
|
|
48
|
+
product: RenderProduct;
|
|
49
|
+
}
|
|
50
|
+
/** Compute the audit report from a Root's live registry + design state.
|
|
51
|
+
* Pure — no logging, no throwing. @internal */
|
|
52
|
+
export declare function computeEditorAudit({ registry, store, product }: EditorAuditInput): EditorAuditReport;
|
|
53
|
+
interface RootAuditEntry {
|
|
54
|
+
compute: () => EditorAuditReport;
|
|
55
|
+
}
|
|
56
|
+
/** Register a mounted Root as an audit target (most-recent wins). @internal */
|
|
57
|
+
export declare function registerRootForAudit(entry: RootAuditEntry): () => void;
|
|
58
|
+
/**
|
|
59
|
+
* Audit the most-recent mounted `<Editor.Root>`'s composition NOW — a fresh
|
|
60
|
+
* report from the live part registry + design state, so it reflects whatever
|
|
61
|
+
* has happened since mount (fields edited, parts mounted/unmounted).
|
|
62
|
+
*
|
|
63
|
+
* Throws `E_AUDIT_NO_ROOT` when no Root is mounted.
|
|
64
|
+
*/
|
|
65
|
+
export declare function auditEditor(): EditorAuditReport;
|
|
66
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EditorRoot } from './EditorRoot.js';
|
|
2
|
+
import { EditorPlacements } from './EditorPlacements.js';
|
|
2
3
|
import { EditorPreview } from './EditorPreview.js';
|
|
3
4
|
import { EditorTextField } from './EditorTextField.js';
|
|
4
5
|
import { EditorBuy } from './EditorBuy.js';
|
|
@@ -7,6 +8,7 @@ import { EditorControls } from './EditorControls.js';
|
|
|
7
8
|
import { EditorHistory } from './EditorHistory.js';
|
|
8
9
|
import { EditorMenu } from './EditorMenu.js';
|
|
9
10
|
import { EditorAdd } from './EditorAdd.js';
|
|
11
|
+
import { EditorLoadingOverlay } from './EditorLoadingOverlay.js';
|
|
10
12
|
export declare const Editor: {
|
|
11
13
|
/** The one provider boundary — session, design, live state, error boundary. */
|
|
12
14
|
readonly Root: typeof EditorRoot;
|
|
@@ -14,6 +16,9 @@ export declare const Editor: {
|
|
|
14
16
|
readonly Canvas: import('react').ForwardRefExoticComponent<import('./EditorCanvas.js').EditorCanvasProps & import('react').RefAttributes<import('./EditorCanvasImpl.js').SnowconeCanvasHandle>>;
|
|
15
17
|
/** Live product mockup. ×N under one Root is valid. */
|
|
16
18
|
readonly Preview: typeof EditorPreview;
|
|
19
|
+
/** Placement switcher tabs (ADR-0088). Renders nothing for a
|
|
20
|
+
* single-placement design; headless floor = usePlacements(). */
|
|
21
|
+
readonly Placements: typeof EditorPlacements;
|
|
17
22
|
/** Form input bound to a design text layer by typed token (T1). */
|
|
18
23
|
readonly TextField: typeof EditorTextField;
|
|
19
24
|
/** Smart commerce part: completeness + payload assembly; submit = host callback. */
|
|
@@ -28,10 +33,17 @@ export declare const Editor: {
|
|
|
28
33
|
readonly Menu: typeof EditorMenu;
|
|
29
34
|
/** The ⊕ add-element menu. Requires Editor.Canvas. */
|
|
30
35
|
readonly Add: typeof EditorAdd;
|
|
36
|
+
/** Standalone render-in-flight rainbow for host-owned preview surfaces.
|
|
37
|
+
* Fills its positioned parent; rides the session (canvas-free). */
|
|
38
|
+
readonly LoadingOverlay: typeof EditorLoadingOverlay;
|
|
31
39
|
};
|
|
32
40
|
export type { EditorRootProps, EditorRootBaseProps, GrantSource } from './EditorRoot.js';
|
|
33
41
|
export type { EditorCanvasProps } from './EditorCanvas.js';
|
|
42
|
+
export type { EditorPlacementsProps } from './EditorPlacements.js';
|
|
43
|
+
export { usePlacements } from './usePlacements.js';
|
|
44
|
+
export type { PlacementInfo, UsePlacementsReturn } from './usePlacements.js';
|
|
34
45
|
export type { EditorPreviewProps } from './EditorPreview.js';
|
|
46
|
+
export type { EditorLoadingOverlayProps } from './EditorLoadingOverlay.js';
|
|
35
47
|
export type { EditorTextFieldProps } from './EditorTextField.js';
|
|
36
48
|
export type { EditorBuyProps, EditorBuyPayload, BuyMissingReason } from './EditorBuy.js';
|
|
37
49
|
export type { DesignState } from './designStateStore.js';
|
|
@@ -40,6 +52,8 @@ export { useProductSelection } from './useProductSelection.js';
|
|
|
40
52
|
export type { ProductSelectionApi } from './useProductSelection.js';
|
|
41
53
|
export { CommerceStateStore } from './commerceStore.js';
|
|
42
54
|
export type { ProductOptionChoice, ProductSelectionAttribute } from './commerceStore.js';
|
|
55
|
+
export { auditEditor } from './editorAudit.js';
|
|
56
|
+
export type { EditorAuditReport, EditorAuditFinding, EditorAuditFindingCode } from './editorAudit.js';
|
|
43
57
|
export type { EditorLayersProps } from './EditorLayers.js';
|
|
44
58
|
export type { EditorControlsProps } from './EditorControls.js';
|
|
45
59
|
export type { EditorHistoryProps } from './EditorHistory.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface PlacementInfo {
|
|
2
|
+
/** The placement label (= the design artboard name, e.g. 'Front'). */
|
|
3
|
+
label: string;
|
|
4
|
+
active: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface UsePlacementsReturn {
|
|
7
|
+
/** Every placement in the design, in author order. */
|
|
8
|
+
placements: PlacementInfo[];
|
|
9
|
+
activePlacement: string;
|
|
10
|
+
/** Switch the active placement. Throws `EditorError E_UNKNOWN_PLACEMENT`
|
|
11
|
+
* for a label that names no design artboard. */
|
|
12
|
+
select: (label: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function usePlacements(): UsePlacementsReturn;
|
|
@@ -10,9 +10,18 @@ export interface EmbedContextValue {
|
|
|
10
10
|
/** The design the embed was seeded with — single source of truth for both the
|
|
11
11
|
* canvas seed and the seed render. */
|
|
12
12
|
design: AnyDesign;
|
|
13
|
-
/** The placement name (= the design's artboard
|
|
14
|
-
*
|
|
13
|
+
/** The ACTIVE placement name (= the design's currently-edited artboard).
|
|
14
|
+
* The canvas follows it as its controlled artboard. Initially the design's
|
|
15
|
+
* active artboard; moved by {@link selectPlacement} (ADR-0088). For a
|
|
16
|
+
* single-placement design this never changes — the pre-0088 behavior. */
|
|
15
17
|
placement: string;
|
|
18
|
+
/** Every placement (artboard name) in the design, in author order. A
|
|
19
|
+
* single-placement design has exactly one entry (ADR-0088). */
|
|
20
|
+
placements: string[];
|
|
21
|
+
/** Switch the active placement. Throws `EditorError E_UNKNOWN_PLACEMENT`
|
|
22
|
+
* for a label that names no design artboard (ADR-0088). Costs zero session
|
|
23
|
+
* work — renders already target every artboard per placement. */
|
|
24
|
+
selectPlacement: (label: string) => void;
|
|
16
25
|
/** The product being rendered against. */
|
|
17
26
|
product: RenderProduct;
|
|
18
27
|
/** Latest mockups from the session. Reactive — updates re-render consumers. */
|
|
@@ -14,7 +14,26 @@ export interface ValidateEmbedInput {
|
|
|
14
14
|
export interface EmbedIssue {
|
|
15
15
|
severity: 'error' | 'warn';
|
|
16
16
|
/** Stable issue key, carried into `EditorError.data.issue` in throw mode. */
|
|
17
|
-
issue:
|
|
17
|
+
issue:
|
|
18
|
+
/** No `shop` (the publishable shop id) was passed. */
|
|
19
|
+
'missing-shop'
|
|
20
|
+
/** No grant source (`grantUrl`/`grant`) — the session can never
|
|
21
|
+
* authorize, so no mockup ever renders. */
|
|
22
|
+
| 'missing-grant'
|
|
23
|
+
/** `product.mockupIds` is empty — nothing to render. */
|
|
24
|
+
| 'empty-mockup-ids'
|
|
25
|
+
/** The product has a variant axis but no `variantId` — the render
|
|
26
|
+
* would hang ~30s waiting on a color blob that never comes. */
|
|
27
|
+
| 'variant-required'
|
|
28
|
+
/** The product requires several placements but this embed renders ONE —
|
|
29
|
+
* the server times out waiting on the rest (needs the eject path). */
|
|
30
|
+
| 'multi-placement'
|
|
31
|
+
/** The design's placement isn't one of the product's placements —
|
|
32
|
+
* the server renders a blank mockup. */
|
|
33
|
+
| 'placement-mismatch'
|
|
34
|
+
/** Two layers share a name — name-bound hooks bind the FIRST match,
|
|
35
|
+
* so a control may edit the wrong layer. */
|
|
36
|
+
| 'duplicate-layer-names'
|
|
18
37
|
/** Runtime (not mount-time): a render has been in flight past
|
|
19
38
|
* `SLOW_RENDER_HINT_MS` with no mockup and no error — the silent-hang
|
|
20
39
|
* class. The render may still arrive; this is a heads-up. */
|
|
@@ -13,6 +13,29 @@ import { TextAlign, ShapeType } from '../types/index.js';
|
|
|
13
13
|
export type { PanOffset } from './ViewportContext.js';
|
|
14
14
|
export type { ExpandedPanelType } from './ToolStateContext.js';
|
|
15
15
|
export type EditorElement = TextElement | ImageElement | GroupElement | ShapeElement | PathElement;
|
|
16
|
+
/**
|
|
17
|
+
* Spec for {@link EditorContextValue.addElement}. `name` makes the created
|
|
18
|
+
* element addressable afterwards (bindings, `updateElement`, layer tokens).
|
|
19
|
+
*/
|
|
20
|
+
export interface AddElementSpec {
|
|
21
|
+
/** What to create. Text seeds editable "New Text"; image without `src` gets a placeholder. */
|
|
22
|
+
type: 'text' | 'shape' | 'image';
|
|
23
|
+
/** Shape variant (default `'rectangle'`). Shape type only. */
|
|
24
|
+
shapeType?: ShapeType;
|
|
25
|
+
/** Image source URL — the element loads it and sizes to the real aspect ratio. Image type only. */
|
|
26
|
+
src?: string;
|
|
27
|
+
/** Layer name for the new element, so it can be targeted afterwards. */
|
|
28
|
+
name?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Handle to an element created by {@link EditorContextValue.addElement}:
|
|
32
|
+
* the generated `id` plus the layer `name` it answers to (empty string when
|
|
33
|
+
* no `name` was given). The new element arrives selected.
|
|
34
|
+
*/
|
|
35
|
+
export interface ElementHandle {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
}
|
|
16
39
|
/**
|
|
17
40
|
* Full value exposed by EditorContext.
|
|
18
41
|
*
|
|
@@ -69,6 +92,17 @@ export interface EditorContextValue {
|
|
|
69
92
|
handleSelectionChange: (id: string | null) => void;
|
|
70
93
|
handleActiveChildChange: (child: EditorElement | null) => void;
|
|
71
94
|
handleElementUpdate: (updatedElement: EditorElement) => void;
|
|
95
|
+
/**
|
|
96
|
+
* Create an element on the active artboard and get a handle back. The new
|
|
97
|
+
* element arrives SELECTED. Throws `E_NO_ACTIVE_ARTBOARD` (an
|
|
98
|
+
* {@link EditorError}, dev AND prod) when there is no artboard to add to.
|
|
99
|
+
*/
|
|
100
|
+
addElement: (spec: AddElementSpec) => Promise<ElementHandle>;
|
|
101
|
+
/**
|
|
102
|
+
* @deprecated Use {@link addElement} — it returns an `ElementHandle`,
|
|
103
|
+
* accepts a `name`, and throws `E_NO_ACTIVE_ARTBOARD` instead of the old
|
|
104
|
+
* `window.alert`. This wrapper now propagates that throw too.
|
|
105
|
+
*/
|
|
72
106
|
handleAddElement: (elementType: string, opts?: {
|
|
73
107
|
shapeType?: ShapeType;
|
|
74
108
|
src?: string;
|
|
@@ -41,6 +41,13 @@ export declare class HybridHistoryManager {
|
|
|
41
41
|
* Execute a command on a specific artboard
|
|
42
42
|
*/
|
|
43
43
|
executeOnArtboard(artboardId: string, command: Command): void;
|
|
44
|
+
/**
|
|
45
|
+
* Peek at the command currently on top of an artboard's history (the entry
|
|
46
|
+
* the next `undoArtboard` would undo), or null. Used by `updateElement`'s
|
|
47
|
+
* coalescing to verify its last command is still the live tip before
|
|
48
|
+
* folding a new patch into it.
|
|
49
|
+
*/
|
|
50
|
+
peekArtboard(artboardId: string): Command | null;
|
|
44
51
|
/**
|
|
45
52
|
* Smart undo - determines which history to use
|
|
46
53
|
*/
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TextElement } from './TextElement.js';
|
|
2
|
+
import { ImageElement } from './ImageElement.js';
|
|
3
|
+
import { ShapeElement } from './ShapeElement.js';
|
|
4
|
+
import { GroupElement } from './GroupElement.js';
|
|
5
|
+
import { PathElement } from './PathElement.js';
|
|
6
|
+
/** The element kinds an {@link EditorElement} can be. */
|
|
7
|
+
export type EditorElementKind = 'text' | 'image' | 'shape' | 'group' | 'path';
|
|
8
|
+
/** Narrow to a text element (`text`, `fontSize`, `color`, `fontFamily`, …). */
|
|
9
|
+
export declare function isTextElement(el: unknown): el is TextElement;
|
|
10
|
+
/** Narrow to an image element (`imageUrl`, crop state, `transformData.width/height`). */
|
|
11
|
+
export declare function isImageElement(el: unknown): el is ImageElement;
|
|
12
|
+
/** Narrow to a shape element (`transformData.shapeType/fillColor/width/height`). */
|
|
13
|
+
export declare function isShapeElement(el: unknown): el is ShapeElement;
|
|
14
|
+
/** Narrow to a group element (`children`). */
|
|
15
|
+
export declare function isGroupElement(el: unknown): el is GroupElement;
|
|
16
|
+
/** Narrow to a path element (pen-tool vector paths). */
|
|
17
|
+
export declare function isPathElement(el: unknown): el is PathElement;
|
|
18
|
+
/** The kind discriminant for an element, or `null` for non-elements. */
|
|
19
|
+
export declare function editorElementKind(el: unknown): EditorElementKind | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as i, jsxs as h } from "react/jsx-runtime";
|
|
2
2
|
import * as c from "react";
|
|
3
|
-
import { n as T, y,
|
|
3
|
+
import { n as T, z as y, O as w } from "./UnifiedFontService-CHVYDBDW.js";
|
|
4
4
|
import * as R from "@radix-ui/react-label";
|
|
5
5
|
import { cva as S } from "class-variance-authority";
|
|
6
6
|
import * as g from "@radix-ui/react-tabs";
|
|
@@ -55,8 +55,8 @@ const E = c.forwardRef(
|
|
|
55
55
|
E.displayName = "Input";
|
|
56
56
|
const C = S(
|
|
57
57
|
"sc:block sc:text-sm sc:leading-none sc:text-foreground sc:peer-disabled:cursor-not-allowed sc:peer-disabled:opacity-70 sc:font-label"
|
|
58
|
-
),
|
|
59
|
-
|
|
58
|
+
), O = c.forwardRef(({ className: s, ...e }, a) => /* @__PURE__ */ i(R.Root, { ref: a, className: y(C(), s), ...e }));
|
|
59
|
+
O.displayName = R.Root.displayName;
|
|
60
60
|
const L = c.forwardRef(
|
|
61
61
|
({ value: s, onValueChange: e, ...a }, t) => /* @__PURE__ */ i(g.Root, { ref: t, value: s, onValueChange: e, ...a })
|
|
62
62
|
);
|
|
@@ -170,10 +170,10 @@ const I = c.forwardRef(
|
|
|
170
170
|
({ className: s, ...e }, a) => /* @__PURE__ */ i("div", { ref: a, className: s, ...e })
|
|
171
171
|
);
|
|
172
172
|
I.displayName = "TabsListContainer";
|
|
173
|
-
const
|
|
173
|
+
const j = x, B = N, P = () => null, q = L, z = Object.assign(q, {
|
|
174
174
|
List: k,
|
|
175
175
|
ListContainer: I,
|
|
176
|
-
Tab:
|
|
176
|
+
Tab: j,
|
|
177
177
|
Trigger: x,
|
|
178
178
|
Panel: B,
|
|
179
179
|
Content: N,
|
|
@@ -227,10 +227,10 @@ const D = ({ className: s, size: e = 24 }) => /* @__PURE__ */ h(
|
|
|
227
227
|
);
|
|
228
228
|
export {
|
|
229
229
|
E as I,
|
|
230
|
-
|
|
230
|
+
O as L,
|
|
231
231
|
D as R,
|
|
232
232
|
W as S,
|
|
233
233
|
z as T,
|
|
234
234
|
A as a
|
|
235
235
|
};
|
|
236
|
-
//# sourceMappingURL=custom-icons-
|
|
236
|
+
//# sourceMappingURL=custom-icons-CcLMyybv.js.map
|