@fayz-ai/plugin-admin 0.9.37 → 0.9.39
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.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -199,7 +199,7 @@ function createAdminPlugin(options) {
|
|
|
199
199
|
properties: {}
|
|
200
200
|
},
|
|
201
201
|
suggestions: [
|
|
202
|
-
{ label: "
|
|
202
|
+
{ label: "Qual layout este app est\xE1 usando?" },
|
|
203
203
|
{ label: "Is branding customization on?" }
|
|
204
204
|
],
|
|
205
205
|
permission: { feature: "admin", action: "read" }
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/mock.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/context.tsx","../src/views/AdminPage.tsx","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AdminDataProvider, AdminSettingsSnapshot } from './types'\n\n/**\n * Mock provider — returns the statically resolved shell-config snapshot\n * (from plugin options / FayzAppConfig defaults). No in-memory mutation:\n * this plugin doesn't write settings yet.\n */\nexport function createMockAdminProvider(snapshot: AdminSettingsSnapshot): AdminDataProvider {\n return {\n async getSettings() {\n return snapshot\n },\n }\n}\n","import type { AdminDataProvider, AdminSettingsSnapshot } from './types'\n\n/**\n * Supabase provider — foundation stub. There is no shell-config table yet:\n * layout/moduleNav/mobileHeader/branding are still owned by FayzAppConfig at\n * build time, not a runtime-editable record. This provider exists so the\n * plugin follows the standard createSafeDataProvider(supabase, mock) seam\n * from day one; it returns the same static snapshot the mock provider does\n * until a real read/write path is wired (see README.md).\n */\nexport function createSupabaseAdminProvider(snapshot: AdminSettingsSnapshot): AdminDataProvider {\n return {\n async getSettings() {\n return snapshot\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\n\nexport interface AdminUIState {\n settings: AdminSettingsSnapshot | null\n settingsLoading: boolean\n\n fetchSettings(): Promise<void>\n}\n\nexport function createAdminStore(provider: AdminDataProvider): StoreApi<AdminUIState> {\n return createStore<AdminUIState>((set) => ({\n settings: null,\n settingsLoading: false,\n\n async fetchSettings() {\n return dedup('admin:settings', async () => {\n set({ settingsLoading: true })\n try {\n const settings = await provider.getSettings()\n set({ settings, settingsLoading: false })\n } catch {\n set({ settingsLoading: false })\n }\n })\n },\n }))\n}\n","export const en: Record<string, string> = {\n 'admin.layout.title': 'Layout',\n 'admin.layout.sidebar': 'Sidebar',\n 'admin.layout.topbar': 'Topbar',\n 'admin.layout.minimal': 'Minimal',\n 'admin.moduleNav.title': 'Module navigation',\n 'admin.moduleNav.rail': 'Side rail for the installed modules',\n 'admin.moduleNav.tabs': 'Tabs for the installed modules',\n 'admin.mobileHeader.title': 'Mobile header',\n 'admin.mobileHeader.minimal': 'Minimal header bar',\n 'admin.mobileHeader.transparent': 'Transparent, edge-to-edge content',\n 'admin.mobileHeader.hidden': 'Hidden',\n 'admin.branding.title': 'Branding',\n 'admin.branding.on': 'Org branding settings are visible to operators',\n 'admin.branding.off': 'Org branding settings are hidden',\n 'admin.readOnlyNotice': 'Read-only preview. Editing these settings here is coming soon — for now they are set in your app config.',\n}\n","export const ptBR: Record<string, string> = {\n 'admin.layout.title': 'Layout',\n 'admin.layout.sidebar': 'Barra lateral',\n 'admin.layout.topbar': 'Barra superior',\n 'admin.layout.minimal': 'Minimalista',\n 'admin.moduleNav.title': 'Navegação dos módulos',\n 'admin.moduleNav.rail': 'Barra lateral para os módulos instalados',\n 'admin.moduleNav.tabs': 'Abas para os módulos instalados',\n 'admin.mobileHeader.title': 'Cabeçalho mobile',\n 'admin.mobileHeader.minimal': 'Cabeçalho minimalista',\n 'admin.mobileHeader.transparent': 'Transparente, conteúdo de ponta a ponta',\n 'admin.mobileHeader.hidden': 'Oculto',\n 'admin.branding.title': 'Identidade visual',\n 'admin.branding.on': 'As configurações de marca estão visíveis para operadores',\n 'admin.branding.off': 'As configurações de marca estão ocultas',\n 'admin.readOnlyNotice': 'Pré-visualização somente leitura. A edição por aqui chega em breve — por enquanto essas opções são definidas na configuração do app.',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const adminLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import { createPluginContext } from '@fayz-ai/admin'\nimport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\nimport type { AdminUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AdminPluginLabels {\n pageTitle: string\n pageSubtitle: string\n}\n\n/** Resolved shell config + labels, handed to AdminPage. Mirrors AdminSettingsSnapshot. */\nexport interface ResolvedAdminConfig extends AdminSettingsSnapshot {\n labels: AdminPluginLabels\n}\n\nconst ctx = createPluginContext<ResolvedAdminConfig, AdminDataProvider, AdminUIState>('AdminPage')\n\nexport const AdminContextProvider = ctx.ContextProvider\nexport const useAdminConfig = ctx.useConfig\nexport const useAdminProvider = ctx.useProvider\nexport const useAdminStore = ctx.useStore\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { LayoutTemplate, PanelTop, Settings2, Smartphone, Palette } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ModulePage } from '@fayz-ai/ui'\nimport { AdminContextProvider, type ResolvedAdminConfig } from '../context'\nimport type { AdminDataProvider } from '../data/types'\nimport type { AdminUIState } from '../store'\n\nconst LAYOUT_VARIANTS = ['sidebar', 'topbar', 'minimal'] as const\n\nfunction SettingCard({ icon: Icon, title, children }: {\n icon: typeof LayoutTemplate\n title: string\n children: React.ReactNode\n}) {\n return (\n <div className=\"rounded-xl border border-border bg-background/60 p-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"h-8 w-8 rounded-lg bg-foreground/[0.04] flex items-center justify-center shrink-0\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"text-sm font-medium\">{title}</div>\n </div>\n {children}\n </div>\n )\n}\n\n/**\n * Read-only foundation view. Renders the shell config this app already\n * resolved (layout, module nav, mobile header, branding) so an operator can\n * see it at a glance — it does not yet let them change it. See README.md for\n * the write-path this is scaffolding toward.\n */\nexport function AdminPage({ config, provider, store }: {\n config: ResolvedAdminConfig\n provider: AdminDataProvider\n store: StoreApi<AdminUIState>\n}) {\n const t = useTranslation()\n\n return (\n <AdminContextProvider config={config} provider={provider} store={store}>\n <ModulePage title={config.labels.pageTitle} subtitle={config.labels.pageSubtitle} nav={[]}>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <SettingCard icon={config.layout === 'topbar' ? PanelTop : LayoutTemplate} title={t('admin.layout.title')}>\n <div className=\"flex flex-wrap gap-2 text-sm\">\n {LAYOUT_VARIANTS.map((variant) => (\n <span\n key={variant}\n className={\n 'rounded-md border px-2.5 py-1.5 ' +\n (config.layout === variant\n ? 'border-primary/40 bg-primary/5 text-foreground'\n : 'border-border text-muted-foreground')\n }\n >\n {t(`admin.layout.${variant}`)}\n </span>\n ))}\n </div>\n </SettingCard>\n\n <SettingCard icon={Settings2} title={t('admin.moduleNav.title')}>\n <p className=\"text-xs text-muted-foreground\">{t(`admin.moduleNav.${config.moduleNav}`)}</p>\n </SettingCard>\n\n <SettingCard icon={Smartphone} title={t('admin.mobileHeader.title')}>\n <p className=\"text-xs text-muted-foreground\">{t(`admin.mobileHeader.${config.mobileHeader}`)}</p>\n </SettingCard>\n\n <SettingCard icon={Palette} title={t('admin.branding.title')}>\n <p className=\"text-xs text-muted-foreground\">\n {config.branding ? t('admin.branding.on') : t('admin.branding.off')}\n </p>\n </SettingCard>\n </div>\n\n <p className=\"mt-6 text-xs text-muted-foreground\">{t('admin.readOnlyNotice')}</p>\n </ModulePage>\n </AdminContextProvider>\n )\n}\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport type { ResolvedAdminConfig, AdminPluginLabels } from './context'\nimport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\nimport type { AdminPluginOptions } from './types'\nimport { createMockAdminProvider } from './data/mock'\nimport { createSupabaseAdminProvider } from './data/supabase'\nimport { createAdminStore } from './store'\nimport { adminLocales } from './locales'\nimport { AdminPage } from './views/AdminPage'\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: AdminPluginLabels = {\n pageTitle: 'Admin',\n pageSubtitle: \"Your app's layout, navigation, and branding.\",\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: AdminPluginOptions): ResolvedAdminConfig {\n return {\n labels: DEFAULT_LABELS,\n layout: options?.layout ?? 'sidebar',\n moduleNav: options?.moduleNav ?? 'tabs',\n mobileHeader: options?.mobileHeader ?? 'minimal',\n navTransition: options?.navTransition ?? 'slide',\n orgSettings: options?.orgSettings ?? true,\n branding: options?.branding ?? true,\n }\n}\n\nfunction toSnapshot(config: ResolvedAdminConfig): AdminSettingsSnapshot {\n const { labels: _labels, ...snapshot } = config\n return snapshot\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAdminPlugin(options?: AdminPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Register locales globally so the plugin's translations resolve even when the\n // host shell does not mount @fayz-ai/core's I18nProvider (incremental de-bridge).\n registerTranslations(adminLocales)\n const snapshot = toSnapshot(config)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseAdminProvider(snapshot),\n () => createMockAdminProvider(snapshot),\n )\n const store = createAdminStore(provider)\n\n const PageComponent: React.FC<unknown> = () =>\n React.createElement(AdminPage, { config, provider, store })\n\n return {\n id: 'admin',\n name: config.labels.pageTitle,\n icon: 'LayoutTemplate',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n // Shell/admin-config is a Panel-side concept (layout, module nav, branding\n // for an admin app) — targets the saas/admin-template world, not the\n // ecommerce storefront. Same declaration plugin-crm uses for its\n // business-ops surface.\n scaffolds: ['saas'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'admin', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n\n navigation: [\n {\n section: 'secondary',\n position: 90,\n label: config.labels.pageTitle,\n route: '/admin',\n icon: 'LayoutTemplate',\n permission: { feature: 'admin', action: 'read' as const },\n },\n ],\n\n routes: [\n {\n path: '/admin',\n component: PageComponent as unknown as React.ComponentType<unknown>,\n permission: { feature: 'admin', action: 'read' as const },\n },\n ],\n\n widgets: [],\n\n aiTools: [\n {\n id: 'admin.get-shell-settings',\n name: 'getShellSettings',\n description: 'Returns the app shell configuration: layout variant, module nav style, mobile header treatment, and whether org/branding settings are shown.',\n icon: 'LayoutTemplate',\n mode: 'read' as const,\n category: 'Admin',\n parameters: {\n type: 'object' as const,\n properties: {},\n },\n suggestions: [\n { label: 'What layout is this app using?' },\n { label: 'Is branding customization on?' },\n ],\n permission: { feature: 'admin', action: 'read' as const },\n },\n ],\n\n settings: [],\n\n locales: adminLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\nexport type { ResolvedAdminConfig, AdminPluginLabels } from './context'\nexport type { AdminPluginOptions } from './types'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/mock.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/context.tsx","../src/views/AdminPage.tsx","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AdminDataProvider, AdminSettingsSnapshot } from './types'\n\n/**\n * Mock provider — returns the statically resolved shell-config snapshot\n * (from plugin options / FayzAppConfig defaults). No in-memory mutation:\n * this plugin doesn't write settings yet.\n */\nexport function createMockAdminProvider(snapshot: AdminSettingsSnapshot): AdminDataProvider {\n return {\n async getSettings() {\n return snapshot\n },\n }\n}\n","import type { AdminDataProvider, AdminSettingsSnapshot } from './types'\n\n/**\n * Supabase provider — foundation stub. There is no shell-config table yet:\n * layout/moduleNav/mobileHeader/branding are still owned by FayzAppConfig at\n * build time, not a runtime-editable record. This provider exists so the\n * plugin follows the standard createSafeDataProvider(supabase, mock) seam\n * from day one; it returns the same static snapshot the mock provider does\n * until a real read/write path is wired (see README.md).\n */\nexport function createSupabaseAdminProvider(snapshot: AdminSettingsSnapshot): AdminDataProvider {\n return {\n async getSettings() {\n return snapshot\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\n\nexport interface AdminUIState {\n settings: AdminSettingsSnapshot | null\n settingsLoading: boolean\n\n fetchSettings(): Promise<void>\n}\n\nexport function createAdminStore(provider: AdminDataProvider): StoreApi<AdminUIState> {\n return createStore<AdminUIState>((set) => ({\n settings: null,\n settingsLoading: false,\n\n async fetchSettings() {\n return dedup('admin:settings', async () => {\n set({ settingsLoading: true })\n try {\n const settings = await provider.getSettings()\n set({ settings, settingsLoading: false })\n } catch {\n set({ settingsLoading: false })\n }\n })\n },\n }))\n}\n","export const en: Record<string, string> = {\n 'admin.layout.title': 'Layout',\n 'admin.layout.sidebar': 'Sidebar',\n 'admin.layout.topbar': 'Topbar',\n 'admin.layout.minimal': 'Minimal',\n 'admin.moduleNav.title': 'Module navigation',\n 'admin.moduleNav.rail': 'Side rail for the installed modules',\n 'admin.moduleNav.tabs': 'Tabs for the installed modules',\n 'admin.mobileHeader.title': 'Mobile header',\n 'admin.mobileHeader.minimal': 'Minimal header bar',\n 'admin.mobileHeader.transparent': 'Transparent, edge-to-edge content',\n 'admin.mobileHeader.hidden': 'Hidden',\n 'admin.branding.title': 'Branding',\n 'admin.branding.on': 'Org branding settings are visible to operators',\n 'admin.branding.off': 'Org branding settings are hidden',\n 'admin.readOnlyNotice': 'Read-only preview. Editing these settings here is coming soon — for now they are set in your app config.',\n}\n","export const ptBR: Record<string, string> = {\n 'admin.layout.title': 'Layout',\n 'admin.layout.sidebar': 'Barra lateral',\n 'admin.layout.topbar': 'Barra superior',\n 'admin.layout.minimal': 'Minimalista',\n 'admin.moduleNav.title': 'Navegação dos módulos',\n 'admin.moduleNav.rail': 'Barra lateral para os módulos instalados',\n 'admin.moduleNav.tabs': 'Abas para os módulos instalados',\n 'admin.mobileHeader.title': 'Cabeçalho mobile',\n 'admin.mobileHeader.minimal': 'Cabeçalho minimalista',\n 'admin.mobileHeader.transparent': 'Transparente, conteúdo de ponta a ponta',\n 'admin.mobileHeader.hidden': 'Oculto',\n 'admin.branding.title': 'Identidade visual',\n 'admin.branding.on': 'As configurações de marca estão visíveis para operadores',\n 'admin.branding.off': 'As configurações de marca estão ocultas',\n 'admin.readOnlyNotice': 'Pré-visualização somente leitura. A edição por aqui chega em breve — por enquanto essas opções são definidas na configuração do app.',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const adminLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import { createPluginContext } from '@fayz-ai/admin'\nimport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\nimport type { AdminUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AdminPluginLabels {\n pageTitle: string\n pageSubtitle: string\n}\n\n/** Resolved shell config + labels, handed to AdminPage. Mirrors AdminSettingsSnapshot. */\nexport interface ResolvedAdminConfig extends AdminSettingsSnapshot {\n labels: AdminPluginLabels\n}\n\nconst ctx = createPluginContext<ResolvedAdminConfig, AdminDataProvider, AdminUIState>('AdminPage')\n\nexport const AdminContextProvider = ctx.ContextProvider\nexport const useAdminConfig = ctx.useConfig\nexport const useAdminProvider = ctx.useProvider\nexport const useAdminStore = ctx.useStore\n","import React from 'react'\nimport type { StoreApi } from 'zustand/vanilla'\nimport { LayoutTemplate, PanelTop, Settings2, Smartphone, Palette } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ModulePage } from '@fayz-ai/ui'\nimport { AdminContextProvider, type ResolvedAdminConfig } from '../context'\nimport type { AdminDataProvider } from '../data/types'\nimport type { AdminUIState } from '../store'\n\nconst LAYOUT_VARIANTS = ['sidebar', 'topbar', 'minimal'] as const\n\nfunction SettingCard({ icon: Icon, title, children }: {\n icon: typeof LayoutTemplate\n title: string\n children: React.ReactNode\n}) {\n return (\n <div className=\"rounded-xl border border-border bg-background/60 p-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <div className=\"h-8 w-8 rounded-lg bg-foreground/[0.04] flex items-center justify-center shrink-0\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"text-sm font-medium\">{title}</div>\n </div>\n {children}\n </div>\n )\n}\n\n/**\n * Read-only foundation view. Renders the shell config this app already\n * resolved (layout, module nav, mobile header, branding) so an operator can\n * see it at a glance — it does not yet let them change it. See README.md for\n * the write-path this is scaffolding toward.\n */\nexport function AdminPage({ config, provider, store }: {\n config: ResolvedAdminConfig\n provider: AdminDataProvider\n store: StoreApi<AdminUIState>\n}) {\n const t = useTranslation()\n\n return (\n <AdminContextProvider config={config} provider={provider} store={store}>\n <ModulePage title={config.labels.pageTitle} subtitle={config.labels.pageSubtitle} nav={[]}>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <SettingCard icon={config.layout === 'topbar' ? PanelTop : LayoutTemplate} title={t('admin.layout.title')}>\n <div className=\"flex flex-wrap gap-2 text-sm\">\n {LAYOUT_VARIANTS.map((variant) => (\n <span\n key={variant}\n className={\n 'rounded-md border px-2.5 py-1.5 ' +\n (config.layout === variant\n ? 'border-primary/40 bg-primary/5 text-foreground'\n : 'border-border text-muted-foreground')\n }\n >\n {t(`admin.layout.${variant}`)}\n </span>\n ))}\n </div>\n </SettingCard>\n\n <SettingCard icon={Settings2} title={t('admin.moduleNav.title')}>\n <p className=\"text-xs text-muted-foreground\">{t(`admin.moduleNav.${config.moduleNav}`)}</p>\n </SettingCard>\n\n <SettingCard icon={Smartphone} title={t('admin.mobileHeader.title')}>\n <p className=\"text-xs text-muted-foreground\">{t(`admin.mobileHeader.${config.mobileHeader}`)}</p>\n </SettingCard>\n\n <SettingCard icon={Palette} title={t('admin.branding.title')}>\n <p className=\"text-xs text-muted-foreground\">\n {config.branding ? t('admin.branding.on') : t('admin.branding.off')}\n </p>\n </SettingCard>\n </div>\n\n <p className=\"mt-6 text-xs text-muted-foreground\">{t('admin.readOnlyNotice')}</p>\n </ModulePage>\n </AdminContextProvider>\n )\n}\n","import React from 'react'\nimport type { PluginManifest } from '@fayz-ai/core'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport type { ResolvedAdminConfig, AdminPluginLabels } from './context'\nimport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\nimport type { AdminPluginOptions } from './types'\nimport { createMockAdminProvider } from './data/mock'\nimport { createSupabaseAdminProvider } from './data/supabase'\nimport { createAdminStore } from './store'\nimport { adminLocales } from './locales'\nimport { AdminPage } from './views/AdminPage'\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: AdminPluginLabels = {\n pageTitle: 'Admin',\n pageSubtitle: \"Your app's layout, navigation, and branding.\",\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: AdminPluginOptions): ResolvedAdminConfig {\n return {\n labels: DEFAULT_LABELS,\n layout: options?.layout ?? 'sidebar',\n moduleNav: options?.moduleNav ?? 'tabs',\n mobileHeader: options?.mobileHeader ?? 'minimal',\n navTransition: options?.navTransition ?? 'slide',\n orgSettings: options?.orgSettings ?? true,\n branding: options?.branding ?? true,\n }\n}\n\nfunction toSnapshot(config: ResolvedAdminConfig): AdminSettingsSnapshot {\n const { labels: _labels, ...snapshot } = config\n return snapshot\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createAdminPlugin(options?: AdminPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Register locales globally so the plugin's translations resolve even when the\n // host shell does not mount @fayz-ai/core's I18nProvider (incremental de-bridge).\n registerTranslations(adminLocales)\n const snapshot = toSnapshot(config)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseAdminProvider(snapshot),\n () => createMockAdminProvider(snapshot),\n )\n const store = createAdminStore(provider)\n\n const PageComponent: React.FC<unknown> = () =>\n React.createElement(AdminPage, { config, provider, store })\n\n return {\n id: 'admin',\n name: config.labels.pageTitle,\n icon: 'LayoutTemplate',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n // Shell/admin-config is a Panel-side concept (layout, module nav, branding\n // for an admin app) — targets the saas/admin-template world, not the\n // ecommerce storefront. Same declaration plugin-crm uses for its\n // business-ops surface.\n scaffolds: ['saas'],\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [\n { id: 'admin', label: config.labels.pageTitle, group: config.labels.pageTitle },\n ],\n\n navigation: [\n {\n section: 'secondary',\n position: 90,\n label: config.labels.pageTitle,\n route: '/admin',\n icon: 'LayoutTemplate',\n permission: { feature: 'admin', action: 'read' as const },\n },\n ],\n\n routes: [\n {\n path: '/admin',\n component: PageComponent as unknown as React.ComponentType<unknown>,\n permission: { feature: 'admin', action: 'read' as const },\n },\n ],\n\n widgets: [],\n\n aiTools: [\n {\n id: 'admin.get-shell-settings',\n name: 'getShellSettings',\n description: 'Returns the app shell configuration: layout variant, module nav style, mobile header treatment, and whether org/branding settings are shown.',\n icon: 'LayoutTemplate',\n mode: 'read' as const,\n category: 'Admin',\n parameters: {\n type: 'object' as const,\n properties: {},\n },\n suggestions: [\n { label: 'Qual layout este app está usando?' },\n { label: 'Is branding customization on?' },\n ],\n permission: { feature: 'admin', action: 'read' as const },\n },\n ],\n\n settings: [],\n\n locales: adminLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { AdminDataProvider, AdminSettingsSnapshot } from './data/types'\nexport type { ResolvedAdminConfig, AdminPluginLabels } from './context'\nexport type { AdminPluginOptions } from './types'\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fayz-ai/plugin-admin",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.39",
|
|
4
4
|
"description": "[experimental] Fayz SDK — admin shell settings plugin (read-only foundation)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"zustand": "^4.5.0 || ^5.0.0"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@fayz-ai/admin": "^0.
|
|
27
|
-
"@fayz-ai/core": "^0.
|
|
28
|
-
"@fayz-ai/ui": "^0.
|
|
26
|
+
"@fayz-ai/admin": "^0.49.0",
|
|
27
|
+
"@fayz-ai/core": "^0.49.0",
|
|
28
|
+
"@fayz-ai/ui": "^0.49.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/react": "^18.3.0",
|