@simple-builder/react 1.2.1 → 1.2.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.
@@ -0,0 +1,238 @@
1
+ import { cn, builder, insertAt } from './chunk-NAY45PRQ.mjs';
2
+ import * as React from 'react';
3
+ import { Slot } from '@radix-ui/react-slot';
4
+ import { cva } from 'class-variance-authority';
5
+
6
+ var BuilderContext = React.createContext(
7
+ null
8
+ );
9
+ var BuilderProvider = (props) => {
10
+ const url = props.url ?? "/api/simple-builder";
11
+ const [content, setContent] = React.useState(
12
+ props.content ?? []
13
+ );
14
+ const getItem = React.useCallback(
15
+ (id) => {
16
+ return findRecursive(content, (item) => item.id === id);
17
+ },
18
+ [content]
19
+ );
20
+ const patchItem = React.useCallback(
21
+ (id, patch) => {
22
+ setContent(
23
+ (content2) => mapRecursive(content2, (item) => {
24
+ if (item.id === id) {
25
+ return {
26
+ ...item,
27
+ ...patch
28
+ };
29
+ }
30
+ return item;
31
+ })
32
+ );
33
+ },
34
+ [setContent, mapRecursive]
35
+ );
36
+ const addContent = React.useCallback(
37
+ (name, container, parent, index = 0) => {
38
+ const component = builder.getComponent(name);
39
+ if (!component) {
40
+ throw new Error(`[simple-builder]: Component "${name}" not found`);
41
+ }
42
+ const entry = {
43
+ id: crypto.randomUUID(),
44
+ component: component.name,
45
+ ...parent && { parent },
46
+ ...component.inputs && {
47
+ props: component.inputs.reduce(
48
+ (acc, input) => ({
49
+ ...acc,
50
+ [input.name]: input.defaultValue
51
+ }),
52
+ {}
53
+ )
54
+ },
55
+ ...component.defaultStyles && {
56
+ styles: component.defaultStyles
57
+ }
58
+ };
59
+ if (!parent) {
60
+ setContent((content2) => insertAt(content2, index, entry));
61
+ return;
62
+ }
63
+ setContent(
64
+ (content2) => mapRecursive(content2, (item) => {
65
+ if (item.id === parent) {
66
+ return {
67
+ ...item,
68
+ content: {
69
+ ...item.content,
70
+ [container]: insertAt(item.content?.[container], index, entry)
71
+ }
72
+ };
73
+ }
74
+ return item;
75
+ })
76
+ );
77
+ },
78
+ [setContent, mapRecursive]
79
+ );
80
+ const deleteContent = React.useCallback(
81
+ (id) => setContent((prev) => filterRecursive(prev, (item) => item.id !== id)),
82
+ [setContent, filterRecursive]
83
+ );
84
+ const bringUp = React.useCallback(
85
+ (id) => {
86
+ setContent(
87
+ (content2) => mapRecursive(content2, (item, index, arr) => {
88
+ if (item.id === id && index > 0) {
89
+ return arr[index - 1];
90
+ }
91
+ if (arr[index + 1]?.id === id) {
92
+ return arr[index + 1];
93
+ }
94
+ return item;
95
+ })
96
+ );
97
+ },
98
+ [setContent, mapRecursive]
99
+ );
100
+ const bringDown = React.useCallback(
101
+ (id) => {
102
+ setContent(
103
+ (content2) => mapRecursive(content2, (item, index, arr) => {
104
+ if (item.id === id && index < arr.length - 1) {
105
+ return arr[index + 1];
106
+ }
107
+ if (arr[index - 1]?.id === id) {
108
+ return arr[index - 1];
109
+ }
110
+ return item;
111
+ })
112
+ );
113
+ },
114
+ [setContent, mapRecursive]
115
+ );
116
+ const save = React.useCallback(async () => {
117
+ const slug = window.location.pathname;
118
+ await fetch(`${url}/page/update`, {
119
+ method: "POST",
120
+ body: JSON.stringify({
121
+ slug,
122
+ content
123
+ })
124
+ });
125
+ }, [content]);
126
+ return /* @__PURE__ */ React.createElement(
127
+ BuilderContext.Provider,
128
+ {
129
+ value: {
130
+ url,
131
+ content,
132
+ setContent,
133
+ getItem,
134
+ patchItem,
135
+ addContent,
136
+ bringUp,
137
+ bringDown,
138
+ deleteContent,
139
+ save
140
+ }
141
+ },
142
+ props.children
143
+ );
144
+ };
145
+ var useBuilder = () => {
146
+ const context = React.useContext(BuilderContext);
147
+ if (!context) {
148
+ throw new Error(
149
+ "[simple-builder]: useBuilder must be used within a BuilderProvider"
150
+ );
151
+ }
152
+ return context;
153
+ };
154
+ var filterRecursive = (items, predicate, key = "content") => {
155
+ return items.filter(predicate).map((item) => ({
156
+ ...item,
157
+ ...item[key] && {
158
+ [key]: Object.entries(item[key] ?? {}).reduce(
159
+ (acc, [name, content]) => ({
160
+ ...acc,
161
+ [name]: filterRecursive(content, predicate, key)
162
+ }),
163
+ {}
164
+ )
165
+ }
166
+ }));
167
+ };
168
+ var mapRecursive = (items, predicate, key = "content") => {
169
+ return items.map(predicate).map((item) => ({
170
+ ...item,
171
+ ...item[key] && {
172
+ [key]: Object.entries(item[key] ?? {}).reduce(
173
+ (acc, [name, content]) => ({
174
+ ...acc,
175
+ [name]: mapRecursive(content, predicate, key)
176
+ }),
177
+ {}
178
+ )
179
+ }
180
+ }));
181
+ };
182
+ var findRecursive = (items, predicate, key = "content") => {
183
+ for (const item of items) {
184
+ if (predicate(item)) {
185
+ return item;
186
+ }
187
+ if (item[key]) {
188
+ const keys = Object.keys(item[key] ?? {});
189
+ for (const x of keys) {
190
+ const found = findRecursive(item[key][x], predicate, key);
191
+ if (found) {
192
+ return found;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ };
198
+ var buttonVariants = cva(
199
+ "sb-inline-flex sb-items-center sb-justify-center sb-gap-2 sb-whitespace-nowrap sb-rounded-md sb-text-sm sb-font-medium sb-transition-colors focus-visible:sb-outline-none focus-visible:sb-ring-1 focus-visible:sb-ring-ring disabled:sb-pointer-events-none disabled:sb-opacity-50 [&_svg]:sb-pointer-events-none [&_svg]:sb-size-4 [&_svg]:sb-shrink-0",
200
+ {
201
+ variants: {
202
+ variant: {
203
+ default: "sb-bg-primary sb-text-primary-foreground sb-shadow hover:sb-bg-primary/90",
204
+ destructive: "sb-bg-destructive sb-text-destructive-foreground sb-shadow-sm hover:sb-bg-destructive/90",
205
+ outline: "sb-border sb-border-input sb-bg-background sb-shadow-sm hover:sb-bg-accent hover:sb-text-accent-foreground",
206
+ secondary: "sb-bg-secondary sb-text-secondary-foreground sb-shadow-sm hover:sb-bg-secondary/80",
207
+ ghost: "hover:sb-bg-accent hover:sb-text-accent-foreground",
208
+ link: "sb-text-primary sb-underline-offset-4 hover:sb-underline"
209
+ },
210
+ size: {
211
+ default: "sb-h-9 sb-px-4 sb-py-2",
212
+ sm: "sb-h-8 sb-rounded-md sb-px-3 sb-text-xs",
213
+ lg: "sb-h-10 sb-rounded-md sb-px-8",
214
+ icon: "sb-h-9 sb-w-9"
215
+ }
216
+ },
217
+ defaultVariants: {
218
+ variant: "default",
219
+ size: "default"
220
+ }
221
+ }
222
+ );
223
+ var Button = React.forwardRef(
224
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
225
+ const Comp = asChild ? Slot : "button";
226
+ return /* @__PURE__ */ React.createElement(
227
+ Comp,
228
+ {
229
+ className: cn(buttonVariants({ variant, size, className })),
230
+ ref,
231
+ ...props
232
+ }
233
+ );
234
+ }
235
+ );
236
+ Button.displayName = "Button";
237
+
238
+ export { BuilderProvider, Button, buttonVariants, useBuilder };
package/dist/index.js CHANGED
@@ -1,23 +1,23 @@
1
1
  'use strict';
2
2
 
3
- var chunkU3LGZ4IJ_js = require('./chunk-U3LGZ4IJ.js');
4
- var chunkZEA47N62_js = require('./chunk-ZEA47N62.js');
3
+ var chunkR7ZUBTTN_js = require('./chunk-R7ZUBTTN.js');
4
+ var chunk7SAGJTH2_js = require('./chunk-7SAGJTH2.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "BuilderContent", {
9
9
  enumerable: true,
10
- get: function () { return chunkU3LGZ4IJ_js.BuilderContent; }
10
+ get: function () { return chunkR7ZUBTTN_js.BuilderContent; }
11
11
  });
12
12
  Object.defineProperty(exports, "StaticContent", {
13
13
  enumerable: true,
14
- get: function () { return chunkU3LGZ4IJ_js.StaticContent; }
14
+ get: function () { return chunkR7ZUBTTN_js.StaticContent; }
15
15
  });
16
16
  Object.defineProperty(exports, "BuildContainer", {
17
17
  enumerable: true,
18
- get: function () { return chunkZEA47N62_js.BuildContainer; }
18
+ get: function () { return chunk7SAGJTH2_js.BuildContainer; }
19
19
  });
20
20
  Object.defineProperty(exports, "builder", {
21
21
  enumerable: true,
22
- get: function () { return chunkZEA47N62_js.builder; }
22
+ get: function () { return chunk7SAGJTH2_js.builder; }
23
23
  });
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export { BuilderContent, StaticContent } from './chunk-MV72DQML.mjs';
2
- export { BuildContainer, builder } from './chunk-F7EVAQN7.mjs';
1
+ export { BuilderContent, StaticContent } from './chunk-5EZQG6MP.mjs';
2
+ export { BuildContainer, builder } from './chunk-NAY45PRQ.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simple-builder/react",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "private": false,
5
5
  "description": "React package for the simple builder package.",
6
6
  "repository": "https://github.com/pieter-berkel/simple-builder.git",