@cedros/login-react 0.0.15 → 0.0.16

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 (125) 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-DcpT5LU6.cjs} +1 -1
  22. package/dist/{EmailRegisterForm-Pvm3I8GP.cjs.map → EmailRegisterForm-DcpT5LU6.cjs.map} +1 -1
  23. package/dist/{EmailRegisterForm-nI0BOIxR.js → EmailRegisterForm-HMcnD3KA.js} +1 -1
  24. package/dist/{EmailRegisterForm-nI0BOIxR.js.map → EmailRegisterForm-HMcnD3KA.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-L-s-Tp1Z.js → shamir-CDbZS8I1.js} +1 -1
  83. package/dist/{shamir-L-s-Tp1Z.js.map → shamir-CDbZS8I1.js.map} +1 -1
  84. package/dist/{shamir-4DyQMJCk.cjs → shamir-DAa54dMh.cjs} +1 -1
  85. package/dist/{shamir-4DyQMJCk.cjs.map → shamir-DAa54dMh.cjs.map} +1 -1
  86. package/dist/{silentWalletEnroll-DWt6Pr3B.js → silentWalletEnroll-CRHzr4Zy.js} +2 -2
  87. package/dist/{silentWalletEnroll-DWt6Pr3B.js.map → silentWalletEnroll-CRHzr4Zy.js.map} +1 -1
  88. package/dist/{silentWalletEnroll-BgTb4H5I.cjs → silentWalletEnroll-Dl_oFapH.cjs} +1 -1
  89. package/dist/{silentWalletEnroll-BgTb4H5I.cjs.map → silentWalletEnroll-Dl_oFapH.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-C3dpk0po.js → useAuth-D1NSN6yY.js} +822 -777
  94. package/dist/useAuth-D1NSN6yY.js.map +1 -0
  95. package/dist/{useAuth-D3Pk_H3z.cjs → useAuth-dS_6wAMp.cjs} +1 -1
  96. package/dist/useAuth-dS_6wAMp.cjs.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.map +0 -1
@@ -2,13 +2,13 @@ import { jsxs as r, jsx as e } from "react/jsx-runtime";
2
2
  import { useRef as I, useState as v, useCallback as O, useEffect as $, useMemo as P } from "react";
3
3
  import { L as T } from "./LoadingSpinner-6vml-zwr.js";
4
4
  import { E as A } from "./ErrorMessage-CcEK0pYO.js";
5
- import { u as F, A as L, S as j } from "./AutosaveStatus-DeViUyyI.js";
5
+ import { u as F, A as L, S as j } from "./AutosaveStatus-BKc7T2Tw.js";
6
6
  import { u as R } from "./useCedrosLogin-_94MmGGq.js";
7
7
  import { u as U } from "./useOrgs-C3pzMA9h.js";
