@developer_tribe/react-builder 1.0.2 → 1.0.3

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 (124) hide show
  1. package/dist/AttributesEditor.d.ts +3 -1
  2. package/dist/RenderPage.d.ts +2 -1
  3. package/dist/attributes-editor/Field.d.ts +2 -1
  4. package/dist/attributes-editor/SpecialCategorySection.d.ts +2 -1
  5. package/dist/build-components/BackgroundImage/BackgroundImage.d.ts +5 -0
  6. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +44 -0
  7. package/dist/build-components/Button/ButtonProps.generated.d.ts +7 -0
  8. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +7 -0
  9. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +7 -0
  10. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +7 -0
  11. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +7 -0
  12. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +7 -0
  13. package/dist/build-components/Image/ImageProps.generated.d.ts +7 -0
  14. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +7 -0
  15. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +7 -0
  16. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +7 -0
  17. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +7 -0
  18. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +7 -0
  19. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +7 -0
  20. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +7 -0
  21. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +7 -1
  22. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +7 -0
  23. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +7 -0
  24. package/dist/build-components/Text/TextProps.generated.d.ts +7 -0
  25. package/dist/build-components/View/ViewProps.generated.d.ts +7 -0
  26. package/dist/build-components/index.d.ts +2 -1
  27. package/dist/build-components/patterns.generated.d.ts +1444 -15
  28. package/dist/components/AttributesEditorPanel.d.ts +3 -4
  29. package/dist/components/Builder.d.ts +2 -1
  30. package/dist/components/BuilderButton.d.ts +9 -0
  31. package/dist/index.cjs.js +5 -5
  32. package/dist/index.cjs.js.map +1 -1
  33. package/dist/index.d.ts +2 -2
  34. package/dist/index.esm.js +5 -5
  35. package/dist/index.esm.js.map +1 -1
  36. package/dist/modals/ColorModal.d.ts +3 -1
  37. package/dist/pages/ProjectPage.d.ts +3 -3
  38. package/dist/pages/tabs/BuilderPanel.d.ts +8 -0
  39. package/dist/pages/tabs/{DebugTab.d.ts → SideTool.d.ts} +2 -2
  40. package/dist/store.d.ts +7 -1
  41. package/dist/styles.css +1 -1
  42. package/dist/types/Project.d.ts +11 -0
  43. package/dist/utils/analyseNode.d.ts +1 -0
  44. package/dist/utils/extractTextStyle.d.ts +8 -1
  45. package/dist/utils/extractViewStyle.d.ts +8 -1
  46. package/dist/utils/parseColor.d.ts +7 -0
  47. package/package.json +1 -1
  48. package/src/AttributesEditor.tsx +76 -14
  49. package/src/RenderPage.tsx +82 -4
  50. package/src/attributes-editor/Field.tsx +12 -5
  51. package/src/attributes-editor/SpecialCategorySection.tsx +2 -1
  52. package/src/build-components/BackgroundImage/BackgroundImage.tsx +87 -0
  53. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +60 -0
  54. package/src/build-components/BackgroundImage/pattern.json +45 -0
  55. package/src/build-components/Button/Button.tsx +31 -4
  56. package/src/build-components/Button/ButtonProps.generated.ts +7 -0
  57. package/src/build-components/Carousel/Carousel.tsx +27 -3
  58. package/src/build-components/Carousel/CarouselProps.generated.ts +7 -0
  59. package/src/build-components/CarouselButtons/CarouselButtons.tsx +19 -4
  60. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +7 -0
  61. package/src/build-components/CarouselDots/CarouselDots.tsx +13 -4
  62. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +7 -0
  63. package/src/build-components/CarouselItem/CarouselItem.tsx +20 -4
  64. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +7 -0
  65. package/src/build-components/CarouselProvider/CarouselProvider.tsx +14 -3
  66. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +7 -0
  67. package/src/build-components/Image/Image.tsx +29 -4
  68. package/src/build-components/Image/ImageProps.generated.ts +7 -0
  69. package/src/build-components/Onboard/Onboard.tsx +2 -2
  70. package/src/build-components/Onboard/OnboardProps.generated.ts +7 -0
  71. package/src/build-components/OnboardButton/OnboardButton.tsx +11 -4
  72. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +7 -0
  73. package/src/build-components/OnboardButtons/OnboardButtons.tsx +17 -5
  74. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +7 -0
  75. package/src/build-components/OnboardDot/OnboardDot.tsx +15 -6
  76. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +7 -0
  77. package/src/build-components/OnboardDot/pattern.json +1 -1
  78. package/src/build-components/OnboardFooter/OnboardFooter.tsx +15 -5
  79. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +7 -0
  80. package/src/build-components/OnboardImage/OnboardImage.tsx +28 -6
  81. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +7 -0
  82. package/src/build-components/OnboardItem/OnboardItem.tsx +14 -3
  83. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +7 -0
  84. package/src/build-components/OnboardProvider/OnboardProvider.tsx +34 -12
  85. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +7 -1
  86. package/src/build-components/OnboardProvider/pattern.json +0 -8
  87. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +7 -0
  88. package/src/build-components/OnboardSubtitle/pattern.json +1 -1
  89. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +7 -0
  90. package/src/build-components/OnboardTitle/pattern.json +1 -1
  91. package/src/build-components/RenderNode.generated.tsx +3 -0
  92. package/src/build-components/Text/Text.tsx +33 -9
  93. package/src/build-components/Text/TextProps.generated.ts +7 -0
  94. package/src/build-components/View/View.tsx +27 -3
  95. package/src/build-components/View/ViewProps.generated.ts +7 -0
  96. package/src/build-components/View/pattern.json +59 -1
  97. package/src/build-components/index.ts +5 -0
  98. package/src/build-components/patterns.generated.ts +1452 -15
  99. package/src/components/AttributesEditorPanel.tsx +13 -6
  100. package/src/components/Builder.tsx +140 -40
  101. package/src/components/BuilderButton.tsx +127 -0
  102. package/src/index.ts +2 -2
  103. package/src/mockOS/components/MockOSRouter.tsx +11 -3
  104. package/src/modals/ColorModal.tsx +212 -55
  105. package/src/pages/ProjectPage.tsx +293 -55
  106. package/src/pages/tabs/{BuilderTab.tsx → BuilderPanel.tsx} +13 -9
  107. package/src/pages/tabs/SideTool.tsx +259 -0
  108. package/src/size-matters/index.ts +6 -0
  109. package/src/store.ts +13 -1
  110. package/src/styles/base/_global.scss +158 -7
  111. package/src/styles/components/_attributes-editor.scss +12 -0
  112. package/src/styles/components/_editor-shell.scss +23 -0
  113. package/src/styles/foundation/_sizes.scss +1 -1
  114. package/src/styles/layout/_builder.scss +66 -10
  115. package/src/styles/modals/_color-modal.scss +29 -0
  116. package/src/types/Project.ts +14 -0
  117. package/src/utils/analyseNode.ts +98 -0
  118. package/src/utils/extractTextStyle.ts +24 -8
  119. package/src/utils/extractViewStyle.ts +27 -3
  120. package/src/utils/parseColor.ts +43 -0
  121. package/dist/pages/tabs/BuilderTab.d.ts +0 -9
  122. package/dist/pages/tabs/PreviewTab.d.ts +0 -3
  123. package/src/pages/tabs/DebugTab.tsx +0 -64
  124. package/src/pages/tabs/PreviewTab.tsx +0 -206
