@cedros/login-react 0.0.15 → 0.0.17

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 (126) hide show
  1. package/dist/{AuthenticationSettings-Dg6ATgOl.js → AuthenticationSettings-BipaLyGg.js} +19 -19
  2. package/dist/{AuthenticationSettings-Dg6ATgOl.js.map → AuthenticationSettings-BipaLyGg.js.map} +1 -1
  3. package/dist/{AuthenticationSettings-CjGGqbcS.cjs → AuthenticationSettings-Cb80XWPm.cjs} +1 -1
  4. package/dist/{AuthenticationSettings-CjGGqbcS.cjs.map → AuthenticationSettings-Cb80XWPm.cjs.map} +1 -1
  5. package/dist/{AuthenticationSettings-DGWktSVw.js → AuthenticationSettings-Cfn0No6U.js} +1 -1
  6. package/dist/{AuthenticationSettings-DGWktSVw.js.map → AuthenticationSettings-Cfn0No6U.js.map} +1 -1
  7. package/dist/{AuthenticationSettings-HhrUAmM6.cjs → AuthenticationSettings-Cu0S0Z7s.cjs} +1 -1
  8. package/dist/{AuthenticationSettings-HhrUAmM6.cjs.map → AuthenticationSettings-Cu0S0Z7s.cjs.map} +1 -1
  9. package/dist/{AutosaveStatus-DeViUyyI.js → AutosaveStatus-BKc7T2Tw.js} +323 -242
  10. package/dist/AutosaveStatus-BKc7T2Tw.js.map +1 -0
  11. package/dist/AutosaveStatus-BjLMt52a.cjs +1 -0
  12. package/dist/AutosaveStatus-BjLMt52a.cjs.map +1 -0
  13. package/dist/{CreditSystemSettings-DBr7QS59.js → CreditSystemSettings-CvcacgMM.js} +1 -1
  14. package/dist/{CreditSystemSettings-DBr7QS59.js.map → CreditSystemSettings-CvcacgMM.js.map} +1 -1
  15. package/dist/{CreditSystemSettings-CSlsQynZ.js → CreditSystemSettings-D13lZbIw.js} +1 -1
  16. package/dist/{CreditSystemSettings-CSlsQynZ.js.map → CreditSystemSettings-D13lZbIw.js.map} +1 -1
  17. package/dist/{CreditSystemSettings-CyFQbXMh.cjs → CreditSystemSettings-DO-dUcxN.cjs} +1 -1
  18. package/dist/{CreditSystemSettings-CyFQbXMh.cjs.map → CreditSystemSettings-DO-dUcxN.cjs.map} +1 -1
  19. package/dist/{CreditSystemSettings-BykhytcS.cjs → CreditSystemSettings-DV0VkPIe.cjs} +1 -1
  20. package/dist/{CreditSystemSettings-BykhytcS.cjs.map → CreditSystemSettings-DV0VkPIe.cjs.map} +1 -1
  21. package/dist/{EmailRegisterForm-Pvm3I8GP.cjs → EmailRegisterForm-CdTuvJmf.cjs} +1 -1
  22. package/dist/{EmailRegisterForm-Pvm3I8GP.cjs.map → EmailRegisterForm-CdTuvJmf.cjs.map} +1 -1
  23. package/dist/{EmailRegisterForm-nI0BOIxR.js → EmailRegisterForm-CxOdldks.js} +1 -1
  24. package/dist/{EmailRegisterForm-nI0BOIxR.js.map → EmailRegisterForm-CxOdldks.js.map} +1 -1
  25. package/dist/{EmailSettings-Bup2rCgU.cjs → EmailSettings-BkR7vlWL.cjs} +1 -1
  26. package/dist/{EmailSettings-Bup2rCgU.cjs.map → EmailSettings-BkR7vlWL.cjs.map} +1 -1
  27. package/dist/EmailSettings-CLMdw3rB.js +78 -0
  28. package/dist/EmailSettings-CLMdw3rB.js.map +1 -0
  29. package/dist/EmailSettings-Dq3mfUr2.cjs +1 -0
  30. package/dist/EmailSettings-Dq3mfUr2.cjs.map +1 -0
  31. package/dist/{EmailSettings-C04qdJCz.js → EmailSettings-ulEHtH2y.js} +1 -1
  32. package/dist/{EmailSettings-C04qdJCz.js.map → EmailSettings-ulEHtH2y.js.map} +1 -1
  33. package/dist/{EmbeddedWalletSettings-DYh884HP.js → EmbeddedWalletSettings-BTTV8Nqi.js} +46 -31
  34. package/dist/EmbeddedWalletSettings-BTTV8Nqi.js.map +1 -0
  35. package/dist/EmbeddedWalletSettings-C7H0E8Uz.cjs +1 -0
  36. package/dist/EmbeddedWalletSettings-C7H0E8Uz.cjs.map +1 -0
  37. package/dist/{EmbeddedWalletSettings-DDFQhQOw.js → EmbeddedWalletSettings-CLWh2TbV.js} +1 -1
  38. package/dist/{EmbeddedWalletSettings-DDFQhQOw.js.map → EmbeddedWalletSettings-CLWh2TbV.js.map} +1 -1
  39. package/dist/{EmbeddedWalletSettings-YX0Dk_b_.cjs → EmbeddedWalletSettings-DGmCVyex.cjs} +1 -1
  40. package/dist/{EmbeddedWalletSettings-YX0Dk_b_.cjs.map → EmbeddedWalletSettings-DGmCVyex.cjs.map} +1 -1
  41. package/dist/PermissionsSection-BPbE-hNx.cjs.map +1 -1
  42. package/dist/PermissionsSection-CighC1p6.js.map +1 -1
  43. package/dist/{ServerSettings-CInJe4jY.cjs → ServerSettings-CPAoiDtn.cjs} +1 -1
  44. package/dist/{ServerSettings-CInJe4jY.cjs.map → ServerSettings-CPAoiDtn.cjs.map} +1 -1
  45. package/dist/ServerSettings-Ch8MCmAY.js +91 -0
  46. package/dist/ServerSettings-Ch8MCmAY.js.map +1 -0
  47. package/dist/ServerSettings-CqDd59iM.cjs +1 -0
  48. package/dist/ServerSettings-CqDd59iM.cjs.map +1 -0
  49. package/dist/{ServerSettings-DVEtfDQo.js → ServerSettings-DooVeOet.js} +1 -1
  50. package/dist/{ServerSettings-DVEtfDQo.js.map → ServerSettings-DooVeOet.js.map} +1 -1
  51. package/dist/{WebhookSettings-DdbxNPZ9.js → WebhookSettings-B6mjH90_.js} +1 -1
  52. package/dist/{WebhookSettings-DdbxNPZ9.js.map → WebhookSettings-B6mjH90_.js.map} +1 -1
  53. package/dist/WebhookSettings-BG77iqJC.js +63 -0
  54. package/dist/WebhookSettings-BG77iqJC.js.map +1 -0
  55. package/dist/{WebhookSettings-BMeykdRP.cjs → WebhookSettings-BeiUAcKs.cjs} +1 -1
  56. package/dist/{WebhookSettings-BMeykdRP.cjs.map → WebhookSettings-BeiUAcKs.cjs.map} +1 -1
  57. package/dist/WebhookSettings-WMJ5zPjY.cjs +1 -0
  58. package/dist/WebhookSettings-WMJ5zPjY.cjs.map +1 -0
  59. package/dist/admin-only.cjs +1 -1
  60. package/dist/admin-only.d.ts +109 -14
  61. package/dist/admin-only.js +4 -3
  62. package/dist/email-only.cjs +1 -1
  63. package/dist/email-only.d.ts +56 -6
  64. package/dist/email-only.js +2 -2
  65. package/dist/google-only.cjs +1 -1
  66. package/dist/google-only.d.ts +56 -6
  67. package/dist/google-only.js +1 -1
  68. package/dist/index.cjs +13 -13
  69. package/dist/index.cjs.map +1 -1
  70. package/dist/index.d.ts +330 -34
  71. package/dist/index.js +2505 -3553
  72. package/dist/index.js.map +1 -1
  73. package/dist/login-react.css +1 -1
  74. package/dist/mobileWalletAdapter-Dp4yFxCm.cjs +1 -0
  75. package/dist/mobileWalletAdapter-Dp4yFxCm.cjs.map +1 -0
  76. package/dist/mobileWalletAdapter-coZRD4Yx.js +291 -0
  77. package/dist/mobileWalletAdapter-coZRD4Yx.js.map +1 -0
  78. package/dist/{plugin-CnbFRy5o.cjs → plugin-BgMAc6DA.cjs} +1 -1
  79. package/dist/{plugin-CnbFRy5o.cjs.map → plugin-BgMAc6DA.cjs.map} +1 -1
  80. package/dist/{plugin-CW_ycXye.js → plugin-Bhf9zaly.js} +82 -70
  81. package/dist/{plugin-CW_ycXye.js.map → plugin-Bhf9zaly.js.map} +1 -1
  82. package/dist/{shamir-4DyQMJCk.cjs → shamir-CiBczzDN.cjs} +1 -1
  83. package/dist/{shamir-4DyQMJCk.cjs.map → shamir-CiBczzDN.cjs.map} +1 -1
  84. package/dist/{shamir-L-s-Tp1Z.js → shamir-OAB2zD9Y.js} +1 -1
  85. package/dist/{shamir-L-s-Tp1Z.js.map → shamir-OAB2zD9Y.js.map} +1 -1
  86. package/dist/{silentWalletEnroll-DWt6Pr3B.js → silentWalletEnroll-FqXS7Rvh.js} +2 -2
  87. package/dist/{silentWalletEnroll-DWt6Pr3B.js.map → silentWalletEnroll-FqXS7Rvh.js.map} +1 -1
  88. package/dist/{silentWalletEnroll-BgTb4H5I.cjs → silentWalletEnroll-wnkcB9HP.cjs} +1 -1
  89. package/dist/{silentWalletEnroll-BgTb4H5I.cjs.map → silentWalletEnroll-wnkcB9HP.cjs.map} +1 -1
  90. package/dist/solana-only.cjs +1 -1
  91. package/dist/solana-only.d.ts +112 -6
  92. package/dist/solana-only.js +6 -5
  93. package/dist/useAuth-X6Ds6WW4.cjs +1 -0
  94. package/dist/useAuth-X6Ds6WW4.cjs.map +1 -0
  95. package/dist/{useAuth-C3dpk0po.js → useAuth-m5Hf89v8.js} +805 -749
  96. package/dist/useAuth-m5Hf89v8.js.map +1 -0
  97. package/package.json +4 -1
  98. package/dist/AutosaveStatus-BDWxAg4U.cjs +0 -1
  99. package/dist/AutosaveStatus-BDWxAg4U.cjs.map +0 -1
  100. package/dist/AutosaveStatus-DeViUyyI.js.map +0 -1
  101. package/dist/EmailSettings-C0Ss6Cne.cjs +0 -1
  102. package/dist/EmailSettings-C0Ss6Cne.cjs.map +0 -1
  103. package/dist/EmailSettings-DAqH_xum.js +0 -17
  104. package/dist/EmailSettings-DAqH_xum.js.map +0 -1
  105. package/dist/EmbeddedWalletSettings-B0XkNuPR.cjs +0 -1
  106. package/dist/EmbeddedWalletSettings-B0XkNuPR.cjs.map +0 -1
  107. package/dist/EmbeddedWalletSettings-DYh884HP.js.map +0 -1
  108. package/dist/ServerSettings-CwnEI-PC.cjs +0 -1
  109. package/dist/ServerSettings-CwnEI-PC.cjs.map +0 -1
  110. package/dist/ServerSettings-DakhpYcO.js +0 -84
  111. package/dist/ServerSettings-DakhpYcO.js.map +0 -1
  112. package/dist/SettingsPageLayout-C6DWgyXS.cjs +0 -1
  113. package/dist/SettingsPageLayout-C6DWgyXS.cjs.map +0 -1
  114. package/dist/SettingsPageLayout-CLJI6hFQ.js +0 -50
  115. package/dist/SettingsPageLayout-CLJI6hFQ.js.map +0 -1
  116. package/dist/SolanaLoginButton-BjOxpE1C.cjs +0 -1
  117. package/dist/SolanaLoginButton-BjOxpE1C.cjs.map +0 -1
  118. package/dist/SolanaLoginButton-P22QjBaO.js +0 -262
  119. package/dist/SolanaLoginButton-P22QjBaO.js.map +0 -1
  120. package/dist/WebhookSettings-BNVooF0B.cjs +0 -1
  121. package/dist/WebhookSettings-BNVooF0B.cjs.map +0 -1
  122. package/dist/WebhookSettings-DXeDYhAe.js +0 -17
  123. package/dist/WebhookSettings-DXeDYhAe.js.map +0 -1
  124. package/dist/useAuth-C3dpk0po.js.map +0 -1
  125. package/dist/useAuth-D3Pk_H3z.cjs +0 -1
  126. package/dist/useAuth-D3Pk_H3z.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerSettings-Ch8MCmAY.js","sources":["../src/components/admin/settings/ServerSettings.tsx"],"sourcesContent":["/**\n * Server settings page - infrastructure configuration with tabs\n *\n * Tab visibility:\n * - Integrations: only shown when `feature_cedros_pay` is enabled.\n * This tab contains the Cedros Pay API Key, which is only needed when\n * cedros-pay runs as a separate microservice. In co-located deployments\n * (e.g., cedros-login and cedros-pay in the same Rust binary), inter-service\n * auth uses JWT/JWKS and no API key is needed.\n * - Logging, Metrics, Security: always visible.\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype ServerTab = 'integrations' | 'logging' | 'metrics' | 'security';\n\ninterface TabConfig {\n id: ServerTab;\n label: string;\n /** Categories to pull settings from (defaults to ['server']) */\n categories?: string[];\n keys: string[];\n /** When set, tab is only visible if this setting is 'true' */\n requiredSetting?: string;\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'integrations',\n label: 'Integrations',\n keys: ['server_cedros_pay_api_key'],\n requiredSetting: 'feature_cedros_pay',\n },\n {\n id: 'logging',\n label: 'Logging',\n keys: ['server_log_level'],\n },\n {\n id: 'metrics',\n label: 'Metrics',\n keys: ['server_metrics_api_key'],\n },\n {\n id: 'security',\n label: 'Security',\n categories: ['security', 'features'],\n keys: ['feature_mfa', 'security_cors_origins', 'security_session_timeout'],\n },\n];\n\nexport interface ServerSettingsProps {\n className?: string;\n}\n\nexport function ServerSettings({ className }: ServerSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n // Filter tabs based on feature flags\n const visibleTabs = useMemo(\n () =>\n TABS.filter((tab) => {\n if (!tab.requiredSetting) return true;\n return getEffectiveValue(tab.requiredSetting) === 'true';\n }),\n [getEffectiveValue]\n );\n\n // Default to first visible tab\n const [activeTab, setActiveTab] = useState<ServerTab | null>(null);\n\n // Set initial tab when tabs become available\n useEffect(() => {\n if (activeTab === null && visibleTabs.length > 0) {\n setActiveTab(visibleTabs[0].id);\n } else if (activeTab && !visibleTabs.some((t) => t.id === activeTab)) {\n // Active tab was hidden (feature toggled off) — fall back\n setActiveTab(visibleTabs[0]?.id ?? null);\n }\n }, [visibleTabs, activeTab]);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = visibleTabs.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n const categories = currentTab.categories ?? ['server'];\n const allSettings: (typeof settings)[string] = [];\n for (const category of categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n // Filter by keys and sort by keys order\n return allSettings\n .filter((s) => currentTab.keys.includes(s.key))\n .sort((a, b) => currentTab.keys.indexOf(a.key) - currentTab.keys.indexOf(b.key));\n }, [settings, currentTab]);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Auth Server</h2>\n <p className=\"cedros-settings-page-description\">\n Server infrastructure settings. Some may be overridden by environment variables.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {visibleTabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["TABS","ServerSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","visibleTabs","useMemo","tab","activeTab","setActiveTab","useState","useEffect","t","currentTab","currentSettings","categories","allSettings","category","categorySettings","s","a","b","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime"),a=require("react"),p=require("./LoadingSpinner-d6sSxgQN.cjs"),_=require("./ErrorMessage-CHbYbVi2.cjs"),g=require("./AutosaveStatus-BjLMt52a.cjs"),k=[{id:"integrations",label:"Integrations",keys:["server_cedros_pay_api_key"],requiredSetting:"feature_cedros_pay"},{id:"logging",label:"Logging",keys:["server_log_level"]},{id:"metrics",label:"Metrics",keys:["server_metrics_api_key"]},{id:"security",label:"Security",categories:["security","features"],keys:["feature_mfa","security_cors_origins","security_session_timeout"]}];function N({className:c}){const{settings:o,edits:h,isLoading:S,autosaveStatus:x,autosaveError:b,error:u,fetchSettings:m,handleChange:j,getEffectiveValue:y}=g.useSettingsAutosave(),t=a.useMemo(()=>k.filter(s=>s.requiredSetting?y(s.requiredSetting)==="true":!0),[y]),[r,d]=a.useState(null);a.useEffect(()=>{r===null&&t.length>0?d(t[0].id):r&&!t.some(s=>s.id===r)&&d(t[0]?.id??null)},[t,r]),a.useEffect(()=>{m()},[m]);const i=t.find(s=>s.id===r),v=a.useMemo(()=>{if(!i)return[];const s=i.categories??["server"],f=[];for(const n of s){const l=o[n]??[];f.push(...l)}return f.filter(n=>i.keys.includes(n.key)).sort((n,l)=>i.keys.indexOf(n.key)-i.keys.indexOf(l.key))},[o,i]);return S&&Object.keys(o).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${c??""}`,children:[e.jsx(p.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):u?e.jsx("div",{className:`cedros-system-settings ${c??""}`,children:e.jsx(_.ErrorMessage,{error:u.message})}):e.jsxs("div",{className:`cedros-system-settings ${c??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Auth Server"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Server infrastructure settings. Some may be overridden by environment variables."})]}),e.jsx(g.AutosaveStatus,{status:x,error:b})]}),e.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:t.map(s=>e.jsx("button",{type:"button",className:`cedros-admin-tab ${r===s.id?"cedros-admin-tab-active":""}`,onClick:()=>d(s.id),"aria-selected":r===s.id,role:"tab",children:s.label},s.id))}),e.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:v.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsxs("p",{children:["No settings found for ",i?.label??"this section","."]})}):e.jsx(g.SettingsSection,{settings:v,edits:h,onChange:j})})]})}exports.ServerSettings=N;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerSettings-CqDd59iM.cjs","sources":["../src/components/admin/settings/ServerSettings.tsx"],"sourcesContent":["/**\n * Server settings page - infrastructure configuration with tabs\n *\n * Tab visibility:\n * - Integrations: only shown when `feature_cedros_pay` is enabled.\n * This tab contains the Cedros Pay API Key, which is only needed when\n * cedros-pay runs as a separate microservice. In co-located deployments\n * (e.g., cedros-login and cedros-pay in the same Rust binary), inter-service\n * auth uses JWT/JWKS and no API key is needed.\n * - Logging, Metrics, Security: always visible.\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype ServerTab = 'integrations' | 'logging' | 'metrics' | 'security';\n\ninterface TabConfig {\n id: ServerTab;\n label: string;\n /** Categories to pull settings from (defaults to ['server']) */\n categories?: string[];\n keys: string[];\n /** When set, tab is only visible if this setting is 'true' */\n requiredSetting?: string;\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'integrations',\n label: 'Integrations',\n keys: ['server_cedros_pay_api_key'],\n requiredSetting: 'feature_cedros_pay',\n },\n {\n id: 'logging',\n label: 'Logging',\n keys: ['server_log_level'],\n },\n {\n id: 'metrics',\n label: 'Metrics',\n keys: ['server_metrics_api_key'],\n },\n {\n id: 'security',\n label: 'Security',\n categories: ['security', 'features'],\n keys: ['feature_mfa', 'security_cors_origins', 'security_session_timeout'],\n },\n];\n\nexport interface ServerSettingsProps {\n className?: string;\n}\n\nexport function ServerSettings({ className }: ServerSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n // Filter tabs based on feature flags\n const visibleTabs = useMemo(\n () =>\n TABS.filter((tab) => {\n if (!tab.requiredSetting) return true;\n return getEffectiveValue(tab.requiredSetting) === 'true';\n }),\n [getEffectiveValue]\n );\n\n // Default to first visible tab\n const [activeTab, setActiveTab] = useState<ServerTab | null>(null);\n\n // Set initial tab when tabs become available\n useEffect(() => {\n if (activeTab === null && visibleTabs.length > 0) {\n setActiveTab(visibleTabs[0].id);\n } else if (activeTab && !visibleTabs.some((t) => t.id === activeTab)) {\n // Active tab was hidden (feature toggled off) — fall back\n setActiveTab(visibleTabs[0]?.id ?? null);\n }\n }, [visibleTabs, activeTab]);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = visibleTabs.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n const categories = currentTab.categories ?? ['server'];\n const allSettings: (typeof settings)[string] = [];\n for (const category of categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n // Filter by keys and sort by keys order\n return allSettings\n .filter((s) => currentTab.keys.includes(s.key))\n .sort((a, b) => currentTab.keys.indexOf(a.key) - currentTab.keys.indexOf(b.key));\n }, [settings, currentTab]);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Auth Server</h2>\n <p className=\"cedros-settings-page-description\">\n Server infrastructure settings. Some may be overridden by environment variables.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {visibleTabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["TABS","ServerSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","visibleTabs","useMemo","tab","activeTab","setActiveTab","useState","useEffect","t","currentTab","currentSettings","categories","allSettings","category","categorySettings","s","a","b","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as r } from "react/jsx-runtime";
2
2
  import "react";
3
- import { S as e } from "./ServerSettings-DakhpYcO.js";
3
+ import { S as e } from "./ServerSettings-Ch8MCmAY.js";
4
4
  function i() {
5
5
  return /* @__PURE__ */ r("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ r(e, {}) });
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ServerSettings-DVEtfDQo.js","sources":["../src/admin/sections/ServerSettings.tsx"],"sourcesContent":["/**\n * Server Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { ServerSettings as Settings } from '../../components/admin/settings';\n\nexport default function ServerSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["ServerSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAoC;AAC1D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
1
+ {"version":3,"file":"ServerSettings-DooVeOet.js","sources":["../src/admin/sections/ServerSettings.tsx"],"sourcesContent":["/**\n * Server Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { ServerSettings as Settings } from '../../components/admin/settings';\n\nexport default function ServerSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["ServerSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAoC;AAC1D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as o } from "react/jsx-runtime";
2
2
  import "react";
3
- import { W as t } from "./WebhookSettings-DXeDYhAe.js";
3
+ import { W as t } from "./WebhookSettings-BG77iqJC.js";
4
4
  function i() {
5
5
  return /* @__PURE__ */ o("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ o(t, {}) });
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebhookSettings-DdbxNPZ9.js","sources":["../src/admin/sections/WebhookSettings.tsx"],"sourcesContent":["/**\n * Webhook Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { WebhookSettings as Settings } from '../../components/admin/settings';\n\nexport default function WebhookSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["WebhookSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAqC;AAC3D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
1
+ {"version":3,"file":"WebhookSettings-B6mjH90_.js","sources":["../src/admin/sections/WebhookSettings.tsx"],"sourcesContent":["/**\n * Webhook Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { WebhookSettings as Settings } from '../../components/admin/settings';\n\nexport default function WebhookSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["WebhookSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAqC;AAC3D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
@@ -0,0 +1,63 @@
1
+ import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
+ import { useEffect as p } from "react";
3
+ import { L as v } from "./LoadingSpinner-6vml-zwr.js";
4
+ import { E as S } from "./ErrorMessage-CcEK0pYO.js";
5
+ import { u as y, A as N, S as E } from "./AutosaveStatus-BKc7T2Tw.js";
6
+ function b({
7
+ title: i,
8
+ description: d,
9
+ categories: g,
10
+ className: n = ""
11
+ }) {
12
+ const {
13
+ settings: r,
14
+ edits: h,
15
+ isLoading: l,
16
+ autosaveStatus: m,
17
+ autosaveError: u,
18
+ error: o,
19
+ fetchSettings: a,
20
+ handleChange: f
21
+ } = y();
22
+ p(() => {
23
+ a();
24
+ }, [a]);
25
+ const c = g.filter((s) => r[s]?.length > 0);
26
+ return l && Object.keys(r).length === 0 ? /* @__PURE__ */ t("div", { className: `cedros-system-settings cedros-system-settings-loading ${n}`, children: [
27
+ /* @__PURE__ */ e(v, {}),
28
+ /* @__PURE__ */ e("span", { children: "Loading settings..." })
29
+ ] }) : o ? /* @__PURE__ */ e("div", { className: `cedros-system-settings ${n}`, children: /* @__PURE__ */ e(S, { error: o.message }) }) : /* @__PURE__ */ t("div", { className: `cedros-system-settings ${n}`, children: [
30
+ /* @__PURE__ */ t("div", { className: "cedros-settings-page-header", children: [
31
+ /* @__PURE__ */ t("div", { className: "cedros-settings-page-header-content", children: [
32
+ /* @__PURE__ */ e("h2", { className: "cedros-settings-page-title", children: i }),
33
+ /* @__PURE__ */ e("p", { className: "cedros-settings-page-description", children: d })
34
+ ] }),
35
+ /* @__PURE__ */ e(N, { status: m, error: u })
36
+ ] }),
37
+ c.length === 0 ? /* @__PURE__ */ e("div", { className: "cedros-system-settings-empty", children: /* @__PURE__ */ e("p", { children: "No settings found for this section." }) }) : c.map((s) => /* @__PURE__ */ e(
38
+ E,
39
+ {
40
+ settings: r[s],
41
+ edits: h,
42
+ onChange: f
43
+ },
44
+ s
45
+ ))
46
+ ] });
47
+ }
48
+ const k = ["webhook"];
49
+ function T({ className: i }) {
50
+ return /* @__PURE__ */ e(
51
+ b,
52
+ {
53
+ title: "Webhooks",
54
+ description: "Configure HTTP webhook notifications for authentication events.",
55
+ categories: k,
56
+ className: i
57
+ }
58
+ );
59
+ }
60
+ export {
61
+ b as S,
62
+ T as W
63
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookSettings-BG77iqJC.js","sources":["../src/components/admin/settings/SettingsPageLayout.tsx","../src/components/admin/settings/WebhookSettings.tsx"],"sourcesContent":["/**\n * Shared layout for settings pages with autosave\n */\nimport { useEffect } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\nexport interface SettingsPageLayoutProps {\n /** Page title */\n title: string;\n /** Page description */\n description: string;\n /** Categories to display on this page */\n categories: string[];\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Shared layout component for settings pages.\n * Handles loading and displaying settings for specified categories.\n * Changes are automatically saved after a brief debounce.\n */\nexport function SettingsPageLayout({\n title,\n description,\n categories,\n className = '',\n}: SettingsPageLayoutProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Filter settings to only show relevant categories\n const relevantCategories = categories.filter((cat) => settings[cat]?.length > 0);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">{title}</h2>\n <p className=\"cedros-settings-page-description\">{description}</p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {relevantCategories.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n relevantCategories.map((category) => (\n <SettingsSection\n key={category}\n settings={settings[category]}\n edits={edits}\n onChange={handleChange}\n />\n ))\n )}\n </div>\n );\n}\n","/**\n * Webhook settings page - HTTP webhook configuration\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['webhook'];\n\nexport interface WebhookSettingsProps {\n className?: string;\n}\n\nexport function WebhookSettings({ className }: WebhookSettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Webhooks\"\n description=\"Configure HTTP webhook notifications for authentication events.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n"],"names":["SettingsPageLayout","title","description","categories","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","useSettingsAutosave","useEffect","relevantCategories","cat","jsxs","jsx","LoadingSpinner","ErrorMessage","AutosaveStatus","category","SettingsSection","CATEGORIES","WebhookSettings"],"mappings":";;;;;AA0BO,SAASA,EAAmB;AAAA,EACjC,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAA4B;AAC1B,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,IACEC,EAAA;AAEJ,EAAAC,EAAU,MAAM;AACd,IAAAH,EAAA;AAAA,EACF,GAAG,CAACA,CAAa,CAAC;AAGlB,QAAMI,IAAqBZ,EAAW,OAAO,CAACa,MAAQX,EAASW,CAAG,GAAG,SAAS,CAAC;AAE/E,SAAIT,KAAa,OAAO,KAAKF,CAAQ,EAAE,WAAW,IAE9C,gBAAAY,EAAC,OAAA,EAAI,WAAW,yDAAyDb,CAAS,IAChF,UAAA;AAAA,IAAA,gBAAAc,EAACC,GAAA,EAAe;AAAA,IAChB,gBAAAD,EAAC,UAAK,UAAA,sBAAA,CAAmB;AAAA,EAAA,GAC3B,IAIAR,IAEA,gBAAAQ,EAAC,OAAA,EAAI,WAAW,0BAA0Bd,CAAS,IACjD,UAAA,gBAAAc,EAACE,GAAA,EAAa,OAAOV,EAAM,QAAA,CAAS,GACtC,IAKF,gBAAAO,EAAC,OAAA,EAAI,WAAW,0BAA0Bb,CAAS,IACjD,UAAA;AAAA,IAAA,gBAAAa,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,8BAA8B,UAAAjB,GAAM;AAAA,QAClD,gBAAAiB,EAAC,KAAA,EAAE,WAAU,oCAAoC,UAAAhB,EAAA,CAAY;AAAA,MAAA,GAC/D;AAAA,MACA,gBAAAgB,EAACG,GAAA,EAAe,QAAQb,GAAgB,OAAOC,EAAA,CAAe;AAAA,IAAA,GAChE;AAAA,IAECM,EAAmB,WAAW,IAC7B,gBAAAG,EAAC,SAAI,WAAU,gCACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,iDAAmC,EAAA,CACxC,IAEAH,EAAmB,IAAI,CAACO,MACtB,gBAAAJ;AAAA,MAACK;AAAA,MAAA;AAAA,QAEC,UAAUlB,EAASiB,CAAQ;AAAA,QAC3B,OAAAhB;AAAA,QACA,UAAUM;AAAA,MAAA;AAAA,MAHLU;AAAA,IAAA,CAKR;AAAA,EAAA,GAEL;AAEJ;ACxFA,MAAME,IAAa,CAAC,SAAS;AAMtB,SAASC,EAAgB,EAAE,WAAArB,KAAmC;AACnE,SACE,gBAAAc;AAAA,IAAClB;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,aAAY;AAAA,MACZ,YAAYwB;AAAA,MACZ,WAAApB;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./WebhookSettings-BNVooF0B.cjs");function o(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.WebhookSettings,{})})}exports.default=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./WebhookSettings-WMJ5zPjY.cjs");function o(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.WebhookSettings,{})})}exports.default=o;
@@ -1 +1 @@
1
- {"version":3,"file":"WebhookSettings-BMeykdRP.cjs","sources":["../src/admin/sections/WebhookSettings.tsx"],"sourcesContent":["/**\n * Webhook Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { WebhookSettings as Settings } from '../../components/admin/settings';\n\nexport default function WebhookSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["WebhookSettings","jsx","Settings"],"mappings":"wLAOA,SAAwBA,GAAqC,CAC3D,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,kBAAS,EACZ,CAEJ"}
1
+ {"version":3,"file":"WebhookSettings-BeiUAcKs.cjs","sources":["../src/admin/sections/WebhookSettings.tsx"],"sourcesContent":["/**\n * Webhook Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { WebhookSettings as Settings } from '../../components/admin/settings';\n\nexport default function WebhookSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["WebhookSettings","jsx","Settings"],"mappings":"wLAOA,SAAwBA,GAAqC,CAC3D,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,kBAAS,EACZ,CAEJ"}
@@ -0,0 +1 @@
1
+ "use strict";const e=require("react/jsx-runtime"),S=require("react"),f=require("./LoadingSpinner-d6sSxgQN.cjs"),p=require("./ErrorMessage-CHbYbVi2.cjs"),r=require("./AutosaveStatus-BjLMt52a.cjs");function g({title:t,description:d,categories:u,className:n=""}){const{settings:i,edits:h,isLoading:l,autosaveStatus:j,autosaveError:x,error:o,fetchSettings:a,handleChange:m}=r.useSettingsAutosave();S.useEffect(()=>{a()},[a]);const c=u.filter(s=>i[s]?.length>0);return l&&Object.keys(i).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n}`,children:[e.jsx(f.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):o?e.jsx("div",{className:`cedros-system-settings ${n}`,children:e.jsx(p.ErrorMessage,{error:o.message})}):e.jsxs("div",{className:`cedros-system-settings ${n}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:t}),e.jsx("p",{className:"cedros-settings-page-description",children:d})]}),e.jsx(r.AutosaveStatus,{status:j,error:x})]}),c.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsx("p",{children:"No settings found for this section."})}):c.map(s=>e.jsx(r.SettingsSection,{settings:i[s],edits:h,onChange:m},s))]})}const v=["webhook"];function y({className:t}){return e.jsx(g,{title:"Webhooks",description:"Configure HTTP webhook notifications for authentication events.",categories:v,className:t})}exports.SettingsPageLayout=g;exports.WebhookSettings=y;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookSettings-WMJ5zPjY.cjs","sources":["../src/components/admin/settings/SettingsPageLayout.tsx","../src/components/admin/settings/WebhookSettings.tsx"],"sourcesContent":["/**\n * Shared layout for settings pages with autosave\n */\nimport { useEffect } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\nexport interface SettingsPageLayoutProps {\n /** Page title */\n title: string;\n /** Page description */\n description: string;\n /** Categories to display on this page */\n categories: string[];\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Shared layout component for settings pages.\n * Handles loading and displaying settings for specified categories.\n * Changes are automatically saved after a brief debounce.\n */\nexport function SettingsPageLayout({\n title,\n description,\n categories,\n className = '',\n}: SettingsPageLayoutProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Filter settings to only show relevant categories\n const relevantCategories = categories.filter((cat) => settings[cat]?.length > 0);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">{title}</h2>\n <p className=\"cedros-settings-page-description\">{description}</p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {relevantCategories.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n relevantCategories.map((category) => (\n <SettingsSection\n key={category}\n settings={settings[category]}\n edits={edits}\n onChange={handleChange}\n />\n ))\n )}\n </div>\n );\n}\n","/**\n * Webhook settings page - HTTP webhook configuration\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['webhook'];\n\nexport interface WebhookSettingsProps {\n className?: string;\n}\n\nexport function WebhookSettings({ className }: WebhookSettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Webhooks\"\n description=\"Configure HTTP webhook notifications for authentication events.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n"],"names":["SettingsPageLayout","title","description","categories","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","useSettingsAutosave","useEffect","relevantCategories","cat","jsxs","jsx","LoadingSpinner","ErrorMessage","AutosaveStatus","category","SettingsSection","CATEGORIES","WebhookSettings"],"mappings":"oMA0BO,SAASA,EAAmB,CACjC,MAAAC,EACA,YAAAC,EACA,WAAAC,EACA,UAAAC,EAAY,EACd,EAA4B,CAC1B,KAAM,CACJ,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,EACA,cAAAC,EACA,aAAAC,CAAA,EACEC,sBAAA,EAEJC,EAAAA,UAAU,IAAM,CACdH,EAAA,CACF,EAAG,CAACA,CAAa,CAAC,EAGlB,MAAMI,EAAqBZ,EAAW,OAAQa,GAAQX,EAASW,CAAG,GAAG,OAAS,CAAC,EAE/E,OAAIT,GAAa,OAAO,KAAKF,CAAQ,EAAE,SAAW,EAE9CY,EAAAA,KAAC,MAAA,CAAI,UAAW,yDAAyDb,CAAS,GAChF,SAAA,CAAAc,EAAAA,IAACC,EAAAA,eAAA,EAAe,EAChBD,EAAAA,IAAC,QAAK,SAAA,qBAAA,CAAmB,CAAA,EAC3B,EAIAR,EAEAQ,EAAAA,IAAC,MAAA,CAAI,UAAW,0BAA0Bd,CAAS,GACjD,SAAAc,EAAAA,IAACE,EAAAA,aAAA,CAAa,MAAOV,EAAM,OAAA,CAAS,EACtC,EAKFO,EAAAA,KAAC,MAAA,CAAI,UAAW,0BAA0Bb,CAAS,GACjD,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,6BAA8B,SAAAjB,EAAM,EAClDiB,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAoC,SAAAhB,CAAA,CAAY,CAAA,EAC/D,EACAgB,EAAAA,IAACG,EAAAA,eAAA,CAAe,OAAQb,EAAgB,MAAOC,CAAA,CAAe,CAAA,EAChE,EAECM,EAAmB,SAAW,EAC7BG,EAAAA,IAAC,OAAI,UAAU,+BACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,+CAAmC,CAAA,CACxC,EAEAH,EAAmB,IAAKO,GACtBJ,EAAAA,IAACK,EAAAA,gBAAA,CAEC,SAAUlB,EAASiB,CAAQ,EAC3B,MAAAhB,EACA,SAAUM,CAAA,EAHLU,CAAA,CAKR,CAAA,EAEL,CAEJ,CCxFA,MAAME,EAAa,CAAC,SAAS,EAMtB,SAASC,EAAgB,CAAE,UAAArB,GAAmC,CACnE,OACEc,EAAAA,IAAClB,EAAA,CACC,MAAM,WACN,YAAY,kEACZ,WAAYwB,EACZ,UAAApB,CAAA,CAAA,CAGN"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./plugin-CnbFRy5o.cjs");exports.AdminShell=e.AdminShell;exports.Icons=e.Icons;exports.cedrosLoginPlugin=e.cedrosLoginPlugin;exports.loginPlugin=e.cedrosLoginPlugin;exports.useAdminShell=e.useAdminShell;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./plugin-BgMAc6DA.cjs");exports.AdminShell=e.AdminShell;exports.CEDROS_LOGIN_SECTION_IDS=e.CEDROS_LOGIN_SECTION_IDS;exports.Icons=e.Icons;exports.cedrosLoginPlugin=e.cedrosLoginPlugin;exports.loginPlugin=e.cedrosLoginPlugin;exports.useAdminShell=e.useAdminShell;
@@ -4,13 +4,22 @@ import { ReactNode } from 'react';
4
4
 
