@stigmer/react 0.0.84 → 0.0.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/demo/fixtures.d.ts +4 -0
  2. package/demo/fixtures.d.ts.map +1 -1
  3. package/demo/fixtures.js +4 -0
  4. package/demo/fixtures.js.map +1 -1
  5. package/index.d.ts +4 -2
  6. package/index.d.ts.map +1 -1
  7. package/index.js +3 -1
  8. package/index.js.map +1 -1
  9. package/library/ResourceListView.js +1 -1
  10. package/library/ResourceListView.js.map +1 -1
  11. package/mcp-server/McpServerConnectDialog.d.ts +51 -0
  12. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -0
  13. package/mcp-server/McpServerConnectDialog.js +164 -0
  14. package/mcp-server/McpServerConnectDialog.js.map +1 -0
  15. package/mcp-server/McpServerDetailView.js +2 -2
  16. package/mcp-server/McpServerDetailView.js.map +1 -1
  17. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  18. package/mcp-server/McpServerPicker.js +7 -1
  19. package/mcp-server/McpServerPicker.js.map +1 -1
  20. package/mcp-server/index.d.ts +2 -0
  21. package/mcp-server/index.d.ts.map +1 -1
  22. package/mcp-server/index.js +1 -0
  23. package/mcp-server/index.js.map +1 -1
  24. package/oauth-app/CreateOAuthAppForm.d.ts +41 -0
  25. package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -0
  26. package/oauth-app/CreateOAuthAppForm.js +140 -0
  27. package/oauth-app/CreateOAuthAppForm.js.map +1 -0
  28. package/oauth-app/OAuthAppDetailPanel.d.ts +43 -0
  29. package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -0
  30. package/oauth-app/OAuthAppDetailPanel.js +202 -0
  31. package/oauth-app/OAuthAppDetailPanel.js.map +1 -0
  32. package/oauth-app/OAuthAppListPanel.d.ts +43 -0
  33. package/oauth-app/OAuthAppListPanel.d.ts.map +1 -0
  34. package/oauth-app/OAuthAppListPanel.js +79 -0
  35. package/oauth-app/OAuthAppListPanel.js.map +1 -0
  36. package/oauth-app/index.d.ts +15 -0
  37. package/oauth-app/index.d.ts.map +1 -0
  38. package/oauth-app/index.js +8 -0
  39. package/oauth-app/index.js.map +1 -0
  40. package/oauth-app/useCreateOAuthApp.d.ts +39 -0
  41. package/oauth-app/useCreateOAuthApp.d.ts.map +1 -0
  42. package/oauth-app/useCreateOAuthApp.js +50 -0
  43. package/oauth-app/useCreateOAuthApp.js.map +1 -0
  44. package/oauth-app/useDeleteOAuthApp.d.ts +31 -0
  45. package/oauth-app/useDeleteOAuthApp.d.ts.map +1 -0
  46. package/oauth-app/useDeleteOAuthApp.js +43 -0
  47. package/oauth-app/useDeleteOAuthApp.js.map +1 -0
  48. package/oauth-app/useOAuthAppList.d.ts +32 -0
  49. package/oauth-app/useOAuthAppList.d.ts.map +1 -0
  50. package/oauth-app/useOAuthAppList.js +61 -0
  51. package/oauth-app/useOAuthAppList.js.map +1 -0
  52. package/oauth-app/useUpdateOAuthApp.d.ts +38 -0
  53. package/oauth-app/useUpdateOAuthApp.d.ts.map +1 -0
  54. package/oauth-app/useUpdateOAuthApp.js +49 -0
  55. package/oauth-app/useUpdateOAuthApp.js.map +1 -0
  56. package/package.json +4 -4
  57. package/src/demo/fixtures.ts +8 -0
  58. package/src/index.ts +22 -0
  59. package/src/library/ResourceListView.tsx +8 -8
  60. package/src/mcp-server/McpServerConnectDialog.tsx +527 -0
  61. package/src/mcp-server/McpServerDetailView.tsx +2 -1
  62. package/src/mcp-server/McpServerPicker.tsx +8 -1
  63. package/src/mcp-server/index.ts +3 -0
  64. package/src/oauth-app/CreateOAuthAppForm.tsx +449 -0
  65. package/src/oauth-app/OAuthAppDetailPanel.tsx +671 -0
  66. package/src/oauth-app/OAuthAppListPanel.tsx +237 -0
  67. package/src/oauth-app/index.ts +14 -0
  68. package/src/oauth-app/useCreateOAuthApp.ts +70 -0
  69. package/src/oauth-app/useDeleteOAuthApp.ts +62 -0
  70. package/src/oauth-app/useOAuthAppList.ts +84 -0
  71. package/src/oauth-app/useUpdateOAuthApp.ts +69 -0
  72. package/styles.css +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOAuthAppList.d.ts","sourceRoot":"","sources":["../../src/oauth-app/useOAuthAppList.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mDAAmD,CAAC;AAIlF,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IACxC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,qBAAqB,CA0CvB"}