@@ -1,35 +1,76 @@
1
- import { useEffect, useState } from 'react';
2
- import { Node, RenderPage, Project } from '..';
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { Node, NodeData, RenderPage, Project, ProjectColors } from '..';
3
3
  import { EditorHeader } from '../components/EditorHeader';
4
4
  import { AttributesEditorPanel } from '../components/AttributesEditorPanel';
5
- import { BuilderTab } from './tabs/BuilderTab';
6
- import { PreviewTab } from './tabs/PreviewTab';
7
- import { DebugTab } from './tabs/DebugTab';
5
+ import { BuilderPanel } from './tabs/BuilderPanel';
6
+ import { SideTool } from './tabs/SideTool';
8
7
  import { AppConfig, defaultAppConfig } from '../types/PreviewConfig';
9
8
  import { useRenderStore } from '../store';
10
9
  import { logger } from '../utils/logger';
11
10
  import { useLogRender } from '../utils/useLogRender';
12
11
  import type { LogLevel } from '../types/Project';
12
+ import { analyseAndProccess } from '../utils/analyseNode';
13
13
  import backgroundImage from '../assets/images/background.jpg';
14
- export type Tab = 'builder' | 'preview';
15
-
16
14
  export type ProjectPageProps = {
17
15
  project: Project;
18
16
  onSaveProject: (project: Project) => void;
19
17
  appConfig?: AppConfig;
20
18
  logLevel?: LogLevel;
19
+ projectColors?: ProjectColors;
21
20
  };
