@shoppexio/builder-runtime 0.1.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.
@@ -0,0 +1,292 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
3
+ import { createEmptyBuilderSettings } from '@shoppex/builder-contracts';
4
+ import { JSDOM } from 'jsdom';
5
+ import { act } from 'react';
6
+ import { createRoot } from 'react-dom/client';
7
+ import { BuilderBlockFrame, BuilderBlockProvider, BuilderPage, BuilderRuntimePreviewProvider, useBuilderContent, useBuilderContentRecord, } from './react.js';
8
+ function createSettings(revision, title) {
9
+ return {
10
+ ...createEmptyBuilderSettings(revision),
11
+ theme: {
12
+ content: {
13
+ 'hero.title': title,
14
+ },
15
+ layout: {
16
+ home: {
17
+ blocks: [
18
+ {
19
+ id: 'hero-1',
20
+ type: 'hero',
21
+ visible: true,
22
+ settings: {},
23
+ },
24
+ ],
25
+ },
26
+ },
27
+ style_slots: {},
28
+ pages: [],
29
+ terms: {},
30
+ },
31
+ };
32
+ }
33
+ function Probe() {
34
+ const title = useBuilderContent('hero.title', '');
35
+ return (_jsx("section", { "data-builder-block": "hero-1", "data-builder-block-type": "hero", "data-page-id": "home", children: _jsx("h1", { "data-builder-content": "hero.title", children: title }) }));
36
+ }
37
+ function FallbackProbe() {
38
+ const title = useBuilderContent('hero.title', 'Default title');
39
+ return _jsx("h1", { "data-builder-content": "hero.title", children: title });
40
+ }
41
+ function SlotButtonProbe() {
42
+ return (_jsx("section", { "data-builder-block": "hero-1", "data-builder-block-type": "hero", "data-page-id": "home", children: _jsx("button", { type: "button", "data-builder-slot": "button.background", children: "Buy now" }) }));
43
+ }
44
+ function ScopedProbe() {
45
+ return (_jsx(BuilderBlockProvider, { block: {
46
+ id: 'hero-1',
47
+ type: 'hero',
48
+ visible: true,
49
+ settings: {
50
+ title: 'Scoped title',
51
+ subtitle: 'Scoped subtitle',
52
+ },
53
+ }, children: _jsx(ScopedProbeContent, {}) }));
54
+ }
55
+ function ScopedProbeContent() {
56
+ const title = useBuilderContent('hero.title', '');
57
+ const subtitle = useBuilderContent('hero.subtitle', '');
58
+ const contentRecord = useBuilderContentRecord();
59
+ return (_jsxs(_Fragment, { children: [_jsx("h1", { "data-testid": "scoped-title", children: title }), _jsx("p", { "data-testid": "scoped-subtitle", children: subtitle }), _jsx("span", { "data-testid": "scoped-record", children: String(contentRecord.hero.title) })] }));
60
+ }
61
+ function HeroBlock({ block }) {
62
+ const title = useBuilderContent('hero.title', '');
63
+ return (_jsx(BuilderBlockFrame, { as: "section", pageId: "home", block: block, children: _jsx("h1", { "data-builder-content": "hero.title", children: title }) }));
64
+ }
65
+ describe('BuilderRuntimePreviewProvider', () => {
66
+ let dom;
67
+ let root;
68
+ let postedMessages;
69
+ let parentWindow;
70
+ beforeEach(() => {
71
+ postedMessages = [];
72
+ parentWindow = {
73
+ postMessage: (message) => {
74
+ postedMessages.push(message);
75
+ },
76
+ };
77
+ dom = new JSDOM('<!doctype html><html><body><div id="root"></div></body></html>', {
78
+ url: 'https://preview.shoppex.test/?shoppex-preview-mode=theme',
79
+ referrer: 'https://dashboard.shoppex.test/theme/editor',
80
+ });
81
+ Object.defineProperty(dom.window, 'parent', {
82
+ configurable: true,
83
+ value: parentWindow,
84
+ });
85
+ Object.assign(globalThis, {
86
+ window: dom.window,
87
+ document: dom.window.document,
88
+ navigator: dom.window.navigator,
89
+ Element: dom.window.Element,
90
+ HTMLElement: dom.window.HTMLElement,
91
+ HTMLImageElement: dom.window.HTMLImageElement,
92
+ Node: dom.window.Node,
93
+ MouseEvent: dom.window.MouseEvent,
94
+ MessageEvent: dom.window.MessageEvent,
95
+ CustomEvent: dom.window.CustomEvent,
96
+ CSS: {
97
+ escape: (value) => value.replaceAll('"', '\\"'),
98
+ },
99
+ IS_REACT_ACT_ENVIRONMENT: true,
100
+ });
101
+ root = createRoot(dom.window.document.getElementById('root'));
102
+ });
103
+ afterEach(async () => {
104
+ await act(async () => {
105
+ root.unmount();
106
+ });
107
+ dom.window.close();
108
+ const globals = globalThis;
109
+ for (const key of [
110
+ 'window',
111
+ 'document',
112
+ 'navigator',
113
+ 'Element',
114
+ 'HTMLElement',
115
+ 'HTMLImageElement',
116
+ 'Node',
117
+ 'MouseEvent',
118
+ 'MessageEvent',
119
+ 'CustomEvent',
120
+ 'CSS',
121
+ 'IS_REACT_ACT_ENVIRONMENT',
122
+ ]) {
123
+ delete globals[key];
124
+ }
125
+ });
126
+ test('sends READY with the initial revision', async () => {
127
+ await act(async () => {
128
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(3, 'Initial title'), children: _jsx(Probe, {}) }));
129
+ });
130
+ expect(postedMessages).toContainEqual({ type: 'READY', revision: 3 });
131
+ expect(dom.window.document.body.textContent).toContain('Initial title');
132
+ });
133
+ test('normalizes mixed initial builder settings before strict validation', async () => {
134
+ await act(async () => {
135
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: {
136
+ version: 2,
137
+ revision: 9,
138
+ theme: {
139
+ content: {
140
+ 'hero.title': 'Mixed title',
141
+ },
142
+ layout: {
143
+ home: {
144
+ sections: [
145
+ {
146
+ id: 'hero',
147
+ visible: true,
148
+ },
149
+ ],
150
+ },
151
+ },
152
+ tokens_override: {
153
+ colors: {
154
+ primary: '#111827',
155
+ },
156
+ },
157
+ },
158
+ }, children: _jsx(Probe, {}) }));
159
+ });
160
+ expect(postedMessages).toContainEqual({ type: 'READY', revision: 9 });
161
+ expect(dom.window.document.body.textContent).toContain('Mixed title');
162
+ });
163
+ test('preserves intentionally empty content strings in hooks', async () => {
164
+ await act(async () => {
165
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(4, ''), children: _jsx(FallbackProbe, {}) }));
166
+ });
167
+ expect(dom.window.document.body.textContent).toBe('');
168
+ });
169
+ test('responds to explicit READY requests when the parent missed the initial message', async () => {
170
+ await act(async () => {
171
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(3, 'Initial title'), children: _jsx(Probe, {}) }));
172
+ });
173
+ postedMessages.length = 0;
174
+ await act(async () => {
175
+ dom.window.dispatchEvent(new dom.window.MessageEvent('message', {
176
+ origin: 'https://dashboard.shoppex.test',
177
+ source: parentWindow,
178
+ data: {
179
+ type: 'REQUEST_READY',
180
+ },
181
+ }));
182
+ });
183
+ expect(postedMessages).toEqual([{ type: 'READY', revision: 3 }]);
184
+ });
185
+ test('applies preview state and acknowledges the exact revision', async () => {
186
+ await act(async () => {
187
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(3, 'Initial title'), children: _jsx(Probe, {}) }));
188
+ });
189
+ await act(async () => {
190
+ dom.window.dispatchEvent(new dom.window.MessageEvent('message', {
191
+ origin: 'https://dashboard.shoppex.test',
192
+ source: parentWindow,
193
+ data: {
194
+ type: 'APPLY_STATE',
195
+ revision: 4,
196
+ state: createSettings(4, 'Updated title'),
197
+ },
198
+ }));
199
+ });
200
+ expect(postedMessages).toContainEqual({ type: 'APPLIED', revision: 4 });
201
+ expect(dom.window.document.body.textContent).toContain('Updated title');
202
+ });
203
+ test('renders page blocks through a typed registry and shared block frame', async () => {
204
+ await act(async () => {
205
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(3, 'Registry title'), children: _jsx(BuilderPage, { pageId: "home", registry: {
206
+ hero: HeroBlock,
207
+ }, context: {} }) }));
208
+ });
209
+ const renderedBlock = dom.window.document.querySelector('[data-builder-block="hero-1"]');
210
+ expect(renderedBlock?.getAttribute('data-page-id')).toBe('home');
211
+ expect(renderedBlock?.getAttribute('data-builder-block-type')).toBe('hero');
212
+ expect(dom.window.document.body.textContent).toContain('Registry title');
213
+ });
214
+ test('prefers scoped block settings over global builder content inside a block provider', async () => {
215
+ await act(async () => {
216
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(3, 'Global title'), children: _jsx(ScopedProbe, {}) }));
217
+ });
218
+ expect(dom.window.document.querySelector('[data-testid="scoped-title"]')?.textContent).toBe('Scoped title');
219
+ expect(dom.window.document.querySelector('[data-testid="scoped-subtitle"]')?.textContent).toBe('Scoped subtitle');
220
+ expect(dom.window.document.querySelector('[data-testid="scoped-record"]')?.textContent).toBe('Scoped title');
221
+ });
222
+ test('rejects stale preview revisions without changing rendered content', async () => {
223
+ await act(async () => {
224
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(5, 'Current title'), children: _jsx(Probe, {}) }));
225
+ });
226
+ await act(async () => {
227
+ dom.window.dispatchEvent(new dom.window.MessageEvent('message', {
228
+ origin: 'https://dashboard.shoppex.test',
229
+ source: parentWindow,
230
+ data: {
231
+ type: 'APPLY_STATE',
232
+ revision: 4,
233
+ state: createSettings(4, 'Stale title'),
234
+ },
235
+ }));
236
+ });
237
+ expect(postedMessages).toContainEqual({
238
+ type: 'APPLY_FAILED',
239
+ revision: 4,
240
+ error: 'Stale builder revision',
241
+ });
242
+ expect(dom.window.document.body.textContent).toContain('Current title');
243
+ });
244
+ test('emits block selection details from iframe clicks', async () => {
245
+ await act(async () => {
246
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(7, 'Clickable title'), children: _jsx(Probe, {}) }));
247
+ });
248
+ const heading = dom.window.document.querySelector('h1');
249
+ heading?.dispatchEvent(new dom.window.MouseEvent('click', { bubbles: true, cancelable: true }));
250
+ expect(postedMessages).toContainEqual({
251
+ type: 'ELEMENT_CLICKED',
252
+ revision: 7,
253
+ selection: {
254
+ pageId: 'home',
255
+ blockId: 'hero-1',
256
+ blockType: 'hero',
257
+ contentPath: 'hero.title',
258
+ elementType: 'text',
259
+ },
260
+ });
261
+ });
262
+ test('classifies buttons before style slots for inspector clicks', async () => {
263
+ await act(async () => {
264
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(7, 'Clickable title'), children: _jsx(SlotButtonProbe, {}) }));
265
+ });
266
+ const button = dom.window.document.querySelector('button');
267
+ button?.dispatchEvent(new dom.window.MouseEvent('click', { bubbles: true, cancelable: true }));
268
+ expect(postedMessages).toContainEqual({
269
+ type: 'ELEMENT_CLICKED',
270
+ revision: 7,
271
+ selection: {
272
+ pageId: 'home',
273
+ blockId: 'hero-1',
274
+ blockType: 'hero',
275
+ slotId: 'button.background',
276
+ elementType: 'button',
277
+ },
278
+ });
279
+ });
280
+ test('does not intercept clicks outside trusted builder preview embeds', async () => {
281
+ dom.reconfigure({
282
+ url: 'https://preview.shoppex.test/',
283
+ });
284
+ await act(async () => {
285
+ root.render(_jsx(BuilderRuntimePreviewProvider, { initialSettings: createSettings(7, 'Clickable title'), children: _jsx(Probe, {}) }));
286
+ });
287
+ postedMessages.length = 0;
288
+ const heading = dom.window.document.querySelector('h1');
289
+ heading?.dispatchEvent(new dom.window.MouseEvent('click', { bubbles: true, cancelable: true }));
290
+ expect(postedMessages).toEqual([]);
291
+ });
292
+ });
@@ -0,0 +1,302 @@
1
+ import type { BlockInstance, BuilderSettings, Breakpoint, StyleSlotId } from '@shoppex/builder-contracts';
2
+ import { type ComponentType, type ElementType, type ReactNode } from 'react';
3
+ type BuilderRuntimeContextValue = {
4
+ settings: BuilderSettings;
5
+ };
6
+ export declare function BuilderRuntimeProvider({ settings, children }: {
7
+ settings: BuilderSettings;
8
+ children: ReactNode;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ export declare function BuilderBlockProvider({ block, children }: {
11
+ block: BlockInstance;
12
+ children: ReactNode;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ export declare function BuilderRuntimePreviewProvider({ initialSettings, children, }: {
15
+ initialSettings?: unknown;
16
+ children: ReactNode;
17
+ }): import("react/jsx-runtime").JSX.Element;
18
+ export declare function BuilderRuntimeStyle({ selector }: {
19
+ selector?: string;
20
+ }): import("react/jsx-runtime").JSX.Element | null;
21
+ export type BuilderBlockComponent<TContext = unknown> = ComponentType<{
22
+ block: BlockInstance;
23
+ context: TContext;
24
+ }>;
25
+ export type BuilderBlockRegistry<TContext = unknown> = Record<string, BuilderBlockComponent<TContext>>;
26
+ export declare function BuilderBlockFrame<TElement extends ElementType = 'div'>({ as, pageId, block, className, children, }: {
27
+ as?: TElement;
28
+ pageId: string;
29
+ block: BlockInstance;
30
+ className?: string;
31
+ children: ReactNode;
32
+ }): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
33
+ export declare function BuilderPage<TContext = unknown>({ pageId, blocks, registry, context, fallback, }: {
34
+ pageId: string;
35
+ blocks?: BlockInstance[];
36
+ registry: BuilderBlockRegistry<TContext>;
37
+ context: TContext;
38
+ fallback?: ReactNode;
39
+ }): import("react/jsx-runtime").JSX.Element;
40
+ export declare function useBuilderRuntime(): BuilderRuntimeContextValue;
41
+ export declare function useBuilderContent(path: string, fallback?: string): string | undefined;
42
+ export declare function useBuilderContentValue(path: string): unknown;
43
+ export declare function useBuilderContentList<T = unknown>(path: string, fallback?: T[]): T[];
44
+ export declare function useBuilderContentRecord(): Record<string, unknown>;
45
+ export declare function useBuilderBlockSetting<T = unknown>(input: {
46
+ pageId: string;
47
+ blockId: string;
48
+ path: string;
49
+ fallback: T;
50
+ }): T;
51
+ export declare function useBuilderPageLayout(pageId: string): {
52
+ blocks: {
53
+ id: string;
54
+ type: string;
55
+ visible: boolean;
56
+ settings: Record<string, unknown>;
57
+ variant?: string | undefined;
58
+ style_overrides?: {
59
+ 'button.radius'?: {
60
+ base: number;
61
+ sm?: number | undefined;
62
+ md?: number | undefined;
63
+ lg?: number | undefined;
64
+ xl?: number | undefined;
65
+ } | undefined;
66
+ 'button.background'?: string | undefined;
67
+ 'button.foreground'?: string | undefined;
68
+ 'button.border'?: string | undefined;
69
+ 'button.font.weight'?: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | undefined;
70
+ 'input.radius'?: {
71
+ base: number;
72
+ sm?: number | undefined;
73
+ md?: number | undefined;
74
+ lg?: number | undefined;
75
+ xl?: number | undefined;
76
+ } | undefined;
77
+ 'input.height'?: {
78
+ base: number;
79
+ sm?: number | undefined;
80
+ md?: number | undefined;
81
+ lg?: number | undefined;
82
+ xl?: number | undefined;
83
+ } | undefined;
84
+ 'input.border'?: string | undefined;
85
+ 'input.background'?: string | undefined;
86
+ 'input.foreground'?: string | undefined;
87
+ 'card.radius'?: {
88
+ base: number;
89
+ sm?: number | undefined;
90
+ md?: number | undefined;
91
+ lg?: number | undefined;
92
+ xl?: number | undefined;
93
+ } | undefined;
94
+ 'card.background'?: string | undefined;
95
+ 'card.border'?: string | undefined;
96
+ 'section.padding.y'?: {
97
+ base: number;
98
+ sm?: number | undefined;
99
+ md?: number | undefined;
100
+ lg?: number | undefined;
101
+ xl?: number | undefined;
102
+ } | undefined;
103
+ 'section.padding.x'?: {
104
+ base: number;
105
+ sm?: number | undefined;
106
+ md?: number | undefined;
107
+ lg?: number | undefined;
108
+ xl?: number | undefined;
109
+ } | undefined;
110
+ 'container.width'?: {
111
+ base: number;
112
+ sm?: number | undefined;
113
+ md?: number | undefined;
114
+ lg?: number | undefined;
115
+ xl?: number | undefined;
116
+ } | undefined;
117
+ 'color.primary'?: string | undefined;
118
+ 'color.accent'?: string | undefined;
119
+ 'color.background'?: string | undefined;
120
+ 'color.foreground'?: string | undefined;
121
+ 'color.muted'?: string | undefined;
122
+ 'link.color'?: string | undefined;
123
+ 'typography.heading.weight'?: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | undefined;
124
+ 'typography.body.size'?: {
125
+ base: number;
126
+ sm?: number | undefined;
127
+ md?: number | undefined;
128
+ lg?: number | undefined;
129
+ xl?: number | undefined;
130
+ } | undefined;
131
+ } | undefined;
132
+ }[];
133
+ };
134
+ export declare function useBuilderPageBlocks(pageId: string): {
135
+ id: string;
136
+ type: string;
137
+ visible: boolean;
138
+ settings: Record<string, unknown>;
139
+ variant?: string | undefined;
140
+ style_overrides?: {
141
+ 'button.radius'?: {
142
+ base: number;
143
+ sm?: number | undefined;
144
+ md?: number | undefined;
145
+ lg?: number | undefined;
146
+ xl?: number | undefined;
147
+ } | undefined;
148
+ 'button.background'?: string | undefined;
149
+ 'button.foreground'?: string | undefined;
150
+ 'button.border'?: string | undefined;
151
+ 'button.font.weight'?: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | undefined;
152
+ 'input.radius'?: {
153
+ base: number;
154
+ sm?: number | undefined;
155
+ md?: number | undefined;
156
+ lg?: number | undefined;
157
+ xl?: number | undefined;
158
+ } | undefined;
159
+ 'input.height'?: {
160
+ base: number;
161
+ sm?: number | undefined;
162
+ md?: number | undefined;
163
+ lg?: number | undefined;
164
+ xl?: number | undefined;
165
+ } | undefined;
166
+ 'input.border'?: string | undefined;
167
+ 'input.background'?: string | undefined;
168
+ 'input.foreground'?: string | undefined;
169
+ 'card.radius'?: {
170
+ base: number;
171
+ sm?: number | undefined;
172
+ md?: number | undefined;
173
+ lg?: number | undefined;
174
+ xl?: number | undefined;
175
+ } | undefined;
176
+ 'card.background'?: string | undefined;
177
+ 'card.border'?: string | undefined;
178
+ 'section.padding.y'?: {
179
+ base: number;
180
+ sm?: number | undefined;
181
+ md?: number | undefined;
182
+ lg?: number | undefined;
183
+ xl?: number | undefined;
184
+ } | undefined;
185
+ 'section.padding.x'?: {
186
+ base: number;
187
+ sm?: number | undefined;
188
+ md?: number | undefined;
189
+ lg?: number | undefined;
190
+ xl?: number | undefined;
191
+ } | undefined;
192
+ 'container.width'?: {
193
+ base: number;
194
+ sm?: number | undefined;
195
+ md?: number | undefined;
196
+ lg?: number | undefined;
197
+ xl?: number | undefined;
198
+ } | undefined;
199
+ 'color.primary'?: string | undefined;
200
+ 'color.accent'?: string | undefined;
201
+ 'color.background'?: string | undefined;
202
+ 'color.foreground'?: string | undefined;
203
+ 'color.muted'?: string | undefined;
204
+ 'link.color'?: string | undefined;
205
+ 'typography.heading.weight'?: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | undefined;
206
+ 'typography.body.size'?: {
207
+ base: number;
208
+ sm?: number | undefined;
209
+ md?: number | undefined;
210
+ lg?: number | undefined;
211
+ xl?: number | undefined;
212
+ } | undefined;
213
+ } | undefined;
214
+ }[];
215
+ export declare function useVisibleBuilderPageBlocks(pageId: string): {
216
+ id: string;
217
+ type: string;
218
+ visible: boolean;
219
+ settings: Record<string, unknown>;
220
+ variant?: string | undefined;
221
+ style_overrides?: {
222
+ 'button.radius'?: {
223
+ base: number;
224
+ sm?: number | undefined;
225
+ md?: number | undefined;
226
+ lg?: number | undefined;
227
+ xl?: number | undefined;
228
+ } | undefined;
229
+ 'button.background'?: string | undefined;
230
+ 'button.foreground'?: string | undefined;
231
+ 'button.border'?: string | undefined;
232
+ 'button.font.weight'?: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | undefined;
233
+ 'input.radius'?: {
234
+ base: number;
235
+ sm?: number | undefined;
236
+ md?: number | undefined;
237
+ lg?: number | undefined;
238
+ xl?: number | undefined;
239
+ } | undefined;
240
+ 'input.height'?: {
241
+ base: number;
242
+ sm?: number | undefined;
243
+ md?: number | undefined;
244
+ lg?: number | undefined;
245
+ xl?: number | undefined;
246
+ } | undefined;
247
+ 'input.border'?: string | undefined;
248
+ 'input.background'?: string | undefined;
249
+ 'input.foreground'?: string | undefined;
250
+ 'card.radius'?: {
251
+ base: number;
252
+ sm?: number | undefined;
253
+ md?: number | undefined;
254
+ lg?: number | undefined;
255
+ xl?: number | undefined;
256
+ } | undefined;
257
+ 'card.background'?: string | undefined;
258
+ 'card.border'?: string | undefined;
259
+ 'section.padding.y'?: {
260
+ base: number;
261
+ sm?: number | undefined;
262
+ md?: number | undefined;
263
+ lg?: number | undefined;
264
+ xl?: number | undefined;
265
+ } | undefined;
266
+ 'section.padding.x'?: {
267
+ base: number;
268
+ sm?: number | undefined;
269
+ md?: number | undefined;
270
+ lg?: number | undefined;
271
+ xl?: number | undefined;
272
+ } | undefined;
273
+ 'container.width'?: {
274
+ base: number;
275
+ sm?: number | undefined;
276
+ md?: number | undefined;
277
+ lg?: number | undefined;
278
+ xl?: number | undefined;
279
+ } | undefined;
280
+ 'color.primary'?: string | undefined;
281
+ 'color.accent'?: string | undefined;
282
+ 'color.background'?: string | undefined;
283
+ 'color.foreground'?: string | undefined;
284
+ 'color.muted'?: string | undefined;
285
+ 'link.color'?: string | undefined;
286
+ 'typography.heading.weight'?: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | undefined;
287
+ 'typography.body.size'?: {
288
+ base: number;
289
+ sm?: number | undefined;
290
+ md?: number | undefined;
291
+ lg?: number | undefined;
292
+ xl?: number | undefined;
293
+ } | undefined;
294
+ } | undefined;
295
+ }[];
296
+ export declare function useBuilderStyleSlot(slotId: StyleSlotId, input?: {
297
+ breakpoint?: Breakpoint;
298
+ fallback?: unknown;
299
+ }): unknown;
300
+ export declare function useBuilderCss(selector?: string): string;
301
+ export {};
302
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}