@kywi-software/core 0.6.2 → 0.6.4

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.
Files changed (85) hide show
  1. package/AGENT-PATTERNS.md +221 -16
  2. package/README.md +23 -5
  3. package/dist/admin/layout-editor/column-overlay.d.ts +14 -1
  4. package/dist/admin/layout-editor/column-overlay.d.ts.map +1 -1
  5. package/dist/admin/layout-editor/column-overlay.js +5 -2
  6. package/dist/admin/layout-editor/column-overlay.js.map +1 -1
  7. package/dist/admin/layout-editor/editor-canvas.d.ts +34 -1
  8. package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
  9. package/dist/admin/layout-editor/editor-canvas.js +156 -16
  10. package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
  11. package/dist/admin/layout-editor/editor-state.d.ts +57 -2
  12. package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
  13. package/dist/admin/layout-editor/editor-state.js +125 -53
  14. package/dist/admin/layout-editor/editor-state.js.map +1 -1
  15. package/dist/admin/layout-editor/editor.css +487 -44
  16. package/dist/admin/layout-editor/index.d.ts +1 -1
  17. package/dist/admin/layout-editor/index.d.ts.map +1 -1
  18. package/dist/admin/layout-editor/index.js.map +1 -1
  19. package/dist/admin/layout-editor/inline-text.d.ts +44 -0
  20. package/dist/admin/layout-editor/inline-text.d.ts.map +1 -0
  21. package/dist/admin/layout-editor/inline-text.js +67 -0
  22. package/dist/admin/layout-editor/inline-text.js.map +1 -0
  23. package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
  24. package/dist/admin/layout-editor/layout-editor.js +23 -31
  25. package/dist/admin/layout-editor/layout-editor.js.map +1 -1
  26. package/dist/admin/layout-editor/module-overlay.d.ts +32 -1
  27. package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
  28. package/dist/admin/layout-editor/module-overlay.js +108 -6
  29. package/dist/admin/layout-editor/module-overlay.js.map +1 -1
  30. package/dist/admin/layout-editor/node-lookup.d.ts +94 -0
  31. package/dist/admin/layout-editor/node-lookup.d.ts.map +1 -0
  32. package/dist/admin/layout-editor/node-lookup.js +142 -0
  33. package/dist/admin/layout-editor/node-lookup.js.map +1 -0
  34. package/dist/admin/layout-editor/overlay-shell.d.ts +19 -1
  35. package/dist/admin/layout-editor/overlay-shell.d.ts.map +1 -1
  36. package/dist/admin/layout-editor/overlay-shell.js +177 -69
  37. package/dist/admin/layout-editor/overlay-shell.js.map +1 -1
  38. package/dist/admin/layout-editor/props-panel.d.ts +9 -2
  39. package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
  40. package/dist/admin/layout-editor/props-panel.js +13 -5
  41. package/dist/admin/layout-editor/props-panel.js.map +1 -1
  42. package/dist/admin/layout-editor/region-overlay.d.ts +8 -1
  43. package/dist/admin/layout-editor/region-overlay.d.ts.map +1 -1
  44. package/dist/admin/layout-editor/region-overlay.js +4 -1
  45. package/dist/admin/layout-editor/region-overlay.js.map +1 -1
  46. package/dist/admin/layout-editor/section-insert-line.d.ts +7 -1
  47. package/dist/admin/layout-editor/section-insert-line.d.ts.map +1 -1
  48. package/dist/admin/layout-editor/section-insert-line.js +4 -1
  49. package/dist/admin/layout-editor/section-insert-line.js.map +1 -1
  50. package/dist/admin/layout-editor/section-overlay.d.ts +13 -1
  51. package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
  52. package/dist/admin/layout-editor/section-overlay.js +24 -12
  53. package/dist/admin/layout-editor/section-overlay.js.map +1 -1
  54. package/dist/admin/layout-editor/section-variant-container-config.d.ts +29 -0
  55. package/dist/admin/layout-editor/section-variant-container-config.d.ts.map +1 -0
  56. package/dist/admin/layout-editor/section-variant-container-config.js +82 -0
  57. package/dist/admin/layout-editor/section-variant-container-config.js.map +1 -0
  58. package/dist/admin/styles/admin.css +5 -2
  59. package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -1
  60. package/dist/admin/surfaces/content/content-edit.js +8 -1
  61. package/dist/admin/surfaces/content/content-edit.js.map +1 -1
  62. package/dist/db/content-queries.d.ts +35 -0
  63. package/dist/db/content-queries.d.ts.map +1 -1
  64. package/dist/db/content-queries.js +175 -36
  65. package/dist/db/content-queries.js.map +1 -1
  66. package/dist/layout/registry.d.ts +8 -1
  67. package/dist/layout/registry.d.ts.map +1 -1
  68. package/dist/layout/registry.js +8 -1
  69. package/dist/layout/registry.js.map +1 -1
  70. package/dist/nav/index.d.ts +1 -1
  71. package/dist/nav/index.d.ts.map +1 -1
  72. package/dist/nav/index.js +4 -1
  73. package/dist/nav/index.js.map +1 -1
  74. package/dist/nav/url-resolver.d.ts +27 -0
  75. package/dist/nav/url-resolver.d.ts.map +1 -1
  76. package/dist/nav/url-resolver.js +36 -1
  77. package/dist/nav/url-resolver.js.map +1 -1
  78. package/dist/scope/edit-mode-hooks.d.ts.map +1 -1
  79. package/dist/scope/edit-mode-hooks.js +27 -1
  80. package/dist/scope/edit-mode-hooks.js.map +1 -1
  81. package/dist/scope/inline-editing.d.ts.map +1 -1
  82. package/dist/scope/inline-editing.js +2 -1
  83. package/dist/scope/inline-editing.js.map +1 -1
  84. package/dist/site/styles.css +147 -4
  85. package/package.json +1 -1
