{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "my-organization/sso-provider-edit",
  "type": "registry:block",
  "title": "SSO provider edit container component.",
  "description": "A block component for sso provider edit.",
  "dependencies": [
    "@auth0/universal-components-core@2.1.0",
    "@auth0/auth0-react@^2.15.1",
    "@hookform/resolvers@^5.1.0",
    "@radix-ui/react-accordion@^1.2.0",
    "@radix-ui/react-checkbox@^1.1.1",
    "@radix-ui/react-dialog@^1.1.14",
    "@radix-ui/react-label@^2.1.7",
    "@radix-ui/react-radio-group@^1.2.0",
    "@radix-ui/react-select@^2.2.5",
    "@radix-ui/react-slot@^1.2.3",
    "@radix-ui/react-switch@^1.1.0",
    "@radix-ui/react-tabs@^1.1.12",
    "@radix-ui/react-tooltip@^1.2.7",
    "@tanstack/react-query@^5.56.2",
    "@tanstack/react-table@^8.21.3",
    "class-variance-authority@^0.7.1",
    "clsx@^2.1.1",
    "lucide-react@^1.16.0",
    "react-hook-form@^7.57.0",
    "sonner@^2.0.5",
    "tailwind-merge@^3.3.0"
  ],
  "files": [
    {
      "path": "src/components/auth0/my-organization/sso-provider-edit.tsx",
      "content": "/** @module sso-provider-edit */\n\n'use client';\n\nimport { getComponentStyles } from '@auth0/universal-components-core';\nimport { useState, useMemo } from 'react';\n\nimport { SsoDomainTab } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-domain-tab';\nimport { SsoProviderTab } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-tab';\nimport { SsoProvisioningTab } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-tab';\nimport { GateKeeper } from '@/components/auth0/shared/gate-keeper/gate-keeper';\nimport { Header } from '@/components/auth0/shared/header';\nimport { StyledScope } from '@/components/auth0/shared/styled-scope';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';\nimport { useSsoProviderEdit } from '@/hooks/my-organization/use-sso-provider-edit';\nimport { useSsoProviderEditLogic } from '@/hooks/my-organization/use-sso-provider-edit-logic';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type {\n  SsoProviderEditHandlerProps,\n  SsoProviderEditLogicProps,\n  SsoProviderEditProps,\n  SsoProviderEditViewProps,\n} from '@/types/my-organization/idp-management/sso-provider/sso-provider-edit-types';\n\n/**\n * SSO provider edit container component.\n * @param props - Component props\n * @param props.providerId - ID of the SSO provider\n * @param props.backButton - Configuration for the back button\n * @param props.sso - SSO configuration\n * @param props.provisioning - Provisioning configuration\n * @param props.domains - Array of domains\n * @param props.hideHeader - Whether to hide the header\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.styling - Custom styling configuration with variables and classes\n * @param props.schema - Zod validation schema\n * @param props.readOnly - Whether the component is in read-only mode\n * @internal\n * @returns JSX element\n */\nfunction SsoProviderEdit(props: SsoProviderEditProps) {\n  const {\n    providerId,\n    backButton,\n    sso,\n    provisioning,\n    domains,\n    hideHeader = false,\n    customMessages = {},\n    styling = {\n      variables: { common: {}, light: {}, dark: {} },\n      classes: {},\n    },\n    schema,\n    readOnly = false,\n  } = props;\n\n  const ssoProviderEdit = useSsoProviderEdit(providerId, {\n    sso,\n    provisioning,\n    domains,\n    customMessages,\n  });\n\n  const ssoProviderEditLogic = useSsoProviderEditLogic(ssoProviderEdit);\n\n  const ssoProviderCreateLogicProps: Omit<SsoProviderEditLogicProps, 'handleToggleProvider'> = {\n    ...ssoProviderEdit,\n    shouldAllowDeletion: ssoProviderEditLogic.shouldAllowDeletion,\n    idpConfig: ssoProviderEditLogic.idpConfig,\n    showProvisioningTab: ssoProviderEditLogic.showProvisioningTab,\n    styling,\n    customMessages,\n    backButton,\n    schema,\n    readOnly,\n    providerId,\n    domains,\n    hideHeader,\n  };\n\n  const ssoProviderCreateHandlerProps: SsoProviderEditHandlerProps = {\n    handleToggleProvider: ssoProviderEditLogic.handleToggleProvider,\n    updateProvider: ssoProviderEdit.updateProvider,\n    listScimTokens: ssoProviderEdit.listScimTokens,\n    syncSsoAttributes: ssoProviderEdit.syncSsoAttributes,\n    onDeleteConfirm: ssoProviderEdit.onDeleteConfirm,\n    onRemoveConfirm: ssoProviderEdit.onRemoveConfirm,\n    createScimTokenAction: ssoProviderEdit.createScimToken,\n    deleteScimTokenAction: ssoProviderEdit.deleteScimToken,\n    createProvisioningAction: ssoProviderEdit.createProvisioning,\n    deleteProvisioningAction: ssoProviderEdit.deleteProvisioning,\n    syncProvisioningAttributes: ssoProviderEdit.syncProvisioningAttributes,\n  };\n\n  const isLoading =\n    ssoProviderEdit.isLoading ||\n    ssoProviderEditLogic.isLoadingConfig ||\n    ssoProviderEditLogic.isLoadingIdpConfig;\n\n  return (\n    <GateKeeper isLoading={isLoading} styling={styling}>\n      <SsoProviderEditView\n        logic={ssoProviderCreateLogicProps}\n        handlers={ssoProviderCreateHandlerProps}\n      />\n    </GateKeeper>\n  );\n}\n\n/**\n * Internal SSO provider edition view component\n * @param props - Component props\n * @param props.logic - Component logic props\n * @param props.handlers - Component handler props\n * @internal\n * @returns JSX element\n */\nfunction SsoProviderEditView({ logic, handlers }: SsoProviderEditViewProps) {\n  const {\n    styling,\n    schema,\n    readOnly,\n    providerId,\n    domains,\n    hideHeader,\n    provider,\n    organization,\n    isLoading,\n    isUpdating,\n    isDeleting,\n    isRemoving,\n    idpConfig,\n    customMessages,\n    backButton,\n    shouldAllowDeletion,\n    showProvisioningTab,\n    isProvisioningUpdating,\n    isProvisioningDeleting,\n    isScimTokensLoading,\n    isScimTokenCreating,\n    isScimTokenDeleting,\n    isSsoAttributesSyncing,\n    isProvisioningAttributesSyncing,\n    hasSsoAttributeSyncWarning,\n    hasProvisioningAttributeSyncWarning,\n  } = logic;\n\n  const {\n    updateProvider,\n    listScimTokens,\n    syncSsoAttributes,\n    onDeleteConfirm,\n    onRemoveConfirm,\n    handleToggleProvider,\n    createProvisioningAction,\n    deleteProvisioningAction,\n    createScimTokenAction,\n    deleteScimTokenAction,\n    syncProvisioningAttributes,\n  } = handlers;\n\n  const { isDarkMode } = useTheme();\n  const [activeTab, setActiveTab] = useState('sso');\n  const { t } = useTranslator('idp_management.edit_sso_provider', customMessages);\n  const currentStyles = useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  return (\n    <StyledScope style={currentStyles.variables}>\n      <div className=\"w-full\">\n        {!hideHeader && (\n          <Header\n            title={provider?.display_name || provider?.name || ''}\n            backButton={\n              backButton && {\n                ...backButton,\n                text: t('header.back_button_text'),\n              }\n            }\n            isLoading={isUpdating}\n            actions={[\n              {\n                type: 'switch',\n                checked: provider?.is_enabled ?? false,\n                onCheckedChange: handleToggleProvider,\n                disabled: isUpdating,\n                tooltip: {\n                  content: provider?.is_enabled\n                    ? t('header.disable_provider_tooltip_text')\n                    : t('header.enable_provider_tooltip_text'),\n                },\n              },\n            ]}\n            className={currentStyles?.classes?.['SsoProviderEdit-header']}\n          />\n        )}\n\n        <Tabs\n          value={activeTab}\n          onValueChange={setActiveTab}\n          className={cn('space-y-10', currentStyles?.classes?.['SsoProviderEdit-tabs'])}\n        >\n          <TabsList\n            className={cn('grid w-full', showProvisioningTab ? 'grid-cols-3' : 'grid-cols-2')}\n          >\n            <TabsTrigger value=\"sso\" className=\"text-sm\">\n              {t('tabs.sso.name')}\n            </TabsTrigger>\n            {showProvisioningTab && (\n              <TabsTrigger value=\"provisioning\" className=\"text-sm\">\n                {t('tabs.provisioning.name')}\n              </TabsTrigger>\n            )}\n            <TabsTrigger value=\"domain\" className=\"text-sm\">\n              {t('tabs.domains.name')}\n            </TabsTrigger>\n          </TabsList>\n\n          <TabsContent value=\"sso\">\n            <SsoProviderTab\n              provider={provider}\n              organization={organization}\n              onDelete={onDeleteConfirm}\n              onRemove={onRemoveConfirm}\n              isDeleting={isDeleting}\n              isRemoving={isRemoving}\n              idpConfig={idpConfig}\n              shouldAllowDeletion={shouldAllowDeletion}\n              hasSsoAttributeSyncWarning={hasSsoAttributeSyncWarning}\n              onAttributeSync={syncSsoAttributes}\n              isSyncingAttributes={isSsoAttributesSyncing}\n              customMessages={customMessages?.tabs?.sso?.content}\n              styling={styling}\n              formActions={{\n                isLoading: isUpdating,\n                nextAction: {\n                  disabled: isUpdating || !provider || isLoading,\n                  onClick: updateProvider,\n                },\n              }}\n              readOnly={readOnly}\n            />\n          </TabsContent>\n\n          {showProvisioningTab && (\n            <TabsContent value=\"provisioning\">\n              <SsoProvisioningTab\n                provider={provider!}\n                isProvisioningUpdating={isProvisioningUpdating}\n                isProvisioningDeleting={isProvisioningDeleting}\n                isScimTokensLoading={isScimTokensLoading}\n                isScimTokenCreating={isScimTokenCreating}\n                isScimTokenDeleting={isScimTokenDeleting}\n                hasProvisioningAttributeSyncWarning={hasProvisioningAttributeSyncWarning}\n                onAttributeSync={syncProvisioningAttributes}\n                isSyncingAttributes={isProvisioningAttributesSyncing}\n                onCreateProvisioning={createProvisioningAction}\n                onDeleteProvisioning={deleteProvisioningAction}\n                onListScimTokens={listScimTokens}\n                onCreateScimToken={createScimTokenAction}\n                onDeleteScimToken={deleteScimTokenAction}\n                customMessages={customMessages?.tabs?.provisioning?.content}\n                styling={styling}\n              />\n            </TabsContent>\n          )}\n\n          <TabsContent value=\"domain\">\n            <SsoDomainTab\n              customMessages={customMessages?.tabs?.domains?.content}\n              styling={styling}\n              domains={domains}\n              schema={schema?.domains}\n              idpId={providerId}\n              provider={provider}\n              readOnly={readOnly}\n            />\n          </TabsContent>\n        </Tabs>\n      </div>\n    </StyledScope>\n  );\n}\n\n/**\n * SSO provider edit interface with tabbed navigation.\n *\n * Provides a complete interface for editing SSO provider settings including:\n * - SSO tab: Provider configuration, attribute mappings, delete/remove actions\n * - Provisioning tab: SCIM configuration and token management\n * - Domains tab: Domain association and verification\n *\n * @param props - {@link SsoProviderEditProps}\n * @param props.providerId - Identity provider ID to edit\n * @param props.backButton - Back button configuration\n * @param props.sso - SSO tab lifecycle hooks (save, delete, remove actions)\n * @param props.provisioning - Provisioning tab lifecycle hooks\n * @param props.domains - Domains tab configuration\n * @param props.hideHeader - Hide the header section\n * @param props.customMessages - Custom i18n message overrides\n * @param props.styling - CSS variables and class overrides\n * @param props.schema - Validation schema overrides\n * @param props.readOnly - Render in read-only mode\n * @returns SSO provider edit component\n *\n * @see {@link SsoProviderEditProps} for full props documentation\n *\n * @example\n * ```tsx\n * <SsoProviderEdit\n *   providerId=\"con_abc123\"\n *   sso={{\n *     saveAction: { onAfter: (provider) => console.log('Saved:', provider) },\n *     deleteAction: { onAfter: () => navigate('/providers') },\n *   }}\n *   backButton={{\n *     onClick: () => navigate('/providers'),\n *   }}\n * />\n * ```\n */\nexport { SsoProviderEdit, SsoProviderEditView };\n",
      "type": "registry:block",
      "target": "components/auth0/my-organization/sso-provider-edit.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/domain-management/domain-create/domain-create-modal.tsx",
      "content": "/**\n * Domain creation modal.\n * @module domain-create-modal\n * @internal\n */\n\nimport {\n  createDomainCreateSchema,\n  type InternalDomainCreateFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport {\n  Form,\n  FormControl,\n  FormField,\n  FormItem,\n  FormMessage,\n  FormLabel,\n} from '@/components/ui/form';\nimport { Modal } from '@/components/ui/modal';\nimport { TextField } from '@/components/ui/text-field';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { DomainCreateModalProps } from '@/types/my-organization/domain-management/domain-create-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.translatorKey - Translation namespace key\n * @param props.className - Optional CSS class name for styling\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.isOpen - Whether the modal/dialog is open\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.schema - Zod validation schema\n * @param props.onClose - Callback fired when the component should close\n * @param props.onCreate - Callback fired when create action is triggered\n * @returns JSX element\n */\nexport function DomainCreateModal({\n  translatorKey = 'domain_management.domain_create.modal',\n  className,\n  customMessages,\n  isOpen,\n  isLoading,\n  schema,\n  onClose,\n  onCreate,\n}: DomainCreateModalProps) {\n  const { t } = useTranslator(translatorKey, customMessages);\n\n  const domainCreateSchema = React.useMemo(\n    () => createDomainCreateSchema(schema, t('field.error')),\n    [schema, t],\n  );\n\n  const form = useForm<InternalDomainCreateFormValues>({\n    resolver: zodResolver(domainCreateSchema),\n    defaultValues: {\n      domain_url: '',\n    },\n    mode: FORM_VALIDATION_MODE,\n  });\n\n  const handleCreate = React.useCallback(\n    async (values: InternalDomainCreateFormValues) => {\n      if (!values.domain_url) return;\n      await onCreate(values.domain_url);\n      form.reset();\n    },\n    [form, onCreate],\n  );\n\n  const handleClose = React.useCallback(() => {\n    form.reset();\n    onClose();\n  }, [form, onClose]);\n\n  const onSubmit = React.useCallback(\n    (e: React.FormEvent<HTMLFormElement>) => {\n      e.preventDefault();\n      form.handleSubmit(handleCreate)();\n    },\n    [form, handleCreate],\n  );\n\n  return (\n    <Modal\n      open={isOpen}\n      onOpenChange={(open) => !open && handleClose()}\n      className={cn('p-10', className)}\n      title={t('title')}\n      content={\n        <div>\n          <Form {...form}>\n            <form id=\"domain-create-form\" onSubmit={onSubmit}>\n              <FormField\n                control={form.control}\n                name=\"domain_url\"\n                render={({ field }) => (\n                  <FormItem>\n                    <FormLabel\n                      htmlFor=\"domain-url\"\n                      className=\"text-sm text-(length:--font-size-label) font-medium\"\n                    >\n                      {t('field.label')}\n                    </FormLabel>\n                    <FormControl>\n                      <TextField\n                        id=\"domain-url\"\n                        type=\"text\"\n                        placeholder={t('field.placeholder')}\n                        className=\"mt-2\"\n                        {...field}\n                      />\n                    </FormControl>\n                    <FormMessage />\n                  </FormItem>\n                )}\n              />\n            </form>\n          </Form>\n        </div>\n      }\n      modalActions={{\n        isLoading,\n        nextAction: {\n          type: 'button',\n          label: t('actions.create_button_text'),\n          variant: 'primary',\n          disabled: isLoading,\n          onClick: (e) => {\n            e.preventDefault();\n            form.handleSubmit(handleCreate)();\n          },\n        },\n        previousAction: {\n          label: t('actions.cancel_button_text'),\n          onClick: handleClose,\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/domain-management/domain-create/domain-create-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/domain-management/domain-delete/domain-delete-modal.tsx",
      "content": "/**\n * Domain deletion confirmation modal.\n * @module domain-delete-modal\n * @internal\n */\n\nimport type { Domain } from '@auth0/universal-components-core';\nimport React from 'react';\n\nimport { Modal } from '@/components/ui/modal';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { DomainDeleteModalProps } from '@/types/my-organization/domain-management/domain-delete-types';\n\nconst getDescriptionKey = (domain: Domain | null) => {\n  return domain?.status === 'pending' ? 'description.pending' : 'description.verified';\n};\n\n/**\n *\n * @param props - Component props.\n * @param props.translatorKey - Translation namespace key\n * @param props.className - Optional CSS class name for styling\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.domain - Domain object or domain name\n * @param props.isOpen - Whether the modal/dialog is open\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.onClose - Callback fired when the component should close\n * @param props.onDelete - Callback fired when delete action is triggered\n * @returns JSX element\n */\nexport function DomainDeleteModal({\n  translatorKey = 'domain_management.domain_delete.modal',\n  className,\n  customMessages,\n  domain,\n  isOpen,\n  isLoading,\n  onClose,\n  onDelete,\n}: DomainDeleteModalProps) {\n  const { t } = useTranslator(translatorKey, customMessages);\n\n  const handleDelete = React.useCallback(() => {\n    if (domain) {\n      onDelete(domain);\n    }\n  }, [onDelete, domain]);\n\n  return (\n    <Modal\n      open={isOpen}\n      onOpenChange={(open) => !open && onClose()}\n      className={cn('p-10', className)}\n      title={t('title')}\n      content={\n        <div className={'space-y-6'}>\n          <p className=\"text-sm text-muted-foreground text-(length:--font-size-paragraph)\">\n            {t(getDescriptionKey(domain), { domainName: domain?.domain })}\n          </p>\n        </div>\n      }\n      modalActions={{\n        isLoading,\n        nextAction: {\n          type: 'button',\n          label: t('actions.delete_button_text'),\n          variant: 'destructive',\n          disabled: isLoading,\n          onClick: handleDelete,\n        },\n        previousAction: {\n          label: t('actions.cancel_button_text'),\n          onClick: onClose,\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/domain-management/domain-delete/domain-delete-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/domain-management/domain-verify/domain-verify-modal.tsx",
      "content": "/**\n * Domain verification modal.\n * @module domain-verify-modal\n * @internal\n */\n\nimport { MessageSquare } from 'lucide-react';\nimport React from 'react';\n\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Label } from '@/components/ui/label';\nimport { Modal } from '@/components/ui/modal';\nimport { Spinner } from '@/components/ui/spinner';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { DomainVerifyModalProps } from '@/types/my-organization/domain-management/domain-verify-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.translatorKey - Translation namespace key\n * @param props.className - Optional CSS class name for styling\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.isOpen - Whether the modal/dialog is open\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.domain - Domain object or domain name\n * @param props.error - Error message or error object to display\n * @param props.onClose - Callback fired when the component should close\n * @param props.onVerify - Callback fired when verify action is triggered\n * @param props.onDelete - Callback fired when delete action is triggered\n * @returns JSX element\n */\nexport function DomainVerifyModal({\n  translatorKey = 'domain_management.domain_verify.modal',\n  className,\n  customMessages,\n  isOpen,\n  isLoading,\n  domain,\n  error,\n  onClose,\n  onVerify,\n  onDelete,\n}: DomainVerifyModalProps) {\n  const { t } = useTranslator(translatorKey, customMessages);\n\n  const handleVerify = React.useCallback(() => {\n    if (domain) {\n      onVerify(domain);\n    }\n  }, [onVerify, domain]);\n\n  const handleDelete = React.useCallback(() => {\n    if (domain) {\n      onDelete(domain);\n    }\n  }, [onDelete, domain]);\n\n  return (\n    <Modal\n      open={isOpen}\n      onOpenChange={(open) => !open && onClose()}\n      className=\"p-10 break-all\"\n      title={t('title', { domainName: domain?.domain })}\n      content={\n        <div className={cn('space-y-4', className)}>\n          {error && (\n            <Alert variant=\"destructive\">\n              <MessageSquare className=\"h-4 w-4\" />\n              <AlertDescription className=\"text-destructive-foreground\">{error}</AlertDescription>\n            </Alert>\n          )}\n\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"txt-record-name\" className=\"text-sm font-medium\">\n              {t('txt_record_name.label')}\n            </Label>\n            <CopyableTextField\n              id=\"txt-record-name\"\n              value={domain?.verification_host || ''}\n              readOnly\n              className=\"text-sm\"\n            />\n          </div>\n\n          <div className=\"space-y-2\">\n            <Label htmlFor=\"txt-record-content\" className=\"text-sm font-medium\">\n              {t('txt_record_content.label')}\n            </Label>\n            <CopyableTextField\n              id=\"txt-record-content\"\n              value={domain?.verification_txt || ''}\n              readOnly\n              className=\"text-sm\"\n            />\n          </div>\n\n          <div className=\"space-y-2 pt-4 border-t border-gray-200\">\n            <div className=\"flex items-center gap-2\">\n              <span className=\"text-sm text-foreground font-medium\">\n                {t('verification_status.label')}\n              </span>\n              <Badge variant=\"warning\">{t('verification_status.pending')}</Badge>\n            </div>\n            <p className={'text-sm text-muted-foreground text-(length:--font-size-paragraph)'}>\n              {t('verification_status.description')}\n            </p>\n          </div>\n\n          <div className=\"flex gap-2 pt-2 -mb-4\">\n            <Button variant=\"outline\" onClick={handleVerify} disabled={isLoading}>\n              {isLoading ? <Spinner size=\"sm\" /> : t('actions.verify_button_text')}\n            </Button>\n            <Button variant=\"destructive\" onClick={handleDelete} disabled={isLoading}>\n              {t('actions.delete_button_text')}\n            </Button>\n          </div>\n        </div>\n      }\n      modalActions={{\n        showNext: false,\n        previousAction: {\n          label: t('actions.done_button_text'),\n          onClick: onClose,\n          variant: 'primary',\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/domain-management/domain-verify/domain-verify-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/adfs-sso-configure-form.tsx",
      "content": "/**\n * ADFS SSO provider configuration form.\n * @module adfs-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type AdfsConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport { FileUpload } from '@/components/ui/file-upload';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { Label } from '@/components/ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { TextField } from '@/components/ui/text-field';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nexport interface AdfsConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => AdfsConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: AdfsConfigureFormValues) => void;\n}\n\ninterface AdfsConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const AdfsProviderForm = React.forwardRef<AdfsConfigureFormHandle, AdfsConfigureFormProps>(\n  function AdfsProviderForm(\n    { initialData, readOnly = false, customMessages = {}, className, onFormDirty, idpConfig },\n    ref,\n  ) {\n    const { t } = useTranslator(\n      'idp_management.create_sso_provider.provider_configure',\n      customMessages,\n    );\n\n    const [uploadedFiles, setUploadedFiles] = useState<File[]>([]);\n\n    const adfsData = initialData as AdfsConfigureFormValues | undefined;\n\n    const form = useForm<AdfsConfigureFormValues>({\n      resolver: zodResolver(createProviderConfigureSchema('adfs')),\n      mode: FORM_VALIDATION_MODE,\n      reValidateMode: FORM_REVALIDATE_MODE,\n      defaultValues: {\n        meta_data_source: adfsData?.meta_data_source || 'meta_data_url',\n        meta_data_location_url: adfsData?.meta_data_location_url || '',\n        adfs_server: adfsData?.adfs_server || '',\n        fedMetadataXml: adfsData?.fedMetadataXml || '',\n        show_as_button: adfsData?.show_as_button ?? false,\n        assign_membership_on_login: adfsData?.assign_membership_on_login ?? false,\n      },\n    });\n\n    const { isDirty } = form.formState;\n\n    React.useEffect(() => {\n      onFormDirty?.(isDirty);\n    }, [isDirty, onFormDirty]);\n\n    React.useImperativeHandle(ref, () => ({\n      validate: async () => {\n        return await form.trigger();\n      },\n      getData: () => form.getValues(),\n      isDirty: () => form.formState.isDirty,\n      reset: (data) => {\n        if (data) {\n          form.reset(data);\n        } else {\n          form.reset();\n        }\n      },\n    }));\n\n    const typeValue = form.watch('meta_data_source');\n    const showFederationMetadataFile = typeValue === 'meta_data_file';\n\n    const handleFileUpload = async (files: File[]) => {\n      setUploadedFiles(files);\n\n      const file = files[0];\n      if (file) {\n        try {\n          const content = await file.text();\n          form.setValue('fedMetadataXml', content);\n        } catch (error) {\n          console.error('Error reading file:', error);\n        }\n      }\n    };\n\n    return (\n      <Form {...form}>\n        <div className={cn('space-y-6', className)}>\n          <FormField\n            control={form.control}\n            name=\"meta_data_source\"\n            render={({ field }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.adfs.meta_data_source.label')}\n                </FormLabel>\n                <FormControl>\n                  <RadioGroup\n                    value={field.value}\n                    onValueChange={field.onChange}\n                    disabled={readOnly}\n                    className=\"flex flex-col space-y-2\"\n                  >\n                    <div className=\"flex items-center space-x-2\">\n                      <RadioGroupItem value=\"meta_data_url\" id=\"meta_data_url\" />\n                      <Label htmlFor=\"meta_data_url\" className=\"text-sm font-normal cursor-pointer\">\n                        {t('fields.adfs.meta_data_source.options.meta_data_url.label')}\n                      </Label>\n                    </div>\n                    <div className=\"flex items-center space-x-2\">\n                      <RadioGroupItem value=\"meta_data_file\" id=\"meta_data_file\" />\n                      <Label\n                        htmlFor=\"meta_data_file\"\n                        className=\"text-sm font-normal cursor-pointer\"\n                      >\n                        {t('fields.adfs.meta_data_source.options.meta_data_file.label')}\n                      </Label>\n                    </div>\n                  </RadioGroup>\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n              </FormItem>\n            )}\n          />\n\n          {typeValue === 'meta_data_url' && (\n            <>\n              <FormField\n                control={form.control}\n                name=\"adfs_server\"\n                render={({ field, fieldState }) => (\n                  <FormItem>\n                    <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                      {t('fields.adfs.meta_data_url.label')}\n                    </FormLabel>\n                    <FormControl>\n                      <TextField\n                        type=\"url\"\n                        placeholder={t('fields.adfs.meta_data_url.placeholder')}\n                        error={Boolean(fieldState.error)}\n                        readOnly={readOnly}\n                        aria-required={true}\n                        aria-invalid={Boolean(fieldState.error)}\n                        {...field}\n                      />\n                    </FormControl>\n                    <FormMessage\n                      role=\"alert\"\n                      className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                    />\n                    <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                      {t('fields.adfs.meta_data_url.helper_text')}\n                    </FormDescription>\n                  </FormItem>\n                )}\n              />\n\n              <FormField\n                control={form.control}\n                name=\"meta_data_location_url\"\n                render={({ field, fieldState }) => (\n                  <FormItem>\n                    <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                      {t('fields.adfs.meta_data_location_url.label')}\n                    </FormLabel>\n                    <FormControl>\n                      <CopyableTextField\n                        type=\"url\"\n                        placeholder={t('fields.adfs.meta_data_location_url.placeholder')}\n                        error={Boolean(fieldState.error)}\n                        readOnly={readOnly}\n                        {...field}\n                      />\n                    </FormControl>\n                    <FormMessage\n                      role=\"alert\"\n                      className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                    />\n                    <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                      {t('fields.adfs.meta_data_location_url.helper_text')}\n                    </FormDescription>\n                  </FormItem>\n                )}\n              />\n            </>\n          )}\n\n          {showFederationMetadataFile && (\n            <FormField\n              control={form.control}\n              name=\"fedMetadataXml\"\n              render={() => (\n                <FormItem>\n                  <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                    {t('fields.adfs.federation_metadata_file.label')}\n                  </FormLabel>\n                  <FormControl>\n                    <div className=\"space-y-3\">\n                      <FileUpload\n                        accept=\".xml\"\n                        onChange={handleFileUpload}\n                        value={uploadedFiles}\n                        maxFiles={1}\n                        disabled={readOnly}\n                        className=\"w-full\"\n                        placeholder={t('fields.adfs.federation_metadata_file.placeholder')}\n                      />\n                    </div>\n                  </FormControl>\n                  <FormMessage\n                    role=\"alert\"\n                    className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                  />\n                  <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                    {t('fields.adfs.federation_metadata_file.helper_text')}\n                  </FormDescription>\n                </FormItem>\n              )}\n            />\n          )}\n\n          <CommonConfigureFields\n            idpConfig={idpConfig}\n            readOnly={readOnly}\n            customMessages={customMessages}\n          />\n        </div>\n      </Form>\n    );\n  },\n);\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/adfs-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields.tsx",
      "content": "/**\n * Common SSO provider configuration fields.\n * @module common-configure-fields\n * @internal\n */\n\nimport type { GetIdpConfigurationResponseContent } from '@auth0/universal-components-core';\nimport { useFormContext } from 'react-hook-form';\n\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { FormField, FormItem, FormLabel, FormControl, FormDescription } from '@/components/ui/form';\nimport { useTranslator } from '@/hooks/shared/use-translator';\n\ninterface CommonConfigureFieldsProps {\n  idpConfig: GetIdpConfigurationResponseContent | null;\n  readOnly?: boolean;\n  customMessages?: Partial<Record<string, unknown>>;\n}\n\n/**\n * CommonConfigureFields Component\n * Renders common fields (show_as_button, assign_membership_on_login) that are shared across all SSO provider strategies\n * @param props - Component props.\n * @param props.idpConfig - Identity provider configuration\n * @param props.readOnly - Whether the component is in read-only mode\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function CommonConfigureFields({\n  idpConfig,\n  readOnly = false,\n  customMessages = {},\n}: CommonConfigureFieldsProps) {\n  const { t } = useTranslator(\n    'idp_management.create_sso_provider.provider_configure',\n    customMessages,\n  );\n\n  const form = useFormContext();\n\n  // Only show these fields if the config allows them\n  const showAsButtonEnabled = idpConfig?.organization?.can_set_show_as_button;\n  const assignMembershipEnabled = idpConfig?.organization?.can_set_assign_membership_on_login;\n\n  // If neither field is enabled, don't render anything\n  if (!showAsButtonEnabled && !assignMembershipEnabled) {\n    return null;\n  }\n\n  return (\n    <div className=\"space-y-6 pt-4\">\n      {showAsButtonEnabled && (\n        <FormField\n          control={form.control}\n          name=\"show_as_button\"\n          render={({ field }) => (\n            <FormItem className=\"flex flex-row items-start space-x-3 space-y-0\">\n              <FormControl>\n                <Checkbox\n                  checked={field.value}\n                  onCheckedChange={field.onChange}\n                  disabled={readOnly}\n                />\n              </FormControl>\n              <div className=\"space-y-1 leading-none\">\n                <FormLabel className=\"text-sm font-normal\">\n                  {t('fields.common.show_as_button.label')}\n                </FormLabel>\n                <FormDescription className=\"text-sm\">\n                  {t('fields.common.show_as_button.helper_text')}\n                </FormDescription>\n              </div>\n            </FormItem>\n          )}\n        />\n      )}\n\n      {assignMembershipEnabled && (\n        <FormField\n          control={form.control}\n          name=\"assign_membership_on_login\"\n          render={({ field }) => (\n            <FormItem className=\"flex flex-row items-start space-x-3 space-y-0\">\n              <FormControl>\n                <Checkbox\n                  checked={field.value}\n                  onCheckedChange={field.onChange}\n                  disabled={readOnly}\n                />\n              </FormControl>\n              <div className=\"space-y-1 leading-none\">\n                <FormLabel className=\"text-sm font-normal\">\n                  {t('fields.common.assign_membership_on_login.label')}\n                </FormLabel>\n                <FormDescription className=\"text-sm\">\n                  {t('fields.common.assign_membership_on_login.helper_text')}\n                </FormDescription>\n              </div>\n            </FormItem>\n          )}\n        />\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/google-apps-sso-configure-form.tsx",
      "content": "/**\n * Google Apps SSO provider configuration form.\n * @module google-apps-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type GoogleAppsConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { TextField } from '@/components/ui/text-field';\nimport { useProviderFormMode } from '@/hooks/my-organization/use-provider-form-mode';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nexport interface GoogleAppsConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => GoogleAppsConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: GoogleAppsConfigureFormValues) => void;\n}\n\ninterface GoogleAppsConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const GoogleAppsProviderForm = React.forwardRef<\n  GoogleAppsConfigureFormHandle,\n  GoogleAppsConfigureFormProps\n>(function GoogleAppsProviderForm(\n  {\n    initialData,\n    readOnly = false,\n    customMessages = {},\n    className,\n    onFormDirty,\n    idpConfig,\n    mode = 'create',\n  },\n  ref,\n) {\n  const { t } = useTranslator(\n    'idp_management.create_sso_provider.provider_configure',\n    customMessages,\n  );\n\n  const { coreClient } = useCoreClient();\n  const { showCopyButtons } = useProviderFormMode(mode);\n\n  const callbackUrl = React.useMemo(() => {\n    const domain = coreClient?.getDomain() || 'YOUR_DOMAIN';\n    return `https://${domain}/login/callback`;\n  }, [coreClient]);\n\n  const googleAppsData = initialData as GoogleAppsConfigureFormValues | undefined;\n\n  const form = useForm<GoogleAppsConfigureFormValues>({\n    resolver: zodResolver(createProviderConfigureSchema('google-apps')),\n    mode: FORM_VALIDATION_MODE,\n    reValidateMode: FORM_REVALIDATE_MODE,\n    defaultValues: {\n      domain: googleAppsData?.domain || '',\n      client_id: googleAppsData?.client_id || '',\n      client_secret: googleAppsData?.client_secret || '',\n      callback_url: callbackUrl || '',\n      show_as_button: googleAppsData?.show_as_button ?? false,\n      assign_membership_on_login: googleAppsData?.assign_membership_on_login ?? false,\n    },\n  });\n\n  const { isDirty } = form.formState;\n\n  React.useEffect(() => {\n    onFormDirty?.(isDirty);\n  }, [isDirty, onFormDirty]);\n\n  React.useImperativeHandle(ref, () => ({\n    validate: async () => {\n      return await form.trigger();\n    },\n    getData: () => form.getValues(),\n    isDirty: () => form.formState.isDirty,\n    reset: (data) => {\n      if (data) {\n        form.reset(data);\n      } else {\n        form.reset();\n      }\n    },\n  }));\n\n  return (\n    <Form {...form}>\n      <div className={cn('space-y-6', className)}>\n        <FormField\n          control={form.control}\n          name=\"domain\"\n          render={({ field, fieldState }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.google-apps.domain.label')}\n              </FormLabel>\n              <FormControl>\n                <TextField\n                  type=\"text\"\n                  placeholder={t('fields.google-apps.domain.placeholder')}\n                  error={Boolean(fieldState.error)}\n                  readOnly={readOnly}\n                  {...field}\n                />\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n            </FormItem>\n          )}\n        />\n\n        <FormField\n          control={form.control}\n          name=\"client_id\"\n          render={({ field, fieldState }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.google-apps.client_id.label')}\n              </FormLabel>\n              <FormControl>\n                <CopyableTextField\n                  type=\"text\"\n                  placeholder={t('fields.google-apps.client_id.placeholder')}\n                  error={Boolean(fieldState.error)}\n                  readOnly={readOnly}\n                  showCopyButton={showCopyButtons}\n                  {...field}\n                />\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n              <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                {t('fields.google-apps.client_id.helper_text')}\n              </FormDescription>\n            </FormItem>\n          )}\n        />\n\n        <FormField\n          control={form.control}\n          name=\"client_secret\"\n          render={({ field, fieldState }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.google-apps.client_secret.label')}\n              </FormLabel>\n              <FormControl>\n                <CopyableTextField\n                  type=\"password\"\n                  placeholder={t('fields.google-apps.client_secret.placeholder')}\n                  error={Boolean(fieldState.error)}\n                  readOnly={readOnly}\n                  showCopyButton={showCopyButtons}\n                  {...field}\n                />\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n              <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                {t('fields.google-apps.client_secret.helper_text')}\n              </FormDescription>\n            </FormItem>\n          )}\n        />\n\n        <FormField\n          control={form.control}\n          name=\"callback_url\"\n          render={({ field, fieldState }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.google-apps.callback_url.label')}\n              </FormLabel>\n              <FormControl>\n                <CopyableTextField\n                  type=\"text\"\n                  placeholder={t('fields.google-apps.callback_url.placeholder')}\n                  error={Boolean(fieldState.error)}\n                  readOnly={true}\n                  {...field}\n                />\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n              <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                {t('fields.google-apps.callback_url.helper_text')}\n              </FormDescription>\n            </FormItem>\n          )}\n        />\n\n        <CommonConfigureFields\n          idpConfig={idpConfig}\n          readOnly={readOnly}\n          customMessages={customMessages}\n        />\n      </div>\n    </Form>\n  );\n});\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/google-apps-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/oidc-sso-configure-form.tsx",
      "content": "/**\n * OIDC SSO provider configuration form.\n * @module oidc-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type OidcConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { Label } from '@/components/ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { TextField } from '@/components/ui/text-field';\nimport { useProviderFormMode } from '@/hooks/my-organization/use-provider-form-mode';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nexport interface OidcConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => OidcConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: OidcConfigureFormValues) => void;\n}\n\ninterface OidcConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const OidcProviderForm = React.forwardRef<OidcConfigureFormHandle, OidcConfigureFormProps>(\n  function OidcProviderForm(\n    {\n      initialData,\n      readOnly = false,\n      customMessages = {},\n      className,\n      onFormDirty,\n      idpConfig,\n      mode = 'create',\n    },\n    ref,\n  ) {\n    const { t } = useTranslator(\n      'idp_management.create_sso_provider.provider_configure',\n      customMessages,\n    );\n\n    const { showCopyButtons } = useProviderFormMode(mode);\n\n    const oidcData = initialData as OidcConfigureFormValues | undefined;\n\n    const form = useForm<OidcConfigureFormValues>({\n      resolver: zodResolver(createProviderConfigureSchema('oidc')),\n      mode: FORM_VALIDATION_MODE,\n      reValidateMode: FORM_REVALIDATE_MODE,\n      defaultValues: {\n        discovery_url: oidcData?.discovery_url || '',\n        type: oidcData?.type || 'back_channel',\n        client_id: oidcData?.client_id || '',\n        client_secret: oidcData?.client_secret || '',\n        show_as_button: oidcData?.show_as_button ?? false,\n        assign_membership_on_login: oidcData?.assign_membership_on_login ?? false,\n      },\n    });\n\n    const { isDirty } = form.formState;\n\n    React.useEffect(() => {\n      onFormDirty?.(isDirty);\n    }, [isDirty, onFormDirty]);\n\n    React.useImperativeHandle(ref, () => ({\n      validate: async () => {\n        return await form.trigger();\n      },\n      getData: () => form.getValues(),\n      isDirty: () => form.formState.isDirty,\n      reset: (data) => {\n        if (data) {\n          form.reset(data);\n        } else {\n          form.reset();\n        }\n      },\n    }));\n\n    const typeValue = form.watch('type');\n    const showClientSecret = typeValue === 'back_channel';\n\n    // Clear client_secret error and value when switching to front channel\n    React.useEffect(() => {\n      if (typeValue === 'front_channel') {\n        form.clearErrors('client_secret');\n        form.setValue('client_secret', '', { shouldValidate: false });\n      }\n    }, [typeValue, form]);\n\n    return (\n      <Form {...form}>\n        <div className={cn('space-y-6', className)}>\n          <FormField\n            control={form.control}\n            name=\"discovery_url\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.oidc.discovery_url.label')}\n                </FormLabel>\n                <FormControl>\n                  <TextField\n                    type=\"url\"\n                    placeholder={t('fields.oidc.discovery_url.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    aria-required={true}\n                    aria-invalid={Boolean(fieldState.error)}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.oidc.discovery_url.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"type\"\n            render={({ field }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.oidc.type.label')}\n                </FormLabel>\n                <FormControl>\n                  <RadioGroup\n                    value={field.value}\n                    onValueChange={field.onChange}\n                    disabled={readOnly}\n                    className=\"flex flex-col space-y-2\"\n                  >\n                    <div className=\"flex items-center space-x-2\">\n                      <RadioGroupItem value=\"back_channel\" id=\"back_channel\" />\n                      <Label htmlFor=\"back_channel\" className=\"text-sm font-normal cursor-pointer\">\n                        {t('fields.oidc.type.options.back_channel.label')}\n                      </Label>\n                    </div>\n                    <div className=\"flex items-center space-x-2\">\n                      <RadioGroupItem value=\"front_channel\" id=\"front_channel\" />\n                      <Label htmlFor=\"front_channel\" className=\"text-sm font-normal cursor-pointer\">\n                        {t('fields.oidc.type.options.front_channel.label')}\n                      </Label>\n                    </div>\n                  </RadioGroup>\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.oidc.type.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"client_id\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.oidc.client_id.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"text\"\n                    placeholder={t('fields.oidc.client_id.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    showCopyButton={showCopyButtons}\n                    aria-required={true}\n                    aria-invalid={Boolean(fieldState.error)}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.oidc.client_id.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          {showClientSecret && (\n            <FormField\n              control={form.control}\n              name=\"client_secret\"\n              render={({ field, fieldState }) => (\n                <FormItem>\n                  <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                    {t('fields.oidc.client_secret.label')}\n                  </FormLabel>\n                  <FormControl>\n                    <CopyableTextField\n                      type=\"password\"\n                      placeholder={t('fields.oidc.client_secret.placeholder')}\n                      error={Boolean(fieldState.error)}\n                      readOnly={readOnly}\n                      showCopyButton={showCopyButtons}\n                      aria-required={true}\n                      aria-invalid={Boolean(fieldState.error)}\n                      {...field}\n                    />\n                  </FormControl>\n                  <FormMessage\n                    role=\"alert\"\n                    className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                  />\n                  <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                    {t('fields.oidc.client_secret.helper_text')}\n                  </FormDescription>\n                </FormItem>\n              )}\n            />\n          )}\n\n          <CommonConfigureFields\n            idpConfig={idpConfig}\n            readOnly={readOnly}\n            customMessages={customMessages}\n          />\n        </div>\n      </Form>\n    );\n  },\n);\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/oidc-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/okta-sso-configure-form.tsx",
      "content": "/**\n * Okta SSO provider configuration form.\n * @module okta-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type OktaConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { Link } from '@/components/ui/link';\nimport { TextField } from '@/components/ui/text-field';\nimport { useProviderFormMode } from '@/hooks/my-organization/use-provider-form-mode';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nconst OKTA_HELP_LINKS = {\n  domain: 'https://developer.okta.com/docs/guides/find-your-domain/main/',\n  client_id: 'https://developer.okta.com/docs/guides/find-your-app-credentials/main',\n  client_secret: 'https://developer.okta.com/docs/guides/find-your-app-credentials/main',\n} as const;\n\nexport interface OktaConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => OktaConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: OktaConfigureFormValues) => void;\n}\n\ninterface OktaConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const OktaProviderForm = React.forwardRef<OktaConfigureFormHandle, OktaConfigureFormProps>(\n  function OktaProviderForm(\n    {\n      initialData,\n      readOnly = false,\n      customMessages = {},\n      className,\n      onFormDirty,\n      idpConfig,\n      mode = 'create',\n    },\n    ref,\n  ) {\n    const { t } = useTranslator(\n      'idp_management.create_sso_provider.provider_configure',\n      customMessages,\n    );\n\n    const { coreClient } = useCoreClient();\n    const { showCopyButtons } = useProviderFormMode(mode);\n\n    const callbackUrl = React.useMemo(() => {\n      const domain = coreClient?.getDomain() || 'YOUR_DOMAIN';\n      return `https://${domain}/login/callback`;\n    }, [coreClient]);\n\n    const oktaData = initialData as OktaConfigureFormValues | undefined;\n\n    const form = useForm<OktaConfigureFormValues>({\n      resolver: zodResolver(createProviderConfigureSchema('okta')),\n      mode: FORM_VALIDATION_MODE,\n      reValidateMode: FORM_REVALIDATE_MODE,\n      defaultValues: {\n        domain: oktaData?.domain || '',\n        client_id: oktaData?.client_id || '',\n        client_secret: oktaData?.client_secret || '',\n        icon_url: oktaData?.icon_url || '',\n        callback_url: oktaData?.callback_url || callbackUrl,\n        show_as_button: oktaData?.show_as_button ?? false,\n        assign_membership_on_login: oktaData?.assign_membership_on_login ?? false,\n      },\n    });\n\n    const { isDirty } = form.formState;\n\n    React.useEffect(() => {\n      onFormDirty?.(isDirty);\n    }, [isDirty, onFormDirty]);\n\n    React.useImperativeHandle(ref, () => ({\n      validate: async () => {\n        return await form.trigger();\n      },\n      getData: () => form.getValues(),\n      isDirty: () => form.formState.isDirty,\n      reset: (data) => {\n        if (data) {\n          form.reset(data);\n        } else {\n          form.reset();\n        }\n      },\n    }));\n\n    return (\n      <Form {...form}>\n        <div className={cn('space-y-6', className)}>\n          <FormField\n            control={form.control}\n            name=\"domain\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.okta.domain.label')}\n                </FormLabel>\n                <FormControl>\n                  <TextField\n                    type=\"text\"\n                    placeholder={t('fields.okta.domain.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  <>\n                    {t.trans('fields.okta.domain.helper_text', {\n                      components: {\n                        link: (children: string) => (\n                          <Link\n                            key=\"okta-domain-link\"\n                            href={OKTA_HELP_LINKS.domain}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                          >\n                            {children}\n                          </Link>\n                        ),\n                      },\n                    })}\n                  </>\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"client_id\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.okta.client_id.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"text\"\n                    placeholder={t('fields.okta.client_id.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    showCopyButton={showCopyButtons}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  <>\n                    {t.trans('fields.okta.client_id.helper_text', {\n                      components: {\n                        link: (children: string) => (\n                          <Link\n                            key=\"okta-client-id-link\"\n                            href={OKTA_HELP_LINKS.client_id}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                          >\n                            {children}\n                          </Link>\n                        ),\n                      },\n                    })}\n                  </>\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"client_secret\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.okta.client_secret.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"password\"\n                    placeholder={t('fields.okta.client_secret.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    showCopyButton={showCopyButtons}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  <>\n                    {t.trans('fields.okta.client_secret.helper_text', {\n                      components: {\n                        link: (children: string) => (\n                          <Link\n                            key=\"okta-client-secret-link\"\n                            href={OKTA_HELP_LINKS.client_secret}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                          >\n                            {children}\n                          </Link>\n                        ),\n                      },\n                    })}\n                  </>\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"callback_url\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.okta.callback_url.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"text\"\n                    placeholder={t('fields.okta.callback_url.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={true}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.okta.callback_url.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <CommonConfigureFields\n            idpConfig={idpConfig}\n            readOnly={readOnly}\n            customMessages={customMessages}\n          />\n        </div>\n      </Form>\n    );\n  },\n);\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/okta-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/ping-federate-sso-configure-form.tsx",
      "content": "/**\n * PingFederate SSO provider configuration form.\n * @module ping-federate-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type PingFederateConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n} from '@/components/ui/accordion';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { FileUpload } from '@/components/ui/file-upload';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { Link } from '@/components/ui/link';\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from '@/components/ui/select';\nimport { TextField } from '@/components/ui/text-field';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nconst PING_FEDERATE_HELP_LINKS = {\n  sign_request: 'domain/pem?cert=connection',\n} as const;\n\nconst SIGNATURE_ALGORITHMS = [\n  { value: 'rsa-sha1', label: 'RSA-SHA1' },\n  { value: 'rsa-sha256', label: 'RSA-SHA256' },\n] as const;\n\nconst DIGEST_ALGORITHMS = [\n  { value: 'sha1', label: 'SHA1' },\n  { value: 'sha256', label: 'SHA256' },\n] as const;\n\nconst ALLOWED_CERT_EXTENSIONS = ['.pem', '.cer', '.crt'] as const;\n\nexport interface PingFederateConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => PingFederateConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: PingFederateConfigureFormValues) => void;\n}\n\ninterface PingFederateConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const PingFederateProviderForm = React.forwardRef<\n  PingFederateConfigureFormHandle,\n  PingFederateConfigureFormProps\n>(function PingFederateProviderForm(\n  { initialData, readOnly = false, customMessages = {}, className, onFormDirty, idpConfig },\n  ref,\n) {\n  const { t } = useTranslator(\n    'idp_management.create_sso_provider.provider_configure',\n    customMessages,\n  );\n\n  const [uploadedFiles, setUploadedFiles] = useState<File[]>([]);\n\n  const pingFederateData = initialData as PingFederateConfigureFormValues | undefined;\n\n  const form = useForm<PingFederateConfigureFormValues>({\n    resolver: zodResolver(createProviderConfigureSchema('pingfederate')),\n    mode: FORM_VALIDATION_MODE,\n    reValidateMode: FORM_REVALIDATE_MODE,\n    defaultValues: {\n      pingFederateBaseUrl: pingFederateData?.pingFederateBaseUrl || '',\n      signingCert: pingFederateData?.signingCert || '',\n      signSAMLRequest: pingFederateData?.signSAMLRequest || false,\n      signatureAlgorithm: pingFederateData?.signatureAlgorithm || 'rsa-sha256',\n      digestAlgorithm: pingFederateData?.digestAlgorithm || 'sha256',\n      show_as_button: pingFederateData?.show_as_button ?? false,\n      assign_membership_on_login: pingFederateData?.assign_membership_on_login ?? false,\n    },\n  });\n\n  const { isDirty } = form.formState;\n\n  React.useEffect(() => {\n    onFormDirty?.(isDirty);\n  }, [isDirty, onFormDirty]);\n\n  React.useImperativeHandle(ref, () => ({\n    validate: async () => {\n      return await form.trigger();\n    },\n    getData: () => form.getValues(),\n    isDirty: () => form.formState.isDirty,\n    reset: (data) => {\n      if (data) {\n        form.reset(data);\n      } else {\n        form.reset();\n      }\n    },\n  }));\n\n  const signRequestEnabled = form.watch('signSAMLRequest');\n\n  const isAllowedCertificateFile = React.useCallback((file: File) => {\n    const fileName = file.name.toLowerCase();\n    return ALLOWED_CERT_EXTENSIONS.some((extension) => fileName.endsWith(extension));\n  }, []);\n\n  const handleFileUpload = async (files: File[]) => {\n    setUploadedFiles(files);\n\n    const file = files[0];\n    if (file) {\n      try {\n        const content = await file.text();\n        form.setValue('signingCert', content, { shouldDirty: true, shouldValidate: true });\n        form.clearErrors('signingCert');\n      } catch (error) {\n        console.error('Error reading file:', error);\n      }\n    }\n  };\n\n  const handleInvalidFiles = (files: File[]) => {\n    if (files.some((file) => !isAllowedCertificateFile(file))) {\n      form.setError('signingCert', {\n        type: 'manual',\n        message: t('fields.ping-federate.sign_cert.error'),\n      });\n    }\n  };\n\n  return (\n    <Form {...form}>\n      <div className={cn('space-y-6', className)}>\n        <FormField\n          control={form.control}\n          name=\"pingFederateBaseUrl\"\n          render={({ field, fieldState }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.ping-federate.ping_federate_baseurl.label')}\n              </FormLabel>\n              <FormControl>\n                <TextField\n                  type=\"url\"\n                  placeholder={t('fields.ping-federate.ping_federate_baseurl.placeholder')}\n                  error={Boolean(fieldState.error)}\n                  readOnly={readOnly}\n                  aria-invalid={Boolean(fieldState.error)}\n                  {...field}\n                />\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n              <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                {t('fields.ping-federate.ping_federate_baseurl.helper_text')}\n              </FormDescription>\n            </FormItem>\n          )}\n        />\n\n        <FormField\n          control={form.control}\n          name=\"signingCert\"\n          render={() => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.ping-federate.sign_cert.label')}\n              </FormLabel>\n              <FormControl>\n                <div className=\"space-y-3\">\n                  <FileUpload\n                    accept={ALLOWED_CERT_EXTENSIONS.join(',')}\n                    onChange={handleFileUpload}\n                    onInvalidFiles={handleInvalidFiles}\n                    value={uploadedFiles}\n                    maxFiles={1}\n                    disabled={readOnly}\n                    className=\"w-full\"\n                    placeholder={t('fields.ping-federate.sign_cert.placeholder')}\n                  />\n                </div>\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n              <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                {t('fields.ping-federate.sign_cert.helper_text')}\n              </FormDescription>\n            </FormItem>\n          )}\n        />\n\n        <Accordion type=\"single\" collapsible className=\"w-full\">\n          <AccordionItem value=\"advanced-settings\">\n            <AccordionTrigger className=\"text-sm font-medium\">\n              {t('fields.ping-federate.advanced_settings.title')}\n            </AccordionTrigger>\n            <AccordionContent className=\"space-y-6\">\n              <FormField\n                control={form.control}\n                name=\"signSAMLRequest\"\n                render={({ field }) => (\n                  <FormItem className=\"flex flex-row items-start space-x-2 space-y-0\">\n                    <FormControl>\n                      <Checkbox\n                        checked={field.value || false}\n                        onCheckedChange={field.onChange}\n                        disabled={readOnly}\n                      />\n                    </FormControl>\n                    <div className=\"space-y-1 leading-none\">\n                      <FormLabel className=\"text-sm font-medium cursor-pointer\">\n                        {t('fields.ping-federate.advanced_settings.sign_request.label')}\n                      </FormLabel>\n                      <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                        <>\n                          {t.trans(\n                            'fields.ping-federate.advanced_settings.sign_request.helper_text',\n                            {\n                              components: {\n                                link: (children: string) => (\n                                  <Link\n                                    key=\"ping-federate-sign-request-link\"\n                                    href={PING_FEDERATE_HELP_LINKS.sign_request}\n                                    target=\"_blank\"\n                                    rel=\"noopener noreferrer\"\n                                  >\n                                    {children}\n                                  </Link>\n                                ),\n                              },\n                            },\n                          )}\n                        </>\n                      </FormDescription>\n                    </div>\n                  </FormItem>\n                )}\n              />\n\n              {signRequestEnabled && (\n                <>\n                  <FormField\n                    control={form.control}\n                    name=\"signatureAlgorithm\"\n                    render={({ field }) => (\n                      <FormItem>\n                        <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                          {t('fields.ping-federate.advanced_settings.sign_request_algorithm.label')}\n                        </FormLabel>\n                        <Select onValueChange={field.onChange} value={field.value || ''}>\n                          <FormControl>\n                            <SelectTrigger>\n                              <SelectValue\n                                placeholder={t(\n                                  'fields.ping-federate.advanced_settings.sign_request_algorithm.placeholder',\n                                )}\n                              />\n                            </SelectTrigger>\n                          </FormControl>\n                          <SelectContent>\n                            {SIGNATURE_ALGORITHMS.map((algorithm) => (\n                              <SelectItem key={algorithm.value} value={algorithm.value}>\n                                {algorithm.label}\n                              </SelectItem>\n                            ))}\n                          </SelectContent>\n                        </Select>\n                        <FormMessage\n                          role=\"alert\"\n                          className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                        />\n                      </FormItem>\n                    )}\n                  />\n\n                  <FormField\n                    control={form.control}\n                    name=\"digestAlgorithm\"\n                    render={({ field }) => (\n                      <FormItem>\n                        <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                          {t(\n                            'fields.ping-federate.advanced_settings.sign_request_algorithm_digest.label',\n                          )}\n                        </FormLabel>\n                        <Select onValueChange={field.onChange} value={field.value || ''}>\n                          <FormControl>\n                            <SelectTrigger>\n                              <SelectValue\n                                placeholder={t(\n                                  'fields.ping-federate.advanced_settings.sign_request_algorithm_digest.placeholder',\n                                )}\n                              />\n                            </SelectTrigger>\n                          </FormControl>\n                          <SelectContent>\n                            {DIGEST_ALGORITHMS.map((algorithm) => (\n                              <SelectItem key={algorithm.value} value={algorithm.value}>\n                                {algorithm.label}\n                              </SelectItem>\n                            ))}\n                          </SelectContent>\n                        </Select>\n                        <FormMessage\n                          role=\"alert\"\n                          className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                        />\n                      </FormItem>\n                    )}\n                  />\n                </>\n              )}\n            </AccordionContent>\n          </AccordionItem>\n        </Accordion>\n\n        <CommonConfigureFields\n          idpConfig={idpConfig}\n          readOnly={readOnly}\n          customMessages={customMessages}\n        />\n      </div>\n    </Form>\n  );\n});\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/ping-federate-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/provider-configure-fields.tsx",
      "content": "/**\n * Provider-specific configuration field router.\n * @module provider-configure-fields\n * @internal\n */\n\nimport { STRATEGIES } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport {\n  AdfsProviderForm,\n  type AdfsConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/adfs-sso-configure-form';\nimport {\n  GoogleAppsProviderForm,\n  type GoogleAppsConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/google-apps-sso-configure-form';\nimport {\n  OidcProviderForm,\n  type OidcConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/oidc-sso-configure-form';\nimport {\n  OktaProviderForm,\n  type OktaConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/okta-sso-configure-form';\nimport {\n  PingFederateProviderForm,\n  type PingFederateConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/ping-federate-sso-configure-form';\nimport {\n  SamlpProviderForm,\n  type SamlpConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/samlp-sso-configure-form';\nimport {\n  WaadProviderForm,\n  type WaadConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/waad-sso-configure-form';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nexport type ProviderConfigureFormHandle =\n  | OktaConfigureFormHandle\n  | GoogleAppsConfigureFormHandle\n  | WaadConfigureFormHandle\n  | PingFederateConfigureFormHandle\n  | AdfsConfigureFormHandle\n  | SamlpConfigureFormHandle\n  | OidcConfigureFormHandle;\n\nexport const ProviderConfigureFields = React.forwardRef<\n  ProviderConfigureFormHandle,\n  ProviderConfigureFieldsProps\n>(function ProviderConfigureFields({ strategy, className, ...props }, ref) {\n  const renderProviderForm = () => {\n    switch (strategy) {\n      case STRATEGIES.OKTA:\n        return (\n          <OktaProviderForm ref={ref as React.ForwardedRef<OktaConfigureFormHandle>} {...props} />\n        );\n      case STRATEGIES.GOOGLE_APPS:\n        return (\n          <GoogleAppsProviderForm\n            ref={ref as React.ForwardedRef<GoogleAppsConfigureFormHandle>}\n            {...props}\n          />\n        );\n      case STRATEGIES.WAAD:\n        return (\n          <WaadProviderForm ref={ref as React.ForwardedRef<WaadConfigureFormHandle>} {...props} />\n        );\n      case STRATEGIES.PINGFEDERATE:\n        return (\n          <PingFederateProviderForm\n            ref={ref as React.ForwardedRef<PingFederateConfigureFormHandle>}\n            {...props}\n          />\n        );\n      case STRATEGIES.ADFS:\n        return (\n          <AdfsProviderForm ref={ref as React.ForwardedRef<AdfsConfigureFormHandle>} {...props} />\n        );\n      case STRATEGIES.SAMLP:\n        return (\n          <SamlpProviderForm ref={ref as React.ForwardedRef<SamlpConfigureFormHandle>} {...props} />\n        );\n      case STRATEGIES.OIDC:\n        return (\n          <OidcProviderForm ref={ref as React.ForwardedRef<OidcConfigureFormHandle>} {...props} />\n        );\n      default:\n        return null;\n    }\n  };\n\n  return <div className={cn('space-y-6', className)}>{renderProviderForm()}</div>;\n});\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/provider-configure-fields.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/samlp-sso-configure-form.tsx",
      "content": "/**\n * SAML-P SSO provider configuration form.\n * @module samlp-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type SamlpConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n} from '@/components/ui/accordion';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { FileUpload } from '@/components/ui/file-upload';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { Label } from '@/components/ui/label';\nimport { Link } from '@/components/ui/link';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport {\n  Select,\n  SelectContent,\n  SelectItem,\n  SelectTrigger,\n  SelectValue,\n} from '@/components/ui/select';\nimport { TextField } from '@/components/ui/text-field';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nconst SAMLP_HELP_LINKS = {\n  sign_request: 'domain/pem?cert=connection',\n} as const;\n\nconst SIGNATURE_ALGORITHMS = [\n  { value: 'rsa-sha1', label: 'RSA-SHA1' },\n  { value: 'rsa-sha256', label: 'RSA-SHA256' },\n] as const;\n\nconst DIGEST_ALGORITHMS = [\n  { value: 'sha1', label: 'SHA1' },\n  { value: 'sha256', label: 'SHA256' },\n] as const;\n\nconst BINDING_METHODS = [\n  { value: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', label: 'HTTP-Redirect' },\n  { value: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', label: 'HTTP-POST' },\n] as const;\n\nexport interface SamlpConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => SamlpConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: SamlpConfigureFormValues) => void;\n}\n\ninterface SamlpConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const SamlpProviderForm = React.forwardRef<\n  SamlpConfigureFormHandle,\n  SamlpConfigureFormProps\n>(function SamlpProviderForm(\n  { initialData, readOnly = false, customMessages = {}, className, onFormDirty, idpConfig },\n  ref,\n) {\n  const { t } = useTranslator(\n    'idp_management.create_sso_provider.provider_configure',\n    customMessages,\n  );\n\n  const [uploadedFiles, setUploadedFiles] = useState<File[]>([]);\n\n  const samlpData = initialData as SamlpConfigureFormValues | undefined;\n\n  const form = useForm<SamlpConfigureFormValues>({\n    resolver: zodResolver(createProviderConfigureSchema('samlp')),\n    mode: FORM_VALIDATION_MODE,\n    reValidateMode: FORM_REVALIDATE_MODE,\n    defaultValues: {\n      meta_data_source: samlpData?.meta_data_source || 'meta_data_url',\n      metadataUrl: samlpData?.metadataUrl || '',\n      single_sign_on_login_url: samlpData?.single_sign_on_login_url || '',\n      cert: samlpData?.cert || '',\n      signSAMLRequest: samlpData?.signSAMLRequest || false,\n      signatureAlgorithm: samlpData?.signatureAlgorithm || 'rsa-sha256',\n      digestAlgorithm: samlpData?.digestAlgorithm || 'sha256',\n      bindingMethod: samlpData?.bindingMethod || 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',\n      show_as_button: samlpData?.show_as_button ?? false,\n      assign_membership_on_login: samlpData?.assign_membership_on_login ?? false,\n    },\n  });\n\n  const { isDirty } = form.formState;\n\n  React.useEffect(() => {\n    onFormDirty?.(isDirty);\n  }, [isDirty, onFormDirty]);\n\n  React.useImperativeHandle(ref, () => ({\n    validate: async () => {\n      return await form.trigger();\n    },\n    getData: () => form.getValues(),\n    isDirty: () => form.formState.isDirty,\n    reset: (data) => {\n      if (data) {\n        form.reset(data);\n      } else {\n        form.reset();\n      }\n    },\n  }));\n\n  const typeValue = form.watch('meta_data_source');\n  const showMetadataFileField = typeValue === 'meta_data_file';\n\n  const signRequestEnabled = form.watch('signSAMLRequest');\n\n  const handleFileUpload = async (files: File[]) => {\n    setUploadedFiles(files);\n\n    const file = files[0];\n    if (file) {\n      try {\n        const content = await file.text();\n        form.setValue('cert', content);\n      } catch (error) {\n        console.error('Error reading file:', error);\n      }\n    }\n  };\n\n  return (\n    <Form {...form}>\n      <div className={cn('space-y-6', className)}>\n        <FormField\n          control={form.control}\n          name=\"meta_data_source\"\n          render={({ field }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.samlp.meta_data_source.label')}\n              </FormLabel>\n              <FormControl>\n                <RadioGroup\n                  value={field.value}\n                  onValueChange={field.onChange}\n                  disabled={readOnly}\n                  className=\"flex flex-col space-y-2\"\n                >\n                  <div className=\"flex items-center space-x-2\">\n                    <RadioGroupItem value=\"meta_data_url\" id=\"meta_data_url\" />\n                    <Label htmlFor=\"meta_data_url\" className=\"text-sm font-normal cursor-pointer\">\n                      {t('fields.samlp.meta_data_source.options.meta_data_url.label')}\n                    </Label>\n                  </div>\n                  <div className=\"flex items-center space-x-2\">\n                    <RadioGroupItem value=\"meta_data_file\" id=\"meta_data_file\" />\n                    <Label htmlFor=\"meta_data_file\" className=\"text-sm font-normal cursor-pointer\">\n                      {t('fields.samlp.meta_data_source.options.meta_data_file.label')}\n                    </Label>\n                  </div>\n                </RadioGroup>\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n            </FormItem>\n          )}\n        />\n\n        <FormField\n          control={form.control}\n          name=\"metadataUrl\"\n          render={({ field, fieldState }) => (\n            <FormItem>\n              <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                {t('fields.samlp.meta_data_url.label')}\n              </FormLabel>\n              <FormControl>\n                <TextField\n                  type=\"url\"\n                  placeholder={t('fields.samlp.meta_data_url.placeholder')}\n                  error={Boolean(fieldState.error)}\n                  readOnly={readOnly}\n                  aria-required={true}\n                  aria-invalid={Boolean(fieldState.error)}\n                  {...field}\n                />\n              </FormControl>\n              <FormMessage\n                role=\"alert\"\n                className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n              />\n              <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                {t('fields.samlp.meta_data_url.helper_text')}\n              </FormDescription>\n            </FormItem>\n          )}\n        />\n\n        {showMetadataFileField && (\n          <>\n            <FormField\n              control={form.control}\n              name=\"single_sign_on_login_url\"\n              render={({ field, fieldState }) => (\n                <FormItem>\n                  <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                    {t('fields.samlp.single_sign_on_login_url.label')}\n                  </FormLabel>\n                  <FormControl>\n                    <TextField\n                      type=\"url\"\n                      placeholder={t('fields.samlp.single_sign_on_login_url.placeholder')}\n                      error={Boolean(fieldState.error)}\n                      readOnly={readOnly}\n                      aria-required={true}\n                      aria-invalid={Boolean(fieldState.error)}\n                      {...field}\n                    />\n                  </FormControl>\n                  <FormMessage\n                    role=\"alert\"\n                    className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                  />\n                  <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                    {t('fields.samlp.single_sign_on_login_url.helper_text')}\n                  </FormDescription>\n                </FormItem>\n              )}\n            />\n            <FormField\n              control={form.control}\n              name=\"cert\"\n              render={() => (\n                <FormItem>\n                  <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                    {t('fields.samlp.cert.label')}\n                  </FormLabel>\n                  <FormControl>\n                    <div className=\"space-y-3\">\n                      <FileUpload\n                        accept=\".pem\"\n                        onChange={handleFileUpload}\n                        value={uploadedFiles}\n                        maxFiles={1}\n                        disabled={readOnly}\n                        className=\"w-full\"\n                        placeholder={t('fields.samlp.cert.placeholder')}\n                      />\n                    </div>\n                  </FormControl>\n                  <FormMessage\n                    role=\"alert\"\n                    className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                  />\n                  <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                    {t('fields.samlp.cert.helper_text')}\n                  </FormDescription>\n                </FormItem>\n              )}\n            />\n          </>\n        )}\n\n        <Accordion type=\"single\" collapsible className=\"w-full\">\n          <AccordionItem value=\"advanced-settings\">\n            <AccordionTrigger className=\"text-sm font-medium\">\n              {t('fields.samlp.advanced_settings.title')}\n            </AccordionTrigger>\n            <AccordionContent className=\"space-y-6\">\n              <FormField\n                control={form.control}\n                name=\"signSAMLRequest\"\n                render={({ field }) => (\n                  <FormItem className=\"flex flex-row items-start space-x-2 space-y-0\">\n                    <FormControl>\n                      <Checkbox\n                        checked={field.value || false}\n                        onCheckedChange={field.onChange}\n                        disabled={readOnly}\n                      />\n                    </FormControl>\n                    <div className=\"space-y-1 leading-none\">\n                      <FormLabel className=\"text-sm font-medium cursor-pointer\">\n                        {t('fields.samlp.advanced_settings.sign_request.label')}\n                      </FormLabel>\n                      <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                        <>\n                          {t.trans(\n                            typeValue === 'meta_data_url'\n                              ? 'fields.samlp.advanced_settings.sign_request.helper_text_metadata_url'\n                              : 'fields.samlp.advanced_settings.sign_request.helper_text_metadata_file',\n                            {\n                              components: {\n                                link: (children: string) => (\n                                  <Link\n                                    key=\"samlp-sign-request-link\"\n                                    href={SAMLP_HELP_LINKS.sign_request}\n                                    target=\"_blank\"\n                                    rel=\"noopener noreferrer\"\n                                  >\n                                    {children}\n                                  </Link>\n                                ),\n                              },\n                            },\n                          )}\n                        </>\n                      </FormDescription>\n                    </div>\n                  </FormItem>\n                )}\n              />\n\n              {signRequestEnabled && (\n                <>\n                  <FormField\n                    control={form.control}\n                    name=\"signatureAlgorithm\"\n                    render={({ field }) => (\n                      <FormItem>\n                        <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                          {t('fields.samlp.advanced_settings.sign_request_algorithm.label')}\n                        </FormLabel>\n                        <Select onValueChange={field.onChange} value={field.value || ''}>\n                          <FormControl>\n                            <SelectTrigger>\n                              <SelectValue\n                                placeholder={t(\n                                  'fields.samlp.advanced_settings.sign_request_algorithm.placeholder',\n                                )}\n                              />\n                            </SelectTrigger>\n                          </FormControl>\n                          <SelectContent>\n                            {SIGNATURE_ALGORITHMS.map((algorithm) => (\n                              <SelectItem key={algorithm.value} value={algorithm.value}>\n                                {algorithm.label}\n                              </SelectItem>\n                            ))}\n                          </SelectContent>\n                        </Select>\n                        <FormMessage\n                          role=\"alert\"\n                          className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                        />\n                      </FormItem>\n                    )}\n                  />\n\n                  <FormField\n                    control={form.control}\n                    name=\"digestAlgorithm\"\n                    render={({ field }) => (\n                      <FormItem>\n                        <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                          {t('fields.samlp.advanced_settings.sign_request_algorithm_digest.label')}\n                        </FormLabel>\n                        <Select onValueChange={field.onChange} value={field.value || ''}>\n                          <FormControl>\n                            <SelectTrigger>\n                              <SelectValue\n                                placeholder={t(\n                                  'fields.samlp.advanced_settings.sign_request_algorithm_digest.placeholder',\n                                )}\n                              />\n                            </SelectTrigger>\n                          </FormControl>\n                          <SelectContent>\n                            {DIGEST_ALGORITHMS.map((algorithm) => (\n                              <SelectItem key={algorithm.value} value={algorithm.value}>\n                                {algorithm.label}\n                              </SelectItem>\n                            ))}\n                          </SelectContent>\n                        </Select>\n                        <FormMessage\n                          role=\"alert\"\n                          className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                        />\n                      </FormItem>\n                    )}\n                  />\n                </>\n              )}\n              <FormField\n                control={form.control}\n                name=\"bindingMethod\"\n                render={({ field }) => (\n                  <FormItem>\n                    <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                      {t('fields.samlp.advanced_settings.request_protocol_binding.label')}\n                    </FormLabel>\n                    <Select onValueChange={field.onChange} value={field.value || ''}>\n                      <FormControl>\n                        <SelectTrigger>\n                          <SelectValue\n                            placeholder={t(\n                              'fields.samlp.advanced_settings.request_protocol_binding.placeholder',\n                            )}\n                          />\n                        </SelectTrigger>\n                      </FormControl>\n                      <SelectContent>\n                        {BINDING_METHODS.map((method) => (\n                          <SelectItem key={method.value} value={method.value}>\n                            {method.label}\n                          </SelectItem>\n                        ))}\n                      </SelectContent>\n                    </Select>\n                    <FormMessage\n                      role=\"alert\"\n                      className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                    />\n                  </FormItem>\n                )}\n              />\n            </AccordionContent>\n          </AccordionItem>\n        </Accordion>\n\n        <CommonConfigureFields\n          idpConfig={idpConfig}\n          readOnly={readOnly}\n          customMessages={customMessages}\n        />\n      </div>\n    </Form>\n  );\n});\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/samlp-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/waad-sso-configure-form.tsx",
      "content": "/**\n * Azure AD (WAAD) SSO provider configuration form.\n * @module waad-sso-configure-form\n * @internal\n */\n\nimport {\n  createProviderConfigureSchema,\n  type WaadConfigureFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { CommonConfigureFields } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/common-configure-fields';\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport {\n  Form,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormMessage,\n  FormDescription,\n} from '@/components/ui/form';\nimport { TextField } from '@/components/ui/text-field';\nimport { useProviderFormMode } from '@/hooks/my-organization/use-provider-form-mode';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { ProviderConfigureFieldsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nexport interface WaadConfigureFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => WaadConfigureFormValues;\n  isDirty: () => boolean;\n  reset: (data?: WaadConfigureFormValues) => void;\n}\n\ninterface WaadConfigureFormProps extends Omit<ProviderConfigureFieldsProps, 'strategy'> {}\n\nexport const WaadProviderForm = React.forwardRef<WaadConfigureFormHandle, WaadConfigureFormProps>(\n  function WaadProviderForm(\n    {\n      initialData,\n      readOnly = false,\n      customMessages = {},\n      className,\n      onFormDirty,\n      idpConfig,\n      mode = 'create',\n    },\n    ref,\n  ) {\n    const { t } = useTranslator(\n      'idp_management.create_sso_provider.provider_configure',\n      customMessages,\n    );\n\n    const { coreClient } = useCoreClient();\n    const { showCopyButtons } = useProviderFormMode(mode);\n\n    const callbackUrl = React.useMemo(() => {\n      const domain = coreClient?.getDomain() || 'YOUR_DOMAIN';\n      return `https://${domain}/login/callback`;\n    }, [coreClient]);\n\n    const waadData = initialData as WaadConfigureFormValues | undefined;\n\n    const form = useForm<WaadConfigureFormValues>({\n      resolver: zodResolver(createProviderConfigureSchema('waad')),\n      mode: FORM_VALIDATION_MODE,\n      reValidateMode: FORM_REVALIDATE_MODE,\n      defaultValues: {\n        tenant_domain: waadData?.tenant_domain || '',\n        client_id: waadData?.client_id || '',\n        client_secret: waadData?.client_secret || '',\n        callback_url: waadData?.callback_url || callbackUrl,\n        show_as_button: waadData?.show_as_button ?? false,\n        assign_membership_on_login: waadData?.assign_membership_on_login ?? false,\n      },\n    });\n\n    const { isDirty } = form.formState;\n\n    React.useEffect(() => {\n      onFormDirty?.(isDirty);\n    }, [isDirty, onFormDirty]);\n\n    React.useImperativeHandle(ref, () => ({\n      validate: async () => {\n        return await form.trigger();\n      },\n      getData: () => form.getValues(),\n      isDirty: () => form.formState.isDirty,\n      reset: (data) => {\n        if (data) {\n          form.reset(data);\n        } else {\n          form.reset();\n        }\n      },\n    }));\n\n    return (\n      <Form {...form}>\n        <div className={cn('space-y-6', className)}>\n          <FormField\n            control={form.control}\n            name=\"tenant_domain\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.waad.tenant_domain.label')}\n                </FormLabel>\n                <FormControl>\n                  <TextField\n                    type=\"text\"\n                    placeholder={t('fields.waad.tenant_domain.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"client_id\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.waad.client_id.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"text\"\n                    placeholder={t('fields.waad.client_id.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    showCopyButton={showCopyButtons}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.waad.client_id.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"client_secret\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.waad.client_secret.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"password\"\n                    placeholder={t('fields.waad.client_secret.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={readOnly}\n                    showCopyButton={showCopyButtons}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.waad.client_secret.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"callback_url\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm font-medium text-(length:--font-size-label)\">\n                  {t('fields.waad.callback_url.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField\n                    type=\"text\"\n                    placeholder={t('fields.waad.callback_url.placeholder')}\n                    error={Boolean(fieldState.error)}\n                    readOnly={true}\n                    {...field}\n                  />\n                </FormControl>\n                <FormMessage\n                  role=\"alert\"\n                  className=\"text-sm text-left text-(length:--font-size-paragraph)\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.waad.callback_url.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <CommonConfigureFields\n            idpConfig={idpConfig}\n            readOnly={readOnly}\n            customMessages={customMessages}\n          />\n        </div>\n      </Form>\n    );\n  },\n);\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/waad-sso-configure-form.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-details.tsx",
      "content": "/**\n * SSO provider details form step.\n * @module provider-details\n * @internal\n */\n\nimport {\n  createProviderDetailsSchema,\n  type ProviderDetailsFormValues,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport * as React from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { Section } from '@/components/auth0/shared/section';\nimport {\n  Form,\n  FormControl,\n  FormDescription,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormMessage,\n} from '@/components/ui/form';\nimport { TextField } from '@/components/ui/text-field';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_REVALIDATE_MODE, FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport type {\n  ProviderDetailsFormHandle,\n  ProviderDetailsProps,\n} from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\nexport const ProviderDetails = React.forwardRef<ProviderDetailsFormHandle, ProviderDetailsProps>(\n  function ProviderDetails(\n    { initialData, mode, readOnly = false, customMessages = {}, className, onFormDirty },\n    ref,\n  ) {\n    const { t } = useTranslator(\n      'idp_management.create_sso_provider.provider_details',\n      customMessages,\n    );\n\n    const form = useForm<ProviderDetailsFormValues>({\n      resolver: zodResolver(createProviderDetailsSchema()),\n      mode: FORM_VALIDATION_MODE,\n      reValidateMode: FORM_REVALIDATE_MODE,\n      defaultValues: {\n        name: initialData?.name || '',\n        display_name: initialData?.display_name || '',\n      },\n    });\n\n    const { isDirty } = form.formState;\n\n    React.useEffect(() => {\n      onFormDirty?.(isDirty);\n    }, [isDirty, onFormDirty]);\n\n    React.useImperativeHandle(ref, () => ({\n      validate: async () => {\n        return await form.trigger();\n      },\n      getData: () => form.getValues(),\n      isDirty: () => form.formState.isDirty,\n      reset: (data) => {\n        if (data) {\n          form.reset(data);\n        } else {\n          form.reset();\n        }\n      },\n    }));\n\n    return (\n      <Form {...form}>\n        <div className={className}>\n          <Section title={t('title')} description={t('description')}>\n            <FormField\n              control={form.control}\n              name=\"name\"\n              render={({ field, fieldState }) => (\n                <FormItem>\n                  <FormLabel className=\"text-sm text-(length:--font-size-label) font-medium\">\n                    {t('fields.name.label')}\n                  </FormLabel>\n                  <FormControl>\n                    <TextField\n                      placeholder={t('fields.name.placeholder')}\n                      error={Boolean(fieldState.error)}\n                      readOnly={mode === 'edit' ? true : readOnly}\n                      {...field}\n                    />\n                  </FormControl>\n                  <FormMessage\n                    className=\"text-left text-sm text-(length:--font-size-paragraph)\"\n                    role=\"alert\"\n                  />\n                  <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                    {t('fields.name.helper_text')}\n                  </FormDescription>\n                </FormItem>\n              )}\n            />\n\n            <FormField\n              control={form.control}\n              name=\"display_name\"\n              render={({ field, fieldState }) => (\n                <FormItem>\n                  <FormLabel className=\"text-sm text-(length:--font-size-label) font-medium\">\n                    {t('fields.display_name.label')}\n                  </FormLabel>\n                  <FormControl>\n                    <TextField\n                      placeholder={t('fields.display_name.placeholder')}\n                      error={Boolean(fieldState.error)}\n                      readOnly={readOnly}\n                      {...field}\n                    />\n                  </FormControl>\n                  <FormMessage\n                    className=\"text-left text-sm text-(length:--font-size-paragraph)\"\n                    role=\"alert\"\n                  />\n                  <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                    {t('fields.display_name.helper_text')}\n                  </FormDescription>\n                </FormItem>\n              )}\n            />\n          </Section>\n        </div>\n      </Form>\n    );\n  },\n);\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-details.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal-content.tsx",
      "content": "/**\n * SSO provider deletion modal content.\n * @module provider-delete-modal-content\n * @internal\n */\n\nimport React from 'react';\n\nimport { Label } from '@/components/ui/label';\nimport { TextField } from '@/components/ui/text-field';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProviderDeleteModalContentProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-delete-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.onChange - Callback fired when the value changes\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.className - Optional CSS class name for styling\n * @returns JSX element\n */\nexport function SsoProviderDeleteModalContent({\n  onChange,\n  customMessages = {},\n  className,\n}: SsoProviderDeleteModalContentProps) {\n  const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    onChange(event.target.value);\n  };\n\n  const { t } = useTranslator('idp_management.delete_sso_provider.modal.content', customMessages);\n\n  return (\n    <div className={className}>\n      <p\n        id=\"delete-modal-content-description\"\n        className={cn(\n          'font-normal block text-sm text-left text-(length:--font-size-paragraph) text-muted-foreground mt-6 mb-6',\n        )}\n      >\n        {t('description')}\n      </p>\n      <Label\n        htmlFor=\"provider-name\"\n        className=\"text-sm text-(length:--font-size-label) font-medium\"\n      >\n        {t('field.label')}\n      </Label>\n      <TextField\n        id=\"provider-name\"\n        type=\"text\"\n        placeholder={t('field.placeholder')}\n        onChange={handleInputChange}\n        className=\"mt-2 mb-6\"\n      />\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal-content.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal.tsx",
      "content": "/**\n * SSO provider deletion modal.\n * @module provider-delete-modal\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { SsoProviderDeleteModalContent } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal-content';\nimport { Modal } from '@/components/ui/modal';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProviderDeleteModalProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-delete-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.className - Optional CSS class name for styling\n * @param props.isOpen - Whether the modal/dialog is open\n * @param props.onClose - Callback fired when the component should close\n * @param props.provider - SSO provider object\n * @param props.onDelete - Callback fired when delete action is triggered\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function SsoProviderDeleteModal({\n  className,\n  isOpen,\n  onClose,\n  provider,\n  onDelete,\n  isLoading = false,\n  customMessages = {},\n}: SsoProviderDeleteModalProps) {\n  const { t } = useTranslator('idp_management.delete_sso_provider', customMessages);\n  const [confirmationText, setConfirmationText] = React.useState('');\n\n  const handleModalContentChange = React.useCallback((value: string) => {\n    setConfirmationText(value);\n  }, []);\n\n  const handleDelete = React.useCallback(async () => {\n    if (provider) {\n      await onDelete(provider);\n      onClose();\n    }\n  }, [onDelete, provider, onClose]);\n\n  const handleOpenChange = React.useCallback(\n    (open: boolean) => {\n      if (!open) {\n        onClose();\n      }\n    },\n    [onClose],\n  );\n\n  React.useEffect(() => {\n    if (isOpen) {\n      setConfirmationText('');\n    }\n  }, [isOpen]);\n\n  return (\n    <Modal\n      open={isOpen}\n      onOpenChange={handleOpenChange}\n      className={cn('p-10', className)}\n      title={t('modal.title', { providerName: provider.name })}\n      content={\n        <div className=\"space-y-6\">\n          <p className={cn('text-sm text-muted-foreground text-(length:--font-size-paragraph)')}>\n            {t('modal.description', { providerName: provider.name })}\n          </p>\n\n          <SsoProviderDeleteModalContent\n            onChange={handleModalContentChange}\n            customMessages={customMessages.modal?.content}\n          />\n        </div>\n      }\n      modalActions={{\n        isLoading,\n        nextAction: {\n          type: 'button',\n          label: t('modal.actions.delete_button_label'),\n          onClick: handleDelete,\n          variant: 'destructive',\n          disabled: isLoading || confirmationText !== provider.name,\n        },\n        previousAction: {\n          label: t('modal.actions.cancel_button_label'),\n          onClick: onClose,\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete.tsx",
      "content": "/**\n * SSO provider delete section component.\n * @module provider-delete\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { SsoProviderDeleteModal } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent } from '@/components/ui/card';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProviderDeleteProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-delete-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.provider - SSO provider object\n * @param props.onDelete - Callback fired when delete action is triggered\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.readOnly - Whether the component is in read-only mode\n * @returns JSX element\n */\nexport function SsoProviderDelete({\n  provider,\n  onDelete,\n  customMessages = {},\n  isLoading,\n  readOnly,\n}: SsoProviderDeleteProps) {\n  const { t } = useTranslator('idp_management.delete_sso_provider', customMessages);\n  const [isModalOpen, setIsModalOpen] = React.useState(false);\n\n  const openModal = React.useCallback(() => {\n    setIsModalOpen(true);\n  }, []);\n\n  const closeModal = React.useCallback(() => {\n    setIsModalOpen(false);\n  }, []);\n\n  return (\n    <>\n      <div className={cn('w-full')}>\n        <Card className=\"p-6\">\n          <CardContent className=\"flex items-start justify-between gap-6 p-0\">\n            <div className=\"flex-1 space-y-2\">\n              <h3\n                className={cn('text-lg font-semibold text-left text-(length:--font-size-subtitle)')}\n              >\n                {t('title', { providerName: provider.name })}\n              </h3>\n              <p\n                className={cn(\n                  'text-sm text-muted-foreground text-left text-(length:--font-size-paragraph)',\n                )}\n              >\n                {t('description')}\n              </p>\n            </div>\n\n            <Button\n              variant=\"destructive\"\n              onClick={openModal}\n              disabled={readOnly}\n              className=\"shrink-0\"\n            >\n              {t('delete_button_label')}\n            </Button>\n          </CardContent>\n        </Card>\n      </div>\n\n      <SsoProviderDeleteModal\n        isOpen={isModalOpen}\n        onClose={closeModal}\n        provider={provider}\n        onDelete={onDelete}\n        isLoading={isLoading}\n        customMessages={customMessages.modal}\n      />\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-domain-tab-action-column.tsx",
      "content": "/**\n * SSO domain tab table action column.\n * @module sso-domain-tab-action-column\n * @internal\n */\n\nimport { Button } from '@/components/ui/button';\nimport { Spinner } from '@/components/ui/spinner';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type { SsoDomainTabActionColumn } from '@/types/my-organization/idp-management/sso-domain/sso-domain-tab-types';\n\n/**\n * SsoDomainTabActionsColumn component\n * Handles the actions column for SSO provider edit on domain tab table\n * with enable/disable toggle and verify button\n * @param props - Component props.\n * @param props.translatorKey - Translation namespace key\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.readOnly - Whether the component is in read-only mode\n * @param props.idpDomains - Identity provider domains\n * @param props.domain - Domain object or domain name\n * @param props.handleVerify - Handler function for domain verification\n * @param props.isUpdating - Whether an update operation is in progress\n * @param props.isUpdatingId - ID of the item currently being updated\n * @param props.onToggle - Callback fired when toggle state changes\n * @returns JSX element\n */\nexport function SsoDomainTabActionsColumn({\n  translatorKey = 'idp_management.edit_sso_provider.tabs.domains',\n  customMessages = {},\n  readOnly,\n  idpDomains,\n  domain,\n  handleVerify,\n  isUpdating,\n  isUpdatingId,\n  onToggle,\n}: SsoDomainTabActionColumn) {\n  const { t } = useTranslator(translatorKey, customMessages);\n\n  const providerHasDomain = idpDomains.includes(domain.id);\n\n  if (isUpdating && isUpdatingId === domain.id) {\n    return (\n      <div className=\"flex items-center justify-end gap-4 min-w-0\">\n        <Spinner size=\"sm\" />\n      </div>\n    );\n  }\n  return (\n    <div className=\"flex items-center justify-end gap-4 min-w-0\">\n      {domain.status === 'verified' ? (\n        <Tooltip>\n          <TooltipTrigger asChild>\n            <span>\n              <Switch\n                checked={providerHasDomain}\n                onCheckedChange={(checked) => onToggle(domain, checked)}\n                disabled={readOnly || isUpdating}\n              />\n            </span>\n          </TooltipTrigger>\n          <TooltipContent>\n            {providerHasDomain\n              ? t('table.actions.disable_domain_tooltip')\n              : t('table.actions.enable_domain_tooltip')}\n          </TooltipContent>\n        </Tooltip>\n      ) : (\n        <Button variant=\"outline\" size=\"sm\" onClick={() => handleVerify(domain)}>\n          {t('table.columns.verify')}\n        </Button>\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-domain-tab-action-column.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-domain-tab.tsx",
      "content": "/**\n * SSO provider domains tab component.\n * @module sso-domain-tab\n * @internal\n */\n\nimport type { Domain } from '@auth0/universal-components-core';\nimport { getComponentStyles } from '@auth0/universal-components-core';\nimport { Plus } from 'lucide-react';\nimport React from 'react';\n\nimport { DomainCreateModal } from '@/components/auth0/my-organization/shared/domain-management/domain-create/domain-create-modal';\nimport { DomainDeleteModal } from '@/components/auth0/my-organization/shared/domain-management/domain-delete/domain-delete-modal';\nimport { DomainVerifyModal } from '@/components/auth0/my-organization/shared/domain-management/domain-verify/domain-verify-modal';\nimport { SsoDomainTabActionsColumn } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-domain-tab-action-column';\nimport { DataTable, type Column } from '@/components/auth0/shared/data-table';\nimport { Header } from '@/components/auth0/shared/header';\nimport { Badge } from '@/components/ui/badge';\nimport { useSsoDomainTab } from '@/hooks/my-organization/use-sso-domain-tab';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { getStatusBadgeVariant } from '@/lib/utils/my-organization/domain-management/domain-management-utils';\nimport type { SsoDomainsTabProps } from '@/types/my-organization/idp-management/sso-domain/sso-domain-tab-types';\n\n/**\n * SsoDomainTab Component\n * @param props - Component props.\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.styling - Custom styling configuration with variables and classes\n * @param props.readOnly - Whether the component is in read-only mode\n * @param props.schema - Zod validation schema\n * @param props.idpId - Identity provider ID\n * @param props.domains - Array of domains\n * @param props.provider - SSO provider object\n * @returns JSX element\n */\nexport function SsoDomainTab({\n  customMessages = {},\n  styling = {\n    variables: { common: {}, light: {}, dark: {} },\n    classes: {},\n  },\n  readOnly = false,\n  schema,\n  idpId,\n  domains,\n  provider,\n}: SsoDomainsTabProps) {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.domains.content',\n    customMessages,\n  );\n\n  const { isDarkMode } = useTheme();\n  const currentStyles = React.useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  const {\n    domainsList,\n    isCreating,\n    selectedDomain,\n    showVerifyModal,\n    isVerifying,\n    showDeleteModal,\n    verifyError,\n    handleCloseVerifyModal,\n    handleVerify,\n    handleDeleteClick,\n    isLoading,\n    isDeleting,\n    setShowDeleteModal,\n    handleDelete,\n    setShowCreateModal,\n    showCreateModal,\n    handleCreate,\n    idpDomains,\n    handleVerifyActionColumn,\n    isUpdating,\n    isUpdatingId,\n    handleToggleSwitch,\n  } = useSsoDomainTab(idpId, {\n    customMessages,\n    domains,\n    provider,\n  });\n\n  const columns: Column<Domain>[] = React.useMemo(\n    () => [\n      {\n        type: 'text',\n        accessorKey: 'domain',\n        title: t('table.columns.name'),\n        render: (domain) => (\n          <div className=\"font-medium text-primary truncate\">{domain.domain}</div>\n        ),\n      },\n      {\n        type: 'text',\n        accessorKey: 'status',\n        title: t('table.columns.status'),\n        render: (domain) => (\n          <Badge variant={getStatusBadgeVariant(domain.status)} size={'sm'}>\n            {t(`table.domain_statuses.${domain.status}`)}\n          </Badge>\n        ),\n      },\n      {\n        type: 'actions',\n        title: '',\n        render: (domain) => (\n          <SsoDomainTabActionsColumn\n            translatorKey=\"idp_management.edit_sso_provider.tabs.domains.content\"\n            idpDomains={idpDomains}\n            readOnly={readOnly}\n            isUpdating={isUpdating}\n            isUpdatingId={isUpdatingId}\n            customMessages={customMessages}\n            onToggle={handleToggleSwitch}\n            handleVerify={handleVerifyActionColumn}\n            domain={domain}\n          />\n        ),\n      },\n    ],\n    [t],\n  );\n\n  return (\n    <div style={currentStyles.variables} className=\"space-y-8\">\n      <div className={currentStyles.classes?.['SsoDomainsTab-header']}>\n        <Header\n          title={t('title')}\n          description={t('description')}\n          actions={[\n            {\n              type: 'button',\n              label: t('create_button_text'),\n              onClick: () => setShowCreateModal(true),\n              icon: Plus,\n              disabled: domains?.createAction?.disabled || readOnly,\n            },\n          ]}\n        />\n      </div>\n      <DataTable\n        columns={columns}\n        data={domainsList}\n        loading={isLoading}\n        emptyState={{ title: t('table.empty_message') }}\n        className={currentStyles.classes?.['SsoDomainsTab-table']}\n      />\n\n      <DomainCreateModal\n        translatorKey=\"idp_management.edit_sso_provider.tabs.domains.content.domain_create.modal\"\n        className={currentStyles.classes?.['SsoDomainsTab-createModal']}\n        isOpen={showCreateModal}\n        isLoading={isCreating}\n        schema={schema?.create}\n        onClose={() => setShowCreateModal(false)}\n        onCreate={handleCreate}\n        customMessages={customMessages.domain_create}\n      />\n\n      <DomainVerifyModal\n        translatorKey=\"idp_management.edit_sso_provider.tabs.domains.content.domain_verify.modal\"\n        className={currentStyles.classes?.['SsoDomainsTab-verifyModal']}\n        isOpen={showVerifyModal}\n        isLoading={isVerifying}\n        domain={selectedDomain}\n        error={verifyError}\n        onClose={handleCloseVerifyModal}\n        onVerify={handleVerify}\n        onDelete={handleDeleteClick}\n        customMessages={customMessages.domain_verify}\n      />\n\n      <DomainDeleteModal\n        translatorKey=\"idp_management.edit_sso_provider.tabs.domains.content.domain_delete.modal\"\n        className={currentStyles.classes?.['SsoDomainsTab-deleteModal']}\n        domain={selectedDomain}\n        isOpen={showDeleteModal}\n        isLoading={isDeleting}\n        onClose={() => setShowDeleteModal(false)}\n        onDelete={handleDelete}\n        customMessages={customMessages.domain_delete}\n      />\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-domain-tab.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-mappings.tsx",
      "content": "/**\n * SSO provider attribute mappings display.\n * @module sso-provider-attribute-mappings\n * @internal\n */\n\nimport {\n  STRATEGY_DISPLAY_NAMES,\n  type BaseUserAttributeMapItem,\n} from '@auth0/universal-components-core';\nimport { Info } from 'lucide-react';\nimport * as React from 'react';\n\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport type { Column } from '@/components/auth0/shared/data-table';\nimport { Mapping } from '@/components/auth0/shared/mapping';\nimport { Badge } from '@/components/ui/badge';\nimport { Label } from '@/components/ui/label';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type { SsoProviderAttributeMappingsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-edit-types';\n\ntype AttributeItem = BaseUserAttributeMapItem & {\n  provisioning_field?: string;\n  sso_field?: string[];\n};\n\nconst SCIM_NAMESPACE = 'urn:ietf:params:scim:schemas:core:2.0:User';\n\nconst CHANGE_STATUS = {\n  UPDATED: 'updated',\n  REMOVED: 'removed',\n  NEW: 'new',\n} as const;\n\ntype ChangeStatus = (typeof CHANGE_STATUS)[keyof typeof CHANGE_STATUS];\n\nconst STATUS_VARIANTS: Record<ChangeStatus, 'info' | 'warning' | 'default'> = {\n  [CHANGE_STATUS.UPDATED]: 'info',\n  [CHANGE_STATUS.REMOVED]: 'warning',\n  [CHANGE_STATUS.NEW]: 'default',\n};\n\nconst getChangeStatus = (item: BaseUserAttributeMapItem): ChangeStatus | null => {\n  const { is_extra: isRemoved, is_missing: isNew } = item;\n\n  if (isRemoved && isNew) return CHANGE_STATUS.UPDATED;\n  if (isRemoved) return CHANGE_STATUS.REMOVED;\n  if (isNew) return CHANGE_STATUS.NEW;\n\n  return null;\n};\n\nconst AttributeNameCell = ({\n  item,\n  section,\n  t,\n}: {\n  item: BaseUserAttributeMapItem;\n  section: 'required' | 'optional';\n  t: (key: string) => string;\n}) => {\n  const status = getChangeStatus(item);\n\n  return (\n    <div className=\"flex items-center gap-2 min-w-0\">\n      <span className=\"truncate text-sm font-medium\">{item.label}</span>\n\n      {item.description && (\n        <Tooltip>\n          <TooltipTrigger asChild>\n            <Info\n              className=\"h-4 w-4 text-muted-foreground shrink-0 cursor-help\"\n              aria-hidden=\"true\"\n            />\n          </TooltipTrigger>\n          <TooltipContent side=\"top\" className=\"max-w-xs\">\n            {item.description}\n          </TooltipContent>\n        </Tooltip>\n      )}\n\n      {status && (\n        <Tooltip>\n          <TooltipTrigger asChild>\n            <Badge\n              variant={STATUS_VARIANTS[status]}\n              size=\"sm\"\n              className=\"shrink-0 uppercase tracking-tight cursor-help\"\n            >\n              {t(`mappings.${section}.table.tags.${status}.label`)}\n            </Badge>\n          </TooltipTrigger>\n          <TooltipContent side=\"top\" className=\"max-w-xs\">\n            {t(`mappings.${section}.table.tags.${status}.tooltip`)}\n          </TooltipContent>\n        </Tooltip>\n      )}\n    </div>\n  );\n};\n\n/**\n * Displays SSO provider attribute mappings configuration.\n *\n * @param props - Component props.\n * @param props.userAttributeMap - User attribute mapping configuration.\n * @param props.strategy - SSO strategy type.\n * @param props.isProvisioning - Whether provisioning is enabled.\n * @param props.customMessages - Custom i18n message overrides.\n * @param props.className - Additional CSS class names.\n * @returns Attribute mappings component.\n * @internal\n */\nexport function SsoProviderAttributeMappings({\n  userAttributeMap = [],\n  strategy,\n  isProvisioning = false,\n  customMessages,\n  className,\n}: SsoProviderAttributeMappingsProps) {\n  const { t } = useTranslator('idp_management.edit_sso_provider', customMessages);\n\n  const strategyLabel = React.useMemo(() => {\n    if (!strategy) return '';\n    const knownStrategy = (STRATEGY_DISPLAY_NAMES as Record<string, string>)[strategy];\n    return knownStrategy || strategy;\n  }, [strategy]);\n\n  const { requiredItems, optionalItems } = React.useMemo(() => {\n    const required: AttributeItem[] = [];\n    const optional: AttributeItem[] = [];\n\n    userAttributeMap?.forEach((item) => {\n      if (item.is_required) required.push(item);\n      else optional.push(item);\n    });\n\n    return { requiredItems: required, optionalItems: optional };\n  }, [userAttributeMap]);\n\n  const getColumns = React.useCallback(\n    (section: 'required' | 'optional'): Column<AttributeItem>[] => [\n      {\n        accessorKey: 'label',\n        type: 'text',\n        width: '30%',\n        title: t(`mappings.${section}.table.columns.attribute_name_label`),\n        render: (item) => <AttributeNameCell item={item} section={section} t={t} />,\n      },\n      {\n        accessorKey: isProvisioning ? 'provisioning_field' : 'sso_field',\n        type: 'custom',\n        width: '70%',\n        title: t(`mappings.${section}.table.columns.external_field_label`),\n        render: (item: AttributeItem) => {\n          const value = isProvisioning ? item.provisioning_field : item.sso_field?.join(', ');\n          return <CopyableTextField value={value ?? ''} />;\n        },\n      },\n    ],\n    [t, isProvisioning],\n  );\n\n  return (\n    <div className={className}>\n      <Mapping\n        title={t('mappings.title')}\n        description={t(\n          isProvisioning ? 'mappings.description' : 'mappings.description_provider_tab',\n        )}\n        expanded\n        card={{\n          title: t('mappings.required.title'),\n          description: t('mappings.required.description', { strategy: strategyLabel }),\n          table: {\n            items: requiredItems,\n            columns: getColumns('required'),\n          },\n        }}\n        content={\n          isProvisioning ? (\n            <div className=\"space-y-1.5 pt-2\">\n              <Label className=\"text-sm font-medium\">\n                {t('mappings.external_namespace.label')}\n              </Label>\n              <CopyableTextField value={SCIM_NAMESPACE} readOnly />\n            </div>\n          ) : null\n        }\n      />\n\n      {optionalItems.length > 0 && (\n        <Mapping\n          expanded\n          card={{\n            title: t('mappings.optional.title'),\n            description: t('mappings.optional.description'),\n            table: {\n              items: optionalItems,\n              columns: getColumns('optional'),\n            },\n          }}\n          content={null}\n        />\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-mappings.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-sync-alert.tsx",
      "content": "/**\n * SSO provider attribute sync confirmation alert.\n * @module sso-provider-attribute-sync-alert\n * @internal\n */\n\nimport { AlertTriangle } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProviderAttributeSyncAlertProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-edit-types';\n\n/**\n * Alert component for SSO provider attribute sync.\n *\n * @param props - Component props.\n * @param props.translatorKey - i18n translation key namespace.\n * @param props.className - Additional CSS class names.\n * @param props.customMessages - Custom i18n message overrides.\n * @param props.onSync - Callback when sync is triggered.\n * @param props.isSyncing - Whether sync is in progress.\n * @returns Attribute sync alert component.\n * @internal\n */\nexport function SsoProviderAttributeSyncAlert({\n  translatorKey = 'idp_management.edit_sso_provider.tabs.sso.content.attribute_sync_alert',\n  className,\n  customMessages,\n  onSync,\n  isSyncing = false,\n}: SsoProviderAttributeSyncAlertProps) {\n  const [isSyncModalOpen, setIsSyncModalOpen] = React.useState(false);\n\n  const { t } = useTranslator(translatorKey, customMessages);\n\n  const handleSyncClick = () => {\n    setIsSyncModalOpen(true);\n  };\n\n  const handleConfirmSync = async () => {\n    if (onSync) {\n      await onSync();\n    }\n    setIsSyncModalOpen(false);\n  };\n\n  return (\n    <>\n      <Alert variant=\"warning\" className={cn('flex items-center justify-between', className)}>\n        <div className=\"flex items-start gap-2\">\n          <AlertTriangle className=\"h-4 w-4 mt-0.5\" />\n          <div>\n            <AlertTitle>{t('title')}</AlertTitle>\n            <AlertDescription>{t('description')}</AlertDescription>\n          </div>\n        </div>\n        {\n          <Button variant=\"outline\" size=\"default\" onClick={handleSyncClick} disabled={isSyncing}>\n            {t('sync_button_label')}\n          </Button>\n        }\n      </Alert>\n\n      <Dialog open={isSyncModalOpen} onOpenChange={setIsSyncModalOpen}>\n        <DialogContent>\n          <DialogHeader>\n            <DialogTitle>{t('sync_modal.title')}</DialogTitle>\n            <DialogDescription>{t('sync_modal.description')}</DialogDescription>\n          </DialogHeader>\n          <DialogFooter>\n            <Button\n              variant=\"outline\"\n              onClick={() => setIsSyncModalOpen(false)}\n              disabled={isSyncing}\n            >\n              {t('sync_modal.actions.cancel_button_label')}\n            </Button>\n            <Button onClick={handleConfirmSync} disabled={isSyncing}>\n              {t('sync_modal.actions.proceed_button_label')}\n            </Button>\n          </DialogFooter>\n        </DialogContent>\n      </Dialog>\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-sync-alert.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-details.tsx",
      "content": "/**\n * SSO provider details form section.\n * @module sso-provider-details\n * @internal\n */\n\nimport { getComponentStyles } from '@auth0/universal-components-core';\nimport React from 'react';\n\nimport {\n  ProviderConfigureFields,\n  type ProviderConfigureFormHandle,\n} from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-configure/provider-configure-fields';\nimport { ProviderDetails } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-create/provider-details';\nimport { SsoProviderAttributeMappings } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-mappings';\nimport { FormActions } from '@/components/auth0/shared/form-actions';\nimport { Separator } from '@/components/ui/separator';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { ProviderDetailsFormHandle } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\nimport type { SsoProviderDetailsProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-tab-types';\n\n/**\n * SSO provider details editing form.\n * Combines provider details and configuration fields for editing SSO provider.\n *\n * @param props - Component props.\n * @param props.provider - The SSO provider being edited.\n * @param props.readOnly - Render in read-only mode.\n * @param props.idpConfig - Identity provider configuration.\n * @param props.formActions - Form action handlers.\n * @param props.customMessages - Custom i18n message overrides.\n * @param props.styling - CSS variables and class overrides.\n * @returns SSO provider details component.\n * @internal\n */\nexport function SsoProviderDetails({\n  provider,\n  readOnly = false,\n  idpConfig,\n  formActions,\n  customMessages = {},\n  styling = {\n    variables: { common: {}, light: {}, dark: {} },\n    classes: {},\n  },\n}: SsoProviderDetailsProps) {\n  const { t } = useTranslator('idp_management.sso_provider_details', customMessages);\n  const { isDarkMode } = useTheme();\n  const providerDetailsRef = React.useRef<ProviderDetailsFormHandle>(null);\n  const providerConfigureRef = React.useRef<ProviderConfigureFormHandle>(null);\n  const [isDetailsDirty, setIsDetailsDirty] = React.useState(false);\n  const [isConfigureDirty, setIsConfigureDirty] = React.useState(false);\n\n  const currentStyles = React.useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  const providerDetailsData = React.useMemo(() => {\n    if (!provider) return undefined;\n\n    return {\n      name: provider.name ?? undefined,\n      display_name: provider.display_name ?? undefined,\n    };\n  }, [provider]);\n\n  const attributes = React.useMemo(() => {\n    if (!provider) return null;\n    return 'attributes' in provider ? (provider.attributes ?? null) : null;\n  }, [provider]);\n\n  const hasUnsavedChanges = isDetailsDirty || isConfigureDirty;\n  const handleSave = async () => {\n    if (!formActions?.nextAction?.onClick || !provider?.strategy) return;\n\n    const isDetailsValid = await providerDetailsRef.current?.validate();\n    const isConfigureValid = await providerConfigureRef.current?.validate();\n\n    if (!isDetailsValid || !isConfigureValid) {\n      return;\n    }\n\n    const detailsData = providerDetailsRef.current?.getData();\n    const configureData = providerConfigureRef.current?.getData();\n    const updateData = {\n      strategy: provider.strategy,\n      ...detailsData,\n      ...configureData,\n    };\n\n    await formActions.nextAction.onClick(updateData);\n\n    // Reset forms to mark current values as the new baseline\n    providerDetailsRef.current?.reset(detailsData);\n    providerConfigureRef.current?.reset(configureData as never);\n\n    setIsDetailsDirty(false);\n    setIsConfigureDirty(false);\n  };\n\n  if (!provider) {\n    return null;\n  }\n\n  return (\n    <div style={currentStyles.variables} className={cn('space-y-8')}>\n      <div className=\"space-y-4\">\n        <ProviderDetails\n          mode=\"edit\"\n          ref={providerDetailsRef}\n          initialData={providerDetailsData}\n          readOnly={readOnly}\n          customMessages={customMessages.details_fields}\n          className={currentStyles.classes?.['ProviderDetails-root']}\n          hideHeader\n          onFormDirty={setIsDetailsDirty}\n        />\n      </div>\n\n      <div className=\"space-y-4\">\n        <ProviderConfigureFields\n          ref={providerConfigureRef}\n          strategy={provider.strategy}\n          initialData={{ ...provider, ...provider.options }}\n          readOnly={readOnly}\n          idpConfig={idpConfig}\n          mode=\"edit\"\n          customMessages={customMessages.configure_fields}\n          className={currentStyles.classes?.['ProviderConfigure-root']}\n          onFormDirty={setIsConfigureDirty}\n        />\n      </div>\n\n      <Separator />\n      <div className=\"space-y-4\">\n        <SsoProviderAttributeMappings\n          strategy={provider?.strategy || null}\n          userAttributeMap={attributes}\n          customMessages={customMessages.mappings}\n          className={currentStyles.classes?.['SsoProvider-attributeMapping']}\n        />\n      </div>\n\n      {formActions && (\n        <FormActions\n          hasUnsavedChanges={hasUnsavedChanges}\n          showUnsavedChanges\n          isLoading={formActions.isLoading}\n          nextAction={{\n            label: t('submit_button_label'),\n            disabled:\n              !hasUnsavedChanges ||\n              formActions?.nextAction?.disabled ||\n              formActions.isLoading ||\n              readOnly,\n            type: 'button',\n            onClick: handleSave,\n          }}\n          showPrevious={false}\n          align={formActions?.align}\n          className={currentStyles.classes?.['SsoProviderDetails-FormActions']}\n        />\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-details.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-tab.tsx",
      "content": "/**\n * SSO provider edit tab component.\n * @module sso-provider-tab\n * @internal\n */\n\nimport { getComponentStyles } from '@auth0/universal-components-core';\nimport React from 'react';\n\nimport { SsoProviderDelete } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete';\nimport { SsoProviderAttributeSyncAlert } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-sync-alert';\nimport { SsoProviderDetails } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-details';\nimport { SsoProviderRemoveFromOrganization } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-remove/provider-remove';\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type { SsoProviderTabProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-tab-types';\n\n/**\n * SSO provider tab content for editing provider configuration.\n *\n * @param props - Component props.\n * @param props.customMessages - Custom i18n message overrides.\n * @param props.styling - CSS variables and class overrides.\n * @param props.readOnly - Render in read-only mode.\n * @param props.provider - The SSO provider being edited.\n * @param props.onDelete - Callback when provider is deleted.\n * @param props.onRemove - Callback when provider is removed from organization.\n * @param props.organization - Current organization context.\n * @param props.isDeleting - Whether deletion is in progress.\n * @param props.isRemoving - Whether removal is in progress.\n * @param props.idpConfig - Identity provider configuration.\n * @param props.shouldAllowDeletion - Whether deletion is allowed.\n * @param props.formActions - Form action handlers.\n * @param props.hasSsoAttributeSyncWarning - Whether to show attribute sync warning.\n * @param props.onAttributeSync - Callback for attribute sync.\n * @param props.isSyncingAttributes - Whether attribute sync is in progress.\n * @returns SSO provider tab content.\n * @internal\n */\nexport function SsoProviderTab({\n  customMessages = {},\n  styling = {\n    variables: { common: {}, light: {}, dark: {} },\n    classes: {},\n  },\n  readOnly = false,\n  provider,\n  onDelete,\n  onRemove,\n  organization,\n  isDeleting,\n  isRemoving,\n  idpConfig,\n  shouldAllowDeletion,\n  formActions,\n  hasSsoAttributeSyncWarning,\n  onAttributeSync,\n  isSyncingAttributes = false,\n}: SsoProviderTabProps) {\n  const { t } = useTranslator('idp_management.edit_sso_provider.tabs.sso', customMessages);\n\n  const { isDarkMode } = useTheme();\n  const currentStyles = React.useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  return (\n    <div style={currentStyles.variables} className=\"space-y-10\">\n      {hasSsoAttributeSyncWarning && (\n        <SsoProviderAttributeSyncAlert\n          onSync={onAttributeSync}\n          isSyncing={isSyncingAttributes}\n          customMessages={customMessages.attribute_sync_alert}\n          className={currentStyles.classes?.['SsoProviderAttributeSyncAlert-root']}\n        />\n      )}\n\n      <Card>\n        <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n          <div className=\"space-y-1\">\n            <CardTitle className=\"text-lg text-left font-medium\">{t('content.title')}</CardTitle>\n            <CardDescription className=\"text-sm text-left text-muted-foreground\">\n              {t('content.description')}\n            </CardDescription>\n          </div>\n        </CardHeader>\n        <CardContent>\n          {provider && (\n            <SsoProviderDetails\n              provider={provider}\n              readOnly={readOnly}\n              formActions={formActions}\n              customMessages={customMessages.details}\n              styling={styling}\n              idpConfig={idpConfig}\n            />\n          )}\n        </CardContent>\n      </Card>\n\n      <div className=\"space-y-4\">\n        {provider && organization && (\n          <SsoProviderRemoveFromOrganization\n            provider={provider}\n            organizationName={organization?.name}\n            onRemove={onRemove}\n            isLoading={isRemoving}\n            readOnly={readOnly}\n            customMessages={customMessages.remove}\n          />\n        )}\n\n        {provider && shouldAllowDeletion && (\n          <SsoProviderDelete\n            provider={provider}\n            onDelete={onDelete}\n            isLoading={isDeleting}\n            readOnly={readOnly}\n            customMessages={customMessages.delete}\n          />\n        )}\n      </div>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-tab.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/provisioning-manage-token.tsx",
      "content": "/**\n * SCIM token management section.\n * @module provisioning-manage-token\n * @internal\n */\n\n'use client';\n\nimport {\n  getComponentStyles,\n  type IdpScimTokenBase,\n  type CreateIdpProvisioningScimTokenResponseContent,\n} from '@auth0/universal-components-core';\nimport { Trash2, Plus } from 'lucide-react';\nimport * as React from 'react';\n\nimport { ProvisioningCreateTokenModal } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-create-token/provisioning-create-token-modal';\nimport { ProvisioningDeleteTokenModal } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-token/provisioning-delete-token-modal';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport {\n  Card,\n  CardAction,\n  CardContent,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n} from '@/components/ui/card';\nimport { Spinner } from '@/components/ui/spinner';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { ProvisioningManageTokenProps } from '@/types/my-organization/idp-management/sso-provisioning/provisioning-manage-token-types';\n\nconst MAX_TOKENS = 2;\nconst TOKEN_STATUS = {\n  ACTIVE: 'active',\n  EXPIRED: 'expired',\n} as const;\n\n/**\n *\n * @param props - Component props.\n * @param props.isScimTokensLoading - Whether SCIM tokens are loading\n * @param props.isScimTokenCreating - Whether a SCIM token is being created\n * @param props.isScimTokenDeleting - Whether a SCIM token is being deleted\n * @param props.onListScimTokens - Callback to list SCIM tokens\n * @param props.onCreateScimToken - Callback to create a SCIM token\n * @param props.onDeleteScimToken - Callback to delete a SCIM token\n * @param props.styling - Custom styling configuration with variables and classes\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function ProvisioningManageToken({\n  isScimTokensLoading,\n  isScimTokenCreating,\n  isScimTokenDeleting,\n  onListScimTokens,\n  onCreateScimToken,\n  onDeleteScimToken,\n  styling = {\n    variables: {\n      common: {},\n      light: {},\n      dark: {},\n    },\n    classes: {},\n  },\n  customMessages = {},\n}: ProvisioningManageTokenProps): React.JSX.Element {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.details.manage_tokens',\n    customMessages,\n  );\n  const { isDarkMode } = useTheme();\n  const [deleteTokenId, setDeleteTokenId] = React.useState<string | null>(null);\n  const [isCreateModalOpen, setIsCreateModalOpen] = React.useState(false);\n  const [scimTokens, setScimTokens] = React.useState<IdpScimTokenBase[]>([]);\n  const [createdToken, setCreatedToken] =\n    React.useState<CreateIdpProvisioningScimTokenResponseContent | null>(null);\n\n  React.useEffect(() => {\n    const loadTokens = async () => {\n      const tokens = await onListScimTokens();\n      if (tokens?.scim_tokens) {\n        setScimTokens(tokens.scim_tokens);\n      }\n    };\n    loadTokens();\n  }, []);\n\n  const currentStyles = React.useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  const canGenerateToken = scimTokens.length < MAX_TOKENS;\n\n  const getTokenStatus = (\n    token: IdpScimTokenBase,\n  ): {\n    labelKey: string;\n    variant: 'secondary' | 'destructive';\n  } => {\n    if (!token.valid_until) {\n      return { labelKey: TOKEN_STATUS.ACTIVE, variant: 'secondary' };\n    }\n\n    const expiryDate = new Date(token.valid_until);\n    const now = new Date();\n    const isExpired = expiryDate < now;\n\n    return {\n      labelKey: isExpired ? TOKEN_STATUS.EXPIRED : TOKEN_STATUS.ACTIVE,\n      variant: isExpired ? 'destructive' : 'secondary',\n    };\n  };\n\n  const handleGenerateToken = async () => {\n    const result = await onCreateScimToken({ token_lifetime: 3600 });\n    if (result) {\n      setCreatedToken(result);\n      setIsCreateModalOpen(true);\n      const tokens = await onListScimTokens();\n      if (tokens?.scim_tokens) {\n        setScimTokens(tokens.scim_tokens);\n      }\n    }\n  };\n\n  const handleDeleteClick = (tokenId: string) => {\n    setDeleteTokenId(tokenId);\n  };\n\n  const handleDeleteConfirm = async () => {\n    if (deleteTokenId) {\n      await onDeleteScimToken(deleteTokenId);\n      setDeleteTokenId(null);\n      const tokens = await onListScimTokens();\n      if (tokens?.scim_tokens) {\n        setScimTokens(tokens.scim_tokens);\n      }\n    }\n  };\n\n  const handleCloseCreateModal = () => {\n    setCreatedToken(null);\n    setIsCreateModalOpen(false);\n  };\n\n  return (\n    <div\n      className={cn('w-full', currentStyles.classes?.['ProvisioningManageToken-root'])}\n      style={currentStyles?.variables}\n    >\n      <Card className={cn(currentStyles.classes?.['ProvisioningManageToken-card'])}>\n        <CardHeader className={cn(currentStyles.classes?.['ProvisioningManageToken-header'])}>\n          <CardTitle className=\"text-base font-medium text-foreground text-left\">\n            {t('title')}\n          </CardTitle>\n          <CardDescription className=\"text-sm text-muted-foreground text-left\">\n            {t('description')}\n          </CardDescription>\n          <CardAction>\n            <Tooltip>\n              <TooltipTrigger asChild>\n                <span>\n                  <Button\n                    type=\"button\"\n                    onClick={handleGenerateToken}\n                    disabled={!canGenerateToken || isScimTokenCreating}\n                    title={undefined}\n                  >\n                    {isScimTokenCreating ? (\n                      <Spinner className=\"w-4 h-4 mr-2\" />\n                    ) : (\n                      <Plus className=\"w-4 h-4 mr-2\" aria-hidden=\"true\" />\n                    )}\n                    {t('generate_button_label')}\n                  </Button>\n                </span>\n              </TooltipTrigger>\n              {!canGenerateToken && <TooltipContent>{t('max_tokens_tooltip')}</TooltipContent>}\n            </Tooltip>\n          </CardAction>\n        </CardHeader>\n\n        {isScimTokensLoading ? (\n          <CardContent className=\"flex justify-center py-8\">\n            <Spinner />\n          </CardContent>\n        ) : scimTokens.length > 0 ? (\n          <CardContent className=\"space-y-4\">\n            {scimTokens.map((token) => {\n              const status = getTokenStatus(token);\n              const showExpiry = !token.valid_until;\n\n              return (\n                <div key={token.token_id} className=\"flex items-start justify-between gap-6\">\n                  <div className=\"flex-1 min-w-0 space-y-1 text-left\">\n                    <p className=\"text-sm font-medium text-foreground\">\n                      {t('token_item.token_prefix')} {token.token_id}\n                    </p>\n                    {showExpiry && (\n                      <p className=\"text-sm text-muted-foreground\">\n                        {t('token_item.never_expire')}\n                      </p>\n                    )}\n                    <p className=\"text-sm text-muted-foreground\">{t('token_item.last_used')}</p>\n                  </div>\n                  <div className=\"flex items-center gap-4 shrink-0\">\n                    <Badge variant={status.variant} className=\"shrink-0\">\n                      {t(`token_item.status_${status.labelKey}`)}\n                    </Badge>\n                    <Button\n                      variant=\"destructive\"\n                      size=\"default\"\n                      type=\"button\"\n                      onClick={() => handleDeleteClick(token.token_id)}\n                      disabled={isScimTokenDeleting}\n                      aria-label={`${t('token_item.delete_button_label')} ${token.token_id}`}\n                      className=\"shrink-0\"\n                    >\n                      {isScimTokenDeleting ? (\n                        <Spinner className=\"w-4 h-4 mr-2\" />\n                      ) : (\n                        <Trash2 className=\"w-4 h-4 mr-2\" aria-hidden=\"true\" />\n                      )}\n                      {t('token_item.delete_button_label')}\n                    </Button>\n                  </div>\n                </div>\n              );\n            })}\n          </CardContent>\n        ) : null}\n      </Card>\n\n      <ProvisioningCreateTokenModal\n        open={isCreateModalOpen}\n        isLoading={isScimTokenCreating}\n        onOpenChange={(open) => {\n          setIsCreateModalOpen(open);\n          if (!open) {\n            handleCloseCreateModal();\n          }\n        }}\n        createdToken={createdToken}\n        customMessages={customMessages}\n        styling={styling}\n      />\n\n      <ProvisioningDeleteTokenModal\n        open={!!deleteTokenId}\n        isLoading={isScimTokenDeleting}\n        onOpenChange={(open: boolean) => {\n          if (!open) {\n            setDeleteTokenId(null);\n          }\n        }}\n        tokenId={deleteTokenId}\n        onConfirm={handleDeleteConfirm}\n        customMessages={customMessages}\n        styling={styling}\n      />\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/provisioning-manage-token.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-create-token/provisioning-create-token-modal-content.tsx",
      "content": "/**\n * SCIM token creation modal content.\n * @module provisioning-create-token-modal-content\n * @internal\n */\n\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport { Label } from '@/components/ui/label';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { ProvisioningCreateTokenModalContentProps } from '@/types/my-organization/idp-management/sso-provisioning/provisioning-token-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.token - Token string\n * @param props.tokenId - Token identifier\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.className - Optional CSS class name for styling\n * @returns JSX element\n */\nexport function ProvisioningCreateTokenModalContent({\n  token,\n  tokenId,\n  customMessages = {},\n  className,\n}: ProvisioningCreateTokenModalContentProps) {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.details.manage_tokens.create_modal.content',\n    customMessages,\n  );\n\n  return (\n    <div className={cn('space-y-4', className)}>\n      <p className={cn('text-sm text-muted-foreground text-(length:--font-size-paragraph)')}>\n        {t('description')}\n      </p>\n      <div className=\"space-y-2\">\n        <Label htmlFor=\"provisioning-token\" className=\"text-sm font-medium text-foreground\">\n          {t('field.label')} {tokenId}\n        </Label>\n        <CopyableTextField\n          id=\"provisioning-token\"\n          type=\"text\"\n          value={token}\n          readOnly\n          className=\"w-full\"\n          aria-label={`${t('field.label')} ${tokenId}`}\n        />\n      </div>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-create-token/provisioning-create-token-modal-content.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-create-token/provisioning-create-token-modal.tsx",
      "content": "/**\n * SCIM token creation modal.\n * @module provisioning-create-token-modal\n * @internal\n */\n\nimport { Copy } from 'lucide-react';\nimport * as React from 'react';\n\nimport { ProvisioningCreateTokenModalContent } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-create-token/provisioning-create-token-modal-content';\nimport { Modal } from '@/components/ui/modal';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type { ProvisioningCreateTokenModalProps } from '@/types/my-organization/idp-management/sso-provisioning/provisioning-manage-token-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.open - Whether the component is open/visible\n * @param props.onOpenChange - Callback fired when open state changes\n * @param props.createdToken - Newly created token data\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function ProvisioningCreateTokenModal({\n  open,\n  onOpenChange,\n  createdToken,\n  isLoading,\n  customMessages = {},\n}: ProvisioningCreateTokenModalProps): React.JSX.Element {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.details.manage_tokens',\n    customMessages,\n  );\n\n  return (\n    <Modal\n      open={open}\n      onOpenChange={onOpenChange}\n      title={t('create_modal.title')}\n      content={\n        createdToken && (\n          <ProvisioningCreateTokenModalContent\n            token={createdToken.token!}\n            tokenId={createdToken.token_id}\n            customMessages={customMessages.content}\n          />\n        )\n      }\n      modalActions={{\n        isLoading,\n        showPrevious: false,\n        showUnsavedChanges: false,\n        nextAction: {\n          type: 'button',\n          label: t('create_modal.copy_and_close_button_label'),\n          variant: 'primary',\n          icon: <Copy className=\"w-4 h-4\" />,\n          disabled: isLoading,\n          onClick: () => {\n            if (createdToken) {\n              navigator.clipboard.writeText(createdToken.token!);\n            }\n            onOpenChange(false);\n          },\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-create-token/provisioning-create-token-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-modal.tsx",
      "content": "/**\n * SSO provisioning delete confirmation modal.\n * @module sso-provisioning-delete-modal\n * @internal\n */\n\nimport React from 'react';\n\nimport { Modal } from '@/components/ui/modal';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProvisioningDeleteModalProps } from '@/types/my-organization/idp-management/sso-provisioning/sso-provisioning-tab-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.open - Whether the component is open/visible\n * @param props.onOpenChange - Callback fired when open state changes\n * @param props.onConfirm - Callback fired when the action is confirmed\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function SsoProvisioningDeleteModal({\n  open,\n  onOpenChange,\n  onConfirm,\n  isLoading,\n  customMessages,\n}: SsoProvisioningDeleteModalProps): React.JSX.Element {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.delete',\n    customMessages,\n  );\n\n  return (\n    <Modal\n      open={open}\n      onOpenChange={onOpenChange}\n      title={t('modal.title')}\n      content={\n        <div className={cn('space-y-4')}>\n          <p className={cn('text-sm text-muted-foreground text-(length:--font-size-paragraph)')}>\n            {t('modal.content.description')}\n          </p>\n        </div>\n      }\n      modalActions={{\n        isLoading,\n        showUnsavedChanges: false,\n        previousAction: {\n          type: 'button',\n          label: t('modal.actions.cancel_button_label'),\n          variant: 'outline',\n          disabled: isLoading,\n          onClick: () => onOpenChange(false),\n        },\n        nextAction: {\n          type: 'button',\n          label: t('modal.actions.delete_button_label'),\n          variant: 'destructive',\n          disabled: isLoading,\n          onClick: onConfirm,\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-token/provisioning-delete-token-modal-content.tsx",
      "content": "/**\n * SCIM token deletion modal content.\n * @module provisioning-delete-token-modal-content\n * @internal\n */\n\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { ProvisioningDeleteTokenModalContentProps } from '@/types/my-organization/idp-management/sso-provisioning/provisioning-token-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.className - Optional CSS class name for styling\n * @param props.tokenId - Token identifier\n * @returns JSX element\n */\nexport function ProvisioningDeleteTokenModalContent({\n  customMessages = {},\n  className,\n  tokenId,\n}: ProvisioningDeleteTokenModalContentProps) {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.details.manage_tokens.delete_modal.content',\n    customMessages,\n  );\n\n  return (\n    <div className={cn('space-y-4', className)}>\n      <p className={cn('text-sm text-muted-foreground text-(length:--font-size-paragraph)')}>\n        {t('confirmation', { tokenId })}\n      </p>\n      <p className={cn('text-sm text-muted-foreground text-(length:--font-size-paragraph)')}>\n        {t('description')}\n      </p>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-token/provisioning-delete-token-modal-content.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-token/provisioning-delete-token-modal.tsx",
      "content": "/**\n * SCIM token deletion modal.\n * @module provisioning-delete-token-modal\n * @internal\n */\n\nimport React from 'react';\n\nimport { ProvisioningDeleteTokenModalContent } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-token/provisioning-delete-token-modal-content';\nimport { Modal } from '@/components/ui/modal';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type { ProvisioningDeleteTokenModalProps } from '@/types/my-organization/idp-management/sso-provisioning/provisioning-manage-token-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.open - Whether the component is open/visible\n * @param props.onOpenChange - Callback fired when open state changes\n * @param props.tokenId - Token identifier\n * @param props.onConfirm - Callback fired when the action is confirmed\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function ProvisioningDeleteTokenModal({\n  open,\n  onOpenChange,\n  tokenId,\n  onConfirm,\n  isLoading,\n  customMessages,\n}: ProvisioningDeleteTokenModalProps): React.JSX.Element {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.details.manage_tokens',\n    customMessages,\n  );\n\n  return (\n    <Modal\n      open={open}\n      onOpenChange={onOpenChange}\n      title={t('delete_modal.title', { tokenId: tokenId || '' })}\n      content={\n        <ProvisioningDeleteTokenModalContent\n          tokenId={tokenId || ''}\n          customMessages={customMessages?.content}\n        />\n      }\n      modalActions={{\n        isLoading,\n        showUnsavedChanges: false,\n        previousAction: {\n          type: 'button',\n          label: t('delete_modal.cancel_button_label'),\n          variant: 'outline',\n          disabled: isLoading,\n          onClick: () => onOpenChange(false),\n        },\n        nextAction: {\n          type: 'button',\n          label: t('delete_modal.delete_button_label'),\n          variant: 'destructive',\n          disabled: isLoading,\n          onClick: onConfirm,\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-token/provisioning-delete-token-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-details.tsx",
      "content": "/**\n * SSO provisioning details form.\n * @module sso-provisioning-details\n * @internal\n */\n\n'use client';\n\nimport {\n  getComponentStyles,\n  type ProvisioningDetailsFormValues,\n  ssoProvisioningSchema,\n} from '@auth0/universal-components-core';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { SsoProviderAttributeMappings } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-mappings';\nimport { ProvisioningManageToken } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/provisioning-manage-token';\nimport { CopyableTextField } from '@/components/auth0/shared/copyable-text-field';\nimport {\n  Form,\n  FormControl,\n  FormDescription,\n  FormField,\n  FormItem,\n  FormLabel,\n  FormMessage,\n} from '@/components/ui/form';\nimport { Separator } from '@/components/ui/separator';\nimport { TextField } from '@/components/ui/text-field';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { FORM_VALIDATION_MODE } from '@/lib/constants/form-constants';\nimport { cn } from '@/lib/utils';\nimport type { SsoProvisioningDetailsProps } from '@/types/my-organization/idp-management/sso-provisioning/sso-provisioning-tab-types';\n\n/**\n * SSO provisioning details for SCIM token management.\n *\n * @param props - Component props.\n * @param props.provider - The SSO provider being configured.\n * @param props.provisioningConfig - Provisioning configuration settings.\n * @param props.isScimTokensLoading - Whether SCIM tokens are loading.\n * @param props.isScimTokenCreating - Whether a SCIM token is being created.\n * @param props.isScimTokenDeleting - Whether a SCIM token is being deleted.\n * @param props.onListScimTokens - Callback to list SCIM tokens.\n * @param props.onCreateScimToken - Callback to create a SCIM token.\n * @param props.onDeleteScimToken - Callback to delete a SCIM token.\n * @param props.customMessages - Custom i18n message overrides.\n * @param props.styling - CSS variables and class overrides.\n * @returns SSO provisioning details component.\n * @internal\n */\nexport function SsoProvisioningDetails({\n  provider,\n  provisioningConfig,\n  isScimTokensLoading,\n  isScimTokenCreating,\n  isScimTokenDeleting,\n  onListScimTokens,\n  onCreateScimToken,\n  onDeleteScimToken,\n  customMessages = {},\n  styling = {\n    variables: { common: {}, light: {}, dark: {} },\n    classes: {},\n  },\n}: SsoProvisioningDetailsProps) {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content.details',\n    customMessages,\n  );\n  const { isDarkMode } = useTheme();\n\n  const currentStyles = useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  const { coreClient } = useCoreClient();\n\n  const scimEndpointUrl = useMemo(() => {\n    const domain = coreClient?.getDomain() || 'your-domain';\n    return `https://${domain}/scim/v2/connections/${provider.id}/`;\n  }, [coreClient, provider.id]);\n\n  const form = useForm<ProvisioningDetailsFormValues>({\n    resolver: zodResolver(ssoProvisioningSchema),\n    mode: FORM_VALIDATION_MODE,\n    defaultValues: {\n      userIdAttribute: provisioningConfig?.user_id_attribute || '',\n      scimEndpointUrl: scimEndpointUrl || '',\n    },\n  });\n\n  return (\n    <div\n      style={currentStyles.variables}\n      className={cn('space-y-6', currentStyles.classes?.['SsoProvisioningDetails-root'])}\n    >\n      <Form {...form}>\n        <form className=\"space-y-6\">\n          <FormField\n            control={form.control}\n            name=\"userIdAttribute\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm text-(length:--font-size-label) font-medium\">\n                  {t('fields.user_id_attribute.label')}\n                </FormLabel>\n                <FormControl>\n                  <TextField readOnly error={Boolean(fieldState.error)} {...field} />\n                </FormControl>\n                <FormMessage\n                  className=\"text-left text-sm text-(length:--font-size-paragraph)\"\n                  role=\"alert\"\n                />\n                <FormDescription className=\"text-sm text-(length:--font-size-paragraph) font-normal text-left\">\n                  {t('fields.user_id_attribute.helper_text')}\n                </FormDescription>\n              </FormItem>\n            )}\n          />\n\n          <ProvisioningManageToken\n            isScimTokensLoading={isScimTokensLoading}\n            isScimTokenCreating={isScimTokenCreating}\n            isScimTokenDeleting={isScimTokenDeleting}\n            onListScimTokens={onListScimTokens}\n            onCreateScimToken={onCreateScimToken}\n            onDeleteScimToken={onDeleteScimToken}\n            customMessages={customMessages?.manage_tokens}\n            styling={styling}\n          />\n\n          <FormField\n            control={form.control}\n            name=\"scimEndpointUrl\"\n            render={({ field, fieldState }) => (\n              <FormItem>\n                <FormLabel className=\"text-sm text-(length:--font-size-label) font-medium\">\n                  {t('fields.scim_endpoint_url.label')}\n                </FormLabel>\n                <FormControl>\n                  <CopyableTextField error={Boolean(fieldState.error)} readOnly {...field} />\n                </FormControl>\n                <FormMessage\n                  className=\"text-left text-sm text-(length:--font-size-paragraph)\"\n                  role=\"alert\"\n                />\n              </FormItem>\n            )}\n          />\n        </form>\n      </Form>\n      <Separator />\n      <SsoProviderAttributeMappings\n        strategy={provisioningConfig?.strategy || null}\n        isProvisioning\n        userAttributeMap={provisioningConfig?.attributes || null}\n        customMessages={customMessages.mappings}\n        className={currentStyles.classes?.['SsoProvisioning-attributeMapping']}\n      />\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-details.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-tab.tsx",
      "content": "/**\n * SSO provisioning tab component.\n * @module sso-provisioning-tab\n * @internal\n */\n\nimport { getComponentStyles } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport { SsoProviderAttributeSyncAlert } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provider-attribute-sync-alert';\nimport { SsoProvisioningDeleteModal } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-delete-modal';\nimport { SsoProvisioningDetails } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-details';\nimport {\n  Card,\n  CardAction,\n  CardDescription,\n  CardHeader,\n  CardTitle,\n  CardContent,\n} from '@/components/ui/card';\nimport { Spinner } from '@/components/ui/spinner';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip';\nimport { useSsoProviderEdit } from '@/hooks/my-organization/use-sso-provider-edit';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProvisioningTabProps } from '@/types/my-organization/idp-management/sso-provisioning/sso-provisioning-tab-types';\n\n/**\n * SSO provisioning tab content for managing provisioning configuration.\n *\n * @param props - Component props.\n * @param props.provider - The SSO provider being configured.\n * @param props.styling - CSS variables and class overrides.\n * @param props.customMessages - Custom i18n message overrides.\n * @param props.hasProvisioningAttributeSyncWarning - Whether to show attribute sync warning.\n * @param props.onAttributeSync - Callback for attribute sync.\n * @param props.isSyncingAttributes - Whether attribute sync is in progress.\n * @returns SSO provisioning tab content.\n * @internal\n */\nexport function SsoProvisioningTab({\n  provider,\n  styling = { variables: { common: {}, light: {}, dark: {} }, classes: {} },\n  customMessages = {},\n  hasProvisioningAttributeSyncWarning,\n  onAttributeSync,\n  isSyncingAttributes = false,\n}: SsoProvisioningTabProps): React.JSX.Element {\n  const { t } = useTranslator(\n    'idp_management.edit_sso_provider.tabs.provisioning.content',\n    customMessages,\n  );\n\n  const {\n    provisioningConfig,\n    isProvisioningLoading,\n    isProvisioningUpdating,\n    isProvisioningDeleting,\n    isScimTokensLoading,\n    isScimTokenCreating,\n    isScimTokenDeleting,\n    fetchProvisioning,\n    createProvisioning,\n    deleteProvisioning,\n    listScimTokens,\n    createScimToken,\n    deleteScimToken,\n  } = useSsoProviderEdit(provider?.id || '');\n\n  const { isDarkMode } = useTheme();\n  const currentStyles = React.useMemo(\n    () => getComponentStyles(styling, isDarkMode),\n    [styling, isDarkMode],\n  );\n\n  const [isDeleteModalOpen, setDeleteModalOpen] = React.useState(false);\n\n  React.useEffect(() => {\n    if (provider?.id) {\n      fetchProvisioning();\n    }\n  }, [provider?.id]);\n\n  const handleProvisioningToggle = async (enabled: boolean) => {\n    if (!provider?.id) return;\n\n    if (enabled) {\n      await createProvisioning();\n      await fetchProvisioning();\n    } else {\n      setDeleteModalOpen(true);\n    }\n  };\n\n  const handleDeleteProvisioningConfirm = async () => {\n    await deleteProvisioning();\n    setDeleteModalOpen(false);\n  };\n\n  const isLoading = isProvisioningLoading || isProvisioningUpdating || isProvisioningDeleting;\n  const isProvisioningEnabled = !!provisioningConfig;\n  const enableProvisioningToggle = isLoading || !provider?.id || !provider.is_enabled;\n\n  return (\n    <div\n      style={currentStyles.variables}\n      className={cn('space-y-10', currentStyles.classes?.['SsoProvisioningTab-root'])}\n    >\n      {hasProvisioningAttributeSyncWarning && (\n        <SsoProviderAttributeSyncAlert\n          translatorKey=\"idp_management.edit_sso_provider.tabs.provisioning.content.attribute_sync_alert\"\n          onSync={onAttributeSync}\n          isSyncing={isSyncingAttributes}\n          customMessages={customMessages.attribute_sync_alert}\n          className={currentStyles.classes?.['SsoProviderAttributeSyncAlert-root']}\n        />\n      )}\n\n      <Card>\n        <CardHeader>\n          <CardTitle className=\"text-lg font-medium text-foreground text-left\">\n            {t('header.title')}\n          </CardTitle>\n          <CardDescription className=\"text-sm text-muted-foreground text-left\">\n            {t('header.description')}\n          </CardDescription>\n          <CardAction>\n            <div className=\"flex items-center gap-3\">\n              <div className=\"flex items-center gap-2\">\n                {isLoading ? (\n                  <Spinner className=\"w-4 h-4\" />\n                ) : (\n                  <Tooltip>\n                    <TooltipTrigger asChild>\n                      <span>\n                        <Switch\n                          checked={isProvisioningEnabled}\n                          onCheckedChange={handleProvisioningToggle}\n                          disabled={enableProvisioningToggle}\n                        />\n                      </span>\n                    </TooltipTrigger>\n                    <TooltipContent>\n                      {!provider.is_enabled\n                        ? t('header.provider_disabled_tooltip')\n                        : isProvisioningEnabled\n                          ? t('header.disable_provisioning_tooltip')\n                          : t('header.enable_provisioning_tooltip')}\n                    </TooltipContent>\n                  </Tooltip>\n                )}\n              </div>\n            </div>\n          </CardAction>\n        </CardHeader>\n        <CardContent>\n          {isProvisioningEnabled && (\n            <SsoProvisioningDetails\n              provider={provider}\n              provisioningConfig={provisioningConfig}\n              isScimTokensLoading={isScimTokensLoading}\n              isScimTokenCreating={isScimTokenCreating}\n              isScimTokenDeleting={isScimTokenDeleting}\n              onListScimTokens={listScimTokens}\n              onCreateScimToken={createScimToken}\n              onDeleteScimToken={deleteScimToken}\n              customMessages={customMessages.details}\n              styling={styling}\n            />\n          )}\n        </CardContent>\n      </Card>\n\n      <SsoProvisioningDeleteModal\n        open={isDeleteModalOpen}\n        isLoading={isProvisioningDeleting}\n        onOpenChange={setDeleteModalOpen}\n        onConfirm={handleDeleteProvisioningConfirm}\n        customMessages={customMessages.delete}\n      />\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-edit/sso-provisioning/sso-provisioning-tab.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-remove/provider-remove-modal.tsx",
      "content": "/**\n * SSO provider remove from organization modal.\n * @module provider-remove-modal\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { SsoProviderDeleteModalContent } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-delete/provider-delete-modal-content';\nimport { Modal } from '@/components/ui/modal';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProviderRemoveFromOrganizationModalProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-delete-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.className - Optional CSS class name for styling\n * @param props.isOpen - Whether the modal/dialog is open\n * @param props.onClose - Callback fired when the component should close\n * @param props.provider - SSO provider object\n * @param props.organizationName - Name of the organization\n * @param props.onRemove - Callback fired when remove action is triggered\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.customMessages - Custom translation messages to override defaults\n * @returns JSX element\n */\nexport function SsoProviderRemoveFromOrganizationModal({\n  className,\n  isOpen,\n  onClose,\n  provider,\n  organizationName,\n  onRemove,\n  isLoading = false,\n  customMessages = {},\n}: SsoProviderRemoveFromOrganizationModalProps) {\n  const { t } = useTranslator('idp_management.remove_sso_provider', customMessages);\n  const [confirmationText, setConfirmationText] = React.useState('');\n\n  const handleModalContentChange = React.useCallback((value: string) => {\n    setConfirmationText(value);\n  }, []);\n\n  const handleRemove = React.useCallback(async () => {\n    if (provider) {\n      await onRemove(provider);\n      onClose();\n    }\n  }, [onRemove, provider, onClose]);\n\n  const handleOpenChange = React.useCallback(\n    (open: boolean) => {\n      if (!open) {\n        onClose();\n      }\n    },\n    [onClose],\n  );\n\n  React.useEffect(() => {\n    if (isOpen) {\n      setConfirmationText('');\n    }\n  }, [isOpen]);\n\n  return (\n    <Modal\n      open={isOpen}\n      onOpenChange={handleOpenChange}\n      className={cn('p-10', className)}\n      title={t('modal.title', {\n        providerName: provider.name,\n        organizationName: organizationName,\n      })}\n      content={\n        <div className=\"space-y-6\">\n          <p className={cn('text-sm text-muted-foreground text-(length:--font-size-paragraph)')}>\n            <>\n              {t.trans('modal.description', {\n                components: {\n                  bold: (children: string) => <strong key=\"provider-name\">{children}</strong>,\n                },\n                vars: { providerName: provider.name },\n              })}\n            </>\n          </p>\n\n          <SsoProviderDeleteModalContent\n            onChange={handleModalContentChange}\n            customMessages={customMessages.modal?.content}\n          />\n        </div>\n      }\n      modalActions={{\n        isLoading,\n        nextAction: {\n          type: 'button',\n          label: t('modal.actions.remove_button_text'),\n          onClick: handleRemove,\n          variant: 'destructive',\n          disabled: isLoading || confirmationText !== provider.name,\n        },\n        previousAction: {\n          label: t('modal.actions.cancel_button_text'),\n          onClick: onClose,\n        },\n      }}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-remove/provider-remove-modal.tsx"
    },
    {
      "path": "src/components/auth0/my-organization/shared/idp-management/sso-provider-remove/provider-remove.tsx",
      "content": "/**\n * SSO provider remove from organization section.\n * @module provider-remove\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { SsoProviderRemoveFromOrganizationModal } from '@/components/auth0/my-organization/shared/idp-management/sso-provider-remove/provider-remove-modal';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent } from '@/components/ui/card';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\nimport type { SsoProviderRemoveFromOrganizationProps } from '@/types/my-organization/idp-management/sso-provider/sso-provider-delete-types';\n\n/**\n *\n * @param props - Component props.\n * @param props.provider - SSO provider object\n * @param props.organizationName - Name of the organization\n * @param props.onRemove - Callback fired when remove action is triggered\n * @param props.customMessages - Custom translation messages to override defaults\n * @param props.isLoading - Whether the component is in a loading state\n * @param props.readOnly - Whether the component is in read-only mode\n * @returns JSX element\n */\nexport function SsoProviderRemoveFromOrganization({\n  provider,\n  organizationName,\n  onRemove,\n  customMessages = {},\n  isLoading,\n  readOnly,\n}: SsoProviderRemoveFromOrganizationProps) {\n  const { t } = useTranslator('idp_management.remove_sso_provider', customMessages);\n  const [isModalOpen, setIsModalOpen] = React.useState(false);\n\n  const openModal = React.useCallback(() => {\n    setIsModalOpen(true);\n  }, []);\n\n  const closeModal = React.useCallback(() => {\n    setIsModalOpen(false);\n  }, []);\n\n  return (\n    <>\n      <div className={cn('w-full')}>\n        <Card className=\"p-6\">\n          <CardContent className=\"flex items-start justify-between gap-6 p-0\">\n            <div className=\"flex-1 space-y-2\">\n              <h3\n                className={cn('text-lg font-semibold text-left text-(length:--font-size-subtitle)')}\n              >\n                {t('title', {\n                  providerName: provider.name,\n                  organizationName: organizationName,\n                })}\n              </h3>\n              <p\n                className={cn(\n                  'text-sm text-muted-foreground text-left text-(length:--font-size-paragraph)',\n                )}\n              >\n                {t('description', { providerName: provider.name })}\n              </p>\n            </div>\n\n            <Button\n              variant=\"destructive\"\n              onClick={openModal}\n              disabled={readOnly}\n              className=\"shrink-0\"\n            >\n              {t('remove_button_label')}\n            </Button>\n          </CardContent>\n        </Card>\n      </div>\n\n      <SsoProviderRemoveFromOrganizationModal\n        isOpen={isModalOpen}\n        onClose={closeModal}\n        provider={provider}\n        organizationName={organizationName}\n        onRemove={onRemove}\n        isLoading={isLoading}\n        customMessages={customMessages.modal}\n      />\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/my-organization/shared/idp-management/sso-provider-remove/provider-remove.tsx"
    },
    {
      "path": "src/components/auth0/shared/copyable-text-field.tsx",
      "content": "/**\n * Text field with copy-to-clipboard button.\n * @module copyable-text-field\n * @internal\n */\n\nimport { Copy } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { TextField, type TextFieldProps } from '@/components/ui/text-field';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { cn } from '@/lib/utils';\n\nexport interface CopyableTextFieldProps extends TextFieldProps {\n  onCopy?: () => void;\n  copyButtonClassName?: string;\n  tooltipSide?: 'top' | 'bottom' | 'left' | 'right';\n  tooltipAlign?: 'start' | 'center' | 'end';\n  showCopyButton?: boolean;\n}\n\nconst CopyableTextField = React.forwardRef<HTMLInputElement, CopyableTextFieldProps>(\n  (\n    {\n      onCopy,\n      copyButtonClassName,\n      tooltipSide = 'top',\n      tooltipAlign = 'end',\n      readOnly = true,\n      endAdornment,\n      showCopyButton = true,\n      ...props\n    },\n    ref,\n  ) => {\n    const { t } = useTranslator('common');\n    const [tooltipText, setTooltipText] = React.useState(t('copy'));\n    const [tooltipOpen, setTooltipOpen] = React.useState(false);\n\n    const handleCopy = async () => {\n      if (props.value) {\n        await navigator.clipboard.writeText(String(props.value));\n        setTooltipText(t('copied'));\n        setTooltipOpen(true);\n        setTimeout(() => {\n          setTooltipText(t('copy'));\n          setTooltipOpen(false);\n        }, 1000);\n        onCopy?.();\n      }\n    };\n\n    const copyButton = (\n      <Tooltip open={tooltipOpen} onOpenChange={setTooltipOpen}>\n        <TooltipTrigger asChild>\n          <Button\n            type=\"button\"\n            variant=\"ghost\"\n            size=\"icon\"\n            className={cn('h-8 w-8', copyButtonClassName)}\n            onClick={handleCopy}\n            aria-label={t('copy')}\n          >\n            <Copy className=\"h-4 w-4\" aria-hidden=\"true\" />\n          </Button>\n        </TooltipTrigger>\n        <TooltipContent side={tooltipSide} align={tooltipAlign} sideOffset={5} className=\"z-[1000]\">\n          {tooltipText}\n        </TooltipContent>\n      </Tooltip>\n    );\n\n    return (\n      <TextField\n        ref={ref}\n        readOnly={readOnly}\n        {...props}\n        endAdornment={\n          showCopyButton ? (\n            endAdornment ? (\n              <div className=\"flex items-center gap-1\">\n                {endAdornment}\n                {copyButton}\n              </div>\n            ) : (\n              copyButton\n            )\n          ) : (\n            endAdornment\n          )\n        }\n      />\n    );\n  },\n);\n\nCopyableTextField.displayName = 'CopyableTextField';\n\nexport { CopyableTextField };\n",
      "type": "registry:component",
      "target": "components/auth0/shared/copyable-text-field.tsx"
    },
    {
      "path": "src/components/auth0/shared/data-table.tsx",
      "content": "/**\n * Data table with sorting and actions.\n * @module data-table\n * @internal\n */\n\nimport type { ActionButton as CoreActionButton } from '@auth0/universal-components-core';\nimport {\n  useReactTable,\n  getCoreRowModel,\n  getSortedRowModel,\n  flexRender,\n} from '@tanstack/react-table';\nimport type { SortingState, ColumnDef, RowSelectionState } from '@tanstack/react-table';\nimport { Copy } from 'lucide-react';\nimport React, { useState, useMemo } from 'react';\n\nimport { MiddleEllipsisText } from '@/components/auth0/shared/middle-ellipsis-text';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { InlineCode } from '@/components/ui/inline-code';\nimport { Spinner } from '@/components/ui/spinner';\nimport { Switch } from '@/components/ui/switch';\nimport {\n  Table,\n  TableHeader,\n  TableBody,\n  TableRow,\n  TableHead,\n  TableCell,\n} from '@/components/ui/table';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\n\ninterface ActionButton extends Omit<CoreActionButton, 'onClick'> {\n  onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\ntype AlignmentType = 'left' | 'center' | 'right';\n\nexport interface BaseColumn<Item> {\n  title: string | React.ReactNode;\n  accessorKey: keyof Item;\n  width?: string;\n  enableSorting?: boolean;\n  headerAlign?: AlignmentType;\n}\n\nexport interface TextColumn<Item> extends BaseColumn<Item> {\n  type: 'text';\n  render?: (item: Item, value: unknown) => React.ReactNode;\n}\n\nexport interface DateColumn<Item> extends BaseColumn<Item> {\n  type: 'date';\n  format?: 'short' | 'medium' | 'long' | 'relative';\n  render?: (item: Item, value: Date | string | number) => React.ReactNode;\n}\n\nexport interface SwitchColumn<Item> extends BaseColumn<Item> {\n  type: 'switch';\n  onToggle?: (checked: boolean, item: Item) => void;\n}\n\nexport interface ButtonColumn<Item> extends BaseColumn<Item> {\n  type: 'button';\n  buttonText: string;\n  variant?: 'primary' | 'destructive' | 'outline' | 'ghost' | 'link';\n  onClick: (item: Item) => void;\n}\n\nexport interface CopyColumnLabels {\n  copyTooltip?: string;\n  copiedTooltip?: string;\n}\n\nexport interface DataTableSelectionLabels {\n  selectAll: string;\n  selectRow: (index: number) => string;\n}\n\nexport interface CopyColumn<Item> extends BaseColumn<Item> {\n  type: 'copy';\n}\n\nexport interface BadgeColumn<Item> extends BaseColumn<Item> {\n  type: 'badge';\n  variant?: 'default' | 'secondary' | 'destructive' | 'outline' | 'success';\n}\n\nexport interface ActionsColumn<Item> extends Omit<BaseColumn<Item>, 'accessorKey'> {\n  type: 'actions';\n  accessorKey?: keyof Item;\n  render: (item: Item) => React.ReactNode;\n}\n\nexport interface CustomColumn<Item> extends BaseColumn<Item> {\n  type: 'custom';\n  render: (item: Item, value: unknown) => React.ReactNode;\n}\n\nexport type Column<Item> =\n  | TextColumn<Item>\n  | DateColumn<Item>\n  | SwitchColumn<Item>\n  | ButtonColumn<Item>\n  | CopyColumn<Item>\n  | BadgeColumn<Item>\n  | ActionsColumn<Item>\n  | CustomColumn<Item>;\n\nexport interface EmptyStateProps {\n  title: string;\n  subtitle?: string;\n  action?: ActionButton;\n}\n\nexport interface DataTableSortConfig {\n  key: string | null;\n  direction: 'asc' | 'desc';\n}\n\nexport interface DataTableProps<Item> {\n  data: Item[];\n  columns: Column<Item>[];\n  loading?: boolean;\n  loader?: React.ReactNode;\n  emptyState?: EmptyStateProps;\n  onRowClick?: (rowData: Item) => void;\n  className?: string;\n  headerAlign?: AlignmentType;\n  /** When provided, sorting is delegated to the parent (server-side). */\n  onSortChange?: (sortConfig: DataTableSortConfig) => void;\n  /** Controlled sort state. Used with onSortChange for server-side sorting. */\n  sortConfig?: DataTableSortConfig;\n  /** Enable row selection with checkboxes. */\n  selectable?: boolean;\n  /** Controlled selected rows. */\n  selectedRows?: Item[];\n  /** Called when selection changes. */\n  onSelectedRowsChange?: (rows: Item[]) => void;\n  /** Derive a stable string ID from a row for selection tracking. */\n  getRowId?: (row: Item) => string;\n  /** Accessible labels for selection checkboxes. */\n  selectionLabels?: DataTableSelectionLabels;\n}\n\nconst ALIGNMENT_CLASSES = {\n  text: {\n    left: 'text-left',\n    center: 'text-center',\n    right: 'text-right',\n  },\n  flex: {\n    left: 'justify-start',\n    center: 'justify-center',\n    right: 'justify-end',\n  },\n} as const;\n\nconst isEmpty = (value: unknown): boolean => {\n  return value === null || value === undefined || value === '';\n};\n\nconst formatDate = (value: Date | string | number, format: string = 'medium'): string => {\n  const date = new Date(value);\n  if (isNaN(date.getTime())) return 'Invalid Date';\n\n  switch (format) {\n    case 'short':\n      return date.toLocaleDateString();\n    case 'long':\n      return date.toLocaleDateString(undefined, {\n        weekday: 'long',\n        year: 'numeric',\n        month: 'long',\n        day: 'numeric',\n      });\n    case 'relative': {\n      const now = new Date();\n      const diffTime = date.getTime() - now.getTime();\n      const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n      if (Math.abs(diffDays) === 0) return 'Today';\n      if (diffDays === 1) return 'Tomorrow';\n      if (diffDays === -1) return 'Yesterday';\n      if (diffDays > 0) return `In ${diffDays} days`;\n      return `${Math.abs(diffDays)} days ago`;\n    }\n    case 'medium':\n    default:\n      return date.toLocaleDateString(undefined, {\n        year: 'numeric',\n        month: 'short',\n        day: 'numeric',\n      });\n  }\n};\n\nconst DEFAULT_COPY_LABELS: Required<CopyColumnLabels> = {\n  copyTooltip: 'Copy to clipboard',\n  copiedTooltip: 'Copied!',\n};\n\nconst DEFAULT_SELECTION_LABELS: DataTableSelectionLabels = {\n  selectAll: 'Select all rows',\n  selectRow: (index: number) => `Select row ${index + 1}`,\n};\n\n/**\n * Copy button with clipboard functionality.\n * @param props - Component props.\n * @param props.value - Value to copy\n * @param props.labels - Tooltip labels\n * @returns JSX element\n */\nfunction CopyButton({\n  value,\n  labels = DEFAULT_COPY_LABELS,\n}: {\n  value: unknown;\n  labels?: CopyColumnLabels;\n}) {\n  const [copied, setCopied] = useState(false);\n  const [copyTooltipOpen, setCopyTooltipOpen] = useState(false);\n  const stringValue = String(value);\n\n  const handleCopy = async (e: React.MouseEvent) => {\n    e.stopPropagation();\n    if (!value) return;\n\n    try {\n      await navigator.clipboard.writeText(stringValue);\n      setCopied(true);\n      setCopyTooltipOpen(true);\n\n      setTimeout(() => {\n        setCopied(false);\n        setCopyTooltipOpen(false);\n      }, 2000);\n    } catch (error) {\n      console.error('Failed to copy text:', error);\n    }\n  };\n\n  return (\n    <InlineCode className=\"w-full flex items-center justify-between gap-2 pr-1\">\n      <span className=\"min-w-0 flex-1\">\n        <MiddleEllipsisText text={stringValue} className=\"text-muted-foreground\" />\n      </span>\n      <Tooltip open={copyTooltipOpen} onOpenChange={setCopyTooltipOpen}>\n        <TooltipTrigger asChild>\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            onClick={handleCopy}\n            className=\"h-6 w-6 p-0 hover:bg-muted/50 shrink-0\"\n            aria-label={copied ? labels.copiedTooltip : labels.copyTooltip}\n          >\n            <Copy className=\"h-3 w-3\" />\n          </Button>\n        </TooltipTrigger>\n        <TooltipContent>\n          <p>{copied ? labels.copiedTooltip : labels.copyTooltip}</p>\n        </TooltipContent>\n      </Tooltip>\n    </InlineCode>\n  );\n}\n\n/**\n * Renders a text column cell.\n * @param item - Data item.\n * @param value - Cell value.\n * @param column - Column configuration.\n * @returns React node\n */\nfunction renderTextColumn<Item>(\n  item: Item,\n  value: unknown,\n  column: TextColumn<Item>,\n): React.ReactNode {\n  if (column.render) {\n    return column.render(item, value);\n  }\n\n  return <span className=\"text-muted-foreground\">{String(value)}</span>;\n}\n\n/**\n * Renders a date column cell.\n * @param item - Data item.\n * @param value - Cell value.\n * @param column - Column configuration.\n * @returns React node\n */\nfunction renderDateColumn<Item>(\n  item: Item,\n  value: Date | string | number,\n  column: DateColumn<Item>,\n): React.ReactNode {\n  if (column.render) {\n    return column.render(item, value);\n  }\n  const formattedDate = formatDate(value, column.format);\n\n  return (\n    <span className=\"text-muted-foreground\" title={new Date(value).toISOString()}>\n      {formattedDate}\n    </span>\n  );\n}\n\n/**\n * Renders a switch column cell.\n * @param item - Data item.\n * @param value - Cell value.\n * @param column - Column configuration.\n * @returns React node\n */\nfunction renderSwitchColumn<Item>(\n  item: Item,\n  value: boolean,\n  column: SwitchColumn<Item>,\n): React.ReactNode {\n  const handleToggle = (checked: boolean) => {\n    column.onToggle?.(checked, item);\n  };\n\n  return (\n    <div onClick={(e) => e.stopPropagation()}>\n      <Switch checked={!!value} onCheckedChange={handleToggle} />\n    </div>\n  );\n}\n\n/**\n * Renders a button column cell.\n * @param item - Data item.\n * @param column - Column configuration.\n * @returns React node\n */\nfunction renderButtonColumn<Item>(item: Item, column: ButtonColumn<Item>): React.ReactNode {\n  const handleClick = (e: React.MouseEvent) => {\n    e.stopPropagation();\n    column.onClick(item);\n  };\n\n  return (\n    <Button variant={column.variant} size=\"sm\" onClick={handleClick}>\n      {column.buttonText}\n    </Button>\n  );\n}\n\n/**\n * Renders a badge column cell.\n * @param value - Cell value.\n * @param column - Column configuration.\n * @returns React node\n */\nfunction renderBadgeColumn<Item>(value: unknown, column: BadgeColumn<Item>): React.ReactNode {\n  return <Badge variant={column.variant}>{String(value)}</Badge>;\n}\n\n/**\n * Renders a copy column cell.\n * @param value - Cell value.\n * @returns React node\n */\nfunction renderCopyColumn(value: unknown): React.ReactNode {\n  return <CopyButton value={value} />;\n}\n\n/**\n * Empty state component for data table.\n * @param props - Component props.\n * @param props.title - Empty state title.\n * @param props.subtitle - Empty state subtitle.\n * @param props.action - Optional action button config.\n * @returns JSX element\n */\nfunction EmptyState({ title, subtitle, action }: EmptyStateProps) {\n  return (\n    <div className=\"text-center py-12\">\n      <h3 className=\"text-md font-medium text-foreground mb-2\">{title}</h3>\n      {subtitle && <p className=\"text-sm text-muted-foreground mb-4\">{subtitle}</p>}\n      {action && (\n        <Button variant={action.variant} onClick={action.onClick}>\n          {action.label}\n        </Button>\n      )}\n    </div>\n  );\n}\n\n/**\n * Generic data table component.\n * @param props - Component props.\n * @param props.data - Table data items.\n * @param props.columns - Column configurations.\n * @param props.loading - Loading state.\n * @param props.loader - Custom loader component.\n * @param props.emptyState - Empty state configuration.\n * @param props.onRowClick - Row click handler.\n * @param props.className - Additional CSS classes.\n * @param props.headerAlign - Default header alignment.\n * @returns JSX element\n */\nexport function DataTable<Item>({\n  data,\n  columns,\n  loading = false,\n  loader,\n  emptyState,\n  onRowClick,\n  className,\n  headerAlign = 'left',\n  onSortChange,\n  sortConfig,\n  selectable = false,\n  selectedRows,\n  onSelectedRowsChange,\n  getRowId,\n  selectionLabels,\n}: DataTableProps<Item>) {\n  const isServerSideSort = !!onSortChange;\n  const isControlledSelection = selectedRows !== undefined;\n\n  const [internalSorting, setInternalSorting] = useState<SortingState>([]);\n  const [internalRowSelection, setInternalRowSelection] = useState<RowSelectionState>({});\n\n  // Convert controlled sortConfig to TanStack SortingState for header display\n  const sorting: SortingState = useMemo(() => {\n    if (isServerSideSort && sortConfig?.key) {\n      return [{ id: sortConfig.key, desc: sortConfig.direction === 'desc' }];\n    }\n    return internalSorting;\n  }, [isServerSideSort, sortConfig, internalSorting]);\n\n  const rowSelection = useMemo<RowSelectionState>(() => {\n    if (!selectable) return {};\n    if (isControlledSelection && selectedRows) {\n      if (getRowId) {\n        return Object.fromEntries(selectedRows.map((row) => [getRowId(row), true]));\n      }\n      return Object.fromEntries(\n        data.reduce<[string, boolean][]>((acc, item, idx) => {\n          if (selectedRows.includes(item)) acc.push([String(idx), true]);\n          return acc;\n        }, []),\n      );\n    }\n    return internalRowSelection;\n  }, [selectable, isControlledSelection, selectedRows, getRowId, data, internalRowSelection]);\n\n  const handleSortingChange = React.useCallback(\n    (updater: SortingState | ((old: SortingState) => SortingState)) => {\n      const newSorting = typeof updater === 'function' ? updater(sorting) : updater;\n\n      if (isServerSideSort) {\n        const sort = newSorting[0];\n        if (sort) {\n          onSortChange({ key: sort.id, direction: sort.desc ? 'desc' : 'asc' });\n        } else {\n          onSortChange({ key: null, direction: 'asc' });\n        }\n      } else {\n        setInternalSorting(newSorting);\n      }\n    },\n    [isServerSideSort, onSortChange, sorting],\n  );\n\n  const handleRowSelectionChange = React.useCallback(\n    (updater: RowSelectionState | ((old: RowSelectionState) => RowSelectionState)) => {\n      const newSelection = typeof updater === 'function' ? updater(rowSelection) : updater;\n      if (!isControlledSelection) setInternalRowSelection(newSelection);\n      if (onSelectedRowsChange) {\n        const items = getRowId\n          ? data.filter((item) => newSelection[getRowId(item)])\n          : data.filter((_, idx) => newSelection[String(idx)]);\n        onSelectedRowsChange(items);\n      }\n    },\n    [rowSelection, isControlledSelection, onSelectedRowsChange, getRowId, data],\n  );\n\n  const selectionColumn = useMemo<ColumnDef<Item>>(\n    () => ({\n      id: '__selection__',\n      enableSorting: false,\n      size: 48,\n      meta: {\n        headerAlign: 'left' as AlignmentType,\n        column: {\n          type: 'actions',\n          title: '',\n          width: '48px',\n          enableSorting: false,\n          render: () => null,\n        } as unknown as Column<Item>,\n      },\n      header: ({ table: t }) => (\n        <Checkbox\n          checked={\n            t.getIsAllPageRowsSelected()\n              ? true\n              : t.getIsSomePageRowsSelected()\n                ? 'indeterminate'\n                : false\n          }\n          onCheckedChange={(checked) => t.toggleAllPageRowsSelected(!!checked)}\n          aria-label={selectionLabels?.selectAll ?? DEFAULT_SELECTION_LABELS.selectAll}\n          onClick={(e: React.MouseEvent) => e.stopPropagation()}\n        />\n      ),\n      cell: ({ row }) => (\n        <Checkbox\n          checked={row.getIsSelected()}\n          onCheckedChange={(checked) => row.toggleSelected(!!checked)}\n          aria-label={\n            selectionLabels?.selectRow(row.index) ?? DEFAULT_SELECTION_LABELS.selectRow(row.index)\n          }\n          onClick={(e: React.MouseEvent) => e.stopPropagation()}\n        />\n      ),\n    }),\n    [selectionLabels],\n  );\n\n  const tableColumns = useMemo<ColumnDef<Item>[]>(() => {\n    const dataCols: ColumnDef<Item>[] = columns.map((column, index) => {\n      return {\n        id: column.accessorKey ? String(column.accessorKey) : `column-${index}`,\n        accessorKey: column.accessorKey as string,\n        header:\n          typeof column.title === 'string' ? column.title : () => column.title as React.ReactNode,\n        size: column.width\n          ? isNaN(Number(column.width))\n            ? undefined\n            : Number(column.width)\n          : undefined,\n        enableSorting: column.enableSorting !== false && !!column.accessorKey,\n        meta: {\n          headerAlign: column.headerAlign || headerAlign || 'left',\n          column: column,\n        },\n\n        cell: ({ getValue, row }) => {\n          const value = getValue();\n          const item = row.original;\n\n          if (column.type === 'actions') {\n            return <div onClick={(e) => e.stopPropagation()}>{column.render(item)}</div>;\n          }\n\n          if (column.type === 'custom') {\n            return <>{column.render(item, value)}</>;\n          }\n\n          if (column.type === 'switch') {\n            return renderSwitchColumn(item, value as boolean, column);\n          }\n\n          if (column.type === 'button') {\n            return renderButtonColumn(item, column);\n          }\n\n          if (isEmpty(value)) {\n            return null;\n          }\n\n          switch (column.type) {\n            case 'text':\n              return renderTextColumn(item, value, column);\n            case 'date':\n              return renderDateColumn(item, value as Date | string | number, column);\n            case 'copy':\n              return renderCopyColumn(value);\n            case 'badge':\n              return renderBadgeColumn(value, column);\n            default:\n              return <span className=\"text-foreground\">{String(value)}</span>;\n          }\n        },\n      };\n    });\n    return selectable ? [selectionColumn, ...dataCols] : dataCols;\n  }, [columns, headerAlign, selectable, selectionColumn]);\n\n  const table = useReactTable({\n    data,\n    columns: tableColumns,\n    state: {\n      sorting,\n      ...(selectable && { rowSelection }),\n    },\n    getRowId: getRowId,\n    onSortingChange: handleSortingChange,\n    ...(selectable && { onRowSelectionChange: handleRowSelectionChange }),\n    enableRowSelection: selectable,\n    getCoreRowModel: getCoreRowModel(),\n    getSortedRowModel: isServerSideSort ? undefined : getSortedRowModel(),\n    manualSorting: isServerSideSort,\n    manualPagination: true,\n  });\n\n  if (loading) {\n    return (\n      <div className={cn('w-full flex items-center justify-center py-8', className)}>\n        {loader || <Spinner />}\n      </div>\n    );\n  }\n\n  return (\n    <div className={cn('w-full', className)}>\n      <Table>\n        <TableHeader>\n          {table.getHeaderGroups().map((headerGroup) => (\n            <TableRow key={headerGroup.id}>\n              {headerGroup.headers.map((header) => {\n                const canSort = header.column.getCanSort();\n                const sortDirection = header.column.getIsSorted();\n                const meta = header.column.columnDef.meta as {\n                  headerAlign: AlignmentType;\n                  column: Column<Item>;\n                };\n\n                return (\n                  <TableHead\n                    key={header.id}\n                    className={cn(\n                      canSort && 'hover:bg-muted/50',\n                      'transition-colors',\n                      ALIGNMENT_CLASSES.text[meta.headerAlign],\n                    )}\n                    style={{\n                      width: meta.column.width,\n                      minWidth: meta.column.width,\n                      maxWidth: meta.column.width,\n                    }}\n                    onClick={canSort ? header.column.getToggleSortingHandler() : undefined}\n                    isSortable={canSort}\n                    sortDirection={sortDirection}\n                  >\n                    {flexRender(header.column.columnDef.header, header.getContext())}\n                  </TableHead>\n                );\n              })}\n            </TableRow>\n          ))}\n        </TableHeader>\n        <TableBody>\n          {table.getRowModel().rows.length === 0 ? (\n            <TableRow disableHover>\n              <TableCell colSpan={tableColumns.length}>\n                <EmptyState\n                  {...(emptyState ?? {\n                    title: 'No data available',\n                    subtitle: 'There are no items to display.',\n                  })}\n                />\n              </TableCell>\n            </TableRow>\n          ) : (\n            table.getRowModel().rows.map((row) => (\n              <TableRow\n                key={row.id}\n                className={cn(\n                  onRowClick && 'cursor-pointer hover:bg-muted/50',\n                  'transition-colors',\n                )}\n                onClick={() => onRowClick?.(row.original)}\n              >\n                {row.getVisibleCells().map((cell) => {\n                  const meta = cell.column.columnDef.meta as {\n                    column: Column<Item>;\n                  };\n                  return (\n                    <TableCell\n                      key={cell.id}\n                      className=\"text-left\"\n                      style={{\n                        width: meta.column.width,\n                        minWidth: meta.column.width,\n                        maxWidth: meta.column.width,\n                      }}\n                    >\n                      {flexRender(cell.column.columnDef.cell, cell.getContext())}\n                    </TableCell>\n                  );\n                })}\n              </TableRow>\n            ))\n          )}\n        </TableBody>\n      </Table>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/shared/data-table.tsx"
    },
    {
      "path": "src/components/auth0/shared/form-actions.tsx",
      "content": "/**\n * Form action buttons component.\n * @module form-actions\n * @internal\n */\n\nimport type { ActionButton } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Spinner } from '@/components/ui/spinner';\nimport { cn } from '@/lib/utils';\n\nexport interface FormActionsProps<T = void> {\n  hasUnsavedChanges?: boolean;\n  isLoading?: boolean;\n  nextAction?: Partial<ActionButton<T>>;\n  previousAction?: Partial<ActionButton<T>>;\n  showPrevious?: boolean;\n  showNext?: boolean;\n  showUnsavedChanges?: boolean;\n  align?: 'left' | 'right';\n  className?: string;\n  unsavedChangesText?: string;\n}\n\nconst DEFAULT_NEXT_ACTION: ActionButton = {\n  type: 'submit',\n  label: 'Save',\n  variant: 'primary',\n  onClick: () => {},\n};\n\nconst DEFAULT_PREVIOUS_ACTION: ActionButton = {\n  label: 'Cancel',\n  variant: 'outline',\n  onClick: () => {},\n};\n\nexport const FormActions: React.FC<FormActionsProps> = ({\n  hasUnsavedChanges = false,\n  isLoading = false,\n  nextAction,\n  previousAction,\n  className,\n  showPrevious = true,\n  showNext = true,\n  showUnsavedChanges = true,\n  align = 'right',\n  unsavedChangesText = 'Unsaved changes',\n}) => {\n  const nextButtonProps = React.useMemo(\n    () => ({ ...DEFAULT_NEXT_ACTION, ...nextAction }),\n    [nextAction],\n  );\n\n  const previousButtonProps = React.useMemo(\n    () => ({ ...DEFAULT_PREVIOUS_ACTION, ...previousAction }),\n    [previousAction],\n  );\n\n  const handleNextClick = React.useCallback(\n    (e: React.MouseEvent<HTMLButtonElement>) => {\n      nextButtonProps.onClick(e.nativeEvent);\n    },\n    [nextButtonProps.onClick],\n  );\n\n  const handlePreviousClick = React.useCallback(\n    (e: React.MouseEvent<HTMLButtonElement>) => {\n      previousButtonProps.onClick(e.nativeEvent);\n    },\n    [previousButtonProps.onClick],\n  );\n\n  const showUnsavedIndicator = showUnsavedChanges && hasUnsavedChanges;\n  const isPreviousVisible = showUnsavedChanges ? showPrevious && hasUnsavedChanges : showPrevious;\n\n  return (\n    <div\n      className={cn(\n        'flex flex-row items-center gap-2 p-2',\n        align === 'right' ? 'justify-end' : 'justify-start',\n        className,\n      )}\n    >\n      {showUnsavedIndicator && (\n        <span className=\"text-sm text-muted-foreground\">{unsavedChangesText}</span>\n      )}\n\n      {showPrevious && (\n        <Button\n          type=\"button\"\n          variant={previousButtonProps.variant}\n          size={previousButtonProps.size}\n          onClick={handlePreviousClick}\n          disabled={\n            previousButtonProps.disabled || isLoading || (showUnsavedChanges && !hasUnsavedChanges)\n          }\n          className={cn(\n            'FormActions-previous',\n            showUnsavedChanges && !isPreviousVisible && 'invisible',\n          )}\n          aria-hidden={showUnsavedChanges && !isPreviousVisible}\n          tabIndex={isPreviousVisible ? 0 : -1}\n        >\n          {previousButtonProps.label}\n        </Button>\n      )}\n\n      {showNext && (\n        <Button\n          type={nextButtonProps.type}\n          variant={nextButtonProps.variant}\n          size={nextButtonProps.size}\n          disabled={nextButtonProps.disabled || isLoading}\n          className=\"FormActions-next min-w-17.5\"\n          {...(nextButtonProps.type !== 'submit' && { onClick: handleNextClick })}\n        >\n          {isLoading ? (\n            <Spinner\n              colorScheme={nextButtonProps.variant === 'destructive' ? 'primary' : 'foreground'}\n              size=\"sm\"\n              aria-hidden=\"true\"\n            />\n          ) : (\n            <>\n              {nextButtonProps.icon && (\n                <span className=\"mr-2\" aria-hidden=\"true\">\n                  {nextButtonProps.icon as React.ReactNode}\n                </span>\n              )}\n              {nextButtonProps.label}\n            </>\n          )}\n        </Button>\n      )}\n    </div>\n  );\n};\n",
      "type": "registry:component",
      "target": "components/auth0/shared/form-actions.tsx"
    },
    {
      "path": "src/components/auth0/shared/gate-keeper/gate-keeper.tsx",
      "content": "/**\n * GateKeeper component for guarding content during loading, MFA step-up, and 5xx error states.\n * @module gate-keeper\n * @internal\n */\n\nimport {\n  type ComponentStyling,\n  getComponentStyles,\n  getStatusCode,\n  isMfaRequiredError,\n} from '@auth0/universal-components-core';\nimport { RefreshCcw } from 'lucide-react';\nimport React, { useCallback, useMemo, useState, useEffect } from 'react';\n\nimport { StyledScope } from '@/components/auth0/shared/styled-scope';\nimport { Button } from '@/components/ui/button';\nimport { Card, CardContent, CardDescription, CardFooter, CardTitle } from '@/components/ui/card';\nimport { Spinner } from '@/components/ui/spinner';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useTheme } from '@/hooks/shared/use-theme';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport { useGateKeeperContext } from '@/providers/gate-keeper-context';\n\ninterface GateKeeperProps {\n  styling?: ComponentStyling<Record<string, string>>;\n  isLoading?: boolean;\n  children: React.ReactNode;\n}\n\n/**\n * Blocking error fallback with retry button.\n * Shown for 5xx errors and dismissed MFA errors.\n *\n * @param props - Component props.\n * @param props.onRetry - Retry handler.\n * @returns Error fallback element.\n * @internal\n */\nfunction ErrorFallback({ onRetry, isMfa }: { onRetry: () => void; isMfa?: boolean }) {\n  const { t } = useTranslator('gate_keeper');\n  const key = isMfa ? 'mfa_error' : 'fallback';\n\n  return (\n    <Card className=\"text-center\">\n      <CardContent className=\"flex flex-col items-center gap-2\">\n        <CardTitle>{t(`${key}.title`)}</CardTitle>\n        <CardDescription>{t(`${key}.description`)}</CardDescription>\n      </CardContent>\n      {!isMfa && (\n        <CardFooter className=\"justify-center\">\n          <Button variant=\"primary\" size=\"default\" onClick={onRetry}>\n            <RefreshCcw className=\"size-4\" />\n            {t('fallback.retry')}\n          </Button>\n        </CardFooter>\n      )}\n    </Card>\n  );\n}\n\n/**\n * Guards children from rendering during loading/error states. MFA step-up overlays\n * children without unmounting them, preserving any in-progress form state.\n * - Loading → spinner (blocks children)\n * - MFA required error → MFA step-up dialog overlaid on children\n * - 5xx error or dismissed MFA → blocking error fallback with retry\n * - No error → children\n *\n * @param props - Component props.\n * @param props.styling - Styling configuration forwarded to the styled scope.\n * @param props.isLoading - Whether content is loading.\n * @param props.children - Child elements to render on success.\n * @returns GateKeeper element.\n */\nexport function GateKeeper({ styling, isLoading, children }: GateKeeperProps) {\n  const { error, onRetry } = useGateKeeperContext();\n  const { coreClient } = useCoreClient();\n  const { isDarkMode } = useTheme();\n  const [isRetrying, setIsRetrying] = useState(false);\n\n  const styles = useMemo(() => getComponentStyles(styling, isDarkMode), [styling, isDarkMode]);\n\n  const handleRetry = useCallback(async () => {\n    setIsRetrying(true);\n    try {\n      await onRetry?.();\n    } finally {\n      setIsRetrying(false);\n    }\n  }, [onRetry]);\n\n  const isMfaStepUp = isMfaRequiredError(error);\n  const statusCode = getStatusCode(error);\n  const isSystemError = !!error && !!statusCode && statusCode >= 500;\n\n  useEffect(() => {\n    if (isMfaStepUp && coreClient && !coreClient.isProxyMode()) {\n      console.warn(\n        `🚨 [Auth0 Components Warning]: A step-up authentication (MFA) was triggered, but the interactiveErrorHandler is not configured.\\n\\nTo enable Universal Login redirects for MFA step-up, login required, or consent errors, please update your configuration:\\n\\n<Auth0Provider\\n  ...\\n  interactiveErrorHandler=\"popup\"\\n>\\n\\nFor more details, refer to the Auth0 Documentation.`,\n      );\n    }\n  }, [isMfaStepUp, coreClient]);\n\n  if (isLoading || isRetrying) {\n    return (\n      <StyledScope style={styles.variables}>\n        <div className=\"flex items-center justify-center p-8\">\n          <Spinner />\n        </div>\n      </StyledScope>\n    );\n  }\n\n  if (isSystemError || isMfaStepUp) {\n    return (\n      <StyledScope style={styles.variables}>\n        <ErrorFallback onRetry={handleRetry} isMfa={isMfaStepUp} />\n      </StyledScope>\n    );\n  }\n\n  return <StyledScope style={styles.variables}>{children}</StyledScope>;\n}\n",
      "type": "registry:component",
      "target": "components/auth0/shared/gate-keeper/gate-keeper.tsx"
    },
    {
      "path": "src/components/auth0/shared/header.tsx",
      "content": "/**\n * Section header with actions.\n * @module header\n * @internal\n */\n\nimport type { ActionButton as CoreActionButton } from '@auth0/universal-components-core';\nimport type { LucideIcon } from 'lucide-react';\nimport { ArrowLeft } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Spinner } from '@/components/ui/spinner';\nimport { Switch } from '@/components/ui/switch';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\n\nexport interface TooltipProps {\n  content: React.ReactNode | string;\n}\n\nexport interface WithTooltipProps {\n  trigger: React.ReactNode | string;\n  tooltip: TooltipProps;\n}\n\nexport interface BaseActionProps extends Omit<CoreActionButton, 'icon' | 'onClick'> {\n  icon?: LucideIcon;\n  className?: string;\n  hidden?: boolean;\n  tooltip?: TooltipProps;\n}\n\nexport interface ButtonActionProps extends BaseActionProps {\n  type: 'button';\n  onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport interface SwitchActionProps extends Omit<BaseActionProps, 'type' | 'label'> {\n  type: 'switch';\n  checked?: boolean;\n  onCheckedChange: (checked: boolean) => void;\n  'aria-label'?: string;\n}\n\nexport type ActionProps = ButtonActionProps | SwitchActionProps;\n\nexport interface HeaderProps {\n  title?: string;\n  description?: string;\n  backButton?: {\n    text?: string;\n    icon?: LucideIcon;\n    onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n  };\n  actions?: ActionProps[];\n  isLoading?: boolean;\n  className?: string;\n}\n\nconst WithTooltip: React.FC<WithTooltipProps> = ({ trigger, tooltip }) => (\n  <>\n    <Tooltip>\n      <TooltipTrigger asChild>\n        <div>{trigger}</div>\n      </TooltipTrigger>\n      <TooltipContent>{tooltip.content}</TooltipContent>\n    </Tooltip>\n  </>\n);\n\nconst ButtonAction: React.FC<ButtonActionProps> = ({\n  icon: Icon,\n  className,\n  label,\n  onClick,\n  disabled,\n  variant,\n  size,\n}) => (\n  <Button\n    onClick={onClick}\n    disabled={disabled}\n    variant={variant}\n    size={size}\n    className={cn('flex items-center gap-2 w-full sm:w-auto sm:min-w-fit', className)}\n    aria-label={label}\n  >\n    {Icon && <Icon className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\" />}\n    <span className=\"truncate\">{label}</span>\n  </Button>\n);\n\nconst SwitchAction: React.FC<SwitchActionProps> = ({\n  className,\n  'aria-label': ariaLabel,\n  checked,\n  onCheckedChange,\n  disabled,\n}) => (\n  <div className={cn('flex items-center gap-2', className)}>\n    <Switch\n      checked={checked}\n      onCheckedChange={onCheckedChange}\n      disabled={disabled}\n      aria-label={ariaLabel}\n    />\n  </div>\n);\n\nexport const Header = React.forwardRef<\n  HTMLDivElement,\n  HeaderProps & React.HTMLAttributes<HTMLDivElement>\n>(({ title, description, backButton, actions, isLoading, className, ...props }, ref) => {\n  const BackIcon = backButton?.icon || ArrowLeft;\n\n  const renderAction = (action: ActionProps, index: number) => {\n    const key = `action-${index}`;\n    if (isLoading) {\n      return <Spinner key={`spinner-${key}`} className=\"w-4 h-4\" />;\n    }\n    if (action.hidden) {\n      return null;\n    }\n    const actionElement =\n      action.type === 'switch' ? (\n        <SwitchAction key={key} {...action} />\n      ) : (\n        <ButtonAction key={key} {...action} />\n      );\n    if (action.tooltip) {\n      return (\n        <WithTooltip key={`tooltip-${key}`} trigger={actionElement} tooltip={action.tooltip} />\n      );\n    }\n    return actionElement;\n  };\n\n  return (\n    <div\n      ref={ref}\n      className={cn('w-full mb-8', className)}\n      role=\"banner\"\n      aria-label={title ? `${title} header` : 'Header'}\n      {...props}\n    >\n      {backButton && (\n        <Button\n          variant=\"link\"\n          onClick={backButton.onClick}\n          size=\"default\"\n          className=\"flex items-center text-sm mb-3\"\n          aria-label={backButton.text || 'Go back'}\n        >\n          <BackIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n          {backButton.text && <span>{backButton.text}</span>}\n        </Button>\n      )}\n\n      <div className=\"flex items-start justify-between gap-4\">\n        <div className=\"flex flex-col min-w-0 flex-1\">\n          {title && (\n            <h1\n              className={cn(\n                'text-xl sm:text-2xl text-primary md:text-4xl font-bold leading-tight break-words text-left text-(length:--font-size-page-header) mb-0',\n              )}\n            >\n              {title}\n            </h1>\n          )}\n          {description && (\n            <p\n              className={cn(\n                'text-base text-muted-foreground leading-relaxed break-words text-left text-(length:--font-size-page-description) mt-2',\n              )}\n            >\n              {description}\n            </p>\n          )}\n        </div>\n\n        {actions && actions.length > 0 && (\n          <div className=\"flex-shrink-0 flex items-start gap-2 mt-1\">\n            {actions.map(renderAction)}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n});\n\nHeader.displayName = 'Header';\n",
      "type": "registry:component",
      "target": "components/auth0/shared/header.tsx"
    },
    {
      "path": "src/components/auth0/shared/mapping.tsx",
      "content": "/**\n * Attribute mapping display component.\n * @module mapping\n * @internal\n */\n\nimport React from 'react';\n\nimport { DataTable, type Column } from '@/components/auth0/shared/data-table';\nimport { Section } from '@/components/auth0/shared/section';\nimport {\n  Accordion,\n  AccordionContent,\n  AccordionItem,\n  AccordionTrigger,\n} from '@/components/ui/accordion';\nimport { CardTitle, CardDescription } from '@/components/ui/card';\nimport { cn } from '@/lib/utils';\n\nexport interface MappingProps<Item> {\n  title?: string;\n  description?: string;\n  content: React.ReactNode;\n  card: {\n    title: string;\n    description: string;\n    table: {\n      items: Item[];\n      columns: Column<Item>[];\n    };\n  };\n  className?: string;\n  expanded?: boolean;\n}\n\n/**\n *\n * @param props - Component props.\n * @param props.title - Section title.\n * @param props.description - Section description.\n * @param props.card - Card configuration.\n * @param props.content - Main content.\n * @param props.className - Additional CSS classes.\n * @param props.expanded - Whether accordion is expanded.\n * @returns JSX element\n */\nexport function Mapping<Item>({\n  title,\n  description,\n  card,\n  content,\n  className,\n  expanded = true,\n}: MappingProps<Item>) {\n  return (\n    <div className={cn('w-full space-y-6', className)}>\n      <Section title={title} description={description}>\n        {content}\n        <Accordion\n          type=\"single\"\n          defaultValue={expanded ? 'mapping-section' : undefined}\n          collapsible\n          className=\"w-full space-y-6\"\n        >\n          <AccordionItem value=\"mapping-section\">\n            <AccordionTrigger className=\"py-4\">\n              <div className=\"text-left\">\n                <CardTitle className=\"text-sm font-medium\">{card.title}</CardTitle>\n                <CardDescription className=\"text-sm font-normal\">\n                  {card.description}\n                </CardDescription>\n              </div>\n            </AccordionTrigger>\n            <AccordionContent className=\"pb-6\">\n              <DataTable data={card.table.items} columns={card.table.columns} />\n            </AccordionContent>\n          </AccordionItem>\n        </Accordion>\n      </Section>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/shared/mapping.tsx"
    },
    {
      "path": "src/components/auth0/shared/middle-ellipsis-text.tsx",
      "content": "import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\n/**\n * Props for the `MiddleEllipsisText` component.\n */\nexport interface MiddleEllipsisTextProps {\n  /**\n   * Full text value to render and truncate from the middle when needed.\n   */\n  text: string;\n  /**\n   * Optional class names applied to the text container.\n   */\n  className?: string;\n}\n\n/**\n * Truncates text by preserving both the start and end segments and inserting\n * an ellipsis in the middle when the measured width exceeds the available width.\n *\n * @param text Full source text.\n * @param availableWidth Maximum width available for rendering in pixels.\n * @param font Canvas font shorthand used for text measurement.\n * @returns The display string and whether truncation was applied.\n */\nfunction calculateTruncatedText(\n  text: string,\n  availableWidth: number,\n  font: string,\n): { truncated: string; isTruncated: boolean } {\n  if (!text || availableWidth <= 0) {\n    return { truncated: text, isTruncated: false };\n  }\n\n  // Create a canvas element for text measurement\n  const canvas = document.createElement('canvas');\n  const context = canvas.getContext('2d');\n  if (!context) {\n    return { truncated: text, isTruncated: false };\n  }\n\n  context.font = font;\n  const ellipsis = '...';\n  const fullWidth = context.measureText(text).width;\n\n  // If text fits, return as-is\n  if (fullWidth <= availableWidth) {\n    return { truncated: text, isTruncated: false };\n  }\n\n  const ellipsisWidth = context.measureText(ellipsis).width;\n  const targetWidth = availableWidth - ellipsisWidth;\n\n  if (targetWidth <= 0) {\n    return { truncated: ellipsis, isTruncated: true };\n  }\n\n  // Binary search for optimal split point\n  let start = 0;\n  let end = text.length;\n  let bestStart = 0;\n  let bestEnd = text.length;\n\n  while (start <= end) {\n    const mid = Math.floor((start + end) / 2);\n    const leftPart = text.substring(0, mid);\n    const rightPart = text.substring(text.length - mid);\n    const combinedWidth =\n      context.measureText(leftPart).width + context.measureText(rightPart).width;\n\n    if (combinedWidth <= targetWidth) {\n      bestStart = mid;\n      bestEnd = text.length - mid;\n      start = mid + 1;\n    } else {\n      end = mid - 1;\n    }\n  }\n\n  const truncated = text.substring(0, bestStart) + ellipsis + text.substring(bestEnd);\n  return { truncated, isTruncated: true };\n}\n\n/**\n * Renders text that truncates in the middle (`abc...xyz`) based on the\n * container width while preserving both the prefix and suffix.\n *\n * A tooltip with the original text is provided when truncation occurs.\n */\nexport const MiddleEllipsisText = React.memo(\n  React.forwardRef<HTMLSpanElement, MiddleEllipsisTextProps>(({ text, className }, ref) => {\n    const [displayText, setDisplayText] = React.useState(text);\n    const [isTruncated, setIsTruncated] = React.useState(false);\n    const containerRef = React.useRef<HTMLSpanElement>(null);\n    const rafIdRef = React.useRef<number | null>(null);\n\n    React.useImperativeHandle(ref, () => containerRef.current!);\n\n    const updateTruncation = React.useCallback(() => {\n      const container = containerRef.current;\n      if (!container) return;\n\n      const computedStyle = window.getComputedStyle(container);\n      const font = `${computedStyle.fontSize} ${computedStyle.fontFamily}`;\n      const availableWidth = container.offsetWidth;\n\n      const { truncated, isTruncated: truncated_flag } = calculateTruncatedText(\n        text,\n        availableWidth,\n        font,\n      );\n\n      setDisplayText(truncated);\n      setIsTruncated(truncated_flag);\n    }, [text]);\n\n    // Update truncation on mount/text change and observe resize\n    React.useEffect(() => {\n      updateTruncation();\n\n      const container = containerRef.current;\n      let resizeObserver: ResizeObserver | null = null;\n\n      if (container) {\n        resizeObserver = new ResizeObserver(() => {\n          if (rafIdRef.current !== null) {\n            cancelAnimationFrame(rafIdRef.current);\n          }\n          rafIdRef.current = requestAnimationFrame(() => {\n            updateTruncation();\n          });\n        });\n\n        resizeObserver.observe(container);\n      }\n\n      return () => {\n        if (rafIdRef.current !== null) {\n          cancelAnimationFrame(rafIdRef.current);\n          rafIdRef.current = null;\n        }\n        resizeObserver?.disconnect();\n      };\n    }, [updateTruncation]);\n\n    return (\n      <span\n        ref={containerRef}\n        className={cn('block min-w-0', className)}\n        title={isTruncated ? text : undefined}\n      >\n        {displayText}\n      </span>\n    );\n  }),\n);\n",
      "type": "registry:component",
      "target": "components/auth0/shared/middle-ellipsis-text.tsx"
    },
    {
      "path": "src/components/auth0/shared/section.tsx",
      "content": "/**\n * Section layout with title and actions.\n * @module section\n * @internal\n */\n\nimport type { ActionButton as CoreActionButton } from '@auth0/universal-components-core';\nimport type { LucideIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { Toggle } from '@/components/ui/toggle';\nimport { cn } from '@/lib/utils';\n\nexport interface BaseActionProps extends Omit<CoreActionButton, 'icon' | 'onClick'> {\n  icon?: LucideIcon;\n  className?: string;\n}\n\nexport interface ButtonActionProps extends BaseActionProps {\n  type: 'button';\n  onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport interface ToggleActionProps extends Omit<BaseActionProps, 'type'> {\n  type: 'toggle';\n  pressed?: boolean;\n  onPressedChange: (pressed: boolean) => void;\n  'aria-label': string;\n}\n\nexport type ActionProps = ButtonActionProps | ToggleActionProps;\n\ninterface SectionProps {\n  title?: string;\n  description?: string;\n  children: React.ReactNode;\n  actions?: ActionProps[];\n  className?: string;\n}\n\nconst ButtonAction: React.FC<ButtonActionProps> = ({\n  icon: Icon,\n  className,\n  label,\n  onClick,\n  disabled,\n  variant,\n  size,\n}) => (\n  <Button\n    onClick={onClick}\n    disabled={disabled}\n    variant={variant}\n    size={size}\n    className={cn('flex items-center gap-2 w-full sm:w-auto sm:min-w-fit', className)}\n    aria-label={label}\n  >\n    {Icon && <Icon className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\" />}\n    <span className=\"truncate\">{label}</span>\n  </Button>\n);\n\nconst ToggleAction: React.FC<ToggleActionProps> = ({\n  icon: Icon,\n  className,\n  label,\n  'aria-label': ariaLabel,\n  pressed,\n  onPressedChange,\n  disabled,\n  variant,\n  size,\n}) => (\n  <Toggle\n    pressed={pressed}\n    onPressedChange={onPressedChange}\n    disabled={disabled}\n    variant={variant === 'outline' ? 'outline' : 'default'}\n    size={size === 'icon' || size === 'xs' ? 'sm' : size}\n    className={cn('flex items-center gap-2', className)}\n    aria-label={ariaLabel}\n  >\n    {Icon && <Icon className=\"h-4 w-4 flex-shrink-0\" aria-hidden=\"true\" />}\n    {label && <span className=\"truncate\">{label}</span>}\n  </Toggle>\n);\n\n/**\n *\n * @param props - Component props.\n * @param props.title - The title text\n * @param props.description - The description text\n * @param props.children - Child elements to render\n * @param props.actions - Action buttons or elements\n * @param props.className - Optional CSS class name for styling\n * @returns JSX element\n */\nexport function Section({\n  title,\n  description,\n  children,\n  actions,\n  className,\n}: SectionProps): React.JSX.Element {\n  const renderAction = (action: ActionProps, index: number) => {\n    const key = `action-${index}`;\n    return action.type === 'toggle' ? (\n      <ToggleAction key={key} {...action} />\n    ) : (\n      <ButtonAction key={key} {...action} />\n    );\n  };\n\n  return (\n    <div className={cn('space-y-6', className)}>\n      <div className=\"flex items-start justify-between gap-4\">\n        <div className=\"flex flex-col min-w-0 flex-1 space-y-2\">\n          {title && (\n            <h3\n              className={cn(\n                'text-lg text-foreground text-(length:--font-size-subtitle) font-semibold mb-1 text-left',\n              )}\n            >\n              {title}\n            </h3>\n          )}\n          {description && (\n            <p\n              className={cn(\n                'text-sm text-muted-foreground text-left text-(length:--font-size-paragraph)',\n              )}\n            >\n              {description}\n            </p>\n          )}\n        </div>\n\n        {actions && actions.length > 0 && (\n          <div className=\"flex-shrink-0 flex items-start gap-2 mt-1\">\n            {actions.map(renderAction)}\n          </div>\n        )}\n      </div>\n\n      <div className=\"space-y-6\">{children}</div>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/auth0/shared/section.tsx"
    },
    {
      "path": "src/components/auth0/shared/sonner.tsx",
      "content": "/**\n * Sonner toast provider wrapper.\n * @module sonner\n * @internal\n */\n\n'use client';\n\nimport type { ToasterProps } from 'sonner';\nimport { Toaster as Sonner } from 'sonner';\n\nimport { useTheme } from '@/hooks/shared/use-theme';\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n  const { isDarkMode } = useTheme();\n  const theme = isDarkMode ? 'dark' : 'light';\n\n  return (\n    <Sonner\n      theme={theme as ToasterProps['theme']}\n      className=\"toaster group\"\n      toastOptions={{\n        style: {\n          width: 'fit-content',\n          maxWidth: '22.25rem',\n        },\n      }}\n      {...props}\n    />\n  );\n};\n\nexport { Toaster };\n",
      "type": "registry:component",
      "target": "components/auth0/shared/sonner.tsx"
    },
    {
      "path": "src/components/auth0/shared/styled-scope.tsx",
      "content": "/**\n * Auth0Scope component — CSS scope root and portal container for lib components.\n * @module auth0-scope\n * @internal\n */\n\n'use client';\n\nimport { getCoreStyles } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport { ThemeContext } from '@/providers/theme-provider';\n\nexport interface StyledScopeProps {\n  children: React.ReactNode;\n  style?: React.CSSProperties;\n}\n\n/**\n * CSS scope root for lib components. Handles dark-mode class and theme attribute.\n *\n * @param props - Component props.\n * @param props.children - Content to render inside the scope root.\n * @param props.style - Optional inline CSS styles\n * @returns A scoped wrapper div with dark-mode and theme attributes applied.\n * @internal\n */\nexport const StyledScope: React.FC<StyledScopeProps> = ({ children, style }) => {\n  const { theme = 'default', isDarkMode, variables } = React.useContext(ThemeContext);\n\n  const mergedStyle = React.useMemo(() => {\n    const providerVars = getCoreStyles(variables, isDarkMode).variables;\n    return { ...providerVars, ...style };\n  }, [variables, isDarkMode, style]);\n\n  return (\n    <div\n      className={cn('auth0-universal', isDarkMode && 'dark')}\n      data-theme={theme}\n      style={mergedStyle}\n    >\n      {children}\n    </div>\n  );\n};\n",
      "type": "registry:component",
      "target": "components/auth0/shared/styled-scope.tsx"
    },
    {
      "path": "src/components/auth0/shared/toast.tsx",
      "content": "/**\n * Toast notification utilities.\n * @module toast\n * @internal\n */\n\nimport { Flag } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { toast, type ExternalToast } from 'sonner';\n\nimport { DEFAULT_TOAST_SETTINGS } from '@/types/toast-types';\nimport type { ToastOptions, ToastSettings, ToastType } from '@/types/toast-types';\n\nconst TOAST_COLOR_CLASSES: Record<ToastType, string> = {\n  success: 'text-success-foreground',\n  error: 'text-destructive-foreground',\n  warning: 'text-warning-foreground',\n  info: 'text-info-foreground',\n} as const;\n\nconst VALID_TOAST_TYPES: ToastType[] = ['success', 'error', 'warning', 'info'] as const;\n\nconst BASE_TOAST_Z_INDEX = 1000;\nlet toastZIndexCounter = 0;\nconst MAX_Z_INDEX_COUNTER = 1000;\nconst activeToastIds = new Set<string | number | unknown>();\n\n/**\n * Resets the z-index counter if no active toasts remain\n */\nconst resetCounterIfEmpty = (): void => {\n  if (activeToastIds.size === 0) {\n    toastZIndexCounter = 0;\n  }\n};\n\n/**\n * Removes a toast from tracking and resets counter if needed\n * @param toastId - The toast ID to remove, or undefined to clear all\n */\nconst removeToastFromTracking = (toastId?: string | number | unknown): void => {\n  if (toastId !== undefined && toastId !== null) {\n    activeToastIds.delete(toastId);\n  } else {\n    activeToastIds.clear();\n  }\n  resetCounterIfEmpty();\n};\n\nlet globalToastSettings: ToastSettings = {\n  ...DEFAULT_TOAST_SETTINGS,\n};\n\n/**\n * Sets global toast configuration. Called by Auth0ComponentProvider.\n * @param settings - Settings configuration\n * @internal\n */\nexport const setGlobalToastSettings = (settings?: ToastSettings): void => {\n  if (!settings) {\n    globalToastSettings = {\n      ...DEFAULT_TOAST_SETTINGS,\n    };\n    return;\n  }\n\n  globalToastSettings = {\n    ...settings,\n  };\n\n  if (settings.provider === 'custom') {\n    const { methods } = settings;\n    const availableMethods = Object.keys(methods);\n\n    if (availableMethods.length === 0) {\n      console.warn(\n        'Auth0ComponentProvider: Custom toast provider specified but no custom methods provided',\n      );\n    }\n\n    availableMethods.forEach((method) => {\n      if (typeof methods[method as keyof typeof methods] !== 'function') {\n        console.warn(`Auth0ComponentProvider: Custom toast method '${method}' is not a function`);\n      }\n    });\n  }\n};\n\n/**\n * Gets the current global toast configuration.\n * @returns The current toast settings\n */\nexport const getGlobalToastSettings = (): ToastSettings => globalToastSettings;\n\n/**\n * Creates a styled message element with appropriate color classes.\n * @param type - The toast type for styling\n * @param message - The message text to style\n * @returns A React element with styled text\n */\nconst createStyledMessage = (type: ToastType, message: string): ReactNode => {\n  const colorClass = TOAST_COLOR_CLASSES[type];\n  return <span className={colorClass}>{message}</span>;\n};\n\n/**\n * Creates a default icon for the toast based on its type.\n * @param type - The toast type to create an icon for\n * @returns A React element with a styled Flag icon\n */\nconst createDefaultIcon = (type: ToastType): ReactNode => {\n  const colorClass = TOAST_COLOR_CLASSES[type];\n  return <Flag className={`h-4 w-4 ${colorClass}`} aria-hidden=\"true\" />;\n};\n\n/**\n * Shows a toast notification using the configured provider.\n *\n * @param options - The toast configuration options\n * @param options.type - The type of toast ('success', 'error', 'info', 'warning', 'loading')\n * @param options.message - The message to display in the toast\n * @param options.className - Optional CSS class name for custom styling\n * @param options.icon - Optional custom icon to display\n * @param options.data - Additional options passed to the toast provider\n * @returns The toast instance ID or result from custom method\n */\nexport const showToast = ({\n  type,\n  message,\n  className,\n  icon,\n  data = {},\n}: ToastOptions): string | number | void => {\n  if (!message?.trim()) {\n    console.warn('showToast: Empty message provided');\n    return;\n  }\n\n  if (!VALID_TOAST_TYPES.includes(type)) {\n    console.error(\n      `showToast: Invalid toast type '${type}'. Must be one of: ${VALID_TOAST_TYPES.join(', ')}`,\n    );\n    return;\n  }\n\n  if (globalToastSettings.provider === 'custom' && globalToastSettings.methods[type]) {\n    try {\n      // Custom methods only receive the message - they handle their own configuration\n      return globalToastSettings.methods[type]!(message);\n    } catch (error) {\n      console.error(`showToast: Error in custom ${type} method:`, error);\n    }\n  }\n\n  const styledMessage = createStyledMessage(type, message);\n  const defaultIcon = icon || createDefaultIcon(type);\n\n  const currentZIndex = BASE_TOAST_Z_INDEX + toastZIndexCounter;\n  toastZIndexCounter += 1;\n\n  if (toastZIndexCounter >= MAX_Z_INDEX_COUNTER) {\n    toastZIndexCounter = 0;\n  }\n\n  const toastOptions: ExternalToast = {\n    className,\n    icon: defaultIcon,\n    style: {\n      zIndex: currentZIndex,\n    },\n    onDismiss: (toastId) => {\n      removeToastFromTracking(toastId);\n    },\n    ...data,\n  };\n\n  try {\n    const toastId = toast[type](styledMessage, toastOptions);\n    if (toastId) {\n      activeToastIds.add(toastId);\n    }\n    return toastId;\n  } catch (error) {\n    console.error(`showToast: Error showing ${type} toast:`, error);\n    return toast(message);\n  }\n};\n\n/**\n * Dismisses a toast notification by ID, or dismisses all toasts if no ID is provided.\n *\n * @param toastId - Optional toast ID to dismiss. If not provided, dismisses all toasts.\n */\nexport const dismissToast = (toastId?: string | number): void => {\n  if (globalToastSettings.provider === 'custom' && globalToastSettings.methods.dismiss) {\n    try {\n      globalToastSettings.methods.dismiss(toastId?.toString());\n    } catch (error) {\n      console.error('dismissToast: Error in custom dismiss method:', error);\n    }\n    return;\n  }\n\n  toast.dismiss(toastId);\n\n  removeToastFromTracking(toastId);\n};\n",
      "type": "registry:component",
      "target": "components/auth0/shared/toast.tsx"
    },
    {
      "path": "src/components/ui/accordion.tsx",
      "content": "/**\n * Accordion component using Radix primitives.\n * @module accordion\n * @internal\n */\n\n'use client';\n\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { ChevronDown } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Accordion({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n  return (\n    <AccordionPrimitive.Root\n      data-slot=\"accordion\"\n      className={cn('w-full space-y-2 bg-card', className)}\n      {...props}\n    />\n  );\n}\n\nfunction AccordionItem({\n  className,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n  return (\n    <AccordionPrimitive.Item\n      data-slot=\"accordion-item\"\n      className={cn(\n        'text-card-foreground shadow-bevel-2xl flex flex-col rounded-2xl transition-all duration-150 ease-in-out',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AccordionTrigger({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n  return (\n    <AccordionPrimitive.Header className=\"flex\">\n      <AccordionPrimitive.Trigger\n        data-slot=\"accordion-trigger\"\n        className={cn(\n          'group text-foreground focus-visible:ring-ring flex w-full items-center justify-between p-6 text-sm font-medium transition-all duration-150 ease-in-out focus-visible:ring-2 focus-visible:outline-hidden disabled:cursor-not-allowed [&[data-state=open]>svg]:rotate-180',\n          className,\n        )}\n        {...props}\n      >\n        {children}\n        <ChevronDown className=\"text-muted-foreground size-4 shrink-0 transition-transform duration-150\" />\n      </AccordionPrimitive.Trigger>\n    </AccordionPrimitive.Header>\n  );\n}\n\nfunction AccordionContent({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n  return (\n    <AccordionPrimitive.Content\n      data-slot=\"accordion-content\"\n      className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\"\n      {...props}\n    >\n      <div\n        className={cn(\n          'text-muted-foreground border-border animate-in fade-in-50 px-6 pb-6 min-h-10 text-sm transition-all duration-150 ease-in-out',\n          className,\n        )}\n      >\n        {children}\n      </div>\n    </AccordionPrimitive.Content>\n  );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n",
      "type": "registry:component",
      "target": "components/ui/accordion.tsx"
    },
    {
      "path": "src/components/ui/alert.tsx",
      "content": "/**\n * Alert component with status variants.\n * @module alert\n * @internal\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst alertVariants = cva(\n  'shadow-input-hover bg-input relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 overflow-clip rounded-3xl p-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',\n  {\n    variants: {\n      variant: {\n        default: 'text-foreground border-b-2 border-transparent',\n        info: 'text-info-foreground [&>svg]:text-info-foreground',\n        success: 'text-success-foreground [&>svg]:text-success-foreground',\n        warning: 'text-warning-foreground [&>svg]:text-warning-foreground',\n        destructive: 'text-destructive-foreground [&>svg]:text-destructive-foreground',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n    },\n  },\n);\n\nfunction Alert({\n  className,\n  variant,\n  ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {\n  return (\n    <div\n      data-slot=\"alert\"\n      role=\"alert\"\n      className={cn(alertVariants({ variant }), className)}\n      {...props}\n    />\n  );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"alert-title\"\n      className={cn(\n        'col-start-2 line-clamp-1 flex h-auto min-h-4 leading-4.5 font-medium tracking-tight',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\nfunction AlertDescription({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"alert-description\"\n      className={cn(\n        'text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      className={cn('absolute top-2 right-2 flex items-center space-x-4', className)}\n      {...props}\n    />\n  );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction };\n",
      "type": "registry:component",
      "target": "components/ui/alert.tsx"
    },
    {
      "path": "src/components/ui/badge.tsx",
      "content": "/**\n * Badge component with variants.\n * @module badge\n * @internal\n */\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n  'theme-default:shadow-xs box-border inline-flex items-center overflow-clip rounded-2xl border border-transparent font-medium',\n  {\n    variants: {\n      variant: {\n        default: 'bg-primary text-primary-foreground theme-default:border-primary',\n        secondary: 'bg-muted text-muted-foreground theme-default:border-muted-foreground/25',\n        outline: 'border-border',\n        info: 'bg-info text-info-foreground theme-default:border-info-foreground/25',\n        success: 'bg-success theme-default:border-success-foreground/25 text-success-foreground',\n        warning: 'bg-warning theme-default:border-warning-foreground/25 text-warning-foreground',\n        destructive:\n          'bg-destructive theme-default:border-destructive-foreground/25 text-destructive-foreground',\n      },\n      size: {\n        sm: 'px-1.5 py-0.5 text-xs',\n        md: 'px-2 py-1 text-sm',\n        lg: 'px-2.5 py-1.5 text-sm',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'md',\n    },\n  },\n);\n\nfunction Badge({\n  className,\n  variant,\n  size,\n  asChild = false,\n  ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot : 'span';\n\n  return (\n    <Comp\n      data-slot=\"badge\"\n      className={cn(badgeVariants({ variant, size }), className)}\n      {...props}\n    />\n  );\n}\n\nexport { Badge, badgeVariants };\n",
      "type": "registry:component",
      "target": "components/ui/badge.tsx"
    },
    {
      "path": "src/components/ui/button.tsx",
      "content": "/**\n * Button component with variants.\n * @module button\n * @internal\n */\n\n'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n  \"focus-visible:ring-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive theme-default:active:scale-[0.99] relative box-border inline-flex shrink-0 items-center justify-center gap-2 overflow-hidden text-sm font-medium whitespace-nowrap transition-all duration-150 ease-in-out outline-none focus-visible:ring-4 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      variant: {\n        primary:\n          \"shadow-button-resting hover:shadow-button-hover hover:border-primary/50 border-primary bg-primary text-primary-foreground hover:bg-primary/90 theme-default:before:from-primary-foreground/0 theme-default:before:to-primary-foreground/15 theme-default:before:absolute theme-default:before:top-0 theme-default:before:left-0 theme-default:before:block theme-default:before:h-full theme-default:before:w-full theme-default:before:bg-gradient-to-t theme-default:before:content-[''] border\",\n        outline:\n          \"dark:bg-muted/50 hover:text-accent-foreground shadow-button-outlined-resting hover:shadow-button-outlined-hover hover:border-accent bg-background hover:bg-muted text-primary border-primary/35 theme-default:before:from-primary/5 theme-default:before:to-primary/0 theme-default:before:absolute theme-default:before:top-0 theme-default:before:left-0 theme-default:before:block theme-default:before:h-full theme-default:before:w-full theme-default:before:bg-gradient-to-t theme-default:before:content-[''] border\",\n        ghost: 'hover:bg-muted text-primary bg-transparent',\n        destructive:\n          \"bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-button-destructive-resting hover:shadow-button-destructive-hover border-destructive-border/25 hover:border-destructive-border/50 theme-default:before:to-primary-foreground/50 theme-default:before:absolute theme-default:before:top-0 theme-default:before:left-0 theme-default:before:block theme-default:before:h-full theme-default:before:w-full theme-default:before:bg-gradient-to-t theme-default:before:content-[''] theme-default:border\",\n        link: 'text-foreground underline-offset-4 hover:underline',\n      },\n      size: {\n        default: 'h-10 rounded-2xl px-4 py-2.5 has-[>svg]:px-3',\n        xs: 'h-7 rounded-md px-2 py-1.5 text-xs has-[>svg]:px-2',\n        sm: 'h-8 gap-1.5 rounded-xl px-3 py-2 text-xs has-[>svg]:px-2.5',\n        lg: 'h-12 rounded-3xl px-6 py-3 text-base has-[>svg]:px-4',\n        icon: 'size-7 rounded-xl',\n      },\n    },\n    defaultVariants: {\n      variant: 'primary',\n      size: 'default',\n    },\n  },\n);\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  as?: boolean;\n}\n\nfunction Button({\n  className,\n  variant,\n  size,\n  as,\n  ...props\n}: React.ComponentProps<'button'> & ButtonProps) {\n  const Comp = as ? Slot : 'button';\n\n  return <Comp className={cn(buttonVariants({ variant, size }), className)} {...props} />;\n}\n\nexport { Button, buttonVariants };\n",
      "type": "registry:component",
      "target": "components/ui/button.tsx"
    },
    {
      "path": "src/components/ui/card.tsx",
      "content": "/**\n * Card layout component.\n * @module card\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Card({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"card\"\n      className={cn(\n        'bg-card text-card-foreground shadow-bevel-2xl flex flex-col gap-6 rounded-4xl py-6',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"card-header\"\n      className={cn(\n        '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"card-title\"\n      className={cn('leading-none font-semibold', className)}\n      {...props}\n    />\n  );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"card-description\"\n      className={cn('text-muted-foreground text-sm', className)}\n      {...props}\n    />\n  );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"card-action\"\n      className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n      {...props}\n    />\n  );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n  return <div data-slot=\"card-content\" className={cn('px-6', className)} {...props} />;\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"card-footer\"\n      className={cn('flex items-center px-6 [.border-t]:pt-6', className)}\n      {...props}\n    />\n  );\n}\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent };\n",
      "type": "registry:component",
      "target": "components/ui/card.tsx"
    },
    {
      "path": "src/components/ui/checkbox.tsx",
      "content": "/**\n * Checkbox component using Radix primitives.\n * @module checkbox\n * @internal\n */\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { CheckIcon, MinusIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n  return (\n    <CheckboxPrimitive.Root\n      data-slot=\"checkbox\"\n      className={cn(\n        'group shadow-checkbox-resting peer hover:shadow-checkbox-hover focus-visible:ring-ring hover:border-primary/50 border-border data-[state=checked]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive relative flex size-6 shrink-0 appearance-none items-center justify-center rounded-lg border transition-[colors,shadow] duration-150 ease-in-out outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50',\n        className,\n      )}\n      {...props}\n    >\n      <CheckboxPrimitive.Indicator\n        data-slot=\"checkbox-indicator\"\n        className=\"group-data-[state=checked]:animate-in group-data-[state=unchecked]:animate-out group-data-[state=unchecked]:fade-out-0 group-data-[state=checked]:fade-in-0 group-data-[state=unchecked]:slide-out-to-bottom-5 group-data-[state=unchecked]:zoom-out-75 group-data-[state=checked]:zoom-in-75 group-data-[state=checked]:slide-in-from-bottom-5 text-primary-foreground stroke-primary-foreground duration-150 ease-in-out group-data-[state=checked]:block\"\n      >\n        {props.checked === 'indeterminate' ? (\n          <MinusIcon className=\"size-3 stroke-[4px]\" absoluteStrokeWidth />\n        ) : (\n          <CheckIcon className=\"size-3 stroke-[4px]\" absoluteStrokeWidth />\n        )}\n      </CheckboxPrimitive.Indicator>\n    </CheckboxPrimitive.Root>\n  );\n}\n\nexport { Checkbox };\n",
      "type": "registry:component",
      "target": "components/ui/checkbox.tsx"
    },
    {
      "path": "src/components/ui/dialog.tsx",
      "content": "/**\n * Dialog component using Radix primitives.\n * @module dialog\n * @internal\n */\n\n'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { XIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { usePortalContainer } from '@/providers/portal-context';\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n  return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n  const { children, asChild = false, ...elementProps } = props;\n\n  if (asChild && React.isValidElement(children)) {\n    return React.cloneElement(children, {\n      ...(typeof children.props === 'object' ? children.props : {}),\n      ...elementProps,\n    });\n  }\n\n  return (\n    <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" asChild {...props}>\n      <Button {...elementProps} data-slot=\"dialog-trigger\">\n        {children}\n      </Button>\n    </DialogPrimitive.Trigger>\n  );\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n  const portalContainer = usePortalContainer();\n  return (\n    <DialogPrimitive.Portal container={portalContainer} data-slot=\"dialog-portal\" {...props} />\n  );\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n  const { children } = props;\n\n  return (\n    <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n      <Button variant=\"outline\" data-slot=\"dialog-close\">\n        {children}\n      </Button>\n    </DialogPrimitive.Close>\n  );\n}\n\nfunction DialogOverlay({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n  return (\n    <DialogPrimitive.Overlay\n      data-slot=\"dialog-overlay\"\n      className={cn(\n        'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 duration-200 ease-in-out',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction DialogContent({\n  className,\n  children,\n  showCloseButton = true,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n  showCloseButton?: boolean;\n}) {\n  return (\n    <DialogPortal data-slot=\"dialog-portal\">\n      <DialogOverlay />\n      <DialogPrimitive.Content\n        data-slot=\"dialog-content\"\n        className={cn(\n          'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 shadow-bevel-2xl rounded-5xl fixed top-[50%] left-[50%] z-[999] grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 p-6 duration-200 ease-in-out sm:max-w-lg',\n          className,\n        )}\n        {...props}\n      >\n        {children}\n        {showCloseButton && (\n          <DialogPrimitive.Close\n            asChild\n            data-slot=\"dialog-close\"\n            className=\"ring-offset-background absolute top-4 right-4\"\n          >\n            <Button variant=\"ghost\" size=\"icon\">\n              <XIcon />\n              <span className=\"sr-only\">Close</span>\n            </Button>\n          </DialogPrimitive.Close>\n        )}\n      </DialogPrimitive.Content>\n    </DialogPortal>\n  );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"dialog-header\"\n      className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n  return (\n    <div\n      data-slot=\"dialog-footer\"\n      className={cn('flex flex-row gap-2 justify-end', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n  return (\n    <DialogPrimitive.Title\n      data-slot=\"dialog-title\"\n      className={cn('text-lg text-primary leading-none font-semibold', className)}\n      {...props}\n    />\n  );\n}\n\nfunction DialogDescription({\n  className,\n  ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n  return (\n    <DialogPrimitive.Description\n      data-slot=\"dialog-description\"\n      className={cn('text-muted-foreground text-sm', className)}\n      {...props}\n    />\n  );\n}\n\nexport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogOverlay,\n  DialogPortal,\n  DialogTitle,\n  DialogTrigger,\n};\n",
      "type": "registry:component",
      "target": "components/ui/dialog.tsx"
    },
    {
      "path": "src/components/ui/file-upload.tsx",
      "content": "/**\n * File upload component with drag-drop support.\n * @module file-upload\n * @internal\n */\n\nimport { Upload, X } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nexport interface FileUploadProps\n  extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {\n  value?: File[];\n  onChange?: (files: File[]) => void;\n  onInvalidFiles?: (files: File[]) => void;\n  onRemove?: (file: File) => void;\n  maxSize?: number;\n  accept?: string;\n  maxFiles?: number;\n  preview?: boolean;\n  className?: string;\n}\n\nexport function FileUpload({\n  value = [],\n  onChange,\n  onInvalidFiles,\n  onRemove,\n  maxSize,\n  accept,\n  maxFiles = 1,\n  preview = true,\n  className,\n  disabled,\n  ...props\n}: FileUploadProps) {\n  const inputRef = React.useRef<HTMLInputElement>(null);\n  const [dragActive, setDragActive] = React.useState(false);\n\n  const handleDrag = React.useCallback((e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    if (e.type === 'dragenter' || e.type === 'dragover') {\n      setDragActive(true);\n    } else if (e.type === 'dragleave') {\n      setDragActive(false);\n    }\n  }, []);\n\n  const handleDrop = React.useCallback((e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    setDragActive(false);\n\n    const files = Array.from(e.dataTransfer.files);\n    handleFiles(files);\n  }, []);\n\n  const handleChange = React.useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n    const files = Array.from(e.target.files || []);\n    handleFiles(files);\n  }, []);\n\n  const handleFiles = React.useCallback(\n    (files: File[]) => {\n      if (disabled) return;\n      const validFiles: File[] = [];\n      const invalidFiles: File[] = [];\n\n      files.forEach((file) => {\n        if (maxSize && file.size > maxSize) {\n          invalidFiles.push(file);\n          return;\n        }\n\n        if (\n          accept &&\n          !accept.split(',').some((type) => {\n            const fileType = type.trim().toLowerCase();\n            const fileName = file.name.toLowerCase();\n            const fileMimeType = file.type.toLowerCase();\n            if (fileType.startsWith('.')) {\n              return fileName.endsWith(fileType);\n            }\n\n            if (fileType === fileMimeType) {\n              return true;\n            }\n\n            if (fileType.endsWith('/*')) {\n              const baseType = fileType.slice(0, -2);\n              return fileMimeType.startsWith(`${baseType}/`);\n            }\n\n            return false;\n          })\n        ) {\n          invalidFiles.push(file);\n          return;\n        }\n\n        validFiles.push(file);\n      });\n\n      if (invalidFiles.length > 0) {\n        onInvalidFiles?.(invalidFiles);\n      }\n\n      if (maxFiles === 1) {\n        onChange?.(validFiles.slice(0, 1));\n      } else {\n        onChange?.([...value, ...validFiles].slice(0, maxFiles));\n      }\n\n      if (inputRef.current) inputRef.current.value = '';\n    },\n    [disabled, maxSize, accept, maxFiles, onChange, onInvalidFiles, value],\n  );\n\n  const removeFile = React.useCallback(\n    (file: File) => {\n      onRemove?.(file);\n      onChange?.(value.filter((f) => f !== file));\n    },\n    [onChange, onRemove, value],\n  );\n\n  return (\n    <div className={cn('space-y-4', className)}>\n      <div\n        onDragEnter={handleDrag}\n        onDragLeave={handleDrag}\n        onDragOver={handleDrag}\n        onDrop={handleDrop}\n        className={cn(\n          'border-muted-foreground/25 relative flex min-h-[150px] cursor-pointer items-center justify-center rounded-lg border-2 border-dashed p-4 text-center transition-colors',\n          dragActive && 'border-primary',\n          disabled && 'cursor-not-allowed opacity-60',\n          className,\n        )}\n      >\n        <input\n          ref={inputRef}\n          type=\"file\"\n          multiple={maxFiles !== 1}\n          accept={accept}\n          onChange={handleChange}\n          disabled={disabled}\n          className=\"absolute inset-0 cursor-pointer opacity-0 disabled:cursor-not-allowed\"\n          {...props}\n        />\n        <div className=\"flex flex-col items-center gap-2\">\n          <Upload className=\"text-muted-foreground h-8 w-8\" />\n          <p className=\"text-muted-foreground text-sm\">\n            Drag & drop files here, or click to select files\n          </p>\n          {accept && <p className=\"text-muted-foreground text-xs\">Allowed files: {accept}</p>}\n          {maxSize && (\n            <p className=\"text-muted-foreground text-xs\">\n              Max size: {(maxSize / 1024 / 1024).toFixed(2)}MB\n            </p>\n          )}\n        </div>\n      </div>\n\n      {preview && value.length > 0 && (\n        <div className=\"grid gap-4\">\n          {value.map((file, i) => (\n            <div key={i} className=\"flex items-center gap-2 rounded-md border p-2\">\n              <div className=\"flex-1 truncate\">\n                <p className=\"text-sm font-medium\">{file.name}</p>\n                <p className=\"text-muted-foreground text-xs\">{(file.size / 1024).toFixed(2)}KB</p>\n              </div>\n              <button\n                type=\"button\"\n                onClick={() => removeFile(file)}\n                className=\"hover:bg-muted shrink-0 rounded-md p-1 transition-colors\"\n                disabled={disabled}\n              >\n                <X className=\"size-4\" />\n              </button>\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/ui/file-upload.tsx"
    },
    {
      "path": "src/components/ui/form.tsx",
      "content": "/**\n * Form components with react-hook-form integration.\n * @module form\n * @internal\n */\n\n'use client';\n\nimport type * as LabelPrimitive from '@radix-ui/react-label';\nimport { Slot } from '@radix-ui/react-slot';\nimport * as React from 'react';\nimport {\n  Controller,\n  FormProvider,\n  useFormContext,\n  useFormState,\n  type ControllerProps,\n  type FieldPath,\n  type FieldValues,\n} from 'react-hook-form';\n\nimport { Label } from '@/components/ui/label';\nimport { cn } from '@/lib/utils';\n\nconst Form: typeof FormProvider = FormProvider;\n\ntype FormFieldContextValue<\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n  name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);\n\nconst FormField = <\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n  ...props\n}: ControllerProps<TFieldValues, TName>) => {\n  return (\n    <FormFieldContext.Provider value={{ name: props.name }}>\n      <Controller\n        {...props}\n        render={({ field, fieldState, formState }) => {\n          const { onChange, onBlur, ...rest } = field;\n          return props.render({\n            field: {\n              ...rest,\n              onChange: (...args: unknown[]) => {\n                onChange(...(args as Parameters<typeof onChange>));\n              },\n              onBlur: (...args: unknown[]) => {\n                onBlur(...(args as Parameters<typeof onBlur>));\n              },\n            },\n            fieldState,\n            formState,\n          });\n        }}\n      />\n    </FormFieldContext.Provider>\n  );\n};\n\nconst useFormField = () => {\n  const fieldContext = React.useContext(FormFieldContext);\n  const itemContext = React.useContext(FormItemContext);\n  const { getFieldState } = useFormContext();\n  const formState = useFormState({ name: fieldContext.name });\n  const fieldState = getFieldState(fieldContext.name, formState);\n\n  if (!fieldContext) {\n    throw new Error('useFormField should be used within <FormField>');\n  }\n\n  const { id } = itemContext;\n\n  return {\n    id,\n    name: fieldContext.name,\n    formItemId: `${id}-form-item`,\n    formDescriptionId: `${id}-form-item-description`,\n    formMessageId: `${id}-form-item-message`,\n    ...fieldState,\n  };\n};\n\ntype FormItemContextValue = {\n  id: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);\n\nfunction FormItem({ className, ...props }: React.ComponentProps<'div'>) {\n  const id = React.useId();\n\n  return (\n    <FormItemContext.Provider value={{ id }}>\n      <div data-slot=\"form-item\" className={cn('grid gap-2', className)} {...props} />\n    </FormItemContext.Provider>\n  );\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n  const { error, formItemId } = useFormField();\n\n  return (\n    <Label\n      data-slot=\"form-label\"\n      data-error={!!error}\n      className={cn('data-[error=true]:text-destructive-foreground', className)}\n      htmlFor={formItemId}\n      {...props}\n    />\n  );\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot>) {\n  const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n\n  return (\n    <Slot\n      data-slot=\"form-control\"\n      id={formItemId}\n      aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}\n      aria-invalid={!!error}\n      {...props}\n    />\n  );\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<'p'>) {\n  const { formDescriptionId } = useFormField();\n\n  return (\n    <p\n      data-slot=\"form-description\"\n      id={formDescriptionId}\n      className={cn('text-muted-foreground text-sm', className)}\n      {...props}\n    />\n  );\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<'p'>) {\n  const { error, formMessageId } = useFormField();\n  const body = error ? String(error?.message ?? '') : props.children;\n\n  if (!body) {\n    return null;\n  }\n\n  return (\n    <p\n      data-slot=\"form-message\"\n      id={formMessageId}\n      className={cn('text-destructive-foreground text-sm', className)}\n      {...props}\n    >\n      {body}\n    </p>\n  );\n}\n\nexport {\n  useFormField,\n  Form,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormDescription,\n  FormMessage,\n  FormField,\n};\n",
      "type": "registry:component",
      "target": "components/ui/form.tsx"
    },
    {
      "path": "src/components/ui/inline-code.tsx",
      "content": "/**\n * Inline code display component.\n * @module inline-code\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nexport interface InlineCodeProps {\n  children: React.ReactNode;\n  className?: string;\n}\n\nexport function InlineCode({ children, className }: InlineCodeProps) {\n  return (\n    <code\n      className={cn(\n        'bg-background theme-default:shadow-input-resting theme-default:bg-secondary shadow-bevel-xs relative rounded-lg px-[0.35rem] py-[0.2rem] font-mono text-sm font-medium tracking-tight',\n        className,\n      )}\n    >\n      {children}\n    </code>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/ui/inline-code.tsx"
    },
    {
      "path": "src/components/ui/label.tsx",
      "content": "/**\n * Form label component.\n * @module label\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nexport function Label({ children, className, ...props }: React.ComponentPropsWithoutRef<'label'>) {\n  return (\n    <label\n      className={cn(\n        'flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n        className,\n      )}\n      {...props}\n    >\n      {children}\n    </label>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/ui/label.tsx"
    },
    {
      "path": "src/components/ui/link.tsx",
      "content": "/**\n * Link component with variants.\n * @module link\n * @internal\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst linkVariants = cva(\n  'focus-within:ring-ring inline-flex items-center gap-2 rounded-md py-0.5 underline-offset-4 transition-colors focus:ring-3 focus-visible:outline-hidden',\n  {\n    variants: {\n      variant: {\n        destructive: 'text-destructive hover:text-destructive/90',\n        muted: 'text-muted hover:text-muted/80',\n        primary: 'text-primary hover:text-primary/90',\n      },\n      underline: {\n        none: 'no-underline',\n        hover: 'no-underline hover:underline',\n        always: 'underline',\n      },\n    },\n    defaultVariants: {\n      variant: 'primary',\n      underline: 'always',\n    },\n  },\n);\n\nexport interface LinkProps\n  extends React.AnchorHTMLAttributes<HTMLAnchorElement>,\n    VariantProps<typeof linkVariants> {\n  /**\n   * Optional ref for the link element.\n   */\n  ref?: React.Ref<HTMLAnchorElement>;\n}\n\nfunction Link({ ref, className, children, variant, underline, ...props }: LinkProps) {\n  return (\n    <a ref={ref} className={cn(linkVariants({ variant, underline }), className)} {...props}>\n      {children}\n    </a>\n  );\n}\n\nexport { Link };\n",
      "type": "registry:component",
      "target": "components/ui/link.tsx"
    },
    {
      "path": "src/components/ui/modal.tsx",
      "content": "/**\n * Modal dialog wrapper component.\n * @module modal\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { FormActions, type FormActionsProps } from '@/components/auth0/shared/form-actions';\nimport {\n  Dialog,\n  DialogContent,\n  DialogDescription,\n  DialogHeader,\n  DialogTitle,\n  DialogFooter,\n} from '@/components/ui/dialog';\n\ninterface ModalProps {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  title?: string;\n  description?: string;\n  content?: React.ReactNode;\n  modalActions?: FormActionsProps;\n  className?: string;\n  showCloseButton?: boolean;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n  open,\n  onOpenChange,\n  title,\n  description,\n  content,\n  modalActions,\n  className,\n  showCloseButton,\n}) => {\n  const hasHeader = title || description;\n\n  const actions: FormActionsProps = {\n    hasUnsavedChanges: true,\n    showPrevious: true,\n    showUnsavedChanges: false,\n    previousAction: {\n      label: 'Cancel',\n      variant: 'outline',\n      onClick: () => onOpenChange(false),\n    },\n    nextAction: {\n      label: 'Confirm',\n      variant: 'primary',\n      onClick: () => onOpenChange(false),\n    },\n    ...modalActions,\n  };\n\n  return (\n    <Dialog open={open} onOpenChange={onOpenChange}>\n      <DialogContent className={className} showCloseButton={showCloseButton}>\n        {hasHeader && (\n          <DialogHeader>\n            {title && <DialogTitle>{title}</DialogTitle>}\n            {description && <DialogDescription>{description}</DialogDescription>}\n          </DialogHeader>\n        )}\n\n        {content && <div className=\"py-4\">{content}</div>}\n\n        <DialogFooter>\n          <FormActions {...actions} />\n        </DialogFooter>\n      </DialogContent>\n    </Dialog>\n  );\n};\n\nModal.displayName = 'Modal';\n",
      "type": "registry:component",
      "target": "components/ui/modal.tsx"
    },
    {
      "path": "src/components/ui/radio-group.tsx",
      "content": "/**\n * Radio group using Radix primitives.\n * @module radio-group\n * @internal\n */\n\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction RadioGroup({\n  className,\n  ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n  return (\n    <RadioGroupPrimitive.RadioGroup\n      data-slot=\"radio-group\"\n      className={cn('space-y-2', className)}\n      {...props}\n    />\n  );\n}\n\nfunction RadioGroupItem({\n  className,\n  ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n  return (\n    <RadioGroupPrimitive.Item\n      data-slot=\"radio-group-item\"\n      className={cn(\n        'shadow-checkbox-resting peer border-border hover:shadow-checkbox-hover data-[state=checked]:hover:border-primary data-[state=checked]:border-primary hover:border-accent focus-visible:ring-ring data-[disabled]:border-border/50 data-[disabled]:bg-muted/50 data-[disabled]:data-[state=checked]:border-border/50 size-5 appearance-none rounded-full border transition-all duration-150 ease-in-out focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:cursor-not-allowed data-[state=checked]:border-7',\n        className,\n      )}\n      {...props}\n    >\n      <RadioGroupPrimitive.Indicator\n        data-slot=\"radio-group-indicator\"\n        className=\"fill-primary-foreground top-1/2 left-1/2 hidden size-2 -translate-x-1/2 -translate-y-1/2 data-[checked]:absolute\"\n      />\n    </RadioGroupPrimitive.Item>\n  );\n}\n\nexport { RadioGroup, RadioGroupItem };\n",
      "type": "registry:component",
      "target": "components/ui/radio-group.tsx"
    },
    {
      "path": "src/components/ui/select.tsx",
      "content": "/**\n * Select component using Radix primitives.\n * @module select\n * @internal\n */\n\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';\nimport * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\nimport { usePortalContainer } from '@/providers/portal-context';\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n  return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n  return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n  return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n  className,\n  size = 'default',\n  children,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n  size?: 'sm' | 'default';\n}) {\n  return (\n    <SelectPrimitive.Trigger data-slot=\"select-trigger\" data-size={size} asChild {...props}>\n      <Button\n        variant=\"outline\"\n        className={cn(\n          \"border-border/25 data-[placeholder]:text-primary text-input-foreground shadow-input-resting hover:shadow-input-hover hover:border-border/0 focus-within:outline-primary focus-within:shadow-input-hover bg-input disabled:bg-muted data-[state=open]:focus-within:outline-primary data-[state=open]:focus-within:shadow-input-hover [&_svg:not([class*='text-'])]:text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive flex w-full justify-between px-3 whitespace-nowrap ring-4 ring-transparent outline-4 disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n          className,\n        )}\n      >\n        {children}\n        <SelectPrimitive.Icon asChild>\n          <ChevronDownIcon\n            className={cn('text-primary size-4 transition-transform duration-200')}\n          />\n        </SelectPrimitive.Icon>\n      </Button>\n    </SelectPrimitive.Trigger>\n  );\n}\n\nfunction SelectContent({\n  className,\n  children,\n  position = 'popper',\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n  const portalContainer = usePortalContainer();\n  return (\n    <SelectPrimitive.Portal container={portalContainer}>\n      <SelectPrimitive.Content\n        className={cn(\n          'bg-popover text-popover-foreground animate-in fade-in-0 zoom-in-95 shadow-bevel-xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 z-[1000] max-h-[var(--radix-select-content-available-height)] min-w-[var(--radix-select-trigger-width)] overflow-hidden rounded-3xl ring-0 duration-300 ease-in-out outline-none focus:outline-none',\n          className,\n        )}\n        position={position}\n        side=\"bottom\"\n        align=\"start\"\n        sideOffset={8}\n        data-slot=\"select-content\"\n        {...props}\n      >\n        <SelectScrollUpButton />\n        <SelectPrimitive.Viewport className=\"p-1\">{children}</SelectPrimitive.Viewport>\n        <SelectScrollDownButton />\n      </SelectPrimitive.Content>\n    </SelectPrimitive.Portal>\n  );\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n  return (\n    <SelectPrimitive.Label\n      data-slot=\"select-label\"\n      className={cn('text-muted-foreground px-2 py-1.5 text-xs', className)}\n      {...props}\n    />\n  );\n}\n\nfunction SelectItem({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n  return (\n    <SelectPrimitive.Item\n      data-slot=\"select-item\"\n      className={cn(\n        'hover:bg-muted/50 focus:bg-muted data-[highlighted]:bg-muted/75 data-[state=checked]:bg-muted relative flex w-full items-center justify-between rounded-2xl px-2 py-1.5 text-sm outline-hidden select-none',\n        className,\n      )}\n      {...props}\n    >\n      <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n      <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n        <SelectPrimitive.ItemIndicator>\n          <CheckIcon className=\"text-primary size-4\" />\n        </SelectPrimitive.ItemIndicator>\n      </span>\n    </SelectPrimitive.Item>\n  );\n}\n\nfunction SelectSeparator({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n  return (\n    <SelectPrimitive.Separator\n      data-slot=\"select-separator\"\n      className={cn('bg-border pointer-events-none mx-1 my-1 h-px', className)}\n      {...props}\n    />\n  );\n}\n\nfunction SelectScrollUpButton({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n  return (\n    <SelectPrimitive.ScrollUpButton\n      data-slot=\"select-scroll-up-button\"\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\n      {...props}\n    >\n      <ChevronUpIcon className=\"size-4\" />\n    </SelectPrimitive.ScrollUpButton>\n  );\n}\n\nfunction SelectScrollDownButton({\n  className,\n  ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n  return (\n    <SelectPrimitive.ScrollDownButton\n      data-slot=\"select-scroll-down-button\"\n      className={cn('flex cursor-default items-center justify-center py-1', className)}\n      {...props}\n    >\n      <ChevronDownIcon className=\"size-4\" />\n    </SelectPrimitive.ScrollDownButton>\n  );\n}\n\nexport {\n  Select,\n  SelectGroup,\n  SelectValue,\n  SelectTrigger,\n  SelectContent,\n  SelectLabel,\n  SelectItem,\n  SelectSeparator,\n  SelectScrollUpButton,\n  SelectScrollDownButton,\n};\n",
      "type": "registry:component",
      "target": "components/ui/select.tsx"
    },
    {
      "path": "src/components/ui/separator.tsx",
      "content": "/**\n * Visual separator component.\n * @module separator\n * @internal\n */\n\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Separator({\n  className,\n  orientation = 'horizontal',\n  decorative = true,\n  ...props\n}: React.ComponentProps<'hr'> & { orientation?: 'horizontal' | 'vertical'; decorative?: boolean }) {\n  return (\n    <div\n      data-slot=\"separator\"\n      data-orientation={orientation}\n      role={decorative ? 'none' : 'separator'}\n      className={cn(\n        'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Separator };\n",
      "type": "registry:component",
      "target": "components/ui/separator.tsx"
    },
    {
      "path": "src/components/ui/spinner.tsx",
      "content": "/**\n * Loading spinner component.\n * @module spinner\n * @internal\n */\n\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst spinnerVariants = cva(\n  'inline-block h-8 w-8 animate-spin rounded-full border-2 border-transparent',\n  {\n    variants: {\n      variant: {\n        solid: '!border-t-current',\n        dots: 'animate-[spin_5s_linear_infinite] border-6 border-dotted border-current',\n        pulse: 'animate-pulse bg-current',\n      },\n      size: {\n        sm: 'size-4',\n        md: 'size-8',\n        lg: 'size-12',\n      },\n      colorScheme: {\n        primary: 'text-primary',\n        foreground: 'text-primary-foreground',\n        muted: 'text-muted-foreground',\n      },\n    },\n    defaultVariants: {\n      variant: 'solid',\n      size: 'md',\n      colorScheme: 'primary',\n    },\n  },\n);\n\nexport interface SpinnerProps\n  extends React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof spinnerVariants> {}\n\nexport function Spinner({ variant, size, colorScheme, className, ...props }: SpinnerProps) {\n  return (\n    <div className={cn(spinnerVariants({ variant, size, colorScheme }), className)} {...props}>\n      <span className=\"sr-only\">Loading...</span>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/ui/spinner.tsx"
    },
    {
      "path": "src/components/ui/switch.tsx",
      "content": "/**\n * Toggle switch using Radix primitives.\n * @module switch\n * @internal\n */\n\n'use client';\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n  return (\n    <SwitchPrimitive.Root\n      data-slot=\"switch\"\n      className={cn(\n        'theme-default:shadow-switch-resting data-[state=checked]:from-primary-foreground/0 data-[state=checked]:to-primary-foreground/25 from-primary-foreground/50 to-primary-foreground/0 [&]:bg-accent/50 hover:bg-accent/75 data-[state=checked]:hover:bg-primary theme-default:hover:shadow-switch-hover data-[state=checked]:bg-primary focus-visible:ring-ring focus-within:ring-ring relative h-7 w-[46px] rounded-full bg-gradient-to-l transition-all duration-150 ease-in-out focus-visible:ring-4 active:scale-95 disabled:cursor-not-allowed disabled:opacity-50',\n        className,\n      )}\n      {...props}\n    >\n      <SwitchPrimitive.Thumb\n        data-slot=\"switch-thumb\"\n        className={cn(\n          'dark:bg-primary dark:shadow-switch-thumb-dark data-[state=checked]:dark:bg-background [&]:bg-background to-background/0 from-primary/5 shadow-switch-thumb data-[state=checked]:bg-background pointer-events-none absolute top-[4px] left-[4px] h-5 w-5 rounded-full bg-gradient-to-t transition-transform duration-150 ease-in-out data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0',\n        )}\n      />\n    </SwitchPrimitive.Root>\n  );\n}\n\nexport { Switch };\n",
      "type": "registry:component",
      "target": "components/ui/switch.tsx"
    },
    {
      "path": "src/components/ui/table.tsx",
      "content": "/**\n * Table component with sorting support.\n * @module table\n * @internal\n */\n\nimport { ChevronDownIcon, ChevronUpIcon } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@/lib/utils';\n\ninterface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n  className?: string;\n}\n\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(({ className, ...props }, ref) => (\n  <div className=\"shadow-bevel-sm w-full overflow-clip rounded-2xl\">\n    <div className=\"overflow-x-auto\">\n      <table ref={ref} className={cn('w-full border-collapse table-fixed', className)} {...props} />\n    </div>\n  </div>\n));\nTable.displayName = 'Table';\n\nconst TableHeader = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <thead ref={ref} className={cn('bg-muted text-primary text-sm', className)} {...props} />\n));\nTableHeader.displayName = 'TableHeader';\n\nconst TableBody = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n));\nTableBody.displayName = 'TableBody';\n\ninterface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n  disableHover?: boolean;\n}\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n  ({ className, disableHover, ...props }, ref) => (\n    <tr\n      ref={ref}\n      className={cn(\n        !disableHover && 'hover:bg-muted/50',\n        'border-border/50 border-b text-sm transition-colors',\n        className,\n      )}\n      {...props}\n    />\n  ),\n);\nTableRow.displayName = 'TableRow';\n\ninterface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n  isSortable?: boolean;\n  sortDirection?: 'asc' | 'desc' | false;\n}\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n  ({ className, children, isSortable, sortDirection, ...props }, ref) => {\n    const showSortIcon = isSortable !== undefined && sortDirection !== undefined;\n\n    return (\n      <th\n        ref={ref}\n        className={cn(\n          'hover:bg-accent/10 border-border/50 border-b px-4 py-2 text-left',\n          isSortable && 'group cursor-pointer select-none',\n          className,\n        )}\n        {...props}\n      >\n        <div className=\"flex items-center gap-1\">\n          {children}\n          {showSortIcon && (\n            <div className=\"ml-2 flex items-center\">\n              {sortDirection === false && (\n                <ChevronDownIcon className=\"text-muted-foreground h-4 w-4 opacity-0 transition-opacity duration-200 group-hover:opacity-100\" />\n              )}\n              {sortDirection === 'asc' && <ChevronUpIcon className=\"h-4 w-4\" />}\n              {sortDirection === 'desc' && <ChevronDownIcon className=\"h-4 w-4\" />}\n            </div>\n          )}\n        </div>\n      </th>\n    );\n  },\n);\nTableHead.displayName = 'TableHead';\n\ninterface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n  className?: string;\n}\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n  ({ className, ...props }, ref) => (\n    <td ref={ref} className={cn('px-4 py-2', className)} {...props} />\n  ),\n);\nTableCell.displayName = 'TableCell';\n\nexport interface TableColumn<T> {\n  header: string;\n  accessor: keyof T;\n  sortable?: boolean;\n}\n\nexport { Table, TableHeader, TableBody, TableRow, TableHead, TableCell };\n",
      "type": "registry:component",
      "target": "components/ui/table.tsx"
    },
    {
      "path": "src/components/ui/tabs.tsx",
      "content": "/**\n * Tabs component using Radix primitives.\n * @module tabs\n * @internal\n */\n\n'use client';\n\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Tabs({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {\n  return (\n    <TabsPrimitive.Root\n      data-slot=\"tabs\"\n      className={cn('flex flex-col gap-2', className)}\n      {...props}\n    />\n  );\n}\n\nfunction TabsList({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.List>) {\n  return (\n    <TabsPrimitive.List\n      data-slot=\"tabs-list\"\n      className={cn(\n        'bg-muted shadow-switch-resting text-muted-foreground inline-flex h-9 w-fit items-center justify-center gap-0.5 rounded-2xl p-0.5',\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n  return (\n    <TabsPrimitive.Trigger\n      data-slot=\"tabs-trigger\"\n      className={cn(\n        \"data-[state=active]:bg-background hover:bg-accent/25 dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:bg-input text-foreground dark:text-muted-foreground data-[state=active]:shadow-bevel-sm inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-xl px-4 py-0.5 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 active:scale-[0.99] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n  return (\n    <TabsPrimitive.Content\n      data-slot=\"tabs-content\"\n      className={cn('flex-1 outline-none', className)}\n      {...props}\n    />\n  );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n",
      "type": "registry:component",
      "target": "components/ui/tabs.tsx"
    },
    {
      "path": "src/components/ui/text-field.tsx",
      "content": "/**\n * Text input field with variants.\n * @module text-field\n * @internal\n */\n\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst textFieldVariants = cva(\n  \"bg-input aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive relative box-border inline-flex w-full shrink-0 cursor-text items-center justify-center gap-2 overflow-hidden rounded-2xl text-sm transition-[color,box-shadow] duration-150 ease-in-out outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      variant: {\n        default:\n          'border-border/50 text-input-foreground shadow-input-resting hover:shadow-input-hover hover:border-primary/25 focus-within:border-border focus-within:ring-primary/15 focus-within:ring-4',\n        error:\n          'border-destructive-border/50 text-destructive-foreground shadow-input-destructive-resting hover:shadow-input-destructive-hover hover:border-destructive-border/25 focus-within:ring-destructive-border/15 focus-within:ring-4',\n      },\n      size: {\n        default: 'h-10',\n        sm: 'h-9',\n        lg: 'h-11',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  },\n);\n\nexport interface TextFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n  error?: boolean;\n  helperText?: string;\n  size?: VariantProps<typeof textFieldVariants>['size'];\n  variant?: VariantProps<typeof textFieldVariants>['variant'];\n  startAdornment?: React.ReactNode;\n  endAdornment?: React.ReactNode;\n}\n\nconst TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(\n  (\n    { className, variant, size, error, helperText, startAdornment, endAdornment, ...props },\n    ref,\n  ) => {\n    const isDisabled = props.disabled;\n\n    const WrapperComponent = props.id ? 'div' : 'label';\n\n    return (\n      <div className=\"flex w-full flex-col\">\n        <WrapperComponent\n          className={cn(\n            textFieldVariants({ variant: error ? 'error' : variant, size }),\n            'group items-center gap-0.5',\n            isDisabled &&\n              'bg-input-muted text-input-muted-foreground cursor-not-allowed opacity-50',\n            isDisabled && variant === 'default' && 'bg-input-muted',\n            startAdornment && 'pl-[5px]',\n            endAdornment && 'pr-[5px]',\n            className,\n          )}\n        >\n          {startAdornment && (\n            <div className=\"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\">\n              {startAdornment}\n            </div>\n          )}\n          <input\n            className={cn(\n              'w-full flex-1 bg-transparent px-3 py-2 outline-none file:border-0 file:bg-transparent file:text-sm file:font-medium',\n              isDisabled &&\n                'bg-input-muted text-input-muted-foreground cursor-not-allowed opacity-50',\n              startAdornment && 'pl-0',\n              endAdornment && 'pr-0',\n              size === 'default' && 'h-10',\n              size === 'sm' && 'h-9',\n              size === 'lg' && 'h-11',\n            )}\n            ref={ref}\n            {...props}\n          />\n          {endAdornment && (\n            <div className=\"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\">\n              {endAdornment}\n            </div>\n          )}\n        </WrapperComponent>\n        {helperText && (\n          <p\n            className={cn(\n              'mt-1.5 px-2 text-xs',\n              error ? 'text-destructive-foreground' : 'text-muted-foreground',\n            )}\n          >\n            {helperText}\n          </p>\n        )}\n      </div>\n    );\n  },\n);\n\nTextField.displayName = 'TextField';\n\nexport { TextField, textFieldVariants };\n",
      "type": "registry:component",
      "target": "components/ui/text-field.tsx"
    },
    {
      "path": "src/components/ui/toggle.tsx",
      "content": "/**\n * Toggle button component.\n * @module toggle\n * @internal\n */\n\nimport { cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst toggleVariants = cva(\n  \"hover:bg-muted hover:text-muted-foreground data-[state=on]:bg-accent data-[state=on]:text-accent-foreground focus-visible:border-ring aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive theme-default:shadow-bevel-sm focus-visible:ring-ring inline-flex items-center justify-center gap-2 rounded-xl text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none focus-visible:ring-3 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      variant: {\n        default:\n          'hover:bg-muted data-[state=on]:bg-muted data-[state=on]:text-primary bg-transparent',\n        outline:\n          'data-[state=on]:bg-muted data-[state=on]:text-primary-foreground hover:bg-accent hover:text-accent-foreground shadow-input-resting bg-transparent',\n      },\n      size: {\n        default: 'h-9 min-w-9 px-2',\n        sm: 'h-8 min-w-8 px-1.5',\n        lg: 'h-10 min-w-10 px-2.5',\n      },\n    },\n    defaultVariants: {\n      variant: 'default',\n      size: 'default',\n    },\n  },\n);\n\nexport interface ToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  pressed?: boolean;\n  onPressedChange?: (pressed: boolean) => void;\n  variant?: 'default' | 'outline';\n  size?: 'sm' | 'default' | 'lg';\n}\n\nfunction ToggleRoot({\n  className,\n  children,\n  pressed,\n  onPressedChange,\n  variant = 'default',\n  size = 'default',\n  ...props\n}: ToggleProps) {\n  return (\n    <button\n      type=\"button\"\n      aria-pressed={pressed}\n      data-state={pressed ? 'on' : 'off'}\n      data-variant={variant}\n      onClick={() => onPressedChange?.(!pressed)}\n      className={cn(toggleVariants({ variant, size }), className)}\n      {...props}\n    >\n      {children}\n    </button>\n  );\n}\n\nfunction Toggle(props: ToggleProps) {\n  return <ToggleRoot {...props} />;\n}\n\nexport { Toggle };\n",
      "type": "registry:component",
      "target": "components/ui/toggle.tsx"
    },
    {
      "path": "src/components/ui/tooltip.tsx",
      "content": "/**\n * Tooltip using Radix primitives.\n * @module tooltip\n * @internal\n */\n\n'use client';\n\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport { usePortalContainer } from '@/providers/portal-context';\n\nconst tooltipVariants = cva(\n  'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 shadow-bevel-lg z-50 w-fit rounded-xl px-2 py-1 text-sm text-balance',\n  {\n    variants: {\n      position: {\n        top: 'origin-bottom',\n        bottom: 'origin-top',\n        left: 'origin-left',\n        right: 'origin-right',\n      },\n    },\n    defaultVariants: {\n      position: 'top',\n    },\n  },\n);\n\nfunction Tooltip({ children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n  return (\n    <TooltipPrimitive.Provider>\n      <TooltipPrimitive.Root {...props}>{children}</TooltipPrimitive.Root>\n    </TooltipPrimitive.Provider>\n  );\n}\n\nfunction TooltipTrigger({\n  asChild = true,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n  return <TooltipPrimitive.Trigger asChild={asChild} {...props} />;\n}\n\ninterface TooltipContentProps\n  extends React.ComponentProps<typeof TooltipPrimitive.Content>,\n    VariantProps<typeof tooltipVariants> {}\n\nconst TooltipContent = React.forwardRef<\n  React.ElementRef<typeof TooltipPrimitive.Content>,\n  TooltipContentProps\n>(({ className, side = 'top', position, sideOffset = 8, children, ...props }, ref) => {\n  const portalContainer = usePortalContainer();\n  return (\n    <TooltipPrimitive.Portal container={portalContainer}>\n      <TooltipPrimitive.Content\n        ref={ref}\n        side={side}\n        sideOffset={sideOffset}\n        className={cn(tooltipVariants({ position: position || side }), className)}\n        {...props}\n      >\n        {children}\n        <TooltipPrimitive.Arrow className=\"fill-popover\" />\n      </TooltipPrimitive.Content>\n    </TooltipPrimitive.Portal>\n  );\n});\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipTrigger, TooltipContent, tooltipVariants };\n",
      "type": "registry:component",
      "target": "components/ui/tooltip.tsx"
    },
    {
      "path": "src/hooks/my-organization/use-config.ts",
      "content": "/**\n * Organization configuration hook.\n * @module use-config\n */\n\nimport {\n  AVAILABLE_STRATEGY_LIST,\n  hasApiErrorBody,\n  type IdpStrategy,\n} from '@auth0/universal-components-core';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport type { UseConfigResult } from '@/types/my-organization/config/config-types';\n\nconst configQueryKeys = {\n  all: ['config'] as const,\n  details: () => [...configQueryKeys.all, 'details'] as const,\n};\n\n/**\n * Hook for fetching organization configuration.\n * @returns Config data and allowed strategies.\n */\nexport function useConfig(): UseConfigResult {\n  const { coreClient } = useCoreClient();\n  const queryClient = useQueryClient();\n\n  const configQuery = useQuery({\n    queryKey: configQueryKeys.details(),\n    queryFn: () => coreClient!.getMyOrganizationApiClient().organization.configuration.get(),\n    enabled: !!coreClient,\n    retry: (failureCount, error) => {\n      if (hasApiErrorBody(error) && error.body?.status === 404) {\n        return false;\n      }\n      return failureCount < 3;\n    },\n  });\n\n  const config = configQuery.data;\n  const allowedStrategies = config?.allowed_strategies;\n\n  const filteredStrategies: IdpStrategy[] = allowedStrategies\n    ? AVAILABLE_STRATEGY_LIST.filter((s) => allowedStrategies.includes(s))\n    : AVAILABLE_STRATEGY_LIST;\n\n  const shouldAllowDeletion =\n    config?.connection_deletion_behavior === 'allow' ||\n    config?.connection_deletion_behavior === 'allow_if_empty';\n\n  const isConfigValid = !!allowedStrategies?.length;\n\n  return {\n    config: config ?? null,\n    isLoadingConfig: configQuery.isLoading,\n    fetchConfig: async () => await queryClient.getQueryData(configQueryKeys.details()),\n    filteredStrategies,\n    shouldAllowDeletion,\n    isConfigValid,\n  };\n}\n",
      "type": "registry:component",
      "target": "hooks/my-organization/use-config.ts"
    },
    {
      "path": "src/hooks/my-organization/use-idp-config.ts",
      "content": "/**\n * Identity provider configuration hook.\n * @module use-idp-config\n */\n\nimport {\n  hasApiErrorBody,\n  type GetIdpConfigurationResponseContent,\n  type IdentityProvidersConfigStrategyBase,\n  type IdpStrategy,\n} from '@auth0/universal-components-core';\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport type { UseConfigIdpResult } from '@/types/my-organization/config/config-idp-types';\n\nexport const idpConfigQueryKeys = {\n  all: ['idp-config'] as const,\n  config: () => [...idpConfigQueryKeys.all, 'config'] as const,\n};\n\n/**\n * Mapping from IdpStrategy values to the SDK's strategy config keys.\n */\nconst STRATEGY_TO_CONFIG_KEY: Record<\n  IdpStrategy,\n  keyof NonNullable<GetIdpConfigurationResponseContent['strategies']>\n> = {\n  adfs: 'adfs',\n  'google-apps': 'googleapps',\n  oidc: 'oidc',\n  okta: 'okta',\n  pingfederate: 'pingfederate',\n  samlp: 'samlp',\n  waad: 'waad',\n};\n\n/**\n * Hook for fetching IDP configuration and provisioning settings.\n * @returns IDP config and provisioning utilities.\n */\nexport function useIdpConfig(): UseConfigIdpResult {\n  const { coreClient } = useCoreClient();\n  const queryClient = useQueryClient();\n\n  const idpConfigQuery = useQuery<GetIdpConfigurationResponseContent | null>({\n    queryKey: idpConfigQueryKeys.config(),\n    queryFn: async () => {\n      try {\n        const response = await coreClient!\n          .getMyOrganizationApiClient()\n          .organization.configuration.identityProviders.get();\n        return response;\n      } catch (error) {\n        if (hasApiErrorBody(error) && error.body?.status === 404) {\n          return null;\n        }\n        throw error;\n      }\n    },\n    enabled: !!coreClient,\n    retry: (failureCount, error) => {\n      if (hasApiErrorBody(error) && error.body?.status === 404) return false;\n      return failureCount < 3;\n    },\n  });\n\n  const idpConfig = idpConfigQuery.data ?? null;\n  const strategies = idpConfig?.strategies;\n\n  const getStrategyFor = (\n    strategy: IdpStrategy | undefined,\n  ): IdentityProvidersConfigStrategyBase | undefined => {\n    if (!strategy || !strategies) return undefined;\n    const key = STRATEGY_TO_CONFIG_KEY[strategy];\n    return strategies[key];\n  };\n\n  const isProvisioningEnabled = (strategy: IdpStrategy | undefined): boolean =>\n    getStrategyFor(strategy)?.enabled_features.includes('provisioning') ?? false;\n\n  const isProvisioningMethodEnabled = (strategy: IdpStrategy | undefined): boolean =>\n    getStrategyFor(strategy)?.provisioning_methods.includes('scim') ?? false;\n\n  return {\n    idpConfig,\n    isIdpConfigValid: !!strategies && Object.keys(strategies).length > 0,\n    isLoadingIdpConfig: idpConfigQuery.isLoading,\n    fetchIdpConfig: async () => await queryClient.getQueryData(idpConfigQueryKeys.config()),\n    isProvisioningEnabled,\n    isProvisioningMethodEnabled,\n  };\n}\n",
      "type": "registry:component",
      "target": "hooks/my-organization/use-idp-config.ts"
    },
    {
      "path": "src/hooks/my-organization/use-provider-form-mode.ts",
      "content": "/**\n * Provider form mode configuration hook.\n * @module use-provider-form-mode\n */\n\nimport { useMemo } from 'react';\n\nimport type { FormMode } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\n\n/**\n * Hook to determine form behavior based on create/edit mode.\n * @param mode - Form mode.\n * @returns Form mode configuration.\n */\nexport const useProviderFormMode = (mode: FormMode = 'create') => {\n  return useMemo(\n    () => ({\n      showCopyButtons: mode === 'edit',\n    }),\n    [mode],\n  );\n};\n",
      "type": "registry:component",
      "target": "hooks/my-organization/use-provider-form-mode.ts"
    },
    {
      "path": "src/hooks/my-organization/use-sso-domain-tab.ts",
      "content": "/**\n * SSO domain tab data and actions hook.\n * @module use-sso-domain-tab\n */\n\nimport type { CreateOrganizationDomainRequestContent } from '@auth0/universal-components-core';\nimport { BusinessError, type Domain, type IdpId } from '@auth0/universal-components-core';\nimport { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';\nimport { useCallback, useState, useMemo, useEffect } from 'react';\n\nimport { showToast } from '@/components/auth0/shared/toast';\nimport { ssoProviderEditQueryKeys } from '@/hooks/my-organization/use-sso-provider-edit';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useErrorHandler } from '@/hooks/shared/use-error-handler';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type {\n  UseSsoDomainTabOptions,\n  UseSsoDomainTabReturn,\n} from '@/types/my-organization/idp-management/sso-domain/sso-domain-tab-types';\n\nconst domainQueryKeys = {\n  all: ['sso-domains'] as const,\n  lists: () => [...domainQueryKeys.all, 'list'] as const,\n  list: (idpId: IdpId) => [...domainQueryKeys.lists(), idpId] as const,\n};\n\n/**\n * Hook for SSO domain tab domain operations and state.\n * @param idpId - Identity provider ID.\n * @param options - Hook options.\n * @param options.customMessages - Custom translation messages.\n * @param options.domains - Initial domains data.\n * @param options.provider - SSO provider data.\n * @returns Hook state and methods\n */\nexport function useSsoDomainTab(\n  idpId: IdpId,\n  { customMessages = {}, domains, provider }: Partial<UseSsoDomainTabOptions> = {},\n): UseSsoDomainTabReturn {\n  const { coreClient } = useCoreClient();\n  const { t } = useTranslator('idp_management.notifications', customMessages);\n  const handleError = useErrorHandler();\n  const queryClient = useQueryClient();\n\n  const [selectedDomain, setSelectedDomain] = useState<Domain | null>(null);\n  const [showVerifyModal, setShowVerifyModal] = useState(false);\n  const [showDeleteModal, setShowDeleteModal] = useState(false);\n  const [verifyError, setVerifyError] = useState<string | undefined>(undefined);\n  const [showCreateModal, setShowCreateModal] = useState(false);\n  const [isUpdating, setIsUpdating] = useState(false);\n  const [isUpdatingId, setIsUpdatingId] = useState<string | null>(null);\n\n  // Fetch domains list using TanStack Query\n  const domainsQuery = useQuery({\n    queryKey: domainQueryKeys.list(idpId),\n    queryFn: async () => {\n      const { response } = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.domains.list();\n      return response.organization_domains;\n    },\n    enabled: !!coreClient && !!idpId,\n  });\n\n  const domainsList = domainsQuery.data ?? [];\n  const isLoading = domainsQuery.isLoading;\n\n  // Handle errors from domains query\n  useEffect(() => {\n    if (domainsQuery.error) {\n      handleError(domainsQuery.error, {\n        fallbackMessage: t('general_error'),\n      });\n    }\n  }, [domainsQuery.error, handleError, t]);\n\n  // Derive idpDomains from the provider's domains field (provider is fetched by the parent hook)\n  const idpDomains = useMemo(() => {\n    const idpDomainNames = provider?.domains ?? [];\n    return domainsList\n      .filter((domain) => idpDomainNames.includes(domain.domain))\n      .map((domain) => domain.id);\n  }, [provider?.domains, domainsList]);\n\n  // Mutations\n  const createDomainMutation = useMutation({\n    mutationFn: async (data: CreateOrganizationDomainRequestContent) => {\n      if (domains?.createAction?.onBefore) {\n        const canProceed = domains.createAction.onBefore(data as Domain);\n        if (!canProceed) {\n          throw new BusinessError({ message: t('domain_create.on_before') });\n        }\n      }\n\n      const result: Domain = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.domains.create(data);\n\n      domains?.createAction?.onAfter?.(result);\n\n      return result;\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: domainQueryKeys.list(idpId) });\n      queryClient.invalidateQueries({ queryKey: ssoProviderEditQueryKeys.detail(idpId) });\n    },\n  });\n\n  const verifyDomainMutation = useMutation({\n    mutationFn: async (domain: Domain) => {\n      if (domains?.verifyAction?.onBefore) {\n        const canProceed = domains.verifyAction.onBefore(domain);\n        if (!canProceed) {\n          throw new BusinessError({ message: t('domain_verify.on_before') });\n        }\n      }\n\n      const updatedDomain = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.domains.verify.create(domain.id);\n\n      if (domains?.verifyAction?.onAfter) {\n        await domains.verifyAction.onAfter(domain);\n      }\n\n      return { updatedDomain, isVerified: updatedDomain.status === 'verified' };\n    },\n    onSuccess: ({ updatedDomain, isVerified }, domain) => {\n      if (isVerified) {\n        queryClient.setQueryData<Domain[]>(domainQueryKeys.list(idpId), (oldDomains) => {\n          if (!oldDomains) return oldDomains;\n          return oldDomains.map((d) => (d.id === domain.id ? { ...d, ...updatedDomain } : d));\n        });\n      }\n    },\n  });\n\n  const deleteDomainMutation = useMutation({\n    mutationFn: async (domain: Domain) => {\n      if (!coreClient) {\n        return domain;\n      }\n\n      if (domains?.deleteAction?.onBefore) {\n        const canProceed = domains.deleteAction.onBefore(domain);\n        if (!canProceed) {\n          throw new BusinessError({ message: t('domain_delete.on_before') });\n        }\n      }\n\n      await coreClient.getMyOrganizationApiClient().organization.domains.delete(domain.id);\n\n      if (domains?.deleteAction?.onAfter) {\n        await domains.deleteAction.onAfter(domain);\n      }\n\n      return domain;\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: domainQueryKeys.list(idpId) });\n      queryClient.invalidateQueries({ queryKey: ssoProviderEditQueryKeys.detail(idpId) });\n    },\n  });\n\n  const associateToProviderMutation = useMutation({\n    mutationFn: async (domain: Domain) => {\n      if (domains?.associateToProviderAction?.onBefore) {\n        const canProceed = domains.associateToProviderAction.onBefore(domain, provider);\n        if (!canProceed) {\n          throw new BusinessError({ message: t('domain_associate_provider.on_before') });\n        }\n      }\n\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.domains.create(idpId, {\n          domain: domain.domain,\n        });\n\n      if (domains?.associateToProviderAction?.onAfter) {\n        await domains.associateToProviderAction.onAfter(domain, provider);\n      }\n\n      return domain;\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: ssoProviderEditQueryKeys.detail(idpId) });\n    },\n  });\n\n  const deleteFromProviderMutation = useMutation({\n    mutationFn: async (domain: Domain) => {\n      if (!provider) {\n        return domain;\n      }\n\n      if (domains?.deleteFromProviderAction?.onBefore) {\n        const canProceed = domains.deleteFromProviderAction.onBefore(domain, provider);\n        if (!canProceed) {\n          throw new BusinessError({ message: t('domain_delete_provider.on_before') });\n        }\n      }\n\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.domains.delete(provider.id!, domain.domain);\n\n      if (domains?.deleteFromProviderAction?.onAfter) {\n        await domains.deleteFromProviderAction.onAfter(domain);\n      }\n\n      return domain;\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries({ queryKey: ssoProviderEditQueryKeys.detail(idpId) });\n    },\n  });\n\n  const handleCreate = useCallback(\n    async (domainUrl: string) => {\n      try {\n        const newDomain = await createDomainMutation.mutateAsync({ domain: domainUrl });\n\n        showToast({\n          type: 'success',\n          message: t('domain_create.success', {\n            domainName: newDomain?.domain,\n          }),\n        });\n\n        setSelectedDomain(newDomain);\n        setShowCreateModal(false);\n        setShowVerifyModal(true);\n      } catch (error) {\n        handleError(error, {\n          fallbackMessage: t('domain_create.error'),\n        });\n      }\n    },\n    [handleError, createDomainMutation, t],\n  );\n\n  const handleCloseVerifyModal = useCallback(() => {\n    setShowVerifyModal(false);\n    setVerifyError(undefined);\n  }, []);\n\n  const handleVerify = useCallback(\n    async (domain: Domain) => {\n      try {\n        const { isVerified } = await verifyDomainMutation.mutateAsync(domain);\n        if (isVerified) {\n          setShowVerifyModal(false);\n\n          showToast({\n            type: 'success',\n            message: t('domain_verify.success', {\n              domainName: domain.domain,\n            }),\n          });\n\n          await associateToProviderMutation.mutateAsync(domain);\n        } else {\n          setVerifyError(t('domain_verify.verification_failed', { domainName: domain.domain }));\n        }\n      } catch (error) {\n        handleError(error, {\n          fallbackMessage: t('domain_verify.verification_failed'),\n        });\n      }\n    },\n    [verifyDomainMutation, t, handleError, associateToProviderMutation],\n  );\n\n  const handleDeleteClick = useCallback((domain: Domain) => {\n    setSelectedDomain(domain);\n    setShowVerifyModal(false);\n    setShowDeleteModal(true);\n  }, []);\n\n  const handleDelete = useCallback(\n    async (domain: Domain) => {\n      try {\n        await deleteDomainMutation.mutateAsync(domain);\n\n        showToast({\n          type: 'success',\n          message: t('domain_delete.success', {\n            domainName: domain.domain,\n          }),\n        });\n\n        setShowDeleteModal(false);\n        setShowVerifyModal(false);\n      } catch (error) {\n        handleError(error, {\n          fallbackMessage: t('domain_delete.error'),\n        });\n      }\n    },\n    [handleError, deleteDomainMutation, t],\n  );\n\n  const handleVerifyActionColumn = useCallback(\n    async (domain: Domain) => {\n      setIsUpdating(true);\n      setIsUpdatingId(domain.id);\n\n      try {\n        const { isVerified } = await verifyDomainMutation.mutateAsync(domain);\n        if (isVerified) {\n          showToast({\n            type: 'success',\n            message: t('domain_verify.success', {\n              domainName: domain.domain,\n            }),\n          });\n\n          await associateToProviderMutation.mutateAsync(domain);\n        } else {\n          showToast({\n            type: 'error',\n            message: t('domain_verify.verification_failed', {\n              domainName: domain.domain,\n            }),\n          });\n        }\n      } catch (error) {\n        handleError(error, {\n          fallbackMessage: t('domain_verify.verification_failed', { domainName: domain.domain }),\n        });\n      } finally {\n        setIsUpdating(false);\n        setIsUpdatingId(null);\n      }\n    },\n    [verifyDomainMutation, t, handleError, associateToProviderMutation],\n  );\n\n  const handleToggleSwitch = useCallback(\n    async (domain: Domain, newCheckedValue: boolean) => {\n      setIsUpdating(true);\n      setIsUpdatingId(domain.id);\n\n      if (newCheckedValue) {\n        try {\n          await associateToProviderMutation.mutateAsync(domain);\n\n          showToast({\n            type: 'success',\n            message: t('domain_associate_provider.success', {\n              domain: domain.domain,\n              idp: provider?.name,\n            }),\n          });\n        } catch (error) {\n          handleError(error, {\n            fallbackMessage: t('general_error'),\n          });\n        } finally {\n          setIsUpdating(false);\n          setIsUpdatingId(null);\n        }\n      } else {\n        try {\n          await deleteFromProviderMutation.mutateAsync(domain);\n\n          showToast({\n            type: 'success',\n            message: t('domain_delete_provider.success', {\n              domain: domain.domain,\n              idp: provider?.name,\n            }),\n          });\n        } catch (error) {\n          handleError(error, {\n            fallbackMessage: t('general_error'),\n          });\n        } finally {\n          setIsUpdating(false);\n          setIsUpdatingId(null);\n        }\n      }\n    },\n    [associateToProviderMutation, t, provider, handleError, deleteFromProviderMutation],\n  );\n\n  return {\n    isLoading,\n    domainsList,\n    isCreating: createDomainMutation.isPending,\n    selectedDomain,\n    showVerifyModal,\n    showDeleteModal,\n    isVerifying: verifyDomainMutation.isPending,\n    verifyError,\n    isDeleting: deleteDomainMutation.isPending,\n    showCreateModal,\n    handleCreate,\n    handleCloseVerifyModal,\n    handleVerify,\n    handleDeleteClick,\n    handleDelete,\n    setShowCreateModal,\n    setShowDeleteModal,\n    idpDomains,\n    handleVerifyActionColumn,\n    isUpdating,\n    isUpdatingId,\n    handleToggleSwitch,\n  };\n}\n",
      "type": "registry:component",
      "target": "hooks/my-organization/use-sso-domain-tab.ts"
    },
    {
      "path": "src/hooks/my-organization/use-sso-provider-edit-logic.ts",
      "content": "/**\n * SSO provider edit logic hook.\n * @module use-sso-provider-edit-logic\n * @internal\n */\n\nimport { useCallback } from 'react';\n\nimport { useConfig } from '@/hooks/my-organization/use-config';\nimport { useIdpConfig } from '@/hooks/my-organization/use-idp-config';\nimport type {\n  UseSsoProviderEditLogicResult,\n  UseSsoProviderEditReturn,\n} from '@/types/my-organization/idp-management/sso-provider/sso-provider-edit-types';\n\n/**\n * Hook for SSO provider edit logic (e.g., handleToggleProvider).\n * @param ssoProviderEdit - SSO Provider Edit Prop\n * @internal\n * @returns Hook state and methods\n */\nexport function useSsoProviderEditLogic(\n  ssoProviderEdit: UseSsoProviderEditReturn,\n): UseSsoProviderEditLogicResult {\n  const { shouldAllowDeletion, isLoadingConfig } = useConfig();\n  const { idpConfig, isLoadingIdpConfig, isProvisioningEnabled, isProvisioningMethodEnabled } =\n    useIdpConfig();\n\n  const showProvisioningTab =\n    isProvisioningEnabled(ssoProviderEdit.provider?.strategy) &&\n    isProvisioningMethodEnabled(ssoProviderEdit.provider?.strategy);\n\n  const handleToggleProvider = useCallback(\n    async (enabled: boolean) => {\n      if (!ssoProviderEdit.provider?.strategy) return;\n      await ssoProviderEdit.updateProvider({\n        strategy: ssoProviderEdit.provider.strategy,\n        is_enabled: enabled,\n      });\n    },\n    [ssoProviderEdit.provider?.strategy, ssoProviderEdit.updateProvider],\n  );\n\n  return {\n    shouldAllowDeletion,\n    isLoadingConfig,\n    idpConfig,\n    isLoadingIdpConfig,\n    showProvisioningTab,\n    handleToggleProvider,\n  };\n}\n",
      "type": "registry:component",
      "target": "hooks/my-organization/use-sso-provider-edit-logic.ts"
    },
    {
      "path": "src/hooks/my-organization/use-sso-provider-edit.ts",
      "content": "/**\n * SSO provider edit hook.\n * @module use-sso-provider-edit\n */\n\nimport {\n  OrganizationDetailsFactory,\n  OrganizationDetailsMappers,\n  SsoProviderMappers,\n  type IdpKnownResponse,\n  type IdpId,\n  type OrganizationPrivate,\n  type UpdateIdentityProviderRequestContent,\n  type CreateIdpProvisioningScimTokenRequestContent,\n  type GetIdPProvisioningConfigResponseContent,\n  getStatusCode,\n} from '@auth0/universal-components-core';\nimport { ssoProviderQueryKeys } from '@auth0/universal-components-core';\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport { showToast } from '@/components/auth0/shared/toast';\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\nimport { useErrorHandler } from '@/hooks/shared/use-error-handler';\nimport { useTranslator } from '@/hooks/shared/use-translator';\nimport type {\n  UseSsoProviderEditOptions,\n  UseSsoProviderEditReturn,\n} from '@/types/my-organization/idp-management/sso-provider/sso-provider-edit-types';\n\nconst ACTION_CANCELLED_ERROR = 'ACTION_CANCELLED';\n\nconst isActionCancelledError = (error: unknown): boolean => {\n  return error instanceof Error && error.message === ACTION_CANCELLED_ERROR;\n};\n\nexport const ssoProviderEditQueryKeys = {\n  all: ['sso-providers'] as const,\n  list: () => [...ssoProviderEditQueryKeys.all, 'list'] as const,\n  detail: (idpId: IdpId) => [...ssoProviderEditQueryKeys.all, 'detail', idpId] as const,\n  organization: () => ['organization', 'details'] as const,\n  provisioning: (idpId: IdpId) => [...ssoProviderEditQueryKeys.all, 'provisioning', idpId] as const,\n  scimTokens: (idpId: IdpId) => [...ssoProviderEditQueryKeys.all, 'scim-tokens', idpId] as const,\n};\n\n/**\n * Hook for editing SSO provider settings and provisioning.\n * @param idpId - Identity provider ID.\n * @param options - Hook options.\n * @param options.sso - SSO action callbacks.\n * @param options.provisioning - Provisioning action callbacks.\n * @param options.customMessages - Custom translation messages.\n * @returns Hook state and methods\n */\nexport function useSsoProviderEdit(\n  idpId: IdpId,\n  { sso, provisioning, customMessages = {} }: Partial<UseSsoProviderEditOptions> = {},\n): UseSsoProviderEditReturn {\n  const { coreClient } = useCoreClient();\n  const { t } = useTranslator('idp_management.notifications', customMessages);\n  const queryClient = useQueryClient();\n  const handleError = useErrorHandler();\n  const hasShownProviderError = useRef(false);\n  const hasShownProvisioningError = useRef(false);\n  const hasShownOrganizationError = useRef(false);\n\n  /**\n   * Provider query - fetches the identity provider details.\n   * TanStack Query handles caching, loading states, and refetching.\n   */\n  const providerQuery = useQuery({\n    queryKey: ssoProviderEditQueryKeys.detail(idpId),\n    queryFn: async (): Promise<IdpKnownResponse> => {\n      const response = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.get(idpId);\n      return response;\n    },\n    enabled: !!coreClient && !!idpId,\n  });\n\n  /**\n   * Organization query - fetches organization details.\n   * Shared across the application, so it uses a common query key.\n   */\n  const organizationQuery = useQuery({\n    queryKey: ssoProviderEditQueryKeys.organization(),\n    queryFn: async (): Promise<OrganizationPrivate> => {\n      const response = await coreClient!.getMyOrganizationApiClient().organizationDetails.get();\n      return OrganizationDetailsMappers.fromAPI(response);\n    },\n    enabled: !!coreClient,\n    initialData: OrganizationDetailsFactory.create(),\n  });\n\n  /**\n   * Provisioning config query - fetches provisioning configuration.\n   * Returns null if provisioning is not configured (404).\n   */\n  const provisioningQuery = useQuery({\n    queryKey: ssoProviderEditQueryKeys.provisioning(idpId),\n    queryFn: async (): Promise<GetIdPProvisioningConfigResponseContent | null> => {\n      try {\n        const result = await coreClient!\n          .getMyOrganizationApiClient()\n          .organization.identityProviders.provisioning.get(idpId);\n        return result;\n      } catch (error) {\n        const status = getStatusCode(error);\n        if (status === 404) {\n          return null;\n        }\n        throw error;\n      }\n    },\n    enabled: !!coreClient && !!idpId,\n  });\n\n  useEffect(() => {\n    if (providerQuery.isError && !hasShownProviderError.current) {\n      handleError(providerQuery.error, { fallbackMessage: t('general_error') });\n      hasShownProviderError.current = true;\n    }\n\n    if (!providerQuery.isError) {\n      hasShownProviderError.current = false;\n    }\n  }, [providerQuery.isError, providerQuery.error, t, handleError]);\n\n  useEffect(() => {\n    if (organizationQuery.isError && !hasShownOrganizationError.current) {\n      handleError(organizationQuery.error, { fallbackMessage: t('general_error') });\n      hasShownOrganizationError.current = true;\n    }\n\n    if (!organizationQuery.isError) {\n      hasShownOrganizationError.current = false;\n    }\n  }, [organizationQuery.error, organizationQuery.isError, t, handleError]);\n\n  useEffect(() => {\n    if (provisioningQuery.isError && !hasShownProvisioningError.current) {\n      handleError(provisioningQuery.error, { fallbackMessage: t('general_error') });\n      hasShownProvisioningError.current = true;\n    }\n\n    if (!provisioningQuery.isError) {\n      hasShownProvisioningError.current = false;\n    }\n  }, [provisioningQuery.isError, provisioningQuery.error, t, handleError]);\n\n  /**\n   * Update provider mutation - updates SSO provider configuration.\n   */\n  const updateProviderMutation = useMutation({\n    mutationFn: async (data: UpdateIdentityProviderRequestContent): Promise<IdpKnownResponse> => {\n      const provider = providerQuery.data;\n      if (!provider) {\n        throw new Error('Provider not loaded');\n      }\n\n      if (sso?.updateAction?.onBefore) {\n        const canProceed = sso.updateAction.onBefore(provider);\n        if (!canProceed) {\n          throw new Error(ACTION_CANCELLED_ERROR);\n        }\n      }\n\n      const apiRequestData: UpdateIdentityProviderRequestContent = SsoProviderMappers.updateToAPI({\n        strategy: provider.strategy,\n        ...data,\n      });\n\n      const result = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.update(idpId, apiRequestData);\n\n      return result;\n    },\n    onSuccess: async (result, _variables) => {\n      const provider = providerQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('update_success', { providerName: provider?.display_name }),\n      });\n\n      // Update detail cache immediately with API response, invalidate list to refetch\n      queryClient.setQueryData(ssoProviderEditQueryKeys.detail(idpId), result);\n      await queryClient.invalidateQueries({\n        queryKey: ssoProviderQueryKeys.list(),\n      });\n\n      if (sso?.updateAction?.onAfter && provider) {\n        await sso.updateAction.onAfter(provider, result);\n      }\n    },\n    onError: (error) => {\n      if (isActionCancelledError(error)) {\n        return;\n      }\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  /**\n   * Create provisioning mutation - enables provisioning for the provider.\n   */\n  const createProvisioningMutation = useMutation({\n    mutationFn: async (): Promise<GetIdPProvisioningConfigResponseContent> => {\n      const provider = providerQuery.data;\n      if (!provider) {\n        throw new Error('Provider not loaded');\n      }\n\n      if (provisioning?.createAction?.onBefore) {\n        const canProceed = provisioning.createAction.onBefore(provider);\n        if (!canProceed) {\n          throw new Error(ACTION_CANCELLED_ERROR);\n        }\n      }\n\n      const result = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.provisioning.create(idpId);\n\n      return result;\n    },\n    onSuccess: async (result) => {\n      const provider = providerQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('update_success', { providerName: provider?.display_name }),\n      });\n\n      // Invalidate queries to refetch fresh data\n      await queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.detail(idpId),\n      });\n      queryClient.setQueryData(ssoProviderEditQueryKeys.provisioning(idpId), result);\n\n      if (provisioning?.createAction?.onAfter && provider) {\n        await provisioning.createAction.onAfter(provider, result);\n      }\n    },\n    onError: (error) => {\n      if (isActionCancelledError(error)) {\n        return;\n      }\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  /**\n   * Delete provisioning mutation - disables provisioning for the provider.\n   */\n  const deleteProvisioningMutation = useMutation({\n    mutationFn: async (): Promise<void> => {\n      const provider = providerQuery.data;\n      if (!provider) {\n        throw new Error('Provider not loaded');\n      }\n\n      if (provisioning?.deleteAction?.onBefore) {\n        const canProceed = provisioning.deleteAction.onBefore(provider);\n        if (!canProceed) {\n          throw new Error(ACTION_CANCELLED_ERROR);\n        }\n      }\n\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.provisioning.delete(idpId);\n    },\n    onSuccess: async () => {\n      const provider = providerQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('update_success', { providerName: provider?.display_name }),\n      });\n\n      // Update cache to reflect deleted provisioning\n      queryClient.setQueryData(ssoProviderEditQueryKeys.provisioning(idpId), null);\n      await queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.detail(idpId),\n      });\n\n      if (provisioning?.deleteAction?.onAfter && provider) {\n        await provisioning.deleteAction.onAfter(provider);\n      }\n    },\n    onError: (error) => {\n      if (isActionCancelledError(error)) {\n        return;\n      }\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  /**\n   * Create SCIM token mutation - generates a new SCIM token for provisioning.\n   */\n  const createScimTokenMutation = useMutation({\n    mutationFn: async (data: CreateIdpProvisioningScimTokenRequestContent) => {\n      const provider = providerQuery.data;\n      if (!provider) {\n        throw new Error('Provider not loaded');\n      }\n\n      if (provisioning?.createScimTokenAction?.onBefore) {\n        const canProceed = provisioning.createScimTokenAction.onBefore(provider);\n        if (!canProceed) {\n          throw new Error(ACTION_CANCELLED_ERROR);\n        }\n      }\n\n      const result = await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.provisioning.scimTokens.create(idpId, data);\n\n      return result;\n    },\n    onSuccess: async (result) => {\n      const provider = providerQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('scim_token_create_success'),\n      });\n\n      // Invalidate SCIM tokens list to refetch\n      await queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.scimTokens(idpId),\n      });\n\n      if (provisioning?.createScimTokenAction?.onAfter && provider) {\n        await provisioning.createScimTokenAction.onAfter(provider, result);\n      }\n    },\n    onError: (error) => {\n      if (isActionCancelledError(error)) {\n        return;\n      }\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  /**\n   * Delete SCIM token mutation - removes a SCIM token.\n   */\n  const deleteScimTokenMutation = useMutation({\n    mutationFn: async (idpScimTokenId: string): Promise<void> => {\n      const provider = providerQuery.data;\n      if (!provider) {\n        throw new Error('Provider not loaded');\n      }\n\n      if (provisioning?.deleteScimTokenAction?.onBefore) {\n        const canProceed = provisioning.deleteScimTokenAction.onBefore(provider);\n        if (!canProceed) {\n          throw new Error(ACTION_CANCELLED_ERROR);\n        }\n      }\n\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.provisioning.scimTokens.delete(idpId, idpScimTokenId);\n    },\n    onSuccess: async () => {\n      const provider = providerQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('scim_token_delete_sucess'),\n      });\n\n      // Invalidate SCIM tokens list to refetch\n      await queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.scimTokens(idpId),\n      });\n\n      if (provisioning?.deleteScimTokenAction?.onAfter && provider) {\n        await provisioning.deleteScimTokenAction.onAfter(provider);\n      }\n    },\n    onError: (error) => {\n      if (isActionCancelledError(error)) {\n        return;\n      }\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  /**\n   * Delete provider mutation - completely deletes the provider.\n   */\n  const deleteProviderMutation = useMutation({\n    mutationFn: async (): Promise<void> => {\n      const provider = providerQuery.data;\n      if (!provider?.id) {\n        throw new Error('Provider not loaded or missing ID');\n      }\n\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.delete(provider.id);\n    },\n    onSuccess: async () => {\n      const provider = providerQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('delete_success', { providerName: provider?.display_name }),\n      });\n\n      // Remove all related queries from cache\n      queryClient.removeQueries({\n        queryKey: ssoProviderEditQueryKeys.detail(idpId),\n      });\n      queryClient.removeQueries({\n        queryKey: ssoProviderEditQueryKeys.provisioning(idpId),\n      });\n      queryClient.removeQueries({\n        queryKey: ssoProviderEditQueryKeys.scimTokens(idpId),\n      });\n\n      // Invalidate all queries from cache\n      await queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.all,\n      });\n\n      if (sso?.deleteAction?.onAfter && provider) {\n        await sso.deleteAction.onAfter(provider);\n      }\n    },\n    onError: (error) => {\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  /**\n   * Detach provider mutation - removes provider from organization but doesn't delete it.\n   */\n  const detachProviderMutation = useMutation({\n    mutationFn: async (): Promise<void> => {\n      const provider = providerQuery.data;\n      if (!provider?.id) {\n        throw new Error('Provider not loaded or missing ID');\n      }\n\n      if (sso?.deleteFromOrganizationAction?.onBefore) {\n        const canProceed = sso.deleteFromOrganizationAction.onBefore(provider);\n        if (!canProceed) {\n          throw new Error(ACTION_CANCELLED_ERROR);\n        }\n      }\n\n      // Ensure organization data is fresh before detaching\n      await queryClient.ensureQueryData({\n        queryKey: ssoProviderEditQueryKeys.organization(),\n      });\n\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.detach(provider.id);\n    },\n    onSuccess: async () => {\n      const provider = providerQuery.data;\n      const organization = organizationQuery.data;\n\n      showToast({\n        type: 'success',\n        message: t('remove_success', {\n          providerName: provider?.display_name,\n          organizationName: organization?.display_name,\n        }),\n      });\n\n      // Remove provider from cache to invalidate details\n      queryClient.removeQueries({\n        queryKey: ssoProviderEditQueryKeys.detail(idpId),\n      });\n\n      // Remove provider from cache to invalidate list\n      await queryClient.invalidateQueries({ queryKey: ssoProviderEditQueryKeys.list() });\n\n      if (sso?.deleteFromOrganizationAction?.onAfter && provider) {\n        await sso.deleteFromOrganizationAction.onAfter(provider);\n      }\n    },\n    onError: (error) => {\n      if (isActionCancelledError(error)) {\n        return;\n      }\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  const fetchProvider = useCallback(async (): Promise<IdpKnownResponse | null> => {\n    if (!coreClient || !idpId) {\n      return null;\n    }\n\n    try {\n      const data = await queryClient.ensureQueryData({\n        queryKey: ssoProviderEditQueryKeys.detail(idpId),\n        queryFn: async () => {\n          const response = await coreClient\n            .getMyOrganizationApiClient()\n            .organization.identityProviders.get(idpId);\n          return response;\n        },\n      });\n      return data;\n    } catch (error) {\n      handleError(error, { fallbackMessage: t('general_error') });\n      return null;\n    }\n  }, [coreClient, idpId, queryClient, t, handleError]);\n\n  const fetchOrganizationDetails = useCallback(async (): Promise<void> => {\n    if (!coreClient) {\n      return;\n    }\n\n    await queryClient.getQueryData(ssoProviderEditQueryKeys.organization());\n  }, [coreClient, queryClient]);\n\n  const fetchProvisioning =\n    useCallback(async (): Promise<GetIdPProvisioningConfigResponseContent | null> => {\n      if (!coreClient || !idpId) {\n        return null;\n      }\n\n      try {\n        const data = await queryClient.fetchQuery({\n          queryKey: ssoProviderEditQueryKeys.provisioning(idpId),\n          queryFn: async () => {\n            try {\n              const result = await coreClient\n                .getMyOrganizationApiClient()\n                .organization.identityProviders.provisioning.get(idpId);\n              return result;\n            } catch (error) {\n              const status = getStatusCode(error);\n              if (status === 404) {\n                return null;\n              }\n              throw error;\n            }\n          },\n        });\n        return data;\n      } catch (error) {\n        const status = getStatusCode(error);\n        if (status !== 404) {\n          handleError(error, { fallbackMessage: t('general_error') });\n        }\n        return null;\n      }\n    }, [coreClient, idpId, queryClient, t, handleError]);\n\n  const updateProvider = useCallback(\n    async (data: UpdateIdentityProviderRequestContent): Promise<void> => {\n      const provider = providerQuery.data;\n      if (!coreClient || !idpId || !provider) {\n        return;\n      }\n\n      try {\n        await updateProviderMutation.mutateAsync(data);\n      } catch (error) {\n        if (!isActionCancelledError(error)) {\n          throw error;\n        }\n      }\n    },\n    [coreClient, idpId, providerQuery.data, updateProviderMutation],\n  );\n\n  const createProvisioning = useCallback(async (): Promise<void> => {\n    const provider = providerQuery.data;\n    if (!coreClient || !idpId || !provider) {\n      return;\n    }\n\n    try {\n      await createProvisioningMutation.mutateAsync();\n    } catch (error) {\n      if (!isActionCancelledError(error)) {\n        throw error;\n      }\n    }\n  }, [coreClient, createProvisioningMutation, idpId, providerQuery.data]);\n\n  const deleteProvisioning = useCallback(async (): Promise<void> => {\n    const provider = providerQuery.data;\n    if (!coreClient || !idpId || !provider) {\n      return;\n    }\n\n    try {\n      await deleteProvisioningMutation.mutateAsync();\n    } catch (error) {\n      if (!isActionCancelledError(error)) {\n        throw error;\n      }\n    }\n  }, [coreClient, deleteProvisioningMutation, idpId, providerQuery.data]);\n\n  /**\n   * List SCIM tokens mutation - fetches SCIM tokens for provisioning.\n   * Note: This uses imperative fetching rather than a query because tokens\n   * are typically fetched on-demand and the response includes sensitive data\n   * that shouldn't be automatically cached.\n   */\n  const listScimTokensMutation = useMutation({\n    mutationFn: async () => {\n      if (!coreClient || !idpId) {\n        return null;\n      }\n\n      const result = await coreClient\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.provisioning.scimTokens.list(idpId);\n      return result;\n    },\n    onError: (error) => {\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  const listScimTokens = useCallback(async () => {\n    try {\n      return await listScimTokensMutation.mutateAsync();\n    } catch (error) {\n      return null;\n    }\n  }, [listScimTokensMutation]);\n\n  const createScimToken = useCallback(\n    async (data: CreateIdpProvisioningScimTokenRequestContent) => {\n      const provider = providerQuery.data;\n      if (!coreClient || !idpId || !provider) {\n        return undefined;\n      }\n\n      try {\n        return await createScimTokenMutation.mutateAsync(data);\n      } catch (error) {\n        if (!isActionCancelledError(error)) {\n          throw error;\n        }\n        return undefined;\n      }\n    },\n    [coreClient, createScimTokenMutation, idpId, providerQuery.data],\n  );\n\n  const deleteScimToken = useCallback(\n    async (idpScimTokenId: string): Promise<void> => {\n      const provider = providerQuery.data;\n      if (!coreClient || !idpId || !provider) {\n        return;\n      }\n\n      try {\n        await deleteScimTokenMutation.mutateAsync(idpScimTokenId);\n      } catch (error) {\n        if (!isActionCancelledError(error)) {\n          throw error;\n        }\n      }\n    },\n    [coreClient, deleteScimTokenMutation, idpId, providerQuery.data],\n  );\n\n  const syncSsoAttributesMutation = useMutation({\n    mutationFn: async () => {\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.updateAttributes(idpId, {});\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.detail(idpId),\n      });\n      showToast({\n        type: 'success',\n        message: t('sso_attributes_sync_success'),\n      });\n    },\n    onError: (error) => {\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  const syncSsoAttributes = useCallback(async (): Promise<void> => {\n    if (!coreClient || !idpId) {\n      return;\n    }\n\n    await syncSsoAttributesMutation.mutateAsync();\n  }, [coreClient, idpId, syncSsoAttributesMutation]);\n\n  const syncProvisioningAttributesMutation = useMutation({\n    mutationFn: async () => {\n      await coreClient!\n        .getMyOrganizationApiClient()\n        .organization.identityProviders.provisioning.updateAttributes(idpId, {});\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: ssoProviderEditQueryKeys.provisioning(idpId),\n      });\n      showToast({\n        type: 'success',\n        message: t('provisioning_attributes_sync_success'),\n      });\n    },\n    onError: (error) => {\n      handleError(error, { fallbackMessage: t('general_error') });\n    },\n  });\n\n  const syncProvisioningAttributes = useCallback(async (): Promise<void> => {\n    if (!coreClient || !idpId) {\n      return;\n    }\n\n    await syncProvisioningAttributesMutation.mutateAsync();\n  }, [coreClient, idpId, syncProvisioningAttributesMutation]);\n\n  const onDeleteConfirm = useCallback(async (): Promise<void> => {\n    const provider = providerQuery.data;\n    if (!coreClient || !provider?.id) {\n      return;\n    }\n\n    try {\n      await deleteProviderMutation.mutateAsync();\n    } catch (error) {\n      if (!isActionCancelledError(error)) {\n        throw error;\n      }\n    }\n  }, [coreClient, deleteProviderMutation, providerQuery.data]);\n\n  const onRemoveConfirm = useCallback(async (): Promise<void> => {\n    const provider = providerQuery.data;\n    if (!coreClient || !provider?.id) {\n      return;\n    }\n\n    try {\n      await detachProviderMutation.mutateAsync();\n    } catch (error) {\n      if (!isActionCancelledError(error)) {\n        throw error;\n      }\n    }\n  }, [coreClient, detachProviderMutation, providerQuery.data]);\n\n  const hasSsoAttributeSyncWarning = useMemo(() => {\n    const provider = providerQuery.data;\n    const attributes = provider && 'attributes' in provider ? (provider.attributes ?? []) : [];\n    return attributes.some((attr) => attr.is_extra || attr.is_missing);\n  }, [providerQuery.data]);\n\n  const hasProvisioningAttributeSyncWarning = useMemo(() => {\n    const provisioningConfig = provisioningQuery.data;\n    const attributes = provisioningConfig?.attributes ?? [];\n    return attributes.some((attr) => attr.is_extra || attr.is_missing);\n  }, [provisioningQuery.data]);\n\n  return {\n    // Data from TanStack Query - single source of truth\n    provider: providerQuery.data ?? null,\n    organization: organizationQuery.data ?? OrganizationDetailsFactory.create(),\n    provisioningConfig: provisioningQuery.data ?? null,\n\n    // Loading states - all derived from TanStack Query\n    isLoading: providerQuery.isLoading || organizationQuery.isLoading,\n    isUpdating: updateProviderMutation.isPending,\n    isDeleting: deleteProviderMutation.isPending,\n    isRemoving: detachProviderMutation.isPending,\n    isProvisioningUpdating: createProvisioningMutation.isPending,\n    isProvisioningDeleting: deleteProvisioningMutation.isPending,\n    isProvisioningLoading: provisioningQuery.isLoading || provisioningQuery.isFetching,\n    isScimTokensLoading: listScimTokensMutation.isPending,\n    isScimTokenCreating: createScimTokenMutation.isPending,\n    isScimTokenDeleting: deleteScimTokenMutation.isPending,\n    isSsoAttributesSyncing: syncSsoAttributesMutation.isPending,\n    isProvisioningAttributesSyncing: syncProvisioningAttributesMutation.isPending,\n\n    // Warning states\n    hasSsoAttributeSyncWarning,\n    hasProvisioningAttributeSyncWarning,\n\n    // Actions\n    fetchProvider,\n    fetchOrganizationDetails,\n    fetchProvisioning,\n    updateProvider,\n    createProvisioning,\n    deleteProvisioning,\n    listScimTokens,\n    createScimToken,\n    deleteScimToken,\n    syncSsoAttributes,\n    syncProvisioningAttributes,\n    onDeleteConfirm,\n    onRemoveConfirm,\n  };\n}\n",
      "type": "registry:component",
      "target": "hooks/my-organization/use-sso-provider-edit.ts"
    },
    {
      "path": "src/hooks/shared/use-core-client-initialization.ts",
      "content": "/**\n * CoreClient initialization hook.\n * @module use-core-client-initialization\n * @internal\n */\n\nimport type {\n  CoreClientInterface,\n  AuthDetails,\n  I18nInitOptions,\n} from '@auth0/universal-components-core';\nimport { createCoreClient } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\ninterface UseCoreClientInitializationProps {\n  authDetails: AuthDetails;\n  i18nOptions?: I18nInitOptions;\n}\n\n/**\n * @internal\n * @param props - Initialization props.\n * @returns The initialized CoreClient instance, or null while initializing.\n */\nexport const useCoreClientInitialization = ({\n  authDetails,\n  i18nOptions,\n}: UseCoreClientInitializationProps): CoreClientInterface | null => {\n  const { authProxyUrl } = authDetails;\n  const [coreClient, setCoreClient] = React.useState<CoreClientInterface | null>(null);\n\n  React.useEffect(() => {\n    const initializeCoreClient = async () => {\n      try {\n        const initializedCoreClient = await createCoreClient(authDetails, i18nOptions);\n        setCoreClient(initializedCoreClient);\n      } catch (error) {\n        console.error(error);\n      }\n    };\n    initializeCoreClient();\n  }, [authProxyUrl, i18nOptions]);\n\n  return coreClient;\n};\n",
      "type": "registry:component",
      "target": "hooks/shared/use-core-client-initialization.ts"
    },
    {
      "path": "src/hooks/shared/use-core-client.ts",
      "content": "/**\n * CoreClient context and hook.\n * @module use-core-client\n */\n\nimport type { CoreClientInterface } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\n/** @internal */\nconst CoreClientContext = React.createContext<{\n  coreClient: CoreClientInterface | null;\n}>({\n  coreClient: null,\n});\n\n/**\n * Hook to access CoreClient from context.\n * @returns CoreClient instance or null.\n * @throws If used outside Auth0ComponentProvider.\n */\nexport const useCoreClient = () => {\n  const context = React.useContext(CoreClientContext);\n  if (!context) {\n    throw new Error('useCoreClient must be used within Auth0ComponentProvider');\n  }\n  return context;\n};\n\nexport { CoreClientContext };\n",
      "type": "registry:component",
      "target": "hooks/shared/use-core-client.ts"
    },
    {
      "path": "src/hooks/shared/use-error-handler.ts",
      "content": "/**\n * Error handling hook with toast error.\n * @module use-error-handler\n */\n\nimport {\n  isNetworkError,\n  isNotifiableError,\n  resolveErrorMessage,\n  getStatusCode,\n  hasApiErrorBody,\n  ERROR_CODES,\n} from '@auth0/universal-components-core';\nimport { useCallback } from 'react';\n\nimport { showToast } from '@/components/auth0/shared/toast';\nimport { useTranslator } from '@/hooks/shared/use-translator';\n\ninterface ErrorHandlerCallOptions {\n  fallbackMessage?: string;\n}\n\n/**\n * Hook for consistent error handling across the app.\n *\n * @returns Error handler function.\n *\n * @example\n * const handleError = useErrorHandler();\n *\n * // With custom message\n * onError: (error) => handleError(error, {\n *   fallbackMessage: t('my_error')\n * });\n *\n * // With defaults\n * onError: handleError;\n */\nexport function useErrorHandler() {\n  const { t } = useTranslator('common');\n\n  return useCallback(\n    (error: unknown, options: ErrorHandlerCallOptions = {}): void => {\n      if (!isNotifiableError(error)) return;\n\n      const getCustomErrorMessage = (err: unknown): string | undefined => {\n        if (isNetworkError(err)) return t('error.network');\n        const status = getStatusCode(err);\n        switch (status) {\n          case 400:\n            return t('error.bad_request');\n          case 401:\n            return t('error.missing_token');\n          case 403:\n            return hasApiErrorBody(err) && err.body?.type?.includes(ERROR_CODES.INSUFFICIENT_SCOPE)\n              ? t('error.insufficient_scope')\n              : t('error.forbidden');\n          case 404:\n            return t('error.not_found');\n          case 429:\n            return t('error.rate_limit');\n          default:\n            return undefined;\n        }\n      };\n\n      showToast({\n        type: 'error',\n        message:\n          getCustomErrorMessage(error) ??\n          resolveErrorMessage(error, options.fallbackMessage ?? t('error.generic')),\n      });\n    },\n    [t],\n  );\n}\n",
      "type": "registry:component",
      "target": "hooks/shared/use-error-handler.ts"
    },
    {
      "path": "src/hooks/shared/use-theme.ts",
      "content": "/**\n * Theme context hook.\n * @module use-theme\n */\n\n'use client';\n\nimport { useContext } from 'react';\n\nimport { ThemeContext } from '@/providers/theme-provider';\n\n/**\n * Hook to access theme context (mode, variables, loader).\n * @returns Theme context value.\n * @throws If used outside ThemeProvider.\n */\nexport function useTheme() {\n  const context = useContext(ThemeContext);\n  if (!context) {\n    throw new Error('useTheme must be used within a ThemeProvider');\n  }\n  return context;\n}\n",
      "type": "registry:component",
      "target": "hooks/shared/use-theme.ts"
    },
    {
      "path": "src/hooks/shared/use-toast-provider.ts",
      "content": "/**\n * Toast settings management hook.\n * @module use-toast-provider\n * @internal\n */\n\nimport { useEffect, useMemo } from 'react';\n\nimport { setGlobalToastSettings } from '@/components/auth0/shared/toast';\nimport { DEFAULT_TOAST_SETTINGS, type ToastSettings } from '@/types/toast-types';\n\n/**\n * Hook to merge and apply toast settings.\n * @param toastSettings - Optional toast settings.\n * @returns Merged toast settings.\n * @internal\n */\nexport const useToastProvider = (toastSettings?: ToastSettings) => {\n  const mergedToastSettings = useMemo(() => {\n    if (!toastSettings) {\n      return DEFAULT_TOAST_SETTINGS;\n    }\n\n    if (toastSettings.provider === 'custom') {\n      return toastSettings;\n    }\n\n    const defaultSonnerSettings =\n      DEFAULT_TOAST_SETTINGS.provider === 'sonner' ? DEFAULT_TOAST_SETTINGS.settings || {} : {};\n\n    return {\n      provider: 'sonner' as const,\n      settings: {\n        ...defaultSonnerSettings,\n        ...(toastSettings.provider === 'sonner' ? toastSettings.settings : {}),\n      },\n    } satisfies ToastSettings;\n  }, [toastSettings]);\n\n  useEffect(() => {\n    setGlobalToastSettings(mergedToastSettings);\n  }, [mergedToastSettings]);\n\n  return mergedToastSettings;\n};\n",
      "type": "registry:component",
      "target": "hooks/shared/use-toast-provider.ts"
    },
    {
      "path": "src/hooks/shared/use-translator.ts",
      "content": "/**\n * i18n translator hook.\n * @module use-translator\n */\n\nimport { type EnhancedTranslationFunction } from '@auth0/universal-components-core';\nimport { useMemo, useCallback } from 'react';\n\nimport { useCoreClient } from '@/hooks/shared/use-core-client';\n\n/**\n * Hook to access i18n translations.\n * @param namespace - Translation namespace.\n * @param overrides - Optional translation overrides.\n * @returns Translator function and language utilities.\n */\nexport function useTranslator(\n  namespace: string,\n  overrides?: Record<string, unknown>,\n): {\n  t: EnhancedTranslationFunction;\n  changeLanguage: (language: string, fallbackLanguage?: string) => Promise<void>;\n  currentLanguage: string;\n  fallbackLanguage: string | undefined;\n} {\n  const { coreClient } = useCoreClient();\n\n  if (!coreClient) {\n    throw new Error(\n      'useTranslator must be used within Auth0ComponentProvider with initialized CoreClient',\n    );\n  }\n\n  const translator = useMemo(() => {\n    return coreClient.i18nService.translator(namespace, overrides);\n  }, [coreClient, namespace, overrides]);\n\n  const changeLanguage = useCallback(\n    async (language: string, fallbackLanguage?: string) => {\n      await coreClient.i18nService.changeLanguage(language, fallbackLanguage);\n    },\n    [coreClient],\n  );\n\n  return {\n    t: translator,\n    changeLanguage,\n    currentLanguage: coreClient.i18nService.currentLanguage,\n    fallbackLanguage: coreClient.i18nService.fallbackLanguage,\n  };\n}\n",
      "type": "registry:component",
      "target": "hooks/shared/use-translator.ts"
    },
    {
      "path": "src/providers/gate-keeper-context.tsx",
      "content": "'use client';\n\nimport { createContext, useContext } from 'react';\n\nexport interface GateKeeperContextValue {\n  error: Error | null;\n  /** Defined only when an error is active. */\n  onRetry?: () => Promise<boolean>;\n}\n\nexport const GateKeeperContext = createContext<GateKeeperContextValue | null>(null);\n\n/**\n * @internal\n * @returns Current GateKeeper context value\n * @throws Error if used outside of the GateKeeperProvider\n */\nexport function useGateKeeperContext(): GateKeeperContextValue {\n  const context = useContext(GateKeeperContext);\n\n  if (!context) {\n    throw new Error('useGateKeeperContext must be used within a GateKeeperProvider');\n  }\n\n  return context;\n}\n",
      "type": "registry:component",
      "target": "providers/gate-keeper-context.tsx"
    },
    {
      "path": "src/providers/portal-context.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\n\n/**\n * React context that stores the target HTML element used as a portal container\n * for overlay-based UI (for example, dialogs, popovers, and tooltips).\n *\n */\nexport const PortalContext = React.createContext<HTMLElement | null>(null);\n\n/**\n * Returns the current portal container element from `PortalContext`.\n *\n * @returns The configured portal host element, or `null` when not provided.\n */\nexport function usePortalContainer() {\n  return React.useContext(PortalContext);\n}\n",
      "type": "registry:component",
      "target": "providers/portal-context.tsx"
    },
    {
      "path": "src/providers/proxy-provider.tsx",
      "content": "/**\n * RWA proxy provider for server-side auth.\n * @module proxy-provider\n */\n\n'use client';\n\nimport type { AuthDetails } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport { Toaster } from '@/components/auth0/shared/sonner';\nimport { StyledScope } from '@/components/auth0/shared/styled-scope';\nimport { Spinner } from '@/components/ui/spinner';\nimport { CoreClientContext } from '@/hooks/shared/use-core-client';\nimport { useCoreClientInitialization } from '@/hooks/shared/use-core-client-initialization';\nimport { useToastProvider } from '@/hooks/shared/use-toast-provider';\nimport { QueryProvider } from '@/providers/query-provider';\nimport { ThemeProvider } from '@/providers/theme-provider';\nimport type { Auth0ComponentProviderProps } from '@/types/auth-types';\n\n/**\n * Auth0 provider for RWAs using backend proxy auth.\n * @param props - Provider configuration including domain, proxyConfig, i18n, themeSettings, toastSettings, cacheConfig, loader, and children.\n * @returns Provider component tree\n */\nexport const Auth0ComponentProvider = ({\n  i18n,\n  domain,\n  proxyConfig,\n  previewMode,\n  themeSettings = {\n    theme: 'default',\n    mode: 'light',\n    variables: {\n      common: {},\n      light: {},\n      dark: {},\n    },\n  },\n  toastSettings,\n  cacheConfig,\n  loader,\n  children,\n}: Extract<Auth0ComponentProviderProps, { mode: 'proxy' }> & { children: React.ReactNode }) => {\n  const mergedToastSettings = useToastProvider(toastSettings);\n  const { baseUrl, fetcher } = proxyConfig;\n\n  const memoizedAuthDetails = React.useMemo<AuthDetails>(\n    () => ({\n      domain,\n      authProxyUrl: baseUrl,\n      fetcher,\n      previewMode,\n    }),\n    [domain, baseUrl, fetcher, previewMode],\n  );\n\n  const coreClient = useCoreClientInitialization({\n    authDetails: memoizedAuthDetails,\n    i18nOptions: i18n,\n  });\n\n  const coreClientValue = React.useMemo(\n    () => ({\n      coreClient,\n    }),\n    [coreClient],\n  );\n\n  const fallback = loader || (\n    <StyledScope>\n      <div className=\"flex items-center justify-center min-h-[200px]\">\n        <Spinner />\n      </div>\n    </StyledScope>\n  );\n\n  return (\n    <ThemeProvider\n      themeSettings={{\n        mode: themeSettings.mode,\n        variables: themeSettings.variables,\n        loader,\n        theme: themeSettings.theme,\n      }}\n    >\n      {mergedToastSettings.provider === 'sonner' && (\n        <Toaster\n          position={mergedToastSettings.settings?.position || 'top-right'}\n          closeButton={mergedToastSettings.settings?.closeButton ?? true}\n          className=\"auth0-universal\"\n        />\n      )}\n      {coreClient ? (\n        <CoreClientContext.Provider value={coreClientValue}>\n          <QueryProvider cacheConfig={cacheConfig}>{children}</QueryProvider>\n        </CoreClientContext.Provider>\n      ) : (\n        fallback\n      )}\n    </ThemeProvider>\n  );\n};\n\nexport default Auth0ComponentProvider;\n",
      "type": "registry:component",
      "target": "providers/proxy-provider.tsx"
    },
    {
      "path": "src/providers/query-provider.tsx",
      "content": "'use client';\n\n/**\n * TanStack Query provider wrapper.\n * @module query-provider\n * @internal\n */\n\nimport { isMfaRequiredError, isNotifiableError } from '@auth0/universal-components-core';\nimport {\n  MutationCache,\n  type Query,\n  QueryCache,\n  QueryClient,\n  QueryClientProvider as TanStackQueryClientProvider,\n} from '@tanstack/react-query';\nimport { useMemo, useState, type ReactElement, type ReactNode } from 'react';\n\nimport { GateKeeperContext } from '@/providers/gate-keeper-context';\n\n/** Query cache configuration. */\nexport interface QueryCacheConfig {\n  enabled?: boolean;\n  staleTime?: number;\n  gcTime?: number;\n  refetchOnWindowFocus?: boolean | 'always';\n}\n\n/** Default cache configuration. */\nexport const DEFAULT_CACHE_CONFIG: Readonly<Required<QueryCacheConfig>> = {\n  enabled: true,\n  staleTime: 2 * 60 * 1000,\n  gcTime: 5 * 60 * 1000,\n  refetchOnWindowFocus: false,\n};\n\nconst QUERY_RETRY_CONFIG = {\n  maxRetries: 3,\n  maxRetryDelay: 30_000,\n  backoffMultiplier: 2,\n} as const;\n\nconst MUTATION_RETRY_CONFIG = {\n  maxRetries: 1,\n} as const;\n\nconst DISABLED_CACHE_GC_TIME = 5 * 1000;\n\n/**\n * Merges user config with defaults.\n * @param userConfig - User-provided cache config.\n * @returns The resolved cache configuration\n * @internal\n */\nexport function resolveCacheConfig(userConfig?: QueryCacheConfig): Required<QueryCacheConfig> {\n  const merged: Required<QueryCacheConfig> = {\n    ...DEFAULT_CACHE_CONFIG,\n    ...userConfig,\n  };\n\n  if (!merged.enabled) {\n    return {\n      ...merged,\n      staleTime: 0,\n      gcTime: DISABLED_CACHE_GC_TIME,\n    };\n  }\n\n  return merged;\n}\n\n/**\n * Returns true if a cached query has an error that GateKeeper should handle.\n * @param query - The cached query to check.\n * @returns Whether the query error should be intercepted by GateKeeper.\n */\nfunction isGateKeeperError(query: Query): boolean {\n  return !!query.state.error && !isNotifiableError(query.state.error);\n}\n\n/**\n * Creates a QueryClient with config and global GateKeeper error interception.\n * @param cacheConfig - Cache configuration.\n * @param setGateKeeperState - Setter for GateKeeper context state.\n * @returns The configured QueryClient instance\n * @internal\n */\nfunction createQueryClient(\n  cacheConfig: Required<QueryCacheConfig>,\n  setGateKeeperState: (state: { error: Error; onRetry: () => Promise<boolean> } | null) => void,\n): QueryClient {\n  const queryClient = new QueryClient({\n    queryCache: new QueryCache({\n      onError: (error) => {\n        if (!isNotifiableError(error)) {\n          setGateKeeperState({\n            error,\n            onRetry: async () => {\n              await queryClient.refetchQueries({ predicate: isGateKeeperError });\n              const stillFailing = queryClient.getQueryCache().getAll().some(isGateKeeperError);\n              if (!stillFailing) setGateKeeperState(null);\n              return !stillFailing;\n            },\n          });\n        }\n      },\n    }),\n    mutationCache: new MutationCache({\n      onError: (error, variables, _context, mutation) => {\n        if (isMfaRequiredError(error)) {\n          setGateKeeperState({\n            error,\n            onRetry: async () => {\n              try {\n                await mutation.execute(variables);\n                setGateKeeperState(null);\n                return true;\n              } catch {\n                return false;\n              }\n            },\n          });\n        }\n      },\n    }),\n    defaultOptions: {\n      queries: {\n        staleTime: cacheConfig.staleTime,\n        gcTime: cacheConfig.gcTime,\n        refetchOnWindowFocus: cacheConfig.refetchOnWindowFocus,\n        retry: (failureCount, error) =>\n          !isMfaRequiredError(error) && failureCount < QUERY_RETRY_CONFIG.maxRetries,\n        retryDelay: (attemptIndex: number) =>\n          Math.min(\n            1000 * QUERY_RETRY_CONFIG.backoffMultiplier ** attemptIndex,\n            QUERY_RETRY_CONFIG.maxRetryDelay,\n          ),\n        refetchOnReconnect: true,\n      },\n      mutations: {\n        retry: (failureCount, error) =>\n          !isMfaRequiredError(error) && failureCount < MUTATION_RETRY_CONFIG.maxRetries,\n      },\n    },\n  });\n\n  return queryClient;\n}\n\n/** Props for QueryProvider. */\nexport interface QueryProviderProps {\n  children: ReactNode;\n  /** Cache config, only read on mount. */\n  cacheConfig?: QueryCacheConfig;\n}\n\n/**\n * Internal TanStack Query provider wrapper.\n * @param props - Component props.\n * @param props.children - Child components.\n * @param props.cacheConfig - Cache configuration.\n * @returns The context provider component\n * @internal\n */\nexport function QueryProvider({ children, cacheConfig }: QueryProviderProps): ReactElement {\n  const [gateKeeperState, setGateKeeperState] = useState<{\n    error: Error;\n    onRetry: () => Promise<boolean>;\n  } | null>(null);\n  const [queryClient] = useState(() =>\n    createQueryClient(resolveCacheConfig(cacheConfig), setGateKeeperState),\n  );\n\n  const contextValue = useMemo(() => gateKeeperState ?? { error: null }, [gateKeeperState]);\n\n  return (\n    <GateKeeperContext.Provider value={contextValue}>\n      <TanStackQueryClientProvider client={queryClient}>{children}</TanStackQueryClientProvider>\n    </GateKeeperContext.Provider>\n  );\n}\n",
      "type": "registry:component",
      "target": "providers/query-provider.tsx"
    },
    {
      "path": "src/providers/spa-provider.tsx",
      "content": "/**\n * SPA provider using @auth0/auth0-react.\n * @module spa-provider\n */\n\n'use client';\n\nimport { useAuth0 } from '@auth0/auth0-react';\nimport type { AuthDetails, BasicAuth0ContextInterface } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport { Toaster } from '@/components/auth0/shared/sonner';\nimport { StyledScope } from '@/components/auth0/shared/styled-scope';\nimport { Spinner } from '@/components/ui/spinner';\nimport { CoreClientContext } from '@/hooks/shared/use-core-client';\nimport { useCoreClientInitialization } from '@/hooks/shared/use-core-client-initialization';\nimport { useToastProvider } from '@/hooks/shared/use-toast-provider';\nimport { QueryProvider } from '@/providers/query-provider';\nimport { ThemeProvider } from '@/providers/theme-provider';\nimport type { Auth0ComponentProviderProps } from '@/types/auth-types';\n\n/**\n * Auth0 provider for SPAs. Wraps components with required contexts.\n * @param props - Provider configuration including domain, mode, authContext, i18n, themeSettings, toastSettings, cacheConfig, loader, and children.\n * @returns Provider component tree\n */\nexport const Auth0ComponentProvider = (\n  props: Extract<Auth0ComponentProviderProps, { mode?: 'direct' }> & { children: React.ReactNode },\n) => {\n  const {\n    i18n,\n    previewMode,\n    themeSettings = {\n      theme: 'default',\n      mode: 'light',\n      variables: {\n        common: {},\n        light: {},\n        dark: {},\n      },\n    },\n    toastSettings,\n    cacheConfig,\n    loader,\n    children,\n    authContext,\n  } = props;\n  const mergedToastSettings = useToastProvider(toastSettings);\n\n  const auth0ReactContext = useAuth0();\n\n  const resolvedAuthContext = React.useMemo(() => {\n    if (authContext) {\n      return authContext;\n    }\n    if (auth0ReactContext && 'isAuthenticated' in auth0ReactContext) {\n      return auth0ReactContext as BasicAuth0ContextInterface;\n    }\n\n    throw new Error(\n      'Auth0ContextInterface is not available. Make sure you wrap your app with Auth0Provider from @auth0/auth0-react, or pass authContext.',\n    );\n  }, [auth0ReactContext, authContext]);\n\n  const memoizedAuthDetails = React.useMemo<AuthDetails>(\n    () => ({\n      contextInterface: resolvedAuthContext,\n      previewMode,\n    }),\n    [resolvedAuthContext, previewMode],\n  );\n\n  const coreClient = useCoreClientInitialization({\n    authDetails: memoizedAuthDetails,\n    i18nOptions: i18n,\n  });\n\n  const coreClientValue = React.useMemo(\n    () => ({\n      coreClient,\n    }),\n    [coreClient],\n  );\n\n  const fallback = loader || (\n    <StyledScope>\n      <div className=\"flex items-center justify-center min-h-[200px]\">\n        <Spinner />\n      </div>\n    </StyledScope>\n  );\n\n  return (\n    <ThemeProvider\n      themeSettings={{\n        mode: themeSettings.mode,\n        variables: themeSettings.variables,\n        loader,\n        theme: themeSettings.theme,\n      }}\n    >\n      {mergedToastSettings.provider === 'sonner' && (\n        <Toaster\n          position={mergedToastSettings.settings?.position || 'top-right'}\n          closeButton={mergedToastSettings.settings?.closeButton ?? true}\n          className=\"auth0-universal\"\n        />\n      )}\n      {coreClient ? (\n        <CoreClientContext.Provider value={coreClientValue}>\n          <QueryProvider cacheConfig={cacheConfig}>{children}</QueryProvider>\n        </CoreClientContext.Provider>\n      ) : (\n        fallback\n      )}\n    </ThemeProvider>\n  );\n};\n\nexport default Auth0ComponentProvider;\n",
      "type": "registry:component",
      "target": "providers/spa-provider.tsx"
    },
    {
      "path": "src/providers/theme-provider.tsx",
      "content": "/**\n * Theme provider for styling configuration.\n * @module theme-provider\n * @internal\n */\n\n'use client';\n\nimport { applyStyleOverrides, type StylingVariables } from '@auth0/universal-components-core';\nimport * as React from 'react';\n\nimport { PortalContext } from '@/providers/portal-context';\nimport type { ThemeContextValue, ThemeInput } from '@/types/theme-types';\n\n/** Default empty style overrides. */\nconst defaultStyleOverrides: StylingVariables = { common: {}, light: {}, dark: {} };\n\n/**\n * Theme context for accessing theme settings.\n * @internal\n * @returns The context provider component\n */\nexport const ThemeContext = React.createContext<ThemeContextValue>({\n  isDarkMode: false,\n  variables: defaultStyleOverrides,\n  loader: null,\n});\n\n/**\n * Provides theme configuration to the component tree.\n * @param props - Component props.\n * @param props.themeSettings - Theme settings with mode, variables, and loader.\n * @param props.children - Child components.\n * @returns Theme provider.\n * @internal\n */\nexport const ThemeProvider: React.FC<{\n  themeSettings?: ThemeInput;\n  children: React.ReactNode;\n}> = ({ themeSettings, children }) => {\n  const { variables, loader, mode, theme } = React.useMemo(\n    () => ({\n      variables: themeSettings?.variables ?? defaultStyleOverrides,\n      loader: themeSettings?.loader ?? null,\n      mode: themeSettings?.mode,\n      theme: themeSettings?.theme ?? 'default',\n    }),\n    [themeSettings],\n  );\n\n  const [portalContainer, setPortalContainer] = React.useState<HTMLElement | null>(null);\n\n  React.useEffect(() => {\n    applyStyleOverrides(variables, mode, theme);\n  }, [variables, mode, theme]);\n\n  return (\n    <ThemeContext.Provider value={{ isDarkMode: mode === 'dark', theme, variables, loader }}>\n      <PortalContext.Provider value={portalContainer}>\n        {children}\n        <div className=\"auth0-universal\" data-theme={theme} ref={setPortalContainer} />\n      </PortalContext.Provider>\n    </ThemeContext.Provider>\n  );\n};\n",
      "type": "registry:component",
      "target": "providers/theme-provider.tsx"
    },
    {
      "path": "src/types/auth-types.ts",
      "content": "/**\n * Auth provider configuration types.\n * @module auth-types\n */\n\nimport type { AuthDetails, FetcherAuthParams } from '@auth0/universal-components-core';\nimport type * as React from 'react';\n\nimport type { QueryCacheConfig } from '@/types/cache-types';\nimport type { I18nOptions } from '@/types/i18n-types';\nimport type { ThemeSettings } from '@/types/theme-types';\nimport type { ToastSettings } from '@/types/toast-types';\n\n/** Props for Auth0ComponentProvider. */\nexport type Auth0ComponentProviderProps = (\n  | {\n      mode?: 'direct';\n      authContext?: AuthDetails['contextInterface'];\n      proxyConfig?: never;\n    }\n  | {\n      mode: 'proxy';\n      domain: string;\n      proxyConfig: {\n        baseUrl: string;\n        fetcher?: (\n          url: string,\n          init?: RequestInit,\n          authParams?: FetcherAuthParams,\n        ) => Promise<Response>;\n      };\n    }\n) & {\n  i18n?: I18nOptions;\n  themeSettings?: ThemeSettings;\n  loader?: React.ReactNode;\n  toastSettings?: ToastSettings;\n  /** TanStack Query cache config. Use `{ enabled: false }` to disable. */\n  cacheConfig?: QueryCacheConfig;\n  previewMode?: boolean;\n};\n",
      "type": "registry:component",
      "target": "types/auth-types.ts"
    },
    {
      "path": "src/types/cache-types.ts",
      "content": "/**\n * TanStack Query cache configuration types.\n * @module cache-types\n */\n\n/** Cache configuration options. */\nexport interface QueryCacheConfig {\n  enabled?: boolean;\n  staleTime?: number;\n  gcTime?: number;\n  refetchOnWindowFocus?: boolean | 'always';\n}\n",
      "type": "registry:component",
      "target": "types/cache-types.ts"
    },
    {
      "path": "src/types/i18n-types.ts",
      "content": "/**\n * Internationalization configuration types.\n * @module i18n-types\n */\n\n/** i18n configuration for Auth0 components. */\nexport interface I18nOptions {\n  currentLanguage: string;\n  fallbackLanguage?: string;\n}\n",
      "type": "registry:component",
      "target": "types/i18n-types.ts"
    },
    {
      "path": "src/types/my-organization/config/config-idp-types.ts",
      "content": "/**\n * IDP configuration types.\n * @module config-idp-types\n */\n\nimport type {\n  GetIdpConfigurationResponseContent,\n  IdpStrategy,\n} from '@auth0/universal-components-core';\n\n/** useIdpConfig hook result. */\nexport interface UseConfigIdpResult {\n  idpConfig: GetIdpConfigurationResponseContent | null;\n  isLoadingIdpConfig: boolean;\n  fetchIdpConfig: () => Promise<void>;\n  isProvisioningEnabled: (strategy: IdpStrategy | undefined) => boolean;\n  isProvisioningMethodEnabled: (strategy: IdpStrategy | undefined) => boolean;\n  isIdpConfigValid: boolean;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/config/config-idp-types.ts"
    },
    {
      "path": "src/types/my-organization/config/config-types.ts",
      "content": "/**\n * Organization configuration types.\n * @module config-types\n */\n\nimport type {\n  GetConfigurationResponseContent,\n  IdpStrategy,\n} from '@auth0/universal-components-core';\n\n/** useConfig hook result. */\nexport interface UseConfigResult {\n  config: GetConfigurationResponseContent | null;\n  isLoadingConfig: boolean;\n  fetchConfig: () => Promise<void>;\n  filteredStrategies: IdpStrategy[];\n  shouldAllowDeletion: boolean;\n  isConfigValid: boolean;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/config/config-types.ts"
    },
    {
      "path": "src/types/my-organization/domain-management/domain-create-types.ts",
      "content": "/**\n * Domain create modal types.\n * @module domain-create-types\n */\n\nimport type { DomainCreateMessages, DomainCreateSchemas } from '@auth0/universal-components-core';\n\n/** Props for DomainCreateModal. */\nexport interface DomainCreateModalProps {\n  translatorKey?: string;\n  className?: string;\n  customMessages?: Partial<DomainCreateMessages>;\n  schema?: DomainCreateSchemas;\n  isOpen: boolean;\n  isLoading: boolean;\n  onClose: () => void;\n  onCreate: (domainName: string) => void | Promise<void>;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/domain-management/domain-create-types.ts"
    },
    {
      "path": "src/types/my-organization/domain-management/domain-delete-types.ts",
      "content": "/**\n * Domain delete modal types.\n * @module domain-delete-types\n */\n\nimport type { Domain, DomainDeleteMessages } from '@auth0/universal-components-core';\n\n/** Props for DomainDeleteModal. */\nexport interface DomainDeleteModalProps {\n  translatorKey?: string;\n  className?: string;\n  customMessages?: Partial<DomainDeleteMessages>;\n  domain: Domain | null;\n  isOpen: boolean;\n  isLoading: boolean;\n  onClose: () => void;\n  onDelete: (domain: Domain) => void;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/domain-management/domain-delete-types.ts"
    },
    {
      "path": "src/types/my-organization/domain-management/domain-table-types.ts",
      "content": "/**\n * Domain table types.\n * @module domain-table-types\n */\n\nimport type {\n  SharedComponentProps,\n  IdpKnownResponse,\n  DomainCreateMessages,\n  DomainCreateSchemas,\n  ComponentAction,\n  Domain,\n  DomainDeleteMessages,\n  DomainConfigureMessages,\n  DomainVerifyMessages,\n  DomainTableMessages,\n  CreateOrganizationDomainRequestContent,\n  EnhancedTranslationFunction,\n  IdentityProviderAssociatedWithDomain,\n} from '@auth0/universal-components-core';\n\nexport type { Domain };\n\n/** CSS classes for DomainTable. */\nexport interface DomainTableClasses {\n  'DomainTable-header'?: string;\n  'DomainTable-table'?: string;\n  'DomainTable-createModal'?: string;\n  'DomainTable-configureModal'?: string;\n  'DomainTable-deleteModal'?: string;\n}\n\n/** DomainTable translation messages. */\nexport interface DomainTableMainMessages extends DomainTableMessages {\n  create: DomainCreateMessages;\n  configure: DomainConfigureMessages;\n  verify: DomainVerifyMessages;\n  delete: DomainDeleteMessages;\n}\n\n/** DomainTable validation schemas. */\nexport interface DomainTableSchema {\n  create?: DomainCreateSchemas;\n}\n\n/** Props for DomainTable component. */\nexport interface DomainTableProps\n  extends SharedComponentProps<DomainTableMainMessages, DomainTableClasses, DomainTableSchema> {\n  hideHeader?: boolean;\n  createAction?: ComponentAction<Domain>;\n  verifyAction?: ComponentAction<Domain>;\n  deleteAction?: ComponentAction<Domain>;\n  associateToProviderAction?: ComponentAction<Domain, IdpKnownResponse>;\n  deleteFromProviderAction?: ComponentAction<Domain, IdpKnownResponse>;\n  onOpenProvider?: (provider: IdpKnownResponse) => void;\n  onCreateProvider?: () => void;\n}\n\n// DomainTableView component props\nexport interface DomainTableViewProps {\n  logic: UseDomainTableResult & DomainTableProps;\n  handlers: UseDomainTableLogicResult;\n}\n\n/** Props for DomainTable actions column. */\nexport interface DomainTableActionsColumnProps {\n  customMessages?: Partial<DomainTableMainMessages>;\n  readOnly: boolean;\n  domain: Domain;\n  onView: (domain: Domain) => void;\n  onConfigure: (domain: Domain) => void;\n  onVerify: (domain: Domain) => void;\n  onDelete: (domain: Domain) => void;\n}\n\nexport interface UseDomainTableOptions {\n  createAction?: DomainTableProps['createAction'];\n  verifyAction?: DomainTableProps['verifyAction'];\n  deleteAction?: DomainTableProps['deleteAction'];\n  associateToProviderAction?: DomainTableProps['associateToProviderAction'];\n  deleteFromProviderAction?: DomainTableProps['deleteFromProviderAction'];\n  customMessages?: DomainTableProps['customMessages'];\n}\n\nexport interface UseDomainTableResult extends SharedComponentProps {\n  domains: Domain[];\n  providers: IdentityProviderAssociatedWithDomain[];\n  isFetching: boolean;\n  isLoadingProviders: boolean;\n  isCreating: boolean;\n  isDeleting: boolean;\n  isVerifying: boolean;\n  fetchProviders: (domain: Domain) => Promise<void>;\n  fetchDomains: () => Promise<void>;\n  onCreateDomain: (data: CreateOrganizationDomainRequestContent) => Promise<Domain | null>;\n  onVerifyDomain: (data: Domain) => Promise<boolean>;\n  onDeleteDomain: (domain: Domain) => Promise<void>;\n  onAssociateToProvider: (domain: Domain, provider: IdpKnownResponse) => Promise<void>;\n  onDeleteFromProvider: (domain: Domain, provider: IdpKnownResponse) => Promise<void>;\n}\n\nexport interface UseDomainTableLogicOptions {\n  t: EnhancedTranslationFunction;\n  onCreateDomain: UseDomainTableResult['onCreateDomain'];\n  onVerifyDomain: UseDomainTableResult['onVerifyDomain'];\n  onDeleteDomain: UseDomainTableResult['onDeleteDomain'];\n  onAssociateToProvider: UseDomainTableResult['onAssociateToProvider'];\n  onDeleteFromProvider: UseDomainTableResult['onDeleteFromProvider'];\n  fetchProviders: UseDomainTableResult['fetchProviders'];\n  fetchDomains: UseDomainTableResult['fetchDomains'];\n}\n\nexport interface UseDomainTableLogicResult {\n  // Modal state\n  showCreateModal: boolean;\n  showConfigureModal: boolean;\n  showVerifyModal: boolean;\n  showDeleteModal: boolean;\n  verifyError: string | undefined;\n  selectedDomain: Domain | null;\n\n  // State setters\n  setShowCreateModal: (show: boolean) => void;\n  setShowConfigureModal: (show: boolean) => void;\n  setShowVerifyModal: (show: boolean) => void;\n  setShowDeleteModal: (show: boolean) => void;\n\n  // Handlers\n  handleCreate: (domainUrl: string) => Promise<void>;\n  handleVerify: (domain: Domain) => Promise<void>;\n  handleDelete: (domain: Domain) => void;\n  handleToggleSwitch: (domain: Domain, provider: IdpKnownResponse, checked: boolean) => void;\n  handleCloseVerifyModal: () => void;\n  handleCreateClick: () => void;\n  handleConfigureClick: (domain: Domain) => void;\n  handleVerifyClick: (domain: Domain) => Promise<void>;\n  handleDeleteClick: (domain: Domain) => void;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/domain-management/domain-table-types.ts"
    },
    {
      "path": "src/types/my-organization/domain-management/domain-verify-types.ts",
      "content": "/**\n * Domain verification modal types.\n * @module domain-verify-types\n */\n\nimport type { DomainVerifyMessages, Domain } from '@auth0/universal-components-core';\n\n/** Props for DomainVerifyModal. */\nexport interface DomainVerifyModalProps {\n  translatorKey?: string;\n  isOpen: boolean;\n  isLoading?: boolean;\n  domain: Domain | null;\n  error?: string;\n  onClose: () => void;\n  onVerify: (domain: Domain) => void;\n  onDelete: (domain: Domain) => void;\n  className?: string;\n  customMessages?: Partial<DomainVerifyMessages>;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/domain-management/domain-verify-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-domain/sso-domain-tab-types.ts",
      "content": "/**\n * SSO domain tab types.\n * @module sso-domain-tab-types\n */\n\nimport type {\n  ComponentAction,\n  Domain,\n  DomainCreateSchemas,\n  IdpKnownResponse,\n  SharedComponentProps,\n  SsoDomainTabMessages,\n} from '@auth0/universal-components-core';\n\n/** SSO domains tab edit action props. */\nexport interface SsoDomainsTabEditProps {\n  createAction?: ComponentAction<Domain>;\n  verifyAction?: ComponentAction<Domain>;\n  deleteAction?: ComponentAction<Domain, void>;\n  associateToProviderAction?: ComponentAction<Domain, IdpKnownResponse | null>;\n  deleteFromProviderAction?: ComponentAction<Domain, IdpKnownResponse | null>;\n}\n\n/** CSS classes for SsoDomainsTab. */\nexport interface SsoDomainTabClasses {\n  'SsoDomainsTab-header'?: string;\n  'SsoDomainsTab-table'?: string;\n  'SsoDomainsTab-createModal'?: string;\n  'SsoDomainsTab-verifyModal'?: string;\n  'SsoDomainsTab-deleteModal'?: string;\n}\n\n/** SSO provider edit domains tab schema. */\nexport interface SsoProviderEditDomainsTabSchema {\n  create: DomainCreateSchemas;\n}\n\n/** Props for SsoDomainsTab component. */\nexport interface SsoDomainsTabProps\n  extends SharedComponentProps<\n    SsoDomainTabMessages,\n    SsoDomainTabClasses,\n    SsoProviderEditDomainsTabSchema\n  > {\n  domains: SsoDomainsTabEditProps | undefined;\n  idpId: string;\n  provider: IdpKnownResponse | null;\n}\n\nexport interface SsoDomainTabActionColumn\n  extends SharedComponentProps<\n    SsoDomainTabMessages,\n    SsoDomainTabClasses,\n    SsoProviderEditDomainsTabSchema\n  > {\n  translatorKey?: string;\n  idpDomains: string[];\n  domain: Domain;\n  handleVerify: (domain: Domain) => Promise<void>;\n  isUpdating: boolean;\n  isUpdatingId: string | null;\n  onToggle: (domain: Domain, newCheckedValue: boolean) => Promise<void>;\n}\n\nexport interface UseSsoDomainTabOptions extends SharedComponentProps {\n  domains: SsoDomainsTabEditProps;\n  provider: IdpKnownResponse | null;\n}\n\nexport interface UseSsoDomainTabReturn {\n  domainsList: Domain[];\n  isLoading: boolean;\n  showCreateModal: boolean;\n  isCreating: boolean;\n  selectedDomain: Domain | null;\n  showVerifyModal: boolean;\n  showDeleteModal: boolean;\n  isVerifying: boolean;\n  verifyError: string | undefined;\n  isDeleting: boolean;\n  idpDomains: string[];\n  isUpdating: boolean;\n  isUpdatingId: string | null;\n  setShowCreateModal: (show: boolean) => void;\n  handleCreate: (domainUrl: string) => Promise<void>;\n  handleCloseVerifyModal: () => void;\n  handleVerify: (domain: Domain) => Promise<void>;\n  handleDeleteClick: (domain: Domain) => void;\n  setShowDeleteModal: (show: boolean) => void;\n  handleDelete: (domain: Domain) => void;\n  handleVerifyActionColumn: (domain: Domain) => Promise<void>;\n  handleToggleSwitch: (domain: Domain, newCheckedValue: boolean) => Promise<void>;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-domain/sso-domain-tab-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provider/sso-provider-create-types.ts",
      "content": "/**\n * SSO provider create types.\n * @module sso-provider-create-types\n */\n\nimport type {\n  SharedComponentProps,\n  ProviderSelectMessages,\n  ProviderDetailsMessages,\n  IdpStrategy,\n  ProviderSelectionFormValues,\n  IdpKnownResponse,\n  ProviderConfigureMessages,\n  ProviderConfigureFieldsMessages,\n  SsoProviderCreateMessages,\n  ProviderDetailsFormValues,\n  ProviderConfigureFormValues,\n  SsoProviderFormValues,\n  SsoProviderSchema,\n  ComponentAction,\n  BackButton,\n  CreateIdentityProviderRequestContentPrivate,\n  GetIdpConfigurationResponseContent,\n} from '@auth0/universal-components-core';\nimport type { LucideIcon } from 'lucide-react';\nimport type React from 'react';\nimport type { UseFormReturn } from 'react-hook-form';\n\nexport interface ProviderConfigureHandle {\n  validate: () => Promise<boolean>;\n  getData: () => ProviderConfigureFormValues;\n}\n\nexport interface ProviderDetailsFormHandle {\n  validate: () => Promise<boolean>;\n  getData: () => ProviderDetailsFormValues;\n  isDirty: () => boolean;\n  reset: (data?: ProviderDetailsFormValues) => void;\n}\n\n/** Form mode for provider configuration. */\nexport type FormMode = 'create' | 'edit';\n\n/** CSS classes for SsoProviderCreate. */\nexport interface SsoProviderCreateClasses {\n  'SsoProviderCreate-header'?: string;\n  'SsoProviderCreate-wizard'?: string;\n  'ProviderSelect-root'?: string;\n  'ProviderDetails-root'?: string;\n  'ProviderConfigure-root'?: string;\n}\n\n/** Props for ProviderSelect component. */\nexport interface ProviderSelectProps\n  extends SharedComponentProps<ProviderSelectMessages, SsoProviderCreateClasses> {\n  isLoading: boolean;\n  strategyList: IdpStrategy[];\n  onClickStrategy: (strategy: IdpStrategy) => void;\n  selectedStrategy?: IdpStrategy | null;\n  form?: UseFormReturn<ProviderSelectionFormValues>;\n  className?: string;\n}\n\n/** Props for ProviderDetails component. */\nexport interface ProviderDetailsProps\n  extends SharedComponentProps<ProviderDetailsMessages, SsoProviderCreateClasses> {\n  initialData?: Partial<ProviderDetailsFormValues>;\n  className?: string;\n  hideHeader?: boolean;\n  mode: 'edit' | 'create';\n  onFormDirty?: (isDirty: boolean) => void;\n}\n\n/** Props for ProviderConfigure component. */\nexport interface ProviderConfigureProps\n  extends SharedComponentProps<ProviderConfigureMessages, SsoProviderCreateClasses> {\n  className?: string;\n  isLoading: boolean;\n  strategy: IdpStrategy;\n  initialData?: Partial<ProviderConfigureFormValues>;\n  idpConfig: GetIdpConfigurationResponseContent | null;\n}\n\nexport interface ProviderConfigureFieldsProps\n  extends SharedComponentProps<ProviderConfigureFieldsMessages, SsoProviderCreateClasses> {\n  strategy: IdpStrategy;\n  initialData?: Partial<ProviderConfigureFormValues>;\n  className?: string;\n  onFormDirty?: (isDirty: boolean) => void;\n  idpConfig: GetIdpConfigurationResponseContent | null;\n  mode?: FormMode;\n}\n\nexport interface SsoProviderCreateBackButton extends Omit<BackButton, 'onClick'> {\n  icon?: LucideIcon;\n  onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\nexport interface SsoProviderCreateProps\n  extends SharedComponentProps<\n    SsoProviderCreateMessages,\n    SsoProviderCreateClasses,\n    SsoProviderSchema\n  > {\n  createAction: ComponentAction<CreateIdentityProviderRequestContentPrivate, IdpKnownResponse>;\n  backButton?: SsoProviderCreateBackButton;\n  onPrevious?: (stepId: string, values: Partial<SsoProviderFormValues>) => boolean;\n  onNext?: (stepId: string, values: Partial<SsoProviderFormValues>) => boolean;\n}\n\nexport interface UseSsoProviderCreateOptions {\n  createAction?: SsoProviderCreateProps['createAction'];\n  customMessages?: SsoProviderCreateProps['customMessages'];\n}\n\nexport interface UseSsoProviderCreateLogicOptions {\n  onNext?: SsoProviderCreateProps['onNext'];\n  onPrevious?: SsoProviderCreateProps['onPrevious'];\n  createProvider: (data: CreateIdentityProviderRequestContentPrivate) => Promise<void>;\n}\n\nexport interface UseSsoProviderCreateLogicResult {\n  formData: FormState;\n  setFormData: React.Dispatch<React.SetStateAction<FormState>>;\n  detailsRef: React.RefObject<ProviderDetailsFormHandle | null>;\n  configureRef: React.RefObject<ProviderConfigureHandle | null>;\n  handleCreate: () => Promise<void>;\n  isLoadingConfig: boolean;\n  filteredStrategies: IdpStrategy[];\n  isLoadingIdpConfig: boolean;\n  idpConfig?: GetIdpConfigurationResponseContent | null;\n  createStepActions: (\n    stepId: 'provider_details' | 'provider_configure',\n    ref: React.RefObject<ProviderDetailsFormHandle | ProviderConfigureHandle | null>,\n  ) => {\n    onNextAction: () => Promise<boolean>;\n    onPreviousAction: () => Promise<boolean>;\n  };\n}\n\nexport type FormState = {\n  strategy?: IdpStrategy;\n  details?: ProviderDetailsFormValues | null;\n  configure?: ProviderConfigureFormValues | null;\n};\n\nexport type SsoProviderCreateViewProps = {\n  logic: SsoProviderCreateLogicProps;\n  handlers: SsoProviderCreateHandlerProps;\n};\n\nexport interface SsoProviderCreateLogicProps {\n  formData: FormState;\n  strategy?: IdpStrategy;\n  details?: ProviderDetailsFormValues | null;\n  configure?: ProviderConfigureFormValues | null;\n  isCreating: boolean;\n  isLoadingConfig: boolean;\n  filteredStrategies: IdpStrategy[];\n  isLoadingIdpConfig: boolean;\n  idpConfig?: GetIdpConfigurationResponseContent | null;\n  styling?: SsoProviderCreateProps['styling'];\n  customMessages?: SsoProviderCreateProps['customMessages'];\n  backButton?: SsoProviderCreateProps['backButton'];\n}\n\nexport interface SsoProviderCreateHandlerProps {\n  onNext: ((stepId: string, values: Partial<SsoProviderFormValues>) => boolean) | undefined;\n  onPrevious: ((stepId: string, values: Partial<SsoProviderFormValues>) => boolean) | undefined;\n  setFormData: React.Dispatch<React.SetStateAction<FormState>>;\n  detailsRef: React.RefObject<ProviderDetailsFormHandle | null>;\n  configureRef: React.RefObject<ProviderConfigureHandle | null>;\n  handleCreate: () => Promise<void>;\n  createStepActions: (\n    stepId: 'provider_details' | 'provider_configure',\n    ref: React.RefObject<ProviderDetailsFormHandle | ProviderConfigureHandle | null>,\n  ) => {\n    onNextAction: () => Promise<boolean>;\n    onPreviousAction: () => Promise<boolean>;\n  };\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provider/sso-provider-create-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provider/sso-provider-delete-types.ts",
      "content": "/**\n * SSO provider delete types.\n * @module sso-provider-delete-types\n */\n\nimport type {\n  SharedComponentProps,\n  SsoProvideDeleteMessages,\n  SsoProviderDeleteModalContentMessages,\n  IdpKnownResponse,\n  SsoProviderDeleteSchema,\n  SsoProvideRemoveMessages,\n} from '@auth0/universal-components-core';\n\n/** CSS classes for SsoProviderDelete. */\nexport interface SsoProviderDeleteClasses {\n  'ProviderDelete-root'?: string;\n}\n\n/** CSS classes for SsoProviderRemove. */\nexport interface SsoProviderRemoveClasses {\n  'ProviderRemove-root'?: string;\n}\n\n/** Props for SsoProviderDeleteModalContent. */\nexport interface SsoProviderDeleteModalContentProps\n  extends SharedComponentProps<SsoProviderDeleteModalContentMessages, SsoProviderDeleteClasses> {\n  onChange: (value: string) => void;\n  className?: string;\n}\n\n/** Props for SsoProviderDelete component. */\nexport interface SsoProviderDeleteProps\n  extends SharedComponentProps<\n    SsoProvideDeleteMessages,\n    SsoProviderDeleteClasses,\n    SsoProviderDeleteSchema\n  > {\n  provider: IdpKnownResponse;\n  onDelete: (provider: IdpKnownResponse) => Promise<void>;\n  isLoading?: boolean;\n}\n\n/** Props for SsoProviderDeleteModal. */\nexport interface SsoProviderDeleteModalProps\n  extends SharedComponentProps<\n    SsoProvideDeleteMessages,\n    SsoProviderDeleteClasses,\n    SsoProviderDeleteSchema\n  > {\n  className?: string;\n  isOpen: boolean;\n  onClose: () => void;\n  provider: IdpKnownResponse;\n  onDelete: (provider: IdpKnownResponse) => Promise<void>;\n  isLoading?: boolean;\n}\n\n/** Props for SsoProviderRemoveFromOrganization. */\nexport interface SsoProviderRemoveFromOrganizationProps\n  extends SharedComponentProps<\n    SsoProvideRemoveMessages,\n    SsoProviderRemoveClasses,\n    SsoProviderDeleteSchema\n  > {\n  provider: IdpKnownResponse;\n  organizationName: string | undefined;\n  onRemove: (provider: IdpKnownResponse) => Promise<void>;\n  isLoading?: boolean;\n}\n\nexport interface SsoProviderRemoveFromOrganizationModalProps\n  extends SharedComponentProps<\n    SsoProvideRemoveMessages,\n    SsoProviderRemoveClasses,\n    SsoProviderDeleteSchema\n  > {\n  className?: string;\n  isOpen: boolean;\n  onClose: () => void;\n  provider: IdpKnownResponse;\n  organizationName?: string;\n  onRemove: (provider: IdpKnownResponse) => Promise<void>;\n  isLoading?: boolean;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provider/sso-provider-delete-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provider/sso-provider-edit-types.ts",
      "content": "/**\n * SSO provider edit types.\n * @module sso-provider-edit-types\n */\n\nimport type {\n  SharedComponentProps,\n  BackButton,\n  SsoProviderEditMessages,\n  IdpKnownResponse,\n  IdpId,\n  OrganizationPrivate,\n  UpdateIdentityProviderRequestContentPrivate,\n  CreateIdpProvisioningScimTokenResponseContent,\n  CreateIdpProvisioningScimTokenRequestContent,\n  ListIdpProvisioningScimTokensResponseContent,\n  GetIdPProvisioningConfigResponseContent,\n  SsoProviderAttributeMappingsMessages,\n  IdpProvisioningUserAttributeMapItem,\n  IdpUserAttributeMapItem,\n  IdpStrategy,\n  AttributeSyncAlertMessages,\n  GetIdpConfigurationResponseContent,\n} from '@auth0/universal-components-core';\nimport type { LucideIcon } from 'lucide-react';\nimport type React from 'react';\n\nimport type {\n  SsoDomainsTabEditProps,\n  SsoDomainTabClasses,\n  SsoProviderEditDomainsTabSchema,\n} from '@/types/my-organization/idp-management/sso-domain/sso-domain-tab-types';\nimport type {\n  SsoProviderTabClasses,\n  SsoProviderTabEditProps,\n  SsoProviderTabSchemas,\n} from '@/types/my-organization/idp-management/sso-provider/sso-provider-tab-types';\nimport type {\n  SsoProvisioningTabClasses,\n  SsoProvisioningTabEditProps,\n  SsoProvisioningTabSchemas,\n} from '@/types/my-organization/idp-management/sso-provisioning/sso-provisioning-tab-types';\n\n/** Back button for SSO provider edit. */\nexport interface SsoProviderEditBackButton extends Omit<BackButton, 'onClick'> {\n  icon?: LucideIcon;\n  onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\n/** CSS classes for SsoProviderEdit. */\nexport interface SsoProviderEditClasses\n  extends SsoProviderTabClasses,\n    SsoProvisioningTabClasses,\n    SsoDomainTabClasses {\n  'SsoProviderEdit-header'?: string;\n  'SsoProviderEdit-tabs'?: string;\n}\n\n/** SSO provider edit schemas. */\nexport interface SsoProviderEditSchema {\n  provider: SsoProviderTabSchemas;\n  provisioning: SsoProvisioningTabSchemas;\n  domains?: SsoProviderEditDomainsTabSchema;\n}\n\n/** Props for SsoProviderEdit component. */\nexport interface SsoProviderEditProps\n  extends SharedComponentProps<\n    SsoProviderEditMessages,\n    SsoProviderEditClasses,\n    SsoProviderEditSchema\n  > {\n  hideHeader?: boolean;\n  providerId: IdpId;\n  sso?: SsoProviderTabEditProps;\n  provisioning?: SsoProvisioningTabEditProps;\n  domains?: SsoDomainsTabEditProps;\n  backButton?: SsoProviderEditBackButton;\n}\n\n/** useSsoProviderEdit options. */\nexport interface UseSsoProviderEditOptions extends SharedComponentProps {\n  sso?: SsoProviderTabEditProps;\n  provisioning?: SsoProvisioningTabEditProps;\n  domains?: SsoDomainsTabEditProps;\n}\n\nexport interface UseSsoProviderEditReturn {\n  provider: IdpKnownResponse | null;\n  organization: OrganizationPrivate | null;\n  provisioningConfig: GetIdPProvisioningConfigResponseContent | null;\n  isLoading: boolean;\n  isUpdating: boolean;\n  isDeleting: boolean;\n  isRemoving: boolean;\n  isProvisioningUpdating: boolean;\n  isProvisioningDeleting: boolean;\n  isProvisioningLoading: boolean;\n  isScimTokensLoading: boolean;\n  isScimTokenCreating: boolean;\n  isScimTokenDeleting: boolean;\n  isSsoAttributesSyncing: boolean;\n  isProvisioningAttributesSyncing: boolean;\n  hasSsoAttributeSyncWarning: boolean;\n  hasProvisioningAttributeSyncWarning: boolean;\n  fetchProvider: () => Promise<IdpKnownResponse | null>;\n  fetchOrganizationDetails: () => Promise<void>;\n  fetchProvisioning: () => Promise<GetIdPProvisioningConfigResponseContent | null>;\n  updateProvider: (data: UpdateIdentityProviderRequestContentPrivate) => Promise<void>;\n  createProvisioning: () => Promise<void>;\n  deleteProvisioning: () => Promise<void>;\n  listScimTokens: () => Promise<ListIdpProvisioningScimTokensResponseContent | null>;\n  createScimToken: (\n    data: CreateIdpProvisioningScimTokenRequestContent,\n  ) => Promise<CreateIdpProvisioningScimTokenResponseContent | undefined>;\n  deleteScimToken: (idpScimTokenId: string) => Promise<void>;\n  syncSsoAttributes: () => Promise<void>;\n  syncProvisioningAttributes: () => Promise<void>;\n  onDeleteConfirm: () => Promise<void>;\n  onRemoveConfirm: () => Promise<void>;\n}\n\nexport interface SsoProviderAttributeMappingsProps\n  extends SharedComponentProps<SsoProviderAttributeMappingsMessages> {\n  userAttributeMap: IdpProvisioningUserAttributeMapItem[] | IdpUserAttributeMapItem[] | null;\n  strategy: IdpStrategy | null;\n  isProvisioning?: boolean;\n  className?: string;\n}\n\nexport interface SsoProviderAttributeSyncAlertProps {\n  translatorKey?: string;\n  className?: string;\n  onSync?: () => void | Promise<void>;\n  isSyncing?: boolean;\n  customMessages?: Partial<AttributeSyncAlertMessages>;\n}\n\nexport type SsoProviderEditViewProps = {\n  logic: SsoProviderEditLogicProps;\n  handlers: SsoProviderEditHandlerProps;\n};\n\nexport interface SsoProviderEditLogicProps\n  extends SsoProviderEditProps,\n    Omit<\n      UseSsoProviderEditLogicResult,\n      'handleToggleProvider' | 'isLoadingConfig' | 'isLoadingIdpConfig'\n    >,\n    Pick<\n      UseSsoProviderEditReturn,\n      | 'provider'\n      | 'organization'\n      | 'isLoading'\n      | 'isUpdating'\n      | 'isDeleting'\n      | 'isRemoving'\n      | 'isProvisioningUpdating'\n      | 'isProvisioningDeleting'\n      | 'isScimTokensLoading'\n      | 'isScimTokenCreating'\n      | 'isScimTokenDeleting'\n      | 'isSsoAttributesSyncing'\n      | 'isProvisioningAttributesSyncing'\n      | 'hasSsoAttributeSyncWarning'\n      | 'hasProvisioningAttributeSyncWarning'\n    > {}\n\nexport interface SsoProviderEditHandlerProps {\n  updateProvider: (data: UpdateIdentityProviderRequestContentPrivate) => Promise<void>;\n  createProvisioningAction: () => Promise<void>;\n  deleteProvisioningAction: () => Promise<void>;\n  listScimTokens: () => Promise<ListIdpProvisioningScimTokensResponseContent | null>;\n  createScimTokenAction: (\n    data: CreateIdpProvisioningScimTokenRequestContent,\n  ) => Promise<CreateIdpProvisioningScimTokenResponseContent | undefined>;\n  deleteScimTokenAction: (idpScimTokenId: string) => Promise<void>;\n  syncSsoAttributes: () => Promise<void>;\n  syncProvisioningAttributes: () => Promise<void>;\n  onDeleteConfirm: () => Promise<void>;\n  onRemoveConfirm: () => Promise<void>;\n  handleToggleProvider: (enabled: boolean) => Promise<void>;\n}\n\nexport interface UseSsoProviderEditLogicResult {\n  shouldAllowDeletion: boolean;\n  isLoadingConfig: boolean;\n  idpConfig: GetIdpConfigurationResponseContent | null;\n  isLoadingIdpConfig: boolean;\n  showProvisioningTab: boolean;\n  handleToggleProvider: (enabled: boolean) => Promise<void>;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provider/sso-provider-edit-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provider/sso-provider-tab-types.ts",
      "content": "/**\n * SSO provider tab types.\n * @module sso-provider-tab-types\n */\n\nimport type {\n  SharedComponentProps,\n  IdpKnownResponse,\n  OrganizationPrivate,\n  UpdateIdentityProviderRequestContentPrivate,\n  SsoProviderTabMessages,\n  SsoProviderDetailsMessages,\n  SsoProviderDetailsSchema,\n  ComponentAction,\n  GetIdpConfigurationResponseContent,\n} from '@auth0/universal-components-core';\n\nimport type { FormActionsProps } from '@/components/auth0/shared/form-actions';\nimport type { SsoProviderCreateClasses } from '@/types/my-organization/idp-management/sso-provider/sso-provider-create-types';\nimport type {\n  SsoProviderDeleteClasses,\n  SsoProviderRemoveClasses,\n} from '@/types/my-organization/idp-management/sso-provider/sso-provider-delete-types';\n\n/** SSO provider tab edit action props. */\nexport interface SsoProviderTabEditProps {\n  updateAction?: ComponentAction<IdpKnownResponse, IdpKnownResponse>;\n  deleteAction: ComponentAction<IdpKnownResponse, void>;\n  deleteFromOrganizationAction: ComponentAction<IdpKnownResponse, void>;\n}\n\n/** CSS classes for SsoProviderTab. */\nexport interface SsoProviderTabClasses\n  extends SsoProviderDetailsClasses,\n    SsoProviderDeleteClasses,\n    SsoProviderRemoveClasses {\n  'SsoProviderAttributeSyncAlert-root'?: string;\n}\n\n/** Form actions for SSO provider details. */\nexport interface SsoProviderDetailsFormActions extends Omit<FormActionsProps, 'nextAction'> {\n  nextAction?: {\n    disabled: boolean;\n    onClick?: (data: UpdateIdentityProviderRequestContentPrivate) => Promise<void>;\n  };\n}\n\n/** SSO provider tab schemas. */\nexport interface SsoProviderTabSchemas extends SsoProviderDetailsSchema {}\n\n/** Props for SsoProviderTab component. */\nexport interface SsoProviderTabProps\n  extends SharedComponentProps<\n    SsoProviderTabMessages,\n    SsoProviderTabClasses,\n    SsoProviderTabSchemas\n  > {\n  formActions: SsoProviderDetailsFormActions;\n  idpConfig: GetIdpConfigurationResponseContent | null;\n  shouldAllowDeletion: boolean;\n  provider: IdpKnownResponse | null;\n  onDelete: (provider: IdpKnownResponse) => Promise<void>;\n  onRemove: (provider: IdpKnownResponse) => Promise<void>;\n  organization: OrganizationPrivate | null;\n  isDeleting: boolean;\n  isRemoving: boolean;\n  hasSsoAttributeSyncWarning?: boolean;\n  onAttributeSync?: () => void | Promise<void>;\n  isSyncingAttributes?: boolean;\n}\n\nexport interface ProviderDetailsClasses\n  extends Omit<\n    SsoProviderCreateClasses,\n    'SsoProviderCreate-header' | 'SsoProviderCreate-wizard' | 'ProviderSelect-root'\n  > {}\n\nexport interface ProviderConfigureFieldsClasses\n  extends Omit<\n    SsoProviderCreateClasses,\n    'SsoProviderCreate-header' | 'SsoProviderCreate-wizard' | 'ProviderSelect-root'\n  > {}\n\nexport interface SsoProviderDetailsClasses {\n  'SsoProviderDetails-formActions'?: string;\n  'ProviderDetails-root'?: string;\n  'ProviderConfigure-root'?: string;\n  'SsoProvider-attributeMapping'?: string;\n  'SsoProviderDetails-FormActions'?: string;\n}\n\nexport interface SsoProviderDetailsProps\n  extends SharedComponentProps<SsoProviderDetailsMessages, SsoProviderDetailsClasses> {\n  provider: IdpKnownResponse;\n  idpConfig: GetIdpConfigurationResponseContent | null;\n  readOnly?: boolean;\n  formActions?: SsoProviderDetailsFormActions;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provider/sso-provider-tab-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provisioning/provisioning-manage-token-types.ts",
      "content": "/**\n * Provisioning manage token types.\n * @module provisioning-manage-token-types\n */\n\nimport type {\n  SharedComponentProps,\n  ProvisioningManageTokenMessages,\n  ListIdpProvisioningScimTokensResponseContent,\n  CreateIdpProvisioningScimTokenRequestContent,\n  CreateIdpProvisioningScimTokenResponseContent,\n  ProvisioningDeleteTokenModalMessages,\n  ProvisioningCreateTokenModalMessages,\n} from '@auth0/universal-components-core';\n\n/** CSS classes for ProvisioningManageToken. */\nexport interface ProvisioningManageTokenClasses {\n  'ProvisioningManageToken-root'?: string;\n  'ProvisioningManageToken-header'?: string;\n  'ProvisioningManageToken-table'?: string;\n  'ProvisioningManageToken-emptyState'?: string;\n}\n\n/** Props for ProvisioningManageToken component. */\nexport interface ProvisioningManageTokenProps\n  extends SharedComponentProps<ProvisioningManageTokenMessages, ProvisioningManageTokenClasses> {\n  isScimTokensLoading: boolean;\n  isScimTokenCreating: boolean;\n  isScimTokenDeleting: boolean;\n  onListScimTokens: () => Promise<ListIdpProvisioningScimTokensResponseContent | null>;\n  onCreateScimToken: (\n    data: CreateIdpProvisioningScimTokenRequestContent,\n  ) => Promise<CreateIdpProvisioningScimTokenResponseContent | undefined>;\n  onDeleteScimToken: (idpScimTokenId: string) => Promise<void>;\n}\n\n/** Props for ProvisioningDeleteTokenModal. */\nexport interface ProvisioningDeleteTokenModalProps\n  extends SharedComponentProps<ProvisioningDeleteTokenModalMessages> {\n  open: boolean;\n  isLoading: boolean;\n  onOpenChange: (open: boolean) => void;\n  tokenId: string | null;\n  onConfirm: () => void;\n}\n\n/** Props for ProvisioningCreateTokenModal. */\nexport interface ProvisioningCreateTokenModalProps\n  extends SharedComponentProps<ProvisioningCreateTokenModalMessages> {\n  open: boolean;\n  isLoading: boolean;\n  onOpenChange: (open: boolean) => void;\n  createdToken: CreateIdpProvisioningScimTokenResponseContent | null;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provisioning/provisioning-manage-token-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provisioning/provisioning-token-types.ts",
      "content": "/**\n * Provisioning token modal content types.\n * @module provisioning-token-types\n */\n\nimport type {\n  SharedComponentProps,\n  ProvisioningCreateTokenModalContentMessages,\n  ProvisioningDeleteTokenModalContentMessages,\n} from '@auth0/universal-components-core';\n\n/** CSS classes for provisioning token components. */\nexport interface ProvisioningTokenClasses {\n  'ProvisioningToken-root'?: string;\n  'ProvisioningCreateTokenModal-root'?: string;\n}\n\n/** Props for ProvisioningCreateTokenModalContent. */\nexport interface ProvisioningCreateTokenModalContentProps\n  extends SharedComponentProps<\n    ProvisioningCreateTokenModalContentMessages,\n    ProvisioningTokenClasses\n  > {\n  token: string;\n  tokenId: string;\n  className?: string;\n}\n\n/** Props for ProvisioningDeleteTokenModalContent. */\nexport interface ProvisioningDeleteTokenModalContentProps\n  extends SharedComponentProps<\n    ProvisioningDeleteTokenModalContentMessages,\n    ProvisioningTokenClasses\n  > {\n  className?: string;\n  tokenId?: string;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provisioning/provisioning-token-types.ts"
    },
    {
      "path": "src/types/my-organization/idp-management/sso-provisioning/sso-provisioning-tab-types.ts",
      "content": "/**\n * SSO provisioning tab types.\n * @module sso-provisioning-tab-types\n */\n\nimport type {\n  SharedComponentProps,\n  SsoProvisioningTabMessages,\n  IdpKnownResponse,\n  CreateIdpProvisioningScimTokenRequestContent,\n  ListIdpProvisioningScimTokensResponseContent,\n  CreateIdpProvisioningScimTokenResponseContent,\n  SsoProvisioningDetailsMessages,\n  GetIdPProvisioningConfigResponseContent,\n  SsoProvisioningDeleteMessages,\n  ComponentAction,\n  CreateIdPProvisioningConfigResponseContent,\n} from '@auth0/universal-components-core';\n\nimport type { ProvisioningManageTokenClasses } from '@/types/my-organization/idp-management/sso-provisioning/provisioning-manage-token-types';\n\n/** SSO provisioning tab edit action props. */\nexport interface SsoProvisioningTabEditProps {\n  createAction?: ComponentAction<IdpKnownResponse, CreateIdPProvisioningConfigResponseContent>;\n  deleteAction?: ComponentAction<IdpKnownResponse, void>;\n  createScimTokenAction?: ComponentAction<\n    IdpKnownResponse,\n    CreateIdpProvisioningScimTokenResponseContent\n  >;\n  deleteScimTokenAction?: ComponentAction<IdpKnownResponse, void>;\n}\n\n/** CSS classes for SsoProvisioningTab. */\nexport interface SsoProvisioningTabClasses {\n  'SsoProvisioningTab-root'?: string;\n  'SsoProvisioningDetails-root'?: string;\n  'SsoProvisioning-attributeMapping'?: string;\n  'SsoProvisioningDetails-formActions'?: string;\n  'SsoProviderAttributeSyncAlert-root'?: string;\n}\n\n/** Props for SsoProvisioningTab component. */\nexport interface SsoProvisioningTabProps\n  extends SharedComponentProps<SsoProvisioningTabMessages, SsoProvisioningTabClasses> {\n  provider: IdpKnownResponse;\n  isProvisioningUpdating: boolean;\n  isProvisioningDeleting: boolean;\n  isScimTokensLoading: boolean;\n  isScimTokenCreating: boolean;\n  isScimTokenDeleting: boolean;\n  onCreateProvisioning: () => Promise<void>;\n  onDeleteProvisioning: () => Promise<void>;\n  onListScimTokens: () => Promise<ListIdpProvisioningScimTokensResponseContent | null>;\n  onCreateScimToken: (\n    data: CreateIdpProvisioningScimTokenRequestContent,\n  ) => Promise<CreateIdpProvisioningScimTokenResponseContent | undefined>;\n  onDeleteScimToken: (idpScimTokenId: string) => Promise<void>;\n  hasProvisioningAttributeSyncWarning?: boolean;\n  onAttributeSync?: () => void | Promise<void>;\n  isSyncingAttributes?: boolean;\n}\n\nexport interface SsoProvisioningTabSchemas {}\n\nexport interface SsoProvisioningDetailsClasses extends ProvisioningManageTokenClasses {\n  'SsoProvisioningDetails-root'?: string;\n  'SsoProvisioningDetails-formActions'?: string;\n  'SsoProvisioning-attributeMapping'?: string;\n}\n\nexport interface SsoProvisioningDeleteModalProps\n  extends SharedComponentProps<SsoProvisioningDeleteMessages> {\n  open: boolean;\n  isLoading: boolean;\n  onOpenChange: (open: boolean) => void;\n  onConfirm: () => void;\n}\n\nexport interface SsoProvisioningDetailsProps\n  extends SharedComponentProps<\n    SsoProvisioningDetailsMessages,\n    SsoProvisioningDetailsClasses,\n    SsoProvisioningTabSchemas\n  > {\n  provider: IdpKnownResponse;\n  provisioningConfig: GetIdPProvisioningConfigResponseContent | null;\n  isScimTokensLoading: boolean;\n  isScimTokenCreating: boolean;\n  isScimTokenDeleting: boolean;\n  onListScimTokens: () => Promise<ListIdpProvisioningScimTokensResponseContent | null>;\n  onCreateScimToken: (\n    data: CreateIdpProvisioningScimTokenRequestContent,\n  ) => Promise<CreateIdpProvisioningScimTokenResponseContent | undefined>;\n  onDeleteScimToken: (idpScimTokenId: string) => Promise<void>;\n}\n",
      "type": "registry:component",
      "target": "types/my-organization/idp-management/sso-provisioning/sso-provisioning-tab-types.ts"
    },
    {
      "path": "src/types/theme-types.ts",
      "content": "/**\n * Theme configuration types.\n * @module theme-types\n */\n\nimport type { StylingVariables } from '@auth0/universal-components-core';\nimport type React from 'react';\n\n/** Theme settings for provider. */\nexport interface ThemeSettings {\n  theme?: 'default' | 'minimal' | 'rounded';\n  mode?: 'light' | 'dark';\n  variables?: StylingVariables;\n}\n\n/** Theme input for ThemeProvider. */\nexport type ThemeInput = {\n  theme?: 'default' | 'minimal' | 'rounded';\n  mode?: 'light' | 'dark';\n  variables?: StylingVariables;\n  loader?: React.ReactNode;\n};\n\n/** Theme context value. */\nexport type ThemeContextValue = {\n  theme?: 'default' | 'minimal' | 'rounded';\n  isDarkMode?: boolean;\n  variables: StylingVariables;\n  loader: React.ReactNode | null;\n};\n",
      "type": "registry:component",
      "target": "types/theme-types.ts"
    },
    {
      "path": "src/types/toast-types.ts",
      "content": "/**\n * Toast notification types.\n * @module toast-types\n */\n\nimport type { ReactNode } from 'react';\nimport type { ExternalToast } from 'sonner';\n\n/** Toast notification type. */\nexport type ToastType = 'success' | 'info' | 'warning' | 'error';\n\n/** Toast position options. */\nexport type ToastPosition =\n  | 'top-left'\n  | 'top-right'\n  | 'bottom-left'\n  | 'bottom-right'\n  | 'top-center'\n  | 'bottom-center';\n\n/** Custom toast method signature. */\nexport interface CustomToastMethod {\n  (message: string): void;\n}\n\n/** Custom toast methods for overriding default behavior. */\nexport interface CustomToastMethods {\n  success?: CustomToastMethod;\n  error?: CustomToastMethod;\n  warning?: CustomToastMethod;\n  info?: CustomToastMethod;\n  dismiss?: (toastId?: string) => void;\n}\n\n/** Sonner toast settings. */\nexport interface SonnerSettings {\n  position?: ToastPosition;\n  maxToasts?: number;\n  duration?: number;\n  dismissible?: boolean;\n  closeButton?: boolean;\n}\n\n/** Toast provider configuration. */\nexport type ToastSettings =\n  | { provider?: 'sonner'; settings?: SonnerSettings }\n  | { provider: 'custom'; methods: CustomToastMethods };\n\n/** Toast options for showToast. */\nexport interface ToastOptions {\n  type: ToastType;\n  message: string;\n  className?: string;\n  icon?: ReactNode;\n  data?: ExternalToast;\n}\n\n/** Default toast settings. */\nexport const DEFAULT_TOAST_SETTINGS: ToastSettings = {\n  provider: 'sonner',\n  settings: {\n    position: 'top-right',\n    closeButton: true,\n  },\n} as const;\n",
      "type": "registry:component",
      "target": "types/toast-types.ts"
    },
    {
      "path": "src/lib/constants/form-constants.ts",
      "content": "/**\n * Form constants used across the components.\n * @internal\n */\n\nexport const FORM_VALIDATION_MODE = 'onTouched';\nexport const FORM_REVALIDATE_MODE = 'onChange';\n",
      "type": "registry:component",
      "target": "lib/constants/form-constants.ts"
    },
    {
      "path": "src/lib/utils.ts",
      "content": "/**\n * Tailwind CSS utility functions.\n * @module utils\n * @internal\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges class names with Tailwind CSS conflict resolution.\n * @param inputs - Input values to process\n * @returns The merged class name string\n * @internal\n */\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs));\n}\n",
      "type": "registry:component",
      "target": "lib/utils.ts"
    },
    {
      "path": "src/lib/utils/my-organization/domain-management/domain-management-utils.ts",
      "content": "/**\n * Domain management utility functions.\n * @module domain-management-utils\n * @internal\n */\n\nimport type { Domain } from '@/types/my-organization/domain-management/domain-table-types';\n\n/**\n * Returns badge variant for domain status.\n * @param status - Current status\n * @returns The badge variant\n * @internal\n */\nexport function getStatusBadgeVariant(\n  status: Domain['status'],\n): 'success' | 'warning' | 'destructive' | 'outline' {\n  switch (status) {\n    case 'verified':\n      return 'success';\n    case 'pending':\n      return 'warning';\n    case 'failed':\n      return 'destructive';\n    default:\n      return 'outline';\n  }\n}\n",
      "type": "registry:component",
      "target": "lib/utils/my-organization/domain-management/domain-management-utils.ts"
    },
    {
      "path": "src/styles/globals.css",
      "content": "@import 'tailwindcss' important;\n@import '@auth0/universal-components-core/styles/globals.css';\n",
      "type": "registry:component",
      "target": "styles/globals.css"
    },
    {
      "path": "src/styles/tailwind.css",
      "content": "/* Scan component library for class names */\n@source \"./**/*.js\";\n",
      "type": "registry:component",
      "target": "styles/tailwind.css"
    }
  ],
  "meta": {
    "coreVersion": "2.1.0"
  }
}