8
8
  function q() {
9
9
  const { config: o, _internal: g } = R(), h = o.serverUrl, b = I(g?.getAccessToken ?? (() => null));
10
10
  b.current = g?.getAccessToken ?? (() => null);
11
- const [S, k] = v([]), [f, y] = v(0), [C, c] = v(!1), [_, t] = v(null), m = O(() => {
11
+ const [S, k] = v([]), [f, y] = v(0), [C, c] = v(!1), [w, t] = v(null), m = O(() => {
12
12
  const d = b.current();
13
13
  return {
14
14
  "Content-Type": "application/json",
@@ -104,7 +104,7 @@ function q() {
104
104
  }
105
105
  },
106
106
  [h, m]
107
- ), w = O(
107
+ ), _ = O(
108
108
  async (d, a) => u(d, { enabled: a }),
109
109
  [u]
110
110
  );
@@ -112,12 +112,12 @@ function q() {
112
112
  providers: S,
113
113
  total: f,
114
114
  isLoading: C,
115
- error: _,
115
+ error: w,
116
116
  fetchProviders: p,
117
117
  createProvider: l,
118
118
  updateProvider: u,
119
119
  deleteProvider: E,
120
- toggleProvider: w
120
+ toggleProvider: _
121
121
  };
122
122
  }
123
123
  function M({ className: o }) {
@@ -130,13 +130,13 @@ function M({ className: o }) {
130
130
  updateProvider: f,
131
131
  deleteProvider: y,
132
132
  toggleProvider: C
133
- } = q(), { activeOrg: c } = U(), [_, t] = v("list"), [m, p] = v(null), [l, u] = v(null);
133
+ } = q(), { activeOrg: c } = U(), [w, t] = v("list"), [m, p] = v(null), [l, u] = v(null);
134
134
  $(() => {
135
135
  S(c?.id);
136
136
  }, [S, c?.id]);
137
137
  const E = () => {
138
138
  p(null), u(null), t("add");
139
- }, w = (s) => {
139
+ }, _ = (s) => {
140
140
  p(s), u(null), t("edit");
141
141
  }, d = () => {
142
142
  t("list"), p(null), u(null);
@@ -154,7 +154,7 @@ function M({ className: o }) {
154
154
  }, i = async (s) => {
155
155
  u(null);
156
156
  try {
157
- _ === "add" ? await k(s) : m && await f(m.id, s), t("list"), p(null);
157
+ w === "add" ? await k(s) : m && await f(m.id, s), t("list"), p(null);
158
158
  } catch (N) {
159
159
  u(N instanceof Error ? N.message : "Failed to save provider");
160
160
  }
@@ -162,7 +162,7 @@ function M({ className: o }) {
162
162
  return h && g.length === 0 ? /* @__PURE__ */ r("div", { className: `cedros-system-settings cedros-system-settings-loading ${o ?? ""}`, children: [
163
163
  /* @__PURE__ */ e(T, {}),
164
164
  /* @__PURE__ */ e("span", { children: "Loading SSO providers..." })
165
- ] }) : _ === "add" || _ === "edit" ? /* @__PURE__ */ e("div", { className: `cedros-system-settings ${o ?? ""}`, children: /* @__PURE__ */ e(
165
+ ] }) : w === "add" || w === "edit" ? /* @__PURE__ */ e("div", { className: `cedros-system-settings ${o ?? ""}`, children: /* @__PURE__ */ e(
166
166
  B,
167
167
  {
168
168
  provider: m,
@@ -188,7 +188,7 @@ function M({ className: o }) {
188
188
  z,
189
189
  {
190
190
  provider: s,
191
- onEdit: () => w(s),
191
+ onEdit: () => _(s),
192
192
  onDelete: () => a(s),
193
193
  onToggle: () => n(s)
194
194
  },
@@ -263,7 +263,7 @@ function B({
263
263
  onSave: S,
264
264
  onCancel: k
265
265
  }) {
266
- const f = !!o, [y, C] = v(o?.name ?? ""), [c, _] = v(o?.issuerUrl ?? ""), [t, m] = v(o?.clientId ?? ""), [p, l] = v(""), [u, E] = v(o?.emailDomain ?? ""), [w, d] = v(o?.allowRegistration ?? !0), [a, n] = v(o?.enabled ?? !0), i = O(
266
+ const f = !!o, [y, C] = v(o?.name ?? ""), [c, w] = v(o?.issuerUrl ?? ""), [t, m] = v(o?.clientId ?? ""), [p, l] = v(""), [u, E] = v(o?.emailDomain ?? ""), [_, d] = v(o?.allowRegistration ?? !0), [a, n] = v(o?.enabled ?? !0), i = O(
267
267
  (s) => {
268
268
  if (s.preventDefault(), f) {
269
269
  const N = {
@@ -271,7 +271,7 @@ function B({
271
271
  issuerUrl: c,
272
272
  clientId: t,
273
273
  emailDomain: u || null,
274
- allowRegistration: w,
274
+ allowRegistration: _,
275
275
  enabled: a
276
276
  };
277
277
  p && (N.clientSecret = p), S(N);
@@ -285,7 +285,7 @@ function B({
285
285
  clientId: t,
286
286
  clientSecret: p,
287
287
  emailDomain: u || null,
288
- allowRegistration: w,
288
+ allowRegistration: _,
289
289
  enabled: a
290
290
  });
291
291
  }
@@ -298,7 +298,7 @@ function B({
298
298
  t,
299
299
  p,
300
300
  u,
301
- w,
301
+ _,
302
302
  a,
303
303
  S
304
304
  ]
@@ -334,7 +334,7 @@ function B({
334
334
  type: "url",
335
335
  className: "cedros-form-input",
336
336
  value: c,
337
- onChange: (s) => _(s.target.value),
337
+ onChange: (s) => w(s.target.value),
338
338
  placeholder: "https://your-org.okta.com",
339
339
  required: !0
340
340
  }
@@ -395,7 +395,7 @@ function B({
395
395
  "input",
396
396
  {
397
397
  type: "checkbox",
398
- checked: w,
398
+ checked: _,
399
399
  onChange: (s) => d(s.target.checked)
400
400
  }
401
401
  ),
@@ -445,7 +445,7 @@ const D = [
445
445
  id: "apple",
446
446
  label: "Apple",
447
447
  categories: ["auth.apple"],
448
- keys: ["auth_apple_enabled", "auth_apple_client_id", "auth_apple_team_id", "auth_apple_key_id", "auth_apple_private_key"]
448
+ keys: ["auth_apple_enabled", "auth_apple_client_id", "auth_apple_team_id"]
449
449
  },
450
450
  {
451
451
  id: "solana",
@@ -477,7 +477,7 @@ function X({ className: o }) {
477
477
  error: f,
478
478
  fetchSettings: y,
479
479
  handleChange: C
480
- } = F(), [c, _] = v("email");
480
+ } = F(), [c, w] = v("email");
481
481
  $(() => {
482
482
  y();
483
483
  }, [y]);
@@ -506,7 +506,7 @@ function X({ className: o }) {
506
506
  {
507
507
  type: "button",
508
508
  className: `cedros-admin-tab ${c === l.id ? "cedros-admin-tab-active" : ""}`,
509
- onClick: () => _(l.id),
509
+ onClick: () => w(l.id),
510
510
  "aria-selected": c === l.id,
511
511
  role: "tab",
512
512
  children: l.label
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticationSettings-Dg6ATgOl.js","sources":["../src/hooks/useSsoProviders.ts","../src/components/admin/settings/SsoProvidersSettings.tsx","../src/components/admin/settings/AuthenticationSettings.tsx"],"sourcesContent":["/**\n * Hook for managing SSO providers (admin)\n */\nimport { useState, useCallback, useRef } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\n\nexport interface SsoProvider {\n id: string;\n orgId: string;\n name: string;\n issuerUrl: string;\n clientId: string;\n scopes: string[];\n enabled: boolean;\n allowRegistration: boolean;\n emailDomain: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateSsoProviderInput {\n orgId: string;\n name: string;\n issuerUrl: string;\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n enabled?: boolean;\n allowRegistration?: boolean;\n emailDomain?: string | null;\n}\n\nexport interface UpdateSsoProviderInput {\n name?: string;\n issuerUrl?: string;\n clientId?: string;\n clientSecret?: string;\n scopes?: string[];\n enabled?: boolean;\n allowRegistration?: boolean;\n emailDomain?: string | null;\n}\n\ninterface ListResponse {\n providers: SsoProvider[];\n total: number;\n limit: number;\n offset: number;\n}\n\nexport function useSsoProviders() {\n const { config, _internal } = useCedrosLogin();\n const serverUrl = config.serverUrl;\n\n // PERF-03: Stabilize getAccessToken reference using ref pattern\n // to prevent unnecessary re-creation of callbacks\n const getAccessTokenRef = useRef(_internal?.getAccessToken ?? (() => null));\n getAccessTokenRef.current = _internal?.getAccessToken ?? (() => null);\n\n const [providers, setProviders] = useState<SsoProvider[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Memoize getHeaders with empty deps since it uses ref\n const getHeaders = useCallback(() => {\n const token = getAccessTokenRef.current();\n return {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }, []);\n\n const fetchProviders = useCallback(\n async (orgId?: string, limit = 50, offset = 0) => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (orgId) params.set('org_id', orgId);\n params.set('limit', String(limit));\n params.set('offset', String(offset));\n\n const res = await fetch(`${serverUrl}/admin/sso-providers?${params}`, {\n headers: getHeaders(),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to fetch SSO providers: ${res.status}`);\n }\n\n const data: ListResponse = await res.json();\n setProviders(data.providers);\n setTotal(data.total);\n return data;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const createProvider = useCallback(\n async (input: CreateSsoProviderInput): Promise<SsoProvider> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers`, {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(input),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to create SSO provider: ${res.status}`);\n }\n\n const provider: SsoProvider = await res.json();\n setProviders((prev) => [...prev, provider]);\n setTotal((prev) => prev + 1);\n return provider;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const updateProvider = useCallback(\n async (id: string, input: UpdateSsoProviderInput): Promise<SsoProvider> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers/${id}`, {\n method: 'PUT',\n headers: getHeaders(),\n body: JSON.stringify(input),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to update SSO provider: ${res.status}`);\n }\n\n const provider: SsoProvider = await res.json();\n setProviders((prev) => prev.map((p) => (p.id === id ? provider : p)));\n return provider;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const deleteProvider = useCallback(\n async (id: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers/${id}`, {\n method: 'DELETE',\n headers: getHeaders(),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to delete SSO provider: ${res.status}`);\n }\n\n setProviders((prev) => prev.filter((p) => p.id !== id));\n setTotal((prev) => prev - 1);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const toggleProvider = useCallback(\n async (id: string, enabled: boolean): Promise<SsoProvider> => {\n return updateProvider(id, { enabled });\n },\n [updateProvider]\n );\n\n return {\n providers,\n total,\n isLoading,\n error,\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n toggleProvider,\n };\n}\n","/**\n * SSO Providers settings - manage OIDC identity providers\n */\nimport { useState, useEffect, useCallback } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport {\n useSsoProviders,\n type SsoProvider,\n type CreateSsoProviderInput,\n type UpdateSsoProviderInput,\n} from '../../../hooks/useSsoProviders';\nimport { useOrgs } from '../../../hooks/useOrgs';\n\nexport interface SsoProvidersSettingsProps {\n className?: string;\n}\n\ntype ViewMode = 'list' | 'add' | 'edit';\n\nexport function SsoProvidersSettings({ className }: SsoProvidersSettingsProps) {\n const {\n providers,\n isLoading,\n error,\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n toggleProvider,\n } = useSsoProviders();\n\n const { activeOrg } = useOrgs();\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [editingProvider, setEditingProvider] = useState<SsoProvider | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n useEffect(() => {\n fetchProviders(activeOrg?.id);\n }, [fetchProviders, activeOrg?.id]);\n\n const handleAdd = () => {\n setEditingProvider(null);\n setFormError(null);\n setViewMode('add');\n };\n\n const handleEdit = (provider: SsoProvider) => {\n setEditingProvider(provider);\n setFormError(null);\n setViewMode('edit');\n };\n\n const handleCancel = () => {\n setViewMode('list');\n setEditingProvider(null);\n setFormError(null);\n };\n\n const handleDelete = async (provider: SsoProvider) => {\n if (!confirm(`Delete SSO provider \"${provider.name}\"? This cannot be undone.`)) {\n return;\n }\n try {\n await deleteProvider(provider.id);\n } catch {\n // Error is already set in hook\n }\n };\n\n const handleToggle = async (provider: SsoProvider) => {\n try {\n await toggleProvider(provider.id, !provider.enabled);\n } catch {\n // Error is already set in hook\n }\n };\n\n const handleSave = async (data: CreateSsoProviderInput | UpdateSsoProviderInput) => {\n setFormError(null);\n try {\n if (viewMode === 'add') {\n await createProvider(data as CreateSsoProviderInput);\n } else if (editingProvider) {\n await updateProvider(editingProvider.id, data as UpdateSsoProviderInput);\n }\n setViewMode('list');\n setEditingProvider(null);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to save provider');\n }\n };\n\n if (isLoading && providers.length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading SSO providers...</span>\n </div>\n );\n }\n\n if (viewMode === 'add' || viewMode === 'edit') {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <SsoProviderForm\n provider={editingProvider}\n orgId={activeOrg?.id}\n error={formError}\n isLoading={isLoading}\n onSave={handleSave}\n onCancel={handleCancel}\n />\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\">SSO Providers</h2>\n <p className=\"cedros-settings-page-description\">\n Configure OIDC identity providers for enterprise single sign-on.\n </p>\n </div>\n <button type=\"button\" className=\"cedros-btn cedros-btn-primary\" onClick={handleAdd}>\n Add Provider\n </button>\n </div>\n\n {error && <ErrorMessage error={error.message} />}\n\n {providers.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No SSO providers configured.</p>\n <p className=\"cedros-text-muted\">\n Add an OIDC provider like Okta, Azure AD, or Auth0 to enable enterprise SSO.\n </p>\n </div>\n ) : (\n <div className=\"cedros-sso-provider-list\">\n {providers.map((provider) => (\n <SsoProviderCard\n key={provider.id}\n provider={provider}\n onEdit={() => handleEdit(provider)}\n onDelete={() => handleDelete(provider)}\n onToggle={() => handleToggle(provider)}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Provider Card\n// =============================================================================\n\ninterface SsoProviderCardProps {\n provider: SsoProvider;\n onEdit: () => void;\n onDelete: () => void;\n onToggle: () => void;\n}\n\nfunction SsoProviderCard({ provider, onEdit, onDelete, onToggle }: SsoProviderCardProps) {\n return (\n <div\n className={`cedros-sso-provider-card ${provider.enabled ? '' : 'cedros-sso-provider-card--disabled'}`}\n >\n <div className=\"cedros-sso-provider-card-header\">\n <div className=\"cedros-sso-provider-card-info\">\n <h3 className=\"cedros-sso-provider-card-name\">{provider.name}</h3>\n <p className=\"cedros-sso-provider-card-issuer\">{provider.issuerUrl}</p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={provider.enabled}\n className={`cedros-toggle ${provider.enabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={onToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{provider.enabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n </div>\n\n <div className=\"cedros-sso-provider-card-details\">\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Client ID</span>\n <code className=\"cedros-sso-provider-card-detail-value\">{provider.clientId}</code>\n </div>\n {provider.emailDomain && (\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Email Domain</span>\n <span className=\"cedros-sso-provider-card-detail-value\">@{provider.emailDomain}</span>\n </div>\n )}\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Registration</span>\n <span className=\"cedros-sso-provider-card-detail-value\">\n {provider.allowRegistration ? 'Allowed' : 'Existing users only'}\n </span>\n </div>\n </div>\n\n <div className=\"cedros-sso-provider-card-actions\">\n <button type=\"button\" className=\"cedros-btn cedros-btn-ghost\" onClick={onEdit}>\n Edit\n </button>\n <button\n type=\"button\"\n className=\"cedros-btn cedros-btn-ghost cedros-btn-danger\"\n onClick={onDelete}\n >\n Delete\n </button>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Provider Form\n// =============================================================================\n\ninterface SsoProviderFormProps {\n provider: SsoProvider | null;\n orgId?: string;\n error: string | null;\n isLoading: boolean;\n onSave: (data: CreateSsoProviderInput | UpdateSsoProviderInput) => void;\n onCancel: () => void;\n}\n\nfunction SsoProviderForm({\n provider,\n orgId,\n error,\n isLoading,\n onSave,\n onCancel,\n}: SsoProviderFormProps) {\n const isEditing = Boolean(provider);\n\n const [name, setName] = useState(provider?.name ?? '');\n const [issuerUrl, setIssuerUrl] = useState(provider?.issuerUrl ?? '');\n const [clientId, setClientId] = useState(provider?.clientId ?? '');\n const [clientSecret, setClientSecret] = useState('');\n const [emailDomain, setEmailDomain] = useState(provider?.emailDomain ?? '');\n const [allowRegistration, setAllowRegistration] = useState(provider?.allowRegistration ?? true);\n const [enabled, setEnabled] = useState(provider?.enabled ?? true);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n if (isEditing) {\n const updates: UpdateSsoProviderInput = {\n name,\n issuerUrl,\n clientId,\n emailDomain: emailDomain || null,\n allowRegistration,\n enabled,\n };\n // Only include secret if changed\n if (clientSecret) {\n updates.clientSecret = clientSecret;\n }\n onSave(updates);\n } else {\n if (!orgId) {\n return;\n }\n const data: CreateSsoProviderInput = {\n orgId,\n name,\n issuerUrl,\n clientId,\n clientSecret,\n emailDomain: emailDomain || null,\n allowRegistration,\n enabled,\n };\n onSave(data);\n }\n },\n [\n isEditing,\n orgId,\n name,\n issuerUrl,\n clientId,\n clientSecret,\n emailDomain,\n allowRegistration,\n enabled,\n onSave,\n ]\n );\n\n return (\n <form className=\"cedros-sso-provider-form\" onSubmit={handleSubmit}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">\n {isEditing ? 'Edit SSO Provider' : 'Add SSO Provider'}\n </h2>\n <p className=\"cedros-settings-page-description\">\n Configure an OIDC identity provider for enterprise single sign-on.\n </p>\n </div>\n </div>\n\n {error && <ErrorMessage error={error} />}\n\n <div className=\"cedros-form-section\">\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-name\">\n Provider Name\n </label>\n <input\n id=\"sso-name\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g., Okta, Azure AD\"\n required\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-issuer\">\n Issuer URL\n </label>\n <input\n id=\"sso-issuer\"\n type=\"url\"\n className=\"cedros-form-input\"\n value={issuerUrl}\n onChange={(e) => setIssuerUrl(e.target.value)}\n placeholder=\"https://your-org.okta.com\"\n required\n />\n <p className=\"cedros-form-hint\">\n The OIDC issuer URL. Must support discovery at /.well-known/openid-configuration\n </p>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-client-id\">\n Client ID\n </label>\n <input\n id=\"sso-client-id\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={clientId}\n onChange={(e) => setClientId(e.target.value)}\n placeholder=\"OAuth client ID\"\n required\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-client-secret\">\n Client Secret{' '}\n {isEditing && (\n <span className=\"cedros-form-hint-inline\">(leave blank to keep current)</span>\n )}\n </label>\n <input\n id=\"sso-client-secret\"\n type=\"password\"\n className=\"cedros-form-input\"\n value={clientSecret}\n onChange={(e) => setClientSecret(e.target.value)}\n placeholder={isEditing ? '••••••••' : 'OAuth client secret'}\n required={!isEditing}\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-email-domain\">\n Email Domain (optional)\n </label>\n <input\n id=\"sso-email-domain\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={emailDomain}\n onChange={(e) => setEmailDomain(e.target.value)}\n placeholder=\"company.com\"\n />\n <p className=\"cedros-form-hint\">Restrict to users with emails from this domain</p>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-checkbox\">\n <input\n type=\"checkbox\"\n checked={allowRegistration}\n onChange={(e) => setAllowRegistration(e.target.checked)}\n />\n <span>Allow new user registration via SSO</span>\n </label>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-checkbox\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => setEnabled(e.target.checked)}\n />\n <span>Enable this provider</span>\n </label>\n </div>\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"button\"\n className=\"cedros-btn cedros-btn-ghost\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </button>\n <button type=\"submit\" className=\"cedros-btn cedros-btn-primary\" disabled={isLoading}>\n {isLoading ? 'Saving...' : isEditing ? 'Save Changes' : 'Add Provider'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Authentication settings page - configure auth providers with tabs\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';\nimport { SsoProvidersSettings } from './SsoProvidersSettings';\n\ntype AuthTab = 'email' | 'google' | 'apple' | 'solana' | 'passkeys' | 'instantlink' | 'sso';\n\ninterface TabConfig {\n id: AuthTab;\n label: string;\n /** Categories to pull settings from (not used for 'sso' tab) */\n categories: string[];\n /** Optional list of specific keys to show (if omitted, show all in categories) */\n keys?: string[];\n /** If true, renders a custom component instead of settings section */\n isCustom?: boolean;\n}\n\nconst TABS: TabConfig[] = [\n { id: 'email', label: 'Email', categories: ['auth.email'],\n keys: ['auth_email_enabled', 'auth_email_require_verification', 'auth_email_block_disposable'] },\n { id: 'google', label: 'Google', categories: ['auth.google'],\n keys: ['auth_google_enabled', 'auth_google_client_id'] },\n { id: 'apple', label: 'Apple', categories: ['auth.apple'],\n keys: ['auth_apple_enabled', 'auth_apple_client_id', 'auth_apple_team_id', 'auth_apple_key_id', 'auth_apple_private_key'] },\n { id: 'solana', label: 'Solana', categories: ['auth.solana'],\n keys: ['auth_solana_enabled', 'auth_solana_challenge_expiry'] },\n { id: 'passkeys', label: 'Passkeys', categories: ['auth.webauthn'],\n keys: ['auth_webauthn_enabled', 'auth_webauthn_rp_id', 'auth_webauthn_rp_name', 'auth_webauthn_rp_origin'] },\n { id: 'instantlink', label: 'Instant Link', categories: ['auth.instantlink'],\n keys: ['auth_instantlink_enabled', 'auth_instantlink_expiry', 'auth_instantlink_rate_limit'] },\n { id: 'sso', label: 'SSO Providers', categories: [], isCustom: true },\n];\n\nexport interface AuthenticationSettingsProps {\n className?: string;\n}\n\nexport function AuthenticationSettings({ className }: AuthenticationSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<AuthTab>('email');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: (typeof settings)[string] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n const currentSettings = useMemo(() => {\n if (!currentTab?.keys) return allTabSettings;\n // Filter and sort by keys order\n return allTabSettings\n .filter((s) => currentTab.keys!.includes(s.key))\n .sort((a, b) => currentTab.keys!.indexOf(a.key) - currentTab.keys!.indexOf(b.key));\n }, [allTabSettings, 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\">Authentication</h2>\n <p className=\"cedros-settings-page-description\">\n Configure authentication providers and methods for user sign-in.\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 {TABS.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 {currentTab?.isCustom ? (\n <SsoProvidersSettings />\n ) : currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this provider'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["useSsoProviders","config","_internal","useCedrosLogin","serverUrl","getAccessTokenRef","useRef","providers","setProviders","useState","total","setTotal","isLoading","setIsLoading","error","setError","getHeaders","useCallback","token","fetchProviders","orgId","limit","offset","params","res","err","data","createProvider","input","provider","prev","updateProvider","id","p","deleteProvider","toggleProvider","enabled","SsoProvidersSettings","className","activeOrg","useOrgs","viewMode","setViewMode","editingProvider","setEditingProvider","formError","setFormError","useEffect","handleAdd","handleEdit","handleCancel","handleDelete","handleToggle","handleSave","jsx","LoadingSpinner","SsoProviderForm","jsxs","ErrorMessage","SsoProviderCard","onEdit","onDelete","onToggle","onSave","onCancel","isEditing","name","setName","issuerUrl","setIssuerUrl","clientId","setClientId","clientSecret","setClientSecret","emailDomain","setEmailDomain","allowRegistration","setAllowRegistration","setEnabled","handleSubmit","e","updates","TABS","AuthenticationSettings","settings","edits","autosaveStatus","autosaveError","fetchSettings","handleChange","useSettingsAutosave","activeTab","setActiveTab","currentTab","t","allTabSettings","useMemo","allSettings","category","categorySettings","currentSettings","s","a","b","AutosaveStatus","tab","SettingsSection"],"mappings":"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"}
1
+ {"version":3,"file":"AuthenticationSettings-BipaLyGg.js","sources":["../src/hooks/useSsoProviders.ts","../src/components/admin/settings/SsoProvidersSettings.tsx","../src/components/admin/settings/AuthenticationSettings.tsx"],"sourcesContent":["/**\n * Hook for managing SSO providers (admin)\n */\nimport { useState, useCallback, useRef } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\n\nexport interface SsoProvider {\n id: string;\n orgId: string;\n name: string;\n issuerUrl: string;\n clientId: string;\n scopes: string[];\n enabled: boolean;\n allowRegistration: boolean;\n emailDomain: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateSsoProviderInput {\n orgId: string;\n name: string;\n issuerUrl: string;\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n enabled?: boolean;\n allowRegistration?: boolean;\n emailDomain?: string | null;\n}\n\nexport interface UpdateSsoProviderInput {\n name?: string;\n issuerUrl?: string;\n clientId?: string;\n clientSecret?: string;\n scopes?: string[];\n enabled?: boolean;\n allowRegistration?: boolean;\n emailDomain?: string | null;\n}\n\ninterface ListResponse {\n providers: SsoProvider[];\n total: number;\n limit: number;\n offset: number;\n}\n\nexport function useSsoProviders() {\n const { config, _internal } = useCedrosLogin();\n const serverUrl = config.serverUrl;\n\n // PERF-03: Stabilize getAccessToken reference using ref pattern\n // to prevent unnecessary re-creation of callbacks\n const getAccessTokenRef = useRef(_internal?.getAccessToken ?? (() => null));\n getAccessTokenRef.current = _internal?.getAccessToken ?? (() => null);\n\n const [providers, setProviders] = useState<SsoProvider[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Memoize getHeaders with empty deps since it uses ref\n const getHeaders = useCallback(() => {\n const token = getAccessTokenRef.current();\n return {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n }, []);\n\n const fetchProviders = useCallback(\n async (orgId?: string, limit = 50, offset = 0) => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (orgId) params.set('org_id', orgId);\n params.set('limit', String(limit));\n params.set('offset', String(offset));\n\n const res = await fetch(`${serverUrl}/admin/sso-providers?${params}`, {\n headers: getHeaders(),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to fetch SSO providers: ${res.status}`);\n }\n\n const data: ListResponse = await res.json();\n setProviders(data.providers);\n setTotal(data.total);\n return data;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const createProvider = useCallback(\n async (input: CreateSsoProviderInput): Promise<SsoProvider> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers`, {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(input),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to create SSO provider: ${res.status}`);\n }\n\n const provider: SsoProvider = await res.json();\n setProviders((prev) => [...prev, provider]);\n setTotal((prev) => prev + 1);\n return provider;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const updateProvider = useCallback(\n async (id: string, input: UpdateSsoProviderInput): Promise<SsoProvider> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers/${id}`, {\n method: 'PUT',\n headers: getHeaders(),\n body: JSON.stringify(input),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to update SSO provider: ${res.status}`);\n }\n\n const provider: SsoProvider = await res.json();\n setProviders((prev) => prev.map((p) => (p.id === id ? provider : p)));\n return provider;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const deleteProvider = useCallback(\n async (id: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${serverUrl}/admin/sso-providers/${id}`, {\n method: 'DELETE',\n headers: getHeaders(),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({}));\n throw new Error(err.error || `Failed to delete SSO provider: ${res.status}`);\n }\n\n setProviders((prev) => prev.filter((p) => p.id !== id));\n setTotal((prev) => prev - 1);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [serverUrl, getHeaders]\n );\n\n const toggleProvider = useCallback(\n async (id: string, enabled: boolean): Promise<SsoProvider> => {\n return updateProvider(id, { enabled });\n },\n [updateProvider]\n );\n\n return {\n providers,\n total,\n isLoading,\n error,\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n toggleProvider,\n };\n}\n","/**\n * SSO Providers settings - manage OIDC identity providers\n */\nimport { useState, useEffect, useCallback } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport {\n useSsoProviders,\n type SsoProvider,\n type CreateSsoProviderInput,\n type UpdateSsoProviderInput,\n} from '../../../hooks/useSsoProviders';\nimport { useOrgs } from '../../../hooks/useOrgs';\n\nexport interface SsoProvidersSettingsProps {\n className?: string;\n}\n\ntype ViewMode = 'list' | 'add' | 'edit';\n\nexport function SsoProvidersSettings({ className }: SsoProvidersSettingsProps) {\n const {\n providers,\n isLoading,\n error,\n fetchProviders,\n createProvider,\n updateProvider,\n deleteProvider,\n toggleProvider,\n } = useSsoProviders();\n\n const { activeOrg } = useOrgs();\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [editingProvider, setEditingProvider] = useState<SsoProvider | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n useEffect(() => {\n fetchProviders(activeOrg?.id);\n }, [fetchProviders, activeOrg?.id]);\n\n const handleAdd = () => {\n setEditingProvider(null);\n setFormError(null);\n setViewMode('add');\n };\n\n const handleEdit = (provider: SsoProvider) => {\n setEditingProvider(provider);\n setFormError(null);\n setViewMode('edit');\n };\n\n const handleCancel = () => {\n setViewMode('list');\n setEditingProvider(null);\n setFormError(null);\n };\n\n const handleDelete = async (provider: SsoProvider) => {\n if (!confirm(`Delete SSO provider \"${provider.name}\"? This cannot be undone.`)) {\n return;\n }\n try {\n await deleteProvider(provider.id);\n } catch {\n // Error is already set in hook\n }\n };\n\n const handleToggle = async (provider: SsoProvider) => {\n try {\n await toggleProvider(provider.id, !provider.enabled);\n } catch {\n // Error is already set in hook\n }\n };\n\n const handleSave = async (data: CreateSsoProviderInput | UpdateSsoProviderInput) => {\n setFormError(null);\n try {\n if (viewMode === 'add') {\n await createProvider(data as CreateSsoProviderInput);\n } else if (editingProvider) {\n await updateProvider(editingProvider.id, data as UpdateSsoProviderInput);\n }\n setViewMode('list');\n setEditingProvider(null);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to save provider');\n }\n };\n\n if (isLoading && providers.length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading SSO providers...</span>\n </div>\n );\n }\n\n if (viewMode === 'add' || viewMode === 'edit') {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <SsoProviderForm\n provider={editingProvider}\n orgId={activeOrg?.id}\n error={formError}\n isLoading={isLoading}\n onSave={handleSave}\n onCancel={handleCancel}\n />\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\">SSO Providers</h2>\n <p className=\"cedros-settings-page-description\">\n Configure OIDC identity providers for enterprise single sign-on.\n </p>\n </div>\n <button type=\"button\" className=\"cedros-btn cedros-btn-primary\" onClick={handleAdd}>\n Add Provider\n </button>\n </div>\n\n {error && <ErrorMessage error={error.message} />}\n\n {providers.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No SSO providers configured.</p>\n <p className=\"cedros-text-muted\">\n Add an OIDC provider like Okta, Azure AD, or Auth0 to enable enterprise SSO.\n </p>\n </div>\n ) : (\n <div className=\"cedros-sso-provider-list\">\n {providers.map((provider) => (\n <SsoProviderCard\n key={provider.id}\n provider={provider}\n onEdit={() => handleEdit(provider)}\n onDelete={() => handleDelete(provider)}\n onToggle={() => handleToggle(provider)}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Provider Card\n// =============================================================================\n\ninterface SsoProviderCardProps {\n provider: SsoProvider;\n onEdit: () => void;\n onDelete: () => void;\n onToggle: () => void;\n}\n\nfunction SsoProviderCard({ provider, onEdit, onDelete, onToggle }: SsoProviderCardProps) {\n return (\n <div\n className={`cedros-sso-provider-card ${provider.enabled ? '' : 'cedros-sso-provider-card--disabled'}`}\n >\n <div className=\"cedros-sso-provider-card-header\">\n <div className=\"cedros-sso-provider-card-info\">\n <h3 className=\"cedros-sso-provider-card-name\">{provider.name}</h3>\n <p className=\"cedros-sso-provider-card-issuer\">{provider.issuerUrl}</p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={provider.enabled}\n className={`cedros-toggle ${provider.enabled ? 'cedros-toggle-on' : 'cedros-toggle-off'}`}\n onClick={onToggle}\n >\n <span className=\"cedros-toggle-track\">\n <span className=\"cedros-toggle-thumb\" />\n </span>\n <span className=\"cedros-toggle-label\">{provider.enabled ? 'Enabled' : 'Disabled'}</span>\n </button>\n </div>\n\n <div className=\"cedros-sso-provider-card-details\">\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Client ID</span>\n <code className=\"cedros-sso-provider-card-detail-value\">{provider.clientId}</code>\n </div>\n {provider.emailDomain && (\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Email Domain</span>\n <span className=\"cedros-sso-provider-card-detail-value\">@{provider.emailDomain}</span>\n </div>\n )}\n <div className=\"cedros-sso-provider-card-detail\">\n <span className=\"cedros-sso-provider-card-detail-label\">Registration</span>\n <span className=\"cedros-sso-provider-card-detail-value\">\n {provider.allowRegistration ? 'Allowed' : 'Existing users only'}\n </span>\n </div>\n </div>\n\n <div className=\"cedros-sso-provider-card-actions\">\n <button type=\"button\" className=\"cedros-btn cedros-btn-ghost\" onClick={onEdit}>\n Edit\n </button>\n <button\n type=\"button\"\n className=\"cedros-btn cedros-btn-ghost cedros-btn-danger\"\n onClick={onDelete}\n >\n Delete\n </button>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Provider Form\n// =============================================================================\n\ninterface SsoProviderFormProps {\n provider: SsoProvider | null;\n orgId?: string;\n error: string | null;\n isLoading: boolean;\n onSave: (data: CreateSsoProviderInput | UpdateSsoProviderInput) => void;\n onCancel: () => void;\n}\n\nfunction SsoProviderForm({\n provider,\n orgId,\n error,\n isLoading,\n onSave,\n onCancel,\n}: SsoProviderFormProps) {\n const isEditing = Boolean(provider);\n\n const [name, setName] = useState(provider?.name ?? '');\n const [issuerUrl, setIssuerUrl] = useState(provider?.issuerUrl ?? '');\n const [clientId, setClientId] = useState(provider?.clientId ?? '');\n const [clientSecret, setClientSecret] = useState('');\n const [emailDomain, setEmailDomain] = useState(provider?.emailDomain ?? '');\n const [allowRegistration, setAllowRegistration] = useState(provider?.allowRegistration ?? true);\n const [enabled, setEnabled] = useState(provider?.enabled ?? true);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n if (isEditing) {\n const updates: UpdateSsoProviderInput = {\n name,\n issuerUrl,\n clientId,\n emailDomain: emailDomain || null,\n allowRegistration,\n enabled,\n };\n // Only include secret if changed\n if (clientSecret) {\n updates.clientSecret = clientSecret;\n }\n onSave(updates);\n } else {\n if (!orgId) {\n return;\n }\n const data: CreateSsoProviderInput = {\n orgId,\n name,\n issuerUrl,\n clientId,\n clientSecret,\n emailDomain: emailDomain || null,\n allowRegistration,\n enabled,\n };\n onSave(data);\n }\n },\n [\n isEditing,\n orgId,\n name,\n issuerUrl,\n clientId,\n clientSecret,\n emailDomain,\n allowRegistration,\n enabled,\n onSave,\n ]\n );\n\n return (\n <form className=\"cedros-sso-provider-form\" onSubmit={handleSubmit}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">\n {isEditing ? 'Edit SSO Provider' : 'Add SSO Provider'}\n </h2>\n <p className=\"cedros-settings-page-description\">\n Configure an OIDC identity provider for enterprise single sign-on.\n </p>\n </div>\n </div>\n\n {error && <ErrorMessage error={error} />}\n\n <div className=\"cedros-form-section\">\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-name\">\n Provider Name\n </label>\n <input\n id=\"sso-name\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g., Okta, Azure AD\"\n required\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-issuer\">\n Issuer URL\n </label>\n <input\n id=\"sso-issuer\"\n type=\"url\"\n className=\"cedros-form-input\"\n value={issuerUrl}\n onChange={(e) => setIssuerUrl(e.target.value)}\n placeholder=\"https://your-org.okta.com\"\n required\n />\n <p className=\"cedros-form-hint\">\n The OIDC issuer URL. Must support discovery at /.well-known/openid-configuration\n </p>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-client-id\">\n Client ID\n </label>\n <input\n id=\"sso-client-id\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={clientId}\n onChange={(e) => setClientId(e.target.value)}\n placeholder=\"OAuth client ID\"\n required\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-client-secret\">\n Client Secret{' '}\n {isEditing && (\n <span className=\"cedros-form-hint-inline\">(leave blank to keep current)</span>\n )}\n </label>\n <input\n id=\"sso-client-secret\"\n type=\"password\"\n className=\"cedros-form-input\"\n value={clientSecret}\n onChange={(e) => setClientSecret(e.target.value)}\n placeholder={isEditing ? '••••••••' : 'OAuth client secret'}\n required={!isEditing}\n />\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-label\" htmlFor=\"sso-email-domain\">\n Email Domain (optional)\n </label>\n <input\n id=\"sso-email-domain\"\n type=\"text\"\n className=\"cedros-form-input\"\n value={emailDomain}\n onChange={(e) => setEmailDomain(e.target.value)}\n placeholder=\"company.com\"\n />\n <p className=\"cedros-form-hint\">Restrict to users with emails from this domain</p>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-checkbox\">\n <input\n type=\"checkbox\"\n checked={allowRegistration}\n onChange={(e) => setAllowRegistration(e.target.checked)}\n />\n <span>Allow new user registration via SSO</span>\n </label>\n </div>\n\n <div className=\"cedros-form-group\">\n <label className=\"cedros-form-checkbox\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => setEnabled(e.target.checked)}\n />\n <span>Enable this provider</span>\n </label>\n </div>\n </div>\n\n <div className=\"cedros-form-actions\">\n <button\n type=\"button\"\n className=\"cedros-btn cedros-btn-ghost\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </button>\n <button type=\"submit\" className=\"cedros-btn cedros-btn-primary\" disabled={isLoading}>\n {isLoading ? 'Saving...' : isEditing ? 'Save Changes' : 'Add Provider'}\n </button>\n </div>\n </form>\n );\n}\n","/**\n * Authentication settings page - configure auth providers with tabs\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';\nimport { SsoProvidersSettings } from './SsoProvidersSettings';\n\ntype AuthTab = 'email' | 'google' | 'apple' | 'solana' | 'passkeys' | 'instantlink' | 'sso';\n\ninterface TabConfig {\n id: AuthTab;\n label: string;\n /** Categories to pull settings from (not used for 'sso' tab) */\n categories: string[];\n /** Optional list of specific keys to show (if omitted, show all in categories) */\n keys?: string[];\n /** If true, renders a custom component instead of settings section */\n isCustom?: boolean;\n}\n\nconst TABS: TabConfig[] = [\n { id: 'email', label: 'Email', categories: ['auth.email'],\n keys: ['auth_email_enabled', 'auth_email_require_verification', 'auth_email_block_disposable'] },\n { id: 'google', label: 'Google', categories: ['auth.google'],\n keys: ['auth_google_enabled', 'auth_google_client_id'] },\n { id: 'apple', label: 'Apple', categories: ['auth.apple'],\n keys: ['auth_apple_enabled', 'auth_apple_client_id', 'auth_apple_team_id'] },\n { id: 'solana', label: 'Solana', categories: ['auth.solana'],\n keys: ['auth_solana_enabled', 'auth_solana_challenge_expiry'] },\n { id: 'passkeys', label: 'Passkeys', categories: ['auth.webauthn'],\n keys: ['auth_webauthn_enabled', 'auth_webauthn_rp_id', 'auth_webauthn_rp_name', 'auth_webauthn_rp_origin'] },\n { id: 'instantlink', label: 'Instant Link', categories: ['auth.instantlink'],\n keys: ['auth_instantlink_enabled', 'auth_instantlink_expiry', 'auth_instantlink_rate_limit'] },\n { id: 'sso', label: 'SSO Providers', categories: [], isCustom: true },\n];\n\nexport interface AuthenticationSettingsProps {\n className?: string;\n}\n\nexport function AuthenticationSettings({ className }: AuthenticationSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n const [activeTab, setActiveTab] = useState<AuthTab>('email');\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = TABS.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const allTabSettings = useMemo(() => {\n if (!currentTab) return [];\n const allSettings: (typeof settings)[string] = [];\n for (const category of currentTab.categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n return allSettings;\n }, [settings, currentTab]);\n\n const currentSettings = useMemo(() => {\n if (!currentTab?.keys) return allTabSettings;\n // Filter and sort by keys order\n return allTabSettings\n .filter((s) => currentTab.keys!.includes(s.key))\n .sort((a, b) => currentTab.keys!.indexOf(a.key) - currentTab.keys!.indexOf(b.key));\n }, [allTabSettings, 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\">Authentication</h2>\n <p className=\"cedros-settings-page-description\">\n Configure authentication providers and methods for user sign-in.\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 {TABS.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 {currentTab?.isCustom ? (\n <SsoProvidersSettings />\n ) : currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this provider'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["useSsoProviders","config","_internal","useCedrosLogin","serverUrl","getAccessTokenRef","useRef","providers","setProviders","useState","total","setTotal","isLoading","setIsLoading","error","setError","getHeaders","useCallback","token","fetchProviders","orgId","limit","offset","params","res","err","data","createProvider","input","provider","prev","updateProvider","id","p","deleteProvider","toggleProvider","enabled","SsoProvidersSettings","className","activeOrg","useOrgs","viewMode","setViewMode","editingProvider","setEditingProvider","formError","setFormError","useEffect","handleAdd","handleEdit","handleCancel","handleDelete","handleToggle","handleSave","jsx","LoadingSpinner","SsoProviderForm","jsxs","ErrorMessage","SsoProviderCard","onEdit","onDelete","onToggle","onSave","onCancel","isEditing","name","setName","issuerUrl","setIssuerUrl","clientId","setClientId","clientSecret","setClientSecret","emailDomain","setEmailDomain","allowRegistration","setAllowRegistration","setEnabled","handleSubmit","e","updates","TABS","AuthenticationSettings","settings","edits","autosaveStatus","autosaveError","fetchSettings","handleChange","useSettingsAutosave","activeTab","setActiveTab","currentTab","t","allTabSettings","useMemo","allSettings","category","categorySettings","currentSettings","s","a","b","AutosaveStatus","tab","SettingsSection"],"mappings":";;;;;;;AAkDO,SAASA,IAAkB;AAChC,QAAM,EAAE,QAAAC,GAAQ,WAAAC,EAAA,IAAcC,EAAA,GACxBC,IAAYH,EAAO,WAInBI,IAAoBC,EAAOJ,GAAW,mBAAmB,MAAM,KAAK;AAC1E,EAAAG,EAAkB,UAAUH,GAAW,mBAAmB,MAAM;AAEhE,QAAM,CAACK,GAAWC,CAAY,IAAIC,EAAwB,CAAA,CAAE,GACtD,CAACC,GAAOC,CAAQ,IAAIF,EAAS,CAAC,GAC9B,CAACG,GAAWC,CAAY,IAAIJ,EAAS,EAAK,GAC1C,CAACK,GAAOC,CAAQ,IAAIN,EAAuB,IAAI,GAG/CO,IAAaC,EAAY,MAAM;AACnC,UAAMC,IAAQb,EAAkB,QAAA;AAChC,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,GAAIa,IAAQ,EAAE,eAAe,UAAUA,CAAK,OAAO,CAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAA,CAAE,GAECC,IAAiBF;AAAA,IACrB,OAAOG,GAAgBC,IAAQ,IAAIC,IAAS,MAAM;AAChD,MAAAT,EAAa,EAAI,GACjBE,EAAS,IAAI;AACb,UAAI;AACF,cAAMQ,IAAS,IAAI,gBAAA;AACnB,QAAIH,KAAOG,EAAO,IAAI,UAAUH,CAAK,GACrCG,EAAO,IAAI,SAAS,OAAOF,CAAK,CAAC,GACjCE,EAAO,IAAI,UAAU,OAAOD,CAAM,CAAC;AAEnC,cAAME,IAAM,MAAM,MAAM,GAAGpB,CAAS,wBAAwBmB,CAAM,IAAI;AAAA,UACpE,SAASP,EAAA;AAAA,QAAW,CACrB;AAED,YAAI,CAACQ,EAAI,IAAI;AACX,gBAAMC,IAAM,MAAMD,EAAI,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AAC7C,gBAAM,IAAI,MAAMC,EAAI,SAAS,kCAAkCD,EAAI,MAAM,EAAE;AAAA,QAC7E;AAEA,cAAME,IAAqB,MAAMF,EAAI,KAAA;AACrC,eAAAhB,EAAakB,EAAK,SAAS,GAC3Bf,EAASe,EAAK,KAAK,GACZA;AAAA,MACT,SAASD,GAAK;AACZ,cAAMX,IAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,cAAAV,EAASD,CAAK,GACRA;AAAAA,MACR,UAAA;AACE,QAAAD,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACT,GAAWY,CAAU;AAAA,EAAA,GAGlBW,IAAiBV;AAAA,IACrB,OAAOW,MAAwD;AAC7D,MAAAf,EAAa,EAAI,GACjBE,EAAS,IAAI;AACb,UAAI;AACF,cAAMS,IAAM,MAAM,MAAM,GAAGpB,CAAS,wBAAwB;AAAA,UAC1D,QAAQ;AAAA,UACR,SAASY,EAAA;AAAA,UACT,MAAM,KAAK,UAAUY,CAAK;AAAA,QAAA,CAC3B;AAED,YAAI,CAACJ,EAAI,IAAI;AACX,gBAAMC,IAAM,MAAMD,EAAI,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AAC7C,gBAAM,IAAI,MAAMC,EAAI,SAAS,kCAAkCD,EAAI,MAAM,EAAE;AAAA,QAC7E;AAEA,cAAMK,IAAwB,MAAML,EAAI,KAAA;AACxC,eAAAhB,EAAa,CAACsB,MAAS,CAAC,GAAGA,GAAMD,CAAQ,CAAC,GAC1ClB,EAAS,CAACmB,MAASA,IAAO,CAAC,GACpBD;AAAA,MACT,SAASJ,GAAK;AACZ,cAAMX,IAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,cAAAV,EAASD,CAAK,GACRA;AAAAA,MACR,UAAA;AACE,QAAAD,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACT,GAAWY,CAAU;AAAA,EAAA,GAGlBe,IAAiBd;AAAA,IACrB,OAAOe,GAAYJ,MAAwD;AACzE,MAAAf,EAAa,EAAI,GACjBE,EAAS,IAAI;AACb,UAAI;AACF,cAAMS,IAAM,MAAM,MAAM,GAAGpB,CAAS,wBAAwB4B,CAAE,IAAI;AAAA,UAChE,QAAQ;AAAA,UACR,SAAShB,EAAA;AAAA,UACT,MAAM,KAAK,UAAUY,CAAK;AAAA,QAAA,CAC3B;AAED,YAAI,CAACJ,EAAI,IAAI;AACX,gBAAMC,IAAM,MAAMD,EAAI,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AAC7C,gBAAM,IAAI,MAAMC,EAAI,SAAS,kCAAkCD,EAAI,MAAM,EAAE;AAAA,QAC7E;AAEA,cAAMK,IAAwB,MAAML,EAAI,KAAA;AACxC,eAAAhB,EAAa,CAACsB,MAASA,EAAK,IAAI,CAACG,MAAOA,EAAE,OAAOD,IAAKH,IAAWI,CAAE,CAAC,GAC7DJ;AAAA,MACT,SAASJ,GAAK;AACZ,cAAMX,IAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,cAAAV,EAASD,CAAK,GACRA;AAAAA,MACR,UAAA;AACE,QAAAD,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACT,GAAWY,CAAU;AAAA,EAAA,GAGlBkB,IAAiBjB;AAAA,IACrB,OAAOe,MAA8B;AACnC,MAAAnB,EAAa,EAAI,GACjBE,EAAS,IAAI;AACb,UAAI;AACF,cAAMS,IAAM,MAAM,MAAM,GAAGpB,CAAS,wBAAwB4B,CAAE,IAAI;AAAA,UAChE,QAAQ;AAAA,UACR,SAAShB,EAAA;AAAA,QAAW,CACrB;AAED,YAAI,CAACQ,EAAI,IAAI;AACX,gBAAMC,IAAM,MAAMD,EAAI,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AAC7C,gBAAM,IAAI,MAAMC,EAAI,SAAS,kCAAkCD,EAAI,MAAM,EAAE;AAAA,QAC7E;AAEA,QAAAhB,EAAa,CAACsB,MAASA,EAAK,OAAO,CAACG,MAAMA,EAAE,OAAOD,CAAE,CAAC,GACtDrB,EAAS,CAACmB,MAASA,IAAO,CAAC;AAAA,MAC7B,SAASL,GAAK;AACZ,cAAMX,IAAQW,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC;AAChE,cAAAV,EAASD,CAAK,GACRA;AAAAA,MACR,UAAA;AACE,QAAAD,EAAa,EAAK;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAACT,GAAWY,CAAU;AAAA,EAAA,GAGlBmB,IAAiBlB;AAAA,IACrB,OAAOe,GAAYI,MACVL,EAAeC,GAAI,EAAE,SAAAI,GAAS;AAAA,IAEvC,CAACL,CAAc;AAAA,EAAA;AAGjB,SAAO;AAAA,IACL,WAAAxB;AAAA,IACA,OAAAG;AAAA,IACA,WAAAE;AAAA,IACA,OAAAE;AAAA,IACA,gBAAAK;AAAA,IACA,gBAAAQ;AAAA,IACA,gBAAAI;AAAA,IACA,gBAAAG;AAAA,IACA,gBAAAC;AAAA,EAAA;AAEJ;AClMO,SAASE,EAAqB,EAAE,WAAAC,KAAwC;AAC7E,QAAM;AAAA,IACJ,WAAA/B;AAAA,IACA,WAAAK;AAAA,IACA,OAAAE;AAAA,IACA,gBAAAK;AAAA,IACA,gBAAAQ;AAAA,IACA,gBAAAI;AAAA,IACA,gBAAAG;AAAA,IACA,gBAAAC;AAAA,EAAA,IACEnC,EAAA,GAEE,EAAE,WAAAuC,EAAA,IAAcC,EAAA,GAChB,CAACC,GAAUC,CAAW,IAAIjC,EAAmB,MAAM,GACnD,CAACkC,GAAiBC,CAAkB,IAAInC,EAA6B,IAAI,GACzE,CAACoC,GAAWC,CAAY,IAAIrC,EAAwB,IAAI;AAE9D,EAAAsC,EAAU,MAAM;AACd,IAAA5B,EAAeoB,GAAW,EAAE;AAAA,EAC9B,GAAG,CAACpB,GAAgBoB,GAAW,EAAE,CAAC;AAElC,QAAMS,IAAY,MAAM;AACtB,IAAAJ,EAAmB,IAAI,GACvBE,EAAa,IAAI,GACjBJ,EAAY,KAAK;AAAA,EACnB,GAEMO,IAAa,CAACpB,MAA0B;AAC5C,IAAAe,EAAmBf,CAAQ,GAC3BiB,EAAa,IAAI,GACjBJ,EAAY,MAAM;AAAA,EACpB,GAEMQ,IAAe,MAAM;AACzB,IAAAR,EAAY,MAAM,GAClBE,EAAmB,IAAI,GACvBE,EAAa,IAAI;AAAA,EACnB,GAEMK,IAAe,OAAOtB,MAA0B;AACpD,QAAK,QAAQ,wBAAwBA,EAAS,IAAI,2BAA2B;AAG7E,UAAI;AACF,cAAMK,EAAeL,EAAS,EAAE;AAAA,MAClC,QAAQ;AAAA,MAER;AAAA,EACF,GAEMuB,IAAe,OAAOvB,MAA0B;AACpD,QAAI;AACF,YAAMM,EAAeN,EAAS,IAAI,CAACA,EAAS,OAAO;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF,GAEMwB,IAAa,OAAO3B,MAA0D;AAClF,IAAAoB,EAAa,IAAI;AACjB,QAAI;AACF,MAAIL,MAAa,QACf,MAAMd,EAAeD,CAA8B,IAC1CiB,KACT,MAAMZ,EAAeY,EAAgB,IAAIjB,CAA8B,GAEzEgB,EAAY,MAAM,GAClBE,EAAmB,IAAI;AAAA,IACzB,SAASnB,GAAK;AACZ,MAAAqB,EAAarB,aAAe,QAAQA,EAAI,UAAU,yBAAyB;AAAA,IAC7E;AAAA,EACF;AAEA,SAAIb,KAAaL,EAAU,WAAW,sBAEjC,OAAA,EAAI,WAAW,yDAAyD+B,KAAa,EAAE,IACtF,UAAA;AAAA,IAAA,gBAAAgB,EAACC,GAAA,EAAe;AAAA,IAChB,gBAAAD,EAAC,UAAK,UAAA,2BAAA,CAAwB;AAAA,EAAA,GAChC,IAIAb,MAAa,SAASA,MAAa,2BAElC,OAAA,EAAI,WAAW,0BAA0BH,KAAa,EAAE,IACvD,UAAA,gBAAAgB;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,UAAUb;AAAA,MACV,OAAOJ,GAAW;AAAA,MAClB,OAAOM;AAAA,MACP,WAAAjC;AAAA,MACA,QAAQyC;AAAA,MACR,UAAUH;AAAA,IAAA;AAAA,EAAA,GAEd,sBAKD,OAAA,EAAI,WAAW,0BAA0BZ,KAAa,EAAE,IACvD,UAAA;AAAA,IAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,8BAA6B,UAAA,iBAAa;AAAA,QACxD,gBAAAA,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA,mEAAA,CAEhD;AAAA,MAAA,GACF;AAAA,MACA,gBAAAA,EAAC,YAAO,MAAK,UAAS,WAAU,iCAAgC,SAASN,GAAW,UAAA,eAAA,CAEpF;AAAA,IAAA,GACF;AAAA,IAEClC,KAAS,gBAAAwC,EAACI,GAAA,EAAa,OAAO5C,EAAM,SAAS;AAAA,IAE7CP,EAAU,WAAW,IACpB,gBAAAkD,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAH,EAAC,OAAE,UAAA,+BAAA,CAA4B;AAAA,MAC/B,gBAAAA,EAAC,KAAA,EAAE,WAAU,qBAAoB,UAAA,+EAAA,CAEjC;AAAA,IAAA,EAAA,CACF,sBAEC,OAAA,EAAI,WAAU,4BACZ,UAAA/C,EAAU,IAAI,CAACsB,MACd,gBAAAyB;AAAA,MAACK;AAAA,MAAA;AAAA,QAEC,UAAA9B;AAAA,QACA,QAAQ,MAAMoB,EAAWpB,CAAQ;AAAA,QACjC,UAAU,MAAMsB,EAAatB,CAAQ;AAAA,QACrC,UAAU,MAAMuB,EAAavB,CAAQ;AAAA,MAAA;AAAA,MAJhCA,EAAS;AAAA,IAAA,CAMjB,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAaA,SAAS8B,EAAgB,EAAE,UAAA9B,GAAU,QAAA+B,GAAQ,UAAAC,GAAU,UAAAC,KAAkC;AACvF,SACE,gBAAAL;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,4BAA4B5B,EAAS,UAAU,KAAK,oCAAoC;AAAA,MAEnG,UAAA;AAAA,QAAA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,YAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,iCAAiC,UAAAzB,EAAS,MAAK;AAAA,YAC7D,gBAAAyB,EAAC,KAAA,EAAE,WAAU,mCAAmC,YAAS,UAAA,CAAU;AAAA,UAAA,GACrE;AAAA,UACA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,gBAAc5B,EAAS;AAAA,cACvB,WAAW,iBAAiBA,EAAS,UAAU,qBAAqB,mBAAmB;AAAA,cACvF,SAASiC;AAAA,cAET,UAAA;AAAA,gBAAA,gBAAAR,EAAC,UAAK,WAAU,uBACd,4BAAC,QAAA,EAAK,WAAU,uBAAsB,EAAA,CACxC;AAAA,kCACC,QAAA,EAAK,WAAU,uBAAuB,UAAAzB,EAAS,UAAU,YAAY,WAAA,CAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACnF,GACF;AAAA,QAEA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,YAAA,gBAAAH,EAAC,QAAA,EAAK,WAAU,yCAAwC,UAAA,aAAS;AAAA,YACjE,gBAAAA,EAAC,QAAA,EAAK,WAAU,yCAAyC,YAAS,SAAA,CAAS;AAAA,UAAA,GAC7E;AAAA,UACCzB,EAAS,eACR,gBAAA4B,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,YAAA,gBAAAH,EAAC,QAAA,EAAK,WAAU,yCAAwC,UAAA,gBAAY;AAAA,YACpE,gBAAAG,EAAC,QAAA,EAAK,WAAU,yCAAwC,UAAA;AAAA,cAAA;AAAA,cAAE5B,EAAS;AAAA,YAAA,EAAA,CAAY;AAAA,UAAA,GACjF;AAAA,UAEF,gBAAA4B,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,YAAA,gBAAAH,EAAC,QAAA,EAAK,WAAU,yCAAwC,UAAA,gBAAY;AAAA,8BACnE,QAAA,EAAK,WAAU,yCACb,UAAAzB,EAAS,oBAAoB,YAAY,sBAAA,CAC5C;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GACF;AAAA,QAEA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,UAAA,gBAAAH,EAAC,YAAO,MAAK,UAAS,WAAU,+BAA8B,SAASM,GAAQ,UAAA,OAAA,CAE/E;AAAA,UACA,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAASO;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAeA,SAASL,EAAgB;AAAA,EACvB,UAAA3B;AAAA,EACA,OAAAT;AAAA,EACA,OAAAN;AAAA,EACA,WAAAF;AAAA,EACA,QAAAmD;AAAA,EACA,UAAAC;AACF,GAAyB;AACvB,QAAMC,IAAY,EAAQpC,GAEpB,CAACqC,GAAMC,CAAO,IAAI1D,EAASoB,GAAU,QAAQ,EAAE,GAC/C,CAACuC,GAAWC,CAAY,IAAI5D,EAASoB,GAAU,aAAa,EAAE,GAC9D,CAACyC,GAAUC,CAAW,IAAI9D,EAASoB,GAAU,YAAY,EAAE,GAC3D,CAAC2C,GAAcC,CAAe,IAAIhE,EAAS,EAAE,GAC7C,CAACiE,GAAaC,CAAc,IAAIlE,EAASoB,GAAU,eAAe,EAAE,GACpE,CAAC+C,GAAmBC,CAAoB,IAAIpE,EAASoB,GAAU,qBAAqB,EAAI,GACxF,CAACO,GAAS0C,CAAU,IAAIrE,EAASoB,GAAU,WAAW,EAAI,GAE1DkD,IAAe9D;AAAA,IACnB,CAAC+D,MAAuB;AAGtB,UAFAA,EAAE,eAAA,GAEEf,GAAW;AACb,cAAMgB,IAAkC;AAAA,UACtC,MAAAf;AAAA,UACA,WAAAE;AAAA,UACA,UAAAE;AAAA,UACA,aAAaI,KAAe;AAAA,UAC5B,mBAAAE;AAAA,UACA,SAAAxC;AAAA,QAAA;AAGF,QAAIoC,MACFS,EAAQ,eAAeT,IAEzBT,EAAOkB,CAAO;AAAA,MAChB,OAAO;AACL,YAAI,CAAC7D;AACH;AAYF,QAAA2C,EAVqC;AAAA,UACnC,OAAA3C;AAAA,UACA,MAAA8C;AAAA,UACA,WAAAE;AAAA,UACA,UAAAE;AAAA,UACA,cAAAE;AAAA,UACA,aAAaE,KAAe;AAAA,UAC5B,mBAAAE;AAAA,UACA,SAAAxC;AAAA,QAAA,CAES;AAAA,MACb;AAAA,IACF;AAAA,IACA;AAAA,MACE6B;AAAA,MACA7C;AAAA,MACA8C;AAAA,MACAE;AAAA,MACAE;AAAA,MACAE;AAAA,MACAE;AAAA,MACAE;AAAA,MACAxC;AAAA,MACA2B;AAAA,IAAA;AAAA,EACF;AAGF,SACE,gBAAAN,EAAC,QAAA,EAAK,WAAU,4BAA2B,UAAUsB,GACnD,UAAA;AAAA,IAAA,gBAAAzB,EAAC,SAAI,WAAU,+BACb,UAAA,gBAAAG,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,8BACX,UAAAW,IAAY,sBAAsB,oBACrC;AAAA,MACA,gBAAAX,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA,qEAAA,CAEhD;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAECxC,KAAS,gBAAAwC,EAACI,GAAA,EAAa,OAAA5C,EAAA,CAAc;AAAA,IAEtC,gBAAA2C,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,SAAA,EAAM,WAAU,qBAAoB,SAAQ,YAAW,UAAA,iBAExD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOY;AAAA,YACP,UAAU,CAACc,MAAMb,EAAQa,EAAE,OAAO,KAAK;AAAA,YACvC,aAAY;AAAA,YACZ,UAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,GACF;AAAA,MAEA,gBAAAvB,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,SAAA,EAAM,WAAU,qBAAoB,SAAQ,cAAa,UAAA,cAE1D;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOc;AAAA,YACP,UAAU,CAACY,MAAMX,EAAaW,EAAE,OAAO,KAAK;AAAA,YAC5C,aAAY;AAAA,YACZ,UAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAEV,gBAAA1B,EAAC,KAAA,EAAE,WAAU,oBAAmB,UAAA,mFAAA,CAEhC;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAG,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,SAAA,EAAM,WAAU,qBAAoB,SAAQ,iBAAgB,UAAA,aAE7D;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOgB;AAAA,YACP,UAAU,CAACU,MAAMT,EAAYS,EAAE,OAAO,KAAK;AAAA,YAC3C,aAAY;AAAA,YACZ,UAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACV,GACF;AAAA,MAEA,gBAAAvB,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,SAAA,EAAM,WAAU,qBAAoB,SAAQ,qBAAoB,UAAA;AAAA,UAAA;AAAA,UACjD;AAAA,UACbQ,KACC,gBAAAX,EAAC,QAAA,EAAK,WAAU,2BAA0B,UAAA,gCAAA,CAA6B;AAAA,QAAA,GAE3E;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOkB;AAAA,YACP,UAAU,CAACQ,MAAMP,EAAgBO,EAAE,OAAO,KAAK;AAAA,YAC/C,aAAaf,IAAY,aAAa;AAAA,YACtC,UAAU,CAACA;AAAA,UAAA;AAAA,QAAA;AAAA,MACb,GACF;AAAA,MAEA,gBAAAR,EAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,SAAA,EAAM,WAAU,qBAAoB,SAAQ,oBAAmB,UAAA,2BAEhE;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,WAAU;AAAA,YACV,OAAOoB;AAAA,YACP,UAAU,CAACM,MAAML,EAAeK,EAAE,OAAO,KAAK;AAAA,YAC9C,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAA1B,EAAC,KAAA,EAAE,WAAU,oBAAmB,UAAA,iDAAA,CAA8C;AAAA,MAAA,GAChF;AAAA,wBAEC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAG,EAAC,SAAA,EAAM,WAAU,wBACf,UAAA;AAAA,QAAA,gBAAAH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAASsB;AAAA,YACT,UAAU,CAACI,MAAMH,EAAqBG,EAAE,OAAO,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAExD,gBAAA1B,EAAC,UAAK,UAAA,sCAAA,CAAmC;AAAA,MAAA,EAAA,CAC3C,EAAA,CACF;AAAA,wBAEC,OAAA,EAAI,WAAU,qBACb,UAAA,gBAAAG,EAAC,SAAA,EAAM,WAAU,wBACf,UAAA;AAAA,QAAA,gBAAAH;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAASlB;AAAA,YACT,UAAU,CAAC4C,MAAMF,EAAWE,EAAE,OAAO,OAAO;AAAA,UAAA;AAAA,QAAA;AAAA,QAE9C,gBAAA1B,EAAC,UAAK,UAAA,uBAAA,CAAoB;AAAA,MAAA,EAAA,CAC5B,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAG,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,MAAA,gBAAAH;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAASU;AAAA,UACT,UAAUpD;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAA0C,EAAC,UAAA,EAAO,MAAK,UAAS,WAAU,iCAAgC,UAAU1C,GACvE,UAAAA,IAAY,cAAcqD,IAAY,iBAAiB,eAAA,CAC1D;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;AClaA,MAAMiB,IAAoB;AAAA,EACxB;AAAA,IAAE,IAAI;AAAA,IAAS,OAAO;AAAA,IAAS,YAAY,CAAC,YAAY;AAAA,IACtD,MAAM,CAAC,sBAAsB,mCAAmC,6BAA6B;AAAA,EAAA;AAAA,EAC/F;AAAA,IAAE,IAAI;AAAA,IAAU,OAAO;AAAA,IAAU,YAAY,CAAC,aAAa;AAAA,IACzD,MAAM,CAAC,uBAAuB,uBAAuB;AAAA,EAAA;AAAA,EACvD;AAAA,IAAE,IAAI;AAAA,IAAS,OAAO;AAAA,IAAS,YAAY,CAAC,YAAY;AAAA,IACtD,MAAM,CAAC,sBAAsB,wBAAwB,oBAAoB;AAAA,EAAA;AAAA,EAC3E;AAAA,IAAE,IAAI;AAAA,IAAU,OAAO;AAAA,IAAU,YAAY,CAAC,aAAa;AAAA,IACzD,MAAM,CAAC,uBAAuB,8BAA8B;AAAA,EAAA;AAAA,EAC9D;AAAA,IAAE,IAAI;AAAA,IAAY,OAAO;AAAA,IAAY,YAAY,CAAC,eAAe;AAAA,IAC/D,MAAM,CAAC,yBAAyB,uBAAuB,yBAAyB,yBAAyB;AAAA,EAAA;AAAA,EAC3G;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAgB,YAAY,CAAC,kBAAkB;AAAA,IACzE,MAAM,CAAC,4BAA4B,2BAA2B,6BAA6B;AAAA,EAAA;AAAA,EAC7F,EAAE,IAAI,OAAO,OAAO,iBAAiB,YAAY,CAAA,GAAI,UAAU,GAAA;AACjE;AAMO,SAASC,EAAuB,EAAE,WAAA7C,KAA0C;AACjF,QAAM;AAAA,IACJ,UAAA8C;AAAA,IACA,OAAAC;AAAA,IACA,WAAAzE;AAAA,IACA,gBAAA0E;AAAA,IACA,eAAAC;AAAA,IACA,OAAAzE;AAAA,IACA,eAAA0E;AAAA,IACA,cAAAC;AAAA,EAAA,IACEC,EAAA,GAEE,CAACC,GAAWC,CAAY,IAAInF,EAAkB,OAAO;AAE3D,EAAAsC,EAAU,MAAM;AACd,IAAAyC,EAAA;AAAA,EACF,GAAG,CAACA,CAAa,CAAC;AAGlB,QAAMK,IAAaX,EAAK,KAAK,CAACY,MAAMA,EAAE,OAAOH,CAAS,GAGhDI,IAAiBC,EAAQ,MAAM;AACnC,QAAI,CAACH,EAAY,QAAO,CAAA;AACxB,UAAMI,IAAyC,CAAA;AAC/C,eAAWC,KAAYL,EAAW,YAAY;AAC5C,YAAMM,IAAmBf,EAASc,CAAQ,KAAK,CAAA;AAC/C,MAAAD,EAAY,KAAK,GAAGE,CAAgB;AAAA,IACtC;AACA,WAAOF;AAAA,EACT,GAAG,CAACb,GAAUS,CAAU,CAAC,GAEnBO,IAAkBJ,EAAQ,MACzBH,GAAY,OAEVE,EACJ,OAAO,CAACM,MAAMR,EAAW,KAAM,SAASQ,EAAE,GAAG,CAAC,EAC9C,KAAK,CAACC,GAAGC,MAAMV,EAAW,KAAM,QAAQS,EAAE,GAAG,IAAIT,EAAW,KAAM,QAAQU,EAAE,GAAG,CAAC,IAJrDR,GAK7B,CAACA,GAAgBF,CAAU,CAAC;AAE/B,SAAIjF,KAAa,OAAO,KAAKwE,CAAQ,EAAE,WAAW,sBAE7C,OAAA,EAAI,WAAW,yDAAyD9C,KAAa,EAAE,IACtF,UAAA;AAAA,IAAA,gBAAAgB,EAACC,GAAA,EAAe;AAAA,IAChB,gBAAAD,EAAC,UAAK,UAAA,sBAAA,CAAmB;AAAA,EAAA,GAC3B,IAIAxC,IAEA,gBAAAwC,EAAC,OAAA,EAAI,WAAW,0BAA0BhB,KAAa,EAAE,IACvD,UAAA,gBAAAgB,EAACI,GAAA,EAAa,OAAO5C,EAAM,QAAA,CAAS,GACtC,sBAKD,OAAA,EAAI,WAAW,0BAA0BwB,KAAa,EAAE,IACvD,UAAA;AAAA,IAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,8BAA6B,UAAA,kBAAc;AAAA,QACzD,gBAAAA,EAAC,KAAA,EAAE,WAAU,oCAAmC,UAAA,mEAAA,CAEhD;AAAA,MAAA,GACF;AAAA,MACA,gBAAAA,EAACkD,GAAA,EAAe,QAAQlB,GAAgB,OAAOC,EAAA,CAAe;AAAA,IAAA,GAChE;AAAA,sBAGC,OAAA,EAAI,WAAU,6CACZ,UAAAL,EAAK,IAAI,CAACuB,MACT,gBAAAnD;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,oBAAoBqC,MAAcc,EAAI,KAAK,4BAA4B,EAAE;AAAA,QACpF,SAAS,MAAMb,EAAaa,EAAI,EAAE;AAAA,QAClC,iBAAed,MAAcc,EAAI;AAAA,QACjC,MAAK;AAAA,QAEJ,UAAAA,EAAI;AAAA,MAAA;AAAA,MAPAA,EAAI;AAAA,IAAA,CASZ,GACH;AAAA,sBAGC,OAAA,EAAI,WAAU,4BAA2B,MAAK,YAC5C,aAAY,WACX,gBAAAnD,EAACjB,KAAqB,IACpB+D,EAAgB,WAAW,IAC7B,gBAAA9C,EAAC,SAAI,WAAU,gCACb,4BAAC,KAAA,EAAE,UAAA;AAAA,MAAA;AAAA,MAAuBuC,GAAY,SAAS;AAAA,MAAgB;AAAA,IAAA,EAAA,CAAC,EAAA,CAClE,IAEA,gBAAAvC,EAACoD,GAAA,EAAgB,UAAUN,GAAiB,OAAAf,GAAc,UAAUI,EAAA,CAAc,EAAA,CAEtF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime");require("react");const e=require("./AuthenticationSettings-HhrUAmM6.cjs");function i(){return t.jsx("div",{className:"cedros-dashboard__section",children:t.jsx(e.AuthenticationSettings,{})})}exports.default=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime");require("react");const e=require("./AuthenticationSettings-Cu0S0Z7s.cjs");function i(){return t.jsx("div",{className:"cedros-dashboard__section",children:t.jsx(e.AuthenticationSettings,{})})}exports.default=i;
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticationSettings-CjGGqbcS.cjs","sources":["../src/admin/sections/AuthenticationSettings.tsx"],"sourcesContent":["/**\n * Authentication Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { AuthenticationSettings as Settings } from '../../components/admin/settings';\n\nexport default function AuthenticationSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["AuthenticationSettings","jsx","Settings"],"mappings":"+LAOA,SAAwBA,GAA4C,CAClE,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,yBAAS,EACZ,CAEJ"}
1
+ {"version":3,"file":"AuthenticationSettings-Cb80XWPm.cjs","sources":["../src/admin/sections/AuthenticationSettings.tsx"],"sourcesContent":["/**\n * Authentication Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { AuthenticationSettings as Settings } from '../../components/admin/settings';\n\nexport default function AuthenticationSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["AuthenticationSettings","jsx","Settings"],"mappings":"+LAOA,SAAwBA,GAA4C,CAClE,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,yBAAS,EACZ,CAEJ"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
2
  import "react";
3
- import { A as i } from "./AuthenticationSettings-Dg6ATgOl.js";
3
+ import { A as i } from "./AuthenticationSettings-BipaLyGg.js";
4
4
  function r() {
5
5
  return /* @__PURE__ */ t("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ t(i, {}) });
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticationSettings-DGWktSVw.js","sources":["../src/admin/sections/AuthenticationSettings.tsx"],"sourcesContent":["/**\n * Authentication Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { AuthenticationSettings as Settings } from '../../components/admin/settings';\n\nexport default function AuthenticationSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["AuthenticationSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAA4C;AAClE,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
1
+ {"version":3,"file":"AuthenticationSettings-Cfn0No6U.js","sources":["../src/admin/sections/AuthenticationSettings.tsx"],"sourcesContent":["/**\n * Authentication Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { AuthenticationSettings as Settings } from '../../components/admin/settings';\n\nexport default function AuthenticationSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["AuthenticationSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAA4C;AAClE,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
@@ -1 +1 @@
1
- "use strict";const e=require("react/jsx-runtime"),o=require("react"),O=require("./LoadingSpinner-d6sSxgQN.cjs"),C=require("./ErrorMessage-CHbYbVi2.cjs"),w=require("./AutosaveStatus-BDWxAg4U.cjs"),P=require("./useCedrosLogin-C9MrcZvh.cjs"),D=require("./useOrgs-DDVRCaVi.cjs");function $(){const{config:n,_internal:g}=P.useCedrosLogin(),u=n.serverUrl,x=o.useRef(g?.getAccessToken??(()=>null));x.current=g?.getAccessToken??(()=>null);const[j,S]=o.useState([]),[v,f]=o.useState(0),[k,c]=o.useState(!1),[y,r]=o.useState(null),h=o.useCallback(()=>{const d=x.current();return{"Content-Type":"application/json",...d?{Authorization:`Bearer ${d}`}:{}}},[]),p=o.useCallback(async(d,t=50,a=0)=>{c(!0),r(null);try{const i=new URLSearchParams;d&&i.set("org_id",d),i.set("limit",String(t)),i.set("offset",String(a));const s=await fetch(`${u}/admin/sso-providers?${i}`,{headers:h()});if(!s.ok){const A=await s.json().catch(()=>({}));throw new Error(A.error||`Failed to fetch SSO providers: ${s.status}`)}const b=await s.json();return S(b.providers),f(b.total),b}catch(i){const s=i instanceof Error?i:new Error(String(i));throw r(s),s}finally{c(!1)}},[u,h]),l=o.useCallback(async d=>{c(!0),r(null);try{const t=await fetch(`${u}/admin/sso-providers`,{method:"POST",headers:h(),body:JSON.stringify(d)});if(!t.ok){const i=await t.json().catch(()=>({}));throw new Error(i.error||`Failed to create SSO provider: ${t.status}`)}const a=await t.json();return S(i=>[...i,a]),f(i=>i+1),a}catch(t){const a=t instanceof Error?t:new Error(String(t));throw r(a),a}finally{c(!1)}},[u,h]),m=o.useCallback(async(d,t)=>{c(!0),r(null);try{const a=await fetch(`${u}/admin/sso-providers/${d}`,{method:"PUT",headers:h(),body:JSON.stringify(t)});if(!a.ok){const s=await a.json().catch(()=>({}));throw new Error(s.error||`Failed to update SSO provider: ${a.status}`)}const i=await a.json();return S(s=>s.map(b=>b.id===d?i:b)),i}catch(a){const i=a instanceof Error?a:new Error(String(a));throw r(i),i}finally{c(!1)}},[u,h]),_=o.useCallback(async d=>{c(!0),r(null);try{const t=await fetch(`${u}/admin/sso-providers/${d}`,{method:"DELETE",headers:h()});if(!t.ok){const a=await t.json().catch(()=>({}));throw new Error(a.error||`Failed to delete SSO provider: ${t.status}`)}S(a=>a.filter(i=>i.id!==d)),f(a=>a-1)}catch(t){const a=t instanceof Error?t:new Error(String(t));throw r(a),a}finally{c(!1)}},[u,h]),N=o.useCallback(async(d,t)=>m(d,{enabled:t}),[m]);return{providers:j,total:v,isLoading:k,error:y,fetchProviders:p,createProvider:l,updateProvider:m,deleteProvider:_,toggleProvider:N}}function T({className:n}){const{providers:g,isLoading:u,error:x,fetchProviders:j,createProvider:S,updateProvider:v,deleteProvider:f,toggleProvider:k}=$(),{activeOrg:c}=D.useOrgs(),[y,r]=o.useState("list"),[h,p]=o.useState(null),[l,m]=o.useState(null);o.useEffect(()=>{j(c?.id)},[j,c?.id]);const _=()=>{p(null),m(null),r("add")},N=s=>{p(s),m(null),r("edit")},d=()=>{r("list"),p(null),m(null)},t=async s=>{if(confirm(`Delete SSO provider "${s.name}"? This cannot be undone.`))try{await f(s.id)}catch{}},a=async s=>{try{await k(s.id,!s.enabled)}catch{}},i=async s=>{m(null);try{y==="add"?await S(s):h&&await v(h.id,s),r("list"),p(null)}catch(b){m(b instanceof Error?b.message:"Failed to save provider")}};return u&&g.length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(O.LoadingSpinner,{}),e.jsx("span",{children:"Loading SSO providers..."})]}):y==="add"||y==="edit"?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(I,{provider:h,orgId:c?.id,error:l,isLoading:u,onSave:i,onCancel:d})}):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:"SSO Providers"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure OIDC identity providers for enterprise single sign-on."})]}),e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-primary",onClick:_,children:"Add Provider"})]}),x&&e.jsx(C.ErrorMessage,{error:x.message}),g.length===0?e.jsxs("div",{className:"cedros-system-settings-empty",children:[e.jsx("p",{children:"No SSO providers configured."}),e.jsx("p",{className:"cedros-text-muted",children:"Add an OIDC provider like Okta, Azure AD, or Auth0 to enable enterprise SSO."})]}):e.jsx("div",{className:"cedros-sso-provider-list",children:g.map(s=>e.jsx(L,{provider:s,onEdit:()=>N(s),onDelete:()=>t(s),onToggle:()=>a(s)},s.id))})]})}function L({provider:n,onEdit:g,onDelete:u,onToggle:x}){return e.jsxs("div",{className:`cedros-sso-provider-card ${n.enabled?"":"cedros-sso-provider-card--disabled"}`,children:[e.jsxs("div",{className:"cedros-sso-provider-card-header",children:[e.jsxs("div",{className:"cedros-sso-provider-card-info",children:[e.jsx("h3",{className:"cedros-sso-provider-card-name",children:n.name}),e.jsx("p",{className:"cedros-sso-provider-card-issuer",children:n.issuerUrl})]}),e.jsxs("button",{type:"button",role:"switch","aria-checked":n.enabled,className:`cedros-toggle ${n.enabled?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:x,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:n.enabled?"Enabled":"Disabled"})]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-details",children:[e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Client ID"}),e.jsx("code",{className:"cedros-sso-provider-card-detail-value",children:n.clientId})]}),n.emailDomain&&e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Email Domain"}),e.jsxs("span",{className:"cedros-sso-provider-card-detail-value",children:["@",n.emailDomain]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Registration"}),e.jsx("span",{className:"cedros-sso-provider-card-detail-value",children:n.allowRegistration?"Allowed":"Existing users only"})]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-actions",children:[e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost",onClick:g,children:"Edit"}),e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost cedros-btn-danger",onClick:u,children:"Delete"})]})]})}function I({provider:n,orgId:g,error:u,isLoading:x,onSave:j,onCancel:S}){const v=!!n,[f,k]=o.useState(n?.name??""),[c,y]=o.useState(n?.issuerUrl??""),[r,h]=o.useState(n?.clientId??""),[p,l]=o.useState(""),[m,_]=o.useState(n?.emailDomain??""),[N,d]=o.useState(n?.allowRegistration??!0),[t,a]=o.useState(n?.enabled??!0),i=o.useCallback(s=>{if(s.preventDefault(),v){const b={name:f,issuerUrl:c,clientId:r,emailDomain:m||null,allowRegistration:N,enabled:t};p&&(b.clientSecret=p),j(b)}else{if(!g)return;j({orgId:g,name:f,issuerUrl:c,clientId:r,clientSecret:p,emailDomain:m||null,allowRegistration:N,enabled:t})}},[v,g,f,c,r,p,m,N,t,j]);return e.jsxs("form",{className:"cedros-sso-provider-form",onSubmit:i,children:[e.jsx("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:v?"Edit SSO Provider":"Add SSO Provider"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure an OIDC identity provider for enterprise single sign-on."})]})}),u&&e.jsx(C.ErrorMessage,{error:u}),e.jsxs("div",{className:"cedros-form-section",children:[e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-name",children:"Provider Name"}),e.jsx("input",{id:"sso-name",type:"text",className:"cedros-form-input",value:f,onChange:s=>k(s.target.value),placeholder:"e.g., Okta, Azure AD",required:!0})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-issuer",children:"Issuer URL"}),e.jsx("input",{id:"sso-issuer",type:"url",className:"cedros-form-input",value:c,onChange:s=>y(s.target.value),placeholder:"https://your-org.okta.com",required:!0}),e.jsx("p",{className:"cedros-form-hint",children:"The OIDC issuer URL. Must support discovery at /.well-known/openid-configuration"})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-client-id",children:"Client ID"}),e.jsx("input",{id:"sso-client-id",type:"text",className:"cedros-form-input",value:r,onChange:s=>h(s.target.value),placeholder:"OAuth client ID",required:!0})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsxs("label",{className:"cedros-form-label",htmlFor:"sso-client-secret",children:["Client Secret"," ",v&&e.jsx("span",{className:"cedros-form-hint-inline",children:"(leave blank to keep current)"})]}),e.jsx("input",{id:"sso-client-secret",type:"password",className:"cedros-form-input",value:p,onChange:s=>l(s.target.value),placeholder:v?"••••••••":"OAuth client secret",required:!v})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-email-domain",children:"Email Domain (optional)"}),e.jsx("input",{id:"sso-email-domain",type:"text",className:"cedros-form-input",value:m,onChange:s=>_(s.target.value),placeholder:"company.com"}),e.jsx("p",{className:"cedros-form-hint",children:"Restrict to users with emails from this domain"})]}),e.jsx("div",{className:"cedros-form-group",children:e.jsxs("label",{className:"cedros-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:N,onChange:s=>d(s.target.checked)}),e.jsx("span",{children:"Allow new user registration via SSO"})]})}),e.jsx("div",{className:"cedros-form-group",children:e.jsxs("label",{className:"cedros-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:s=>a(s.target.checked)}),e.jsx("span",{children:"Enable this provider"})]})})]}),e.jsxs("div",{className:"cedros-form-actions",children:[e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost",onClick:S,disabled:x,children:"Cancel"}),e.jsx("button",{type:"submit",className:"cedros-btn cedros-btn-primary",disabled:x,children:x?"Saving...":v?"Save Changes":"Add Provider"})]})]})}const E=[{id:"email",label:"Email",categories:["auth.email"],keys:["auth_email_enabled","auth_email_require_verification","auth_email_block_disposable"]},{id:"google",label:"Google",categories:["auth.google"],keys:["auth_google_enabled","auth_google_client_id"]},{id:"apple",label:"Apple",categories:["auth.apple"],keys:["auth_apple_enabled","auth_apple_client_id","auth_apple_team_id","auth_apple_key_id","auth_apple_private_key"]},{id:"solana",label:"Solana",categories:["auth.solana"],keys:["auth_solana_enabled","auth_solana_challenge_expiry"]},{id:"passkeys",label:"Passkeys",categories:["auth.webauthn"],keys:["auth_webauthn_enabled","auth_webauthn_rp_id","auth_webauthn_rp_name","auth_webauthn_rp_origin"]},{id:"instantlink",label:"Instant Link",categories:["auth.instantlink"],keys:["auth_instantlink_enabled","auth_instantlink_expiry","auth_instantlink_rate_limit"]},{id:"sso",label:"SSO Providers",categories:[],isCustom:!0}];function q({className:n}){const{settings:g,edits:u,isLoading:x,autosaveStatus:j,autosaveError:S,error:v,fetchSettings:f,handleChange:k}=w.useSettingsAutosave(),[c,y]=o.useState("email");o.useEffect(()=>{f()},[f]);const r=E.find(l=>l.id===c),h=o.useMemo(()=>{if(!r)return[];const l=[];for(const m of r.categories){const _=g[m]??[];l.push(..._)}return l},[g,r]),p=o.useMemo(()=>r?.keys?h.filter(l=>r.keys.includes(l.key)).sort((l,m)=>r.keys.indexOf(l.key)-r.keys.indexOf(m.key)):h,[h,r]);return x&&Object.keys(g).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(O.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):v?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(C.ErrorMessage,{error:v.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:"Authentication"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure authentication providers and methods for user sign-in."})]}),e.jsx(w.AutosaveStatus,{status:j,error:S})]}),e.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:E.map(l=>e.jsx("button",{type:"button",className:`cedros-admin-tab ${c===l.id?"cedros-admin-tab-active":""}`,onClick:()=>y(l.id),"aria-selected":c===l.id,role:"tab",children:l.label},l.id))}),e.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:r?.isCustom?e.jsx(T,{}):p.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsxs("p",{children:["No settings found for ",r?.label??"this provider","."]})}):e.jsx(w.SettingsSection,{settings:p,edits:u,onChange:k})})]})}exports.AuthenticationSettings=q;
1
+ "use strict";const e=require("react/jsx-runtime"),o=require("react"),O=require("./LoadingSpinner-d6sSxgQN.cjs"),C=require("./ErrorMessage-CHbYbVi2.cjs"),_=require("./AutosaveStatus-BjLMt52a.cjs"),P=require("./useCedrosLogin-C9MrcZvh.cjs"),D=require("./useOrgs-DDVRCaVi.cjs");function $(){const{config:n,_internal:g}=P.useCedrosLogin(),u=n.serverUrl,x=o.useRef(g?.getAccessToken??(()=>null));x.current=g?.getAccessToken??(()=>null);const[j,S]=o.useState([]),[v,f]=o.useState(0),[k,c]=o.useState(!1),[y,r]=o.useState(null),h=o.useCallback(()=>{const d=x.current();return{"Content-Type":"application/json",...d?{Authorization:`Bearer ${d}`}:{}}},[]),p=o.useCallback(async(d,t=50,a=0)=>{c(!0),r(null);try{const i=new URLSearchParams;d&&i.set("org_id",d),i.set("limit",String(t)),i.set("offset",String(a));const s=await fetch(`${u}/admin/sso-providers?${i}`,{headers:h()});if(!s.ok){const A=await s.json().catch(()=>({}));throw new Error(A.error||`Failed to fetch SSO providers: ${s.status}`)}const b=await s.json();return S(b.providers),f(b.total),b}catch(i){const s=i instanceof Error?i:new Error(String(i));throw r(s),s}finally{c(!1)}},[u,h]),l=o.useCallback(async d=>{c(!0),r(null);try{const t=await fetch(`${u}/admin/sso-providers`,{method:"POST",headers:h(),body:JSON.stringify(d)});if(!t.ok){const i=await t.json().catch(()=>({}));throw new Error(i.error||`Failed to create SSO provider: ${t.status}`)}const a=await t.json();return S(i=>[...i,a]),f(i=>i+1),a}catch(t){const a=t instanceof Error?t:new Error(String(t));throw r(a),a}finally{c(!1)}},[u,h]),m=o.useCallback(async(d,t)=>{c(!0),r(null);try{const a=await fetch(`${u}/admin/sso-providers/${d}`,{method:"PUT",headers:h(),body:JSON.stringify(t)});if(!a.ok){const s=await a.json().catch(()=>({}));throw new Error(s.error||`Failed to update SSO provider: ${a.status}`)}const i=await a.json();return S(s=>s.map(b=>b.id===d?i:b)),i}catch(a){const i=a instanceof Error?a:new Error(String(a));throw r(i),i}finally{c(!1)}},[u,h]),w=o.useCallback(async d=>{c(!0),r(null);try{const t=await fetch(`${u}/admin/sso-providers/${d}`,{method:"DELETE",headers:h()});if(!t.ok){const a=await t.json().catch(()=>({}));throw new Error(a.error||`Failed to delete SSO provider: ${t.status}`)}S(a=>a.filter(i=>i.id!==d)),f(a=>a-1)}catch(t){const a=t instanceof Error?t:new Error(String(t));throw r(a),a}finally{c(!1)}},[u,h]),N=o.useCallback(async(d,t)=>m(d,{enabled:t}),[m]);return{providers:j,total:v,isLoading:k,error:y,fetchProviders:p,createProvider:l,updateProvider:m,deleteProvider:w,toggleProvider:N}}function T({className:n}){const{providers:g,isLoading:u,error:x,fetchProviders:j,createProvider:S,updateProvider:v,deleteProvider:f,toggleProvider:k}=$(),{activeOrg:c}=D.useOrgs(),[y,r]=o.useState("list"),[h,p]=o.useState(null),[l,m]=o.useState(null);o.useEffect(()=>{j(c?.id)},[j,c?.id]);const w=()=>{p(null),m(null),r("add")},N=s=>{p(s),m(null),r("edit")},d=()=>{r("list"),p(null),m(null)},t=async s=>{if(confirm(`Delete SSO provider "${s.name}"? This cannot be undone.`))try{await f(s.id)}catch{}},a=async s=>{try{await k(s.id,!s.enabled)}catch{}},i=async s=>{m(null);try{y==="add"?await S(s):h&&await v(h.id,s),r("list"),p(null)}catch(b){m(b instanceof Error?b.message:"Failed to save provider")}};return u&&g.length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(O.LoadingSpinner,{}),e.jsx("span",{children:"Loading SSO providers..."})]}):y==="add"||y==="edit"?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(I,{provider:h,orgId:c?.id,error:l,isLoading:u,onSave:i,onCancel:d})}):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:"SSO Providers"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure OIDC identity providers for enterprise single sign-on."})]}),e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-primary",onClick:w,children:"Add Provider"})]}),x&&e.jsx(C.ErrorMessage,{error:x.message}),g.length===0?e.jsxs("div",{className:"cedros-system-settings-empty",children:[e.jsx("p",{children:"No SSO providers configured."}),e.jsx("p",{className:"cedros-text-muted",children:"Add an OIDC provider like Okta, Azure AD, or Auth0 to enable enterprise SSO."})]}):e.jsx("div",{className:"cedros-sso-provider-list",children:g.map(s=>e.jsx(L,{provider:s,onEdit:()=>N(s),onDelete:()=>t(s),onToggle:()=>a(s)},s.id))})]})}function L({provider:n,onEdit:g,onDelete:u,onToggle:x}){return e.jsxs("div",{className:`cedros-sso-provider-card ${n.enabled?"":"cedros-sso-provider-card--disabled"}`,children:[e.jsxs("div",{className:"cedros-sso-provider-card-header",children:[e.jsxs("div",{className:"cedros-sso-provider-card-info",children:[e.jsx("h3",{className:"cedros-sso-provider-card-name",children:n.name}),e.jsx("p",{className:"cedros-sso-provider-card-issuer",children:n.issuerUrl})]}),e.jsxs("button",{type:"button",role:"switch","aria-checked":n.enabled,className:`cedros-toggle ${n.enabled?"cedros-toggle-on":"cedros-toggle-off"}`,onClick:x,children:[e.jsx("span",{className:"cedros-toggle-track",children:e.jsx("span",{className:"cedros-toggle-thumb"})}),e.jsx("span",{className:"cedros-toggle-label",children:n.enabled?"Enabled":"Disabled"})]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-details",children:[e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Client ID"}),e.jsx("code",{className:"cedros-sso-provider-card-detail-value",children:n.clientId})]}),n.emailDomain&&e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Email Domain"}),e.jsxs("span",{className:"cedros-sso-provider-card-detail-value",children:["@",n.emailDomain]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-detail",children:[e.jsx("span",{className:"cedros-sso-provider-card-detail-label",children:"Registration"}),e.jsx("span",{className:"cedros-sso-provider-card-detail-value",children:n.allowRegistration?"Allowed":"Existing users only"})]})]}),e.jsxs("div",{className:"cedros-sso-provider-card-actions",children:[e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost",onClick:g,children:"Edit"}),e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost cedros-btn-danger",onClick:u,children:"Delete"})]})]})}function I({provider:n,orgId:g,error:u,isLoading:x,onSave:j,onCancel:S}){const v=!!n,[f,k]=o.useState(n?.name??""),[c,y]=o.useState(n?.issuerUrl??""),[r,h]=o.useState(n?.clientId??""),[p,l]=o.useState(""),[m,w]=o.useState(n?.emailDomain??""),[N,d]=o.useState(n?.allowRegistration??!0),[t,a]=o.useState(n?.enabled??!0),i=o.useCallback(s=>{if(s.preventDefault(),v){const b={name:f,issuerUrl:c,clientId:r,emailDomain:m||null,allowRegistration:N,enabled:t};p&&(b.clientSecret=p),j(b)}else{if(!g)return;j({orgId:g,name:f,issuerUrl:c,clientId:r,clientSecret:p,emailDomain:m||null,allowRegistration:N,enabled:t})}},[v,g,f,c,r,p,m,N,t,j]);return e.jsxs("form",{className:"cedros-sso-provider-form",onSubmit:i,children:[e.jsx("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:v?"Edit SSO Provider":"Add SSO Provider"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure an OIDC identity provider for enterprise single sign-on."})]})}),u&&e.jsx(C.ErrorMessage,{error:u}),e.jsxs("div",{className:"cedros-form-section",children:[e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-name",children:"Provider Name"}),e.jsx("input",{id:"sso-name",type:"text",className:"cedros-form-input",value:f,onChange:s=>k(s.target.value),placeholder:"e.g., Okta, Azure AD",required:!0})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-issuer",children:"Issuer URL"}),e.jsx("input",{id:"sso-issuer",type:"url",className:"cedros-form-input",value:c,onChange:s=>y(s.target.value),placeholder:"https://your-org.okta.com",required:!0}),e.jsx("p",{className:"cedros-form-hint",children:"The OIDC issuer URL. Must support discovery at /.well-known/openid-configuration"})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-client-id",children:"Client ID"}),e.jsx("input",{id:"sso-client-id",type:"text",className:"cedros-form-input",value:r,onChange:s=>h(s.target.value),placeholder:"OAuth client ID",required:!0})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsxs("label",{className:"cedros-form-label",htmlFor:"sso-client-secret",children:["Client Secret"," ",v&&e.jsx("span",{className:"cedros-form-hint-inline",children:"(leave blank to keep current)"})]}),e.jsx("input",{id:"sso-client-secret",type:"password",className:"cedros-form-input",value:p,onChange:s=>l(s.target.value),placeholder:v?"••••••••":"OAuth client secret",required:!v})]}),e.jsxs("div",{className:"cedros-form-group",children:[e.jsx("label",{className:"cedros-form-label",htmlFor:"sso-email-domain",children:"Email Domain (optional)"}),e.jsx("input",{id:"sso-email-domain",type:"text",className:"cedros-form-input",value:m,onChange:s=>w(s.target.value),placeholder:"company.com"}),e.jsx("p",{className:"cedros-form-hint",children:"Restrict to users with emails from this domain"})]}),e.jsx("div",{className:"cedros-form-group",children:e.jsxs("label",{className:"cedros-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:N,onChange:s=>d(s.target.checked)}),e.jsx("span",{children:"Allow new user registration via SSO"})]})}),e.jsx("div",{className:"cedros-form-group",children:e.jsxs("label",{className:"cedros-form-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:s=>a(s.target.checked)}),e.jsx("span",{children:"Enable this provider"})]})})]}),e.jsxs("div",{className:"cedros-form-actions",children:[e.jsx("button",{type:"button",className:"cedros-btn cedros-btn-ghost",onClick:S,disabled:x,children:"Cancel"}),e.jsx("button",{type:"submit",className:"cedros-btn cedros-btn-primary",disabled:x,children:x?"Saving...":v?"Save Changes":"Add Provider"})]})]})}const E=[{id:"email",label:"Email",categories:["auth.email"],keys:["auth_email_enabled","auth_email_require_verification","auth_email_block_disposable"]},{id:"google",label:"Google",categories:["auth.google"],keys:["auth_google_enabled","auth_google_client_id"]},{id:"apple",label:"Apple",categories:["auth.apple"],keys:["auth_apple_enabled","auth_apple_client_id","auth_apple_team_id"]},{id:"solana",label:"Solana",categories:["auth.solana"],keys:["auth_solana_enabled","auth_solana_challenge_expiry"]},{id:"passkeys",label:"Passkeys",categories:["auth.webauthn"],keys:["auth_webauthn_enabled","auth_webauthn_rp_id","auth_webauthn_rp_name","auth_webauthn_rp_origin"]},{id:"instantlink",label:"Instant Link",categories:["auth.instantlink"],keys:["auth_instantlink_enabled","auth_instantlink_expiry","auth_instantlink_rate_limit"]},{id:"sso",label:"SSO Providers",categories:[],isCustom:!0}];function q({className:n}){const{settings:g,edits:u,isLoading:x,autosaveStatus:j,autosaveError:S,error:v,fetchSettings:f,handleChange:k}=_.useSettingsAutosave(),[c,y]=o.useState("email");o.useEffect(()=>{f()},[f]);const r=E.find(l=>l.id===c),h=o.useMemo(()=>{if(!r)return[];const l=[];for(const m of r.categories){const w=g[m]??[];l.push(...w)}return l},[g,r]),p=o.useMemo(()=>r?.keys?h.filter(l=>r.keys.includes(l.key)).sort((l,m)=>r.keys.indexOf(l.key)-r.keys.indexOf(m.key)):h,[h,r]);return x&&Object.keys(g).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n??""}`,children:[e.jsx(O.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):v?e.jsx("div",{className:`cedros-system-settings ${n??""}`,children:e.jsx(C.ErrorMessage,{error:v.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:"Authentication"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Configure authentication providers and methods for user sign-in."})]}),e.jsx(_.AutosaveStatus,{status:j,error:S})]}),e.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:E.map(l=>e.jsx("button",{type:"button",className:`cedros-admin-tab ${c===l.id?"cedros-admin-tab-active":""}`,onClick:()=>y(l.id),"aria-selected":c===l.id,role:"tab",children:l.label},l.id))}),e.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:r?.isCustom?e.jsx(T,{}):p.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsxs("p",{children:["No settings found for ",r?.label??"this provider","."]})}):e.jsx(_.SettingsSection,{settings:p,edits:u,onChange:k})})]})}exports.AuthenticationSettings=q;