@@ -0,0 +1,142 @@
1
+ /**
2
+ * node-lookup.ts
3
+ * Arm-aware traversal for the layout editor (kywi-cms#92).
4
+ *
5
+ * A region's node array holds `LayoutSection`s *and* `VariantContainer`s. A
6
+ * container is not a leaf: it owns a Default arm (`defaultSections`) plus one
7
+ * arm per `VariantEntry` (`variants[].sections`), and every one of those arms
8
+ * holds ordinary sections. Editor lookups used to stop at the top level, which
9
+ * is exactly why section-level personalized / A-B'd content (typically the
10
+ * hero) was invisible and uneditable in the canvas.
11
+ *
12
+ * Everything here walks the same shape as the renderer
13
+ * (`VariantContainerRenderer`) and `layout/module-permissions.ts`: region nodes
14
+ * → container arms → sections → columns → modules.
15
+ */
16
+ import { isLayoutSection } from '../../layout/types.js';
17
+ /**
18
+ * Arm id standing for a container's Default arm. Real arms are keyed by their
19
+ * `VariantEntry.id`, so a reserved literal keeps "which arm is open" a single
20
+ * `string` rather than `string | null` everywhere it is stored or compared.
21
+ * The renderer uses the same word for its `data-variant` attribute.
22
+ */
23
+ export const DEFAULT_ARM_ID = 'default';
24
+ /** Narrow a RegionNode to a VariantContainer (mirrors `isLayoutSection`). */
25
+ export function isVariantContainer(node) {
26
+ return node.type === 'variantContainer';
27
+ }
28
+ /**
29
+ * Every section-holding array in a regions map, in document order: each
30
+ * region's own node list first, then each variant container's Default arm and
31
+ * variant arms.
32
+ */
33
+ export function* iterSectionHolders(regions) {
34
+ for (const [regionName, nodes] of Object.entries(regions)) {
35
+ yield { regionName, region: nodes, siblings: nodes, container: null, armId: null };
36
+ for (const node of nodes) {
37
+ if (!isVariantContainer(node))
38
+ continue;
39
+ yield {
40
+ regionName,
41
+ region: nodes,
42
+ siblings: node.defaultSections,
43
+ container: node,
44
+ armId: DEFAULT_ARM_ID,
45
+ };
46
+ for (const variant of node.variants) {
47
+ yield {
48
+ regionName,
49
+ region: nodes,
50
+ siblings: variant.sections,
51
+ container: node,
52
+ armId: variant.id,
53
+ };
54
+ }
55
+ }
56
+ }
57
+ }
58
+ /** The sections of one arm, or null when `armId` names no arm of this container. */
59
+ export function armSections(container, armId) {
60
+ if (armId === DEFAULT_ARM_ID)
61
+ return container.defaultSections;
62
+ return container.variants.find(v => v.id === armId)?.sections ?? null;
63
+ }
64
+ /**
65
+ * The sections the editor should show for `armId`, falling back to the Default
66
+ * arm when the requested arm no longer exists (e.g. it was just deleted while
67
+ * open). Never null, so the canvas always has something to render.
68
+ */
69
+ export function resolveArmSections(container, armId) {
70
+ return armSections(container, armId) ?? container.defaultSections;
71
+ }
72
+ /** Find a section by id anywhere in the regions map, including container arms. */
73
+ export function findSectionIn(regions, sectionId) {
74
+ for (const holder of iterSectionHolders(regions)) {
75
+ for (let i = 0; i < holder.siblings.length; i++) {
76
+ const node = holder.siblings[i];
77
+ if (node !== undefined && isLayoutSection(node) && node.id === sectionId) {
78
+ return { holder, section: node, index: i };
79
+ }
80
+ }
81
+ }
82
+ return null;
83
+ }
84
+ /** Find a column by id anywhere in the regions map, including container arms. */
85
+ export function findColumnIn(regions, columnId) {
86
+ for (const holder of iterSectionHolders(regions)) {
87
+ for (const node of holder.siblings) {
88
+ if (!isLayoutSection(node))
89
+ continue;
90
+ for (const column of node.columns) {
91
+ if (column.id === columnId)
92
+ return { holder, section: node, column };
93
+ }
94
+ }
95
+ }
96
+ return null;
97
+ }
98
+ /** Find a module by id anywhere in the regions map, including container arms. */
99
+ export function findModuleIn(regions, moduleId) {
100
+ for (const holder of iterSectionHolders(regions)) {
101
+ for (const node of holder.siblings) {
102
+ if (!isLayoutSection(node))
103
+ continue;
104
+ for (const column of node.columns) {
105
+ for (let mi = 0; mi < column.nodes.length; mi++) {
106
+ const module = column.nodes[mi];
107
+ if (module !== undefined && module.id === moduleId) {
108
+ return { holder, section: node, column, module, moduleIndex: mi };
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return null;
115
+ }
116
+ /** Find a variant container by id. Containers only ever live at region level. */
117
+ export function findVariantContainerIn(regions, containerId) {
118
+ for (const [regionName, nodes] of Object.entries(regions)) {
119
+ for (let i = 0; i < nodes.length; i++) {
120
+ const node = nodes[i];
121
+ if (node !== undefined && isVariantContainer(node) && node.id === containerId) {
122
+ return { regionName, region: nodes, container: node, index: i };
123
+ }
124
+ }
125
+ }
126
+ return null;
127
+ }
128
+ // ── Document-level readers ───────────────────────────────────────────────────
129
+ //
130
+ // Read-only convenience for the editor shells, which resolve the current
131
+ // selection straight from `layout.regions` (matching their prior behaviour —
132
+ // they have never searched pageVariant / abExperiment regions).
133
+ export function findModuleInDocument(layout, moduleId) {
134
+ return findModuleIn(layout.regions, moduleId)?.module ?? null;
135
+ }
136
+ export function findSectionInDocument(layout, sectionId) {
137
+ return findSectionIn(layout.regions, sectionId)?.section ?? null;
138
+ }
139
+ export function findVariantContainerInDocument(layout, containerId) {
140
+ return findVariantContainerIn(layout.regions, containerId)?.container ?? null;
141
+ }
142
+ //# sourceMappingURL=node-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-lookup.js","sourceRoot":"","sources":["../../../src/admin/layout-editor/node-lookup.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,24 @@ export interface OverlayShellProps {
24
24
  onSchedule?: (layout: LayoutDocument, scheduledAt: string) => void;
25
25
  /** Current user's role — gates admin-only modules in the palette. */
26
26
  userRole?: string;
27
+ /**
28
+ * Class name the host puts on the page's own body wrapper (the scaffold's
29
+ * `page page--layout` article). Applied to the in-place flow container so the
30
+ * site's own page-level rules — width, gutters, vertical rhythm — still apply
31
+ * while editing (kywi-cms#94). Without it the editor would render the regions
32
+ * outside the wrapper the site styles them in.
33
+ */
34
+ pageClassName?: string;
27
35
  }
28
- export declare function OverlayShell({ editMode, initialLayout, contentId, contentType, pageTitle, themeName, themeRegistry, moduleRegistry, moduleComponents, onSave, onPublish, onSchedule, userRole, }: OverlayShellProps): import("react/jsx-runtime").JSX.Element | null;
36
+ /**
37
+ * The front-of-site editor (kywi-cms#94).
38
+ *
39
+ * This is not a modal over the page: the page renders in normal document flow,
40
+ * at its real width, through its own stylesheet — `EditorCanvas` in `inPlace`
41
+ * mode emits the public renderer's markup — and every piece of editing chrome
42
+ * is a fixed rail docked to a viewport edge. Selection outlines, the props rail
43
+ * and inline text editing sit ON the page instead of framing it, and a
44
+ * persistent Done returns to the browse-mode toolbar.
45
+ */
46
+ export declare function OverlayShell({ editMode, initialLayout, contentId, contentType, pageTitle, themeName: _themeName, themeRegistry: _themeRegistry, moduleRegistry, moduleComponents, onSave, onPublish, onSchedule, userRole, pageClassName, }: OverlayShellProps): import("react/jsx-runtime").JSX.Element | null;
29
47
  //# sourceMappingURL=overlay-shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-shell.d.ts","sourceRoot":"","sources":["../../../src/admin/layout-editor/overlay-shell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuD,MAAM,OAAO,CAAA;AAU3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAOvE,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAClE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,aAAa,EAAE,cAAc,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,aAAa,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC,CAAA;IACzH,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IAC/D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAClE,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAoBD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,GACT,EAAE,iBAAiB,kDA2QnB"}
1
+ {"version":3,"file":"overlay-shell.d.ts","sourceRoot":"","sources":["../../../src/admin/layout-editor/overlay-shell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAwE,MAAM,OAAO,CAAA;AAU5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAiBvE,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAClE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE/D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,aAAa,EAAE,cAAc,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,aAAa,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC,CAAA;IACzH,MAAM,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IAC/D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAClE,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,cAAc,EAC7B,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,GACd,EAAE,iBAAiB,kDA+bnB"}
@@ -1,38 +1,64 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useReducer, useState, useCallback, useEffect } from 'react';
3
+ import { useReducer, useState, useCallback, useEffect, useMemo, useRef } from 'react';
4
4
  import { DndContext, PointerSensor, KeyboardSensor, useSensors, useSensor, closestCenter, } from '@dnd-kit/core';
5
- import { isLayoutSection } from '../../layout/types.js';
6
5
  import { editorReducer, createInitialState } from './editor-state.js';
6
+ import { findModuleInDocument, findSectionInDocument, findVariantContainerInDocument, } from './node-lookup.js';
7
+ import { resolveDragEndAction } from './drag-utils.js';
7
8
  import { EditorCanvas } from './editor-canvas.js';
8
9
  import { ModulePalette } from './module-palette.js';
9
10
  import { PropsPanel } from './props-panel.js';
10
11
  import { SectionTemplatePicker } from './section-template-picker.js';
11
12
  import { EditorIcon } from './editor-icons.js';
13
+ import { ConfirmDialog } from '../primitives.js';
14
+ import { resolveInlineTextProp, readInlineTextValue } from './inline-text.js';
12
15
  import './editor.css';
13
16
  // ── Helpers ──────────────────────────────────────────────────────────────────
14
- function findModuleById(layout, moduleId) {
15
- for (const sections of Object.values(layout.regions)) {
16
- for (const section of sections) {
17
- if (!isLayoutSection(section))
18
- continue;
19
- for (const column of section.columns) {
20
- for (const node of column.nodes) {
21
- if (node.id === moduleId)
22
- return node;
23
- }
24
- }
25
- }
26
- }
27
- return null;
28
- }
17
+ // Arm-aware (kywi-cms#92): resolves modules inside a section-level variant
18
+ // container's arms as well as those sitting directly in a region's sections.
19
+ const findModuleById = findModuleInDocument;
20
+ const findSectionById = findSectionInDocument;
21
+ /**
22
+ * While the editor is open the page is offset by the fixed edit bar, exactly as
23
+ * the browse-mode toolbar does it (kywi-cms#93) — one class on <html>, removed
24
+ * the moment the editor unmounts, so the offset never outlives the bar.
25
+ */
26
+ const EDITING_OFFSET_CLASS = 'kywi-frontend-edit--editing';
27
+ /** Viewport widths the responsive preview constrains the page to. */
28
+ const PREVIEW_WIDTH = {
29
+ // Desktop is the page's REAL width — no wrapper, no letterbox (kywi-cms#94).
30
+ desktop: null,
31
+ tablet: '768px',
32
+ mobile: '375px',
33
+ };
29
34
  // ── Component ────────────────────────────────────────────────────────────────
30
- export function OverlayShell({ editMode, initialLayout, contentId, contentType, pageTitle, themeName, themeRegistry, moduleRegistry, moduleComponents, onSave, onPublish, onSchedule, userRole, }) {
35
+ /**
36
+ * The front-of-site editor (kywi-cms#94).
37
+ *
38
+ * This is not a modal over the page: the page renders in normal document flow,
39
+ * at its real width, through its own stylesheet — `EditorCanvas` in `inPlace`
40
+ * mode emits the public renderer's markup — and every piece of editing chrome
41
+ * is a fixed rail docked to a viewport edge. Selection outlines, the props rail
42
+ * and inline text editing sit ON the page instead of framing it, and a
43
+ * persistent Done returns to the browse-mode toolbar.
44
+ */
45
+ export function OverlayShell({ editMode, initialLayout, contentId, contentType, pageTitle, themeName: _themeName, themeRegistry: _themeRegistry, moduleRegistry, moduleComponents, onSave, onPublish, onSchedule, userRole, pageClassName, }) {
31
46
  const [state, dispatch] = useReducer(editorReducer, initialLayout, createInitialState);
32
47
  const [showTemplatePicker, setShowTemplatePicker] = useState(false);
33
48
  const [templateRegion, setTemplateRegion] = useState(null);
34
49
  const [previewMode, setPreviewMode] = useState('desktop');
50
+ const [paletteOpen, setPaletteOpen] = useState(true);
51
+ const [confirmExit, setConfirmExit] = useState(false);
52
+ // Inline text editing: which module is being typed on, plus a reset key so a
53
+ // finished session re-renders that module cleanly from its stored props.
54
+ const [textEdit, setTextEdit] = useState({
55
+ id: null,
56
+ resetId: null,
57
+ nonce: 0,
58
+ });
59
+ const doneRef = useRef(null);
35
60
  const sensors = useSensors(useSensor(PointerSensor), useSensor(KeyboardSensor));
61
+ const isActive = editMode.isEditMode && editMode.canEdit;
36
62
  // ── Unsaved changes prompt ─────────────────────────────────────────────────
37
63
  useEffect(() => {
38
64
  function handleBeforeUnload(e) {
@@ -43,35 +69,24 @@ export function OverlayShell({ editMode, initialLayout, contentId, contentType,
43
69
  window.addEventListener('beforeunload', handleBeforeUnload);
44
70
  return () => window.removeEventListener('beforeunload', handleBeforeUnload);
45
71
  }, [state.isDirty]);
72
+ // ── Page offset for the fixed edit bar ─────────────────────────────────────
73
+ useEffect(() => {
74
+ if (!isActive)
75
+ return;
76
+ document.documentElement.classList.add(EDITING_OFFSET_CLASS);
77
+ return () => {
78
+ document.documentElement.classList.remove(EDITING_OFFSET_CLASS);
79
+ };
80
+ }, [isActive]);
46
81
  // ── Handlers ───────────────────────────────────────────────────────────────
82
+ // One drag resolver shared with the admin editor (drag-utils) — the inline
83
+ // copy this used to carry predated the kywi-cms#20 occupied-drop fix, so a
84
+ // drop onto an already-populated column was silently swallowed here while it
85
+ // worked in the admin.
47
86
  const handleDragEnd = useCallback((event) => {
48
- const { active, over } = event;
49
- if (!over)
50
- return;
51
- const source = active.data.current?.source;
52
- if (source === 'palette') {
53
- const moduleType = active.data.current?.moduleType;
54
- const columnId = over.data.current?.columnId;
55
- const index = over.data.current?.index ?? 0;
56
- if (moduleType && columnId) {
57
- dispatch({ type: 'ADD_MODULE', columnId, index, moduleType });
58
- }
59
- }
60
- else if (source === 'canvas') {
61
- const fromColumnId = active.data.current?.columnId;
62
- const fromIndex = active.data.current?.index;
63
- const toColumnId = over.data.current?.columnId;
64
- const toIndex = over.data.current?.index ?? 0;
65
- if (fromColumnId && toColumnId) {
66
- dispatch({
67
- type: 'MOVE_MODULE',
68
- fromColumnId,
69
- fromIndex,
70
- toColumnId,
71
- toIndex,
72
- });
73
- }
74
- }
87
+ const action = resolveDragEndAction(event.active, event.over);
88
+ if (action)
89
+ dispatch(action);
75
90
  }, []);
76
91
  const handleSave = useCallback(() => {
77
92
  onSave(state.layout, 'save');
@@ -89,38 +104,131 @@ export function OverlayShell({ editMode, initialLayout, contentId, contentType,
89
104
  setTemplateRegion(regionName);
90
105
  setShowTemplatePicker(true);
91
106
  }, []);
107
+ // Done: leave edit mode and hand the page back to the browse-mode toolbar.
108
+ // Unsaved work asks first — an accidental exit that silently discards a
109
+ // page's worth of edits is the worst outcome this screen can produce.
110
+ const { endEdit } = editMode;
111
+ const exitEditor = useCallback(() => {
112
+ setConfirmExit(false);
113
+ endEdit();
114
+ }, [endEdit]);
115
+ const handleDone = useCallback(() => {
116
+ if (state.isDirty) {
117
+ setConfirmExit(true);
118
+ return;
119
+ }
120
+ exitEditor();
121
+ }, [state.isDirty, exitEditor]);
122
+ // ── Inline text editing (kywi-cms#94) ──────────────────────────────────────
123
+ const resolveTextProp = useCallback((moduleType) => resolveInlineTextProp(moduleRegistry.get(moduleType)), [moduleRegistry]);
124
+ const endTextEdit = useCallback((moduleId) => {
125
+ setTextEdit(prev => ({ id: null, resetId: moduleId ?? prev.id, nonce: prev.nonce + 1 }));
126
+ }, []);
127
+ const handleInlineActivate = useCallback((moduleId) => {
128
+ setTextEdit(prev => ({ ...prev, id: moduleId }));
129
+ }, []);
130
+ const handleInlineCommit = useCallback((moduleId, host) => {
131
+ const node = findModuleById(state.layout, moduleId);
132
+ const prop = node ? resolveTextProp(node.type) : null;
133
+ if (node && prop) {
134
+ const next = readInlineTextValue(host, prop.html);
135
+ // Same prop, same action, same history the props panel writes — typing
136
+ // on the page and typing in the rail are one save path.
137
+ if (next !== String(node.props[prop.name] ?? '')) {
138
+ dispatch({ type: 'UPDATE_PROPS', moduleId, props: { [prop.name]: next } });
139
+ }
140
+ }
141
+ endTextEdit(moduleId);
142
+ }, [state.layout, resolveTextProp, endTextEdit]);
143
+ const handleInlineCancel = useCallback(() => {
144
+ endTextEdit(null);
145
+ }, [endTextEdit]);
146
+ const inlineEdit = useMemo(() => ({
147
+ editingId: textEdit.id,
148
+ resetId: textEdit.resetId,
149
+ nonce: textEdit.nonce,
150
+ resolveTextProp,
151
+ onActivate: handleInlineActivate,
152
+ onCommit: handleInlineCommit,
153
+ onCancel: handleInlineCancel,
154
+ }), [textEdit, resolveTextProp, handleInlineActivate, handleInlineCommit, handleInlineCancel]);
155
+ // ── Escape ─────────────────────────────────────────────────────────────────
156
+ // Escape narrows the selection; it NEVER exits the editor. An accidental exit
157
+ // costs unsaved work, so leaving is always the deliberate Done button.
158
+ // (An in-progress text edit handles its own Escape and stops propagation.)
159
+ const hasSelection = state.selectedId !== null;
160
+ const isTextEditing = textEdit.id !== null;
161
+ useEffect(() => {
162
+ if (!isActive)
163
+ return;
164
+ function onKeyDown(e) {
165
+ if (e.key !== 'Escape')
166
+ return;
167
+ // Normally the edited module handles this and stops propagation; this is
168
+ // the safety net for an edit whose host has somehow lost focus.
169
+ if (isTextEditing) {
170
+ handleInlineCancel();
171
+ return;
172
+ }
173
+ if (hasSelection) {
174
+ dispatch({ type: 'DESELECT' });
175
+ return;
176
+ }
177
+ // Nothing selected — put the keyboard on the way out instead of leaving.
178
+ doneRef.current?.focus();
179
+ }
180
+ window.addEventListener('keydown', onKeyDown);
181
+ return () => window.removeEventListener('keydown', onKeyDown);
182
+ }, [isActive, hasSelection, isTextEditing, handleInlineCancel]);
92
183
  // ── Permission gate ────────────────────────────────────────────────────────
93
- if (!editMode.isEditMode || !editMode.canEdit) {
184
+ if (!isActive) {
94
185
  return null;
95
186
  }
96
- // ── Selected module resolution ─────────────────────────────────────────────
187
+ // ── Selection resolution ───────────────────────────────────────────────────
97
188
  const selectedModule = state.selectedId
98
189
  ? findModuleById(state.layout, state.selectedId)
99
190
  : null;
100
191
  const selectedConfig = selectedModule
101
192
  ? moduleRegistry.get(selectedModule.type)
102
193
  : null;
103
- // ── Responsive preview width ───────────────────────────────────────────────
104
- const previewWidth = previewMode === 'tablet' ? '768px' :
105
- previewMode === 'mobile' ? '375px' :
106
- '100%';
107
- return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsxs("div", { className: "kywi-overlay-shell", "data-content-id": contentId, "data-content-type": contentType, children: [_jsxs("div", { className: "kywi-overlay-toolbar", children: [_jsxs("span", { className: "kywi-editor-mode-badge", children: [_jsx(EditorIcon, { name: "edit", size: 13 }), "EDIT MODE"] }), _jsx("span", { className: "kywi-overlay-page-title", children: pageTitle }), _jsx("span", { className: "kywi-editor-toolbar-divider" }), _jsx("button", { type: "button", className: "kywi-editor-iconbtn", onClick: () => dispatch({ type: 'UNDO' }), disabled: state.historyIndex <= 0, "aria-label": "Undo", title: "Undo", children: _jsx(EditorIcon, { name: "undo", size: 16 }) }), _jsx("button", { type: "button", className: "kywi-editor-iconbtn", onClick: () => dispatch({ type: 'REDO' }), disabled: state.historyIndex >= state.history.length - 1, "aria-label": "Redo", title: "Redo", children: _jsx(EditorIcon, { name: "redo", size: 16 }) }), _jsx("span", { className: "kywi-editor-toolbar-divider" }), _jsx("div", { className: "kywi-overlay-preview-toggle", children: ['desktop', 'tablet', 'mobile'].map((mode) => (_jsx("button", { type: "button", className: `kywi-overlay-preview-btn${previewMode === mode ? ' kywi-overlay-preview-btn--active' : ''}`, onClick: () => setPreviewMode(mode), "aria-label": `Preview ${mode}`, children: mode.charAt(0).toUpperCase() + mode.slice(1) }, mode))) }), _jsx("div", { className: "kywi-overlay-toolbar-spacer" }), _jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn", "data-action": "draft", onClick: handleDraft, children: [_jsx(EditorIcon, { name: "draft", size: 15 }), "Save Draft"] }), _jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn kywi-overlay-toolbar-save", "data-action": "save", onClick: handleSave, disabled: !state.isDirty, children: [_jsx(EditorIcon, { name: "save", size: 15 }), "Save"] }), editMode.canPublish && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn", "data-action": "schedule", onClick: handleSchedule, children: [_jsx(EditorIcon, { name: "schedule", size: 15 }), "Schedule"] }), _jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn kywi-overlay-toolbar-publish", "data-action": "publish", onClick: handlePublish, children: [_jsx(EditorIcon, { name: "publish", size: 15 }), "Publish"] })] }))] }), _jsxs("div", { className: "kywi-overlay-body", children: [_jsx("div", { className: "kywi-overlay-left-panel", children: _jsx(ModulePalette, { modules: moduleRegistry.list(), ...(userRole ? { userRole } : {}) }) }), _jsx("div", { className: "kywi-overlay-canvas", style: { maxWidth: previewWidth }, children: _jsx(EditorCanvas, { state: state, dispatch: dispatch, moduleComponents: moduleComponents, onInsertSection: handleInsertSection }) }), _jsx("div", { className: "kywi-overlay-right-panel", children: _jsx(PropsPanel, { module: selectedModule, moduleConfig: selectedConfig, onUpdateProps: (props) => dispatch({ type: 'UPDATE_PROPS', moduleId: state.selectedId, props }), onUpdateStyle: (style) => dispatch({ type: 'UPDATE_STYLE', moduleId: state.selectedId, style }), onDelete: () => dispatch({ type: 'REMOVE_MODULE', moduleId: state.selectedId }), onClose: () => dispatch({ type: 'DESELECT' }) }) })] }), showTemplatePicker && (_jsx(SectionTemplatePicker, { onSelect: (columns) => {
108
- if (templateRegion) {
109
- dispatch({ type: 'ADD_SECTION', regionName: templateRegion, columns });
110
- }
111
- setShowTemplatePicker(false);
112
- setTemplateRegion(null);
113
- }, onInsertComponent: (section) => {
114
- // Insert a linked section component (#69): ADD_SECTIONS clones with
115
- // fresh ids and cloneSection preserves the componentId reference.
116
- if (templateRegion) {
117
- dispatch({ type: 'ADD_SECTIONS', regionName: templateRegion, sections: [section] });
118
- }
119
- setShowTemplatePicker(false);
120
- setTemplateRegion(null);
121
- }, onClose: () => {
122
- setShowTemplatePicker(false);
123
- setTemplateRegion(null);
124
- } }))] }) }));
194
+ const selectedSection = state.selectedType === 'section' && state.selectedId
195
+ ? findSectionById(state.layout, state.selectedId)
196
+ : null;
197
+ // A section-level variant container selected via its canvas block (#92).
198
+ const selectedVariantContainer = state.selectedType === 'variantContainer' && state.selectedId
199
+ ? findVariantContainerInDocument(state.layout, state.selectedId)
200
+ : null;
201
+ // The props rail opens itself the moment something is selected, and closes
202
+ // (deselect) from its own × — that IS its collapse control.
203
+ const propsRailOpen = Boolean(selectedModule || selectedSection || selectedVariantContainer);
204
+ const previewWidth = PREVIEW_WIDTH[previewMode];
205
+ return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, children: _jsxs("div", { className: "kywi-overlay-shell kywi-overlay-shell--inplace", "data-content-id": contentId, "data-content-type": contentType, children: [_jsxs("div", { className: "kywi-overlay-chrome kywi-overlay-toolbar", role: "toolbar", "aria-label": "Edit controls", children: [_jsxs("span", { className: "kywi-editor-mode-badge", children: [_jsx(EditorIcon, { name: "edit", size: 13 }), "EDIT MODE"] }), _jsx("span", { className: "kywi-overlay-page-title", children: pageTitle }), _jsx("span", { className: "kywi-editor-toolbar-divider" }), _jsx("button", { type: "button", className: `kywi-editor-iconbtn${paletteOpen ? ' kywi-editor-iconbtn--on' : ''}`, "data-action": "toggle-palette", "aria-pressed": paletteOpen, "aria-label": paletteOpen ? 'Hide modules' : 'Show modules', title: paletteOpen ? 'Hide modules' : 'Show modules', onClick: () => setPaletteOpen(v => !v), children: _jsx(EditorIcon, { name: "columns", size: 16 }) }), _jsx("button", { type: "button", className: "kywi-editor-iconbtn", onClick: () => dispatch({ type: 'UNDO' }), disabled: state.historyIndex <= 0, "aria-label": "Undo", title: "Undo", children: _jsx(EditorIcon, { name: "undo", size: 16 }) }), _jsx("button", { type: "button", className: "kywi-editor-iconbtn", onClick: () => dispatch({ type: 'REDO' }), disabled: state.historyIndex >= state.history.length - 1, "aria-label": "Redo", title: "Redo", children: _jsx(EditorIcon, { name: "redo", size: 16 }) }), _jsx("span", { className: "kywi-editor-toolbar-divider" }), _jsx("div", { className: "kywi-overlay-preview-toggle", children: ['desktop', 'tablet', 'mobile'].map((mode) => (_jsx("button", { type: "button", className: `kywi-overlay-preview-btn${previewMode === mode ? ' kywi-overlay-preview-btn--active' : ''}`, onClick: () => setPreviewMode(mode), "aria-label": `Preview ${mode}`, "aria-pressed": previewMode === mode, children: mode.charAt(0).toUpperCase() + mode.slice(1) }, mode))) }), _jsx("div", { className: "kywi-overlay-toolbar-spacer" }), _jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn", "data-action": "draft", onClick: handleDraft, children: [_jsx(EditorIcon, { name: "draft", size: 15 }), "Save Draft"] }), _jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn kywi-overlay-toolbar-save", "data-action": "save", onClick: handleSave, disabled: !state.isDirty, children: [_jsx(EditorIcon, { name: "save", size: 15 }), "Save"] }), editMode.canPublish && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn", "data-action": "schedule", onClick: handleSchedule, children: [_jsx(EditorIcon, { name: "schedule", size: 15 }), "Schedule"] }), _jsxs("button", { type: "button", className: "kywi-overlay-toolbar-btn kywi-overlay-toolbar-publish", "data-action": "publish", onClick: handlePublish, children: [_jsx(EditorIcon, { name: "publish", size: 15 }), "Publish"] })] })), _jsx("span", { className: "kywi-editor-toolbar-divider" }), _jsxs("button", { type: "button", ref: doneRef, className: "kywi-overlay-toolbar-btn kywi-overlay-toolbar-done", "data-action": "done", onClick: handleDone, children: [_jsx(EditorIcon, { name: "close", size: 15 }), "Done"] })] }), _jsx("div", { className: [
206
+ 'kywi-ip-page',
207
+ previewWidth ? 'kywi-ip-page--constrained' : null,
208
+ pageClassName,
209
+ ].filter(Boolean).join(' '), "data-preview": previewMode, "data-kywi-content-id": contentId, ...(previewWidth ? { style: { maxWidth: previewWidth } } : {}), children: _jsx(EditorCanvas, { state: state, dispatch: dispatch, moduleComponents: moduleComponents, onInsertSection: handleInsertSection, inPlace: true, inlineEdit: inlineEdit }) }), _jsx("aside", { className: `kywi-overlay-chrome kywi-overlay-rail kywi-overlay-rail--left${paletteOpen ? '' : ' kywi-overlay-rail--collapsed'}`, "aria-label": "Modules", "aria-hidden": !paletteOpen, children: _jsx(ModulePalette, { modules: moduleRegistry.list(), ...(userRole ? { userRole } : {}) }) }), _jsx("aside", { className: `kywi-overlay-chrome kywi-overlay-rail kywi-overlay-rail--right${propsRailOpen ? '' : ' kywi-overlay-rail--collapsed'}`, "aria-label": "Properties", "aria-hidden": !propsRailOpen, children: _jsx(PropsPanel, { module: selectedModule, moduleConfig: selectedConfig, onUpdateProps: (props) => dispatch({ type: 'UPDATE_PROPS', moduleId: state.selectedId, props }), onUpdateStyle: (style) => dispatch({ type: 'UPDATE_STYLE', moduleId: state.selectedId, style }), onDelete: () => dispatch({ type: 'REMOVE_MODULE', moduleId: state.selectedId }), section: selectedSection, onDeleteSection: () => {
210
+ dispatch({ type: 'REMOVE_SECTION', sectionId: state.selectedId });
211
+ dispatch({ type: 'DESELECT' });
212
+ }, variantContainer: selectedVariantContainer, onUpdateVariantContainer: (patch) => dispatch({ type: 'UPDATE_VARIANT_CONTAINER', containerId: state.selectedId, patch }), onDeleteVariantContainer: () => {
213
+ dispatch({ type: 'REMOVE_VARIANT_CONTAINER', containerId: state.selectedId });
214
+ dispatch({ type: 'DESELECT' });
215
+ }, onClose: () => dispatch({ type: 'DESELECT' }) }) }), _jsxs("div", { className: "kywi-admin-shell kywi-overlay-dialog-host", children: [showTemplatePicker && (_jsx(SectionTemplatePicker, { onSelect: (columns) => {
216
+ if (templateRegion) {
217
+ dispatch({ type: 'ADD_SECTION', regionName: templateRegion, columns });
218
+ }
219
+ setShowTemplatePicker(false);
220
+ setTemplateRegion(null);
221
+ }, onInsertComponent: (section) => {
222
+ // Insert a linked section component (#69): ADD_SECTIONS clones with
223
+ // fresh ids and cloneSection preserves the componentId reference.
224
+ if (templateRegion) {
225
+ dispatch({ type: 'ADD_SECTIONS', regionName: templateRegion, sections: [section] });
226
+ }
227
+ setShowTemplatePicker(false);
228
+ setTemplateRegion(null);
229
+ }, onClose: () => {
230
+ setShowTemplatePicker(false);
231
+ setTemplateRegion(null);
232
+ } })), confirmExit && (_jsx(ConfirmDialog, { title: "Leave the editor?", message: "This page has changes you haven't saved yet. Leaving now discards them.", confirmLabel: "Discard changes", onConfirm: exitEditor, onCancel: () => setConfirmExit(false) }))] })] }) }));
125
233
  }
