@bagelink/blox 1.5.17 โ†’ 1.5.20

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 (109) hide show
  1. package/dist/blox.css +720 -68
  2. package/dist/components/base/Button.vue.d.ts.map +1 -1
  3. package/dist/components/base/Container.vue.d.ts.map +1 -1
  4. package/dist/components/base/Image.vue.d.ts.map +1 -1
  5. package/dist/components/base/Spacer.vue.d.ts.map +1 -1
  6. package/dist/components/base/Text.vue.d.ts.map +1 -1
  7. package/dist/components/base/Title.vue.d.ts.map +1 -1
  8. package/dist/components/blocks/BigImage.vue.d.ts +12 -0
  9. package/dist/components/blocks/BigImage.vue.d.ts.map +1 -0
  10. package/dist/components/blocks/BigQuote.vue.d.ts +14 -0
  11. package/dist/components/blocks/BigQuote.vue.d.ts.map +1 -0
  12. package/dist/components/blocks/BlockFooter.vue.d.ts +17 -0
  13. package/dist/components/blocks/BlockFooter.vue.d.ts.map +1 -0
  14. package/dist/components/blocks/BlockNav.vue.d.ts +22 -0
  15. package/dist/components/blocks/BlockNav.vue.d.ts.map +1 -0
  16. package/dist/components/blocks/Cards.vue.d.ts +18 -0
  17. package/dist/components/blocks/Cards.vue.d.ts.map +1 -0
  18. package/dist/components/blocks/Contact.vue.d.ts +22 -0
  19. package/dist/components/blocks/Contact.vue.d.ts.map +1 -0
  20. package/dist/components/blocks/CountDown.vue.d.ts +76 -0
  21. package/dist/components/blocks/CountDown.vue.d.ts.map +1 -0
  22. package/dist/components/blocks/Cta.vue.d.ts +15 -0
  23. package/dist/components/blocks/Cta.vue.d.ts.map +1 -0
  24. package/dist/components/blocks/Faq.vue.d.ts +20 -0
  25. package/dist/components/blocks/Faq.vue.d.ts.map +1 -0
  26. package/dist/components/blocks/Grid.vue.d.ts +24 -0
  27. package/dist/components/blocks/Grid.vue.d.ts.map +1 -0
  28. package/dist/components/blocks/Icons.vue.d.ts +16 -0
  29. package/dist/components/blocks/Icons.vue.d.ts.map +1 -0
  30. package/dist/components/blocks/IconsList.vue.d.ts +22 -0
  31. package/dist/components/blocks/IconsList.vue.d.ts.map +1 -0
  32. package/dist/components/blocks/ImageCarousel.vue.d.ts +16 -0
  33. package/dist/components/blocks/ImageCarousel.vue.d.ts.map +1 -0
  34. package/dist/components/blocks/ImageLinkBoxes.vue.d.ts +14 -0
  35. package/dist/components/blocks/ImageLinkBoxes.vue.d.ts.map +1 -0
  36. package/dist/components/blocks/Logos.vue.d.ts +17 -0
  37. package/dist/components/blocks/Logos.vue.d.ts.map +1 -0
  38. package/dist/components/blocks/PopUp.vue.d.ts +23 -0
  39. package/dist/components/blocks/PopUp.vue.d.ts.map +1 -0
  40. package/dist/components/blocks/PriceTable.vue.d.ts +24 -0
  41. package/dist/components/blocks/PriceTable.vue.d.ts.map +1 -0
  42. package/dist/components/blocks/Space.vue.d.ts +25 -0
  43. package/dist/components/blocks/Space.vue.d.ts.map +1 -0
  44. package/dist/components/blocks/Tabs.vue.d.ts +15 -0
  45. package/dist/components/blocks/Tabs.vue.d.ts.map +1 -0
  46. package/dist/components/blocks/Team.vue.d.ts +19 -0
  47. package/dist/components/blocks/Team.vue.d.ts.map +1 -0
  48. package/dist/components/blocks/Testimonials.vue.d.ts +18 -0
  49. package/dist/components/blocks/Testimonials.vue.d.ts.map +1 -0
  50. package/dist/components/blocks/Text.vue.d.ts +10 -0
  51. package/dist/components/blocks/Text.vue.d.ts.map +1 -0
  52. package/dist/components/blocks/TextImage.vue.d.ts +20 -0
  53. package/dist/components/blocks/TextImage.vue.d.ts.map +1 -0
  54. package/dist/components/blocks/TextSide.vue.d.ts +19 -0
  55. package/dist/components/blocks/TextSide.vue.d.ts.map +1 -0
  56. package/dist/components/blocks/Title.vue.d.ts +16 -0
  57. package/dist/components/blocks/Title.vue.d.ts.map +1 -0
  58. package/dist/components/blocks/TitleSide.vue.d.ts +21 -0
  59. package/dist/components/blocks/TitleSide.vue.d.ts.map +1 -0
  60. package/dist/components/blocks/VideoBox.vue.d.ts +15 -0
  61. package/dist/components/blocks/VideoBox.vue.d.ts.map +1 -0
  62. package/dist/components/blocks/blocks.d.ts +27 -0
  63. package/dist/components/blocks/blocks.d.ts.map +1 -0
  64. package/dist/components/index.d.ts +4 -3
  65. package/dist/components/index.d.ts.map +1 -1
  66. package/dist/config/baseComponents.d.ts.map +1 -1
  67. package/dist/config/blockComponents.d.ts +41 -0
  68. package/dist/config/blockComponents.d.ts.map +1 -0
  69. package/dist/core/communication.d.ts.map +1 -1
  70. package/dist/core/registry.d.ts.map +1 -1
  71. package/dist/core/renderer.d.ts.map +1 -1
  72. package/dist/core/types.d.ts.map +1 -1
  73. package/dist/index.cjs +9223 -472
  74. package/dist/index.d.ts +2 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.mjs +9124 -458
  77. package/dist/setup.d.ts +4 -4
  78. package/dist/setup.d.ts.map +1 -1
  79. package/dist/utils/componentPreviewGenerator.d.ts +113 -0
  80. package/dist/utils/componentPreviewGenerator.d.ts.map +1 -0
  81. package/dist/utils/normalizer.d.ts.map +1 -1
  82. package/dist/utils/styles.d.ts.map +1 -1
  83. package/dist/views/ExternalPreview.vue.d.ts.map +1 -1
  84. package/dist/views/RenderPage.vue.d.ts.map +1 -1
  85. package/package.json +3 -2
  86. package/components/base/Button.vue +0 -140
  87. package/components/base/Container.vue +0 -64
  88. package/components/base/Image.vue +0 -75
  89. package/components/base/Spacer.vue +0 -33
  90. package/components/base/Text.vue +0 -37
  91. package/components/base/Title.vue +0 -55
  92. package/components/index.ts +0 -20
  93. package/config/baseComponents.ts +0 -364
  94. package/core/communication.ts +0 -140
  95. package/core/registry.ts +0 -108
  96. package/core/renderer.ts +0 -217
  97. package/core/types.ts +0 -148
  98. package/dist/example-setup.d.ts +0 -1
  99. package/dist/example-setup.d.ts.map +0 -1
  100. package/dist/styles.d.ts +0 -8
  101. package/dist/styles.d.ts.map +0 -1
  102. package/dist/vite.config.d.ts +0 -3
  103. package/dist/vite.config.d.ts.map +0 -1
  104. package/index.ts +0 -43
  105. package/setup.ts +0 -472
  106. package/utils/normalizer.ts +0 -74
  107. package/utils/styles.ts +0 -228
  108. package/views/ExternalPreview.vue +0 -415
  109. package/views/RenderPage.vue +0 -127
