@burdenoff/microfe-devportal 2026.611.2 → 2026.616.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 (51) hide show
  1. package/dist/devportal/components/SectionNav.js +105 -41
  2. package/dist/devportal/components/SectionNav.js.map +1 -1
  3. package/dist/devportal/hooks/useGraphQL.js +1 -1
  4. package/dist/devportal/pages/AdminReviewPage.js +36 -36
  5. package/dist/devportal/pages/AnalyticsDashboardPage.js +150 -150
  6. package/dist/devportal/pages/AnalyticsDashboardPage.js.map +1 -1
  7. package/dist/devportal/pages/ApiKeysPage.js +184 -172
  8. package/dist/devportal/pages/ApiKeysPage.js.map +1 -1
  9. package/dist/devportal/pages/AppLogsPage.js +9 -9
  10. package/dist/devportal/pages/ApplicationDetailPage.js +414 -414
  11. package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
  12. package/dist/devportal/pages/ApplicationVersionsPage.js +44 -44
  13. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  14. package/dist/devportal/pages/ApplicationsPage.js +118 -118
  15. package/dist/devportal/pages/ApplicationsPage.js.map +1 -1
  16. package/dist/devportal/pages/CreateApiKeyPage.js +20 -20
  17. package/dist/devportal/pages/CreateApplicationPage.js +46 -66
  18. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  19. package/dist/devportal/pages/CreateOAuthClientPage.js +20 -20
  20. package/dist/devportal/pages/CreateOrganizationPage.js +125 -442
  21. package/dist/devportal/pages/CreateOrganizationPage.js.map +1 -1
  22. package/dist/devportal/pages/CreateWebhookPage.js +25 -25
  23. package/dist/devportal/pages/DashboardPage.js +160 -145
  24. package/dist/devportal/pages/DashboardPage.js.map +1 -1
  25. package/dist/devportal/pages/DelegationsPage.js +22 -22
  26. package/dist/devportal/pages/EditApplicationPage.js +297 -317
  27. package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
  28. package/dist/devportal/pages/ListingPreviewPage.js +9 -9
  29. package/dist/devportal/pages/OAuthClientDetailPage.js +17 -17
  30. package/dist/devportal/pages/OAuthClientsPage.js +16 -16
  31. package/dist/devportal/pages/OrganizationDetailPage.js +78 -78
  32. package/dist/devportal/pages/OrganizationMembersPage.js +260 -260
  33. package/dist/devportal/pages/OrganizationMembersPage.js.map +1 -1
  34. package/dist/devportal/pages/OrganizationsPage.js +18 -18
  35. package/dist/devportal/pages/PublishPage.js +16 -16
  36. package/dist/devportal/pages/PublisherProfilePage.js +156 -146
  37. package/dist/devportal/pages/PublisherProfilePage.js.map +1 -1
  38. package/dist/devportal/pages/RevenueDashboardPage.js +512 -362
  39. package/dist/devportal/pages/RevenueDashboardPage.js.map +1 -1
  40. package/dist/devportal/pages/SettingsPage.js +17 -17
  41. package/dist/devportal/pages/SetupPage.js +99 -99
  42. package/dist/devportal/pages/SetupPage.js.map +1 -1
  43. package/dist/devportal/pages/WebhookDetailPage.js +143 -143
  44. package/dist/devportal/pages/WebhookDetailPage.js.map +1 -1
  45. package/dist/devportal/pages/WebhooksPage.js +140 -140
  46. package/dist/devportal/pages/WebhooksPage.js.map +1 -1
  47. package/dist/devportal/providers/DevportalProvider.js +46 -33
  48. package/dist/devportal/providers/DevportalProvider.js.map +1 -1
  49. package/dist/generated/global-operations.js +69 -55
  50. package/dist/generated/global-operations.js.map +1 -1
  51. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  import { useDevportal as e } from "../providers/DevportalProvider.js";
2
2
  import { useDevportalEventBus as t } from "../events/index.js";
3
- import { PageLayout as n, PageSection as r } from "../components/PageLayout.js";
4
- import { NewSecretAlert as i } from "../components/SecretDisplay.js";
5
- import { InputField as a, SelectField as o, TagInput as s } from "../components/FormField.js";
6
- import { Alert as c } from "../components/ConfirmDialog.js";
7
- import { useCurrentUserAppsQuery as l, useGenerateApiKeyMutation as u } from "../../generated/global-operations.js";
3
+ import { useCurrentUserAppsQuery as n, useGenerateApiKeyMutation as r } from "../../generated/global-operations.js";
4
+ import { PageLayout as i, PageSection as a } from "../components/PageLayout.js";
5
+ import { NewSecretAlert as o } from "../components/SecretDisplay.js";
6
+ import { InputField as s, SelectField as c, TagInput as l } from "../components/FormField.js";
7
+ import { Alert as u } from "../components/ConfirmDialog.js";
8
8
  import { PermissionGuard as d } from "../components/PermissionGuard.js";
9
9
  import "../components/index.js";
10
10
  import { DEVPORTAL_PERMISSIONS as f } from "../constants/permissions.js";
