@burdenoff/microfe-devportal 2026.1113.1 → 2026.1113.3
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.
- package/dist/devportal/DevportalRoot.js +65 -119
- package/dist/devportal/DevportalRoot.js.map +1 -1
- package/dist/devportal/components/AppCard.js +4 -4
- package/dist/devportal/components/DeveloperSettingsHub.d.ts +6 -0
- package/dist/devportal/components/DeveloperSettingsHub.js +59 -0
- package/dist/devportal/components/DeveloperSettingsHub.js.map +1 -0
- package/dist/devportal/components/SectionNav.d.ts +1 -1
- package/dist/devportal/components/SectionNav.js +60 -36
- package/dist/devportal/components/SectionNav.js.map +1 -1
- package/dist/devportal/pages/AnalyticsDashboardPage.js +186 -179
- package/dist/devportal/pages/AnalyticsDashboardPage.js.map +1 -1
- package/dist/devportal/pages/ApiKeysPage.js +113 -111
- package/dist/devportal/pages/ApiKeysPage.js.map +1 -1
- package/dist/devportal/pages/AppLogsPage.js +80 -84
- package/dist/devportal/pages/AppLogsPage.js.map +1 -1
- package/dist/devportal/pages/ApplicationDetailPage.js +529 -504
- package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
- package/dist/devportal/pages/ApplicationsPage.js +68 -67
- package/dist/devportal/pages/ApplicationsPage.js.map +1 -1
- package/dist/devportal/pages/CreateApiKeyPage.js +163 -166
- package/dist/devportal/pages/CreateApiKeyPage.js.map +1 -1
- package/dist/devportal/pages/CreateOAuthClientPage.js +134 -130
- package/dist/devportal/pages/CreateOAuthClientPage.js.map +1 -1
- package/dist/devportal/pages/DelegationsPage.js +11 -11
- package/dist/devportal/pages/DocumentationPage.js +100 -94
- package/dist/devportal/pages/DocumentationPage.js.map +1 -1
- package/dist/devportal/pages/EditApplicationPage.js +379 -377
- package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
- package/dist/devportal/pages/InvitationDecisionPage.js +83 -79
- package/dist/devportal/pages/InvitationDecisionPage.js.map +1 -1
- package/dist/devportal/pages/OAuthClientDetailPage.js +76 -76
- package/dist/devportal/pages/OAuthClientDetailPage.js.map +1 -1
- package/dist/devportal/pages/OAuthClientsPage.js +126 -124
- package/dist/devportal/pages/OAuthClientsPage.js.map +1 -1
- package/dist/devportal/pages/OrganizationDetailPage.js +19 -19
- package/dist/devportal/pages/OrganizationMembersPage.js +223 -204
- package/dist/devportal/pages/OrganizationMembersPage.js.map +1 -1
- package/dist/devportal/pages/ResourcesPage.d.ts +6 -0
- package/dist/devportal/pages/ResourcesPage.js +171 -155
- package/dist/devportal/pages/ResourcesPage.js.map +1 -1
- package/dist/devportal/pages/SellerDashboardPage.js +13 -13
- package/dist/devportal/pages/SellerItemsPage.js +4 -4
- package/dist/devportal/pages/SettingsPage.js +330 -315
- package/dist/devportal/pages/SettingsPage.js.map +1 -1
- package/dist/devportal/pages/SetupPage.js +5 -5
- package/dist/devportal/pages/WebhookDetailPage.js +6 -6
- package/dist/devportal/pages/WebhooksPage.js +39 -39
- package/dist/devportal/pages/WebhooksPage.js.map +1 -1
- package/dist/devportal/utils/appDetailTabs.d.ts +73 -0
- package/dist/devportal/utils/appDetailTabs.js +62 -0
- package/dist/devportal/utils/appDetailTabs.js.map +1 -0
- package/dist/devportal/utils/developerNav.d.ts +39 -0
- package/dist/devportal/utils/developerNav.js +304 -0
- package/dist/devportal/utils/developerNav.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,132 +1,134 @@
|
|
|
1
1
|
import { PageLayout as e, PageSection as t } from "../components/PageLayout.js";
|
|
2
2
|
import { EmptyState as n } from "../components/EmptyState.js";
|
|
3
3
|
import { cn as r } from "../utils/cn.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
4
|
+
import { useDevportal as i, useIsFluidgridsVariant as a } from "../providers/DevportalProvider.js";
|
|
5
|
+
import { nativeCopyText as o, nativeImpact as s, nativeNotify as c } from "../../utils/nativeBridge.js";
|
|
6
|
+
import { useEffect as l, useMemo as u, useState as d } from "react";
|
|
7
|
+
import { BookOpen as f, CalendarClock as p, Code2 as m, ExternalLink as h, FileCode as g, HelpCircle as _, KeyRound as v, Layers as y, Network as b, Plug as x, Rocket as S, Search as C, Webhook as w } from "lucide-react";
|
|
8
|
+
import { Navigate as T } from "react-router";
|
|
9
|
+
import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
10
|
+
import { EmphasisPanel as k } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
import { useI18n as A } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
12
|
// src/devportal/pages/ResourcesPage.tsx
|
|
11
|
-
var
|
|
13
|
+
var j = "https://docs.burdenoff.com/developers", M = {
|
|
12
14
|
id: "sdks",
|
|
13
15
|
name: "SDKs",
|
|
14
16
|
description: "Official client libraries for building on the Burdenoff platform. See the SDKs documentation for supported languages and installation.",
|
|
15
|
-
icon: /* @__PURE__ */
|
|
16
|
-
url: `${
|
|
17
|
+
icon: /* @__PURE__ */ D(m, { size: 24 }),
|
|
18
|
+
url: `${j}/node-sdk`,
|
|
17
19
|
installCommand: "npm install @burdenoff/workspaces-sdk"
|
|
18
|
-
},
|
|
20
|
+
}, N = [
|
|
19
21
|
{
|
|
20
22
|
id: "graphql-api",
|
|
21
23
|
name: "GraphQL API",
|
|
22
24
|
description: "Query and mutate platform data through the federated GraphQL API.",
|
|
23
|
-
icon: /* @__PURE__ */
|
|
24
|
-
url: `${
|
|
25
|
+
icon: /* @__PURE__ */ D(b, { size: 24 }),
|
|
26
|
+
url: `${j}/build/graphql-api`
|
|
25
27
|
},
|
|
26
28
|
{
|
|
27
29
|
id: "plugins",
|
|
28
30
|
name: "Plugins",
|
|
29
31
|
description: "Extend the platform with plugins that add new capabilities and surfaces.",
|
|
30
|
-
icon: /* @__PURE__ */
|
|
31
|
-
url: `${
|
|
32
|
+
icon: /* @__PURE__ */ D(x, { size: 24 }),
|
|
33
|
+
url: `${j}/build/plugins`
|
|
32
34
|
},
|
|
33
35
|
{
|
|
34
36
|
id: "webhooks",
|
|
35
37
|
name: "Webhooks",
|
|
36
38
|
description: "Receive real-time platform events in your own services via webhooks.",
|
|
37
|
-
icon: /* @__PURE__ */
|
|
38
|
-
url: `${
|
|
39
|
+
icon: /* @__PURE__ */ D(w, { size: 24 }),
|
|
40
|
+
url: `${j}/build/webhooks`
|
|
39
41
|
}
|
|
40
|
-
],
|
|
42
|
+
], P = [{
|
|
41
43
|
id: "scheduler",
|
|
42
44
|
name: "Scheduler & Workflows",
|
|
43
45
|
description: "Schedule jobs and orchestrate long-running workflows on the platform.",
|
|
44
|
-
icon: /* @__PURE__ */
|
|
45
|
-
url: `${
|
|
46
|
-
}],
|
|
46
|
+
icon: /* @__PURE__ */ D(p, { size: 24 }),
|
|
47
|
+
url: `${j}/extend/scheduler/`
|
|
48
|
+
}], F = [
|
|
47
49
|
{
|
|
48
50
|
id: "platform-overview",
|
|
49
51
|
name: "Platform Overview",
|
|
50
52
|
description: "Understand the building blocks of the Burdenoff developer platform.",
|
|
51
|
-
icon: /* @__PURE__ */
|
|
52
|
-
url: `${
|
|
53
|
+
icon: /* @__PURE__ */ D(f, { size: 24 }),
|
|
54
|
+
url: `${j}/platform-overview`
|
|
53
55
|
},
|
|
54
56
|
{
|
|
55
57
|
id: "quick-start",
|
|
56
58
|
name: "Quick Start",
|
|
57
59
|
description: "Get up and running with the platform in a few steps.",
|
|
58
|
-
icon: /* @__PURE__ */ S
|
|
59
|
-
url: `${
|
|
60
|
+
icon: /* @__PURE__ */ D(S, { size: 24 }),
|
|
61
|
+
url: `${j}/quick-start`
|
|
60
62
|
},
|
|
61
63
|
{
|
|
62
64
|
id: "authentication",
|
|
63
65
|
name: "Authentication",
|
|
64
66
|
description: "Learn how to authenticate requests and manage actor identity.",
|
|
65
|
-
icon: /* @__PURE__ */
|
|
66
|
-
url: `${
|
|
67
|
+
icon: /* @__PURE__ */ D(v, { size: 24 }),
|
|
68
|
+
url: `${j}/authentication`
|
|
67
69
|
},
|
|
68
70
|
{
|
|
69
71
|
id: "relationship-graphs",
|
|
70
72
|
name: "Relationship Graphs",
|
|
71
73
|
description: "Model and traverse connected data with relationship graphs.",
|
|
72
|
-
icon: /* @__PURE__ */
|
|
73
|
-
url: `${
|
|
74
|
+
icon: /* @__PURE__ */ D(y, { size: 24 }),
|
|
75
|
+
url: `${j}/concepts/relationship-graphs`
|
|
74
76
|
},
|
|
75
77
|
{
|
|
76
78
|
id: "examples",
|
|
77
79
|
name: "Examples",
|
|
78
80
|
description: "Browse worked examples covering common integration tasks.",
|
|
79
|
-
icon: /* @__PURE__ */
|
|
80
|
-
url: `${
|
|
81
|
+
icon: /* @__PURE__ */ D(g, { size: 24 }),
|
|
82
|
+
url: `${j}/examples`
|
|
81
83
|
},
|
|
82
84
|
{
|
|
83
85
|
id: "faq",
|
|
84
86
|
name: "FAQ",
|
|
85
87
|
description: "Answers to frequently asked developer questions.",
|
|
86
|
-
icon: /* @__PURE__ */
|
|
87
|
-
url: `${
|
|
88
|
+
icon: /* @__PURE__ */ D(_, { size: 24 }),
|
|
89
|
+
url: `${j}/faq`
|
|
88
90
|
}
|
|
89
|
-
],
|
|
90
|
-
let [r,
|
|
91
|
-
return /* @__PURE__ */
|
|
91
|
+
], I = (e, t) => !t || `${e.name} ${e.description}`.toLowerCase().includes(t.toLowerCase()), L = ({ sdk: e, copyLabel: t, copiedLabel: n }) => {
|
|
92
|
+
let [r, i] = d(!1);
|
|
93
|
+
return /* @__PURE__ */ O("div", {
|
|
92
94
|
className: "flex flex-col rounded-card border border-border-seam bg-bg-surface p-5",
|
|
93
95
|
children: [
|
|
94
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ O("div", {
|
|
95
97
|
className: "flex items-center gap-3",
|
|
96
|
-
children: [/* @__PURE__ */
|
|
98
|
+
children: [/* @__PURE__ */ D("div", {
|
|
97
99
|
className: "rounded-lg bg-action-primary-bg/10 p-2.5 text-primary",
|
|
98
100
|
children: e.icon
|
|
99
|
-
}), /* @__PURE__ */
|
|
101
|
+
}), /* @__PURE__ */ D("div", { children: /* @__PURE__ */ D("h3", {
|
|
100
102
|
className: "font-semibold",
|
|
101
103
|
children: e.name
|
|
102
104
|
}) })]
|
|
103
105
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ D("p", {
|
|
105
107
|
className: "mt-3 text-sm text-text-secondary",
|
|
106
108
|
children: e.description
|
|
107
109
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ O("div", {
|
|
109
111
|
className: "mt-4 flex items-center gap-2 rounded-md bg-bg-sunken/50 p-2",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
112
|
+
children: [/* @__PURE__ */ D("code", {
|
|
111
113
|
className: "flex-1 text-xs",
|
|
112
114
|
children: e.installCommand
|
|
113
|
-
}), /* @__PURE__ */
|
|
115
|
+
}), /* @__PURE__ */ D("button", {
|
|
114
116
|
type: "button",
|
|
115
117
|
onClick: async () => {
|
|
116
|
-
|
|
118
|
+
s("light"), await o(e.installCommand) ? (i(!0), c("success"), setTimeout(() => i(!1), 2e3)) : c("error");
|
|
117
119
|
},
|
|
118
120
|
className: "rounded px-2 py-1 text-xs hover:bg-bg-sunken transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",
|
|
119
121
|
children: r ? n : t
|
|
120
122
|
})]
|
|
121
123
|
}),
|
|
122
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ D("div", {
|
|
123
125
|
className: "mt-4 flex items-center justify-end text-sm",
|
|
124
|
-
children: /* @__PURE__ */
|
|
126
|
+
children: /* @__PURE__ */ O("a", {
|
|
125
127
|
href: e.url,
|
|
126
128
|
target: "_blank",
|
|
127
129
|
rel: "noopener noreferrer",
|
|
128
130
|
className: "flex items-center gap-1 text-primary hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",
|
|
129
|
-
children: ["Docs ", /* @__PURE__ */
|
|
131
|
+
children: ["Docs ", /* @__PURE__ */ D(h, {
|
|
130
132
|
size: 12,
|
|
131
133
|
"aria-hidden": "true"
|
|
132
134
|
})]
|
|
@@ -134,139 +136,153 @@ var E = "https://docs.burdenoff.com/developers", D = {
|
|
|
134
136
|
})
|
|
135
137
|
]
|
|
136
138
|
});
|
|
137
|
-
},
|
|
139
|
+
}, R = ({ resource: e }) => /* @__PURE__ */ O("a", {
|
|
138
140
|
href: e.url,
|
|
139
141
|
target: "_blank",
|
|
140
142
|
rel: "noopener noreferrer",
|
|
141
143
|
className: "group flex items-start gap-4 rounded-card border border-border-seam bg-bg-surface p-4 shadow-[var(--shadow-pop)] transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--shadow-pop-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",
|
|
142
144
|
children: [
|
|
143
|
-
/* @__PURE__ */
|
|
145
|
+
/* @__PURE__ */ D("div", {
|
|
144
146
|
className: "rounded-lg bg-action-primary-bg/10 p-2.5 text-primary",
|
|
145
147
|
children: e.icon
|
|
146
148
|
}),
|
|
147
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ O("div", {
|
|
148
150
|
className: "flex-1",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
151
|
+
children: [/* @__PURE__ */ D("h3", {
|
|
150
152
|
className: "font-semibold group-hover:text-primary",
|
|
151
153
|
children: e.name
|
|
152
|
-
}), /* @__PURE__ */
|
|
154
|
+
}), /* @__PURE__ */ D("p", {
|
|
153
155
|
className: "mt-1 text-sm text-text-secondary",
|
|
154
156
|
children: e.description
|
|
155
157
|
})]
|
|
156
158
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ D(h, {
|
|
158
160
|
size: 16,
|
|
159
161
|
"aria-hidden": "true",
|
|
160
162
|
className: "text-text-secondary opacity-0 transition-opacity group-hover:opacity-100"
|
|
161
163
|
})
|
|
162
164
|
]
|
|
163
|
-
}),
|
|
164
|
-
let { t:
|
|
165
|
-
let
|
|
166
|
-
return
|
|
167
|
-
}, [
|
|
168
|
-
return /* @__PURE__ */
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
165
|
+
}), z = () => {
|
|
166
|
+
let { t: e } = A(), i = (t, n) => {
|
|
167
|
+
let r = e(t);
|
|
168
|
+
return r === t ? n : r;
|
|
169
|
+
}, [a, o] = d(""), [s, c] = d("all"), l = s === "all" || s === "build", f = s === "all" || s === "learn", p = u(() => l && I(M, a), [l, a]), m = u(() => l ? N.filter((e) => I(e, a)) : [], [l, a]), h = u(() => l ? P.filter((e) => I(e, a)) : [], [l, a]), g = u(() => f ? F.filter((e) => I(e, a)) : [], [f, a]), _ = p || m.length > 0 || h.length > 0 || g.length > 0;
|
|
170
|
+
return /* @__PURE__ */ O(E, { children: [
|
|
171
|
+
/* @__PURE__ */ O("div", {
|
|
172
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
173
|
+
children: [/* @__PURE__ */ O("div", {
|
|
174
|
+
className: "relative flex-1 max-w-md",
|
|
175
|
+
children: [/* @__PURE__ */ D(C, {
|
|
176
|
+
size: 16,
|
|
177
|
+
"aria-hidden": "true",
|
|
178
|
+
className: "absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary"
|
|
179
|
+
}), /* @__PURE__ */ D("input", {
|
|
180
|
+
type: "text",
|
|
181
|
+
"aria-label": i("devportal.searchResources", "Search resources..."),
|
|
182
|
+
placeholder: i("devportal.searchResources", "Search resources..."),
|
|
183
|
+
value: a,
|
|
184
|
+
onChange: (e) => o(e.target.value),
|
|
185
|
+
className: "w-full rounded-md border bg-bg-surface pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary"
|
|
182
186
|
})]
|
|
183
|
-
}),
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
"aria-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
type: "button",
|
|
219
|
-
"aria-pressed": u === e.id,
|
|
220
|
-
onClick: () => d(e.id),
|
|
221
|
-
className: r("rounded px-3 py-1.5 text-sm font-medium transition-colors", u === e.id ? "bg-action-primary-bg text-action-primary-text" : "hover:bg-bg-sunken"),
|
|
222
|
-
children: e.label
|
|
223
|
-
}, e.id))
|
|
224
|
-
})]
|
|
225
|
-
}),
|
|
226
|
-
m && /* @__PURE__ */ S(T, { children: /* @__PURE__ */ S(t, {
|
|
227
|
-
title: a("devportal.sdks", "SDKs"),
|
|
228
|
-
description: a("devportal.sdksDescription", "Client libraries for building on the platform"),
|
|
229
|
-
children: /* @__PURE__ */ S("div", {
|
|
230
|
-
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
231
|
-
children: /* @__PURE__ */ S(M, {
|
|
232
|
-
sdk: D,
|
|
233
|
-
copyLabel: a("devportal.copy", "Copy"),
|
|
234
|
-
copiedLabel: a("devportal.copied", "Copied!")
|
|
235
|
-
})
|
|
236
|
-
})
|
|
237
|
-
}) }),
|
|
238
|
-
h.length > 0 && /* @__PURE__ */ S(t, {
|
|
239
|
-
title: a("devportal.build", "Build"),
|
|
240
|
-
description: a("devportal.buildDescription", "APIs and integration surfaces"),
|
|
241
|
-
children: /* @__PURE__ */ S("div", {
|
|
242
|
-
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
243
|
-
children: h.map((e) => /* @__PURE__ */ S(N, { resource: e }, e.id))
|
|
244
|
-
})
|
|
245
|
-
}),
|
|
246
|
-
g.length > 0 && /* @__PURE__ */ S(t, {
|
|
247
|
-
title: a("devportal.extend", "Extend"),
|
|
248
|
-
description: a("devportal.extendDescription", "Schedule jobs and orchestrate workflows"),
|
|
249
|
-
children: /* @__PURE__ */ S("div", {
|
|
250
|
-
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
251
|
-
children: g.map((e) => /* @__PURE__ */ S(N, { resource: e }, e.id))
|
|
252
|
-
})
|
|
253
|
-
}),
|
|
254
|
-
_.length > 0 && /* @__PURE__ */ S(t, {
|
|
255
|
-
title: a("devportal.learn", "Learn"),
|
|
256
|
-
description: a("devportal.learnDescription", "Guides and concepts to get you started"),
|
|
257
|
-
children: /* @__PURE__ */ S("div", {
|
|
258
|
-
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
259
|
-
children: _.map((e) => /* @__PURE__ */ S(N, { resource: e }, e.id))
|
|
187
|
+
}), /* @__PURE__ */ D("div", {
|
|
188
|
+
role: "group",
|
|
189
|
+
"aria-label": i("devportal.filterResources", "Filter resources"),
|
|
190
|
+
className: "flex items-center gap-1 rounded-md border p-1",
|
|
191
|
+
children: [
|
|
192
|
+
{
|
|
193
|
+
id: "all",
|
|
194
|
+
label: i("devportal.filterAll", "All")
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: "build",
|
|
198
|
+
label: i("devportal.filterBuild", "Build")
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
id: "learn",
|
|
202
|
+
label: i("devportal.filterLearn", "Learn")
|
|
203
|
+
}
|
|
204
|
+
].map((e) => /* @__PURE__ */ D("button", {
|
|
205
|
+
type: "button",
|
|
206
|
+
"aria-pressed": s === e.id,
|
|
207
|
+
onClick: () => c(e.id),
|
|
208
|
+
className: r("rounded px-3 py-1.5 text-sm font-medium transition-colors", s === e.id ? "bg-action-primary-bg text-action-primary-text" : "hover:bg-bg-sunken"),
|
|
209
|
+
children: e.label
|
|
210
|
+
}, e.id))
|
|
211
|
+
})]
|
|
212
|
+
}),
|
|
213
|
+
p && /* @__PURE__ */ D(k, { children: /* @__PURE__ */ D(t, {
|
|
214
|
+
title: i("devportal.sdks", "SDKs"),
|
|
215
|
+
description: i("devportal.sdksDescription", "Client libraries for building on the platform"),
|
|
216
|
+
children: /* @__PURE__ */ D("div", {
|
|
217
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
218
|
+
children: /* @__PURE__ */ D(L, {
|
|
219
|
+
sdk: M,
|
|
220
|
+
copyLabel: i("devportal.copy", "Copy"),
|
|
221
|
+
copiedLabel: i("devportal.copied", "Copied!")
|
|
260
222
|
})
|
|
261
|
-
}),
|
|
262
|
-
!v && /* @__PURE__ */ S(n, {
|
|
263
|
-
illustration: "empty-search",
|
|
264
|
-
title: a("devportal.noResourcesFoundTitle", "No matching resources"),
|
|
265
|
-
description: a("devportal.noResourcesFound", "No resources match your search.")
|
|
266
223
|
})
|
|
267
|
-
|
|
224
|
+
}) }),
|
|
225
|
+
m.length > 0 && /* @__PURE__ */ D(t, {
|
|
226
|
+
title: i("devportal.build", "Build"),
|
|
227
|
+
description: i("devportal.buildDescription", "APIs and integration surfaces"),
|
|
228
|
+
children: /* @__PURE__ */ D("div", {
|
|
229
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
230
|
+
children: m.map((e) => /* @__PURE__ */ D(R, { resource: e }, e.id))
|
|
231
|
+
})
|
|
232
|
+
}),
|
|
233
|
+
h.length > 0 && /* @__PURE__ */ D(t, {
|
|
234
|
+
title: i("devportal.extend", "Extend"),
|
|
235
|
+
description: i("devportal.extendDescription", "Schedule jobs and orchestrate workflows"),
|
|
236
|
+
children: /* @__PURE__ */ D("div", {
|
|
237
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
238
|
+
children: h.map((e) => /* @__PURE__ */ D(R, { resource: e }, e.id))
|
|
239
|
+
})
|
|
240
|
+
}),
|
|
241
|
+
g.length > 0 && /* @__PURE__ */ D(t, {
|
|
242
|
+
title: i("devportal.learn", "Learn"),
|
|
243
|
+
description: i("devportal.learnDescription", "Guides and concepts to get you started"),
|
|
244
|
+
children: /* @__PURE__ */ D("div", {
|
|
245
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
246
|
+
children: g.map((e) => /* @__PURE__ */ D(R, { resource: e }, e.id))
|
|
247
|
+
})
|
|
248
|
+
}),
|
|
249
|
+
!_ && /* @__PURE__ */ D(n, {
|
|
250
|
+
illustration: "empty-search",
|
|
251
|
+
title: i("devportal.noResourcesFoundTitle", "No matching resources"),
|
|
252
|
+
description: i("devportal.noResourcesFound", "No resources match your search.")
|
|
253
|
+
})
|
|
254
|
+
] });
|
|
255
|
+
}, B = () => {
|
|
256
|
+
let { basePath: e, navigate: t } = i();
|
|
257
|
+
return l(() => {
|
|
258
|
+
e && t && t(`${e.replace(/\/$/, "")}/docs`);
|
|
259
|
+
}, [e, t]), e && t ? null : /* @__PURE__ */ D(T, {
|
|
260
|
+
to: "../docs",
|
|
261
|
+
relative: "path",
|
|
262
|
+
replace: !0
|
|
263
|
+
});
|
|
264
|
+
}, V = () => {
|
|
265
|
+
let { t } = A(), n = a(), r = (e, n) => {
|
|
266
|
+
let r = t(e);
|
|
267
|
+
return r === e ? n : r;
|
|
268
|
+
};
|
|
269
|
+
return n ? /* @__PURE__ */ D(B, {}) : /* @__PURE__ */ O(e, {
|
|
270
|
+
title: r("devportal.developerResources", "Developer Resources"),
|
|
271
|
+
description: r("devportal.resourcesDescription", "Documentation for building, extending, and learning the Burdenoff platform"),
|
|
272
|
+
purpose: r("devportal.resourcesPurpose", "A jumping-off point for building on the platform — SDKs, API references, integration guides, and learning material in one place. Start with the SDK for your language, then follow the build and learn paths."),
|
|
273
|
+
children: [/* @__PURE__ */ O("div", {
|
|
274
|
+
role: "status",
|
|
275
|
+
className: "mb-6 rounded-lg border border-status-warning-border bg-status-warning-bg p-4 text-sm text-status-warning-text",
|
|
276
|
+
children: [/* @__PURE__ */ D("strong", {
|
|
277
|
+
className: "font-semibold",
|
|
278
|
+
children: r("devportal.resources.comingSoon.title", "Coming soon")
|
|
279
|
+
}), /* @__PURE__ */ D("span", {
|
|
280
|
+
className: "ml-2",
|
|
281
|
+
children: r("devportal.resources.comingSoon.description", "An in-product resources hub is on the way. For now, these cards link to the official Burdenoff developer documentation.")
|
|
282
|
+
})]
|
|
283
|
+
}), /* @__PURE__ */ D(z, {})]
|
|
268
284
|
});
|
|
269
285
|
};
|
|
270
|
-
export {
|
|
286
|
+
export { V as ResourcesPage, z as ResourcesSections };
|
|
271
287
|
|
|
272
288
|
//# sourceMappingURL=ResourcesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourcesPage.js","names":["EmptyState","EmptyState$1","DOCS_BASE","sdk","Code2","buildResources","Network","Plug","Webhook","extendResources","CalendarClock","learnResources","BookOpen","Rocket","KeyRound","Layers","FileCode","HelpCircle","matchesQuery","query","resource","SDKCard","copied","setCopied","useState","nativeImpact","nativeCopyText","nativeNotify","copiedLabel","copyLabel","ExternalLink","ResourceCard","ResourcesPage","useI18n","tr","value","t","key","fallback","searchQuery","setSearchQuery","category","setCategory","showBuild","showLearn","sdkVisible","useMemo","buildVisible","r","extendVisible","learnVisible","hasResults","PageLayout","Search","cat","cn","EmphasisPanel","PageSection"],"sources":["../../../src/devportal/pages/ResourcesPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n FileCode,\n ExternalLink,\n Code2,\n BookOpen,\n KeyRound,\n Webhook,\n Network,\n Plug,\n CalendarClock,\n Rocket,\n HelpCircle,\n Layers,\n Search,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { EmphasisPanel } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { cn } from \"../utils/cn\";\nimport {\n nativeCopyText,\n nativeImpact,\n nativeNotify,\n} from \"../../utils/nativeBridge\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Every resource below links to a REAL, confirmed documentation page under\n * https://docs.burdenoff.com/developers. There are intentionally no\n * fabricated metrics (downloads, stars, versions), no invented GitHub repos,\n * and no third-party tools (Postman/Figma/VS Code/etc.) that don't exist.\n */\n\nconst DOCS_BASE = \"https://docs.burdenoff.com/developers\";\n\ninterface Resource {\n id: string;\n name: string;\n description: string;\n icon: React.ReactNode;\n url: string;\n}\n\ninterface SdkResource extends Resource {\n /** A generic, real install example — no fake version suffix. */\n installCommand: string;\n}\n\ntype ResourceCategory = \"all\" | \"build\" | \"learn\";\n\n// =============================================================================\n// DATA\n// =============================================================================\n\n// SDKs — single doc-backed entry. The install command is a generic example;\n// see the SDKs doc for the authoritative package list.\nconst sdk: SdkResource = {\n id: \"sdks\",\n name: \"SDKs\",\n description:\n \"Official client libraries for building on the Burdenoff platform. See the SDKs documentation for supported languages and installation.\",\n icon: <Code2 size={24} />,\n url: `${DOCS_BASE}/node-sdk`,\n installCommand: \"npm install @burdenoff/workspaces-sdk\",\n};\n\n// Build — APIs and integration surfaces, each backed by a real doc page.\nconst buildResources: Resource[] = [\n {\n id: \"graphql-api\",\n name: \"GraphQL API\",\n description:\n \"Query and mutate platform data through the federated GraphQL API.\",\n icon: <Network size={24} />,\n url: `${DOCS_BASE}/build/graphql-api`,\n },\n {\n id: \"plugins\",\n name: \"Plugins\",\n description:\n \"Extend the platform with plugins that add new capabilities and surfaces.\",\n icon: <Plug size={24} />,\n url: `${DOCS_BASE}/build/plugins`,\n },\n {\n id: \"webhooks\",\n name: \"Webhooks\",\n description:\n \"Receive real-time platform events in your own services via webhooks.\",\n icon: <Webhook size={24} />,\n url: `${DOCS_BASE}/build/webhooks`,\n },\n];\n\n// Extend — higher-level extension surfaces.\nconst extendResources: Resource[] = [\n {\n id: \"scheduler\",\n name: \"Scheduler & Workflows\",\n description:\n \"Schedule jobs and orchestrate long-running workflows on the platform.\",\n icon: <CalendarClock size={24} />,\n url: `${DOCS_BASE}/extend/scheduler/`,\n },\n];\n\n// Learn — conceptual and getting-started documentation.\nconst learnResources: Resource[] = [\n {\n id: \"platform-overview\",\n name: \"Platform Overview\",\n description:\n \"Understand the building blocks of the Burdenoff developer platform.\",\n icon: <BookOpen size={24} />,\n url: `${DOCS_BASE}/platform-overview`,\n },\n {\n id: \"quick-start\",\n name: \"Quick Start\",\n description: \"Get up and running with the platform in a few steps.\",\n icon: <Rocket size={24} />,\n url: `${DOCS_BASE}/quick-start`,\n },\n {\n id: \"authentication\",\n name: \"Authentication\",\n description:\n \"Learn how to authenticate requests and manage actor identity.\",\n icon: <KeyRound size={24} />,\n url: `${DOCS_BASE}/authentication`,\n },\n {\n id: \"relationship-graphs\",\n name: \"Relationship Graphs\",\n description: \"Model and traverse connected data with relationship graphs.\",\n icon: <Layers size={24} />,\n url: `${DOCS_BASE}/concepts/relationship-graphs`,\n },\n {\n id: \"examples\",\n name: \"Examples\",\n description: \"Browse worked examples covering common integration tasks.\",\n icon: <FileCode size={24} />,\n url: `${DOCS_BASE}/examples`,\n },\n {\n id: \"faq\",\n name: \"FAQ\",\n description: \"Answers to frequently asked developer questions.\",\n icon: <HelpCircle size={24} />,\n url: `${DOCS_BASE}/faq`,\n },\n];\n\n// Helper for client-side search filtering across name + description.\nconst matchesQuery = (resource: Resource, query: string): boolean => {\n if (!query) return true;\n const haystack = `${resource.name} ${resource.description}`.toLowerCase();\n return haystack.includes(query.toLowerCase());\n};\n\n// =============================================================================\n// COMPONENTS\n// =============================================================================\n\nconst SDKCard: FC<{\n sdk: SdkResource;\n copyLabel: string;\n copiedLabel: string;\n}> = ({ sdk, copyLabel, copiedLabel }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n void nativeImpact(\"light\");\n const ok = await nativeCopyText(sdk.installCommand);\n if (ok) {\n setCopied(true);\n void nativeNotify(\"success\");\n setTimeout(() => setCopied(false), 2000);\n } else {\n void nativeNotify(\"error\");\n }\n };\n\n return (\n <div className=\"flex flex-col rounded-card border border-border-seam bg-bg-surface p-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-action-primary-bg/10 p-2.5 text-primary\">\n {sdk.icon}\n </div>\n <div>\n <h3 className=\"font-semibold\">{sdk.name}</h3>\n </div>\n </div>\n\n <p className=\"mt-3 text-sm text-text-secondary\">{sdk.description}</p>\n\n <div className=\"mt-4 flex items-center gap-2 rounded-md bg-bg-sunken/50 p-2\">\n <code className=\"flex-1 text-xs\">{sdk.installCommand}</code>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"rounded px-2 py-1 text-xs hover:bg-bg-sunken transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n {copied ? copiedLabel : copyLabel}\n </button>\n </div>\n\n <div className=\"mt-4 flex items-center justify-end text-sm\">\n <a\n href={sdk.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-primary hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n Docs <ExternalLink size={12} aria-hidden=\"true\" />\n </a>\n </div>\n </div>\n );\n};\n\nconst ResourceCard: FC<{ resource: Resource }> = ({ resource }) => (\n <a\n href={resource.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"group flex items-start gap-4 rounded-card border border-border-seam bg-bg-surface p-4 shadow-[var(--shadow-pop)] transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--shadow-pop-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n <div className=\"rounded-lg bg-action-primary-bg/10 p-2.5 text-primary\">\n {resource.icon}\n </div>\n <div className=\"flex-1\">\n <h3 className=\"font-semibold group-hover:text-primary\">\n {resource.name}\n </h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{resource.description}</p>\n </div>\n <ExternalLink\n size={16}\n aria-hidden=\"true\"\n className=\"text-text-secondary opacity-0 transition-opacity group-hover:opacity-100\"\n />\n </a>\n);\n\n// =============================================================================\n// PAGE COMPONENT\n// =============================================================================\n\nexport const ResourcesPage: FC = () => {\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 [searchQuery, setSearchQuery] = useState(\"\");\n const [category, setCategory] = useState<ResourceCategory>(\"all\");\n\n const showBuild = category === \"all\" || category === \"build\";\n const showLearn = category === \"all\" || category === \"learn\";\n\n const sdkVisible = useMemo(\n () => showBuild && matchesQuery(sdk, searchQuery),\n [showBuild, searchQuery],\n );\n const buildVisible = useMemo(\n () =>\n showBuild\n ? buildResources.filter((r) => matchesQuery(r, searchQuery))\n : [],\n [showBuild, searchQuery],\n );\n const extendVisible = useMemo(\n () =>\n showBuild\n ? extendResources.filter((r) => matchesQuery(r, searchQuery))\n : [],\n [showBuild, searchQuery],\n );\n const learnVisible = useMemo(\n () =>\n showLearn\n ? learnResources.filter((r) => matchesQuery(r, searchQuery))\n : [],\n [showLearn, searchQuery],\n );\n\n const hasResults =\n sdkVisible ||\n buildVisible.length > 0 ||\n extendVisible.length > 0 ||\n learnVisible.length > 0;\n\n return (\n <PageLayout\n title={tr(\"devportal.developerResources\", \"Developer Resources\")}\n description={tr(\n \"devportal.resourcesDescription\",\n \"Documentation for building, extending, and learning the Burdenoff platform\",\n )}\n purpose={tr(\n \"devportal.resourcesPurpose\",\n \"A jumping-off point for building on the platform — SDKs, API references, integration guides, and learning material in one place. Start with the SDK for your language, then follow the build and learn paths.\",\n )}\n >\n {/* Coming-soon banner — Resources is a deferred surface (see\n devportal stability tracker). The cards below link to the official\n developer documentation until the in-product hub lands. */}\n <div\n role=\"status\"\n className=\"mb-6 rounded-lg border border-status-warning-border bg-status-warning-bg p-4 text-sm text-status-warning-text\"\n >\n <strong className=\"font-semibold\">\n {tr(\"devportal.resources.comingSoon.title\", \"Coming soon\")}\n </strong>\n <span className=\"ml-2\">\n {tr(\n \"devportal.resources.comingSoon.description\",\n \"An in-product resources hub is on the way. For now, these cards link to the official Burdenoff developer documentation.\",\n )}\n </span>\n </div>\n\n {/* Search and Filter */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative flex-1 max-w-md\">\n <Search\n size={16}\n aria-hidden=\"true\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <input\n type=\"text\"\n aria-label={tr(\"devportal.searchResources\", \"Search resources...\")}\n placeholder={tr(\"devportal.searchResources\", \"Search resources...\")}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border bg-bg-surface pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n </div>\n <div\n role=\"group\"\n aria-label={tr(\"devportal.filterResources\", \"Filter resources\")}\n className=\"flex items-center gap-1 rounded-md border p-1\"\n >\n {[\n { id: \"all\", label: tr(\"devportal.filterAll\", \"All\") },\n { id: \"build\", label: tr(\"devportal.filterBuild\", \"Build\") },\n { id: \"learn\", label: tr(\"devportal.filterLearn\", \"Learn\") },\n ].map((cat) => (\n <button\n key={cat.id}\n type=\"button\"\n aria-pressed={category === cat.id}\n onClick={() => setCategory(cat.id as ResourceCategory)}\n className={cn(\n \"rounded px-3 py-1.5 text-sm font-medium transition-colors\",\n category === cat.id\n ? \"bg-action-primary-bg text-action-primary-text\"\n : \"hover:bg-bg-sunken\",\n )}\n >\n {cat.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* SDKs — primary emphasis zone (the recommended starting point) */}\n {sdkVisible && (\n <EmphasisPanel>\n <PageSection\n title={tr(\"devportal.sdks\", \"SDKs\")}\n description={tr(\n \"devportal.sdksDescription\",\n \"Client libraries for building on the platform\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n <SDKCard\n sdk={sdk}\n copyLabel={tr(\"devportal.copy\", \"Copy\")}\n copiedLabel={tr(\"devportal.copied\", \"Copied!\")}\n />\n </div>\n </PageSection>\n </EmphasisPanel>\n )}\n\n {/* Build */}\n {buildVisible.length > 0 && (\n <PageSection\n title={tr(\"devportal.build\", \"Build\")}\n description={tr(\n \"devportal.buildDescription\",\n \"APIs and integration surfaces\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {buildVisible.map((resource) => (\n <ResourceCard key={resource.id} resource={resource} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Extend */}\n {extendVisible.length > 0 && (\n <PageSection\n title={tr(\"devportal.extend\", \"Extend\")}\n description={tr(\n \"devportal.extendDescription\",\n \"Schedule jobs and orchestrate workflows\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {extendVisible.map((resource) => (\n <ResourceCard key={resource.id} resource={resource} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Learn */}\n {learnVisible.length > 0 && (\n <PageSection\n title={tr(\"devportal.learn\", \"Learn\")}\n description={tr(\n \"devportal.learnDescription\",\n \"Guides and concepts to get you started\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {learnVisible.map((resource) => (\n <ResourceCard key={resource.id} resource={resource} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Empty state */}\n {!hasResults && (\n <EmptyState\n illustration=\"empty-search\"\n title={tr(\"devportal.noResourcesFoundTitle\", \"No matching resources\")}\n description={tr(\n \"devportal.noResourcesFound\",\n \"No resources match your search.\",\n )}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResourcesPage.js","names":["_Fragment","EmptyState","EmptyState$1","DOCS_BASE","sdk","Code2","buildResources","Network","Plug","Webhook","extendResources","CalendarClock","learnResources","BookOpen","Rocket","KeyRound","Layers","FileCode","HelpCircle","matchesQuery","query","resource","SDKCard","copied","setCopied","useState","nativeImpact","nativeCopyText","nativeNotify","copiedLabel","copyLabel","ExternalLink","ResourceCard","ResourcesSections","useI18n","tr","value","t","key","fallback","searchQuery","setSearchQuery","category","setCategory","showBuild","showLearn","sdkVisible","useMemo","buildVisible","r","extendVisible","learnVisible","hasResults","Fragment","Search","cat","cn","EmphasisPanel","PageSection","ResourcesRedirect","useDevportal","useEffect","basePath","navigate","Navigate","ResourcesPage","isFluidgrids","useIsFluidgridsVariant","PageLayout"],"sources":["../../../src/devportal/pages/ResourcesPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Navigate } from \"react-router\";\nimport {\n FileCode,\n ExternalLink,\n Code2,\n BookOpen,\n KeyRound,\n Webhook,\n Network,\n Plug,\n CalendarClock,\n Rocket,\n HelpCircle,\n Layers,\n Search,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { EmphasisPanel } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { cn } from \"../utils/cn\";\nimport {\n useDevportal,\n useIsFluidgridsVariant,\n} from \"../providers/DevportalProvider\";\nimport {\n nativeCopyText,\n nativeImpact,\n nativeNotify,\n} from \"../../utils/nativeBridge\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Every resource below links to a REAL, confirmed documentation page under\n * https://docs.burdenoff.com/developers. There are intentionally no\n * fabricated metrics (downloads, stars, versions), no invented GitHub repos,\n * and no third-party tools (Postman/Figma/VS Code/etc.) that don't exist.\n */\n\nconst DOCS_BASE = \"https://docs.burdenoff.com/developers\";\n\ninterface Resource {\n id: string;\n name: string;\n description: string;\n icon: React.ReactNode;\n url: string;\n}\n\ninterface SdkResource extends Resource {\n /** A generic, real install example — no fake version suffix. */\n installCommand: string;\n}\n\ntype ResourceCategory = \"all\" | \"build\" | \"learn\";\n\n// =============================================================================\n// DATA\n// =============================================================================\n\n// SDKs — single doc-backed entry. The install command is a generic example;\n// see the SDKs doc for the authoritative package list.\nconst sdk: SdkResource = {\n id: \"sdks\",\n name: \"SDKs\",\n description:\n \"Official client libraries for building on the Burdenoff platform. See the SDKs documentation for supported languages and installation.\",\n icon: <Code2 size={24} />,\n url: `${DOCS_BASE}/node-sdk`,\n installCommand: \"npm install @burdenoff/workspaces-sdk\",\n};\n\n// Build — APIs and integration surfaces, each backed by a real doc page.\nconst buildResources: Resource[] = [\n {\n id: \"graphql-api\",\n name: \"GraphQL API\",\n description:\n \"Query and mutate platform data through the federated GraphQL API.\",\n icon: <Network size={24} />,\n url: `${DOCS_BASE}/build/graphql-api`,\n },\n {\n id: \"plugins\",\n name: \"Plugins\",\n description:\n \"Extend the platform with plugins that add new capabilities and surfaces.\",\n icon: <Plug size={24} />,\n url: `${DOCS_BASE}/build/plugins`,\n },\n {\n id: \"webhooks\",\n name: \"Webhooks\",\n description:\n \"Receive real-time platform events in your own services via webhooks.\",\n icon: <Webhook size={24} />,\n url: `${DOCS_BASE}/build/webhooks`,\n },\n];\n\n// Extend — higher-level extension surfaces.\nconst extendResources: Resource[] = [\n {\n id: \"scheduler\",\n name: \"Scheduler & Workflows\",\n description:\n \"Schedule jobs and orchestrate long-running workflows on the platform.\",\n icon: <CalendarClock size={24} />,\n url: `${DOCS_BASE}/extend/scheduler/`,\n },\n];\n\n// Learn — conceptual and getting-started documentation.\nconst learnResources: Resource[] = [\n {\n id: \"platform-overview\",\n name: \"Platform Overview\",\n description:\n \"Understand the building blocks of the Burdenoff developer platform.\",\n icon: <BookOpen size={24} />,\n url: `${DOCS_BASE}/platform-overview`,\n },\n {\n id: \"quick-start\",\n name: \"Quick Start\",\n description: \"Get up and running with the platform in a few steps.\",\n icon: <Rocket size={24} />,\n url: `${DOCS_BASE}/quick-start`,\n },\n {\n id: \"authentication\",\n name: \"Authentication\",\n description:\n \"Learn how to authenticate requests and manage actor identity.\",\n icon: <KeyRound size={24} />,\n url: `${DOCS_BASE}/authentication`,\n },\n {\n id: \"relationship-graphs\",\n name: \"Relationship Graphs\",\n description: \"Model and traverse connected data with relationship graphs.\",\n icon: <Layers size={24} />,\n url: `${DOCS_BASE}/concepts/relationship-graphs`,\n },\n {\n id: \"examples\",\n name: \"Examples\",\n description: \"Browse worked examples covering common integration tasks.\",\n icon: <FileCode size={24} />,\n url: `${DOCS_BASE}/examples`,\n },\n {\n id: \"faq\",\n name: \"FAQ\",\n description: \"Answers to frequently asked developer questions.\",\n icon: <HelpCircle size={24} />,\n url: `${DOCS_BASE}/faq`,\n },\n];\n\n// Helper for client-side search filtering across name + description.\nconst matchesQuery = (resource: Resource, query: string): boolean => {\n if (!query) return true;\n const haystack = `${resource.name} ${resource.description}`.toLowerCase();\n return haystack.includes(query.toLowerCase());\n};\n\n// =============================================================================\n// COMPONENTS\n// =============================================================================\n\nconst SDKCard: FC<{\n sdk: SdkResource;\n copyLabel: string;\n copiedLabel: string;\n}> = ({ sdk, copyLabel, copiedLabel }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n void nativeImpact(\"light\");\n const ok = await nativeCopyText(sdk.installCommand);\n if (ok) {\n setCopied(true);\n void nativeNotify(\"success\");\n setTimeout(() => setCopied(false), 2000);\n } else {\n void nativeNotify(\"error\");\n }\n };\n\n return (\n <div className=\"flex flex-col rounded-card border border-border-seam bg-bg-surface p-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-action-primary-bg/10 p-2.5 text-primary\">\n {sdk.icon}\n </div>\n <div>\n <h3 className=\"font-semibold\">{sdk.name}</h3>\n </div>\n </div>\n\n <p className=\"mt-3 text-sm text-text-secondary\">{sdk.description}</p>\n\n <div className=\"mt-4 flex items-center gap-2 rounded-md bg-bg-sunken/50 p-2\">\n <code className=\"flex-1 text-xs\">{sdk.installCommand}</code>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"rounded px-2 py-1 text-xs hover:bg-bg-sunken transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n {copied ? copiedLabel : copyLabel}\n </button>\n </div>\n\n <div className=\"mt-4 flex items-center justify-end text-sm\">\n <a\n href={sdk.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-primary hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n Docs <ExternalLink size={12} aria-hidden=\"true\" />\n </a>\n </div>\n </div>\n );\n};\n\nconst ResourceCard: FC<{ resource: Resource }> = ({ resource }) => (\n <a\n href={resource.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"group flex items-start gap-4 rounded-card border border-border-seam bg-bg-surface p-4 shadow-[var(--shadow-pop)] transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--shadow-pop-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n <div className=\"rounded-lg bg-action-primary-bg/10 p-2.5 text-primary\">\n {resource.icon}\n </div>\n <div className=\"flex-1\">\n <h3 className=\"font-semibold group-hover:text-primary\">\n {resource.name}\n </h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{resource.description}</p>\n </div>\n <ExternalLink\n size={16}\n aria-hidden=\"true\"\n className=\"text-text-secondary opacity-0 transition-opacity group-hover:opacity-100\"\n />\n </a>\n);\n\n// =============================================================================\n// PAGE COMPONENT\n// =============================================================================\n\n/**\n * The SDK / build / learn cards with their search and filter. Shared by the\n * standalone Resources page and, for FluidGrids, the Documentation page that\n * Resources is merged into.\n */\nexport const ResourcesSections: FC = () => {\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 [searchQuery, setSearchQuery] = useState(\"\");\n const [category, setCategory] = useState<ResourceCategory>(\"all\");\n\n const showBuild = category === \"all\" || category === \"build\";\n const showLearn = category === \"all\" || category === \"learn\";\n\n const sdkVisible = useMemo(\n () => showBuild && matchesQuery(sdk, searchQuery),\n [showBuild, searchQuery],\n );\n const buildVisible = useMemo(\n () =>\n showBuild\n ? buildResources.filter((r) => matchesQuery(r, searchQuery))\n : [],\n [showBuild, searchQuery],\n );\n const extendVisible = useMemo(\n () =>\n showBuild\n ? extendResources.filter((r) => matchesQuery(r, searchQuery))\n : [],\n [showBuild, searchQuery],\n );\n const learnVisible = useMemo(\n () =>\n showLearn\n ? learnResources.filter((r) => matchesQuery(r, searchQuery))\n : [],\n [showLearn, searchQuery],\n );\n\n const hasResults =\n sdkVisible ||\n buildVisible.length > 0 ||\n extendVisible.length > 0 ||\n learnVisible.length > 0;\n\n return (\n <>\n {/* Search and Filter */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative flex-1 max-w-md\">\n <Search\n size={16}\n aria-hidden=\"true\"\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <input\n type=\"text\"\n aria-label={tr(\"devportal.searchResources\", \"Search resources...\")}\n placeholder={tr(\"devportal.searchResources\", \"Search resources...\")}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border bg-bg-surface pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n </div>\n <div\n role=\"group\"\n aria-label={tr(\"devportal.filterResources\", \"Filter resources\")}\n className=\"flex items-center gap-1 rounded-md border p-1\"\n >\n {[\n { id: \"all\", label: tr(\"devportal.filterAll\", \"All\") },\n { id: \"build\", label: tr(\"devportal.filterBuild\", \"Build\") },\n { id: \"learn\", label: tr(\"devportal.filterLearn\", \"Learn\") },\n ].map((cat) => (\n <button\n key={cat.id}\n type=\"button\"\n aria-pressed={category === cat.id}\n onClick={() => setCategory(cat.id as ResourceCategory)}\n className={cn(\n \"rounded px-3 py-1.5 text-sm font-medium transition-colors\",\n category === cat.id\n ? \"bg-action-primary-bg text-action-primary-text\"\n : \"hover:bg-bg-sunken\",\n )}\n >\n {cat.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* SDKs — primary emphasis zone (the recommended starting point) */}\n {sdkVisible && (\n <EmphasisPanel>\n <PageSection\n title={tr(\"devportal.sdks\", \"SDKs\")}\n description={tr(\n \"devportal.sdksDescription\",\n \"Client libraries for building on the platform\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n <SDKCard\n sdk={sdk}\n copyLabel={tr(\"devportal.copy\", \"Copy\")}\n copiedLabel={tr(\"devportal.copied\", \"Copied!\")}\n />\n </div>\n </PageSection>\n </EmphasisPanel>\n )}\n\n {/* Build */}\n {buildVisible.length > 0 && (\n <PageSection\n title={tr(\"devportal.build\", \"Build\")}\n description={tr(\n \"devportal.buildDescription\",\n \"APIs and integration surfaces\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {buildVisible.map((resource) => (\n <ResourceCard key={resource.id} resource={resource} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Extend */}\n {extendVisible.length > 0 && (\n <PageSection\n title={tr(\"devportal.extend\", \"Extend\")}\n description={tr(\n \"devportal.extendDescription\",\n \"Schedule jobs and orchestrate workflows\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {extendVisible.map((resource) => (\n <ResourceCard key={resource.id} resource={resource} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Learn */}\n {learnVisible.length > 0 && (\n <PageSection\n title={tr(\"devportal.learn\", \"Learn\")}\n description={tr(\n \"devportal.learnDescription\",\n \"Guides and concepts to get you started\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {learnVisible.map((resource) => (\n <ResourceCard key={resource.id} resource={resource} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Empty state */}\n {!hasResults && (\n <EmptyState\n illustration=\"empty-search\"\n title={tr(\"devportal.noResourcesFoundTitle\", \"No matching resources\")}\n description={tr(\n \"devportal.noResourcesFound\",\n \"No resources match your search.\",\n )}\n />\n )}\n </>\n );\n};\n\n/**\n * FluidGrids: Resources is merged into Documentation, so the old URL\n * redirects there instead of rendering a second page.\n */\nconst ResourcesRedirect: FC = () => {\n const { basePath, navigate } = useDevportal();\n useEffect(() => {\n if (basePath && navigate) {\n navigate(`${basePath.replace(/\\/$/, \"\")}/docs`);\n }\n }, [basePath, navigate]);\n if (basePath && navigate) return null;\n return <Navigate to=\"../docs\" relative=\"path\" replace />;\n};\n\nexport const ResourcesPage: FC = () => {\n const { t } = useI18n();\n const isFluidgrids = useIsFluidgridsVariant();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n if (isFluidgrids) return <ResourcesRedirect />;\n\n return (\n <PageLayout\n title={tr(\"devportal.developerResources\", \"Developer Resources\")}\n description={tr(\n \"devportal.resourcesDescription\",\n \"Documentation for building, extending, and learning the Burdenoff platform\",\n )}\n purpose={tr(\n \"devportal.resourcesPurpose\",\n \"A jumping-off point for building on the platform — SDKs, API references, integration guides, and learning material in one place. Start with the SDK for your language, then follow the build and learn paths.\",\n )}\n >\n {/* Coming-soon banner — Resources is a deferred surface (see\n devportal stability tracker). The cards below link to the official\n developer documentation until the in-product hub lands. */}\n <div\n role=\"status\"\n className=\"mb-6 rounded-lg border border-status-warning-border bg-status-warning-bg p-4 text-sm text-status-warning-text\"\n >\n <strong className=\"font-semibold\">\n {tr(\"devportal.resources.comingSoon.title\", \"Coming soon\")}\n </strong>\n <span className=\"ml-2\">\n {tr(\n \"devportal.resources.comingSoon.description\",\n \"An in-product resources hub is on the way. For now, these cards link to the official Burdenoff developer documentation.\",\n )}\n </span>\n </div>\n\n <ResourcesSections />\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|