@burdenoff/microfe-devportal 2026.609.4 → 2026.611.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/devportal/DevportalRoot.js +6 -1
  2. package/dist/devportal/DevportalRoot.js.map +1 -1
  3. package/dist/devportal/DevportalRoutes.js +169 -158
  4. package/dist/devportal/DevportalRoutes.js.map +1 -1
  5. package/dist/devportal/hooks/usePackageUpload.js +120 -0
  6. package/dist/devportal/hooks/usePackageUpload.js.map +1 -0
  7. package/dist/devportal/pages/AnalyticsDashboardPage.js +73 -62
  8. package/dist/devportal/pages/AnalyticsDashboardPage.js.map +1 -1
  9. package/dist/devportal/pages/AppLogsPage.js +89 -82
  10. package/dist/devportal/pages/AppLogsPage.js.map +1 -1
  11. package/dist/devportal/pages/ApplicationDetailPage.js +948 -367
  12. package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
  13. package/dist/devportal/pages/ApplicationVersionsPage.js +56 -45
  14. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  15. package/dist/devportal/pages/CreateApiKeyPage.js +30 -32
  16. package/dist/devportal/pages/CreateApiKeyPage.js.map +1 -1
  17. package/dist/devportal/pages/CreateApplicationPage.js +8 -3
  18. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  19. package/dist/devportal/pages/CreateOAuthClientPage.js +4 -4
  20. package/dist/devportal/pages/CreateOAuthClientPage.js.map +1 -1
  21. package/dist/devportal/pages/CreateOrganizationPage.js +233 -228
  22. package/dist/devportal/pages/CreateOrganizationPage.js.map +1 -1
  23. package/dist/devportal/pages/CreateWebhookPage.js +159 -148
  24. package/dist/devportal/pages/CreateWebhookPage.js.map +1 -1
  25. package/dist/devportal/pages/DelegationsPage.js +1 -1
  26. package/dist/devportal/pages/DelegationsPage.js.map +1 -1
  27. package/dist/devportal/pages/EditApplicationPage.js +25 -17
  28. package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
  29. package/dist/devportal/pages/ListingPreviewPage.js +159 -153
  30. package/dist/devportal/pages/ListingPreviewPage.js.map +1 -1
  31. package/dist/devportal/pages/OAuthClientDetailPage.js.map +1 -1
  32. package/dist/devportal/pages/OAuthClientsPage.js +2 -2
  33. package/dist/devportal/pages/OAuthClientsPage.js.map +1 -1
  34. package/dist/devportal/pages/OrganizationDetailPage.js +158 -153
  35. package/dist/devportal/pages/OrganizationDetailPage.js.map +1 -1
  36. package/dist/devportal/pages/OrganizationMembersPage.js +223 -212
  37. package/dist/devportal/pages/OrganizationMembersPage.js.map +1 -1
  38. package/dist/devportal/pages/PublishPage.js +172 -165
  39. package/dist/devportal/pages/PublishPage.js.map +1 -1
  40. package/dist/devportal/pages/ResourcesPage.js.map +1 -1
  41. package/dist/devportal/pages/RevenueDashboardPage.js +405 -0
  42. package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -0
  43. package/dist/devportal/pages/SetupPage.js +186 -181
  44. package/dist/devportal/pages/SetupPage.js.map +1 -1
  45. package/dist/devportal/pages/StoreSubmissionPage.js +76 -97
  46. package/dist/devportal/pages/StoreSubmissionPage.js.map +1 -1
  47. package/dist/devportal/pages/WebhookDetailPage.js +172 -154
  48. package/dist/devportal/pages/WebhookDetailPage.js.map +1 -1
  49. package/dist/devportal/pages/WebhooksPage.js +218 -200
  50. package/dist/devportal/pages/WebhooksPage.js.map +1 -1
  51. package/dist/devportal/providers/DevportalProvider.js +16 -13
  52. package/dist/devportal/providers/DevportalProvider.js.map +1 -1
  53. package/dist/devportal/types/index.js.map +1 -1
  54. package/dist/generated/global-operations.js +310 -225
  55. package/dist/generated/global-operations.js.map +1 -1
  56. package/package.json +1 -1
  57. package/dist/devportal/pages/RevenueRedirectPage.js +0 -14
  58. package/dist/devportal/pages/RevenueRedirectPage.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CreateOrganizationPage.js","names":[],"sources":["../../../src/devportal/pages/CreateOrganizationPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { X, Info, Building2 } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport {\n InputField,\n TextareaField,\n SelectField,\n} from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport type { DeveloperOrgTier } from \"../types\";\nimport { useCreateOrganizationMutation } from \"../../generated/global-operations\";\nimport { useDevportalEventBus } from \"../events\";\n\ninterface CreateOrganizationFormData {\n name: string;\n slug: string;\n description: string;\n tier: DeveloperOrgTier;\n websiteUrl: string;\n contactEmail: string;\n supportEmail: string;\n legalEntityName: string;\n legalEntityType: string;\n taxId: string;\n taxCountry: string;\n streetAddress: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n contactEmail?: string;\n supportEmail?: string;\n}\n\nconst TIER_OPTIONS = [\n { value: \"FREE\", label: \"Free - Personal projects and testing\" },\n {\n value: \"DEVELOPER\",\n label: \"Developer - Small teams, 3 apps, 1M API calls/month\",\n },\n {\n value: \"PROFESSIONAL\",\n label: \"Professional - Growing teams, 10 apps, 10M API calls/month\",\n },\n {\n value: \"ENTERPRISE\",\n label: \"Enterprise - Large organizations, unlimited apps\",\n },\n];\n\nconst LEGAL_ENTITY_TYPES = [\n { value: \"\", label: \"Select entity type\" },\n { value: \"individual\", label: \"Individual / Sole Proprietor\" },\n { value: \"llc\", label: \"Limited Liability Company (LLC)\" },\n { value: \"corporation\", label: \"Corporation\" },\n { value: \"partnership\", label: \"Partnership\" },\n { value: \"nonprofit\", label: \"Non-Profit Organization\" },\n { value: \"other\", label: \"Other\" },\n];\n\nconst COUNTRIES = [\n { value: \"\", label: \"Select country\" },\n { value: \"US\", label: \"United States\" },\n { value: \"GB\", label: \"United Kingdom\" },\n { value: \"CA\", label: \"Canada\" },\n { value: \"AU\", label: \"Australia\" },\n { value: \"DE\", label: \"Germany\" },\n { value: \"FR\", label: \"France\" },\n { value: \"IN\", label: \"India\" },\n { value: \"JP\", label: \"Japan\" },\n { value: \"SG\", label: \"Singapore\" },\n { value: \"NL\", label: \"Netherlands\" },\n];\n\n/**\n * Create new organization page\n */\nexport const CreateOrganizationPage: FC = () => {\n const { navigate, basePath } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [errors, setErrors] = useState<FormErrors>({});\n const [currentStep, setCurrentStep] = useState<\"basic\" | \"billing\">(\"basic\");\n const [createOrganization, { loading: isSubmitting }] =\n useCreateOrganizationMutation();\n const bus = useDevportalEventBus();\n\n const [formData, setFormData] = useState<CreateOrganizationFormData>({\n name: \"\",\n slug: \"\",\n description: \"\",\n tier: \"FREE\",\n websiteUrl: \"\",\n contactEmail: \"\",\n supportEmail: \"\",\n legalEntityName: \"\",\n legalEntityType: \"\",\n taxId: \"\",\n taxCountry: \"\",\n streetAddress: \"\",\n city: \"\",\n state: \"\",\n postalCode: \"\",\n country: \"\",\n });\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n const generateSlug = (name: string): string => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n };\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const name = e.target.value;\n setFormData((prev) => ({\n ...prev,\n name,\n slug: prev.slug || generateSlug(name),\n }));\n if (errors.name) {\n setErrors((prev) => ({ ...prev, name: undefined }));\n }\n };\n\n const handleChange = (\n field: keyof CreateOrganizationFormData,\n value: string,\n ) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n if (errors[field as keyof FormErrors]) {\n setErrors((prev) => ({ ...prev, [field]: undefined }));\n }\n };\n\n const validateBasicInfo = (): boolean => {\n const newErrors: FormErrors = {};\n\n if (!formData.name.trim()) {\n newErrors.name = tr(\n \"devportal.orgNameRequired\",\n \"Organization name is required\",\n );\n } else if (formData.name.length < 2) {\n newErrors.name = tr(\n \"devportal.orgNameTooShort\",\n \"Name must be at least 2 characters\",\n );\n } else if (formData.name.length > 100) {\n newErrors.name = tr(\n \"devportal.nameTooLong\",\n \"Name must be less than 100 characters\",\n );\n }\n\n if (!formData.slug.trim()) {\n newErrors.slug = tr(\"devportal.slugRequired\", \"Slug is required\");\n } else if (!/^[a-z0-9-]+$/.test(formData.slug)) {\n newErrors.slug = tr(\n \"devportal.slugInvalid\",\n \"Slug can only contain lowercase letters, numbers, and hyphens\",\n );\n }\n\n if (\n formData.contactEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.contactEmail)\n ) {\n newErrors.contactEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n if (\n formData.supportEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.supportEmail)\n ) {\n newErrors.supportEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleNext = () => {\n if (validateBasicInfo()) {\n setCurrentStep(\"billing\");\n }\n };\n\n const handleBack = () => {\n setCurrentStep(\"basic\");\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validateBasicInfo()) {\n setCurrentStep(\"basic\");\n return;\n }\n\n try {\n // Build legal address if any fields are provided\n const legalAddress =\n formData.streetAddress ||\n formData.city ||\n formData.state ||\n formData.postalCode ||\n formData.country\n ? {\n street: formData.streetAddress || undefined,\n city: formData.city || undefined,\n state: formData.state || undefined,\n postalCode: formData.postalCode || undefined,\n country: formData.country || undefined,\n }\n : undefined;\n\n const result = await createOrganization({\n variables: {\n input: {\n name: formData.name,\n slug: formData.slug || undefined,\n description: formData.description || undefined,\n websiteUrl: formData.websiteUrl || undefined,\n contactEmail: formData.contactEmail || undefined,\n supportEmail: formData.supportEmail || undefined,\n legalEntityName: formData.legalEntityName || undefined,\n legalEntityType: formData.legalEntityType || undefined,\n legalAddress,\n // Note: tier is stored in metadata since it's not in the input schema\n metadata:\n formData.tier !== \"FREE\" ? { tier: formData.tier } : undefined,\n },\n },\n });\n\n if (result.data?.createDeveloperOrganization?.id) {\n bus.emit(\"devportal.org.created\", {\n organizationId: result.data.createDeveloperOrganization.id,\n name: formData.name,\n });\n // Navigate to the new organization's detail page\n handleNavigate(\n `/organizations/${result.data.createDeveloperOrganization.id}`,\n );\n }\n } catch (error) {\n console.error(\"Failed to create organization:\", error);\n }\n };\n\n const handleCancel = () => {\n handleNavigate(\"/organizations\");\n };\n\n const tierInfo = {\n FREE: {\n apps: 1,\n apiCalls: \"100K\",\n storage: \"1GB\",\n members: 2,\n price: \"Free\",\n },\n DEVELOPER: {\n apps: 3,\n apiCalls: \"1M\",\n storage: \"5GB\",\n members: 5,\n price: \"$29/mo\",\n },\n PROFESSIONAL: {\n apps: 10,\n apiCalls: \"10M\",\n storage: \"25GB\",\n members: 15,\n price: \"$99/mo\",\n },\n ENTERPRISE: {\n apps: \"Unlimited\",\n apiCalls: \"100M+\",\n storage: \"100GB+\",\n members: \"Unlimited\",\n price: \"Custom\",\n },\n };\n\n return (\n <PermissionGuard permission={DEVPORTAL_PERMISSIONS.ORG_CREATE}>\n <PageLayout\n title={tr(\"devportal.createOrganization\", \"Create Organization\")}\n description={tr(\n \"devportal.createOrganizationDescription\",\n \"Set up a developer organization to collaborate with your team\",\n )}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n {/* Progress Steps */}\n <div className=\"flex items-center gap-4 mb-8\">\n <div className=\"flex items-center gap-2\">\n <div\n className={`flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium ${\n currentStep === \"basic\"\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/20 text-primary\"\n }`}\n >\n 1\n </div>\n <span\n className={`text-sm font-medium ${currentStep === \"basic\" ? \"text-foreground\" : \"text-muted-foreground\"}`}\n >\n {tr(\"devportal.basicInfo\", \"Basic Info\")}\n </span>\n </div>\n <div className=\"h-px flex-1 bg-border\" />\n <div className=\"flex items-center gap-2\">\n <div\n className={`flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium ${\n currentStep === \"billing\"\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground\"\n }`}\n >\n 2\n </div>\n <span\n className={`text-sm font-medium ${currentStep === \"billing\" ? \"text-foreground\" : \"text-muted-foreground\"}`}\n >\n {tr(\"devportal.billingAndLegal\", \"Billing & Legal\")}\n </span>\n </div>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-8 max-w-3xl\">\n {currentStep === \"basic\" && (\n <>\n {/* Basic Information */}\n <PageSection\n title={tr(\n \"devportal.organizationDetails\",\n \"Organization Details\",\n )}\n description={tr(\n \"devportal.organizationDetailsDescription\",\n \"Basic information about your organization\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\n \"devportal.organizationName\",\n \"Organization Name\",\n )}\n value={formData.name}\n onChange={handleNameChange}\n placeholder={tr(\n \"devportal.organizationNamePlaceholder\",\n \"Acme Development\",\n )}\n required\n error={errors.name}\n hint={tr(\n \"devportal.organizationNameHint\",\n \"Your organization's display name\",\n )}\n />\n\n <InputField\n label={tr(\"devportal.slug\", \"Slug\")}\n value={formData.slug}\n onChange={(e) =>\n handleChange(\"slug\", e.target.value.toLowerCase())\n }\n placeholder={tr(\"devportal.orgSlugPlaceholder\", \"acme-dev\")}\n required\n error={errors.slug}\n hint={tr(\n \"devportal.slugHint\",\n \"URL-friendly identifier (auto-generated from name)\",\n )}\n />\n\n <TextareaField\n label={tr(\"devportal.description\", \"Description\")}\n value={formData.description}\n onChange={(e) =>\n handleChange(\"description\", e.target.value)\n }\n placeholder={tr(\n \"devportal.orgDescriptionPlaceholder\",\n \"Tell us about your organization...\",\n )}\n rows={3}\n />\n\n <InputField\n label={tr(\"devportal.websiteUrl\", \"Website URL\")}\n type=\"url\"\n value={formData.websiteUrl}\n onChange={(e) => handleChange(\"websiteUrl\", e.target.value)}\n placeholder=\"https://example.com\"\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.contactEmail\", \"Contact Email\")}\n type=\"email\"\n value={formData.contactEmail}\n onChange={(e) =>\n handleChange(\"contactEmail\", e.target.value)\n }\n placeholder=\"contact@example.com\"\n error={errors.contactEmail}\n />\n\n <InputField\n label={tr(\"devportal.supportEmail\", \"Support Email\")}\n type=\"email\"\n value={formData.supportEmail}\n onChange={(e) =>\n handleChange(\"supportEmail\", e.target.value)\n }\n placeholder=\"support@example.com\"\n error={errors.supportEmail}\n />\n </div>\n </div>\n </PageSection>\n\n {/* Tier Selection */}\n <PageSection\n title={tr(\"devportal.selectPlan\", \"Select Plan\")}\n description={tr(\n \"devportal.selectPlanDescription\",\n \"Choose a plan that fits your needs\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {TIER_OPTIONS.map((tier) => {\n const info = tierInfo[tier.value as DeveloperOrgTier];\n const isSelected = formData.tier === tier.value;\n return (\n <button\n key={tier.value}\n type=\"button\"\n onClick={() => handleChange(\"tier\", tier.value)}\n className={`rounded-lg border p-4 text-left transition-colors ${\n isSelected\n ? \"border-primary bg-primary/5 ring-2 ring-primary\"\n : \"hover:border-muted-foreground/50\"\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-medium\">{tier.value}</p>\n <p className=\"text-sm text-muted-foreground\">\n {info.price}\n </p>\n </div>\n <div\n className={`h-4 w-4 rounded-full border-2 ${\n isSelected\n ? \"border-primary bg-primary\"\n : \"border-muted-foreground\"\n }`}\n >\n {isSelected && (\n <div className=\"h-full w-full flex items-center justify-center\">\n <div className=\"h-1.5 w-1.5 rounded-full bg-bg-surface\" />\n </div>\n )}\n </div>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs text-muted-foreground\">\n <span>\n {info.apps} {tr(\"devportal.apps\", \"apps\")}\n </span>\n <span>\n {info.apiCalls}{\" \"}\n {tr(\"devportal.apiCalls\", \"API calls\")}\n </span>\n <span>\n {info.storage} {tr(\"devportal.storage\", \"storage\")}\n </span>\n <span>\n {info.members} {tr(\"devportal.members\", \"members\")}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n </PageSection>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t pt-6\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted transition-colors\"\n >\n <X size={16} />\n {tr(\"devportal.cancel\", \"Cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={handleNext}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n {tr(\"devportal.continue\", \"Continue\")}\n </button>\n </div>\n </>\n )}\n\n {currentStep === \"billing\" && (\n <>\n {/* Legal Entity */}\n <PageSection\n title={tr(\"devportal.legalInformation\", \"Legal Information\")}\n description={tr(\n \"devportal.legalInformationDescription\",\n \"Required for payouts and compliance (optional for Free tier)\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.legalEntityName\", \"Legal Entity Name\")}\n value={formData.legalEntityName}\n onChange={(e) =>\n handleChange(\"legalEntityName\", e.target.value)\n }\n placeholder={tr(\n \"devportal.legalEntityNamePlaceholder\",\n \"Acme Inc.\",\n )}\n hint={tr(\n \"devportal.legalEntityNameHint\",\n \"Your registered business name\",\n )}\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <SelectField\n label={tr(\"devportal.entityType\", \"Entity Type\")}\n value={formData.legalEntityType}\n onChange={(e) =>\n handleChange(\"legalEntityType\", e.target.value)\n }\n options={LEGAL_ENTITY_TYPES}\n />\n\n <SelectField\n label={tr(\"devportal.taxCountry\", \"Tax Country\")}\n value={formData.taxCountry}\n onChange={(e) =>\n handleChange(\"taxCountry\", e.target.value)\n }\n options={COUNTRIES}\n />\n </div>\n\n <InputField\n label={tr(\n \"devportal.taxIdVatNumber\",\n \"Tax ID / VAT Number\",\n )}\n value={formData.taxId}\n onChange={(e) => handleChange(\"taxId\", e.target.value)}\n placeholder=\"XX-XXXXXXX\"\n hint={tr(\n \"devportal.taxIdHint\",\n \"Your business tax identification number\",\n )}\n />\n </div>\n </PageSection>\n\n {/* Business Address */}\n <PageSection\n title={tr(\"devportal.businessAddress\", \"Business Address\")}\n description={tr(\n \"devportal.businessAddressDescription\",\n \"Used for invoicing and legal documents\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.streetAddress\", \"Street Address\")}\n value={formData.streetAddress}\n onChange={(e) =>\n handleChange(\"streetAddress\", e.target.value)\n }\n placeholder={tr(\n \"devportal.streetAddressPlaceholder\",\n \"123 Main Street\",\n )}\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.city\", \"City\")}\n value={formData.city}\n onChange={(e) => handleChange(\"city\", e.target.value)}\n placeholder={tr(\n \"devportal.cityPlaceholder\",\n \"San Francisco\",\n )}\n />\n\n <InputField\n label={tr(\"devportal.stateProvince\", \"State / Province\")}\n value={formData.state}\n onChange={(e) => handleChange(\"state\", e.target.value)}\n placeholder={tr(\n \"devportal.stateProvincePlaceholder\",\n \"California\",\n )}\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.postalCode\", \"Postal Code\")}\n value={formData.postalCode}\n onChange={(e) =>\n handleChange(\"postalCode\", e.target.value)\n }\n placeholder={tr(\n \"devportal.postalCodePlaceholder\",\n \"94102\",\n )}\n />\n\n <SelectField\n label={tr(\"devportal.country\", \"Country\")}\n value={formData.country}\n onChange={(e) => handleChange(\"country\", e.target.value)}\n options={COUNTRIES}\n />\n </div>\n </div>\n </PageSection>\n\n {/* Info banner */}\n <div className=\"rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 flex gap-3\">\n <Info\n size={20}\n className=\"text-accent-blue flex-shrink-0 mt-0.5\"\n />\n <div className=\"text-sm text-status-info-text\">\n <p className=\"font-medium\">\n {tr(\"devportal.canAddLater\", \"You can add this later\")}\n </p>\n <p className=\"mt-1 text-status-info-text\">\n {tr(\n \"devportal.legalInfoOptionalNote\",\n \"Legal and billing information is only required when you want to receive payouts from app sales or upgrade to a paid plan.\",\n )}\n </p>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-between border-t pt-6\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted transition-colors\"\n >\n {tr(\"devportal.back\", \"Back\")}\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <>\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {tr(\"devportal.creating\", \"Creating...\")}\n </>\n ) : (\n <>\n <Building2 size={16} />\n {tr(\n \"devportal.createOrganization\",\n \"Create Organization\",\n )}\n </>\n )}\n </button>\n </div>\n </>\n )}\n </form>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"CreateOrganizationPage.js","names":[],"sources":["../../../src/devportal/pages/CreateOrganizationPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { X, Info, Building2 } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport {\n InputField,\n TextareaField,\n SelectField,\n} from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport type { DeveloperOrgTier } from \"../types\";\nimport { useCreateOrganizationMutation } from \"../../generated/global-operations\";\nimport { useCreateBillingAccountMutation } from \"../hooks\";\nimport { useDevportalEventBus } from \"../events\";\n\ninterface CreateOrganizationFormData {\n name: string;\n slug: string;\n description: string;\n tier: DeveloperOrgTier;\n websiteUrl: string;\n contactEmail: string;\n supportEmail: string;\n legalEntityName: string;\n legalEntityType: string;\n taxId: string;\n taxCountry: string;\n streetAddress: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n contactEmail?: string;\n supportEmail?: string;\n}\n\nconst TIER_OPTIONS = [\n { value: \"FREE\", label: \"Free - Personal projects and testing\" },\n {\n value: \"DEVELOPER\",\n label: \"Developer - Small teams, 3 apps, 1M API calls/month\",\n },\n {\n value: \"PROFESSIONAL\",\n label: \"Professional - Growing teams, 10 apps, 10M API calls/month\",\n },\n {\n value: \"ENTERPRISE\",\n label: \"Enterprise - Large organizations, unlimited apps\",\n },\n];\n\nconst LEGAL_ENTITY_TYPES = [\n { value: \"individual\", label: \"Individual / Sole Proprietor\" },\n { value: \"llc\", label: \"Limited Liability Company (LLC)\" },\n { value: \"corporation\", label: \"Corporation\" },\n { value: \"partnership\", label: \"Partnership\" },\n { value: \"nonprofit\", label: \"Non-Profit Organization\" },\n { value: \"other\", label: \"Other\" },\n];\n\nconst COUNTRIES = [\n { value: \"US\", label: \"United States\" },\n { value: \"GB\", label: \"United Kingdom\" },\n { value: \"CA\", label: \"Canada\" },\n { value: \"AU\", label: \"Australia\" },\n { value: \"DE\", label: \"Germany\" },\n { value: \"FR\", label: \"France\" },\n { value: \"IN\", label: \"India\" },\n { value: \"JP\", label: \"Japan\" },\n { value: \"SG\", label: \"Singapore\" },\n { value: \"NL\", label: \"Netherlands\" },\n];\n\n/**\n * Create new organization page\n */\nexport const CreateOrganizationPage: FC = () => {\n const { navigate, basePath, currentUser } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const [errors, setErrors] = useState<FormErrors>({});\n const [currentStep, setCurrentStep] = useState<\"basic\" | \"billing\">(\"basic\");\n const [createOrganization, { loading: isSubmitting }] =\n useCreateOrganizationMutation();\n const [createBillingAccountMutation] = useCreateBillingAccountMutation();\n const bus = useDevportalEventBus();\n\n const [formData, setFormData] = useState<CreateOrganizationFormData>({\n name: \"\",\n slug: \"\",\n description: \"\",\n tier: \"FREE\",\n websiteUrl: \"\",\n contactEmail: \"\",\n supportEmail: \"\",\n legalEntityName: \"\",\n legalEntityType: \"\",\n taxId: \"\",\n taxCountry: \"\",\n streetAddress: \"\",\n city: \"\",\n state: \"\",\n postalCode: \"\",\n country: \"\",\n });\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n const generateSlug = (name: string): string => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n };\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const name = e.target.value;\n setFormData((prev) => ({\n ...prev,\n name,\n slug: prev.slug || generateSlug(name),\n }));\n if (errors.name) {\n setErrors((prev) => ({ ...prev, name: undefined }));\n }\n };\n\n const handleChange = (\n field: keyof CreateOrganizationFormData,\n value: string,\n ) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n if (errors[field as keyof FormErrors]) {\n setErrors((prev) => ({ ...prev, [field]: undefined }));\n }\n };\n\n const validateBasicInfo = (): boolean => {\n const newErrors: FormErrors = {};\n\n if (!formData.name.trim()) {\n newErrors.name = tr(\n \"devportal.orgNameRequired\",\n \"Organization name is required\",\n );\n } else if (formData.name.length < 2) {\n newErrors.name = tr(\n \"devportal.orgNameTooShort\",\n \"Name must be at least 2 characters\",\n );\n } else if (formData.name.length > 100) {\n newErrors.name = tr(\n \"devportal.nameTooLong\",\n \"Name must be less than 100 characters\",\n );\n }\n\n if (!formData.slug.trim()) {\n newErrors.slug = tr(\"devportal.slugRequired\", \"Slug is required\");\n } else if (!/^[a-z0-9-]+$/.test(formData.slug)) {\n newErrors.slug = tr(\n \"devportal.slugInvalid\",\n \"Slug can only contain lowercase letters, numbers, and hyphens\",\n );\n }\n\n if (\n formData.contactEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.contactEmail)\n ) {\n newErrors.contactEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n if (\n formData.supportEmail &&\n !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(formData.supportEmail)\n ) {\n newErrors.supportEmail = tr(\n \"devportal.invalidEmailAddress\",\n \"Invalid email address\",\n );\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleNext = () => {\n if (validateBasicInfo()) {\n setCurrentStep(\"billing\");\n }\n };\n\n const handleBack = () => {\n setCurrentStep(\"basic\");\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validateBasicInfo()) {\n setCurrentStep(\"basic\");\n return;\n }\n\n try {\n // Build legal address if any fields are provided\n const legalAddress =\n formData.streetAddress ||\n formData.city ||\n formData.state ||\n formData.postalCode ||\n formData.country\n ? {\n street: formData.streetAddress || undefined,\n city: formData.city || undefined,\n state: formData.state || undefined,\n postalCode: formData.postalCode || undefined,\n country: formData.country || undefined,\n }\n : undefined;\n\n const result = await createOrganization({\n variables: {\n input: {\n name: formData.name,\n slug: formData.slug || undefined,\n description: formData.description || undefined,\n websiteUrl: formData.websiteUrl || undefined,\n contactEmail: formData.contactEmail || undefined,\n supportEmail: formData.supportEmail || undefined,\n legalEntityName: formData.legalEntityName || undefined,\n legalEntityType: formData.legalEntityType || undefined,\n legalAddress,\n // Note: tier is stored in metadata since it's not in the input schema\n metadata:\n formData.tier !== \"FREE\" ? { tier: formData.tier } : undefined,\n },\n },\n });\n\n if (result.data?.createDeveloperOrganization?.id) {\n bus.emit(\"devportal.org.created\", {\n organizationId: result.data.createDeveloperOrganization.id,\n name: formData.name,\n });\n // Fire-and-forget: create a billing account for the new org\n try {\n createBillingAccountMutation({\n variables: {\n input: {\n name: formData.name,\n email: currentUser?.email ?? \"\",\n },\n },\n }).catch(() => {});\n } catch {\n // silent failure — billing account creation is non-blocking\n }\n // Navigate to the new organization's detail page\n handleNavigate(\n `/organizations/${result.data.createDeveloperOrganization.id}`,\n );\n }\n } catch (error) {\n console.error(\"Failed to create organization:\", error);\n }\n };\n\n const handleCancel = () => {\n handleNavigate(\"/organizations\");\n };\n\n const tierInfo = {\n FREE: {\n apps: 1,\n apiCalls: \"100K\",\n storage: \"1GB\",\n members: 2,\n price: \"Free\",\n },\n DEVELOPER: {\n apps: 3,\n apiCalls: \"1M\",\n storage: \"5GB\",\n members: 5,\n price: \"$29/mo\",\n },\n PROFESSIONAL: {\n apps: 10,\n apiCalls: \"10M\",\n storage: \"25GB\",\n members: 15,\n price: \"$99/mo\",\n },\n ENTERPRISE: {\n apps: \"Unlimited\",\n apiCalls: \"100M+\",\n storage: \"100GB+\",\n members: \"Unlimited\",\n price: \"Custom\",\n },\n };\n\n return (\n <PermissionGuard permission={DEVPORTAL_PERMISSIONS.ORG_CREATE}>\n <PageLayout\n title={tr(\"devportal.createOrganization\", \"Create Organization\")}\n description={tr(\n \"devportal.createOrganizationDescription\",\n \"Set up a developer organization to collaborate with your team\",\n )}\n backLink={`${basePath}/organizations`}\n backLabel={tr(\"devportal.backToOrganizations\", \"Back to Organizations\")}\n >\n {/* Progress Steps */}\n <div className=\"flex items-center gap-4 mb-8\">\n <div className=\"flex items-center gap-2\">\n <div\n className={`flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium ${\n currentStep === \"basic\"\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/20 text-primary\"\n }`}\n >\n 1\n </div>\n <span\n className={`text-sm font-medium ${currentStep === \"basic\" ? \"text-foreground\" : \"text-muted-foreground\"}`}\n >\n {tr(\"devportal.basicInfo\", \"Basic Info\")}\n </span>\n </div>\n <div className=\"h-px flex-1 bg-border\" />\n <div className=\"flex items-center gap-2\">\n <div\n className={`flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium ${\n currentStep === \"billing\"\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground\"\n }`}\n >\n 2\n </div>\n <span\n className={`text-sm font-medium ${currentStep === \"billing\" ? \"text-foreground\" : \"text-muted-foreground\"}`}\n >\n {tr(\"devportal.billingAndLegal\", \"Billing & Legal\")}\n </span>\n </div>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-8 max-w-3xl\">\n {currentStep === \"basic\" && (\n <>\n {/* Basic Information */}\n <PageSection\n title={tr(\n \"devportal.organizationDetails\",\n \"Organization Details\",\n )}\n description={tr(\n \"devportal.organizationDetailsDescription\",\n \"Basic information about your organization\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\n \"devportal.organizationName\",\n \"Organization Name\",\n )}\n value={formData.name}\n onChange={handleNameChange}\n placeholder={tr(\n \"devportal.organizationNamePlaceholder\",\n \"Acme Development\",\n )}\n required\n error={errors.name}\n hint={tr(\n \"devportal.organizationNameHint\",\n \"Your organization's display name\",\n )}\n />\n\n <InputField\n label={tr(\"devportal.slug\", \"Slug\")}\n value={formData.slug}\n onChange={(e) =>\n handleChange(\"slug\", e.target.value.toLowerCase())\n }\n placeholder={tr(\"devportal.orgSlugPlaceholder\", \"acme-dev\")}\n required\n error={errors.slug}\n hint={tr(\n \"devportal.slugHint\",\n \"URL-friendly identifier (auto-generated from name)\",\n )}\n />\n\n <TextareaField\n label={tr(\"devportal.description\", \"Description\")}\n value={formData.description}\n onChange={(e) =>\n handleChange(\"description\", e.target.value)\n }\n placeholder={tr(\n \"devportal.orgDescriptionPlaceholder\",\n \"Tell us about your organization...\",\n )}\n rows={3}\n />\n\n <InputField\n label={tr(\"devportal.websiteUrl\", \"Website URL\")}\n type=\"url\"\n value={formData.websiteUrl}\n onChange={(e) => handleChange(\"websiteUrl\", e.target.value)}\n placeholder=\"https://example.com\"\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.contactEmail\", \"Contact Email\")}\n type=\"email\"\n value={formData.contactEmail}\n onChange={(e) =>\n handleChange(\"contactEmail\", e.target.value)\n }\n placeholder=\"contact@example.com\"\n error={errors.contactEmail}\n />\n\n <InputField\n label={tr(\"devportal.supportEmail\", \"Support Email\")}\n type=\"email\"\n value={formData.supportEmail}\n onChange={(e) =>\n handleChange(\"supportEmail\", e.target.value)\n }\n placeholder=\"support@example.com\"\n error={errors.supportEmail}\n />\n </div>\n </div>\n </PageSection>\n\n {/* Tier Selection */}\n <PageSection\n title={tr(\"devportal.selectPlan\", \"Select Plan\")}\n description={tr(\n \"devportal.selectPlanDescription\",\n \"Choose a plan that fits your needs\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {TIER_OPTIONS.map((tier) => {\n const info = tierInfo[tier.value as DeveloperOrgTier];\n const isSelected = formData.tier === tier.value;\n return (\n <button\n key={tier.value}\n type=\"button\"\n onClick={() => handleChange(\"tier\", tier.value)}\n className={`rounded-lg border p-4 text-left transition-colors ${\n isSelected\n ? \"border-primary bg-primary/5 ring-2 ring-primary\"\n : \"hover:border-muted-foreground/50\"\n }`}\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-medium\">{tier.value}</p>\n <p className=\"text-sm text-muted-foreground\">\n {info.price}\n </p>\n </div>\n <div\n className={`h-4 w-4 rounded-full border-2 ${\n isSelected\n ? \"border-primary bg-primary\"\n : \"border-muted-foreground\"\n }`}\n >\n {isSelected && (\n <div className=\"h-full w-full flex items-center justify-center\">\n <div className=\"h-1.5 w-1.5 rounded-full bg-bg-surface\" />\n </div>\n )}\n </div>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 text-xs text-muted-foreground\">\n <span>\n {info.apps} {tr(\"devportal.apps\", \"apps\")}\n </span>\n <span>\n {info.apiCalls}{\" \"}\n {tr(\"devportal.apiCalls\", \"API calls\")}\n </span>\n <span>\n {info.storage} {tr(\"devportal.storage\", \"storage\")}\n </span>\n <span>\n {info.members} {tr(\"devportal.members\", \"members\")}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n </PageSection>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t pt-6\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted transition-colors\"\n >\n <X size={16} />\n {tr(\"devportal.cancel\", \"Cancel\")}\n </button>\n <button\n type=\"button\"\n onClick={handleNext}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n {tr(\"devportal.continue\", \"Continue\")}\n </button>\n </div>\n </>\n )}\n\n {currentStep === \"billing\" && (\n <>\n {/* Legal Entity */}\n <PageSection\n title={tr(\"devportal.legalInformation\", \"Legal Information\")}\n description={tr(\n \"devportal.legalInformationDescription\",\n \"Required for payouts and compliance (optional for Free tier)\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.legalEntityName\", \"Legal Entity Name\")}\n value={formData.legalEntityName}\n onChange={(e) =>\n handleChange(\"legalEntityName\", e.target.value)\n }\n placeholder={tr(\n \"devportal.legalEntityNamePlaceholder\",\n \"Acme Inc.\",\n )}\n hint={tr(\n \"devportal.legalEntityNameHint\",\n \"Your registered business name\",\n )}\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <SelectField\n label={tr(\"devportal.entityType\", \"Entity Type\")}\n value={formData.legalEntityType}\n onChange={(e) =>\n handleChange(\"legalEntityType\", e.target.value)\n }\n options={LEGAL_ENTITY_TYPES}\n placeholder={tr(\n \"devportal.selectEntityType\",\n \"Select entity type\",\n )}\n />\n\n <SelectField\n label={tr(\"devportal.taxCountry\", \"Tax Country\")}\n value={formData.taxCountry}\n onChange={(e) =>\n handleChange(\"taxCountry\", e.target.value)\n }\n options={COUNTRIES}\n placeholder={tr(\n \"devportal.selectCountry\",\n \"Select country\",\n )}\n />\n </div>\n\n <InputField\n label={tr(\n \"devportal.taxIdVatNumber\",\n \"Tax ID / VAT Number\",\n )}\n value={formData.taxId}\n onChange={(e) => handleChange(\"taxId\", e.target.value)}\n placeholder=\"XX-XXXXXXX\"\n hint={tr(\n \"devportal.taxIdHint\",\n \"Your business tax identification number\",\n )}\n />\n </div>\n </PageSection>\n\n {/* Business Address */}\n <PageSection\n title={tr(\"devportal.businessAddress\", \"Business Address\")}\n description={tr(\n \"devportal.businessAddressDescription\",\n \"Used for invoicing and legal documents\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.streetAddress\", \"Street Address\")}\n value={formData.streetAddress}\n onChange={(e) =>\n handleChange(\"streetAddress\", e.target.value)\n }\n placeholder={tr(\n \"devportal.streetAddressPlaceholder\",\n \"123 Main Street\",\n )}\n />\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.city\", \"City\")}\n value={formData.city}\n onChange={(e) => handleChange(\"city\", e.target.value)}\n placeholder={tr(\n \"devportal.cityPlaceholder\",\n \"San Francisco\",\n )}\n />\n\n <InputField\n label={tr(\"devportal.stateProvince\", \"State / Province\")}\n value={formData.state}\n onChange={(e) => handleChange(\"state\", e.target.value)}\n placeholder={tr(\n \"devportal.stateProvincePlaceholder\",\n \"California\",\n )}\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <InputField\n label={tr(\"devportal.postalCode\", \"Postal Code\")}\n value={formData.postalCode}\n onChange={(e) =>\n handleChange(\"postalCode\", e.target.value)\n }\n placeholder={tr(\n \"devportal.postalCodePlaceholder\",\n \"94102\",\n )}\n />\n\n <SelectField\n label={tr(\"devportal.country\", \"Country\")}\n value={formData.country}\n onChange={(e) => handleChange(\"country\", e.target.value)}\n options={COUNTRIES}\n placeholder={tr(\n \"devportal.selectCountry\",\n \"Select country\",\n )}\n />\n </div>\n </div>\n </PageSection>\n\n {/* Info banner */}\n <div className=\"rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 flex gap-3\">\n <Info\n size={20}\n className=\"text-accent-blue flex-shrink-0 mt-0.5\"\n />\n <div className=\"text-sm text-status-info-text\">\n <p className=\"font-medium\">\n {tr(\"devportal.canAddLater\", \"You can add this later\")}\n </p>\n <p className=\"mt-1 text-status-info-text\">\n {tr(\n \"devportal.legalInfoOptionalNote\",\n \"Legal and billing information is only required when you want to receive payouts from app sales or upgrade to a paid plan.\",\n )}\n </p>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-between border-t pt-6\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted transition-colors\"\n >\n {tr(\"devportal.back\", \"Back\")}\n </button>\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50\"\n >\n {isSubmitting ? (\n <>\n <span className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n {tr(\"devportal.creating\", \"Creating...\")}\n </>\n ) : (\n <>\n <Building2 size={16} />\n {tr(\n \"devportal.createOrganization\",\n \"Create Organization\",\n )}\n </>\n )}\n </button>\n </div>\n </>\n )}\n </form>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AA4CA,IAAM,IAAe;CACnB;EAAE,OAAO;EAAQ,OAAO;EAAwC;CAChE;EACE,OAAO;EACP,OAAO;EACR;CACD;EACE,OAAO;EACP,OAAO;EACR;CACD;EACE,OAAO;EACP,OAAO;EACR;CACF,EAEK,IAAqB;CACzB;EAAE,OAAO;EAAc,OAAO;EAAgC;CAC9D;EAAE,OAAO;EAAO,OAAO;EAAmC;CAC1D;EAAE,OAAO;EAAe,OAAO;EAAe;CAC9C;EAAE,OAAO;EAAe,OAAO;EAAe;CAC9C;EAAE,OAAO;EAAa,OAAO;EAA2B;CACxD;EAAE,OAAO;EAAS,OAAO;EAAS;CACnC,EAEK,IAAY;CAChB;EAAE,OAAO;EAAM,OAAO;EAAiB;CACvC;EAAE,OAAO;EAAM,OAAO;EAAkB;CACxC;EAAE,OAAO;EAAM,OAAO;EAAU;CAChC;EAAE,OAAO;EAAM,OAAO;EAAa;CACnC;EAAE,OAAO;EAAM,OAAO;EAAW;CACjC;EAAE,OAAO;EAAM,OAAO;EAAU;CAChC;EAAE,OAAO;EAAM,OAAO;EAAS;CAC/B;EAAE,OAAO;EAAM,OAAO;EAAS;CAC/B;EAAE,OAAO;EAAM,OAAO;EAAa;CACnC;EAAE,OAAO;EAAM,OAAO;EAAe;CACtC,EAKY,UAAmC;CAC9C,IAAM,EAAE,aAAU,aAAU,mBAAgB,GAAc,EACpD,EAAE,SAAM,GAAS,EACjB,KAAM,GAAa,MAA6B;EACpD,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAE9B,CAAC,GAAQ,KAAa,EAAqB,EAAE,CAAC,EAC9C,CAAC,GAAa,KAAkB,EAA8B,QAAQ,EACtE,CAAC,GAAoB,EAAE,SAAS,OACpC,GAA+B,EAC3B,CAAC,KAAgC,GAAiC,EAClE,IAAM,GAAsB,EAE5B,CAAC,GAAU,KAAe,EAAqC;EACnE,MAAM;EACN,MAAM;EACN,aAAa;EACb,MAAM;EACN,YAAY;EACZ,cAAc;EACd,cAAc;EACd,iBAAiB;EACjB,iBAAiB;EACjB,OAAO;EACP,YAAY;EACZ,eAAe;EACf,MAAM;EACN,OAAO;EACP,YAAY;EACZ,SAAS;EACV,CAAC,EAEI,KAAkB,MAAiB;AACvC,MAAW,GAAG,IAAW,IAAO;IAG5B,KAAgB,MACb,EACJ,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,UAAU,GAAG,EAGpB,KAAoB,MAA2C;EACnE,IAAM,IAAO,EAAE,OAAO;AAMtB,EALA,GAAa,OAAU;GACrB,GAAG;GACH;GACA,MAAM,EAAK,QAAQ,EAAa,EAAK;GACtC,EAAE,EACC,EAAO,QACT,GAAW,OAAU;GAAE,GAAG;GAAM,MAAM,KAAA;GAAW,EAAE;IAIjD,KACJ,GACA,MACG;AAEH,EADA,GAAa,OAAU;GAAE,GAAG;IAAO,IAAQ;GAAO,EAAE,EAChD,EAAO,MACT,GAAW,OAAU;GAAE,GAAG;IAAO,IAAQ,KAAA;GAAW,EAAE;IAIpD,UAAmC;EACvC,IAAM,IAAwB,EAAE;AAiDhC,SA/CK,EAAS,KAAK,MAAM,GAKd,EAAS,KAAK,SAAS,IAChC,EAAU,OAAO,EACf,6BACA,qCACD,GACQ,EAAS,KAAK,SAAS,QAChC,EAAU,OAAO,EACf,yBACA,wCACD,IAbD,EAAU,OAAO,EACf,6BACA,gCACD,EAaE,EAAS,KAAK,MAAM,GAEb,eAAe,KAAK,EAAS,KAAK,KAC5C,EAAU,OAAO,EACf,yBACA,gEACD,IALD,EAAU,OAAO,EAAG,0BAA0B,mBAAmB,EASjE,EAAS,gBACT,CAAC,6BAA6B,KAAK,EAAS,aAAa,KAEzD,EAAU,eAAe,EACvB,iCACA,wBACD,GAID,EAAS,gBACT,CAAC,6BAA6B,KAAK,EAAS,aAAa,KAEzD,EAAU,eAAe,EACvB,iCACA,wBACD,GAGH,EAAU,EAAU,EACb,OAAO,KAAK,EAAU,CAAC,WAAW;IAGrC,UAAmB;AACvB,EAAI,GAAmB,IACrB,EAAe,UAAU;IAIvB,UAAmB;AACvB,IAAe,QAAQ;IAGnB,IAAe,OAAO,MAAuB;AAGjD,MAFA,EAAE,gBAAgB,EAEd,CAAC,GAAmB,EAAE;AACxB,KAAe,QAAQ;AACvB;;AAGF,MAAI;GAEF,IAAM,IACJ,EAAS,iBACT,EAAS,QACT,EAAS,SACT,EAAS,cACT,EAAS,UACL;IACE,QAAQ,EAAS,iBAAiB,KAAA;IAClC,MAAM,EAAS,QAAQ,KAAA;IACvB,OAAO,EAAS,SAAS,KAAA;IACzB,YAAY,EAAS,cAAc,KAAA;IACnC,SAAS,EAAS,WAAW,KAAA;IAC9B,GACD,KAAA,GAEA,IAAS,MAAM,EAAmB,EACtC,WAAW,EACT,OAAO;IACL,MAAM,EAAS;IACf,MAAM,EAAS,QAAQ,KAAA;IACvB,aAAa,EAAS,eAAe,KAAA;IACrC,YAAY,EAAS,cAAc,KAAA;IACnC,cAAc,EAAS,gBAAgB,KAAA;IACvC,cAAc,EAAS,gBAAgB,KAAA;IACvC,iBAAiB,EAAS,mBAAmB,KAAA;IAC7C,iBAAiB,EAAS,mBAAmB,KAAA;IAC7C;IAEA,UACE,EAAS,SAAS,SAAmC,KAAA,IAA1B,EAAE,MAAM,EAAS,MAAM;IACrD,EACF,EACF,CAAC;AAEF,OAAI,EAAO,MAAM,6BAA6B,IAAI;AAChD,MAAI,KAAK,yBAAyB;KAChC,gBAAgB,EAAO,KAAK,4BAA4B;KACxD,MAAM,EAAS;KAChB,CAAC;AAEF,QAAI;AACF,OAA6B,EAC3B,WAAW,EACT,OAAO;MACL,MAAM,EAAS;MACf,OAAO,GAAa,SAAS;MAC9B,EACF,EACF,CAAC,CAAC,YAAY,GAAG;YACZ;AAIR,MACE,kBAAkB,EAAO,KAAK,4BAA4B,KAC3D;;WAEI,GAAO;AACd,WAAQ,MAAM,kCAAkC,EAAM;;IAIpD,UAAqB;AACzB,IAAe,iBAAiB;IAG5B,IAAW;EACf,MAAM;GACJ,MAAM;GACN,UAAU;GACV,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACD,WAAW;GACT,MAAM;GACN,UAAU;GACV,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACD,cAAc;GACZ,MAAM;GACN,UAAU;GACV,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACD,YAAY;GACV,MAAM;GACN,UAAU;GACV,SAAS;GACT,SAAS;GACT,OAAO;GACR;EACF;AAED,QACE,kBAAC,GAAD;EAAiB,YAAY,EAAsB;YACjD,kBAAC,GAAD;GACE,OAAO,EAAG,gCAAgC,sBAAsB;GAChE,aAAa,EACX,2CACA,gEACD;GACD,UAAU,GAAG,EAAS;GACtB,WAAW,EAAG,iCAAiC,wBAAwB;aAPzE,CAUE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OACE,WAAW,6EACT,MAAgB,UACZ,uCACA;iBAEP;OAEK,CAAA,EACN,kBAAC,QAAD;OACE,WAAW,uBAAuB,MAAgB,UAAU,oBAAoB;iBAE/E,EAAG,uBAAuB,aAAa;OACnC,CAAA,CACH;;KACN,kBAAC,OAAD,EAAK,WAAU,yBAA0B,CAAA;KACzC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OACE,WAAW,6EACT,MAAgB,YACZ,uCACA;iBAEP;OAEK,CAAA,EACN,kBAAC,QAAD;OACE,WAAW,uBAAuB,MAAgB,YAAY,oBAAoB;iBAEjF,EAAG,6BAA6B,kBAAkB;OAC9C,CAAA,CACH;;KACF;OAEN,kBAAC,QAAD;IAAM,UAAU;IAAc,WAAU;cAAxC,CACG,MAAgB,WACf,kBAAA,GAAA,EAAA,UAAA;KAEE,kBAAC,GAAD;MACE,OAAO,EACL,iCACA,uBACD;MACD,aAAa,EACX,4CACA,4CACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD;SACE,OAAO,EACL,8BACA,oBACD;SACD,OAAO,EAAS;SAChB,UAAU;SACV,aAAa,EACX,yCACA,mBACD;SACD,UAAA;SACA,OAAO,EAAO;SACd,MAAM,EACJ,kCACA,mCACD;SACD,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EAAG,kBAAkB,OAAO;SACnC,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,QAAQ,EAAE,OAAO,MAAM,aAAa,CAAC;SAEpD,aAAa,EAAG,gCAAgC,WAAW;SAC3D,UAAA;SACA,OAAO,EAAO;SACd,MAAM,EACJ,sBACA,qDACD;SACD,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EAAG,yBAAyB,cAAc;SACjD,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,eAAe,EAAE,OAAO,MAAM;SAE7C,aAAa,EACX,uCACA,qCACD;SACD,MAAM;SACN,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EAAG,wBAAwB,cAAc;SAChD,MAAK;SACL,OAAO,EAAS;SAChB,WAAW,MAAM,EAAa,cAAc,EAAE,OAAO,MAAM;SAC3D,aAAY;SACZ,CAAA;QAEF,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UACE,OAAO,EAAG,0BAA0B,gBAAgB;UACpD,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,gBAAgB,EAAE,OAAO,MAAM;UAE9C,aAAY;UACZ,OAAO,EAAO;UACd,CAAA,EAEF,kBAAC,GAAD;UACE,OAAO,EAAG,0BAA0B,gBAAgB;UACpD,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,gBAAgB,EAAE,OAAO,MAAM;UAE9C,aAAY;UACZ,OAAO,EAAO;UACd,CAAA,CACE;;QACF;;MACM,CAAA;KAGd,kBAAC,GAAD;MACE,OAAO,EAAG,wBAAwB,cAAc;MAChD,aAAa,EACX,mCACA,qCACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAa,KAAK,MAAS;QAC1B,IAAM,IAAO,EAAS,EAAK,QACrB,IAAa,EAAS,SAAS,EAAK;AAC1C,eACE,kBAAC,UAAD;SAEE,MAAK;SACL,eAAe,EAAa,QAAQ,EAAK,MAAM;SAC/C,WAAW,qDACT,IACI,oDACA;mBAPR,CAUE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAe,EAAK;WAAU,CAAA,EAC3C,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAK;WACJ,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;WACE,WAAW,iCACT,IACI,8BACA;qBAGL,KACC,kBAAC,OAAD;YAAK,WAAU;sBACb,kBAAC,OAAD,EAAK,WAAU,0CAA2C,CAAA;YACtD,CAAA;WAEJ,CAAA,CACF;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,QAAD,EAAA,UAAA;YACG,EAAK;YAAK;YAAE,EAAG,kBAAkB,OAAO;YACpC,EAAA,CAAA;WACP,kBAAC,QAAD,EAAA,UAAA;YACG,EAAK;YAAU;YACf,EAAG,sBAAsB,YAAY;YACjC,EAAA,CAAA;WACP,kBAAC,QAAD,EAAA,UAAA;YACG,EAAK;YAAQ;YAAE,EAAG,qBAAqB,UAAU;YAC7C,EAAA,CAAA;WACP,kBAAC,QAAD,EAAA,UAAA;YACG,EAAK;YAAQ;YAAE,EAAG,qBAAqB,UAAU;YAC7C,EAAA,CAAA;WACH;YACC;WA7CF,EAAK,MA6CH;SAEX;OACE,CAAA;MACM,CAAA;KAGd,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;iBAHZ,CAKE,kBAAC,GAAD,EAAG,MAAM,IAAM,CAAA,EACd,EAAG,oBAAoB,SAAS,CAC1B;UACT,kBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;iBAET,EAAG,sBAAsB,WAAW;OAC9B,CAAA,CACL;;KACL,EAAA,CAAA,EAGJ,MAAgB,aACf,kBAAA,GAAA,EAAA,UAAA;KAEE,kBAAC,GAAD;MACE,OAAO,EAAG,8BAA8B,oBAAoB;MAC5D,aAAa,EACX,yCACA,+DACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD;SACE,OAAO,EAAG,6BAA6B,oBAAoB;SAC3D,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,mBAAmB,EAAE,OAAO,MAAM;SAEjD,aAAa,EACX,wCACA,YACD;SACD,MAAM,EACJ,iCACA,gCACD;SACD,CAAA;QAEF,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UACE,OAAO,EAAG,wBAAwB,cAAc;UAChD,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,mBAAmB,EAAE,OAAO,MAAM;UAEjD,SAAS;UACT,aAAa,EACX,8BACA,qBACD;UACD,CAAA,EAEF,kBAAC,GAAD;UACE,OAAO,EAAG,wBAAwB,cAAc;UAChD,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,cAAc,EAAE,OAAO,MAAM;UAE5C,SAAS;UACT,aAAa,EACX,2BACA,iBACD;UACD,CAAA,CACE;;QAEN,kBAAC,GAAD;SACE,OAAO,EACL,4BACA,sBACD;SACD,OAAO,EAAS;SAChB,WAAW,MAAM,EAAa,SAAS,EAAE,OAAO,MAAM;SACtD,aAAY;SACZ,MAAM,EACJ,uBACA,0CACD;SACD,CAAA;QACE;;MACM,CAAA;KAGd,kBAAC,GAAD;MACE,OAAO,EAAG,6BAA6B,mBAAmB;MAC1D,aAAa,EACX,wCACA,yCACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD;SACE,OAAO,EAAG,2BAA2B,iBAAiB;SACtD,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,iBAAiB,EAAE,OAAO,MAAM;SAE/C,aAAa,EACX,sCACA,kBACD;SACD,CAAA;QAEF,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UACE,OAAO,EAAG,kBAAkB,OAAO;UACnC,OAAO,EAAS;UAChB,WAAW,MAAM,EAAa,QAAQ,EAAE,OAAO,MAAM;UACrD,aAAa,EACX,6BACA,gBACD;UACD,CAAA,EAEF,kBAAC,GAAD;UACE,OAAO,EAAG,2BAA2B,mBAAmB;UACxD,OAAO,EAAS;UAChB,WAAW,MAAM,EAAa,SAAS,EAAE,OAAO,MAAM;UACtD,aAAa,EACX,sCACA,aACD;UACD,CAAA,CACE;;QAEN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UACE,OAAO,EAAG,wBAAwB,cAAc;UAChD,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,cAAc,EAAE,OAAO,MAAM;UAE5C,aAAa,EACX,mCACA,QACD;UACD,CAAA,EAEF,kBAAC,GAAD;UACE,OAAO,EAAG,qBAAqB,UAAU;UACzC,OAAO,EAAS;UAChB,WAAW,MAAM,EAAa,WAAW,EAAE,OAAO,MAAM;UACxD,SAAS;UACT,aAAa,EACX,2BACA,iBACD;UACD,CAAA,CACE;;QACF;;MACM,CAAA;KAGd,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,MAAM;OACN,WAAU;OACV,CAAA,EACF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAG,yBAAyB,yBAAyB;QACpD,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EACC,mCACA,4HACD;QACC,CAAA,CACA;SACF;;KAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,MAAK;OACL,SAAS;OACT,WAAU;iBAET,EAAG,kBAAkB,OAAO;OACtB,CAAA,EACT,kBAAC,UAAD;OACE,MAAK;OACL,UAAU;OACV,WAAU;iBAET,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD,EAAM,WAAU,kFAAmF,CAAA,EAClG,EAAG,sBAAsB,cAAc,CACvC,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EACtB,EACC,gCACA,sBACD,CACA,EAAA,CAAA;OAEE,CAAA,CACL;;KACL,EAAA,CAAA,CAEA;MACI;;EACG,CAAA"}