@@ -0,0 +1,61 @@
1
+ "use client";
2
+ import { useCallback, useEffect, useState } from "react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import { ListOAuthAppsByOrgInputSchema } from "@stigmer/protos/ai/stigmer/iam/oauthapp/v1/io_pb";
5
+ import { useStigmer } from "../hooks";
6
+ import { toError } from "../internal/toError";
7
+ /**
8
+ * Data hook that fetches all {@link OAuthApp} entries for an organization.
9
+ *
10
+ * Returns every OAuthApp whose `metadata.org` matches the input. In
11
+ * practice these are the BYOA OAuth apps created through the "Bring
12
+ * your own app" flow on MCP server detail pages.
13
+ *
14
+ * Pass `null` for `org` to skip fetching (stable no-op). Useful when
15
+ * the active organization has not been resolved yet.
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * const { oauthApps, isLoading, error } = useOAuthAppList(org);
20
+ *
21
+ * if (isLoading) return <Spinner />;
22
+ * oauthApps.map((app) => app.spec?.provider);
23
+ * ```
24
+ */
25
+ export function useOAuthAppList(org) {
26
+ const stigmer = useStigmer();
27
+ const [oauthApps, setOauthApps] = useState([]);
28
+ const [isLoading, setIsLoading] = useState(false);
29
+ const [error, setError] = useState(null);
30
+ const [fetchKey, setFetchKey] = useState(0);
31
+ const refetch = useCallback(() => setFetchKey((k) => k + 1), []);
32
+ useEffect(() => {
33
+ if (!org) {
34
+ setOauthApps([]);
35
+ setIsLoading(false);
36
+ setError(null);
37
+ return;
38
+ }
39
+ const cancelled = { current: false };
40
+ setIsLoading(true);
41
+ setError(null);
42
+ stigmer.oauthapp
43
+ .listByOrg(create(ListOAuthAppsByOrgInputSchema, { org }))
44
+ .then((result) => {
45
+ if (cancelled.current)
46
+ return;
47
+ setOauthApps([...result.entries]);
48
+ setIsLoading(false);
49
+ }, (err) => {
50
+ if (cancelled.current)
51
+ return;
52
+ setError(toError(err));
53
+ setIsLoading(false);
54
+ });
55
+ return () => {
56
+ cancelled.current = true;
57
+ };
58
+ }, [org, stigmer, fetchKey]);
59
+ return { oauthApps, isLoading, error, refetch };
60
+ }
61
+ //# sourceMappingURL=useOAuthAppList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOAuthAppList.js","sourceRoot":"","sources":["../../src/oauth-app/useOAuthAppList.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AAEjG,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAc9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAkB;IAElB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAa,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACrC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,OAAO,CAAC,QAAQ;aACb,SAAS,CAAC,MAAM,CAAC,6BAA6B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;aACzD,IAAI,CACH,CAAC,MAAM,EAAE,EAAE;YACT,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO;YAC9B,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAClC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,SAAS,CAAC,OAAO;gBAAE,OAAO;YAC9B,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CACF,CAAC;QAEJ,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { OAuthAppInput } from "@stigmer/sdk";
2
+ import type { OAuthApp } from "@stigmer/protos/ai/stigmer/iam/oauthapp/v1/api_pb";
3
+ /** Return value of {@link useUpdateOAuthApp}. */
4
+ export interface UseUpdateOAuthAppReturn {
5
+ /** Submit an {@link OAuthAppInput} to update an existing OAuth app. Resolves with the updated resource. */
6
+ readonly update: (input: OAuthAppInput) => Promise<OAuthApp>;
7
+ /** `true` while the update request is in flight. */
8
+ readonly isUpdating: boolean;
9
+ /** Error from the last failed update, or `null` when healthy. */
10
+ readonly error: Error | null;
11
+ /** Reset `error` to `null`. */
12
+ readonly clearError: () => void;
13
+ }
14
+ /**
15
+ * Mutation hook that wraps `oauthapp.update()` with loading and error
16
+ * state.
17
+ *
18
+ * Updates an existing OAuth app. The input must include the `name` and
19
+ * `org` fields to identify the target resource, along with the updated
20
+ * spec fields. Omit `clientSecret` to leave the existing secret
21
+ * unchanged.
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * const { update, isUpdating, error } = useUpdateOAuthApp();
26
+ *
27
+ * await update({
28
+ * name: "My Slack App",
29
+ * org: "acme",
30
+ * provider: "Slack",
31
+ * clientId: "123456.789012",
32
+ * authorizationUrl: "https://slack.com/oauth/v2/authorize",
33
+ * tokenUrl: "https://slack.com/api/oauth.v2.access",
34
+ * });
35
+ * ```
36
+ */
37
+ export declare function useUpdateOAuthApp(): UseUpdateOAuthAppReturn;
38
+ //# sourceMappingURL=useUpdateOAuthApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdateOAuthApp.d.ts","sourceRoot":"","sources":["../../src/oauth-app/useUpdateOAuthApp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mDAAmD,CAAC;AAIlF,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC,2GAA2G;IAC3G,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7D,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,IAAI,uBAAuB,CAyB3D"}
@@ -0,0 +1,49 @@
1
+ "use client";
2
+ import { useCallback, useState } from "react";
3
+ import { useStigmer } from "../hooks";
4
+ import { toError } from "../internal/toError";
5
+ /**
6
+ * Mutation hook that wraps `oauthapp.update()` with loading and error
7
+ * state.
8
+ *
9
+ * Updates an existing OAuth app. The input must include the `name` and
10
+ * `org` fields to identify the target resource, along with the updated
11
+ * spec fields. Omit `clientSecret` to leave the existing secret
12
+ * unchanged.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const { update, isUpdating, error } = useUpdateOAuthApp();
17
+ *
18
+ * await update({
19
+ * name: "My Slack App",
20
+ * org: "acme",
21
+ * provider: "Slack",
22
+ * clientId: "123456.789012",
23
+ * authorizationUrl: "https://slack.com/oauth/v2/authorize",
24
+ * tokenUrl: "https://slack.com/api/oauth.v2.access",
25
+ * });
26
+ * ```
27
+ */
28
+ export function useUpdateOAuthApp() {
29
+ const stigmer = useStigmer();
30
+ const [isUpdating, setIsUpdating] = useState(false);
31
+ const [error, setError] = useState(null);
32
+ const clearError = useCallback(() => setError(null), []);
33
+ const update = useCallback(async (input) => {
34
+ setIsUpdating(true);
35
+ setError(null);
36
+ try {
37
+ return await stigmer.oauthapp.update(input);
38
+ }
39
+ catch (err) {
40
+ setError(toError(err));
41
+ throw err;
42
+ }
43
+ finally {
44
+ setIsUpdating(false);
45
+ }
46
+ }, [stigmer]);
47
+ return { update, isUpdating, error, clearError };
48
+ }
49
+ //# sourceMappingURL=useUpdateOAuthApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdateOAuthApp.js","sourceRoot":"","sources":["../../src/oauth-app/useUpdateOAuthApp.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAc9C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,KAAoB,EAAqB,EAAE;QAChD,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stigmer/react",
3
- "version": "0.0.84",
3
+ "version": "0.0.85",
4
4
  "description": "React provider and client hook for the Stigmer platform SDK",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -35,7 +35,7 @@
