@burdenoff/microfe-devportal 2026.720.7 → 2026.728.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 (27) hide show
  1. package/dist/devportal/components/ConfirmDialog.d.ts.map +1 -1
  2. package/dist/devportal/components/ConfirmDialog.js +12 -14
  3. package/dist/devportal/components/ConfirmDialog.js.map +1 -1
  4. package/dist/devportal/hooks/usePackageUpload.d.ts.map +1 -1
  5. package/dist/devportal/hooks/usePackageUpload.js.map +1 -1
  6. package/dist/devportal/pages/ApplicationDetailPage.js +2 -2
  7. package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
  8. package/dist/devportal/pages/ApplicationVersionsPage.d.ts.map +1 -1
  9. package/dist/devportal/pages/ApplicationVersionsPage.js +276 -271
  10. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  11. package/dist/devportal/pages/CreateApplicationPage.d.ts.map +1 -1
  12. package/dist/devportal/pages/CreateApplicationPage.js +246 -177
  13. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  14. package/dist/devportal/pages/EditApplicationPage.d.ts.map +1 -1
  15. package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
  16. package/dist/devportal/pages/PublishPage.d.ts.map +1 -1
  17. package/dist/devportal/pages/PublishPage.js.map +1 -1
  18. package/dist/devportal/pages/SellerDashboardPage.d.ts.map +1 -1
  19. package/dist/devportal/pages/SellerDashboardPage.js.map +1 -1
  20. package/dist/devportal/pages/SellerItemsPage.d.ts.map +1 -1
  21. package/dist/devportal/pages/SellerItemsPage.js.map +1 -1
  22. package/dist/devportal/types/index.d.ts.map +1 -1
  23. package/dist/devportal/types/index.js.map +1 -1
  24. package/dist/devportal/utils/constants.d.ts.map +1 -1
  25. package/dist/devportal/utils/constants.js +3 -1
  26. package/dist/devportal/utils/constants.js.map +1 -1
  27. package/package.json +1 -1
@@ -3,16 +3,107 @@ import { cn as t } from "../utils/cn.js";
3
3
  import { useDevportalEventBus as n } from "../events/index.js";
4
4
  import { useCreateApplicationMutation as r, useGetMyOrganizationsQuery as i } from "../../generated/global-operations.js";
5
5
  import { PageLayout as a, PageSection as o } from "../components/PageLayout.js";
6
- import { InputField as s, SelectField as c, TextareaField as l } from "../components/FormField.js";
7
- import { PermissionGuard as u } from "../components/PermissionGuard.js";
8
- import { MarkdownEditor as d } from "../components/MarkdownEditor.js";
6
+ import { InputField as s, SelectField as c } from "../components/FormField.js";
7
+ import { PermissionGuard as l } from "../components/PermissionGuard.js";
8
+ import { MarkdownEditor as u } from "../components/MarkdownEditor.js";
9
9
  import "../components/index.js";
10
- import { useRef as f, useState as p } from "react";
11
- import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
- import { ArrowLeft as h, Box as g, Check as _, ChevronRight as v, GitFork as y, Info as b, Loader2 as x, Puzzle as S, Save as ee, X as te } from "lucide-react";
10
+ import { useRef as ee, useState as d } from "react";
11
+ import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
+ import { ArrowLeft as p, Box as m, Check as h, ChevronRight as g, FileCode2 as _, GitFork as v, Info as y, LayoutDashboard as b, LayoutGrid as x, Loader2 as te, Puzzle as S, Save as ne, X as re } from "lucide-react";
13
13
  import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
14
14
  //#region src/devportal/pages/CreateApplicationPage.tsx
