@fayz-ai/core 0.1.6

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 (172) hide show
  1. package/dist/app/render.d.ts +16 -0
  2. package/dist/app/render.d.ts.map +1 -0
  3. package/dist/blocks/index.d.ts +25 -0
  4. package/dist/blocks/index.d.ts.map +1 -0
  5. package/dist/chunk-2NTHNWEH.cjs +32 -0
  6. package/dist/chunk-2NTHNWEH.cjs.map +1 -0
  7. package/dist/chunk-5EAZOMVP.js +1609 -0
  8. package/dist/chunk-5EAZOMVP.js.map +1 -0
  9. package/dist/chunk-5TKIZVVJ.cjs +16 -0
  10. package/dist/chunk-5TKIZVVJ.cjs.map +1 -0
  11. package/dist/chunk-7RTUHSKY.js +3 -0
  12. package/dist/chunk-7RTUHSKY.js.map +1 -0
  13. package/dist/chunk-AXTWKF5X.cjs +38 -0
  14. package/dist/chunk-AXTWKF5X.cjs.map +1 -0
  15. package/dist/chunk-EGWWQ7AT.cjs +355 -0
  16. package/dist/chunk-EGWWQ7AT.cjs.map +1 -0
  17. package/dist/chunk-KAYQFSR6.js +298 -0
  18. package/dist/chunk-KAYQFSR6.js.map +1 -0
  19. package/dist/chunk-LSVBDYFQ.cjs +1639 -0
  20. package/dist/chunk-LSVBDYFQ.cjs.map +1 -0
  21. package/dist/chunk-SNQW6TRF.cjs +658 -0
  22. package/dist/chunk-SNQW6TRF.cjs.map +1 -0
  23. package/dist/chunk-WKZVSKEU.js +26 -0
  24. package/dist/chunk-WKZVSKEU.js.map +1 -0
  25. package/dist/chunk-Y2C2FBQP.js +35 -0
  26. package/dist/chunk-Y2C2FBQP.js.map +1 -0
  27. package/dist/chunk-YSBXGHAM.js +643 -0
  28. package/dist/chunk-YSBXGHAM.js.map +1 -0
  29. package/dist/data/archetype.d.ts +13 -0
  30. package/dist/data/archetype.d.ts.map +1 -0
  31. package/dist/data/cached.d.ts +19 -0
  32. package/dist/data/cached.d.ts.map +1 -0
  33. package/dist/data/fayz-api.d.ts +19 -0
  34. package/dist/data/fayz-api.d.ts.map +1 -0
  35. package/dist/data/index.cjs +32 -0
  36. package/dist/data/index.cjs.map +1 -0
  37. package/dist/data/index.d.ts +9 -0
  38. package/dist/data/index.d.ts.map +1 -0
  39. package/dist/data/index.js +3 -0
  40. package/dist/data/index.js.map +1 -0
  41. package/dist/data/mock.d.ts +7 -0
  42. package/dist/data/mock.d.ts.map +1 -0
  43. package/dist/data/resolve.d.ts +22 -0
  44. package/dist/data/resolve.d.ts.map +1 -0
  45. package/dist/data/supabase.d.ts +18 -0
  46. package/dist/data/supabase.d.ts.map +1 -0
  47. package/dist/data/types.d.ts +23 -0
  48. package/dist/data/types.d.ts.map +1 -0
  49. package/dist/entity/index.cjs +28 -0
  50. package/dist/entity/index.cjs.map +1 -0
  51. package/dist/entity/index.d.ts +3 -0
  52. package/dist/entity/index.d.ts.map +1 -0
  53. package/dist/entity/index.js +3 -0
  54. package/dist/entity/index.js.map +1 -0
  55. package/dist/entity/registry.d.ts +20 -0
  56. package/dist/entity/registry.d.ts.map +1 -0
  57. package/dist/events/index.d.ts +16 -0
  58. package/dist/events/index.d.ts.map +1 -0
  59. package/dist/i18n/index.cjs +44 -0
  60. package/dist/i18n/index.cjs.map +1 -0
  61. package/dist/i18n/index.d.ts +21 -0
  62. package/dist/i18n/index.d.ts.map +1 -0
  63. package/dist/i18n/index.js +3 -0
  64. package/dist/i18n/index.js.map +1 -0
  65. package/dist/i18n/shell-translations.d.ts +2 -0
  66. package/dist/i18n/shell-translations.d.ts.map +1 -0
  67. package/dist/index.cjs +911 -0
  68. package/dist/index.cjs.map +1 -0
  69. package/dist/index.d.ts +46 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +596 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lib/cache.d.ts +21 -0
  74. package/dist/lib/cache.d.ts.map +1 -0
  75. package/dist/lib/csv.d.ts +14 -0
  76. package/dist/lib/csv.d.ts.map +1 -0
  77. package/dist/lib/format.d.ts +7 -0
  78. package/dist/lib/format.d.ts.map +1 -0
  79. package/dist/manifest/index.d.ts +80 -0
  80. package/dist/manifest/index.d.ts.map +1 -0
  81. package/dist/plugin/createSafeDataProvider.d.ts +14 -0
  82. package/dist/plugin/createSafeDataProvider.d.ts.map +1 -0
  83. package/dist/plugin/index.cjs +32 -0
  84. package/dist/plugin/index.cjs.map +1 -0
  85. package/dist/plugin/index.d.ts +2 -0
  86. package/dist/plugin/index.d.ts.map +1 -0
  87. package/dist/plugin/index.js +3 -0
  88. package/dist/plugin/index.js.map +1 -0
  89. package/dist/plugin/runtime.d.ts +31 -0
  90. package/dist/plugin/runtime.d.ts.map +1 -0
  91. package/dist/registry/index.d.ts +88 -0
  92. package/dist/registry/index.d.ts.map +1 -0
  93. package/dist/router/index.cjs +16 -0
  94. package/dist/router/index.cjs.map +1 -0
  95. package/dist/router/index.d.ts +8 -0
  96. package/dist/router/index.d.ts.map +1 -0
  97. package/dist/router/index.js +3 -0
  98. package/dist/router/index.js.map +1 -0
  99. package/dist/runtime/index.cjs +16 -0
  100. package/dist/runtime/index.cjs.map +1 -0
  101. package/dist/runtime/index.d.ts +3 -0
  102. package/dist/runtime/index.d.ts.map +1 -0
  103. package/dist/runtime/index.js +3 -0
  104. package/dist/runtime/index.js.map +1 -0
  105. package/dist/runtime/oauth.d.ts +96 -0
  106. package/dist/runtime/oauth.d.ts.map +1 -0
  107. package/dist/tenant/index.d.ts +3 -0
  108. package/dist/tenant/index.d.ts.map +1 -0
  109. package/dist/types/auth.d.ts +27 -0
  110. package/dist/types/auth.d.ts.map +1 -0
  111. package/dist/types/billing.d.ts +17 -0
  112. package/dist/types/billing.d.ts.map +1 -0
  113. package/dist/types/crud.d.ts +107 -0
  114. package/dist/types/crud.d.ts.map +1 -0
  115. package/dist/types/entities.d.ts +134 -0
  116. package/dist/types/entities.d.ts.map +1 -0
  117. package/dist/types/i18n.d.ts +8 -0
  118. package/dist/types/i18n.d.ts.map +1 -0
  119. package/dist/types/index.cjs +4 -0
  120. package/dist/types/index.cjs.map +1 -0
  121. package/dist/types/index.d.ts +10 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +3 -0
  124. package/dist/types/index.js.map +1 -0
  125. package/dist/types/org.d.ts +96 -0
  126. package/dist/types/org.d.ts.map +1 -0
  127. package/dist/types/permissions.d.ts +25 -0
  128. package/dist/types/permissions.d.ts.map +1 -0
  129. package/dist/types/plugins.d.ts +314 -0
  130. package/dist/types/plugins.d.ts.map +1 -0
  131. package/dist/types/theme.d.ts +16 -0
  132. package/dist/types/theme.d.ts.map +1 -0
  133. package/package.json +98 -0
  134. package/src/app/render.tsx +69 -0
  135. package/src/blocks/index.tsx +68 -0
  136. package/src/data/archetype.ts +210 -0
  137. package/src/data/cached.ts +55 -0
  138. package/src/data/fayz-api.ts +200 -0
  139. package/src/data/index.ts +8 -0
  140. package/src/data/mock.ts +84 -0
  141. package/src/data/resolve.ts +108 -0
  142. package/src/data/supabase.ts +169 -0
  143. package/src/data/types.ts +20 -0
  144. package/src/entity/index.ts +2 -0
  145. package/src/entity/registry.ts +42 -0
  146. package/src/events/index.tsx +82 -0
  147. package/src/i18n/index.ts +250 -0
  148. package/src/i18n/shell-translations.ts +1391 -0
  149. package/src/index.ts +132 -0
  150. package/src/lib/cache.ts +118 -0
  151. package/src/lib/csv.ts +54 -0
  152. package/src/lib/format.ts +58 -0
  153. package/src/manifest/app-manifest.schema.json +103 -0
  154. package/src/manifest/index.ts +394 -0
  155. package/src/plugin/createSafeDataProvider.ts +30 -0
  156. package/src/plugin/index.ts +1 -0
  157. package/src/plugin/runtime.ts +313 -0
  158. package/src/registry/index.ts +163 -0
  159. package/src/router/index.ts +29 -0
  160. package/src/runtime/index.ts +15 -0
  161. package/src/runtime/oauth.ts +219 -0
  162. package/src/tenant/index.ts +18 -0
  163. package/src/types/auth.ts +26 -0
  164. package/src/types/billing.ts +17 -0
  165. package/src/types/crud.ts +108 -0
  166. package/src/types/entities.ts +142 -0
  167. package/src/types/i18n.ts +7 -0
  168. package/src/types/index.ts +10 -0
  169. package/src/types/org.ts +94 -0
  170. package/src/types/permissions.ts +32 -0
  171. package/src/types/plugins.ts +363 -0
  172. package/src/types/theme.ts +17 -0