22
21
 
22
+ const MOBILE_BREAKPOINT = 1000;
23
+
23
24
  export function ProjectPage({
24
25
  project,
25
26
  appConfig = defaultAppConfig,
26
27
  onSaveProject,
27
28
  logLevel,
29
+ projectColors,
28
30
  }: ProjectPageProps) {
29
31
  useLogRender('ProjectPage');
30
- const [current, setCurrent] = useState<Node>(project.data);
31
- const [editorData, setEditorData] = useState<Node>(project.data);
32
- const [tab, setTab] = useState<Tab>('builder');
32
+ const resolvedProjectColors = projectColors ?? project.projectColors;
33
+ const { current, setCurrent, setProjectColors } = useRenderStore((s) => ({
34
+ current: s.current,
35
+ setCurrent: s.setCurrent,
36
+ setProjectColors: s.setProjectColors,
37
+ }));
38
+ const [editorData, setEditorData] = useState<Node>(null);
39
+ const [mobilePanel, setMobilePanel] = useState<
40
+ 'builder' | 'attributes' | null
41
+ >(null);
42
+ const [isMobile, setIsMobile] = useState<boolean>(() => {
43
+ if (typeof window === 'undefined') return false;
44
+ return window.innerWidth <= MOBILE_BREAKPOINT;
45
+ });
46
+
47
+ const handleDeleteNode = useCallback(
48
+ (nodeToDelete: Node) => {
49
+ // Do not allow deleting the root node
50
+ if (nodeToDelete === editorData) {
51
+ return;
52
+ }
53
+ const updated: Node = deleteNodeFromTree(editorData, nodeToDelete);
54
+ //@ts-ignore
55
+ setEditorData(updated);
56
+
57
+ if (current === nodeToDelete) {
58
+ setCurrent(updated);
59
+ return;
60
+ }
61
+
62
+ if (isNodeRecord(current) && nodeHasChild(current, nodeToDelete)) {
63
+ const currentKey = current.key;
64
+ if (currentKey) {
65
+ const nextCurrent = findNodeByKey(updated, currentKey);
66
+ setCurrent(nextCurrent ?? updated);
67
+ } else {
68
+ setCurrent(updated);
69
+ }
70
+ }
71
+ },
72
+ [editorData, current],
73
+ );
33
74
 
34
75
  useEffect(() => {
35
76
  logger.info('ProjectPage', 'mount', { projectName: project.name });
@@ -40,11 +81,59 @@ export function ProjectPage({
40
81
  };
41
82
  }, [appConfig, project.name]);
42
83
 
84
+ useEffect(() => {
85
+ setProjectColors(resolvedProjectColors);
86
+ return () => setProjectColors(undefined);
87
+ }, [resolvedProjectColors, setProjectColors]);
88
+
43
89
  useEffect(() => {
44
90
  if (!logLevel) return;
45
91
  logger.setLevel(logLevel);
46
92
  }, [logLevel]);
47
93
 
94
+ useEffect(() => {
95
+ function handleResize() {
96
+ setIsMobile(window.innerWidth <= MOBILE_BREAKPOINT);
97
+ }
98
+
99
+ handleResize();
100
+ window.addEventListener('resize', handleResize);
101
+ return () => window.removeEventListener('resize', handleResize);
102
+ }, []);
103
+
104
+ useEffect(() => {
105
+ setMobilePanel(null);
106
+ }, [isMobile]);
107
+
108
+ const toggleMobilePanel = (panel: 'builder' | 'attributes') => {
109
+ setMobilePanel((prev) => (prev === panel ? null : panel));
110
+ };
111
+
112
+ const closeMobilePanels = () => {
113
+ setMobilePanel(null);
114
+ };
115
+
116
+ const leftPanelIsOpen = !isMobile || mobilePanel === 'builder';
117
+ const attributesPanelIsOpen = !isMobile || mobilePanel === 'attributes';
118
+
119
+ useEffect(() => {
120
+ try {
121
+ const processed = analyseAndProccess(project.data);
122
+ if (!processed) {
123
+ setEditorData(null);
124
+ setCurrent(null);
125
+ return;
126
+ }
127
+ setEditorData(processed);
128
+ setCurrent(processed);
129
+ } catch (error) {
130
+ // eslint-disable-next-line no-alert
131
+ alert('Duplicate node key detected. Please check your project data.');
132
+ setEditorData(null);
133
+ setCurrent(null);
134
+ }
135
+ }, [project.data]);
136
+
48
137
  return (
49
138
  <div className="container-full">
50
139
  <EditorHeader
@@ -64,53 +153,83 @@ export function ProjectPage({
64
153
  editorData={editorData}
65
154
  setEditorData={setEditorData}
66
155
  />
156
+ {isMobile && (
157
+ <div
158
+ className="mobile-panel-toggle"
159
+ role="group"
160
+ aria-label="Editor panels"
161
+ >
162
+ <button
163
+ type="button"
164
+ className={`mobile-panel-toggle__button${mobilePanel === 'builder' ? ' mobile-panel-toggle__button--active' : ''}`}
165
+ aria-label="Toggle builder panel"
166
+ aria-expanded={mobilePanel === 'builder'}
167
+ aria-controls="split-left-panel"
168
+ onClick={() => toggleMobilePanel('builder')}
169
+ >
170
+ <span className="mobile-panel-toggle__icon" aria-hidden="true">
171
+ <svg viewBox="0 0 16 12" role="presentation" focusable="false">
172
+ <path
173
+ d="M1 1h14M1 6h14M1 11h14"
174
+ stroke="currentColor"
175
+ strokeWidth="2"
176
+ strokeLinecap="round"
177
+ fill="none"
178
+ />
179
+ </svg>
180
+ </span>
181
+ <span className="mobile-panel-toggle__label">Builder</span>
182
+ </button>
183
+ <button
184
+ type="button"
185
+ className={`mobile-panel-toggle__button${mobilePanel === 'attributes' ? ' mobile-panel-toggle__button--active' : ''}`}
186
+ aria-label="Toggle attributes panel"
187
+ aria-expanded={mobilePanel === 'attributes'}
188
+ aria-controls="split-attributes-panel"
189
+ onClick={() => toggleMobilePanel('attributes')}
190
+ >
191
+ <span className="mobile-panel-toggle__icon" aria-hidden="true">
192
+ <svg viewBox="0 0 16 12" role="presentation" focusable="false">
193
+ <path
194
+ d="M1 1h14M1 6h14M1 11h14"
195
+ stroke="currentColor"
196
+ strokeWidth="2"
197
+ strokeLinecap="round"
198
+ fill="none"
199
+ />
200
+ </svg>
201
+ </span>
202
+ <span className="mobile-panel-toggle__label">Attributes</span>
203
+ </button>
204
+ </div>
205
+ )}
67
206
  <div className="editor-container">
68
- <div className="split-left">
69
- <div>
70
- <div
71
- className="editor-tabs"
72
- role="tablist"
73
- aria-label="Editor tabs"
207
+ <div
208
+ id="split-left-panel"
209
+ className={`split-left${leftPanelIsOpen ? ' is-open' : ''}`}
210
+ aria-hidden={isMobile && !leftPanelIsOpen}
211
+ >
212
+ {isMobile && (
213
+ <button
214
+ type="button"
215
+ className="split-panel__close"
216
+ aria-label="Close builder panel"
217
+ onClick={closeMobilePanels}
74
218
  >
75
- <button
76
- className={`editor-tab ${tab === 'builder' ? 'editor-tab--active' : ''}`}
77
- role="tab"
78
- aria-selected={tab === 'builder'}
79
- onClick={() => {
80
- setTab('builder');
81
- logger.info('ProjectPage', 'tab change', { to: 'builder' });
82
- }}
83
- >
84
- <span className="editor-tab__label">Builder</span>
85
- </button>
86
- <button
87
- className={`editor-tab ${tab === 'preview' ? 'editor-tab--active' : ''}`}
88
- role="tab"
89
- aria-selected={tab === 'preview'}
90
- onClick={() => {
91
- setTab('preview');
92
- logger.info('ProjectPage', 'tab change', { to: 'preview' });
93
- }}
94
- >
95
- <span className="editor-tab__label">Preview Config</span>
96
- </button>
97
- </div>
98
-
99
- {tab === 'builder' && (
100
- <BuilderTab
101
- data={editorData}
102
- setData={setEditorData}
103
- current={current}
104
- setCurrent={setCurrent}
105
- />
106
- )}
107
-
108
- {tab === 'preview' && <PreviewTab />}
219
+ Close
220
+ </button>
221
+ )}
222
+ <div>
223
+ <BuilderPanel
224
+ data={editorData}
225
+ setData={setEditorData}
226
+ onDeleteNode={handleDeleteNode}
227
+ />
109
228
  </div>
110
229
  </div>
111
230
  <div className="split-right">
112
231
  <div className="split-right__controls">
113
- <DebugTab data={editorData} setData={setEditorData} />
232
+ <SideTool data={editorData} setData={setEditorData} />
114
233
  </div>
115
234
  <div
116
235
  className="split-right-background"
@@ -118,12 +237,26 @@ export function ProjectPage({
118
237
  backgroundImage: `url(${backgroundImage})`,
119
238
  }}
120
239
  />
121
- <RenderPage data={editorData} name={project.name} />
240
+ {editorData && <RenderPage data={editorData} name={project.name} />}
122
241
  </div>
123
- <div className="split-third">
242
+ <div
243
+ id="split-attributes-panel"
244
+ className={`split-third${attributesPanelIsOpen ? ' is-open' : ''}`}
245
+ aria-hidden={isMobile && !attributesPanelIsOpen}
246
+ >
247
+ {isMobile && (
248
+ <button
249
+ type="button"
250
+ className="split-panel__close"
251
+ aria-label="Close attributes panel"
252
+ onClick={closeMobilePanels}
253
+ >
254
+ Close
255
+ </button>
256
+ )}
124
257
  <AttributesEditorPanel
125
- current={current}
126
258
  attributes={editorData}
259
+ projectColors={resolvedProjectColors}
127
260
  onChange={(data) => {
128
261
  setEditorData(data);
129
262
  let nodeKey: string | undefined = undefined;
@@ -141,10 +274,115 @@ export function ProjectPage({
141
274
  nodeKey ? { nodeKey } : undefined,
142
275
  );
143
276
  }}
144
- setCurrent={setCurrent}
145
277
  />
146
278
  </div>
279
+ {isMobile && mobilePanel && (
280
+ <button
281
+ type="button"
282
+ className="editor-container__overlay"
283
+ aria-label="Close active panel"
284
+ onClick={closeMobilePanels}
285
+ />
286
+ )}
147
287
  </div>
148
288
  </div>
149
289
  );
150
290
  }
291
+
292
+ function deleteNodeFromTree(root: Node, target: Node): Node {
293
+ if (root === null || root === undefined) return root;
294
+ if (typeof root === 'string') return root;
295
+
296
+ if (Array.isArray(root)) {
297
+ let changed = false;
298
+ const nextChildren: Node[] = [];
299
+ for (const child of root) {
300
+ if (child === target) {
301
+ changed = true;
302
+ continue;
303
+ }
304
+ const nextChild = deleteNodeFromTree(child, target);
305
+ if (nextChild !== child) changed = true;
306
+ nextChildren.push(nextChild);
307
+ }
308
+ return changed ? nextChildren : root;
309
+ }
310
+
311
+ const data = root as any;
312
+ if ('children' in data) {
313
+ const prev = data.children as Node;
314
+ if (!prev) return root;
315
+
316
+ if (Array.isArray(prev)) {
317
+ let changed = false;
318
+ const nextChildren: Node[] = [];
319
+ for (const child of prev) {
320
+ if (child === target) {
321
+ changed = true;
322
+ continue;
323
+ }
324
+ const nextChild = deleteNodeFromTree(child, target);
325
+ if (nextChild !== child) changed = true;
326
+ nextChildren.push(nextChild);
327
+ }
328
+ if (changed) {
329
+ return { ...data, children: nextChildren } as Node;
330
+ }
331
+ return root;
332
+ }
333
+
334
+ if (prev === target) {
335
+ return { ...data, children: '' } as Node;
336
+ }
337
+
338
+ const nextChild = deleteNodeFromTree(prev, target);
339
+ if (nextChild !== prev) {
340
+ return { ...data, children: nextChild } as Node;
341
+ }
342
+ }
343
+
344
+ return root;
345
+ }
346
+
347
+ function isNodeRecord(node: Node): node is NodeData {
348
+ return (
349
+ node !== null &&
350
+ node !== undefined &&
351
+ typeof node === 'object' &&
352
+ !Array.isArray(node)
353
+ );
354
+ }
355
+
356
+ function nodeHasChild(parent: NodeData, potentialChild: Node): boolean {
357
+ const { children } = parent;
358
+ if (!children) return false;
359
+ if (Array.isArray(children)) {
360
+ return children.some((child) => child === potentialChild);
361
+ }
362
+ return children === potentialChild;
363
+ }
364
+
365
+ function findNodeByKey(root: Node, key?: string): Node | null {
366
+ if (!key) return null;
367
+ if (root === null || root === undefined) return null;
368
+ if (typeof root === 'string') return null;
369
+
370
+ if (Array.isArray(root)) {
371
+ for (const child of root) {
372
+ const found = findNodeByKey(child, key);
373
+ if (found) return found;
374
+ }
375
+ return null;
376
+ }
377
+
378
+ const nodeData = root as NodeData;
379
+ if (nodeData.key === key) {
380
+ return nodeData;
381
+ }
382
+
383
+ if (nodeData.children) {
384
+ return findNodeByKey(nodeData.children as Node, key);
385
+ }
386
+
387
+ return null;
388
+ }
@@ -1,24 +1,27 @@
1
1
  import { Node } from '../..';
2
2
  import { useLogRender } from '../../utils/useLogRender';
3
3
  import { Builder } from '../../components/Builder';
4
+ import { useRenderStore } from '../../store';
4
5
 
5
- type BuilderTabProps = {
6
+ type BuilderPanelProps = {
6
7
  data: Node;
7
8
  setData: (data: Node) => void;
8
- current: Node;
9
- setCurrent: (current: Node) => void;
9
+ onDeleteNode: (node: Node) => void;
10
10
  };
11
11
 
12
- export function BuilderTab({
12
+ export function BuilderPanel({
13
13
  data,
14
14
  setData,
15
- current,
16
- setCurrent,
17
- }: BuilderTabProps) {
18
- useLogRender('BuilderTab');
15
+ onDeleteNode,
16
+ }: BuilderPanelProps) {
17
+ useLogRender('BuilderPanel');
18
+ const { current, setCurrent } = useRenderStore((s) => ({
19
+ current: s.current,
20
+ setCurrent: s.setCurrent,
21
+ }));
19
22
  return (
20
23
  <div
21
- role="tabpanel"
24
+ role="region"
22
25
  className="editor-panel-builder editor-panel editor-panel--active"
23
26
  aria-hidden={false}
24
27
  >
@@ -27,6 +30,7 @@ export function BuilderTab({
27
30
  setData={setData}
28
31
  current={current}
29
32
  setCurrent={setCurrent}
33
+ onDeleteNode={onDeleteNode}
30
34
  />
31
35
  </div>
32
36
  );