126
234
  //# sourceMappingURL=overlay-shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-shell.js","sourceRoot":"","sources":["../../../src/admin/layout-editor/overlay-shell.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overlay-shell.js","sourceRoot":"","sources":["../../../src/admin/layout-editor/overlay-shell.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import type { ModuleNode, LayoutSection } from '../../layout/types.js';
1
+ import type { ModuleNode, LayoutSection, VariantContainer } from '../../layout/types.js';
2
2
  import type { ModuleConfig } from '../../config/types.js';
3
3
  import type { ThemeRegistry } from '../../layout/theme-registry.js';
4
+ import type { VariantContainerPatch } from './editor-state.js';
4
5
  import { type ComponentOption } from './component-picker-field.js';
5
6
  interface PropsPanelProps {
6
7
  module: ModuleNode | null;
@@ -36,7 +37,13 @@ interface PropsPanelProps {
36
37
  onDetachSection?: () => void;
37
38
  /** Delete the selected section. */
38
39
  onDeleteSection?: () => void;
40
+ /** The section-level variantContainer selected on the canvas, if any. */
41
+ variantContainer?: VariantContainer | null;
42
+ /** Apply a patch to the selected variant container (mode / experiment / arms). */
43
+ onUpdateVariantContainer?: (patch: VariantContainerPatch) => void;
44
+ /** Delete the selected variant container, arms and all. */
45
+ onDeleteVariantContainer?: () => void;
39
46
  }
40
- export declare function PropsPanel({ module, moduleConfig, onUpdateProps, onUpdateStyle, onDelete, onClose, themeRegistry, themeName, audiences, components, onSaveAsComponent, onLinkComponent, onDetach, section, sectionComponents, onSaveSectionAsComponent, onDetachSection, onDeleteSection, }: PropsPanelProps): import("react/jsx-runtime").JSX.Element;
47
+ export declare function PropsPanel({ module, moduleConfig, onUpdateProps, onUpdateStyle, onDelete, onClose, themeRegistry, themeName, audiences, components, onSaveAsComponent, onLinkComponent, onDetach, section, sectionComponents, onSaveSectionAsComponent, onDetachSection, onDeleteSection, variantContainer, onUpdateVariantContainer, onDeleteVariantContainer, }: PropsPanelProps): import("react/jsx-runtime").JSX.Element;
41
48
  export {};
42
49
  //# sourceMappingURL=props-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"props-panel.d.ts","sourceRoot":"","sources":["../../../src/admin/layout-editor/props-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAGnE,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAA;AASxF,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACvD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;IACtD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,yFAAyF;IACzF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,oEAAoE;IACpE,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IAErB,qFAAqF;IACrF,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC9B,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAA;IACrC,mFAAmF;IACnF,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAA;IACrC,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,aAAa,EACb,QAAQ,EACR,OAAO,EACP,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,eAAe,GAChB,EAAE,eAAe,2CAgPjB"}
1
+ {"version":3,"file":"props-panel.d.ts","sourceRoot":"","sources":["../../../src/admin/layout-editor/props-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAG9D,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAUxF,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACvD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;IACtD,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,yFAAyF;IACzF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,oEAAoE;IACpE,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IAErB,qFAAqF;IACrF,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC9B,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAA;IACrC,mFAAmF;IACnF,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAA;IACrC,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAE5B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC1C,kFAAkF;IAClF,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACjE,2DAA2D;IAC3D,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAA;CACtC;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,aAAa,EACb,QAAQ,EACR,OAAO,EACP,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,EAAE,eAAe,2CAmSjB"}