@@ -0,0 +1,363 @@
1
+ import type React from 'react'
2
+ import type { EntityDef } from './crud'
3
+ import type { FeatureDeclaration, PermissionAction } from './permissions'
4
+
5
+ export type VerticalId = 'beauty' | 'food' | 'health' | 'services' | 'retail' | 'education' | (string & {})
6
+ export type PluginScope = 'core' | 'vertical' | 'universal' | 'addon' | 'tenant'
7
+ export type PluginStatus = 'pending_setup' | 'active' | 'disabled' | 'removed'
8
+
9
+ /**
10
+ * Scaffold type this plugin targets.
11
+ * Plugins can declare which scaffolds they work with.
12
+ * If omitted, the plugin works with all scaffold types.
13
+ */
14
+ export type ScaffoldType = 'saas' | 'ecommerce' | 'landing_page' | 'website' | (string & {})
15
+
16
+ export interface PluginPermissionRequirement {
17
+ feature: string
18
+ action: PermissionAction
19
+ }
20
+
21
+ export interface PluginNavigationEntry {
22
+ id?: string
23
+ section: 'main' | 'secondary' | 'settings'
24
+ position: number
25
+ label: string
26
+ route: string
27
+ icon?: string
28
+ badge?: string | number
29
+ permission?: PluginPermissionRequirement
30
+ }
31
+
32
+ export interface PluginSettingsTab {
33
+ id: string
34
+ label: string
35
+ icon?: string
36
+ /** Provide the component directly, or reference a registered component by id
37
+ * (resolvePluginComponent resolves componentId → the component registry).
38
+ * Exactly one is required. */
39
+ component?: React.ComponentType<unknown>
40
+ componentId?: string
41
+ pluginId?: string
42
+ order?: number
43
+ permission?: PluginPermissionRequirement
44
+ }
45
+
46
+ export interface PluginRouteDefinition {
47
+ path: string
48
+ /** Component or a registered component id — exactly one is required. */
49
+ component?: React.ComponentType<unknown>
50
+ componentId?: string
51
+ guard?: 'authenticated' | 'role' | 'public' | 'share-token'
52
+ roles?: string[]
53
+ permission?: PluginPermissionRequirement
54
+ /** Render edge-to-edge with no page padding/animation wrapper (chat, kanban, canvas). */
55
+ fullBleed?: boolean
56
+ }
57
+
58
+ export type PluginWidgetZone =
59
+ | 'shell.sidebar.before-nav'
60
+ | 'shell.sidebar.footer'
61
+ | 'shell.topbar.start'
62
+ | 'shell.topbar.end'
63
+ | 'page.before'
64
+ | 'page.after'
65
+ | 'settings.before'
66
+ | 'settings.after'
67
+ | 'shell.floating'
68
+ | (string & {})
69
+
70
+ export const WidgetZone = {
71
+ SIDEBAR_BEFORE_NAV: 'shell.sidebar.before-nav',
72
+ SIDEBAR_FOOTER: 'shell.sidebar.footer',
73
+ TOPBAR_START: 'shell.topbar.start',
74
+ TOPBAR_END: 'shell.topbar.end',
75
+ PAGE_BEFORE: 'page.before',
76
+ PAGE_AFTER: 'page.after',
77
+ SETTINGS_BEFORE: 'settings.before',
78
+ SETTINGS_AFTER: 'settings.after',
79
+ FLOATING: 'shell.floating',
80
+ } as const
81
+
82
+ export interface PluginRuntimeTenant {
83
+ id?: string
84
+ slug?: string
85
+ verticalId?: string
86
+ plan?: string
87
+ }
88
+
89
+ export interface PluginRuntimeUser {
90
+ id?: string
91
+ role?: string
92
+ }
93
+
94
+ export interface PluginWidgetVisibility {
95
+ routes?: string[]
96
+ excludeRoutes?: string[]
97
+ layouts?: string[]
98
+ roles?: string[]
99
+ plans?: string[]
100
+ permissions?: PluginPermissionRequirement[]
101
+ when?: (context: PluginRuntimeContext) => boolean
102
+ }
103
+
104
+ export interface PluginRuntimeContext {
105
+ tenant: PluginRuntimeTenant | null
106
+ user: PluginRuntimeUser | null
107
+ currentPath: string
108
+ matchedPath?: string
109
+ layout: string
110
+ hasPermission?: (req: PluginPermissionRequirement) => boolean
111
+ }
112
+
113
+ export interface PluginWidgetDefinition<TConfig extends Record<string, unknown> = Record<string, unknown>> {
114
+ id: string
115
+ zone: PluginWidgetZone
116
+ /** Component or a registered component id — exactly one is required. */
117
+ component?: React.ComponentType<unknown>
118
+ componentId?: string
119
+ title?: string
120
+ order?: number
121
+ permission?: PluginPermissionRequirement
122
+ visibility?: PluginWidgetVisibility
123
+ props?: TConfig
124
+ }
125
+
126
+ // ---------------------------------------------------------------------------
127
+ // Dashboard widgets — first-class units a plugin contributes to the dashboard
128
+ // registry. Rendered both on the plugin's own home and on the global app home.
129
+ // ---------------------------------------------------------------------------
130
+
131
+ export type DashboardWidgetKind = 'kpi' | 'chart' | 'table' | 'onboarding' | 'custom'
132
+
133
+ /** Surfaces a widget can appear on. 'home' = global app home; 'plugin-home' =
134
+ * the owning plugin's own overview page. */
135
+ export type DashboardSurface = 'home' | 'plugin-home'
136
+
137
+ export interface DashboardWidgetDef<TProps extends Record<string, unknown> = Record<string, unknown>> {
138
+ /** Globally unique id, e.g. 'crm.kpi.total-leads'. */
139
+ id: string
140
+ /** i18n key or plain label. */
141
+ title: string
142
+ description?: string
143
+ icon?: string
144
+ /** Owning domain used to scope plugin-home vs global home. Defaults to plugin.id. */
145
+ domain?: string
146
+ kind: DashboardWidgetKind
147
+ /** Column span on the 4-col grid. Defaults by kind (kpi→1, chart→2, table→4). */
148
+ span?: 1 | 2 | 3 | 4
149
+ /** Visible before any app/user customization. Default: true. */
150
+ defaultVisible?: boolean
151
+ /** Default order within the surface (lower = first). */
152
+ defaultOrder?: number
153
+ /** Surfaces this widget appears on. Default: both. */
154
+ surfaces?: DashboardSurface[]
155
+ verticalId?: VerticalId
156
+ permission?: PluginPermissionRequirement
157
+ /** Component or a registered component id — exactly one is required. */
158
+ component?: React.ComponentType<unknown>
159
+ componentId?: string
160
+ props?: TProps
161
+ }
162
+
163
+ /** App- or user-level overrides applied on top of the registered defaults. */
164
+ export interface DashboardLayoutConfig {
165
+ widgets?: Array<{ id: string; visible?: boolean; order?: number; span?: number }>
166
+ }
167
+
168
+ export interface ResolvedDashboardWidget extends DashboardWidgetDef {
169
+ /** Resolved owning domain (plugin.id when not explicitly set). */
170
+ domain: string
171
+ order: number
172
+ plugin: ResolvedPluginManifest
173
+ }
174
+
175
+ /** An event a plugin emits onto the event bus — declared for platform
176
+ * introspection and so the AppManifest can bind event→action as data. */
177
+ export interface PluginEventDefinition {
178
+ /** Namespaced event name, e.g. 'agenda.booking.confirmed'. */
179
+ name: string
180
+ description?: string
181
+ /** JSON Schema for the payload (editor / AI / validation). */
182
+ payloadSchema?: Record<string, unknown>
183
+ }
184
+
185
+ export interface PluginCapability {
186
+ id: string
187
+ label: string
188
+ description?: string
189
+ kind?: 'page' | 'widget' | 'data' | 'integration'
190
+ }
191
+
192
+ export interface PluginQuickAction {
193
+ id: string
194
+ label: string
195
+ icon?: string
196
+ description?: string
197
+ /** Action handler — typically navigates to a view. */
198
+ action: () => void
199
+ }
200
+
201
+ export type AIToolMode = 'read' | 'persist'
202
+
203
+ export interface AIToolParameterProperty {
204
+ type: 'string' | 'number' | 'boolean' | 'array' | 'object'
205
+ description?: string
206
+ enum?: string[]
207
+ items?: AIToolParameterProperty
208
+ default?: unknown
209
+ }
210
+
211
+ export interface AIToolParameters {
212
+ type: 'object'
213
+ properties: Record<string, AIToolParameterProperty>
214
+ required?: string[]
215
+ }
216
+
217
+ export interface AIToolSuggestion {
218
+ label: string
219
+ prompt?: string
220
+ icon?: string
221
+ verticalId?: VerticalId
222
+ }
223
+
224
+ export interface PluginAITool {
225
+ id: string
226
+ name: string
227
+ description: string
228
+ icon?: string
229
+ mode: AIToolMode
230
+ parameters?: AIToolParameters
231
+ permission?: PluginPermissionRequirement
232
+ suggestions?: AIToolSuggestion[]
233
+ category?: string
234
+ tags?: string[]
235
+ }
236
+
237
+ export interface PluginRegistryDef {
238
+ id: string
239
+ entity: EntityDef
240
+ icon?: string
241
+ description?: string
242
+ display?: 'table' | 'cards' | 'tree'
243
+ seedData?: Record<string, unknown>[]
244
+ mockData?: Record<string, unknown>[]
245
+ readOnly?: boolean
246
+ }
247
+
248
+ export interface PluginMigration {
249
+ id: string
250
+ version: string
251
+ sql: string
252
+ description?: string
253
+ }
254
+
255
+ export interface PluginOnboarding {
256
+ /** Component or a registered component id — exactly one is required. */
257
+ component?: React.ComponentType<{ onComplete: () => void }>
258
+ componentId?: string
259
+ title?: string
260
+ description?: string
261
+ }
262
+
263
+ export interface PluginManifest {
264
+ id: string
265
+ name: string
266
+ icon: string
267
+ version: string
268
+ /** Plugin contract version. The runtime refuses plugins built for a newer
269
+ * contract than it supports (see PLUGIN_API_VERSION). Omit = legacy/compatible. */
270
+ apiVersion?: number
271
+ description?: string
272
+ scope?: PluginScope
273
+ verticalId?: VerticalId
274
+ /** Events this plugin emits onto the bus (declared for introspection/automation). */
275
+ events?: PluginEventDefinition[]
276
+ /** Which scaffold types this plugin targets. Omit for universal plugins. */
277
+ scaffolds?: ScaffoldType[]
278
+ tenantId?: string
279
+ defaultEnabled?: boolean
280
+ schema?: string
281
+ dependencies?: string[]
282
+ navigation: PluginNavigationEntry[]
283
+ settings?: PluginSettingsTab[]
284
+ routes: PluginRouteDefinition[]
285
+ widgets?: PluginWidgetDefinition[]
286
+ /** Dashboard widgets this plugin contributes to the dashboard registry. */
287
+ dashboardWidgets?: DashboardWidgetDef[]
288
+ capabilities?: PluginCapability[]
289
+ aiTools?: PluginAITool[]
290
+ entities?: string[]
291
+ permissions?: string[]
292
+ declaredFeatures?: FeatureDeclaration[]
293
+ registries?: PluginRegistryDef[]
294
+ migrations?: PluginMigration[]
295
+ onboarding?: PluginOnboarding
296
+ locales?: Record<string, Record<string, string>>
297
+ /** Marketplace metadata for npm discovery */
298
+ marketplace?: {
299
+ category: string
300
+ tags: string[]
301
+ author: string
302
+ license: string
303
+ repository?: string
304
+ }
305
+ }
306
+
307
+ export interface TenantPluginBinding {
308
+ pluginId: string
309
+ status: PluginStatus
310
+ tenantId?: string
311
+ config?: Record<string, unknown>
312
+ }
313
+
314
+ export interface PluginRuntimeIssue {
315
+ type:
316
+ | 'duplicate_plugin'
317
+ | 'missing_dependency'
318
+ | 'circular_dependency'
319
+ | 'vertical_mismatch'
320
+ | 'incompatible_api_version'
321
+ pluginId: string
322
+ dependencyId?: string
323
+ message: string
324
+ }
325
+
326
+ export interface ResolvedPluginManifest extends PluginManifest {
327
+ status: PluginStatus
328
+ isActive: boolean
329
+ activationReason: 'default' | 'tenant' | 'dependency' | 'inactive'
330
+ config: Record<string, unknown>
331
+ missingDependencies: string[]
332
+ settingsTabs: PluginSettingsTab[]
333
+ widgets: PluginWidgetDefinition[]
334
+ resolvedRegistries: PluginRegistryDef[]
335
+ resolvedAITools: PluginAITool[]
336
+ }
337
+
338
+ export interface ResolvedPluginWidget<TConfig extends Record<string, unknown> = Record<string, unknown>>
339
+ extends PluginWidgetDefinition<TConfig> {
340
+ order: number
341
+ config: TConfig
342
+ plugin: ResolvedPluginManifest
343
+ }
344
+
345
+ export interface PluginRuntimeRoute extends PluginRouteDefinition {
346
+ plugin: ResolvedPluginManifest
347
+ }
348
+
349
+ export interface PluginRuntime {
350
+ context: PluginRuntimeContext
351
+ plugins: ResolvedPluginManifest[]
352
+ activePlugins: ResolvedPluginManifest[]
353
+ routes: PluginRuntimeRoute[]
354
+ navigation: PluginNavigationEntry[]
355
+ settingsTabs: PluginSettingsTab[]
356
+ widgets: ResolvedPluginWidget[]
357
+ dashboardWidgets: ResolvedDashboardWidget[]
358
+ capabilities: PluginCapability[]
359
+ aiTools: PluginAITool[]
360
+ issues: PluginRuntimeIssue[]
361
+ registries: Map<string, PluginRegistryDef[]>
362
+ pluginFeatures: FeatureDeclaration[]
363
+ }
@@ -0,0 +1,17 @@
1
+ export type ThemeBrand = 'blue' | 'violet' | 'green' | 'orange' | 'red' | 'pink' | 'teal' | (string & {})
2
+ export type ThemeRadius = 'none' | 'sm' | 'md' | 'lg' | 'full'
3
+ export type ThemeMode = 'light' | 'dark' | 'system'
4
+
5
+ export interface SaasTheme {
6
+ brand?: ThemeBrand
7
+ radius?: ThemeRadius
8
+ /** Custom primary color as HSL string, e.g. '220 70% 50%' */
9
+ primaryHsl?: string
10
+ /** Custom secondary color as HSL string */
11
+ secondaryHsl?: string
12
+ }
13
+
14
+ export interface ThemeConfig {
15
+ theme?: SaasTheme
16
+ defaultMode?: ThemeMode
17
+ }