@burdenoff/microfe-devportal 2026.623.2 → 2026.623.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.
|
@@ -1,471 +1,202 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
2
|
import { PageLayout as t, PageSection as n } from "../components/PageLayout.js";
|
|
3
3
|
import { nativeCopyText as r, nativeImpact as i, nativeNotify as a } from "../../utils/nativeBridge.js";
|
|
4
|
-
import {
|
|
5
|
-
import { useI18n as
|
|
6
|
-
import { BookOpen as
|
|
7
|
-
import { jsx as
|
|
4
|
+
import { useMemo as o, useState as s } from "react";
|
|
5
|
+
import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { BookOpen as l, CalendarClock as u, Code2 as d, ExternalLink as f, FileCode as p, HelpCircle as m, KeyRound as h, Layers as g, Network as _, Plug as v, Rocket as y, Search as b, Webhook as x } from "lucide-react";
|
|
7
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
8
8
|
//#region src/devportal/pages/ResourcesPage.tsx
|
|
9
|
-
var
|
|
9
|
+
var w = "https://docs.burdenoff.com/developers", T = {
|
|
10
|
+
id: "sdks",
|
|
11
|
+
name: "SDKs",
|
|
12
|
+
description: "Official client libraries for building on the Burdenoff platform. See the SDKs documentation for supported languages and installation.",
|
|
13
|
+
icon: /* @__PURE__ */ S(d, { size: 24 }),
|
|
14
|
+
url: `${w}/build/sdks`,
|
|
15
|
+
installCommand: "npm install @burdenoff/sdk-node"
|
|
16
|
+
}, E = [
|
|
10
17
|
{
|
|
11
|
-
id: "
|
|
12
|
-
name: "
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
downloads: "125k",
|
|
17
|
-
icon: /* @__PURE__ */ T(u, { size: 24 }),
|
|
18
|
-
packageManager: "npm",
|
|
19
|
-
installCommand: "npm install @burdenoff/sdk-node",
|
|
20
|
-
docsUrl: "https://docs.burdenoff.com/sdks/node",
|
|
21
|
-
githubUrl: "https://github.com/burdenoff/sdk-node",
|
|
22
|
-
isOfficial: !0
|
|
18
|
+
id: "graphql-api",
|
|
19
|
+
name: "GraphQL API",
|
|
20
|
+
description: "Query and mutate platform data through the federated GraphQL API.",
|
|
21
|
+
icon: /* @__PURE__ */ S(_, { size: 24 }),
|
|
22
|
+
url: `${w}/build/graphql-api`
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
|
-
id: "
|
|
26
|
-
name: "
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
downloads: "89k",
|
|
31
|
-
icon: /* @__PURE__ */ T(m, { size: 24 }),
|
|
32
|
-
packageManager: "pip",
|
|
33
|
-
installCommand: "pip install burdenoff-sdk",
|
|
34
|
-
docsUrl: "https://docs.burdenoff.com/sdks/python",
|
|
35
|
-
githubUrl: "https://github.com/burdenoff/sdk-python",
|
|
36
|
-
isOfficial: !0
|
|
25
|
+
id: "plugins",
|
|
26
|
+
name: "Plugins",
|
|
27
|
+
description: "Extend the platform with plugins that add new capabilities and surfaces.",
|
|
28
|
+
icon: /* @__PURE__ */ S(v, { size: 24 }),
|
|
29
|
+
url: `${w}/build/plugins`
|
|
37
30
|
},
|
|
38
31
|
{
|
|
39
|
-
id: "
|
|
40
|
-
name: "
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
downloads: "45k",
|
|
45
|
-
icon: /* @__PURE__ */ T(d, { size: 24 }),
|
|
46
|
-
packageManager: "go",
|
|
47
|
-
installCommand: "go get github.com/burdenoff/sdk-go",
|
|
48
|
-
docsUrl: "https://docs.burdenoff.com/sdks/go",
|
|
49
|
-
githubUrl: "https://github.com/burdenoff/sdk-go",
|
|
50
|
-
isOfficial: !0
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
id: "sdk-react",
|
|
54
|
-
name: "React SDK",
|
|
55
|
-
language: "TypeScript/React",
|
|
56
|
-
description: "Hooks and components for React applications",
|
|
57
|
-
version: "3.1.0",
|
|
58
|
-
downloads: "78k",
|
|
59
|
-
icon: /* @__PURE__ */ T(l, { size: 24 }),
|
|
60
|
-
packageManager: "npm",
|
|
61
|
-
installCommand: "npm install @burdenoff/react",
|
|
62
|
-
docsUrl: "https://docs.burdenoff.com/sdks/react",
|
|
63
|
-
githubUrl: "https://github.com/burdenoff/sdk-react",
|
|
64
|
-
isOfficial: !0
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
id: "sdk-ruby",
|
|
68
|
-
name: "Ruby SDK",
|
|
69
|
-
language: "Ruby",
|
|
70
|
-
description: "Community SDK for Ruby on Rails applications",
|
|
71
|
-
version: "1.2.0",
|
|
72
|
-
downloads: "12k",
|
|
73
|
-
icon: /* @__PURE__ */ T(m, { size: 24 }),
|
|
74
|
-
packageManager: "gem",
|
|
75
|
-
installCommand: "gem install burdenoff",
|
|
76
|
-
docsUrl: "https://docs.burdenoff.com/sdks/ruby",
|
|
77
|
-
githubUrl: "https://github.com/burdenoff/sdk-ruby",
|
|
78
|
-
isOfficial: !1
|
|
32
|
+
id: "webhooks",
|
|
33
|
+
name: "Webhooks",
|
|
34
|
+
description: "Receive real-time platform events in your own services via webhooks.",
|
|
35
|
+
icon: /* @__PURE__ */ S(x, { size: 24 }),
|
|
36
|
+
url: `${w}/build/webhooks`
|
|
79
37
|
}
|
|
80
|
-
],
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
url: "https://docs.burdenoff.com/cli"
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
id: "vscode",
|
|
91
|
-
name: "VS Code Extension",
|
|
92
|
-
description: "IntelliSense, snippets, and debugging for Burdenoff development",
|
|
93
|
-
icon: /* @__PURE__ */ T(v, { size: 24 }),
|
|
94
|
-
type: "extension",
|
|
95
|
-
url: "https://marketplace.visualstudio.com/items?itemName=burdenoff.burdenoff-vscode",
|
|
96
|
-
isNew: !0
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: "graphql-playground",
|
|
100
|
-
name: "GraphQL Playground",
|
|
101
|
-
description: "Interactive GraphQL IDE for exploring and testing the API",
|
|
102
|
-
icon: /* @__PURE__ */ T(g, { size: 24 }),
|
|
103
|
-
type: "utility",
|
|
104
|
-
url: "https://api.burdenoff.com/graphql"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
id: "postman",
|
|
108
|
-
name: "Postman Collection",
|
|
109
|
-
description: "Pre-built Postman collection for REST API testing",
|
|
110
|
-
icon: /* @__PURE__ */ T(_, { size: 24 }),
|
|
111
|
-
type: "utility",
|
|
112
|
-
url: "https://www.postman.com/burdenoff/workspace/burdenoff-api"
|
|
113
|
-
},
|
|
38
|
+
], D = [{
|
|
39
|
+
id: "scheduler",
|
|
40
|
+
name: "Scheduler & Workflows",
|
|
41
|
+
description: "Schedule jobs and orchestrate long-running workflows on the platform.",
|
|
42
|
+
icon: /* @__PURE__ */ S(u, { size: 24 }),
|
|
43
|
+
url: `${w}/extend/scheduler/`
|
|
44
|
+
}], O = [
|
|
114
45
|
{
|
|
115
|
-
id: "
|
|
116
|
-
name: "
|
|
117
|
-
description: "
|
|
118
|
-
icon: /* @__PURE__ */
|
|
119
|
-
|
|
120
|
-
url: "https://developers.burdenoff.com/tools/webhook-tester"
|
|
46
|
+
id: "platform-overview",
|
|
47
|
+
name: "Platform Overview",
|
|
48
|
+
description: "Understand the building blocks of the Burdenoff developer platform.",
|
|
49
|
+
icon: /* @__PURE__ */ S(l, { size: 24 }),
|
|
50
|
+
url: `${w}/platform-overview`
|
|
121
51
|
},
|
|
122
52
|
{
|
|
123
|
-
id: "
|
|
124
|
-
name: "
|
|
125
|
-
description: "
|
|
126
|
-
icon: /* @__PURE__ */
|
|
127
|
-
|
|
128
|
-
url: "https://developers.burdenoff.com/tools/oauth-debugger",
|
|
129
|
-
isNew: !0
|
|
53
|
+
id: "quick-start",
|
|
54
|
+
name: "Quick Start",
|
|
55
|
+
description: "Get up and running with the platform in a few steps.",
|
|
56
|
+
icon: /* @__PURE__ */ S(y, { size: 24 }),
|
|
57
|
+
url: `${w}/quick-start`
|
|
130
58
|
},
|
|
131
59
|
{
|
|
132
|
-
id: "
|
|
133
|
-
name: "
|
|
134
|
-
description: "
|
|
135
|
-
icon: /* @__PURE__ */
|
|
136
|
-
|
|
137
|
-
url: "https://www.figma.com/community/file/burdenoff-ui-kit"
|
|
138
|
-
}
|
|
139
|
-
], k = [
|
|
140
|
-
{
|
|
141
|
-
id: "nextjs-starter",
|
|
142
|
-
name: "Next.js Starter",
|
|
143
|
-
description: "Full-featured Next.js app with OAuth, webhooks, and API integration",
|
|
144
|
-
framework: "Next.js 14",
|
|
145
|
-
icon: /* @__PURE__ */ T(l, { size: 24 }),
|
|
146
|
-
githubUrl: "https://github.com/burdenoff/starter-nextjs",
|
|
147
|
-
demoUrl: "https://starter-nextjs.burdenoff.dev",
|
|
148
|
-
stars: 1240
|
|
60
|
+
id: "authentication",
|
|
61
|
+
name: "Authentication",
|
|
62
|
+
description: "Learn how to authenticate requests and manage actor identity.",
|
|
63
|
+
icon: /* @__PURE__ */ S(h, { size: 24 }),
|
|
64
|
+
url: `${w}/authentication`
|
|
149
65
|
},
|
|
150
66
|
{
|
|
151
|
-
id: "
|
|
152
|
-
name: "
|
|
153
|
-
description: "
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
githubUrl: "https://github.com/burdenoff/starter-express",
|
|
157
|
-
stars: 890
|
|
67
|
+
id: "relationship-graphs",
|
|
68
|
+
name: "Relationship Graphs",
|
|
69
|
+
description: "Model and traverse connected data with relationship graphs.",
|
|
70
|
+
icon: /* @__PURE__ */ S(g, { size: 24 }),
|
|
71
|
+
url: `${w}/concepts/relationship-graphs`
|
|
158
72
|
},
|
|
159
73
|
{
|
|
160
|
-
id: "
|
|
161
|
-
name: "
|
|
162
|
-
description: "
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
githubUrl: "https://github.com/burdenoff/starter-react",
|
|
166
|
-
demoUrl: "https://starter-react.burdenoff.dev",
|
|
167
|
-
stars: 756
|
|
74
|
+
id: "examples",
|
|
75
|
+
name: "Examples",
|
|
76
|
+
description: "Browse worked examples covering common integration tasks.",
|
|
77
|
+
icon: /* @__PURE__ */ S(p, { size: 24 }),
|
|
78
|
+
url: `${w}/examples`
|
|
168
79
|
},
|
|
169
80
|
{
|
|
170
|
-
id: "
|
|
171
|
-
name: "
|
|
172
|
-
description: "
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
githubUrl: "https://github.com/burdenoff/starter-fastapi",
|
|
176
|
-
stars: 534
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
id: "mobile-starter",
|
|
180
|
-
name: "React Native Starter",
|
|
181
|
-
description: "Mobile app template with Burdenoff authentication",
|
|
182
|
-
framework: "React Native",
|
|
183
|
-
icon: /* @__PURE__ */ T(x, { size: 24 }),
|
|
184
|
-
githubUrl: "https://github.com/burdenoff/starter-react-native",
|
|
185
|
-
stars: 423
|
|
81
|
+
id: "faq",
|
|
82
|
+
name: "FAQ",
|
|
83
|
+
description: "Answers to frequently asked developer questions.",
|
|
84
|
+
icon: /* @__PURE__ */ S(m, { size: 24 }),
|
|
85
|
+
url: `${w}/faq`
|
|
186
86
|
}
|
|
187
|
-
], A =
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
title: "Build Your First App",
|
|
191
|
-
description: "Step-by-step guide to creating and publishing your first application",
|
|
192
|
-
difficulty: "beginner",
|
|
193
|
-
duration: "30 min",
|
|
194
|
-
url: "https://docs.burdenoff.com/guides/first-app"
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
id: "oauth-setup",
|
|
198
|
-
title: "Setting Up OAuth 2.0",
|
|
199
|
-
description: "Complete guide to implementing OAuth authentication",
|
|
200
|
-
difficulty: "intermediate",
|
|
201
|
-
duration: "45 min",
|
|
202
|
-
url: "https://docs.burdenoff.com/guides/oauth-setup"
|
|
203
|
-
},
|
|
204
|
-
{
|
|
205
|
-
id: "webhooks-guide",
|
|
206
|
-
title: "Webhook Integration Guide",
|
|
207
|
-
description: "Handle real-time events with webhooks",
|
|
208
|
-
difficulty: "intermediate",
|
|
209
|
-
duration: "40 min",
|
|
210
|
-
url: "https://docs.burdenoff.com/guides/webhooks"
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
id: "multi-tenant",
|
|
214
|
-
title: "Building Multi-Tenant Apps",
|
|
215
|
-
description: "Architecture patterns for multi-tenant applications",
|
|
216
|
-
difficulty: "advanced",
|
|
217
|
-
duration: "60 min",
|
|
218
|
-
url: "https://docs.burdenoff.com/guides/multi-tenant"
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
id: "graphql-subscriptions",
|
|
222
|
-
title: "Real-time with GraphQL Subscriptions",
|
|
223
|
-
description: "Implement real-time features using GraphQL subscriptions",
|
|
224
|
-
difficulty: "advanced",
|
|
225
|
-
duration: "50 min",
|
|
226
|
-
url: "https://docs.burdenoff.com/guides/subscriptions"
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
id: "app-security",
|
|
230
|
-
title: "Security Best Practices",
|
|
231
|
-
description: "Secure your application with industry best practices",
|
|
232
|
-
difficulty: "intermediate",
|
|
233
|
-
duration: "35 min",
|
|
234
|
-
url: "https://docs.burdenoff.com/guides/security"
|
|
235
|
-
}
|
|
236
|
-
], j = ({ sdk: e }) => {
|
|
237
|
-
let [t, n] = o(!1);
|
|
238
|
-
return /* @__PURE__ */ E("div", {
|
|
87
|
+
], k = (e, t) => t ? `${e.name} ${e.description}`.toLowerCase().includes(t.toLowerCase()) : !0, A = ({ sdk: e, copyLabel: t, copiedLabel: n }) => {
|
|
88
|
+
let [o, c] = s(!1);
|
|
89
|
+
return /* @__PURE__ */ C("div", {
|
|
239
90
|
className: "flex flex-col rounded-lg border bg-card p-5",
|
|
240
91
|
children: [
|
|
241
|
-
/* @__PURE__ */
|
|
242
|
-
className: "flex items-
|
|
243
|
-
children: [/* @__PURE__ */
|
|
244
|
-
className: "
|
|
245
|
-
children:
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
children: [/* @__PURE__ */ T("h3", {
|
|
251
|
-
className: "font-semibold",
|
|
252
|
-
children: e.name
|
|
253
|
-
}), e.isOfficial && /* @__PURE__ */ T("span", {
|
|
254
|
-
className: "rounded-full bg-status-info-bg-subtle px-2 py-0.5 text-xs font-medium text-status-info-text",
|
|
255
|
-
children: "Official"
|
|
256
|
-
})]
|
|
257
|
-
}), /* @__PURE__ */ T("p", {
|
|
258
|
-
className: "text-sm text-muted-foreground",
|
|
259
|
-
children: e.language
|
|
260
|
-
})] })]
|
|
261
|
-
}), /* @__PURE__ */ E("span", {
|
|
262
|
-
className: "text-sm text-muted-foreground",
|
|
263
|
-
children: ["v", e.version]
|
|
264
|
-
})]
|
|
92
|
+
/* @__PURE__ */ C("div", {
|
|
93
|
+
className: "flex items-center gap-3",
|
|
94
|
+
children: [/* @__PURE__ */ S("div", {
|
|
95
|
+
className: "rounded-lg bg-primary/10 p-2.5 text-primary",
|
|
96
|
+
children: e.icon
|
|
97
|
+
}), /* @__PURE__ */ S("div", { children: /* @__PURE__ */ S("h3", {
|
|
98
|
+
className: "font-semibold",
|
|
99
|
+
children: e.name
|
|
100
|
+
}) })]
|
|
265
101
|
}),
|
|
266
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ S("p", {
|
|
267
103
|
className: "mt-3 text-sm text-muted-foreground",
|
|
268
104
|
children: e.description
|
|
269
105
|
}),
|
|
270
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ C("div", {
|
|
271
107
|
className: "mt-4 flex items-center gap-2 rounded-md bg-muted/50 p-2",
|
|
272
|
-
children: [/* @__PURE__ */
|
|
108
|
+
children: [/* @__PURE__ */ S("code", {
|
|
273
109
|
className: "flex-1 text-xs",
|
|
274
110
|
children: e.installCommand
|
|
275
|
-
}), /* @__PURE__ */
|
|
111
|
+
}), /* @__PURE__ */ S("button", {
|
|
112
|
+
type: "button",
|
|
276
113
|
onClick: async () => {
|
|
277
|
-
i("light"), await r(e.installCommand) ? (
|
|
114
|
+
i("light"), await r(e.installCommand) ? (c(!0), a("success"), setTimeout(() => c(!1), 2e3)) : a("error");
|
|
278
115
|
},
|
|
279
|
-
className: "rounded px-2 py-1 text-xs hover:bg-muted transition-colors",
|
|
280
|
-
children:
|
|
116
|
+
className: "rounded px-2 py-1 text-xs hover:bg-muted transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",
|
|
117
|
+
children: o ? n : t
|
|
281
118
|
})]
|
|
282
119
|
}),
|
|
283
|
-
/* @__PURE__ */
|
|
284
|
-
className: "mt-4 flex items-center justify-
|
|
285
|
-
children:
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
className: "flex gap-2",
|
|
294
|
-
children: [/* @__PURE__ */ E("a", {
|
|
295
|
-
href: e.docsUrl,
|
|
296
|
-
target: "_blank",
|
|
297
|
-
rel: "noopener noreferrer",
|
|
298
|
-
className: "flex items-center gap-1 text-primary hover:underline",
|
|
299
|
-
children: ["Docs ", /* @__PURE__ */ T(p, { size: 12 })]
|
|
300
|
-
}), /* @__PURE__ */ T("a", {
|
|
301
|
-
href: e.githubUrl,
|
|
302
|
-
target: "_blank",
|
|
303
|
-
rel: "noopener noreferrer",
|
|
304
|
-
"aria-label": `${e.name} on GitHub`,
|
|
305
|
-
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",
|
|
306
|
-
children: /* @__PURE__ */ T(h, {
|
|
307
|
-
size: 14,
|
|
308
|
-
"aria-hidden": "true"
|
|
309
|
-
})
|
|
120
|
+
/* @__PURE__ */ S("div", {
|
|
121
|
+
className: "mt-4 flex items-center justify-end text-sm",
|
|
122
|
+
children: /* @__PURE__ */ C("a", {
|
|
123
|
+
href: e.url,
|
|
124
|
+
target: "_blank",
|
|
125
|
+
rel: "noopener noreferrer",
|
|
126
|
+
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",
|
|
127
|
+
children: ["Docs ", /* @__PURE__ */ S(f, {
|
|
128
|
+
size: 12,
|
|
129
|
+
"aria-hidden": "true"
|
|
310
130
|
})]
|
|
311
|
-
})
|
|
131
|
+
})
|
|
312
132
|
})
|
|
313
133
|
]
|
|
314
134
|
});
|
|
315
|
-
},
|
|
135
|
+
}, j = ({ resource: e }) => /* @__PURE__ */ C("a", {
|
|
316
136
|
href: e.url,
|
|
317
137
|
target: "_blank",
|
|
318
138
|
rel: "noopener noreferrer",
|
|
319
|
-
className: "group flex items-start gap-4 rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md",
|
|
139
|
+
className: "group flex items-start gap-4 rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary",
|
|
320
140
|
children: [
|
|
321
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ S("div", {
|
|
322
142
|
className: "rounded-lg bg-primary/10 p-2.5 text-primary",
|
|
323
143
|
children: e.icon
|
|
324
144
|
}),
|
|
325
|
-
/* @__PURE__ */
|
|
145
|
+
/* @__PURE__ */ C("div", {
|
|
326
146
|
className: "flex-1",
|
|
327
|
-
children: [/* @__PURE__ */
|
|
328
|
-
className: "
|
|
329
|
-
children:
|
|
330
|
-
|
|
331
|
-
children: e.name
|
|
332
|
-
}), e.isNew && /* @__PURE__ */ T("span", {
|
|
333
|
-
className: "rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-xs font-medium text-status-success-text",
|
|
334
|
-
children: "New"
|
|
335
|
-
})]
|
|
336
|
-
}), /* @__PURE__ */ T("p", {
|
|
147
|
+
children: [/* @__PURE__ */ S("h3", {
|
|
148
|
+
className: "font-semibold group-hover:text-primary",
|
|
149
|
+
children: e.name
|
|
150
|
+
}), /* @__PURE__ */ S("p", {
|
|
337
151
|
className: "mt-1 text-sm text-muted-foreground",
|
|
338
152
|
children: e.description
|
|
339
153
|
})]
|
|
340
154
|
}),
|
|
341
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ S(f, {
|
|
342
156
|
size: 16,
|
|
157
|
+
"aria-hidden": "true",
|
|
343
158
|
className: "text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"
|
|
344
159
|
})
|
|
345
160
|
]
|
|
346
|
-
}),
|
|
347
|
-
|
|
348
|
-
children: [
|
|
349
|
-
/* @__PURE__ */ E("div", {
|
|
350
|
-
className: "flex items-start justify-between",
|
|
351
|
-
children: [/* @__PURE__ */ E("div", {
|
|
352
|
-
className: "flex items-center gap-3",
|
|
353
|
-
children: [/* @__PURE__ */ T("div", {
|
|
354
|
-
className: "rounded-lg bg-primary/10 p-2.5 text-primary",
|
|
355
|
-
children: e.icon
|
|
356
|
-
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("h3", {
|
|
357
|
-
className: "font-semibold",
|
|
358
|
-
children: e.name
|
|
359
|
-
}), /* @__PURE__ */ T("p", {
|
|
360
|
-
className: "text-sm text-muted-foreground",
|
|
361
|
-
children: e.framework
|
|
362
|
-
})] })]
|
|
363
|
-
}), /* @__PURE__ */ E("span", {
|
|
364
|
-
className: "flex items-center gap-1 text-sm text-muted-foreground",
|
|
365
|
-
children: [/* @__PURE__ */ T(S, {
|
|
366
|
-
size: 14,
|
|
367
|
-
className: "text-status-warning-text"
|
|
368
|
-
}), e.stars.toLocaleString()]
|
|
369
|
-
})]
|
|
370
|
-
}),
|
|
371
|
-
/* @__PURE__ */ T("p", {
|
|
372
|
-
className: "mt-3 text-sm text-muted-foreground",
|
|
373
|
-
children: e.description
|
|
374
|
-
}),
|
|
375
|
-
/* @__PURE__ */ E("div", {
|
|
376
|
-
className: "mt-4 flex gap-2",
|
|
377
|
-
children: [/* @__PURE__ */ E("a", {
|
|
378
|
-
href: e.githubUrl,
|
|
379
|
-
target: "_blank",
|
|
380
|
-
rel: "noopener noreferrer",
|
|
381
|
-
className: "flex flex-1 items-center justify-center gap-2 rounded-md border bg-background px-3 py-2 text-sm font-medium hover:bg-accent transition-colors",
|
|
382
|
-
children: [/* @__PURE__ */ T(h, { size: 16 }), "View on GitHub"]
|
|
383
|
-
}), e.demoUrl && /* @__PURE__ */ E("a", {
|
|
384
|
-
href: e.demoUrl,
|
|
385
|
-
target: "_blank",
|
|
386
|
-
rel: "noopener noreferrer",
|
|
387
|
-
className: "flex items-center justify-center gap-2 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors",
|
|
388
|
-
children: [/* @__PURE__ */ T(g, { size: 16 }), "Demo"]
|
|
389
|
-
})]
|
|
390
|
-
})
|
|
391
|
-
]
|
|
392
|
-
}), P = ({ guide: t }) => /* @__PURE__ */ E("a", {
|
|
393
|
-
href: t.url,
|
|
394
|
-
target: "_blank",
|
|
395
|
-
rel: "noopener noreferrer",
|
|
396
|
-
className: "group flex items-center gap-4 rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md",
|
|
397
|
-
children: [
|
|
398
|
-
/* @__PURE__ */ T("div", {
|
|
399
|
-
className: "rounded-lg bg-primary/10 p-2.5 text-primary",
|
|
400
|
-
children: /* @__PURE__ */ T(c, { size: 20 })
|
|
401
|
-
}),
|
|
402
|
-
/* @__PURE__ */ E("div", {
|
|
403
|
-
className: "flex-1",
|
|
404
|
-
children: [
|
|
405
|
-
/* @__PURE__ */ T("h3", {
|
|
406
|
-
className: "font-semibold group-hover:text-primary",
|
|
407
|
-
children: t.title
|
|
408
|
-
}),
|
|
409
|
-
/* @__PURE__ */ T("p", {
|
|
410
|
-
className: "mt-1 text-sm text-muted-foreground",
|
|
411
|
-
children: t.description
|
|
412
|
-
}),
|
|
413
|
-
/* @__PURE__ */ E("div", {
|
|
414
|
-
className: "mt-2 flex items-center gap-3",
|
|
415
|
-
children: [/* @__PURE__ */ T("span", {
|
|
416
|
-
className: e("rounded-full px-2 py-0.5 text-xs font-medium capitalize", {
|
|
417
|
-
beginner: "bg-status-success-bg-subtle text-status-success-text",
|
|
418
|
-
intermediate: "bg-status-warning-bg-subtle text-status-warning-text",
|
|
419
|
-
advanced: "bg-status-error-bg-subtle text-status-error-text"
|
|
420
|
-
}[t.difficulty]),
|
|
421
|
-
children: t.difficulty
|
|
422
|
-
}), /* @__PURE__ */ T("span", {
|
|
423
|
-
className: "text-xs text-muted-foreground",
|
|
424
|
-
children: t.duration
|
|
425
|
-
})]
|
|
426
|
-
})
|
|
427
|
-
]
|
|
428
|
-
}),
|
|
429
|
-
/* @__PURE__ */ T(p, {
|
|
430
|
-
size: 16,
|
|
431
|
-
className: "text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100"
|
|
432
|
-
})
|
|
433
|
-
]
|
|
434
|
-
}), F = () => {
|
|
435
|
-
let { t: r } = s(), i = (e, t) => {
|
|
161
|
+
}), M = () => {
|
|
162
|
+
let { t: r } = c(), i = (e, t) => {
|
|
436
163
|
let n = r(e);
|
|
437
164
|
return n === e ? t : n;
|
|
438
|
-
}, [a,
|
|
439
|
-
return /* @__PURE__ */
|
|
165
|
+
}, [a, l] = s(""), [u, d] = s("all"), f = u === "all" || u === "build", p = u === "all" || u === "learn", m = o(() => f && k(T, a), [f, a]), h = o(() => f ? E.filter((e) => k(e, a)) : [], [f, a]), g = o(() => f ? D.filter((e) => k(e, a)) : [], [f, a]), _ = o(() => p ? O.filter((e) => k(e, a)) : [], [p, a]), v = m || h.length > 0 || g.length > 0 || _.length > 0;
|
|
166
|
+
return /* @__PURE__ */ C(t, {
|
|
440
167
|
title: i("devportal.developerResources", "Developer Resources"),
|
|
441
|
-
description: i("devportal.resourcesDescription", "
|
|
168
|
+
description: i("devportal.resourcesDescription", "Documentation for building, extending, and learning the Burdenoff platform"),
|
|
442
169
|
children: [
|
|
443
|
-
/* @__PURE__ */
|
|
170
|
+
/* @__PURE__ */ C("div", {
|
|
444
171
|
role: "status",
|
|
445
172
|
className: "mb-6 rounded-lg border border-status-warning-border bg-status-warning-bg p-4 text-sm text-status-warning-text",
|
|
446
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ S("strong", {
|
|
447
174
|
className: "font-semibold",
|
|
448
175
|
children: i("devportal.resources.comingSoon.title", "Coming soon")
|
|
449
|
-
}), /* @__PURE__ */
|
|
176
|
+
}), /* @__PURE__ */ S("span", {
|
|
450
177
|
className: "ml-2",
|
|
451
|
-
children: i("devportal.resources.comingSoon.description", "An in-product resources hub is on the way. For now
|
|
178
|
+
children: i("devportal.resources.comingSoon.description", "An in-product resources hub is on the way. For now, these cards link to the official Burdenoff developer documentation.")
|
|
452
179
|
})]
|
|
453
180
|
}),
|
|
454
|
-
/* @__PURE__ */
|
|
181
|
+
/* @__PURE__ */ C("div", {
|
|
455
182
|
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
456
|
-
children: [/* @__PURE__ */
|
|
183
|
+
children: [/* @__PURE__ */ C("div", {
|
|
457
184
|
className: "relative flex-1 max-w-md",
|
|
458
|
-
children: [/* @__PURE__ */
|
|
185
|
+
children: [/* @__PURE__ */ S(b, {
|
|
459
186
|
size: 16,
|
|
187
|
+
"aria-hidden": "true",
|
|
460
188
|
className: "absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground"
|
|
461
|
-
}), /* @__PURE__ */
|
|
189
|
+
}), /* @__PURE__ */ S("input", {
|
|
462
190
|
type: "text",
|
|
191
|
+
"aria-label": i("devportal.searchResources", "Search resources..."),
|
|
463
192
|
placeholder: i("devportal.searchResources", "Search resources..."),
|
|
464
193
|
value: a,
|
|
465
|
-
onChange: (e) =>
|
|
194
|
+
onChange: (e) => l(e.target.value),
|
|
466
195
|
className: "w-full rounded-md border bg-background pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary"
|
|
467
196
|
})]
|
|
468
|
-
}), /* @__PURE__ */
|
|
197
|
+
}), /* @__PURE__ */ S("div", {
|
|
198
|
+
role: "group",
|
|
199
|
+
"aria-label": i("devportal.filterResources", "Filter resources"),
|
|
469
200
|
className: "flex items-center gap-1 rounded-md border p-1",
|
|
470
201
|
children: [
|
|
471
202
|
{
|
|
@@ -473,64 +204,66 @@ var D = [
|
|
|
473
204
|
label: i("devportal.filterAll", "All")
|
|
474
205
|
},
|
|
475
206
|
{
|
|
476
|
-
id: "
|
|
477
|
-
label: i("devportal.
|
|
478
|
-
},
|
|
479
|
-
{
|
|
480
|
-
id: "tools",
|
|
481
|
-
label: i("devportal.filterTools", "Tools")
|
|
207
|
+
id: "build",
|
|
208
|
+
label: i("devportal.filterBuild", "Build")
|
|
482
209
|
},
|
|
483
210
|
{
|
|
484
|
-
id: "
|
|
485
|
-
label: i("devportal.
|
|
486
|
-
},
|
|
487
|
-
{
|
|
488
|
-
id: "guides",
|
|
489
|
-
label: i("devportal.filterGuides", "Guides")
|
|
211
|
+
id: "learn",
|
|
212
|
+
label: i("devportal.filterLearn", "Learn")
|
|
490
213
|
}
|
|
491
|
-
].map((t) => /* @__PURE__ */
|
|
492
|
-
|
|
493
|
-
|
|
214
|
+
].map((t) => /* @__PURE__ */ S("button", {
|
|
215
|
+
type: "button",
|
|
216
|
+
"aria-pressed": u === t.id,
|
|
217
|
+
onClick: () => d(t.id),
|
|
218
|
+
className: e("rounded px-3 py-1.5 text-sm font-medium transition-colors", u === t.id ? "bg-primary text-primary-foreground" : "hover:bg-muted"),
|
|
494
219
|
children: t.label
|
|
495
220
|
}, t.id))
|
|
496
221
|
})]
|
|
497
222
|
}),
|
|
498
|
-
|
|
499
|
-
title: i("devportal.
|
|
500
|
-
description: i("devportal.
|
|
501
|
-
children: /* @__PURE__ */
|
|
223
|
+
m && /* @__PURE__ */ S(n, {
|
|
224
|
+
title: i("devportal.sdks", "SDKs"),
|
|
225
|
+
description: i("devportal.sdksDescription", "Client libraries for building on the platform"),
|
|
226
|
+
children: /* @__PURE__ */ S("div", {
|
|
502
227
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
503
|
-
children:
|
|
228
|
+
children: /* @__PURE__ */ S(A, {
|
|
229
|
+
sdk: T,
|
|
230
|
+
copyLabel: i("devportal.copy", "Copy"),
|
|
231
|
+
copiedLabel: i("devportal.copied", "Copied!")
|
|
232
|
+
})
|
|
504
233
|
})
|
|
505
234
|
}),
|
|
506
|
-
|
|
507
|
-
title: i("devportal.
|
|
508
|
-
description: i("devportal.
|
|
509
|
-
children: /* @__PURE__ */
|
|
235
|
+
h.length > 0 && /* @__PURE__ */ S(n, {
|
|
236
|
+
title: i("devportal.build", "Build"),
|
|
237
|
+
description: i("devportal.buildDescription", "APIs and integration surfaces"),
|
|
238
|
+
children: /* @__PURE__ */ S("div", {
|
|
510
239
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
511
|
-
children:
|
|
240
|
+
children: h.map((e) => /* @__PURE__ */ S(j, { resource: e }, e.id))
|
|
512
241
|
})
|
|
513
242
|
}),
|
|
514
|
-
|
|
515
|
-
title: i("devportal.
|
|
516
|
-
description: i("devportal.
|
|
517
|
-
children: /* @__PURE__ */
|
|
243
|
+
g.length > 0 && /* @__PURE__ */ S(n, {
|
|
244
|
+
title: i("devportal.extend", "Extend"),
|
|
245
|
+
description: i("devportal.extendDescription", "Schedule jobs and orchestrate workflows"),
|
|
246
|
+
children: /* @__PURE__ */ S("div", {
|
|
518
247
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
519
|
-
children:
|
|
248
|
+
children: g.map((e) => /* @__PURE__ */ S(j, { resource: e }, e.id))
|
|
520
249
|
})
|
|
521
250
|
}),
|
|
522
|
-
|
|
523
|
-
title: i("devportal.
|
|
524
|
-
description: i("devportal.
|
|
525
|
-
children: /* @__PURE__ */
|
|
526
|
-
className: "grid gap-4 lg:grid-cols-
|
|
527
|
-
children:
|
|
251
|
+
_.length > 0 && /* @__PURE__ */ S(n, {
|
|
252
|
+
title: i("devportal.learn", "Learn"),
|
|
253
|
+
description: i("devportal.learnDescription", "Guides and concepts to get you started"),
|
|
254
|
+
children: /* @__PURE__ */ S("div", {
|
|
255
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
256
|
+
children: _.map((e) => /* @__PURE__ */ S(j, { resource: e }, e.id))
|
|
528
257
|
})
|
|
258
|
+
}),
|
|
259
|
+
!v && /* @__PURE__ */ S("div", {
|
|
260
|
+
className: "mt-8 rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground",
|
|
261
|
+
children: i("devportal.noResourcesFound", "No resources match your search.")
|
|
529
262
|
})
|
|
530
263
|
]
|
|
531
264
|
});
|
|
532
265
|
};
|
|
533
266
|
//#endregion
|
|
534
|
-
export {
|
|
267
|
+
export { M as ResourcesPage };
|
|
535
268
|
|
|
536
269
|
//# sourceMappingURL=ResourcesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourcesPage.js","names":[],"sources":["../../../src/devportal/pages/ResourcesPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport {\n Terminal,\n FileCode,\n Download,\n ExternalLink,\n Github,\n Code2,\n BookOpen,\n Wrench,\n Cpu,\n Boxes,\n Globe,\n Smartphone,\n Monitor,\n Layers,\n Palette,\n Search,\n Star,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { cn } from \"../utils/cn\";\nimport {\n nativeCopyText,\n nativeImpact,\n nativeNotify,\n} from \"../../utils/nativeBridge\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface SDK {\n id: string;\n name: string;\n language: string;\n description: string;\n version: string;\n downloads: string;\n icon: React.ReactNode;\n packageManager: string;\n installCommand: string;\n docsUrl: string;\n githubUrl: string;\n isOfficial: boolean;\n}\n\ninterface Tool {\n id: string;\n name: string;\n description: string;\n icon: React.ReactNode;\n type: \"cli\" | \"extension\" | \"library\" | \"utility\";\n url: string;\n isNew?: boolean;\n}\n\ninterface Starter {\n id: string;\n name: string;\n description: string;\n framework: string;\n icon: React.ReactNode;\n githubUrl: string;\n demoUrl?: string;\n stars: number;\n}\n\ninterface Guide {\n id: string;\n title: string;\n description: string;\n difficulty: \"beginner\" | \"intermediate\" | \"advanced\";\n duration: string;\n url: string;\n}\n\ntype ResourceCategory = \"all\" | \"sdks\" | \"tools\" | \"starters\" | \"guides\";\n\n// =============================================================================\n// DATA\n// =============================================================================\n\nconst sdks: SDK[] = [\n {\n id: \"sdk-node\",\n name: \"Node.js SDK\",\n language: \"TypeScript/JavaScript\",\n description:\n \"Official SDK for Node.js applications with TypeScript support\",\n version: \"2.4.1\",\n downloads: \"125k\",\n icon: <Code2 size={24} />,\n packageManager: \"npm\",\n installCommand: \"npm install @burdenoff/sdk-node\",\n docsUrl: \"https://docs.burdenoff.com/sdks/node\",\n githubUrl: \"https://github.com/burdenoff/sdk-node\",\n isOfficial: true,\n },\n {\n id: \"sdk-python\",\n name: \"Python SDK\",\n language: \"Python\",\n description: \"Official SDK for Python applications with async support\",\n version: \"1.8.0\",\n downloads: \"89k\",\n icon: <FileCode size={24} />,\n packageManager: \"pip\",\n installCommand: \"pip install burdenoff-sdk\",\n docsUrl: \"https://docs.burdenoff.com/sdks/python\",\n githubUrl: \"https://github.com/burdenoff/sdk-python\",\n isOfficial: true,\n },\n {\n id: \"sdk-go\",\n name: \"Go SDK\",\n language: \"Go\",\n description: \"Official SDK for Go applications\",\n version: \"1.5.2\",\n downloads: \"45k\",\n icon: <Cpu size={24} />,\n packageManager: \"go\",\n installCommand: \"go get github.com/burdenoff/sdk-go\",\n docsUrl: \"https://docs.burdenoff.com/sdks/go\",\n githubUrl: \"https://github.com/burdenoff/sdk-go\",\n isOfficial: true,\n },\n {\n id: \"sdk-react\",\n name: \"React SDK\",\n language: \"TypeScript/React\",\n description: \"Hooks and components for React applications\",\n version: \"3.1.0\",\n downloads: \"78k\",\n icon: <Boxes size={24} />,\n packageManager: \"npm\",\n installCommand: \"npm install @burdenoff/react\",\n docsUrl: \"https://docs.burdenoff.com/sdks/react\",\n githubUrl: \"https://github.com/burdenoff/sdk-react\",\n isOfficial: true,\n },\n {\n id: \"sdk-ruby\",\n name: \"Ruby SDK\",\n language: \"Ruby\",\n description: \"Community SDK for Ruby on Rails applications\",\n version: \"1.2.0\",\n downloads: \"12k\",\n icon: <FileCode size={24} />,\n packageManager: \"gem\",\n installCommand: \"gem install burdenoff\",\n docsUrl: \"https://docs.burdenoff.com/sdks/ruby\",\n githubUrl: \"https://github.com/burdenoff/sdk-ruby\",\n isOfficial: false,\n },\n];\n\nconst tools: Tool[] = [\n {\n id: \"cli\",\n name: \"Burdenoff CLI\",\n description:\n \"Command-line tool for managing apps, deployments, and testing\",\n icon: <Terminal size={24} />,\n type: \"cli\",\n url: \"https://docs.burdenoff.com/cli\",\n },\n {\n id: \"vscode\",\n name: \"VS Code Extension\",\n description:\n \"IntelliSense, snippets, and debugging for Burdenoff development\",\n icon: <Monitor size={24} />,\n type: \"extension\",\n url: \"https://marketplace.visualstudio.com/items?itemName=burdenoff.burdenoff-vscode\",\n isNew: true,\n },\n {\n id: \"graphql-playground\",\n name: \"GraphQL Playground\",\n description: \"Interactive GraphQL IDE for exploring and testing the API\",\n icon: <Globe size={24} />,\n type: \"utility\",\n url: \"https://api.burdenoff.com/graphql\",\n },\n {\n id: \"postman\",\n name: \"Postman Collection\",\n description: \"Pre-built Postman collection for REST API testing\",\n icon: <Layers size={24} />,\n type: \"utility\",\n url: \"https://www.postman.com/burdenoff/workspace/burdenoff-api\",\n },\n {\n id: \"webhook-tester\",\n name: \"Webhook Tester\",\n description: \"Tool for testing and debugging webhook integrations\",\n icon: <Wrench size={24} />,\n type: \"utility\",\n url: \"https://developers.burdenoff.com/tools/webhook-tester\",\n },\n {\n id: \"oauth-debugger\",\n name: \"OAuth Debugger\",\n description: \"Debug OAuth flows and inspect tokens\",\n icon: <Wrench size={24} />,\n type: \"utility\",\n url: \"https://developers.burdenoff.com/tools/oauth-debugger\",\n isNew: true,\n },\n {\n id: \"ui-kit\",\n name: \"UI Component Kit\",\n description: \"Figma design kit matching Burdenoff platform UI\",\n icon: <Palette size={24} />,\n type: \"library\",\n url: \"https://www.figma.com/community/file/burdenoff-ui-kit\",\n },\n];\n\nconst starters: Starter[] = [\n {\n id: \"nextjs-starter\",\n name: \"Next.js Starter\",\n description:\n \"Full-featured Next.js app with OAuth, webhooks, and API integration\",\n framework: \"Next.js 14\",\n icon: <Boxes size={24} />,\n githubUrl: \"https://github.com/burdenoff/starter-nextjs\",\n demoUrl: \"https://starter-nextjs.burdenoff.dev\",\n stars: 1240,\n },\n {\n id: \"express-starter\",\n name: \"Express.js Starter\",\n description:\n \"Backend starter with Express, TypeScript, and webhook handling\",\n framework: \"Express.js\",\n icon: <Code2 size={24} />,\n githubUrl: \"https://github.com/burdenoff/starter-express\",\n stars: 890,\n },\n {\n id: \"react-starter\",\n name: \"React Dashboard\",\n description: \"React dashboard template with Burdenoff SDK integration\",\n framework: \"React + Vite\",\n icon: <Monitor size={24} />,\n githubUrl: \"https://github.com/burdenoff/starter-react\",\n demoUrl: \"https://starter-react.burdenoff.dev\",\n stars: 756,\n },\n {\n id: \"python-starter\",\n name: \"FastAPI Starter\",\n description: \"Python FastAPI backend with async Burdenoff SDK\",\n framework: \"FastAPI\",\n icon: <FileCode size={24} />,\n githubUrl: \"https://github.com/burdenoff/starter-fastapi\",\n stars: 534,\n },\n {\n id: \"mobile-starter\",\n name: \"React Native Starter\",\n description: \"Mobile app template with Burdenoff authentication\",\n framework: \"React Native\",\n icon: <Smartphone size={24} />,\n githubUrl: \"https://github.com/burdenoff/starter-react-native\",\n stars: 423,\n },\n];\n\nconst guides: Guide[] = [\n {\n id: \"first-app\",\n title: \"Build Your First App\",\n description:\n \"Step-by-step guide to creating and publishing your first application\",\n difficulty: \"beginner\",\n duration: \"30 min\",\n url: \"https://docs.burdenoff.com/guides/first-app\",\n },\n {\n id: \"oauth-setup\",\n title: \"Setting Up OAuth 2.0\",\n description: \"Complete guide to implementing OAuth authentication\",\n difficulty: \"intermediate\",\n duration: \"45 min\",\n url: \"https://docs.burdenoff.com/guides/oauth-setup\",\n },\n {\n id: \"webhooks-guide\",\n title: \"Webhook Integration Guide\",\n description: \"Handle real-time events with webhooks\",\n difficulty: \"intermediate\",\n duration: \"40 min\",\n url: \"https://docs.burdenoff.com/guides/webhooks\",\n },\n {\n id: \"multi-tenant\",\n title: \"Building Multi-Tenant Apps\",\n description: \"Architecture patterns for multi-tenant applications\",\n difficulty: \"advanced\",\n duration: \"60 min\",\n url: \"https://docs.burdenoff.com/guides/multi-tenant\",\n },\n {\n id: \"graphql-subscriptions\",\n title: \"Real-time with GraphQL Subscriptions\",\n description: \"Implement real-time features using GraphQL subscriptions\",\n difficulty: \"advanced\",\n duration: \"50 min\",\n url: \"https://docs.burdenoff.com/guides/subscriptions\",\n },\n {\n id: \"app-security\",\n title: \"Security Best Practices\",\n description: \"Secure your application with industry best practices\",\n difficulty: \"intermediate\",\n duration: \"35 min\",\n url: \"https://docs.burdenoff.com/guides/security\",\n },\n];\n\n// =============================================================================\n// COMPONENTS\n// =============================================================================\n\nconst SDKCard: FC<{ sdk: SDK }> = ({ sdk }) => {\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-lg border bg-card p-5\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-primary/10 p-2.5 text-primary\">\n {sdk.icon}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold\">{sdk.name}</h3>\n {sdk.isOfficial && (\n <span className=\"rounded-full bg-status-info-bg-subtle px-2 py-0.5 text-xs font-medium text-status-info-text\">\n Official\n </span>\n )}\n </div>\n <p className=\"text-sm text-muted-foreground\">{sdk.language}</p>\n </div>\n </div>\n <span className=\"text-sm text-muted-foreground\">v{sdk.version}</span>\n </div>\n\n <p className=\"mt-3 text-sm text-muted-foreground\">{sdk.description}</p>\n\n <div className=\"mt-4 flex items-center gap-2 rounded-md bg-muted/50 p-2\">\n <code className=\"flex-1 text-xs\">{sdk.installCommand}</code>\n <button\n onClick={handleCopy}\n className=\"rounded px-2 py-1 text-xs hover:bg-muted transition-colors\"\n >\n {copied ? \"Copied!\" : \"Copy\"}\n </button>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between text-sm\">\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Download size={14} />\n {sdk.downloads} downloads\n </span>\n <div className=\"flex gap-2\">\n <a\n href={sdk.docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 text-primary hover:underline\"\n >\n Docs <ExternalLink size={12} />\n </a>\n <a\n href={sdk.githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`${sdk.name} on GitHub`}\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 <Github size={14} aria-hidden=\"true\" />\n </a>\n </div>\n </div>\n </div>\n );\n};\n\nconst ToolCard: FC<{ tool: Tool }> = ({ tool }) => (\n <a\n href={tool.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"group flex items-start gap-4 rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md\"\n >\n <div className=\"rounded-lg bg-primary/10 p-2.5 text-primary\">\n {tool.icon}\n </div>\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold group-hover:text-primary\">{tool.name}</h3>\n {tool.isNew && (\n <span className=\"rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-xs font-medium text-status-success-text\">\n New\n </span>\n )}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">{tool.description}</p>\n </div>\n <ExternalLink\n size={16}\n className=\"text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\"\n />\n </a>\n);\n\nconst StarterCard: FC<{ starter: Starter }> = ({ starter }) => (\n <div className=\"flex flex-col rounded-lg border bg-card p-5\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-primary/10 p-2.5 text-primary\">\n {starter.icon}\n </div>\n <div>\n <h3 className=\"font-semibold\">{starter.name}</h3>\n <p className=\"text-sm text-muted-foreground\">{starter.framework}</p>\n </div>\n </div>\n <span className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <Star size={14} className=\"text-status-warning-text\" />\n {starter.stars.toLocaleString()}\n </span>\n </div>\n\n <p className=\"mt-3 text-sm text-muted-foreground\">{starter.description}</p>\n\n <div className=\"mt-4 flex gap-2\">\n <a\n href={starter.githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex flex-1 items-center justify-center gap-2 rounded-md border bg-background px-3 py-2 text-sm font-medium hover:bg-accent transition-colors\"\n >\n <Github size={16} />\n View on GitHub\n </a>\n {starter.demoUrl && (\n <a\n href={starter.demoUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center justify-center gap-2 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n <Globe size={16} />\n Demo\n </a>\n )}\n </div>\n </div>\n);\n\nconst GuideCard: FC<{ guide: Guide }> = ({ guide }) => {\n const difficultyColors = {\n beginner: \"bg-status-success-bg-subtle text-status-success-text\",\n intermediate: \"bg-status-warning-bg-subtle text-status-warning-text\",\n advanced: \"bg-status-error-bg-subtle text-status-error-text\",\n };\n\n return (\n <a\n href={guide.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"group flex items-center gap-4 rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md\"\n >\n <div className=\"rounded-lg bg-primary/10 p-2.5 text-primary\">\n <BookOpen size={20} />\n </div>\n <div className=\"flex-1\">\n <h3 className=\"font-semibold group-hover:text-primary\">\n {guide.title}\n </h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {guide.description}\n </p>\n <div className=\"mt-2 flex items-center gap-3\">\n <span\n className={cn(\n \"rounded-full px-2 py-0.5 text-xs font-medium capitalize\",\n difficultyColors[guide.difficulty],\n )}\n >\n {guide.difficulty}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {guide.duration}\n </span>\n </div>\n </div>\n <ExternalLink\n size={16}\n className=\"text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\"\n />\n </a>\n );\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 return (\n <PageLayout\n title={tr(\"devportal.developerResources\", \"Developer Resources\")}\n description={tr(\n \"devportal.resourcesDescription\",\n \"SDKs, tools, starter templates, and guides to accelerate your development\",\n )}\n >\n {/* Coming-soon banner — Resources is a deferred surface (see\n devportal stability tracker). The cards below are curated external\n links until the in-product CMS 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 we're surfacing the most useful external SDKs, tools, and templates here.\",\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 className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n />\n <input\n type=\"text\"\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-background pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n </div>\n <div className=\"flex items-center gap-1 rounded-md border p-1\">\n {[\n { id: \"all\", label: tr(\"devportal.filterAll\", \"All\") },\n { id: \"sdks\", label: tr(\"devportal.filterSdks\", \"SDKs\") },\n { id: \"tools\", label: tr(\"devportal.filterTools\", \"Tools\") },\n {\n id: \"starters\",\n label: tr(\"devportal.filterStarters\", \"Starters\"),\n },\n { id: \"guides\", label: tr(\"devportal.filterGuides\", \"Guides\") },\n ].map((cat) => (\n <button\n key={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-primary text-primary-foreground\"\n : \"hover:bg-muted\",\n )}\n >\n {cat.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* SDKs */}\n {(category === \"all\" || category === \"sdks\") && (\n <PageSection\n title={tr(\"devportal.officialSdks\", \"Official SDKs\")}\n description={tr(\n \"devportal.officialSdksDescription\",\n \"Client libraries for popular languages\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {sdks.map((sdk) => (\n <SDKCard key={sdk.id} sdk={sdk} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Developer Tools */}\n {(category === \"all\" || category === \"tools\") && (\n <PageSection\n title={tr(\"devportal.developerTools\", \"Developer Tools\")}\n description={tr(\n \"devportal.developerToolsDescription\",\n \"Tools to streamline your development workflow\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {tools.map((tool) => (\n <ToolCard key={tool.id} tool={tool} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Starter Templates */}\n {(category === \"all\" || category === \"starters\") && (\n <PageSection\n title={tr(\"devportal.starterTemplates\", \"Starter Templates\")}\n description={tr(\n \"devportal.starterTemplatesDescription\",\n \"Production-ready templates to kickstart your project\",\n )}\n >\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {starters.map((starter) => (\n <StarterCard key={starter.id} starter={starter} />\n ))}\n </div>\n </PageSection>\n )}\n\n {/* Guides */}\n {(category === \"all\" || category === \"guides\") && (\n <PageSection\n title={tr(\"devportal.stepByStepGuides\", \"Step-by-Step Guides\")}\n description={tr(\n \"devportal.stepByStepGuidesDescription\",\n \"Learn with hands-on tutorials\",\n )}\n >\n <div className=\"grid gap-4 lg:grid-cols-2\">\n {guides.map((guide) => (\n <GuideCard key={guide.id} guide={guide} />\n ))}\n </div>\n </PageSection>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResourcesPage.js","names":[],"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 { PageLayout, PageSection } from \"../components/PageLayout\";\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}/build/sdks`,\n installCommand: \"npm install @burdenoff/sdk-node\",\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-lg border bg-card p-5\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-primary/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-muted-foreground\">{sdk.description}</p>\n\n <div className=\"mt-4 flex items-center gap-2 rounded-md bg-muted/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-muted 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-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\"\n >\n <div className=\"rounded-lg bg-primary/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-muted-foreground\">\n {resource.description}\n </p>\n </div>\n <ExternalLink\n size={16}\n aria-hidden=\"true\"\n className=\"text-muted-foreground 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 >\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-muted-foreground\"\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-background 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-primary text-primary-foreground\"\n : \"hover:bg-muted\",\n )}\n >\n {cat.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* SDKs */}\n {sdkVisible && (\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 )}\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 <div className=\"mt-8 rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground\">\n {tr(\"devportal.noResourcesFound\", \"No resources match your search.\")}\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|