35
35
  }
36
36
  },
37
37
  "dependencies": {
38
- "@stigmer/theme": "0.0.84",
38
+ "@stigmer/theme": "0.0.85",
39
39
  "react-markdown": "^10.1.0",
40
40
  "remark-gfm": "^4.0.1",
41
41
  "yaml": "^2.8.2"
@@ -43,8 +43,8 @@
43
43
  "peerDependencies": {
44
44
  "@base-ui/react": "^1.0.0",
45
45
  "@bufbuild/protobuf": "^2.0.0",
46
- "@stigmer/protos": "0.0.84",
47
- "@stigmer/sdk": "0.0.84",
46
+ "@stigmer/protos": "0.0.85",
47
+ "@stigmer/sdk": "0.0.85",
48
48
  "react": "^19.0.0",
49
49
  "react-dom": "^19.0.0"
50
50
  }
@@ -238,6 +238,14 @@ export const fixtures = {
238
238
  /** Hooks: `useUpdateVisibility` (when kind is McpServer) */
239
239
  updateVisibility: (handler: UnaryFixtureHandler): FixtureSpec =>
240
240
  unarySpec(McpServerCommandController, "updateVisibility", handler),
241
+
242
+ /** Hooks: `useOAuthGrantStatus` */
243
+ getOAuthGrantStatus: (handler: UnaryFixtureHandler): FixtureSpec =>
244
+ unarySpec(McpServerQueryController, "getOAuthGrantStatus", handler),
245
+
246
+ /** Hooks: `useOrgOAuthApp` */
247
+ getOrgOAuthApp: (handler: UnaryFixtureHandler): FixtureSpec =>
248
+ unarySpec(McpServerQueryController, "getOrgOAuthApp", handler),
241
249
  },
242
250
 
243
251
  // ---- Environment ----
package/src/index.ts CHANGED
@@ -227,6 +227,7 @@ export {
227
227
  McpServerPicker,
228
228
  McpServerConfigPanel,
229
229
  McpServerDetailView,
230
+ McpServerConnectDialog,
230
231
  McpToolSelector,
231
232
  toServerKey,
232
233
  } from "./mcp-server";
@@ -249,6 +250,7 @@ export type {
249
250
  McpServerCredentialsProps,
250
251
  McpServerOAuthSignInProps,
251
252
  McpServerDetailViewProps,
253
+ McpServerConnectDialogProps,
252
254
  CapabilityTab,
253
255
  McpToolSelectorProps,
254
256
  UseMcpServerConnectReturn,
@@ -446,6 +448,26 @@ export type {
446
448
  ApiKeyCreatedAlertProps,
447
449
  } from "./api-key";
448
450
 
451
+ // OAuth App — data hooks, mutation hooks, and styled components for OAuth app management
452
+ export {
453
+ useOAuthAppList,
454
+ useCreateOAuthApp,
455
+ useUpdateOAuthApp,
456
+ useDeleteOAuthApp,
457
+ OAuthAppListPanel,
458
+ CreateOAuthAppForm,
459
+ OAuthAppDetailPanel,
460
+ } from "./oauth-app";
461
+ export type {
462
+ UseOAuthAppListReturn,
463
+ UseCreateOAuthAppReturn,
464
+ UseUpdateOAuthAppReturn,
465
+ UseDeleteOAuthAppReturn,
466
+ OAuthAppListPanelProps,
467
+ CreateOAuthAppFormProps,
468
+ OAuthAppDetailPanelProps,
469
+ } from "./oauth-app";
470
+
449
471
  // Identity Provider — data hooks, mutation hooks, styled components, presets, and guided wizard for IdP management and SSO discovery
450
472
  export {
451
473
  useIdentityProviderList,
@@ -537,14 +537,9 @@ function DefaultResourceCard({
537
537
  <div className="flex items-start gap-3">
538
538
  <ResourceIcon kind={item.kind} iconUrl={item.iconUrl} />
539
539
  <div className="min-w-0 flex-1">
540
- <div className="flex items-center gap-2">
541
- <span className="truncate text-sm font-semibold text-foreground">
542
- {displayName}
543
- </span>
544
- {item.visibility === ApiResourceVisibility.visibility_public && (
545
- <VisibilityBadge />
546
- )}
547
- </div>
540
+ <span className="line-clamp-2 text-sm font-semibold leading-snug text-foreground">
541
+ {displayName}
542
+ </span>
548
543
  <span className="mt-0.5 block text-xs text-muted-foreground">
549
544
  {item.org}
550
545
  </span>
@@ -556,6 +551,11 @@ function DefaultResourceCard({
556
551
  {item.description}
557
552
  </p>
558
553
  )}
554
+ {item.visibility === ApiResourceVisibility.visibility_public && (
555
+ <div className="mt-auto">
556
+ <VisibilityBadge />
557
+ </div>
558
+ )}
559
559
  </div>
560
560
  );
561
561
  }