5
5
  /**
6
6
  * Group configuration for sidebar organization.
7
+ *
8
+ * **Ordering rules:**
9
+ * - Groups are keyed by `label` (not `id`) when merging across plugins.
10
+ * - The first plugin to declare a given label wins the `order` number.
11
+ * - Later plugins adding sections with `group: 'Same Label'` merge into
12
+ * the existing group without overriding the order.
13
+ * - Groups without an explicit config default to `order: 99` (sink to bottom).
14
+ * - cedros-login declares `Users` at order 0 and `Configuration` at order 2,
15
+ * leaving order 1 available for other plugins to insert between them.
7
16
  */
8
17
  export declare interface AdminGroupConfig {
9
18
  /** Group identifier */
10
19
  id: string;
11
- /** Display label */
20
+ /** Display label — used as the merge key across plugins */
12
21
  label: string;
13
- /** Sort order (lower = higher in sidebar) */
22
+ /** Sort order (lower = higher in sidebar). First plugin to declare a label wins. */
14
23
  order: number;
15
24
  /** Icon for the group header */
16
25
  icon?: ReactNode;
@@ -19,7 +28,23 @@ export declare interface AdminGroupConfig {
19
28
  }
20
29
 
21
30
  /**
22
- * Plugin definition - the main export from each admin module.
31
+ * Plugin definition the main export from each admin module.
32
+ *
33
+ * **Plugin merge order:** Plugins are iterated in registration order (insertion
34
+ * order of the registry `Map`). Sections from later plugins are appended after
35
+ * sections from earlier plugins. There is no cross-plugin section dedup — each
36
+ * plugin's section IDs are namespaced via `qualifiedId` (`pluginId:sectionId`).
37
+ *
38
+ * **Section visibility:** Each section passes two filters:
39
+ * 1. `checkPermission(section.requiredPermission, hostContext)` — role-based.
40
+ * 2. `hostContext.dashboardPermissions?.canAccess(section.id)` — owner RBAC.
41
+ *
42
+ * Register at the composition root:
43
+ * ```tsx
44
+ * <AdminShell plugins={[cedrosLoginPlugin, cedrosPayPlugin]} hostContext={ctx}>
45
+ * {children}
46
+ * </AdminShell>
47
+ * ```
23
48
  */
24
49
  export declare interface AdminPlugin {
25
50
  /** Unique plugin identifier */
@@ -52,6 +77,10 @@ export declare interface AdminPlugin {
52
77
 
53
78
  /**
54
79
  * Section configuration for sidebar navigation.
80
+ *
81
+ * **Ordering:** Sections within a group are sorted by `order` (ascending).
82
+ * Sections with the same order are shown in plugin registration order.
83
+ * Sections without a `group` fall into the implicit `'Menu'` group.
55
84
  */
56
85
  export declare interface AdminSectionConfig {
57
86
  /** Section ID unique within the plugin */
@@ -60,9 +89,9 @@ export declare interface AdminSectionConfig {
60
89
  label: string;
61
90
  /** React node for the icon (SVG or component) */
62
91
  icon: ReactNode;
63
- /** Sidebar group name for visual organization */
92
+ /** Sidebar group name must match an {@link AdminGroupConfig.label} to merge into that group */
64
93
  group?: string;
65
- /** Sort order within group (lower = higher) */
94
+ /** Sort order within group (lower = higher). Default: 0 */
66
95
  order?: number;
67
96
  /** Permission required to see this section */
68
97
  requiredPermission?: PluginPermission;
@@ -119,47 +148,113 @@ export declare interface AdminShellProps {
119
148
  className?: string;
120
149
  }
121
150
 
151
+ /**
152
+ * All section IDs registered by the cedros-login plugin.
153
+ *
154
+ * Use these to reference specific sections when configuring
155
+ * `dashboardPermissions.canAccess()` or navigating programmatically.
156
+ *
157
+ * Qualified IDs (for multi-plugin use) are prefixed: `cedros-login:{id}`.
158
+ */
159
+ export declare const CEDROS_LOGIN_SECTION_IDS: {
160
+ readonly users: "users";
161
+ readonly team: "team";
162
+ readonly deposits: "deposits";
163
+ readonly withdrawals: "withdrawals";
164
+ readonly settingsAuth: "settings-auth";
165
+ readonly settingsEmail: "settings-email";
166
+ readonly settingsWebhooks: "settings-webhooks";
167
+ readonly settingsWallet: "settings-wallet";
168
+ readonly settingsCredits: "settings-credits";
169
+ readonly settingsServer: "settings-server";
170
+ };
171
+
122
172
  declare const cedrosLoginPlugin: AdminPlugin;
123
173
  export { cedrosLoginPlugin }
124
174
  export { cedrosLoginPlugin as loginPlugin }
125
175
 
126
176
  /**
127
- * Host context provided by AdminShell to plugins.
128
- * Aggregates auth/context from all available sources.
177
+ * Host context provided by the application to `<AdminShell>`.
178
+ *
179
+ * Each field is optional — omit fields your app doesn't use.
180
+ * Plugins read the fields they need and degrade gracefully when absent.
181
+ *
182
+ * **Which plugin reads what:**
183
+ * - `cedros-login` plugin: requires `cedrosLogin` (throws if missing).
184
+ * Uses `user`, `getAccessToken`, `serverUrl` for all API calls.
185
+ * Reads `org` for role-based section filtering.
186
+ * - `cedros-pay` plugin: requires `cedrosPay`. Uses `walletAddress`,
187
+ * `jwtToken`, `serverUrl`.
188
+ * - Both plugins: respect `dashboardPermissions` for section-level RBAC.
189
+ *
190
+ * **Missing field behavior:**
191
+ * - `cedrosLogin` missing → cedros-login plugin throws at `createPluginContext()`.
192
+ * - `cedrosPay` missing → cedros-pay plugin throws at `createPluginContext()`.
193
+ * - `org` missing → all authenticated users are treated as global admins
194
+ * (all permission checks pass).
195
+ * - `dashboardPermissions` missing → all sections visible (no owner-level filtering).
196
+ * - `custom` → pass-through bag, not read by built-in plugins.
129
197
  */
130
198
  export declare interface HostContext {
131
- /** cedros-login context */
199
+ /**
200
+ * Cedros Login auth context.
201
+ *
202
+ * **Required by:** `cedros-login` plugin.
203
+ * **Missing behavior:** plugin throws `'cedros-login plugin requires cedrosLogin in hostContext'`.
204
+ */
132
205
  cedrosLogin?: {
206
+ /** Authenticated user, or null if not signed in */
133
207
  user: {
134
208
  id: string;
135
209
  email?: string;
136
210
  name?: string;
137
211
  picture?: string;
138
212
  } | null;
213
+ /** Returns current JWT access token, or null */
139
214
  getAccessToken: () => string | null;
215
+ /** Base URL of the cedros-login server (e.g., `https://api.example.com`) */
140
216
  serverUrl: string;
141
217
  };
142
- /** cedros-pay context */
218
+ /**
219
+ * Cedros Pay context.
220
+ *
221
+ * **Required by:** `cedros-pay` plugin.
222
+ * **Missing behavior:** pay plugin throws at context creation.
223
+ */
143
224
  cedrosPay?: {
225
+ /** Connected wallet public key */
144
226
  walletAddress?: string;
227
+ /** JWT for cedros-pay API */
145
228
  jwtToken?: string;
229
+ /** Base URL of the cedros-pay server */
146
230
  serverUrl: string;
147
231
  };
148
- /** Organization context */
232
+ /**
233
+ * Organization context for multi-tenant role-based access.
234
+ *
235
+ * **Missing behavior:** all permission checks pass (global admin assumed).
236
+ */
149
237
  org?: {
238
+ /** Current organization ID */
150
239
  orgId: string;
240
+ /** User's role in this org (e.g., 'owner', 'admin', 'member') */
151
241
  role: string;
242
+ /** Granular permission strings (e.g., 'member:read', 'invite:create') */
152
243
  permissions: string[];
153
244
  };
154
245
  /**
155
- * Dashboard section permissions (configured by org owner).
156
- * Provides role-based access control for individual dashboard sections.
246
+ * Owner-configured section-level access control.
247
+ *
248
+ * Applied *after* plugin permission checks — a section must pass both
249
+ * `plugin.checkPermission()` and `canAccess()` to be visible.
250
+ *
251
+ * **Missing behavior:** all sections visible (no owner-level filtering).
157
252
  */
158
253
  dashboardPermissions?: {
159
- /** Check if current user can access a section by ID */
254
+ /** Check if current user can access a section by its `SectionId` */
160
255
  canAccess: (sectionId: string) => boolean;
161
256
  };
162
- /** Generic extension point */
257
+ /** Generic extension point for custom plugins. Not read by built-in plugins. */
163
258
  custom?: Record<string, unknown>;
164
259
  }
165
260
 
@@ -1,8 +1,9 @@
1
- import { A as n, I as i, c as o, c as a, u as e } from "./plugin-CW_ycXye.js";
1
+ import { A as n, C as a, I as i, c as o, c as e, u as I } from "./plugin-Bhf9zaly.js";
2
2
  export {
3
3
  n as AdminShell,
4
+ a as CEDROS_LOGIN_SECTION_IDS,
4
5
  i as Icons,
5
6
  o as cedrosLoginPlugin,
6
- a as loginPlugin,
7
- e as useAdminShell
7
+ e as loginPlugin,
8
+ I as useAdminShell
8
9
  };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useAuth-D3Pk_H3z.cjs"),o=require("./useCedrosLogin-C9MrcZvh.cjs"),e=require("./EmailRegisterForm-Pvm3I8GP.cjs"),i=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs"),n=require("./validation-BuGQrA-K.cjs");exports.CedrosLoginProvider=r.CedrosLoginProvider;exports.useAuth=r.useAuth;exports.useCedrosLogin=o.useCedrosLogin;exports.EmailLoginForm=e.EmailLoginForm;exports.EmailRegisterForm=e.EmailRegisterForm;exports.PasswordInput=e.PasswordInput;exports.useEmailAuth=e.useEmailAuth;exports.LoadingSpinner=i.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;exports.validatePassword=n.validatePassword;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useAuth-X6Ds6WW4.cjs"),o=require("./useCedrosLogin-C9MrcZvh.cjs"),e=require("./EmailRegisterForm-CdTuvJmf.cjs"),i=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs"),n=require("./validation-BuGQrA-K.cjs");exports.CedrosLoginProvider=r.CedrosLoginProvider;exports.useAuth=r.useAuth;exports.useCedrosLogin=o.useCedrosLogin;exports.EmailLoginForm=e.EmailLoginForm;exports.EmailRegisterForm=e.EmailRegisterForm;exports.PasswordInput=e.PasswordInput;exports.useEmailAuth=e.useEmailAuth;exports.LoadingSpinner=i.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;exports.validatePassword=n.validatePassword;
@@ -99,16 +99,44 @@ export declare interface AuthUser {
99
99
  }
100
100
 
101
101
  /**
102
- * Full configuration for CedrosLoginProvider
102
+ * Full configuration for the authentication system.
103
+ *
104
+ * **Note:** When passing config to `<CedrosLoginProvider>`, use
105
+ * {@link CedrosLoginProviderConfig} instead — it extends this type
106
+ * with `features: 'auto'` support. This base type is used internally
107
+ * after the provider resolves auto-discovery.
108
+ *
109
+ * ```
110
+ * CedrosLoginProviderConfig (public prop type — accepts features: 'auto')
111
+ * └── CedrosLoginConfig (internal type — features is always FeatureFlags)
112
+ * ```
103
113
  */
104
114
  export declare interface CedrosLoginConfig {
105
115
  /** Auth server base URL */
106
116
  serverUrl: string;
107
117
  /** App name for Solana message: "Login to {appName}". Default: window.location.hostname */
108
118
  appName?: string;
109
- /** Google OAuth client ID. Required if Google auth enabled */
119
+ /**
120
+ * Google OAuth client ID. Required if Google auth enabled.
121
+ *
122
+ * **CSP requirements** (when using Google One Tap / credential popup):
123
+ * ```
124
+ * script-src https://accounts.google.com;
125
+ * connect-src https://accounts.google.com;
126
+ * frame-src https://accounts.google.com;
127
+ * ```
128
+ */
110
129
  googleClientId?: string;
111
- /** Apple Sign In client ID (Services ID). Required if Apple auth enabled */
130
+ /**
131
+ * Apple Sign In client ID (Services ID). Required if Apple auth enabled.
132
+ *
133
+ * **CSP requirements** (when using Apple Sign In popup):
134
+ * ```
135
+ * script-src https://appleid.cdn-apple.com;
136
+ * connect-src https://appleid.apple.com;
137
+ * frame-src https://appleid.apple.com;
138
+ * ```
139
+ */
112
140
  appleClientId?: string;
113
141
  /** Solana configuration options */
114
142
  solana?: SolanaConfig;
@@ -161,9 +189,31 @@ declare interface CedrosLoginInternalAPI {
161
189
  export declare function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps): JSX.Element | null;
162
190
 
163
191
  /**
164
- * Config accepted by CedrosLoginProvider.
165
- * Same as CedrosLoginConfig but `features` also accepts `'auto'`
166
- * to fetch enabled methods from the server at startup.
192
+ * Config prop type for `<CedrosLoginProvider>`.
193
+ *
194
+ * Extends {@link CedrosLoginConfig} with one additional feature:
195
+ * the `features` field also accepts `'auto'` to fetch enabled
196
+ * auth methods from the server at startup.
197
+ *
198
+ * **`features: 'auto'` discovery contract:**
199
+ * - Calls `GET {serverUrl}/features` (no auth required, credentials omitted).
200
+ * - Response shape: `{ email, google, apple, solana, webauthn, instantLink }` (all booleans).
201
+ * - Timeout: `requestTimeout` or 5 000 ms. 1 retry on failure.
202
+ * - Fallback: all methods enabled (so the login page is never blank).
203
+ * - Children are not rendered until discovery completes.
204
+ * - `walletEnrollment` flag is client-only and is not part of the server response.
205
+ *
206
+ * When `features` is omitted or set to a `FeatureFlags` object, no server
207
+ * call is made and the flags are used as-is.
208
+ *
209
+ * @example
210
+ * ```tsx
211
+ * // Auto-discover enabled methods from the server:
212
+ * <CedrosLoginProvider config={{ serverUrl: '...', features: 'auto' }}>
213
+ *
214
+ * // Or specify explicitly:
215
+ * <CedrosLoginProvider config={{ serverUrl: '...', features: { email: true, google: true } }}>
216
+ * ```
167
217
  */
168
218
  declare type CedrosLoginProviderConfig = Omit<CedrosLoginConfig, 'features'> & {
169
219
  features?: FeatureFlags | 'auto';
@@ -1,6 +1,6 @@
1
- import { C as s, u as a } from "./useAuth-C3dpk0po.js";
1
+ import { C as s, u as a } from "./useAuth-m5Hf89v8.js";
2
2
  import { u as i } from "./useCedrosLogin-_94MmGGq.js";
3
- import { E as t, a as u, P as p, u as d } from "./EmailRegisterForm-nI0BOIxR.js";
3
+ import { E as t, a as u, P as p, u as d } from "./EmailRegisterForm-CxOdldks.js";
4
4
  import { L as f } from "./LoadingSpinner-6vml-zwr.js";
5
5
  import { E as x } from "./ErrorMessage-CcEK0pYO.js";
6
6
  import { v as L } from "./validation-B8kMV3BL.js";
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useAuth-D3Pk_H3z.cjs"),r=require("./useCedrosLogin-C9MrcZvh.cjs"),o=require("./GoogleLoginButton-zS_69-KV.cjs"),n=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs");exports.CedrosLoginProvider=e.CedrosLoginProvider;exports.useAuth=e.useAuth;exports.useCedrosLogin=r.useCedrosLogin;exports.GoogleLoginButton=o.GoogleLoginButton;exports.useGoogleAuth=o.useGoogleAuth;exports.LoadingSpinner=n.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useAuth-X6Ds6WW4.cjs"),r=require("./useCedrosLogin-C9MrcZvh.cjs"),o=require("./GoogleLoginButton-zS_69-KV.cjs"),n=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs");exports.CedrosLoginProvider=e.CedrosLoginProvider;exports.useAuth=e.useAuth;exports.useCedrosLogin=r.useCedrosLogin;exports.GoogleLoginButton=o.GoogleLoginButton;exports.useGoogleAuth=o.useGoogleAuth;exports.LoadingSpinner=n.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;
@@ -98,16 +98,44 @@ export declare interface AuthUser {
98
98
  }
99
99
 
100
100
  /**
101
- * Full configuration for CedrosLoginProvider
101
+ * Full configuration for the authentication system.
102
+ *
103
+ * **Note:** When passing config to `<CedrosLoginProvider>`, use
104
+ * {@link CedrosLoginProviderConfig} instead — it extends this type
105
+ * with `features: 'auto'` support. This base type is used internally
106
+ * after the provider resolves auto-discovery.
107
+ *
108
+ * ```
109
+ * CedrosLoginProviderConfig (public prop type — accepts features: 'auto')
110
+ * └── CedrosLoginConfig (internal type — features is always FeatureFlags)
111
+ * ```
102
112
  */
103
113
  export declare interface CedrosLoginConfig {
104
114
  /** Auth server base URL */
105
115
  serverUrl: string;
106
116
  /** App name for Solana message: "Login to {appName}". Default: window.location.hostname */
107
117
  appName?: string;
108
- /** Google OAuth client ID. Required if Google auth enabled */
118
+ /**
119
+ * Google OAuth client ID. Required if Google auth enabled.
120
+ *
121
+ * **CSP requirements** (when using Google One Tap / credential popup):
122
+ * ```
123
+ * script-src https://accounts.google.com;
124
+ * connect-src https://accounts.google.com;
125
+ * frame-src https://accounts.google.com;
126
+ * ```
127
+ */
109
128
  googleClientId?: string;
110
- /** Apple Sign In client ID (Services ID). Required if Apple auth enabled */
129
+ /**
130
+ * Apple Sign In client ID (Services ID). Required if Apple auth enabled.
131
+ *
132
+ * **CSP requirements** (when using Apple Sign In popup):
133
+ * ```
134
+ * script-src https://appleid.cdn-apple.com;
135
+ * connect-src https://appleid.apple.com;
136
+ * frame-src https://appleid.apple.com;
137
+ * ```
138
+ */
111
139
  appleClientId?: string;
112
140
  /** Solana configuration options */
113
141
  solana?: SolanaConfig;
@@ -160,9 +188,31 @@ declare interface CedrosLoginInternalAPI {
160
188
  export declare function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps): JSX.Element | null;
161
189
 
162
190
  /**
163
- * Config accepted by CedrosLoginProvider.
164
- * Same as CedrosLoginConfig but `features` also accepts `'auto'`
165
- * to fetch enabled methods from the server at startup.
191
+ * Config prop type for `<CedrosLoginProvider>`.
192
+ *
193
+ * Extends {@link CedrosLoginConfig} with one additional feature:
194
+ * the `features` field also accepts `'auto'` to fetch enabled
195
+ * auth methods from the server at startup.
196
+ *
197
+ * **`features: 'auto'` discovery contract:**
198
+ * - Calls `GET {serverUrl}/features` (no auth required, credentials omitted).
199
+ * - Response shape: `{ email, google, apple, solana, webauthn, instantLink }` (all booleans).
200
+ * - Timeout: `requestTimeout` or 5 000 ms. 1 retry on failure.
201
+ * - Fallback: all methods enabled (so the login page is never blank).
202
+ * - Children are not rendered until discovery completes.
203
+ * - `walletEnrollment` flag is client-only and is not part of the server response.
204
+ *
205
+ * When `features` is omitted or set to a `FeatureFlags` object, no server
206
+ * call is made and the flags are used as-is.
207
+ *
208
+ * @example
209
+ * ```tsx
210
+ * // Auto-discover enabled methods from the server:
211
+ * <CedrosLoginProvider config={{ serverUrl: '...', features: 'auto' }}>
212
+ *
213
+ * // Or specify explicitly:
214
+ * <CedrosLoginProvider config={{ serverUrl: '...', features: { email: true, google: true } }}>
215
+ * ```
166
216
  */
167
217
  declare type CedrosLoginProviderConfig = Omit<CedrosLoginConfig, 'features'> & {
168
218
  features?: FeatureFlags | 'auto';
@@ -1,4 +1,4 @@
1
- import { C as e, u as s } from "./useAuth-C3dpk0po.js";
1
+ import { C as e, u as s } from "./useAuth-m5Hf89v8.js";
2
2
  import { u as t } from "./useCedrosLogin-_94MmGGq.js";
3
3
  import { G as g, u as n } from "./GoogleLoginButton-CXwp4LsQ.js";
4
4
  import { L as p } from "./LoadingSpinner-6vml-zwr.js";