@@ -32,7 +32,7 @@ var w = () => {
32
32
  let { t: S } = h(), w = (e, t) => {
33
33
  let n = S(e);
34
34
  return n === e ? t : n;
35
- }, { navigate: T, basePath: E } = e(), [D, O] = m(null), [k, A] = m({}), [j, M] = m(null), [N, { loading: P }] = u(), F = t(), { data: I, loading: L } = l({ fetchPolicy: "cache-and-network" }), R = I?.currentUserApps?.apps.map((e) => ({
35
+ }, { navigate: T, basePath: E } = e(), [D, O] = m(null), [k, A] = m({}), [j, M] = m(null), [N, { loading: P }] = r(), F = t(), { data: I, loading: L } = n({ fetchPolicy: "cache-and-network" }), R = I?.currentUserApps?.apps.map((e) => ({
36
36
  id: e.id,
37
37
  name: e.name,
38
38
  clientId: e.clientId
@@ -82,19 +82,19 @@ var w = () => {
82
82
  }, K = () => {
83
83
  V("/api-keys");
84
84
  };
85
- return D ? /* @__PURE__ */ y(n, {
85
+ return D ? /* @__PURE__ */ y(i, {
86
86
  title: "API Key Generated",
87
87
  description: "Your new API key has been generated successfully",
88
88
  children: /* @__PURE__ */ b("div", {
89
89
  className: "max-w-2xl space-y-6",
90
90
  children: [
91
- /* @__PURE__ */ y(i, {
91
+ /* @__PURE__ */ y(o, {
92
92
  title: "API Key & Secret",
93
93
  secret: D.apiSecret,
94
94
  description: "Store this secret securely — you won't be able to see it again.",
95
95
  onDismiss: K
96
96
  }),
97
- /* @__PURE__ */ y(c, {
97
+ /* @__PURE__ */ y(u, {
98
98
  variant: "info",
99
99
  title: "Usage Instructions",
100
100
  children: /* @__PURE__ */ b("div", {
@@ -142,7 +142,7 @@ var w = () => {
142
142
  })
143
143
  }) : /* @__PURE__ */ y(d, {
144
144
  permission: f.APP_UPDATE,
145
- children: /* @__PURE__ */ y(n, {
145
+ children: /* @__PURE__ */ y(i, {
146
146
  title: "Generate API Key",
147
147
  description: "Generate a new API key for programmatic access",
148
148
  backLink: "/api-keys",
@@ -151,13 +151,13 @@ var w = () => {
151
151
  onSubmit: G,
152
152
  className: "max-w-3xl space-y-8",
153
153
  children: [
154
- j && /* @__PURE__ */ y(c, {
154
+ j && /* @__PURE__ */ y(u, {
155
155
  variant: "error",
156
156
  title: "Error Generating API Key",
157
157
  onDismiss: () => M(null),
158
158
  children: j
159
159
  }),
160
- /* @__PURE__ */ y(r, {
160
+ /* @__PURE__ */ y(a, {
161
161
  title: "Basic Information",
162
162
  description: "Configure the API key settings",
163
163
  children: /* @__PURE__ */ b("div", {
@@ -168,7 +168,7 @@ var w = () => {
168
168
  className: "text-sm text-muted-foreground",
169
169
  children: "Loading apps..."
170
170
  })]
171
- }) : R.length === 0 ? /* @__PURE__ */ y(c, {
171
+ }) : R.length === 0 ? /* @__PURE__ */ y(u, {
172
172
  variant: "warning",
173
173
  title: "No Apps Found",
174
174
  children: /* @__PURE__ */ b("p", { children: [
@@ -181,7 +181,7 @@ var w = () => {
181
181
  children: "Create an app"
182
182
  })
183
183
  ] })
184
- }) : /* @__PURE__ */ y(o, {
184
+ }) : /* @__PURE__ */ y(c, {
185
185
  label: "App",
186
186
  value: z.appId,
187
187
  onChange: (e) => U("appId", e.target.value),
@@ -193,7 +193,7 @@ var w = () => {
193
193
  error: k.appId,
194
194
  required: !0,
195
195
  hint: "The OAuth app this API key will be associated with"
196
- }), /* @__PURE__ */ y(a, {
196
+ }), /* @__PURE__ */ y(s, {
197
197
  label: "Key Name",
198
198
  placeholder: "e.g., Production Backend Key",
199
199
  value: z.name,
@@ -204,12 +204,12 @@ var w = () => {
204
204
  })]
205
205
  })
206
206
  }),
207
- /* @__PURE__ */ y(r, {
207
+ /* @__PURE__ */ y(a, {
208
208
  title: "Scopes",
209
209
  description: "Define what this API key can access",
210
210
  children: /* @__PURE__ */ y("div", {
211
211
  className: "space-y-4",
212
- children: /* @__PURE__ */ y(s, {
212
+ children: /* @__PURE__ */ y(l, {
213
213
  label: "Scopes",
214
214
  value: z.scopes,
215
215
  onChange: (e) => U("scopes", e),
@@ -222,10 +222,10 @@ var w = () => {
222
222
  /* @__PURE__ */ y(x, {
223
223
  title: "Advanced settings",
224
224
  description: "Rate-limit overrides, allowed origins, scope tuning, and expiration.",
225
- children: /* @__PURE__ */ b(r, {
225
+ children: /* @__PURE__ */ b(a, {
226
226
  title: "Key Expiration",
227
227
  description: "Set when this key should expire",
228
- children: [/* @__PURE__ */ y(o, {
228
+ children: [/* @__PURE__ */ y(c, {
229
229
  label: "Expires In",
230
230
  value: z.expiresIn,
231
231
  onChange: (e) => U("expiresIn", e.target.value),
@@ -256,7 +256,7 @@ var w = () => {
256
256
  }
257
257
  ],
258
258
  hint: "Keys can be revoked at any time regardless of expiration"
259
- }), z.expiresIn === "never" && /* @__PURE__ */ y(c, {
259
+ }), z.expiresIn === "never" && /* @__PURE__ */ y(u, {
260
260
  variant: "warning",
261
261
  className: "mt-4",
262
262
  children: "Non-expiring keys are a security risk. Consider setting an expiration and rotating keys periodically."
@@ -1,9 +1,9 @@
1
1
  import { useDevportal as e } from "../providers/DevportalProvider.js";
2
2
  import { useDevportalEventBus as t } from "../events/index.js";
3
- import { PageLayout as n, PageSection as r } from "../components/PageLayout.js";
4
- import { APP_TYPE_LABELS as i } from "../utils/constants.js";
5
- import { CheckboxField as a, InputField as o, SelectField as s, TagInput as c, TextareaField as l } from "../components/FormField.js";
6
- import { useCreateApplicationMutation as u, useCurrentUserAppsQuery as d, useGetMyOrganizationsQuery as f } from "../../generated/global-operations.js";
3
+ import { useCreateApplicationMutation as n, useCurrentUserAppsQuery as r, useGetMyOrganizationsQuery as i } from "../../generated/global-operations.js";
4
+ import { PageLayout as a, PageSection as o } from "../components/PageLayout.js";
5
+ import { APP_TYPE_LABELS as s } from "../utils/constants.js";
6
+ import { CheckboxField as c, InputField as l, SelectField as u, TagInput as d, TextareaField as f } from "../components/FormField.js";
7
7
  import { PermissionGuard as p } from "../components/PermissionGuard.js";
8
8
  import "../components/index.js";
9
9
  import { DEVPORTAL_PERMISSIONS as m } from "../constants/permissions.js";
@@ -13,7 +13,7 @@ import { useI18n as g } from "@burdenoff/fe-libs/shared/providers/shell/I18nProv
13
13
  import { Info as _, Save as v, X as y } from "lucide-react";
14
14
  import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
15
15
  //#region src/devportal/pages/CreateApplicationPage.tsx
16
- var C = Object.entries(i).map(([e, t]) => ({
16
+ var C = Object.entries(s).map(([e, t]) => ({
17
17
  value: e,
18
18
  label: t
19
19
  })), w = [
@@ -35,58 +35,38 @@ var C = Object.entries(i).map(([e, t]) => ({
35
35
  }
36
36
  ], T = [
37
37
  {
38
- value: "productivity",
39
- label: "Productivity"
38
+ value: "ai",
39
+ label: "AI & Automation"
40
40
  },
41
41
  {
42
- value: "communication",
43
- label: "Communication"
44
- },
45
- {
46
- value: "analytics",
47
- label: "Analytics"
48
- },
49
- {
50
- value: "automation",
51
- label: "Automation"
52
- },
53
- {
54
- value: "developer-tools",
55
- label: "Developer Tools"
56
- },
57
- {
58
- value: "finance",
59
- label: "Finance"
60
- },
61
- {
62
- value: "hr",
63
- label: "HR & People"
42
+ value: "integration",
43
+ label: "Action in an App"
64
44
  },
65
45
  {
66
- value: "marketing",
67
- label: "Marketing"
46
+ value: "data",
47
+ label: "Data & Transform"
68
48
  },
69
49
  {
70
- value: "project-management",
71
- label: "Project Management"
50
+ value: "flow",
51
+ label: "Flow & Logic"
72
52
  },
73
53
  {
74
- value: "security",
75
- label: "Security"
54
+ value: "core",
55
+ label: "Core"
76
56
  },
77
57
  {
78
- value: "support",
79
- label: "Support"
58
+ value: "communication",
59
+ label: "Communication"
80
60
  },
81
61
  {
82
- value: "other",
83
- label: "Other"
62
+ value: "trigger",
63
+ label: "Triggers"
84
64
  }
85
65
  ], E = () => {
86
- let { navigate: i, basePath: E } = e(), { t: D } = g(), O = (e, t) => {
66
+ let { navigate: s, basePath: E } = e(), { t: D } = g(), O = (e, t) => {
87
67
  let n = D(e);
88
68
  return n === e ? t : n;
89
- }, [k, A] = h({}), [j, { loading: M }] = u(), N = t(), { data: P } = f({ fetchPolicy: "cache-and-network" }), { data: F, loading: I } = d({ fetchPolicy: "cache-and-network" }), L = [{
69
+ }, [k, A] = h({}), [j, { loading: M }] = n(), N = t(), { data: P } = i({ fetchPolicy: "cache-and-network" }), { data: F, loading: I } = r({ fetchPolicy: "cache-and-network" }), L = [{
90
70
  value: "",
91
71
  label: "No organization (publish under personal account)"
92
72
  }, ...(P?.myDeveloperOrganizations ?? []).map((e) => ({
@@ -118,7 +98,7 @@ var C = Object.entries(i).map(([e, t]) => ({
118
98
  appId: "",
119
99
  requiresApproval: !1
120
100
  }), V = (e) => {
121
- i?.(`${E}${e}`);
101
+ s?.(`${E}${e}`);
122
102
  }, H = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), U = (e) => {
123
103
  let t = e.target.value;
124
104
  B((e) => ({
@@ -143,7 +123,7 @@ var C = Object.entries(i).map(([e, t]) => ({
143
123
  };
144
124
  return /* @__PURE__ */ x(p, {
145
125
  permission: m.APP_CREATE,
146
- children: /* @__PURE__ */ x(n, {
126
+ children: /* @__PURE__ */ x(a, {
147
127
  title: O("devportal.createApplication", "Create Application"),
148
128
  description: O("devportal.createApplicationDescription", "Register a new application in the developer portal"),
149
129
  backLink: `${E}/apps`,
@@ -188,13 +168,13 @@ var C = Object.entries(i).map(([e, t]) => ({
188
168
  },
189
169
  className: "space-y-8 max-w-3xl",
190
170
  children: [
191
- /* @__PURE__ */ x(r, {
171
+ /* @__PURE__ */ x(o, {
192
172
  title: O("devportal.basicInformation", "Basic Information"),
193
173
  description: O("devportal.basicInformationDescription", "Core details about your application"),
194
174
  children: /* @__PURE__ */ S("div", {
195
175
  className: "space-y-4",
196
176
  children: [
197
- /* @__PURE__ */ x(o, {
177
+ /* @__PURE__ */ x(l, {
198
178
  label: O("devportal.applicationName", "Application Name"),
199
179
  value: z.name,
200
180
  onChange: U,
@@ -203,7 +183,7 @@ var C = Object.entries(i).map(([e, t]) => ({
203
183
  error: k.name,
204
184
  hint: O("devportal.applicationNameHint", "Choose a memorable name for your application")
205
185
  }),
206
- /* @__PURE__ */ x(o, {
186
+ /* @__PURE__ */ x(l, {
207
187
  label: O("devportal.slug", "Slug"),
208
188
  value: z.slug,
209
189
  onChange: (e) => W("slug", e.target.value.toLowerCase()),
@@ -212,7 +192,7 @@ var C = Object.entries(i).map(([e, t]) => ({
212
192
  error: k.slug,
213
193
  hint: O("devportal.slugHint", "URL-friendly identifier (auto-generated from name)")
214
194
  }),
215
- /* @__PURE__ */ x(l, {
195
+ /* @__PURE__ */ x(f, {
216
196
  label: O("devportal.shortDescription", "Short Description"),
217
197
  value: z.shortDescription,
218
198
  onChange: (e) => W("shortDescription", e.target.value),
@@ -222,7 +202,7 @@ var C = Object.entries(i).map(([e, t]) => ({
222
202
  hint: `${z.shortDescription.length}/200 ${O("devportal.characters", "characters")}`,
223
203
  rows: 2
224
204
  }),
225
- /* @__PURE__ */ x(l, {
205
+ /* @__PURE__ */ x(f, {
226
206
  label: O("devportal.fullDescription", "Full Description"),
227
207
  value: z.description,
228
208
  onChange: (e) => W("description", e.target.value),
@@ -233,14 +213,14 @@ var C = Object.entries(i).map(([e, t]) => ({
233
213
  ]
234
214
  })
235
215
  }),
236
- /* @__PURE__ */ S(r, {
216
+ /* @__PURE__ */ S(o, {
237
217
  title: O("devportal.classification", "Classification"),
238
218
  description: O("devportal.classificationDescription", "Categorize your application"),
239
219
  children: [
240
220
  /* @__PURE__ */ S("div", {
241
221
  className: "grid gap-4 sm:grid-cols-2",
242
222
  children: [
243
- /* @__PURE__ */ x(s, {
223
+ /* @__PURE__ */ x(u, {
244
224
  label: O("devportal.applicationType", "Application Type"),
245
225
  value: z.appType,
246
226
  onChange: (e) => W("appType", e.target.value),
@@ -249,7 +229,7 @@ var C = Object.entries(i).map(([e, t]) => ({
249
229
  error: k.appType,
250
230
  placeholder: O("devportal.selectAppType", "Select app type")
251
231
  }),
252
- /* @__PURE__ */ x(s, {
232
+ /* @__PURE__ */ x(u, {
253
233
  label: O("devportal.category", "Category"),
254
234
  value: z.category,
255
235
  onChange: (e) => W("category", e.target.value),
@@ -258,14 +238,14 @@ var C = Object.entries(i).map(([e, t]) => ({
258
238
  error: k.category,
259
239
  placeholder: O("devportal.selectCategory", "Select category")
260
240
  }),
261
- /* @__PURE__ */ x(s, {
241
+ /* @__PURE__ */ x(u, {
262
242
  label: O("devportal.visibility", "Visibility"),
263
243
  value: z.visibility,
264
244
  onChange: (e) => W("visibility", e.target.value),
265
245
  options: w,
266
246
  hint: O("devportal.visibilityHint", "Controls who can see this app once published. Public apps still require admin review and approval before appearing in the store.")
267
247
  }),
268
- /* @__PURE__ */ x(s, {
248
+ /* @__PURE__ */ x(u, {
269
249
  label: O("devportal.developerOrganization", "Developer Organization"),
270
250
  value: z.developerOrganizationId,
271
251
  onChange: (e) => W("developerOrganizationId", e.target.value),
@@ -274,14 +254,14 @@ var C = Object.entries(i).map(([e, t]) => ({
274
254
  })
275
255
  ]
276
256
  }),
277
- /* @__PURE__ */ x(c, {
257
+ /* @__PURE__ */ x(d, {
278
258
  label: O("devportal.tags", "Tags"),
279
259
  value: z.tags,
280
260
  onChange: (e) => W("tags", e),
281
261
  placeholder: O("devportal.addTagsPlaceholder", "Add tags (press Enter)"),
282
262
  hint: O("devportal.tagsHint", "Help users discover your app")
283
263
  }),
284
- /* @__PURE__ */ x(c, {
264
+ /* @__PURE__ */ x(d, {
285
265
  label: O("devportal.keywords", "Keywords"),
286
266
  value: z.keywords,
287
267
  onChange: (e) => W("keywords", e),
@@ -290,12 +270,12 @@ var C = Object.entries(i).map(([e, t]) => ({
290
270
  })
291
271
  ]
292
272
  }),
293
- /* @__PURE__ */ x(r, {
273
+ /* @__PURE__ */ x(o, {
294
274
  title: O("devportal.authenticationAndAuthorization", "Authentication & Authorization"),
295
275
  description: O("devportal.authenticationAndAuthorizationDescription", "Link this marketplace app to an auth app for OAuth, client credentials, API keys, delegation, and device flows."),
296
276
  children: /* @__PURE__ */ S("div", {
297
277
  className: "space-y-4",
298
- children: [/* @__PURE__ */ x(s, {
278
+ children: [/* @__PURE__ */ x(u, {
299
279
  label: O("devportal.linkedAuthApp", "Linked Auth App"),
300
280
  value: z.appId,
301
281
  onChange: (e) => W("appId", e.target.value),
@@ -310,48 +290,48 @@ var C = Object.entries(i).map(([e, t]) => ({
310
290
  })]
311
291
  })
312
292
  }),
313
- /* @__PURE__ */ x(r, {
293
+ /* @__PURE__ */ x(o, {
314
294
  title: O("devportal.links", "Links"),
315
295
  description: O("devportal.linksDescription", "External resources for your application"),
316
296
  children: /* @__PURE__ */ S("div", {
317
297
  className: "grid gap-4 sm:grid-cols-2",
318
298
  children: [
319
- /* @__PURE__ */ x(o, {
299
+ /* @__PURE__ */ x(l, {
320
300
  label: O("devportal.websiteUrl", "Website URL"),
321
301
  type: "url",
322
302
  value: z.websiteUrl,
323
303
  onChange: (e) => W("websiteUrl", e.target.value),
324
304
  placeholder: "https://example.com"
325
305
  }),
326
- /* @__PURE__ */ x(o, {
306
+ /* @__PURE__ */ x(l, {
327
307
  label: O("devportal.documentationUrl", "Documentation URL"),
328
308
  type: "url",
329
309
  value: z.documentationUrl,
330
310
  onChange: (e) => W("documentationUrl", e.target.value),
331
311
  placeholder: "https://docs.example.com"
332
312
  }),
333
- /* @__PURE__ */ x(o, {
313
+ /* @__PURE__ */ x(l, {
334
314
  label: O("devportal.supportUrl", "Support URL"),
335
315
  type: "url",
336
316
  value: z.supportUrl,
337
317
  onChange: (e) => W("supportUrl", e.target.value),
338
318
  placeholder: "https://support.example.com"
339
319
  }),
340
- /* @__PURE__ */ x(o, {
320
+ /* @__PURE__ */ x(l, {
341
321
  label: O("devportal.githubUrl", "GitHub URL"),
342
322
  type: "url",
343
323
  value: z.githubUrl,
344
324
  onChange: (e) => W("githubUrl", e.target.value),
345
325
  placeholder: "https://github.com/org/repo"
346
326
  }),
347
- /* @__PURE__ */ x(o, {
327
+ /* @__PURE__ */ x(l, {
348
328
  label: O("devportal.privacyPolicyUrl", "Privacy Policy URL"),
349
329
  type: "url",
350
330
  value: z.privacyPolicyUrl,
351
331
  onChange: (e) => W("privacyPolicyUrl", e.target.value),
352
332
  placeholder: "https://example.com/privacy"
353
333
  }),
354
- /* @__PURE__ */ x(o, {
334
+ /* @__PURE__ */ x(l, {
355
335
  label: O("devportal.termsOfServiceUrl", "Terms of Service URL"),
356
336
  type: "url",
357
337
  value: z.termsOfServiceUrl,
@@ -361,12 +341,12 @@ var C = Object.entries(i).map(([e, t]) => ({
361
341
  ]
362
342
  })
363
343
  }),
364
- /* @__PURE__ */ S(r, {
344
+ /* @__PURE__ */ S(o, {
365
345
  title: O("devportal.settings", "Settings"),
366
346
  description: O("devportal.settingsDescription", "Additional configuration options"),
367
347
  children: [/* @__PURE__ */ x("div", {
368
348
  className: "space-y-4",
369
- children: /* @__PURE__ */ x(a, {
349
+ children: /* @__PURE__ */ x(c, {
370
350
  label: O("devportal.requireWorkspaceAdminApproval", "Require workspace admin approval"),
371
351
  description: O("devportal.requireWorkspaceAdminApprovalDescription", "When enabled, workspace admins must approve installations before users can access this app"),
372
352
  checked: z.requiresApproval,
@@ -1 +1 @@
1
- {"version":3,"file":"CreateApplicationPage.js","names":[],"sources":["../../../src/devportal/pages/CreateApplicationPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { Save, X, Info } 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 TagInput,\n CheckboxField,\n} from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalEventBus } from \"../events\";\nimport type { AppType, AppVisibility } from \"../types\";\nimport { APP_TYPE_LABELS } from \"../utils/constants\";\nimport {\n useCreateApplicationMutation,\n useGetMyOrganizationsQuery,\n} from \"../../generated/global-operations\";\nimport { useCurrentUserAppsQuery } from \"../hooks\";\n\ninterface CreateApplicationFormData {\n name: string;\n slug: string;\n shortDescription: string;\n description: string;\n appType: AppType | \"\";\n visibility: AppVisibility;\n category: string;\n tags: string[];\n keywords: string[];\n websiteUrl: string;\n documentationUrl: string;\n supportUrl: string;\n privacyPolicyUrl: string;\n termsOfServiceUrl: string;\n githubUrl: string;\n developerOrganizationId: string;\n appId: string;\n requiresApproval: boolean;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n shortDescription?: string;\n appType?: string;\n category?: string;\n}\n\nconst APP_TYPE_OPTIONS = Object.entries(APP_TYPE_LABELS).map(\n ([value, label]) => ({\n value,\n label,\n }),\n);\n\nconst VISIBILITY_OPTIONS = [\n { value: \"PUBLIC\", label: \"Public - Visible to everyone\" },\n { value: \"PRIVATE\", label: \"Private - Only visible to you\" },\n { value: \"UNLISTED\", label: \"Unlisted - Accessible via direct link\" },\n { value: \"INTERNAL\", label: \"Internal - Only visible within organization\" },\n];\n\nconst CATEGORY_OPTIONS = [\n { value: \"productivity\", label: \"Productivity\" },\n { value: \"communication\", label: \"Communication\" },\n { value: \"analytics\", label: \"Analytics\" },\n { value: \"automation\", label: \"Automation\" },\n { value: \"developer-tools\", label: \"Developer Tools\" },\n { value: \"finance\", label: \"Finance\" },\n { value: \"hr\", label: \"HR & People\" },\n { value: \"marketing\", label: \"Marketing\" },\n { value: \"project-management\", label: \"Project Management\" },\n { value: \"security\", label: \"Security\" },\n { value: \"support\", label: \"Support\" },\n { value: \"other\", label: \"Other\" },\n];\n\n/**\n * Create new application page\n */\nexport const CreateApplicationPage: 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 [createApplication, { loading: isSubmitting }] =\n useCreateApplicationMutation();\n const bus = useDevportalEventBus();\n\n // Fetch real organizations\n const { data: orgsData } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data: authAppsData, loading: authAppsLoading } =\n useCurrentUserAppsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizationOptions = [\n { value: \"\", label: \"No organization (publish under personal account)\" },\n ...(orgsData?.myDeveloperOrganizations ?? []).map(\n (org: { id: string; name: string }) => ({\n value: org.id,\n label: org.name,\n }),\n ),\n ];\n\n const authAppOptions = [\n { value: \"\", label: tr(\"devportal.noLinkedAuthApp\", \"Link later\") },\n ...((authAppsData?.currentUserApps?.apps ?? []).map(\n (authApp: {\n id: string;\n name: string;\n type: string;\n clientId: string;\n }) => ({\n value: authApp.id,\n label: `${authApp.name} · ${authApp.type} · ${authApp.clientId}`,\n }),\n ) ?? []),\n ];\n\n const [formData, setFormData] = useState<CreateApplicationFormData>({\n name: \"\",\n slug: \"\",\n shortDescription: \"\",\n description: \"\",\n appType: \"\",\n visibility: \"PRIVATE\",\n category: \"\",\n tags: [],\n keywords: [],\n websiteUrl: \"\",\n documentationUrl: \"\",\n supportUrl: \"\",\n privacyPolicyUrl: \"\",\n termsOfServiceUrl: \"\",\n githubUrl: \"\",\n developerOrganizationId: \"\",\n appId: \"\",\n requiresApproval: false,\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 CreateApplicationFormData,\n value: string | string[] | boolean,\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 validateForm = (): boolean => {\n const newErrors: FormErrors = {};\n\n if (!formData.name.trim()) {\n newErrors.name = tr(\n \"devportal.appNameRequired\",\n \"Application name is required\",\n );\n } else if (formData.name.length < 3) {\n newErrors.name = tr(\n \"devportal.nameTooShort\",\n \"Name must be at least 3 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 (!formData.shortDescription.trim()) {\n newErrors.shortDescription = tr(\n \"devportal.shortDescriptionRequired\",\n \"Short description is required\",\n );\n } else if (formData.shortDescription.length > 200) {\n newErrors.shortDescription = tr(\n \"devportal.shortDescriptionTooLong\",\n \"Short description must be less than 200 characters\",\n );\n }\n\n if (!formData.appType) {\n newErrors.appType = tr(\n \"devportal.appTypeRequired\",\n \"Application type is required\",\n );\n }\n\n if (!formData.category) {\n newErrors.category = tr(\n \"devportal.categoryRequired\",\n \"Category is required\",\n );\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n try {\n const result = await createApplication({\n variables: {\n input: {\n name: formData.name,\n slug: formData.slug || undefined,\n shortDescription: formData.shortDescription || undefined,\n description: formData.description || undefined,\n appType: formData.appType as AppType,\n visibility: formData.visibility || undefined,\n category: formData.category || undefined,\n tags: formData.tags.length > 0 ? formData.tags : undefined,\n keywords:\n formData.keywords.length > 0 ? formData.keywords : undefined,\n websiteUrl: formData.websiteUrl || undefined,\n documentationUrl: formData.documentationUrl || undefined,\n supportUrl: formData.supportUrl || undefined,\n privacyPolicyUrl: formData.privacyPolicyUrl || undefined,\n termsOfServiceUrl: formData.termsOfServiceUrl || undefined,\n developerOrganizationId:\n formData.developerOrganizationId || undefined,\n appId: formData.appId || undefined,\n githubUrl: formData.githubUrl || undefined,\n requiresApproval: formData.requiresApproval,\n iconUrl: undefined,\n },\n },\n });\n\n if (result.data?.createApplication?.id) {\n bus.emit(\"devportal.app.created\", {\n appId: result.data.createApplication.id,\n name: formData.name,\n appType: formData.appType,\n organizationId: formData.developerOrganizationId || null,\n });\n handleNavigate(`/apps/${result.data.createApplication.id}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"slug\") ||\n message.includes(\"already exists\") ||\n message.includes(\"slugConflict\")\n ) {\n setErrors((prev) => ({\n ...prev,\n slug: tr(\n \"devportal.slugConflict\",\n \"This slug is already in use. Please choose a different name.\",\n ),\n }));\n } else {\n console.error(\"Failed to create application:\", error);\n }\n }\n };\n\n const handleCancel = () => {\n handleNavigate(\"/apps\");\n };\n\n return (\n <PermissionGuard permission={DEVPORTAL_PERMISSIONS.APP_CREATE}>\n <PageLayout\n title={tr(\"devportal.createApplication\", \"Create Application\")}\n description={tr(\n \"devportal.createApplicationDescription\",\n \"Register a new application in the developer portal\",\n )}\n backLink={`${basePath}/apps`}\n backLabel={tr(\"devportal.backToApplications\", \"Back to Applications\")}\n >\n <form onSubmit={handleSubmit} className=\"space-y-8 max-w-3xl\">\n {/* Basic Information */}\n <PageSection\n title={tr(\"devportal.basicInformation\", \"Basic Information\")}\n description={tr(\n \"devportal.basicInformationDescription\",\n \"Core details about your application\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.applicationName\", \"Application Name\")}\n value={formData.name}\n onChange={handleNameChange}\n placeholder={tr(\n \"devportal.applicationNamePlaceholder\",\n \"My Awesome App\",\n )}\n required\n error={errors.name}\n hint={tr(\n \"devportal.applicationNameHint\",\n \"Choose a memorable name for your application\",\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.slugPlaceholder\", \"my-awesome-app\")}\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.shortDescription\", \"Short Description\")}\n value={formData.shortDescription}\n onChange={(e) =>\n handleChange(\"shortDescription\", e.target.value)\n }\n placeholder={tr(\n \"devportal.shortDescriptionPlaceholder\",\n \"A brief description of what your app does\",\n )}\n required\n error={errors.shortDescription}\n hint={`${formData.shortDescription.length}/200 ${tr(\"devportal.characters\", \"characters\")}`}\n rows={2}\n />\n\n <TextareaField\n label={tr(\"devportal.fullDescription\", \"Full Description\")}\n value={formData.description}\n onChange={(e) => handleChange(\"description\", e.target.value)}\n placeholder={tr(\n \"devportal.fullDescriptionPlaceholder\",\n \"Detailed description of your application, features, and use cases...\",\n )}\n rows={6}\n hint={tr(\n \"devportal.markdownSupported\",\n \"Markdown formatting is supported\",\n )}\n />\n </div>\n </PageSection>\n\n {/* Classification */}\n <PageSection\n title={tr(\"devportal.classification\", \"Classification\")}\n description={tr(\n \"devportal.classificationDescription\",\n \"Categorize your application\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <SelectField\n label={tr(\"devportal.applicationType\", \"Application Type\")}\n value={formData.appType}\n onChange={(e) => handleChange(\"appType\", e.target.value)}\n options={APP_TYPE_OPTIONS}\n required\n error={errors.appType}\n placeholder={tr(\"devportal.selectAppType\", \"Select app type\")}\n />\n\n <SelectField\n label={tr(\"devportal.category\", \"Category\")}\n value={formData.category}\n onChange={(e) => handleChange(\"category\", e.target.value)}\n options={CATEGORY_OPTIONS}\n required\n error={errors.category}\n placeholder={tr(\"devportal.selectCategory\", \"Select category\")}\n />\n\n <SelectField\n label={tr(\"devportal.visibility\", \"Visibility\")}\n value={formData.visibility}\n onChange={(e) =>\n handleChange(\"visibility\", e.target.value as AppVisibility)\n }\n options={VISIBILITY_OPTIONS}\n hint={tr(\n \"devportal.visibilityHint\",\n \"Controls who can see this app once published. Public apps still require admin review and approval before appearing in the store.\",\n )}\n />\n\n <SelectField\n label={tr(\n \"devportal.developerOrganization\",\n \"Developer Organization\",\n )}\n value={formData.developerOrganizationId}\n onChange={(e) =>\n handleChange(\"developerOrganizationId\", e.target.value)\n }\n options={organizationOptions}\n hint={tr(\n \"devportal.developerOrganizationHint\",\n \"Optional: Associate with an organization\",\n )}\n />\n </div>\n\n <TagInput\n label={tr(\"devportal.tags\", \"Tags\")}\n value={formData.tags}\n onChange={(tags) => handleChange(\"tags\", tags)}\n placeholder={tr(\n \"devportal.addTagsPlaceholder\",\n \"Add tags (press Enter)\",\n )}\n hint={tr(\"devportal.tagsHint\", \"Help users discover your app\")}\n />\n\n <TagInput\n label={tr(\"devportal.keywords\", \"Keywords\")}\n value={formData.keywords}\n onChange={(keywords) => handleChange(\"keywords\", keywords)}\n placeholder={tr(\n \"devportal.addKeywordsPlaceholder\",\n \"Add keywords (press Enter)\",\n )}\n hint={tr(\"devportal.keywordsHint\", \"Improve search visibility\")}\n />\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.authenticationAndAuthorization\",\n \"Authentication & Authorization\",\n )}\n description={tr(\n \"devportal.authenticationAndAuthorizationDescription\",\n \"Link this marketplace app to an auth app for OAuth, client credentials, API keys, delegation, and device flows.\",\n )}\n >\n <div className=\"space-y-4\">\n <SelectField\n label={tr(\"devportal.linkedAuthApp\", \"Linked Auth App\")}\n value={formData.appId}\n onChange={(e) => handleChange(\"appId\", e.target.value)}\n options={authAppOptions}\n hint={tr(\n \"devportal.linkedAuthAppHint\",\n \"Select an existing auth app or create one first. You can still configure scopes, client credentials, app-as-user delegation, and device code in the OAuth Clients area.\",\n )}\n placeholder={\n authAppsLoading\n ? tr(\"devportal.loadingAuthApps\", \"Loading auth apps...\")\n : tr(\"devportal.selectAuthApp\", \"Select auth app\")\n }\n />\n\n <button\n type=\"button\"\n onClick={() => handleNavigate(\"/oauth/new\")}\n className=\"inline-flex items-center gap-2 rounded-md border px-3 py-2 text-sm font-medium hover:bg-muted transition-colors\"\n >\n <Save size={14} />\n {tr(\"devportal.createAuthAppFirst\", \"Create Auth App\")}\n </button>\n </div>\n </PageSection>\n\n {/* URLs */}\n <PageSection\n title={tr(\"devportal.links\", \"Links\")}\n description={tr(\n \"devportal.linksDescription\",\n \"External resources for your application\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\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 <InputField\n label={tr(\"devportal.documentationUrl\", \"Documentation URL\")}\n type=\"url\"\n value={formData.documentationUrl}\n onChange={(e) =>\n handleChange(\"documentationUrl\", e.target.value)\n }\n placeholder=\"https://docs.example.com\"\n />\n\n <InputField\n label={tr(\"devportal.supportUrl\", \"Support URL\")}\n type=\"url\"\n value={formData.supportUrl}\n onChange={(e) => handleChange(\"supportUrl\", e.target.value)}\n placeholder=\"https://support.example.com\"\n />\n\n <InputField\n label={tr(\"devportal.githubUrl\", \"GitHub URL\")}\n type=\"url\"\n value={formData.githubUrl}\n onChange={(e) => handleChange(\"githubUrl\", e.target.value)}\n placeholder=\"https://github.com/org/repo\"\n />\n\n <InputField\n label={tr(\"devportal.privacyPolicyUrl\", \"Privacy Policy URL\")}\n type=\"url\"\n value={formData.privacyPolicyUrl}\n onChange={(e) =>\n handleChange(\"privacyPolicyUrl\", e.target.value)\n }\n placeholder=\"https://example.com/privacy\"\n />\n\n <InputField\n label={tr(\n \"devportal.termsOfServiceUrl\",\n \"Terms of Service URL\",\n )}\n type=\"url\"\n value={formData.termsOfServiceUrl}\n onChange={(e) =>\n handleChange(\"termsOfServiceUrl\", e.target.value)\n }\n placeholder=\"https://example.com/terms\"\n />\n </div>\n </PageSection>\n\n {/* Settings */}\n <PageSection\n title={tr(\"devportal.settings\", \"Settings\")}\n description={tr(\n \"devportal.settingsDescription\",\n \"Additional configuration options\",\n )}\n >\n <div className=\"space-y-4\">\n <CheckboxField\n label={tr(\n \"devportal.requireWorkspaceAdminApproval\",\n \"Require workspace admin approval\",\n )}\n description={tr(\n \"devportal.requireWorkspaceAdminApprovalDescription\",\n \"When enabled, workspace admins must approve installations before users can access this app\",\n )}\n checked={formData.requiresApproval}\n onChange={(e) =>\n handleChange(\"requiresApproval\", e.target.checked)\n }\n />\n </div>\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.whatHappensNext\", \"What happens next?\")}\n </p>\n <ul className=\"mt-1 space-y-1 text-status-info-text\">\n <li>\n {tr(\n \"devportal.appCreatedInDraft\",\n \"Your app will be created in\",\n )}{\" \"}\n <strong>{tr(\"devportal.draft\", \"Draft\")}</strong>{\" \"}\n {tr(\"devportal.status\", \"status\")}\n </li>\n <li>\n {tr(\n \"devportal.canConfigureOAuthAndWebhooks\",\n \"You can configure OAuth clients, API keys, and webhooks\",\n )}\n </li>\n <li>\n {tr(\n \"devportal.submitForReviewWhenReady\",\n \"Submit for review when ready to publish to the marketplace\",\n )}\n </li>\n </ul>\n </div>\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 disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted transition-colors disabled:opacity-50\"\n >\n <X size={16} />\n {tr(\"devportal.cancel\", \"Cancel\")}\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 <Save size={16} />\n {tr(\"devportal.createApplication\", \"Create Application\")}\n </>\n )}\n </button>\n </div>\n </form>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"CreateApplicationPage.js","names":[],"sources":["../../../src/devportal/pages/CreateApplicationPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { Save, X, Info } 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 TagInput,\n CheckboxField,\n} from \"../components/FormField\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalEventBus } from \"../events\";\nimport type { AppType, AppVisibility } from \"../types\";\nimport { APP_TYPE_LABELS } from \"../utils/constants\";\nimport {\n useCreateApplicationMutation,\n useGetMyOrganizationsQuery,\n} from \"../../generated/global-operations\";\nimport { useCurrentUserAppsQuery } from \"../hooks\";\n\ninterface CreateApplicationFormData {\n name: string;\n slug: string;\n shortDescription: string;\n description: string;\n appType: AppType | \"\";\n visibility: AppVisibility;\n category: string;\n tags: string[];\n keywords: string[];\n websiteUrl: string;\n documentationUrl: string;\n supportUrl: string;\n privacyPolicyUrl: string;\n termsOfServiceUrl: string;\n githubUrl: string;\n developerOrganizationId: string;\n appId: string;\n requiresApproval: boolean;\n}\n\ninterface FormErrors {\n name?: string;\n slug?: string;\n shortDescription?: string;\n appType?: string;\n category?: string;\n}\n\nconst APP_TYPE_OPTIONS = Object.entries(APP_TYPE_LABELS).map(\n ([value, label]) => ({\n value,\n label,\n }),\n);\n\nconst VISIBILITY_OPTIONS = [\n { value: \"PUBLIC\", label: \"Public - Visible to everyone\" },\n { value: \"PRIVATE\", label: \"Private - Only visible to you\" },\n { value: \"UNLISTED\", label: \"Unlisted - Accessible via direct link\" },\n { value: \"INTERNAL\", label: \"Internal - Only visible within organization\" },\n];\n\nconst CATEGORY_OPTIONS = [\n { value: \"ai\", label: \"AI & Automation\" },\n { value: \"integration\", label: \"Action in an App\" },\n { value: \"data\", label: \"Data & Transform\" },\n { value: \"flow\", label: \"Flow & Logic\" },\n { value: \"core\", label: \"Core\" },\n { value: \"communication\", label: \"Communication\" },\n { value: \"trigger\", label: \"Triggers\" },\n];\n\n/**\n * Create new application page\n */\nexport const CreateApplicationPage: 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 [createApplication, { loading: isSubmitting }] =\n useCreateApplicationMutation();\n const bus = useDevportalEventBus();\n\n // Fetch real organizations\n const { data: orgsData } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data: authAppsData, loading: authAppsLoading } =\n useCurrentUserAppsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizationOptions = [\n { value: \"\", label: \"No organization (publish under personal account)\" },\n ...(orgsData?.myDeveloperOrganizations ?? []).map(\n (org: { id: string; name: string }) => ({\n value: org.id,\n label: org.name,\n }),\n ),\n ];\n\n const authAppOptions = [\n { value: \"\", label: tr(\"devportal.noLinkedAuthApp\", \"Link later\") },\n ...((authAppsData?.currentUserApps?.apps ?? []).map(\n (authApp: {\n id: string;\n name: string;\n type: string;\n clientId: string;\n }) => ({\n value: authApp.id,\n label: `${authApp.name} · ${authApp.type} · ${authApp.clientId}`,\n }),\n ) ?? []),\n ];\n\n const [formData, setFormData] = useState<CreateApplicationFormData>({\n name: \"\",\n slug: \"\",\n shortDescription: \"\",\n description: \"\",\n appType: \"\",\n visibility: \"PRIVATE\",\n category: \"\",\n tags: [],\n keywords: [],\n websiteUrl: \"\",\n documentationUrl: \"\",\n supportUrl: \"\",\n privacyPolicyUrl: \"\",\n termsOfServiceUrl: \"\",\n githubUrl: \"\",\n developerOrganizationId: \"\",\n appId: \"\",\n requiresApproval: false,\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 CreateApplicationFormData,\n value: string | string[] | boolean,\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 validateForm = (): boolean => {\n const newErrors: FormErrors = {};\n\n if (!formData.name.trim()) {\n newErrors.name = tr(\n \"devportal.appNameRequired\",\n \"Application name is required\",\n );\n } else if (formData.name.length < 3) {\n newErrors.name = tr(\n \"devportal.nameTooShort\",\n \"Name must be at least 3 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 (!formData.shortDescription.trim()) {\n newErrors.shortDescription = tr(\n \"devportal.shortDescriptionRequired\",\n \"Short description is required\",\n );\n } else if (formData.shortDescription.length > 200) {\n newErrors.shortDescription = tr(\n \"devportal.shortDescriptionTooLong\",\n \"Short description must be less than 200 characters\",\n );\n }\n\n if (!formData.appType) {\n newErrors.appType = tr(\n \"devportal.appTypeRequired\",\n \"Application type is required\",\n );\n }\n\n if (!formData.category) {\n newErrors.category = tr(\n \"devportal.categoryRequired\",\n \"Category is required\",\n );\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n try {\n const result = await createApplication({\n variables: {\n input: {\n name: formData.name,\n slug: formData.slug || undefined,\n shortDescription: formData.shortDescription || undefined,\n description: formData.description || undefined,\n appType: formData.appType as AppType,\n visibility: formData.visibility || undefined,\n category: formData.category || undefined,\n tags: formData.tags.length > 0 ? formData.tags : undefined,\n keywords:\n formData.keywords.length > 0 ? formData.keywords : undefined,\n websiteUrl: formData.websiteUrl || undefined,\n documentationUrl: formData.documentationUrl || undefined,\n supportUrl: formData.supportUrl || undefined,\n privacyPolicyUrl: formData.privacyPolicyUrl || undefined,\n termsOfServiceUrl: formData.termsOfServiceUrl || undefined,\n developerOrganizationId:\n formData.developerOrganizationId || undefined,\n appId: formData.appId || undefined,\n githubUrl: formData.githubUrl || undefined,\n requiresApproval: formData.requiresApproval,\n iconUrl: undefined,\n },\n },\n });\n\n if (result.data?.createApplication?.id) {\n bus.emit(\"devportal.app.created\", {\n appId: result.data.createApplication.id,\n name: formData.name,\n appType: formData.appType,\n organizationId: formData.developerOrganizationId || null,\n });\n handleNavigate(`/apps/${result.data.createApplication.id}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"slug\") ||\n message.includes(\"already exists\") ||\n message.includes(\"slugConflict\")\n ) {\n setErrors((prev) => ({\n ...prev,\n slug: tr(\n \"devportal.slugConflict\",\n \"This slug is already in use. Please choose a different name.\",\n ),\n }));\n } else {\n console.error(\"Failed to create application:\", error);\n }\n }\n };\n\n const handleCancel = () => {\n handleNavigate(\"/apps\");\n };\n\n return (\n <PermissionGuard permission={DEVPORTAL_PERMISSIONS.APP_CREATE}>\n <PageLayout\n title={tr(\"devportal.createApplication\", \"Create Application\")}\n description={tr(\n \"devportal.createApplicationDescription\",\n \"Register a new application in the developer portal\",\n )}\n backLink={`${basePath}/apps`}\n backLabel={tr(\"devportal.backToApplications\", \"Back to Applications\")}\n >\n <form onSubmit={handleSubmit} className=\"space-y-8 max-w-3xl\">\n {/* Basic Information */}\n <PageSection\n title={tr(\"devportal.basicInformation\", \"Basic Information\")}\n description={tr(\n \"devportal.basicInformationDescription\",\n \"Core details about your application\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.applicationName\", \"Application Name\")}\n value={formData.name}\n onChange={handleNameChange}\n placeholder={tr(\n \"devportal.applicationNamePlaceholder\",\n \"My Awesome App\",\n )}\n required\n error={errors.name}\n hint={tr(\n \"devportal.applicationNameHint\",\n \"Choose a memorable name for your application\",\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.slugPlaceholder\", \"my-awesome-app\")}\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.shortDescription\", \"Short Description\")}\n value={formData.shortDescription}\n onChange={(e) =>\n handleChange(\"shortDescription\", e.target.value)\n }\n placeholder={tr(\n \"devportal.shortDescriptionPlaceholder\",\n \"A brief description of what your app does\",\n )}\n required\n error={errors.shortDescription}\n hint={`${formData.shortDescription.length}/200 ${tr(\"devportal.characters\", \"characters\")}`}\n rows={2}\n />\n\n <TextareaField\n label={tr(\"devportal.fullDescription\", \"Full Description\")}\n value={formData.description}\n onChange={(e) => handleChange(\"description\", e.target.value)}\n placeholder={tr(\n \"devportal.fullDescriptionPlaceholder\",\n \"Detailed description of your application, features, and use cases...\",\n )}\n rows={6}\n hint={tr(\n \"devportal.markdownSupported\",\n \"Markdown formatting is supported\",\n )}\n />\n </div>\n </PageSection>\n\n {/* Classification */}\n <PageSection\n title={tr(\"devportal.classification\", \"Classification\")}\n description={tr(\n \"devportal.classificationDescription\",\n \"Categorize your application\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <SelectField\n label={tr(\"devportal.applicationType\", \"Application Type\")}\n value={formData.appType}\n onChange={(e) => handleChange(\"appType\", e.target.value)}\n options={APP_TYPE_OPTIONS}\n required\n error={errors.appType}\n placeholder={tr(\"devportal.selectAppType\", \"Select app type\")}\n />\n\n <SelectField\n label={tr(\"devportal.category\", \"Category\")}\n value={formData.category}\n onChange={(e) => handleChange(\"category\", e.target.value)}\n options={CATEGORY_OPTIONS}\n required\n error={errors.category}\n placeholder={tr(\"devportal.selectCategory\", \"Select category\")}\n />\n\n <SelectField\n label={tr(\"devportal.visibility\", \"Visibility\")}\n value={formData.visibility}\n onChange={(e) =>\n handleChange(\"visibility\", e.target.value as AppVisibility)\n }\n options={VISIBILITY_OPTIONS}\n hint={tr(\n \"devportal.visibilityHint\",\n \"Controls who can see this app once published. Public apps still require admin review and approval before appearing in the store.\",\n )}\n />\n\n <SelectField\n label={tr(\n \"devportal.developerOrganization\",\n \"Developer Organization\",\n )}\n value={formData.developerOrganizationId}\n onChange={(e) =>\n handleChange(\"developerOrganizationId\", e.target.value)\n }\n options={organizationOptions}\n hint={tr(\n \"devportal.developerOrganizationHint\",\n \"Optional: Associate with an organization\",\n )}\n />\n </div>\n\n <TagInput\n label={tr(\"devportal.tags\", \"Tags\")}\n value={formData.tags}\n onChange={(tags) => handleChange(\"tags\", tags)}\n placeholder={tr(\n \"devportal.addTagsPlaceholder\",\n \"Add tags (press Enter)\",\n )}\n hint={tr(\"devportal.tagsHint\", \"Help users discover your app\")}\n />\n\n <TagInput\n label={tr(\"devportal.keywords\", \"Keywords\")}\n value={formData.keywords}\n onChange={(keywords) => handleChange(\"keywords\", keywords)}\n placeholder={tr(\n \"devportal.addKeywordsPlaceholder\",\n \"Add keywords (press Enter)\",\n )}\n hint={tr(\"devportal.keywordsHint\", \"Improve search visibility\")}\n />\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.authenticationAndAuthorization\",\n \"Authentication & Authorization\",\n )}\n description={tr(\n \"devportal.authenticationAndAuthorizationDescription\",\n \"Link this marketplace app to an auth app for OAuth, client credentials, API keys, delegation, and device flows.\",\n )}\n >\n <div className=\"space-y-4\">\n <SelectField\n label={tr(\"devportal.linkedAuthApp\", \"Linked Auth App\")}\n value={formData.appId}\n onChange={(e) => handleChange(\"appId\", e.target.value)}\n options={authAppOptions}\n hint={tr(\n \"devportal.linkedAuthAppHint\",\n \"Select an existing auth app or create one first. You can still configure scopes, client credentials, app-as-user delegation, and device code in the OAuth Clients area.\",\n )}\n placeholder={\n authAppsLoading\n ? tr(\"devportal.loadingAuthApps\", \"Loading auth apps...\")\n : tr(\"devportal.selectAuthApp\", \"Select auth app\")\n }\n />\n\n <button\n type=\"button\"\n onClick={() => handleNavigate(\"/oauth/new\")}\n className=\"inline-flex items-center gap-2 rounded-md border px-3 py-2 text-sm font-medium hover:bg-muted transition-colors\"\n >\n <Save size={14} />\n {tr(\"devportal.createAuthAppFirst\", \"Create Auth App\")}\n </button>\n </div>\n </PageSection>\n\n {/* URLs */}\n <PageSection\n title={tr(\"devportal.links\", \"Links\")}\n description={tr(\n \"devportal.linksDescription\",\n \"External resources for your application\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2\">\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 <InputField\n label={tr(\"devportal.documentationUrl\", \"Documentation URL\")}\n type=\"url\"\n value={formData.documentationUrl}\n onChange={(e) =>\n handleChange(\"documentationUrl\", e.target.value)\n }\n placeholder=\"https://docs.example.com\"\n />\n\n <InputField\n label={tr(\"devportal.supportUrl\", \"Support URL\")}\n type=\"url\"\n value={formData.supportUrl}\n onChange={(e) => handleChange(\"supportUrl\", e.target.value)}\n placeholder=\"https://support.example.com\"\n />\n\n <InputField\n label={tr(\"devportal.githubUrl\", \"GitHub URL\")}\n type=\"url\"\n value={formData.githubUrl}\n onChange={(e) => handleChange(\"githubUrl\", e.target.value)}\n placeholder=\"https://github.com/org/repo\"\n />\n\n <InputField\n label={tr(\"devportal.privacyPolicyUrl\", \"Privacy Policy URL\")}\n type=\"url\"\n value={formData.privacyPolicyUrl}\n onChange={(e) =>\n handleChange(\"privacyPolicyUrl\", e.target.value)\n }\n placeholder=\"https://example.com/privacy\"\n />\n\n <InputField\n label={tr(\n \"devportal.termsOfServiceUrl\",\n \"Terms of Service URL\",\n )}\n type=\"url\"\n value={formData.termsOfServiceUrl}\n onChange={(e) =>\n handleChange(\"termsOfServiceUrl\", e.target.value)\n }\n placeholder=\"https://example.com/terms\"\n />\n </div>\n </PageSection>\n\n {/* Settings */}\n <PageSection\n title={tr(\"devportal.settings\", \"Settings\")}\n description={tr(\n \"devportal.settingsDescription\",\n \"Additional configuration options\",\n )}\n >\n <div className=\"space-y-4\">\n <CheckboxField\n label={tr(\n \"devportal.requireWorkspaceAdminApproval\",\n \"Require workspace admin approval\",\n )}\n description={tr(\n \"devportal.requireWorkspaceAdminApprovalDescription\",\n \"When enabled, workspace admins must approve installations before users can access this app\",\n )}\n checked={formData.requiresApproval}\n onChange={(e) =>\n handleChange(\"requiresApproval\", e.target.checked)\n }\n />\n </div>\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.whatHappensNext\", \"What happens next?\")}\n </p>\n <ul className=\"mt-1 space-y-1 text-status-info-text\">\n <li>\n {tr(\n \"devportal.appCreatedInDraft\",\n \"Your app will be created in\",\n )}{\" \"}\n <strong>{tr(\"devportal.draft\", \"Draft\")}</strong>{\" \"}\n {tr(\"devportal.status\", \"status\")}\n </li>\n <li>\n {tr(\n \"devportal.canConfigureOAuthAndWebhooks\",\n \"You can configure OAuth clients, API keys, and webhooks\",\n )}\n </li>\n <li>\n {tr(\n \"devportal.submitForReviewWhenReady\",\n \"Submit for review when ready to publish to the marketplace\",\n )}\n </li>\n </ul>\n </div>\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 disabled={isSubmitting}\n className=\"inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-muted transition-colors disabled:opacity-50\"\n >\n <X size={16} />\n {tr(\"devportal.cancel\", \"Cancel\")}\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 <Save size={16} />\n {tr(\"devportal.createApplication\", \"Create Application\")}\n </>\n )}\n </button>\n </div>\n </form>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAqDA,IAAM,IAAmB,OAAO,QAAQ,EAAgB,CAAC,KACtD,CAAC,GAAO,QAAY;CACnB;CACA;CACD,EACF,EAEK,IAAqB;CACzB;EAAE,OAAO;EAAU,OAAO;EAAgC;CAC1D;EAAE,OAAO;EAAW,OAAO;EAAiC;CAC5D;EAAE,OAAO;EAAY,OAAO;EAAyC;CACrE;EAAE,OAAO;EAAY,OAAO;EAA+C;CAC5E,EAEK,IAAmB;CACvB;EAAE,OAAO;EAAM,OAAO;EAAmB;CACzC;EAAE,OAAO;EAAe,OAAO;EAAoB;CACnD;EAAE,OAAO;EAAQ,OAAO;EAAoB;CAC5C;EAAE,OAAO;EAAQ,OAAO;EAAgB;CACxC;EAAE,OAAO;EAAQ,OAAO;EAAQ;CAChC;EAAE,OAAO;EAAiB,OAAO;EAAiB;CAClD;EAAE,OAAO;EAAW,OAAO;EAAY;CACxC,EAKY,UAAkC;CAC7C,IAAM,EAAE,aAAU,gBAAa,GAAc,EACvC,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,GAAmB,EAAE,SAAS,OACnC,GAA8B,EAC1B,IAAM,GAAsB,EAG5B,EAAE,MAAM,MAAa,EAA2B,EACpD,aAAa,qBACd,CAAC,EACI,EAAE,MAAM,GAAc,SAAS,MACnC,EAAwB,EACtB,aAAa,qBACd,CAAC,EAEE,IAAsB,CAC1B;EAAE,OAAO;EAAI,OAAO;EAAoD,EACxE,IAAI,GAAU,4BAA4B,EAAE,EAAE,KAC3C,OAAuC;EACtC,OAAO,EAAI;EACX,OAAO,EAAI;EACZ,EACF,CACF,EAEK,IAAiB,CACrB;EAAE,OAAO;EAAI,OAAO,EAAG,6BAA6B,aAAa;EAAE,EACnE,IAAK,GAAc,iBAAiB,QAAQ,EAAE,EAAE,KAC7C,OAKM;EACL,OAAO,EAAQ;EACf,OAAO,GAAG,EAAQ,KAAK,KAAK,EAAQ,KAAK,KAAK,EAAQ;EACvD,EACF,IAAI,EAAE,CACR,EAEK,CAAC,GAAU,KAAe,EAAoC;EAClE,MAAM;EACN,MAAM;EACN,kBAAkB;EAClB,aAAa;EACb,SAAS;EACT,YAAY;EACZ,UAAU;EACV,MAAM,EAAE;EACR,UAAU,EAAE;EACZ,YAAY;EACZ,kBAAkB;EAClB,YAAY;EACZ,kBAAkB;EAClB,mBAAmB;EACnB,WAAW;EACX,yBAAyB;EACzB,OAAO;EACP,kBAAkB;EACnB,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,UAA8B;EAClC,IAAM,IAAwB,EAAE;AAuDhC,SArDK,EAAS,KAAK,MAAM,GAKd,EAAS,KAAK,SAAS,IAChC,EAAU,OAAO,EACf,0BACA,qCACD,GACQ,EAAS,KAAK,SAAS,QAChC,EAAU,OAAO,EACf,yBACA,wCACD,IAbD,EAAU,OAAO,EACf,6BACA,+BACD,EAaE,EAAS,KAAK,MAAM,GAEb,eAAe,KAAK,EAAS,KAAK,KAC5C,EAAU,OAAO,EACf,yBACA,gEACD,IALD,EAAU,OAAO,EAAG,0BAA0B,mBAAmB,EAQ9D,EAAS,iBAAiB,MAAM,GAK1B,EAAS,iBAAiB,SAAS,QAC5C,EAAU,mBAAmB,EAC3B,qCACA,qDACD,IARD,EAAU,mBAAmB,EAC3B,sCACA,gCACD,EAQE,EAAS,YACZ,EAAU,UAAU,EAClB,6BACA,+BACD,GAGE,EAAS,aACZ,EAAU,WAAW,EACnB,8BACA,uBACD,GAGH,EAAU,EAAU,EACb,OAAO,KAAK,EAAU,CAAC,WAAW;;AAwE3C,QACE,kBAAC,GAAD;EAAiB,YAAY,EAAsB;YACjD,kBAAC,GAAD;GACE,OAAO,EAAG,+BAA+B,qBAAqB;GAC9D,aAAa,EACX,0CACA,qDACD;GACD,UAAU,GAAG,EAAS;GACtB,WAAW,EAAG,gCAAgC,uBAAuB;aAErE,kBAAC,QAAD;IAAM,UAhFS,OAAO,MAAuB;AACjD,WAAE,gBAAgB,EAEb,GAAc,CAInB,KAAI;MACF,IAAM,IAAS,MAAM,EAAkB,EACrC,WAAW,EACT,OAAO;OACL,MAAM,EAAS;OACf,MAAM,EAAS,QAAQ,KAAA;OACvB,kBAAkB,EAAS,oBAAoB,KAAA;OAC/C,aAAa,EAAS,eAAe,KAAA;OACrC,SAAS,EAAS;OAClB,YAAY,EAAS,cAAc,KAAA;OACnC,UAAU,EAAS,YAAY,KAAA;OAC/B,MAAM,EAAS,KAAK,SAAS,IAAI,EAAS,OAAO,KAAA;OACjD,UACE,EAAS,SAAS,SAAS,IAAI,EAAS,WAAW,KAAA;OACrD,YAAY,EAAS,cAAc,KAAA;OACnC,kBAAkB,EAAS,oBAAoB,KAAA;OAC/C,YAAY,EAAS,cAAc,KAAA;OACnC,kBAAkB,EAAS,oBAAoB,KAAA;OAC/C,mBAAmB,EAAS,qBAAqB,KAAA;OACjD,yBACE,EAAS,2BAA2B,KAAA;OACtC,OAAO,EAAS,SAAS,KAAA;OACzB,WAAW,EAAS,aAAa,KAAA;OACjC,kBAAkB,EAAS;OAC3B,SAAS,KAAA;OACV,EACF,EACF,CAAC;AAEF,MAAI,EAAO,MAAM,mBAAmB,OAClC,EAAI,KAAK,yBAAyB;OAChC,OAAO,EAAO,KAAK,kBAAkB;OACrC,MAAM,EAAS;OACf,SAAS,EAAS;OAClB,gBAAgB,EAAS,2BAA2B;OACrD,CAAC,EACF,EAAe,SAAS,EAAO,KAAK,kBAAkB,KAAK;cAEtD,GAAO;MACd,IAAM,IAAU,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM;AACtE,MACE,EAAQ,SAAS,OAAO,IACxB,EAAQ,SAAS,iBAAiB,IAClC,EAAQ,SAAS,eAAe,GAEhC,GAAW,OAAU;OACnB,GAAG;OACH,MAAM,EACJ,0BACA,+DACD;OACF,EAAE,GAEH,QAAQ,MAAM,iCAAiC,EAAM;;;IAoBvB,WAAU;cAAxC;KAEE,kBAAC,GAAD;MACE,OAAO,EAAG,8BAA8B,oBAAoB;MAC5D,aAAa,EACX,yCACA,sCACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD;SACE,OAAO,EAAG,6BAA6B,mBAAmB;SAC1D,OAAO,EAAS;SAChB,UAAU;SACV,aAAa,EACX,wCACA,iBACD;SACD,UAAA;SACA,OAAO,EAAO;SACd,MAAM,EACJ,iCACA,+CACD;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,6BAA6B,iBAAiB;SAC9D,UAAA;SACA,OAAO,EAAO;SACd,MAAM,EACJ,sBACA,qDACD;SACD,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EAAG,8BAA8B,oBAAoB;SAC5D,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,oBAAoB,EAAE,OAAO,MAAM;SAElD,aAAa,EACX,yCACA,4CACD;SACD,UAAA;SACA,OAAO,EAAO;SACd,MAAM,GAAG,EAAS,iBAAiB,OAAO,OAAO,EAAG,wBAAwB,aAAa;SACzF,MAAM;SACN,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EAAG,6BAA6B,mBAAmB;SAC1D,OAAO,EAAS;SAChB,WAAW,MAAM,EAAa,eAAe,EAAE,OAAO,MAAM;SAC5D,aAAa,EACX,wCACA,uEACD;SACD,MAAM;SACN,MAAM,EACJ,+BACA,mCACD;SACD,CAAA;QACE;;MACM,CAAA;KAGd,kBAAC,GAAD;MACE,OAAO,EAAG,4BAA4B,iBAAiB;MACvD,aAAa,EACX,uCACA,8BACD;gBALH;OAOE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UACE,OAAO,EAAG,6BAA6B,mBAAmB;UAC1D,OAAO,EAAS;UAChB,WAAW,MAAM,EAAa,WAAW,EAAE,OAAO,MAAM;UACxD,SAAS;UACT,UAAA;UACA,OAAO,EAAO;UACd,aAAa,EAAG,2BAA2B,kBAAkB;UAC7D,CAAA;SAEF,kBAAC,GAAD;UACE,OAAO,EAAG,sBAAsB,WAAW;UAC3C,OAAO,EAAS;UAChB,WAAW,MAAM,EAAa,YAAY,EAAE,OAAO,MAAM;UACzD,SAAS;UACT,UAAA;UACA,OAAO,EAAO;UACd,aAAa,EAAG,4BAA4B,kBAAkB;UAC9D,CAAA;SAEF,kBAAC,GAAD;UACE,OAAO,EAAG,wBAAwB,aAAa;UAC/C,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,cAAc,EAAE,OAAO,MAAuB;UAE7D,SAAS;UACT,MAAM,EACJ,4BACA,mIACD;UACD,CAAA;SAEF,kBAAC,GAAD;UACE,OAAO,EACL,mCACA,yBACD;UACD,OAAO,EAAS;UAChB,WAAW,MACT,EAAa,2BAA2B,EAAE,OAAO,MAAM;UAEzD,SAAS;UACT,MAAM,EACJ,uCACA,2CACD;UACD,CAAA;SACE;;OAEN,kBAAC,GAAD;QACE,OAAO,EAAG,kBAAkB,OAAO;QACnC,OAAO,EAAS;QAChB,WAAW,MAAS,EAAa,QAAQ,EAAK;QAC9C,aAAa,EACX,gCACA,yBACD;QACD,MAAM,EAAG,sBAAsB,+BAA+B;QAC9D,CAAA;OAEF,kBAAC,GAAD;QACE,OAAO,EAAG,sBAAsB,WAAW;QAC3C,OAAO,EAAS;QAChB,WAAW,MAAa,EAAa,YAAY,EAAS;QAC1D,aAAa,EACX,oCACA,6BACD;QACD,MAAM,EAAG,0BAA0B,4BAA4B;QAC/D,CAAA;OACU;;KAEd,kBAAC,GAAD;MACE,OAAO,EACL,4CACA,iCACD;MACD,aAAa,EACX,uDACA,kHACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,OAAO,EAAG,2BAA2B,kBAAkB;QACvD,OAAO,EAAS;QAChB,WAAW,MAAM,EAAa,SAAS,EAAE,OAAO,MAAM;QACtD,SAAS;QACT,MAAM,EACJ,+BACA,0KACD;QACD,aACE,IACI,EAAG,6BAA6B,uBAAuB,GACvD,EAAG,2BAA2B,kBAAkB;QAEtD,CAAA,EAEF,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAe,aAAa;QAC3C,WAAU;kBAHZ,CAKE,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA,EACjB,EAAG,gCAAgC,kBAAkB,CAC/C;UACL;;MACM,CAAA;KAGd,kBAAC,GAAD;MACE,OAAO,EAAG,mBAAmB,QAAQ;MACrC,aAAa,EACX,8BACA,0CACD;gBAED,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,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,GAAD;SACE,OAAO,EAAG,8BAA8B,oBAAoB;SAC5D,MAAK;SACL,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,oBAAoB,EAAE,OAAO,MAAM;SAElD,aAAY;SACZ,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,GAAD;SACE,OAAO,EAAG,uBAAuB,aAAa;SAC9C,MAAK;SACL,OAAO,EAAS;SAChB,WAAW,MAAM,EAAa,aAAa,EAAE,OAAO,MAAM;SAC1D,aAAY;SACZ,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EAAG,8BAA8B,qBAAqB;SAC7D,MAAK;SACL,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,oBAAoB,EAAE,OAAO,MAAM;SAElD,aAAY;SACZ,CAAA;QAEF,kBAAC,GAAD;SACE,OAAO,EACL,+BACA,uBACD;SACD,MAAK;SACL,OAAO,EAAS;SAChB,WAAW,MACT,EAAa,qBAAqB,EAAE,OAAO,MAAM;SAEnD,aAAY;SACZ,CAAA;QACE;;MACM,CAAA;KAGd,kBAAC,GAAD;MACE,OAAO,EAAG,sBAAsB,WAAW;MAC3C,aAAa,EACX,iCACA,mCACD;gBALH,CAOE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QACE,OAAO,EACL,2CACA,mCACD;QACD,aAAa,EACX,sDACA,6FACD;QACD,SAAS,EAAS;QAClB,WAAW,MACT,EAAa,oBAAoB,EAAE,OAAO,QAAQ;QAEpD,CAAA;OACE,CAAA,EAGN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,MAAM;QACN,WAAU;QACV,CAAA,EACF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAG,6BAA6B,qBAAqB;SACpD,CAAA,EACJ,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACE,kBAAC,MAAD,EAAA,UAAA;WACG,EACC,+BACA,8BACD;WAAE;WACH,kBAAC,UAAD,EAAA,UAAS,EAAG,mBAAmB,QAAQ,EAAU,CAAA;WAAC;WACjD,EAAG,oBAAoB,SAAS;WAC9B,EAAA,CAAA;UACL,kBAAC,MAAD,EAAA,UACG,EACC,0CACA,0DACD,EACE,CAAA;UACL,kBAAC,MAAD,EAAA,UACG,EACC,sCACA,6DACD,EACE,CAAA;UACF;WACD;UACF;SACM;;KAGd,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,MAAK;OACL,eAtVe;AACzB,UAAe,QAAQ;;OAsVb,UAAU;OACV,WAAU;iBAJZ,CAME,kBAAC,GAAD,EAAG,MAAM,IAAM,CAAA,EACd,EAAG,oBAAoB,SAAS,CAC1B;UACT,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,EAAM,MAAM,IAAM,CAAA,EACjB,EAAG,+BAA+B,qBAAqB,CACvD,EAAA,CAAA;OAEE,CAAA,CACL;;KACD;;GACI,CAAA;EACG,CAAA"}