@@ -1,364 +0,0 @@
1
- /**
2
- * Base Component Configuration
3
- *
4
- * Defines all built-in components with their Vue components and editor schemas
5
- */
6
-
7
- import type { ComponentConstructor } from '../core/types'
8
-
9
- import Button from '../components/base/Button.vue'
10
- import Container from '../components/base/Container.vue'
11
- import Image from '../components/base/Image.vue'
12
- import Spacer from '../components/base/Spacer.vue'
13
- // Import base components
14
- import Text from '../components/base/Text.vue'
15
- import Title from '../components/base/Title.vue'
16
-
17
- export interface ComponentSchema {
18
- type: 'text' | 'richtext' | 'number' | 'checkbox' | 'select' | 'upload' | 'color' | 'array' | 'row'
19
- key: string
20
- label: string
21
- defaultValue?: any
22
- options?: Array<{ label: string, value: any }>
23
- height?: string | number
24
- fields?: ComponentSchema[] // For array and row types
25
- class?: string
26
- placeholder?: string
27
- [key: string]: any
28
- }
29
-
30
- export interface ComponentConfig {
31
- id: string
32
- label: string
33
- icon: string
34
- img?: string
35
- order?: number
36
- component: ComponentConstructor | (() => Promise<any>) // Support async components
37
- content?: ComponentSchema[] // Content editing schema
38
- settings?: ComponentSchema[] // Settings schema
39
- category?: string // Component category for organization
40
- }
41
-
42
- /**
43
- * Individual component configurations for easy importing
44
- */
45
- export const TextConfig: ComponentConfig = {
46
- id: 'Text',
47
- label: 'Text',
48
- icon: 'text_fields',
49
- order: 10,
50
- category: 'basic',
51
- component: Text,
52
- content: [
53
- {
54
- type: 'richtext',
55
- key: 'content',
56
- label: 'Content',
57
- defaultValue: '<p>Enter your text here...</p>',
58
- height: 200,
59
- },
60
- ],
61
- settings: [
62
- {
63
- type: 'select',
64
- key: 'tag',
65
- label: 'HTML Tag',
66
- defaultValue: 'div',
67
- options: [
68
- { label: 'Div', value: 'div' },
69
- { label: 'Paragraph', value: 'p' },
70
- { label: 'Span', value: 'span' },
71
- { label: 'Article', value: 'article' },
72
- { label: 'Section', value: 'section' },
73
- ],
74
- },
75
- {
76
- type: 'select',
77
- key: 'align',
78
- label: 'Text Alignment',
79
- defaultValue: 'left',
80
- options: [
81
- { label: 'Left', value: 'left' },
82
- { label: 'Center', value: 'center' },
83
- { label: 'Right', value: 'right' },
84
- { label: 'Justify', value: 'justify' },
85
- ],
86
- },
87
- ],
88
- }
89
-
90
- export const TitleConfig: ComponentConfig = {
91
- id: 'Title',
92
- label: 'Title',
93
- icon: 'title',
94
- order: 5,
95
- category: 'basic',
96
- component: Title,
97
- content: [
98
- {
99
- type: 'text',
100
- key: 'title',
101
- label: 'Title',
102
- defaultValue: 'Your Title Here',
103
- },
104
- {
105
- type: 'text',
106
- key: 'subtitle',
107
- label: 'Subtitle',
108
- defaultValue: '',
109
- },
110
- ],
111
- settings: [
112
- {
113
- type: 'select',
114
- key: 'tag',
115
- label: 'Heading Tag',
116
- defaultValue: 'h2',
117
- options: [
118
- { label: 'H1', value: 'h1' },
119
- { label: 'H2', value: 'h2' },
120
- { label: 'H3', value: 'h3' },
121
- { label: 'H4', value: 'h4' },
122
- { label: 'H5', value: 'h5' },
123
- { label: 'H6', value: 'h6' },
124
- ],
125
- },
126
- {
127
- type: 'select',
128
- key: 'align',
129
- label: 'Text Alignment',
130
- defaultValue: 'center',
131
- options: [
132
- { label: 'Left', value: 'left' },
133
- { label: 'Center', value: 'center' },
134
- { label: 'Right', value: 'right' },
135
- ],
136
- },
137
- {
138
- type: 'number',
139
- key: 'size',
140
- label: 'Font Size (px)',
141
- defaultValue: 32,
142
- },
143
- ],
144
- }
145
-
146
- export const ButtonConfig: ComponentConfig = {
147
- id: 'Button',
148
- label: 'Button',
149
- icon: 'smart_button',
150
- order: 15,
151
- category: 'basic',
152
- component: Button,
153
- content: [
154
- {
155
- type: 'text',
156
- key: 'btnTxt',
157
- label: 'Button Text',
158
- defaultValue: 'Click Me',
159
- },
160
- {
161
- type: 'text',
162
- key: 'btnUrl',
163
- label: 'Button URL',
164
- defaultValue: '#',
165
- },
166
- ],
167
- settings: [
168
- {
169
- type: 'select',
170
- key: 'variant',
171
- label: 'Button Style',
172
- defaultValue: 'primary',
173
- options: [
174
- { label: 'Primary', value: 'primary' },
175
- { label: 'Secondary', value: 'secondary' },
176
- { label: 'Outline', value: 'outline' },
177
- { label: 'Ghost', value: 'ghost' },
178
- ],
179
- },
180
- {
181
- type: 'select',
182
- key: 'size',
183
- label: 'Size',
184
- defaultValue: 'md',
185
- options: [
186
- { label: 'Small', value: 'sm' },
187
- { label: 'Medium', value: 'md' },
188
- { label: 'Large', value: 'lg' },
189
- ],
190
- },
191
- {
192
- type: 'select',
193
- key: 'align',
194
- label: 'Alignment',
195
- defaultValue: 'left',
196
- options: [
197
- { label: 'Left', value: 'left' },
198
- { label: 'Center', value: 'center' },
199
- { label: 'Right', value: 'right' },
200
- ],
201
- },
202
- {
203
- type: 'checkbox',
204
- key: 'fullWidth',
205
- label: 'Full Width',
206
- defaultValue: false,
207
- },
208
- {
209
- type: 'select',
210
- key: 'btnTarget',
211
- label: 'Link Target',
212
- defaultValue: '_self',
213
- options: [
214
- { label: 'Same Window', value: '_self' },
215
- { label: 'New Window', value: '_blank' },
216
- ],
217
- },
218
- ],
219
- }
220
-
221
- export const ImageConfig: ComponentConfig = {
222
- id: 'Image',
223
- label: 'Image',
224
- icon: 'image',
225
- order: 20,
226
- category: 'media',
227
- component: Image,
228
- content: [
229
- {
230
- type: 'upload',
231
- key: 'src',
232
- label: 'Image',
233
- defaultValue: '',
234
- height: 200,
235
- },
236
- {
237
- type: 'text',
238
- key: 'alt',
239
- label: 'Alt Text',
240
- defaultValue: '',
241
- },
242
- ],
243
- settings: [
244
- {
245
- type: 'select',
246
- key: 'objectFit',
247
- label: 'Object Fit',
248
- defaultValue: 'cover',
249
- options: [
250
- { label: 'Cover', value: 'cover' },
251
- { label: 'Contain', value: 'contain' },
252
- { label: 'Fill', value: 'fill' },
253
- { label: 'None', value: 'none' },
254
- { label: 'Scale Down', value: 'scale-down' },
255
- ],
256
- },
257
- {
258
- type: 'number',
259
- key: 'maxWidth',
260
- label: 'Max Width (px)',
261
- defaultValue: null,
262
- },
263
- {
264
- type: 'number',
265
- key: 'height',
266
- label: 'Height (px)',
267
- defaultValue: null,
268
- },
269
- {
270
- type: 'select',
271
- key: 'align',
272
- label: 'Alignment',
273
- defaultValue: 'center',
274
- options: [
275
- { label: 'Left', value: 'left' },
276
- { label: 'Center', value: 'center' },
277
- { label: 'Right', value: 'right' },
278
- ],
279
- },
280
- ],
281
- }
282
-
283
- export const SpacerConfig: ComponentConfig = {
284
- id: 'Spacer',
285
- label: 'Spacer',
286
- icon: 'height',
287
- order: 25,
288
- category: 'layout',
289
- component: Spacer,
290
- content: [],
291
- settings: [
292
- {
293
- type: 'number',
294
- key: 'height',
295
- label: 'Height (px)',
296
- defaultValue: 40,
297
- },
298
- ],
299
- }
300
-
301
- export const ContainerConfig: ComponentConfig = {
302
- id: 'Container',
303
- label: 'Container',
304
- icon: 'view_module',
305
- order: 30,
306
- category: 'layout',
307
- component: Container,
308
- content: [
309
- {
310
- type: 'richtext',
311
- key: 'content',
312
- label: 'Content',
313
- defaultValue: '<p>Container content...</p>',
314
- height: 200,
315
- },
316
- ],
317
- settings: [
318
- {
319
- type: 'select',
320
- key: 'maxWidth',
321
- label: 'Max Width',
322
- defaultValue: 'lg',
323
- options: [
324
- { label: 'Small (640px)', value: 'sm' },
325
- { label: 'Medium (768px)', value: 'md' },
326
- { label: 'Large (1024px)', value: 'lg' },
327
- { label: 'Extra Large (1280px)', value: 'xl' },
328
- { label: 'Full Width', value: 'full' },
329
- ],
330
- },
331
- {
332
- type: 'checkbox',
333
- key: 'centered',
334
- label: 'Center Content',
335
- defaultValue: true,
336
- },
337
- ],
338
- }
339
-
340
- /**
341
- * Base component configurations array
342
- */
343
- export const baseComponentConfigs: ComponentConfig[] = [
344
- TextConfig,
345
- TitleConfig,
346
- ButtonConfig,
347
- ImageConfig,
348
- SpacerConfig,
349
- ContainerConfig,
350
- ]
351
-
352
- /**
353
- * Get all base component configurations
354
- */
355
- export function getBaseComponentConfigs(): ComponentConfig[] {
356
- return baseComponentConfigs
357
- }
358
-
359
- /**
360
- * Get a base component configuration by ID
361
- */
362
- export function getBaseComponentConfig(id: string): ComponentConfig | undefined {
363
- return baseComponentConfigs.find(config => config.id === id)
364
- }
@@ -1,140 +0,0 @@
1
- /**
2
- * PostMessage Communication Protocol
3
- *
4
- * Handles secure communication between editor and external preview
5
- */
6
-
7
- import type { EditorMessage, MessageType } from './types'
8
-
9
- export type MessageHandler = (message: EditorMessage) => void
10
-
11
- interface CommunicationConfig {
12
- origin: string // Allowed origin for security
13
- targetWindow?: Window // Target window for sending messages
14
- onMessage?: MessageHandler
15
- }
16
-
17
- export class CommunicationBridge {
18
- private origin: string
19
- private targetWindow: Window
20
- private handlers: Map<MessageType, Set<MessageHandler>>
21
- private boundMessageHandler: (event: MessageEvent) => void
22
-
23
- constructor(config: CommunicationConfig) {
24
- this.origin = config.origin
25
- this.targetWindow = config.targetWindow || window.parent
26
- this.handlers = new Map()
27
- this.boundMessageHandler = this.handleMessage.bind(this)
28
-
29
- // Setup listener
30
- window.addEventListener('message', this.boundMessageHandler)
31
-
32
- console.log(`๐ŸŒ‰ Communication bridge initialized for origin: ${this.origin}`)
33
- }
34
-
35
- /**
36
- * Handle incoming messages
37
- */
38
- private handleMessage(event: MessageEvent): void {
39
- // Security: verify origin
40
- if (this.origin !== '*' && event.origin !== this.origin) {
41
- console.warn(`โš ๏ธ Rejected message from unauthorized origin: ${event.origin}`)
42
- return
43
- }
44
-
45
- const { type, message, data, isMobile } = event.data as EditorMessage
46
-
47
- if (!type) {
48
- // Not a valid editor message
49
- return
50
- }
51
-
52
- console.log(`๐Ÿ“จ Received message: ${type}`, { message, data, isMobile })
53
-
54
- // Call registered handlers for this message type
55
- const typeHandlers = this.handlers.get(type as MessageType)
56
- if (typeHandlers) {
57
- typeHandlers.forEach((handler) => {
58
- try {
59
- handler({ type: type as MessageType, message, data, isMobile })
60
- } catch (error) {
61
- console.error(`Error in handler for ${type}:`, error)
62
- }
63
- })
64
- }
65
-
66
- // Call global handlers
67
- const globalHandlers = this.handlers.get('*' as MessageType)
68
- if (globalHandlers) {
69
- globalHandlers.forEach((handler) => {
70
- try {
71
- handler({ type: type as MessageType, message, data, isMobile })
72
- } catch (error) {
73
- console.error('Error in global handler:', error)
74
- }
75
- })
76
- }
77
- }
78
-
79
- /**
80
- * Register a handler for a specific message type
81
- */
82
- on(type: MessageType | '*', handler: MessageHandler): () => void {
83
- if (!this.handlers.has(type as MessageType)) {
84
- this.handlers.set(type as MessageType, new Set())
85
- }
86
-
87
- this.handlers.get(type as MessageType)!.add(handler)
88
-
89
- // Return unsubscribe function
90
- return () => { this.off(type, handler) }
91
- }
92
-
93
- /**
94
- * Unregister a handler
95
- */
96
- off(type: MessageType | '*', handler: MessageHandler): void {
97
- const typeHandlers = this.handlers.get(type as MessageType)
98
- if (typeHandlers) {
99
- typeHandlers.delete(handler)
100
- }
101
- }
102
-
103
- /**
104
- * Send a message to the target window (editor)
105
- */
106
- send(type: MessageType, message?: any, data?: any): void {
107
- const payload: EditorMessage = { type, message, data }
108
- this.targetWindow.postMessage(payload, this.origin === '*' ? '*' : this.origin)
109
- console.log(`๐Ÿ“ค Sent message: ${type}`, payload)
110
- }
111
-
112
- /**
113
- * Cleanup
114
- */
115
- destroy(): void {
116
- window.removeEventListener('message', this.boundMessageHandler)
117
- this.handlers.clear()
118
- console.log('๐Ÿงน Communication bridge destroyed')
119
- }
120
- }
121
-
122
- /**
123
- * Create a communication bridge instance
124
- */
125
- export function createCommunicationBridge(config: CommunicationConfig): CommunicationBridge {
126
- return new CommunicationBridge(config)
127
- }
128
-
129
- /**
130
- * Simple send helper for one-off messages
131
- */
132
- export function sendMessage(
133
- type: MessageType,
134
- message?: any,
135
- targetWindow: Window = window.parent,
136
- origin: string = '*'
137
- ): void {
138
- const payload: EditorMessage = { type, message }
139
- targetWindow.postMessage(payload, origin)
140
- }
package/core/registry.ts DELETED
@@ -1,108 +0,0 @@
1
- /**
2
- * Component Registry System
3
- *
4
- * Allows external sites to register their own component implementations
5
- * that map to the block types from the editor.
6
- */
7
-
8
- import type { ComponentRegistry, ComponentConstructor } from './types'
9
-
10
- // Global registry
11
- const registry: ComponentRegistry = {}
12
-
13
- /**
14
- * Register a component for a specific block type
15
- * @param type - The block type (e.g., 'Text', 'Button', 'Hero')
16
- * @param component - The Vue component to render
17
- */
18
- export function registerComponent(type: string, component: ComponentConstructor): void {
19
- if (registry[type]) {
20
- console.warn(`Component "${type}" is already registered. Overwriting...`)
21
- }
22
- registry[type] = component
23
- console.log(`โœ… Registered component: ${type}`)
24
- }
25
-
26
- /**
27
- * Register multiple components at once
28
- * @param components - Object mapping block types to components
29
- */
30
- export function registerComponents(components: ComponentRegistry): void {
31
- Object.entries(components).forEach(([type, component]) => {
32
- registerComponent(type, component)
33
- })
34
- }
35
-
36
- /**
37
- * Get a registered component by type
38
- * @param type - The block type
39
- * @returns The component or undefined if not found
40
- */
41
- export function getComponent(type: string): ComponentConstructor | undefined {
42
- return registry[type]
43
- }
44
-
45
- /**
46
- * Check if a component type is registered
47
- * @param type - The block type
48
- * @returns True if registered
49
- */
50
- export function hasComponent(type: string): boolean {
51
- return type in registry
52
- }
53
-
54
- /**
55
- * Get all registered components
56
- * @returns The full registry
57
- */
58
- export function getAllComponents(): ComponentRegistry {
59
- return { ...registry }
60
- }
61
-
62
- /**
63
- * Unregister a component
64
- * @param type - The block type to remove
65
- */
66
- export function unregisterComponent(type: string): void {
67
- delete registry[type]
68
- console.log(`โŒ Unregistered component: ${type}`)
69
- }
70
-
71
- /**
72
- * Clear all registered components
73
- */
74
- export function clearRegistry(): void {
75
- Object.keys(registry).forEach(key => delete registry[key])
76
- console.log('๐Ÿ—‘๏ธ Registry cleared')
77
- }
78
-
79
- /**
80
- * Get a list of all registered component types
81
- * @returns Array of registered type names
82
- */
83
- export function getRegisteredTypes(): string[] {
84
- return Object.keys(registry)
85
- }
86
-
87
- /**
88
- * Create a namespaced registry for multi-tenant scenarios
89
- */
90
- export function createNamespacedRegistry(namespace: string) {
91
- const namespacedRegistry: ComponentRegistry = {}
92
-
93
- return {
94
- register: (type: string, component: ComponentConstructor) => {
95
- const key = `${namespace}:${type}`
96
- namespacedRegistry[key] = component
97
- registry[key] = component
98
- },
99
- get: (type: string) => {
100
- const key = `${namespace}:${type}`
101
- return namespacedRegistry[key]
102
- },
103
- getAll: () => ({ ...namespacedRegistry }),
104
- }
105
- }
106
-
107
- // Export the registry for debugging purposes
108
- export { registry }