15
- var E = [
15
+ var E = {
16
+ app: {
17
+ appType: "API_INTEGRATION",
18
+ icon: m,
19
+ label: "App",
20
+ pageDescription: "Register a new app integration with OAuth permissions",
21
+ purpose: "Give your integration a name, description, and the permissions it will request. Once created you will get credentials and can configure webhooks, then publish it to the marketplace when it is ready for users.",
22
+ namePlaceholder: "My Integration",
23
+ cardDescription: "Build integrations that connect your service to the platform using OAuth tokens.",
24
+ cardBullets: [
25
+ "GitHub-style permissions",
26
+ "OAuth token flow",
27
+ "Webhook events",
28
+ "Publish to app store"
29
+ ]
30
+ },
31
+ node: {
32
+ appType: "NODE",
33
+ icon: S,
34
+ label: "Node",
35
+ pageDescription: "Register a new FluidGrids node package",
36
+ purpose: "Give your node a name and description. Once created you can upload your ZIP bundle and manifest in the Versions tab, then publish it to the node store when it is ready for users.",
37
+ namePlaceholder: "HTTP Request",
38
+ cardDescription: "Build custom FluidGrids nodes that users can drag into their visual workflows.",
39
+ cardBullets: [
40
+ "ZIP bundle + manifest",
41
+ "Custom inputs/outputs",
42
+ "Versioned releases",
43
+ "Publish to node store"
44
+ ]
45
+ },
46
+ workflow: {
47
+ appType: "WORKFLOW",
48
+ icon: v,
49
+ label: "Workflow",
50
+ pageDescription: "Register a new reusable automation workflow",
51
+ purpose: "Give your workflow a name and description. Once created you can upload your workflow definition in the Versions tab, then publish it to the store or generate a shareable public link.",
52
+ namePlaceholder: "Onboarding Flow",
53
+ cardDescription: "Build reusable automation workflows that users can import and customize.",
54
+ cardBullets: [
55
+ "Manifest + workflow JSON",
56
+ "Trigger definitions",
57
+ "Versioned releases",
58
+ "Publish to workflow store"
59
+ ]
60
+ },
61
+ parser: {
62
+ appType: "PARSER",
63
+ icon: _,
64
+ label: "Parser",
65
+ pageDescription: "Register a new data parser",
66
+ purpose: "Give your parser a name and description. Once created you can upload its manifest in the Versions tab, then publish it to the store when it is ready for users.",
67
+ namePlaceholder: "CSV Parser",
68
+ cardDescription: "Build parsers that extract structured data from files or feeds for use across the platform.",
69
+ cardBullets: [
70
+ "Manifest JSON only",
71
+ "No ZIP bundle needed",
72
+ "Versioned releases",
73
+ "Publish to store"
74
+ ]
75
+ },
76
+ widget: {
77
+ appType: "WIDGET",
78
+ icon: x,
79
+ label: "Widget",
80
+ pageDescription: "Register a new embeddable widget",
81
+ purpose: "Give your widget a name and description. Once created you can upload its manifest in the Versions tab, then publish it to the store when it is ready for users.",
82
+ namePlaceholder: "Revenue Chart Widget",
83
+ cardDescription: "Build embeddable UI widgets users can add to dashboards and pages.",
84
+ cardBullets: [
85
+ "Manifest JSON only",
86
+ "Embeddable UI component",
87
+ "Versioned releases",
88
+ "Publish to store"
89
+ ]
90
+ },
91
+ dashboard: {
92
+ appType: "DASHBOARD",
93
+ icon: b,
94
+ label: "Dashboard Template",
95
+ pageDescription: "Register a new dashboard template",
96
+ purpose: "Give your dashboard template a name and description. Once created you can upload its manifest in the Versions tab, then publish it to the store when it is ready for users.",
97
+ namePlaceholder: "Sales Overview Dashboard",
98
+ cardDescription: "Build prebuilt dashboard layouts users can install and customize.",
99
+ cardBullets: [
100
+ "Manifest JSON only",
101
+ "Prebuilt layout",
102
+ "Versioned releases",
103
+ "Publish to store"
104
+ ]
105
+ }
106
+ }, D = [
16
107
  {
17
108
  id: "auth",
18
109
  label: "Authentication",
@@ -84,16 +175,16 @@ var E = [
84
175
  description: "Access control configuration"
85
176
  }
86
177
  ];
87
- function D() {
88
- return Object.fromEntries(E.map((e) => [e.id, "none"]));
178
+ function O() {
179
+ return Object.fromEntries(D.map((e) => [e.id, "none"]));
89
180
  }
90
- function ne(e) {
181
+ function k(e) {
91
182
  return Object.entries(e).filter(([, e]) => e !== "none").map(([e, t]) => ({
92
183
  resource: e,
93
184
  level: t
94
185
  }));
95
186
  }
96
- var O = [
187
+ var A = [
97
188
  {
98
189
  value: "PUBLIC",
99
190
  label: "Public — listed in the marketplace after review"
@@ -106,10 +197,10 @@ var O = [
106
197
  value: "INTERNAL",
107
198
  label: "Internal — visible to your entire dev org"
108
199
  }
109
- ], k = [...O, {
200
+ ], j = [...A, {
110
201
  value: "UNLISTED",
111
202
  label: "Unlisted — shareable via link, not listed in store"
112
- }], A = [
203
+ }], M = [
113
204
  {
114
205
  value: "ai",
115
206
  label: "AI & Automation"
@@ -138,14 +229,14 @@ var O = [
138
229
  value: "trigger",
139
230
  label: "Triggers"
140
231
  }
141
- ], j = ({ icon: e, title: n, description: r, bullets: i, selected: a, onClick: o }) => /* @__PURE__ */ T("button", {
232
+ ], N = ({ icon: e, title: n, description: r, bullets: i, selected: a, onClick: o }) => /* @__PURE__ */ T("button", {
142
233
  type: "button",
143
234
  onClick: o,
144
235
  className: t("relative flex flex-col gap-3 rounded-xl border-2 p-6 text-left transition-all hover:border-primary/50 hover:shadow-sm", a ? "border-primary bg-action-primary-bg/5 shadow-sm" : "border-border-subtle bg-bg-surface"),
145
236
  children: [
146
237
  a && /* @__PURE__ */ w("span", {
147
238
  className: "absolute top-4 right-4 flex h-5 w-5 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text",
148
- children: /* @__PURE__ */ w(_, { size: 12 })
239
+ children: /* @__PURE__ */ w(h, { size: 12 })
149
240
  }),
150
241
  /* @__PURE__ */ w("div", {
151
242
  className: "flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken",
@@ -165,14 +256,14 @@ var O = [
165
256
  className: "mt-1 space-y-1",
166
257
  children: i.map((e) => /* @__PURE__ */ T("li", {
167
258
  className: "flex items-center gap-2 text-xs text-text-secondary",
168
- children: [/* @__PURE__ */ w(v, {
259
+ children: [/* @__PURE__ */ w(g, {
169
260
  size: 12,
170
261
  className: "flex-shrink-0 text-primary"
171
262
  }), e]
172
263
  }, e))
173
264
  })
174
265
  ]
175
- }), M = ({ permissions: e, onChange: t }) => {
266
+ }), P = ({ permissions: e, onChange: t }) => {
176
267
  let n = [
177
268
  "none",
178
269
  "read",
@@ -197,7 +288,7 @@ var O = [
197
288
  }, e))]
198
289
  }) }), /* @__PURE__ */ w("tbody", {
199
290
  className: "divide-y divide-border",
200
- children: E.map((r) => /* @__PURE__ */ T("tr", {
291
+ children: D.map((r) => /* @__PURE__ */ T("tr", {
201
292
  className: "hover:bg-bg-sunken/30 transition-colors",
202
293
  children: [/* @__PURE__ */ T("td", {
203
294
  className: "px-4 py-3",
@@ -223,7 +314,7 @@ var O = [
223
314
  })]
224
315
  })
225
316
  });
226
- }, N = [
317
+ }, F = [
227
318
  {
228
319
  value: "fluidgrids",
229
320
  label: "FluidGrids"
@@ -240,18 +331,18 @@ var O = [
240
331
  value: "botlit",
241
332
  label: "Botlit"
242
333
  }
243
- ], P = () => {
244
- let { navigate: v, basePath: E, activeOrgId: P } = e(), { t: re } = m(), ie = (e, t) => {
245
- let n = re(e);
334
+ ], I = () => {
335
+ let { navigate: m, basePath: g, activeOrgId: _ } = e(), { t: v } = f(), b = (e, t) => {
336
+ let n = v(e);
246
337
  return n === e ? t : n;
247
- }, ae = n(), [F, I] = p(null), [L, R] = p([]), [z, B] = p(D()), V = f(!1), [H, U] = p({
338
+ }, x = n(), [S, D] = d(null), [I, ie] = d([]), [L, R] = d(O()), z = ee(!1), [B, V] = d({
248
339
  name: "",
249
340
  slug: "",
250
341
  shortDescription: "",
251
342
  description: "",
252
343
  category: "",
253
344
  visibility: "PUBLIC",
254
- developerOrganizationId: P ?? "",
345
+ developerOrganizationId: _ ?? "",
255
346
  websiteUrl: "",
256
347
  githubUrl: "",
257
348
  documentationUrl: "",
@@ -259,149 +350,126 @@ var O = [
259
350
  oauthAuthUrl: "",
260
351
  oauthTokenUrl: "",
261
352
  oauthRevokeUrl: ""
262
- }), [W, G] = p({}), [K, { loading: q }] = r(), { data: oe } = i({ fetchPolicy: "cache-and-network" }), J = [{
353
+ }), [H, U] = d({}), [W, { loading: G }] = r(), { data: K } = i({ fetchPolicy: "cache-and-network" }), q = [{
263
354
  value: "",
264
355
  label: "No organization (personal)"
265
- }, ...(oe?.myDeveloperOrganizations ?? []).map((e) => ({
356
+ }, ...(K?.myDeveloperOrganizations ?? []).map((e) => ({
266
357
  value: e.id,
267
358
  label: e.name
268
- }))], Y = (e) => v?.(`${E}${e}`), se = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), ce = (e) => {
359
+ }))], J = (e) => m?.(`${g}${e}`), ae = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""), Y = (e) => {
269
360
  let t = e.target.value;
270
- U((e) => ({
361
+ V((e) => ({
271
362
  ...e,
272
363
  name: t,
273
- slug: V.current ? e.slug : se(t)
274
- })), W.name && G((e) => ({
364
+ slug: z.current ? e.slug : ae(t)
365
+ })), H.name && U((e) => ({
275
366
  ...e,
276
367
  name: void 0
277
368
  }));
278
- }, le = (e) => {
279
- V.current = !0;
369
+ }, oe = (e) => {
370
+ z.current = !0;
280
371
  let t = e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, "");
281
- U((e) => ({
372
+ V((e) => ({
282
373
  ...e,
283
374
  slug: t
284
- })), W.slug && G((e) => ({
375
+ })), H.slug && U((e) => ({
285
376
  ...e,
286
377
  slug: void 0
287
378
  }));
288
379
  }, X = (e, t) => {
289
- U((n) => ({
380
+ V((n) => ({
290
381
  ...n,
291
382
  [e]: t
292
- })), (W[e] || W._submit) && G((t) => ({
383
+ })), (H[e] || H._submit) && U((t) => ({
293
384
  ...t,
294
385
  [e]: void 0,
295
386
  _submit: void 0
296
387
  }));
297
- }, Z = (e, t) => {
298
- B((n) => ({
388
+ }, se = (e, t) => {
389
+ R((n) => ({
299
390
  ...n,
300
391
  [e]: t
301
392
  }));
302
- }, ue = () => {
393
+ }, ce = () => {
303
394
  let e = {};
304
- return H.name.trim() ? H.name.length < 3 ? e.name = "Name must be at least 3 characters" : H.name.length > 100 && (e.name = "Name must be less than 100 characters") : e.name = "Name is required", H.slug.trim() ? /^[a-z0-9-]+$/.test(H.slug) || (e.slug = "Slug can only contain lowercase letters, numbers, and hyphens") : e.slug = "Slug is required", H.shortDescription.trim() ? H.shortDescription.length > 200 && (e.shortDescription = "Short description must be less than 200 characters") : e.shortDescription = "Short description is required", H.category || (e.category = "Category is required"), F !== "app" && L.length === 0 && (e.compatibleProducts = "Select at least one compatible product so users can find this in the right store"), G(e), Object.keys(e).length === 0;
305
- }, Q = () => F === "node" ? "NODE" : F === "workflow" ? "WORKFLOW" : "API_INTEGRATION", de = async (e) => {
306
- if (e.preventDefault(), !ue() || !F) return;
307
- let t = F === "app" ? { permissions: ne(z) } : null;
395
+ return B.name.trim() ? B.name.length < 3 ? e.name = "Name must be at least 3 characters" : B.name.length > 100 && (e.name = "Name must be less than 100 characters") : e.name = "Name is required", B.slug.trim() ? /^[a-z0-9-]+$/.test(B.slug) || (e.slug = "Slug can only contain lowercase letters, numbers, and hyphens") : e.slug = "Slug is required", B.shortDescription.trim() ? B.shortDescription.length > 200 && (e.shortDescription = "Short description must be less than 200 characters") : e.shortDescription = "Short description is required", B.category || (e.category = "Category is required"), S !== "app" && I.length === 0 && (e.compatibleProducts = "Select at least one compatible product so users can find this in the right store"), U(e), Object.keys(e).length === 0;
396
+ }, Z = () => E[S ?? "app"].appType, le = async (e) => {
397
+ if (e.preventDefault(), !ce() || !S) return;
398
+ let t = S === "app" ? { permissions: k(L) } : null;
308
399
  try {
309
- let e = await K({ variables: { input: {
310
- name: H.name,
311
- slug: H.slug || void 0,
312
- shortDescription: H.shortDescription || void 0,
313
- description: H.description || void 0,
314
- category: H.category || void 0,
315
- appType: Q(),
316
- visibility: H.visibility,
317
- developerOrganizationId: H.developerOrganizationId || void 0,
318
- websiteUrl: H.websiteUrl || void 0,
319
- githubUrl: H.githubUrl || void 0,
320
- documentationUrl: H.documentationUrl || void 0,
321
- supportUrl: H.supportUrl || void 0,
400
+ let e = await W({ variables: { input: {
401
+ name: B.name,
402
+ slug: B.slug || void 0,
403
+ shortDescription: B.shortDescription || void 0,
404
+ description: B.description || void 0,
405
+ category: B.category || void 0,
406
+ appType: Z(),
407
+ visibility: B.visibility,
408
+ developerOrganizationId: B.developerOrganizationId || void 0,
409
+ websiteUrl: B.websiteUrl || void 0,
410
+ githubUrl: B.githubUrl || void 0,
411
+ documentationUrl: B.documentationUrl || void 0,
412
+ supportUrl: B.supportUrl || void 0,
322
413
  manifest: t ?? void 0,
323
- compatibleProducts: L.length > 0 ? L : void 0,
324
- ...F === "app" && {
325
- oauthAuthUrl: H.oauthAuthUrl || void 0,
326
- oauthTokenUrl: H.oauthTokenUrl || void 0,
327
- oauthRevokeUrl: H.oauthRevokeUrl || void 0
414
+ compatibleProducts: I.length > 0 ? I : void 0,
415
+ ...S === "app" && {
416
+ oauthAuthUrl: B.oauthAuthUrl || void 0,
417
+ oauthTokenUrl: B.oauthTokenUrl || void 0,
418
+ oauthRevokeUrl: B.oauthRevokeUrl || void 0
328
419
  }
329
420
  } } });
330
- e.data?.createApplication?.id && (ae.emit("devportal.app.created", {
421
+ e.data?.createApplication?.id && (x.emit("devportal.app.created", {
331
422
  appId: e.data.createApplication.id,
332
- name: H.name,
333
- appType: Q(),
334
- organizationId: H.developerOrganizationId || null
335
- }), Y(`/apps/${e.data.createApplication.id}`));
423
+ name: B.name,
424
+ appType: Z(),
425
+ organizationId: B.developerOrganizationId || null
426
+ }), J(`/apps/${e.data.createApplication.id}`));
336
427
  } catch (e) {
337
428
  let t = [];
338
429
  e && typeof e == "object" && "graphQLErrors" in e && Array.isArray(e.graphQLErrors) && e.graphQLErrors.forEach((e) => t.push(e.message)), e instanceof Error && t.push(e.message);
339
430
  let n = t.join(" ").toLowerCase();
340
- n.includes("slug") || n.includes("already exist") || n.includes("unique") || n.includes("conflict") || n.includes("duplicate") ? G((e) => ({
431
+ n.includes("slug") || n.includes("already exist") || n.includes("unique") || n.includes("conflict") || n.includes("duplicate") ? U((e) => ({
341
432
  ...e,
342
433
  slug: "This slug is already taken — choose a different one"
343
- })) : G((e) => ({
434
+ })) : U((e) => ({
344
435
  ...e,
345
436
  _submit: t[0] ?? "Something went wrong. Please try again."
346
437
  }));
347
438
  }
348
439
  };
349
- if (!F) return /* @__PURE__ */ w(u, {
440
+ if (!S) return /* @__PURE__ */ w(l, {
350
441
  authOnly: !0,
351
442
  children: /* @__PURE__ */ w(a, {
352
443
  title: "What do you want to build?",
353
444
  description: "Choose a builder type to get started",
354
445
  purpose: "Pick the kind of integration you are creating — a standard app, a Node package, or a workflow. Your choice sets up the right defaults (credentials, permissions, and where it can be installed) so you only fill in what that type actually needs.",
355
- backLink: `${E}/apps`,
446
+ backLink: `${g}/apps`,
356
447
  backLabel: "Back to Applications",
357
448
  children: /* @__PURE__ */ T("div", {
358
449
  className: "max-w-3xl space-y-6",
359
- children: [/* @__PURE__ */ T("div", {
450
+ children: [/* @__PURE__ */ w("div", {
360
451
  className: "grid gap-4 sm:grid-cols-3",
361
452
  children: [
362
- /* @__PURE__ */ w(j, {
363
- icon: g,
364
- title: "App",
365
- description: "Build integrations that connect your service to the platform using OAuth tokens.",
366
- bullets: [
367
- "GitHub-style permissions",
368
- "OAuth token flow",
369
- "Webhook events",
370
- "Publish to app store"
371
- ],
372
- selected: F === "app",
373
- onClick: () => I("app")
374
- }),
375
- /* @__PURE__ */ w(j, {
376
- icon: S,
377
- title: "Node",
378
- description: "Build custom FluidGrids nodes that users can drag into their visual workflows.",
379
- bullets: [
380
- "ZIP bundle + manifest",
381
- "Custom inputs/outputs",
382
- "Versioned releases",
383
- "Publish to node store"
384
- ],
385
- selected: F === "node",
386
- onClick: () => I("node")
387
- }),
388
- /* @__PURE__ */ w(j, {
389
- icon: y,
390
- title: "Workflow",
391
- description: "Build reusable automation workflows that users can import and customize.",
392
- bullets: [
393
- "Manifest + workflow JSON",
394
- "Trigger definitions",
395
- "Versioned releases",
396
- "Publish to workflow store"
397
- ],
398
- selected: F === "workflow",
399
- onClick: () => I("workflow")
400
- })
401
- ]
453
+ "app",
454
+ "node",
455
+ "workflow",
456
+ "parser",
457
+ "widget",
458
+ "dashboard"
459
+ ].map((e) => {
460
+ let t = E[e];
461
+ return /* @__PURE__ */ w(N, {
462
+ icon: t.icon,
463
+ title: t.label,
464
+ description: t.cardDescription,
465
+ bullets: t.cardBullets,
466
+ selected: S === e,
467
+ onClick: () => D(e)
468
+ }, e);
469
+ })
402
470
  }), /* @__PURE__ */ T("div", {
403
471
  className: "rounded-lg border border-border-subtle bg-bg-sunken/30 p-4 flex gap-3 text-sm text-text-secondary",
404
- children: [/* @__PURE__ */ w(b, {
472
+ children: [/* @__PURE__ */ w(y, {
405
473
  size: 16,
406
474
  className: "flex-shrink-0 mt-0.5"
407
475
  }), /* @__PURE__ */ w("p", { children: "Apps use OAuth to interact with platform data. Nodes and Workflows are packaged files you upload after creation." })]
@@ -409,29 +477,29 @@ var O = [
409
477
  })
410
478
  })
411
479
  });
412
- let $ = F === "app" ? "App" : F === "node" ? "Node" : "Workflow", fe = w(F === "app" ? g : F === "node" ? S : y, { size: 16 });
413
- return /* @__PURE__ */ w(u, {
480
+ let Q = E[S ?? "app"], $ = Q.label, ue = Q.icon, de = /* @__PURE__ */ w(ue, { size: 16 });
481
+ return /* @__PURE__ */ w(l, {
414
482
  authOnly: !0,
415
483
  children: /* @__PURE__ */ w(a, {
416
484
  title: `Create ${$}`,
417
- description: F === "app" ? "Register a new app integration with OAuth permissions" : F === "node" ? "Register a new FluidGrids node package" : "Register a new reusable automation workflow",
418
- purpose: F === "workflow" ? "Give your workflow a name and description. Once created you can upload your workflow definition in the Versions tab, then publish it to the store or generate a shareable public link." : F === "node" ? "Give your node a name and description. Once created you can upload your ZIP bundle and manifest in the Versions tab, then publish it to the node store when it is ready for users." : "Give your integration a name, description, and the permissions it will request. Once created you will get credentials and can configure webhooks, then publish it to the marketplace when it is ready for users.",
419
- backLink: `${E}/apps`,
485
+ description: Q.pageDescription,
486
+ purpose: Q.purpose,
487
+ backLink: `${g}/apps`,
420
488
  backLabel: "Back to Applications",
421
489
  children: /* @__PURE__ */ T("form", {
422
- onSubmit: de,
490
+ onSubmit: le,
423
491
  className: "space-y-8 max-w-3xl",
424
492
  children: [
425
493
  /* @__PURE__ */ T("div", {
426
494
  className: "flex items-center gap-3",
427
495
  children: [/* @__PURE__ */ T("button", {
428
496
  type: "button",
429
- onClick: () => I(null),
497
+ onClick: () => D(null),
430
498
  className: "flex items-center gap-1.5 text-sm text-text-secondary hover:text-text-primary transition-colors",
431
- children: [/* @__PURE__ */ w(h, { size: 14 }), "Change type"]
499
+ children: [/* @__PURE__ */ w(p, { size: 14 }), "Change type"]
432
500
  }), /* @__PURE__ */ T("span", {
433
501
  className: "flex items-center gap-1.5 rounded-full border border-border-subtle bg-bg-sunken px-3 py-1 text-xs font-medium",
434
- children: [fe, $]
502
+ children: [de, $]
435
503
  })]
436
504
  }),
437
505
  /* @__PURE__ */ w(o, {
@@ -442,52 +510,53 @@ var O = [
442
510
  children: [
443
511
  /* @__PURE__ */ w(s, {
444
512
  label: "Name",
445
- value: H.name,
446
- onChange: ce,
447
- placeholder: F === "app" ? "My Integration" : F === "node" ? "HTTP Request" : "Onboarding Flow",
513
+ value: B.name,
514
+ onChange: Y,
515
+ placeholder: Q.namePlaceholder,
448
516
  required: !0,
449
- error: W.name
517
+ error: H.name
450
518
  }),
451
519
  /* @__PURE__ */ w(s, {
452
520
  label: "Slug",
453
- value: H.slug,
454
- onChange: le,
521
+ value: B.slug,
522
+ onChange: oe,
455
523
  placeholder: "my-integration",
456
524
  required: !0,
457
- error: W.slug,
458
- hint: V.current ? "Only lowercase letters, numbers, and hyphens" : "Auto-generated from name — edit to customise"
525
+ error: H.slug,
526
+ hint: z.current ? "Only lowercase letters, numbers, and hyphens" : "Auto-generated from name — edit to customise"
459
527
  }),
460
- /* @__PURE__ */ w(l, {
528
+ /* @__PURE__ */ w(u, {
461
529
  label: "Short Description",
462
- value: H.shortDescription,
463
- onChange: (e) => X("shortDescription", e.target.value),
530
+ value: B.shortDescription,
531
+ onChange: (e) => X("shortDescription", e),
464
532
  placeholder: "Briefly describe what this does",
465
533
  required: !0,
466
- error: W.shortDescription,
467
- hint: `${H.shortDescription.length}/200 characters`,
468
- rows: 2
534
+ error: H.shortDescription,
535
+ hint: `${B.shortDescription.length}/200 characters`,
536
+ rows: 2,
537
+ maxLength: 200
469
538
  }),
470
539
  /* @__PURE__ */ T("div", {
471
540
  className: "grid gap-4 sm:grid-cols-2",
472
541
  children: [/* @__PURE__ */ w(c, {
473
542
  label: "Category",
474
- value: H.category,
543
+ value: B.category,
475
544
  onChange: (e) => X("category", e.target.value),
476
- options: A,
545
+ options: M,
477
546
  placeholder: "Select a category…",
478
547
  required: !0,
479
- error: W.category,
548
+ error: H.category,
480
549
  hint: "Helps users discover your item in the store"
481
550
  }), /* @__PURE__ */ w(c, {
482
551
  label: "Visibility",
483
- value: H.visibility,
552
+ value: B.visibility,
484
553
  onChange: (e) => X("visibility", e.target.value),
485
- options: F === "workflow" ? k : O,
554
+ options: S === "workflow" ? j : A,
486
555
  required: !0,
487
- hint: H.visibility === "PUBLIC" ? "Listed in the marketplace after review approval — anyone can discover and install it" : H.visibility === "UNLISTED" ? "Not in the store, but share with anyone via a direct link. You can still submit for marketplace review later" : H.visibility === "INTERNAL" ? "Visible to all members of your developer organization — no one outside can access it" : "Only you (the creator) can see this — other org members cannot access it"
556
+ hint: B.visibility === "PUBLIC" ? "Listed in the marketplace after review approval — anyone can discover and install it" : B.visibility === "UNLISTED" ? "Not in the store, but share with anyone via a direct link. You can still submit for marketplace review later" : B.visibility === "INTERNAL" ? "Visible to all members of your developer organization — no one outside can access it" : "Only you (the creator) can see this — other org members cannot access it"
488
557
  })]
489
558
  }),
490
- F !== "app" && /* @__PURE__ */ T("div", {
559
+ S !== "app" && /* @__PURE__ */ T("div", {
491
560
  className: "space-y-2",
492
561
  children: [
493
562
  /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("label", {
@@ -500,32 +569,32 @@ var O = [
500
569
  className: "text-xs text-text-secondary mt-0.5",
501
570
  children: [
502
571
  "Select which products this ",
503
- F,
572
+ S,
504
573
  " works with. Users will see it in those products' node stores."
505
574
  ]
506
575
  })] }),
507
576
  /* @__PURE__ */ w("div", {
508
577
  className: "flex flex-wrap gap-3",
509
- children: N.map((e) => {
510
- let n = L.includes(e.value);
578
+ children: F.map((e) => {
579
+ let n = I.includes(e.value);
511
580
  return /* @__PURE__ */ T("label", {
512
- className: t("flex items-center gap-2 cursor-pointer rounded-md border px-3 py-2 text-sm transition-colors", n ? "border-primary bg-primary/10 text-text-primary" : "border-border-subtle hover:border-border text-text-secondary hover:text-text-primary", W.compatibleProducts && !n && "border-status-error-bg/50"),
581
+ className: t("flex items-center gap-2 cursor-pointer rounded-md border px-3 py-2 text-sm transition-colors", n ? "border-primary bg-primary/10 text-text-primary" : "border-border-subtle hover:border-border text-text-secondary hover:text-text-primary", H.compatibleProducts && !n && "border-status-error-bg/50"),
513
582
  children: [
514
583
  /* @__PURE__ */ w("input", {
515
584
  type: "checkbox",
516
585
  className: "sr-only",
517
586
  checked: n,
518
587
  onChange: () => {
519
- R((t) => {
588
+ ie((t) => {
520
589
  let r = n ? t.filter((t) => t !== e.value) : [...t, e.value];
521
- return r.length > 0 && G((e) => ({
590
+ return r.length > 0 && U((e) => ({
522
591
  ...e,
523
592
  compatibleProducts: void 0
524
593
  })), r;
525
594
  });
526
595
  }
527
596
  }),
528
- n && /* @__PURE__ */ w(_, {
597
+ n && /* @__PURE__ */ w(h, {
529
598
  size: 14,
530
599
  className: "text-primary flex-shrink-0"
531
600
  }),
@@ -534,15 +603,15 @@ var O = [
534
603
  }, e.value);
535
604
  })
536
605
  }),
537
- W.compatibleProducts && /* @__PURE__ */ w("p", {
606
+ H.compatibleProducts && /* @__PURE__ */ w("p", {
538
607
  className: "text-xs text-status-error-text",
539
- children: W.compatibleProducts
608
+ children: H.compatibleProducts
540
609
  })
541
610
  ]
542
611
  }),
543
- /* @__PURE__ */ w(d, {
612
+ /* @__PURE__ */ w(u, {
544
613
  label: "Full Description",
545
- value: H.description,
614
+ value: B.description,
546
615
  onChange: (e) => X("description", e),
547
616
  placeholder: "Detailed description, features, and use cases...",
548
617
  rows: 5,
@@ -551,31 +620,31 @@ var O = [
551
620
  ]
552
621
  })
553
622
  }),
554
- J.length > 2 && /* @__PURE__ */ w(o, {
623
+ q.length > 2 && /* @__PURE__ */ w(o, {
555
624
  title: "Organization",
556
625
  description: "Which developer organization owns this?",
557
626
  children: /* @__PURE__ */ w(c, {
558
627
  label: "Developer Organization",
559
- value: H.developerOrganizationId,
628
+ value: B.developerOrganizationId,
560
629
  onChange: (e) => X("developerOrganizationId", e.target.value),
561
- options: J
630
+ options: q
562
631
  })
563
632
  }),
564
- F === "app" && /* @__PURE__ */ T(o, {
633
+ S === "app" && /* @__PURE__ */ T(o, {
565
634
  title: "Permissions",
566
635
  description: "Choose what data your app can access. Users will see these permissions when authorizing your app — like GitHub Apps.",
567
- children: [/* @__PURE__ */ w(M, {
568
- permissions: z,
569
- onChange: Z
636
+ children: [/* @__PURE__ */ w(P, {
637
+ permissions: L,
638
+ onChange: se
570
639
  }), /* @__PURE__ */ T("div", {
571
640
  className: "mt-3 flex gap-2 rounded-lg border border-border-subtle bg-bg-sunken/30 p-3 text-xs text-text-secondary",
572
- children: [/* @__PURE__ */ w(b, {
641
+ children: [/* @__PURE__ */ w(y, {
573
642
  size: 14,
574
643
  className: "flex-shrink-0 mt-0.5"
575
644
  }), /* @__PURE__ */ T("span", { children: [/* @__PURE__ */ w("strong", { children: "Read & Write" }), " implies Read. Select only what your app genuinely needs — fewer permissions build more user trust."] })]
576
645
  })]
577
646
  }),
578
- F === "app" && /* @__PURE__ */ w(o, {
647
+ S === "app" && /* @__PURE__ */ w(o, {
579
648
  title: "Integration Setup",
580
649
  description: "Configure the endpoints for your integration. After a user installs, we redirect them to your callback URL so your server can complete the connection.",
581
650
  children: /* @__PURE__ */ T("div", {
@@ -583,23 +652,23 @@ var O = [
583
652
  children: [/* @__PURE__ */ w(s, {
584
653
  label: "Post-install Callback URL",
585
654
  type: "url",
586
- value: H.oauthAuthUrl,
655
+ value: B.oauthAuthUrl,
587
656
  onChange: (e) => X("oauthAuthUrl", e.target.value),
588
657
  placeholder: "https://yourapp.com/callback",
589
658
  hint: "Users land here after install with ?installation_id=xxx appended"
590
659
  }), /* @__PURE__ */ w(s, {
591
660
  label: "Revoke URL",
592
661
  type: "url",
593
- value: H.oauthRevokeUrl,
662
+ value: B.oauthRevokeUrl,
594
663
  onChange: (e) => X("oauthRevokeUrl", e.target.value),
595
664
  placeholder: "https://yourapp.com/oauth/revoke",
596
665
  hint: "We POST to this URL when a user uninstalls your integration"
597
666
  })]
598
667
  })
599
668
  }),
600
- F !== "app" && /* @__PURE__ */ T("div", {
669
+ S !== "app" && /* @__PURE__ */ T("div", {
601
670
  className: "rounded-lg border border-border-subtle bg-bg-sunken/30 p-4 flex gap-3 text-sm text-text-secondary",
602
- children: [/* @__PURE__ */ w(b, {
671
+ children: [/* @__PURE__ */ w(y, {
603
672
  size: 16,
604
673
  className: "flex-shrink-0 mt-0.5"
605
674
  }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
@@ -607,33 +676,33 @@ var O = [
607
676
  children: "File uploads"
608
677
  }), /* @__PURE__ */ w("p", {
609
678
  className: "mt-1",
610
- children: F === "node" ? "After creating your Node, go to the Versions tab to upload your ZIP bundle and manifest.json." : "After creating your Workflow, go to the Versions tab to upload your manifest and workflow JSON definition."
679
+ children: S === "node" ? "After creating your Node, go to the Versions tab to upload your ZIP bundle and manifest.json." : `After creating your ${$}, go to the Versions tab to upload its manifest JSON.`
611
680
  })] })]
612
681
  }),
613
- W._submit && /* @__PURE__ */ T("div", {
682
+ H._submit && /* @__PURE__ */ T("div", {
614
683
  className: "flex items-start gap-3 rounded-lg border border-status-error-bg bg-status-error-bg/10 px-4 py-3 text-sm text-status-error-text",
615
- children: [/* @__PURE__ */ w(b, {
684
+ children: [/* @__PURE__ */ w(y, {
616
685
  size: 16,
617
686
  className: "flex-shrink-0 mt-0.5"
618
- }), /* @__PURE__ */ w("span", { children: W._submit })]
687
+ }), /* @__PURE__ */ w("span", { children: H._submit })]
619
688
  }),
620
689
  /* @__PURE__ */ T("div", {
621
690
  className: "flex items-center justify-end gap-3 border-t pt-6",
622
691
  children: [/* @__PURE__ */ T("button", {
623
692
  type: "button",
624
- onClick: () => Y("/apps"),
625
- disabled: q,
693
+ onClick: () => J("/apps"),
694
+ disabled: G,
626
695
  className: "inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50",
627
- children: [/* @__PURE__ */ w(te, { size: 16 }), ie("devportal.cancel", "Cancel")]
696
+ children: [/* @__PURE__ */ w(re, { size: 16 }), b("devportal.cancel", "Cancel")]
628
697
  }), /* @__PURE__ */ w("button", {
629
698
  type: "submit",
630
- disabled: q,
699
+ disabled: G,
631
700
  className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50",
632
- children: q ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w(x, {
701
+ children: G ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w(te, {
633
702
  size: 16,
634
703
  className: "animate-spin"
635
704
  }), "Creating…"] }) : /* @__PURE__ */ T(C, { children: [
636
- /* @__PURE__ */ w(ee, { size: 16 }),
705
+ /* @__PURE__ */ w(ne, { size: 16 }),
637
706
  "Create ",
638
707
  $
639
708
  ] })
@@ -645,6 +714,6 @@ var O = [
645
714
  });
646
715
  };
647
716
  //#endregion
648
- export { P as CreateApplicationPage };
717
+ export { I as CreateApplicationPage };
649
718
 
650
719
  //# sourceMappingURL=CreateApplicationPage.js.map