@stratum-hq/react 0.1.0

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 (113) hide show
  1. package/dist/components/ConfigEditor.d.ts +5 -0
  2. package/dist/components/ConfigEditor.d.ts.map +1 -0
  3. package/dist/components/ConfigEditor.js +71 -0
  4. package/dist/components/ConfigEditor.js.map +1 -0
  5. package/dist/components/ConfigEditor.stories.d.ts +35 -0
  6. package/dist/components/ConfigEditor.stories.d.ts.map +1 -0
  7. package/dist/components/ConfigEditor.stories.js +73 -0
  8. package/dist/components/ConfigEditor.stories.js.map +1 -0
  9. package/dist/components/PermissionEditor.d.ts +5 -0
  10. package/dist/components/PermissionEditor.d.ts.map +1 -0
  11. package/dist/components/PermissionEditor.js +46 -0
  12. package/dist/components/PermissionEditor.js.map +1 -0
  13. package/dist/components/PermissionEditor.stories.d.ts +34 -0
  14. package/dist/components/PermissionEditor.stories.d.ts.map +1 -0
  15. package/dist/components/PermissionEditor.stories.js +90 -0
  16. package/dist/components/PermissionEditor.stories.js.map +1 -0
  17. package/dist/components/Skeleton.d.ts +14 -0
  18. package/dist/components/Skeleton.d.ts.map +1 -0
  19. package/dist/components/Skeleton.js +25 -0
  20. package/dist/components/Skeleton.js.map +1 -0
  21. package/dist/components/Skeleton.stories.d.ts +46 -0
  22. package/dist/components/Skeleton.stories.d.ts.map +1 -0
  23. package/dist/components/Skeleton.stories.js +125 -0
  24. package/dist/components/Skeleton.stories.js.map +1 -0
  25. package/dist/components/TableSkeleton.d.ts +10 -0
  26. package/dist/components/TableSkeleton.d.ts.map +1 -0
  27. package/dist/components/TableSkeleton.js +6 -0
  28. package/dist/components/TableSkeleton.js.map +1 -0
  29. package/dist/components/TenantSwitcher.d.ts +7 -0
  30. package/dist/components/TenantSwitcher.d.ts.map +1 -0
  31. package/dist/components/TenantSwitcher.js +40 -0
  32. package/dist/components/TenantSwitcher.js.map +1 -0
  33. package/dist/components/TenantSwitcher.stories.d.ts +30 -0
  34. package/dist/components/TenantSwitcher.stories.d.ts.map +1 -0
  35. package/dist/components/TenantSwitcher.stories.js +76 -0
  36. package/dist/components/TenantSwitcher.stories.js.map +1 -0
  37. package/dist/components/TenantTree.d.ts +7 -0
  38. package/dist/components/TenantTree.d.ts.map +1 -0
  39. package/dist/components/TenantTree.js +19 -0
  40. package/dist/components/TenantTree.js.map +1 -0
  41. package/dist/components/TenantTree.stories.d.ts +28 -0
  42. package/dist/components/TenantTree.stories.d.ts.map +1 -0
  43. package/dist/components/TenantTree.stories.js +71 -0
  44. package/dist/components/TenantTree.stories.js.map +1 -0
  45. package/dist/components/Toast.d.ts +18 -0
  46. package/dist/components/Toast.d.ts.map +1 -0
  47. package/dist/components/Toast.js +22 -0
  48. package/dist/components/Toast.js.map +1 -0
  49. package/dist/components/Toast.stories.d.ts +36 -0
  50. package/dist/components/Toast.stories.d.ts.map +1 -0
  51. package/dist/components/Toast.stories.js +105 -0
  52. package/dist/components/Toast.stories.js.map +1 -0
  53. package/dist/components/ToastContainer.d.ts +11 -0
  54. package/dist/components/ToastContainer.d.ts.map +1 -0
  55. package/dist/components/ToastContainer.js +9 -0
  56. package/dist/components/ToastContainer.js.map +1 -0
  57. package/dist/components/headless/ConfigEditor.d.ts +15 -0
  58. package/dist/components/headless/ConfigEditor.d.ts.map +1 -0
  59. package/dist/components/headless/ConfigEditor.js +7 -0
  60. package/dist/components/headless/ConfigEditor.js.map +1 -0
  61. package/dist/components/headless/PermissionEditor.d.ts +15 -0
  62. package/dist/components/headless/PermissionEditor.d.ts.map +1 -0
  63. package/dist/components/headless/PermissionEditor.js +7 -0
  64. package/dist/components/headless/PermissionEditor.js.map +1 -0
  65. package/dist/components/headless/TenantSwitcher.d.ts +39 -0
  66. package/dist/components/headless/TenantSwitcher.d.ts.map +1 -0
  67. package/dist/components/headless/TenantSwitcher.js +61 -0
  68. package/dist/components/headless/TenantSwitcher.js.map +1 -0
  69. package/dist/components/headless/TenantTree.d.ts +21 -0
  70. package/dist/components/headless/TenantTree.d.ts.map +1 -0
  71. package/dist/components/headless/TenantTree.js +22 -0
  72. package/dist/components/headless/TenantTree.js.map +1 -0
  73. package/dist/components/storybook-helpers.d.ts +96 -0
  74. package/dist/components/storybook-helpers.d.ts.map +1 -0
  75. package/dist/components/storybook-helpers.js +473 -0
  76. package/dist/components/storybook-helpers.js.map +1 -0
  77. package/dist/hooks/use-config.d.ts +16 -0
  78. package/dist/hooks/use-config.d.ts.map +1 -0
  79. package/dist/hooks/use-config.js +54 -0
  80. package/dist/hooks/use-config.js.map +1 -0
  81. package/dist/hooks/use-messages.d.ts +11 -0
  82. package/dist/hooks/use-messages.d.ts.map +1 -0
  83. package/dist/hooks/use-messages.js +23 -0
  84. package/dist/hooks/use-messages.js.map +1 -0
  85. package/dist/hooks/use-permissions.d.ts +10 -0
  86. package/dist/hooks/use-permissions.d.ts.map +1 -0
  87. package/dist/hooks/use-permissions.js +48 -0
  88. package/dist/hooks/use-permissions.js.map +1 -0
  89. package/dist/hooks/use-tenant-tree.d.ts +13 -0
  90. package/dist/hooks/use-tenant-tree.d.ts.map +1 -0
  91. package/dist/hooks/use-tenant-tree.js +65 -0
  92. package/dist/hooks/use-tenant-tree.js.map +1 -0
  93. package/dist/hooks/use-tenant.d.ts +23 -0
  94. package/dist/hooks/use-tenant.d.ts.map +1 -0
  95. package/dist/hooks/use-tenant.js +6 -0
  96. package/dist/hooks/use-tenant.js.map +1 -0
  97. package/dist/hooks/use-toast.d.ts +14 -0
  98. package/dist/hooks/use-toast.d.ts.map +1 -0
  99. package/dist/hooks/use-toast.js +46 -0
  100. package/dist/hooks/use-toast.js.map +1 -0
  101. package/dist/i18n.d.ts +57 -0
  102. package/dist/i18n.d.ts.map +1 -0
  103. package/dist/i18n.js +59 -0
  104. package/dist/i18n.js.map +1 -0
  105. package/dist/index.d.ts +38 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +26 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/provider.d.ts +30 -0
  110. package/dist/provider.d.ts.map +1 -0
  111. package/dist/provider.js +82 -0
  112. package/dist/provider.js.map +1 -0
  113. package/package.json +53 -0
@@ -0,0 +1,105 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Toast } from "./Toast.js";
4
+ import { ToastContainer } from "./ToastContainer.js";
5
+ const meta = {
6
+ title: "Components/Toast",
7
+ component: Toast,
8
+ parameters: {
9
+ docs: {
10
+ description: {
11
+ component: "Toast notification for user feedback. Positioned top-right via " +
12
+ "ToastContainer. Success/info/warning auto-dismiss after 4 seconds; " +
13
+ "error toasts persist until manually dismissed. Left border colored " +
14
+ "by semantic type.",
15
+ },
16
+ },
17
+ },
18
+ };
19
+ export default meta;
20
+ /**
21
+ * Success toast — used after saving config, creating a tenant, etc.
22
+ * Auto-dismisses after 4 seconds.
23
+ */
24
+ export const Success = {
25
+ args: {
26
+ message: "Configuration saved successfully for CyberShield MSP",
27
+ type: "success",
28
+ onDismiss: () => console.log("Toast dismissed"),
29
+ autoDismiss: 0, // Disable in Storybook so it stays visible
30
+ },
31
+ decorators: [
32
+ (Story) => (_jsx("div", { style: { padding: "24px", maxWidth: 400 }, children: _jsx(Story, {}) })),
33
+ ],
34
+ };
35
+ /**
36
+ * Error toast — used for API failures, permission errors, etc.
37
+ * Does not auto-dismiss; requires manual close.
38
+ */
39
+ export const Error = {
40
+ args: {
41
+ message: "Failed to update config: Permission denied. This value is locked by Acme Corp.",
42
+ type: "error",
43
+ onDismiss: () => console.log("Toast dismissed"),
44
+ },
45
+ decorators: [
46
+ (Story) => (_jsx("div", { style: { padding: "24px", maxWidth: 400 }, children: _jsx(Story, {}) })),
47
+ ],
48
+ };
49
+ /**
50
+ * Warning toast — used for non-critical issues like approaching
51
+ * rate limits or deprecated config keys.
52
+ */
53
+ export const Warning = {
54
+ args: {
55
+ message: "API rate limit at 90% (900/1000 requests). Consider upgrading the plan.",
56
+ type: "warning",
57
+ onDismiss: () => console.log("Toast dismissed"),
58
+ autoDismiss: 0,
59
+ },
60
+ decorators: [
61
+ (Story) => (_jsx("div", { style: { padding: "24px", maxWidth: 400 }, children: _jsx(Story, {}) })),
62
+ ],
63
+ };
64
+ /**
65
+ * Info toast — used for general notifications like tenant context
66
+ * switches or background operations completing.
67
+ */
68
+ export const Info = {
69
+ args: {
70
+ message: "Switched to tenant: Northwind Security (SCHEMA_PER_TENANT isolation)",
71
+ type: "info",
72
+ onDismiss: () => console.log("Toast dismissed"),
73
+ autoDismiss: 0,
74
+ },
75
+ decorators: [
76
+ (Story) => (_jsx("div", { style: { padding: "24px", maxWidth: 400 }, children: _jsx(Story, {}) })),
77
+ ],
78
+ };
79
+ /**
80
+ * All four toast variants displayed together, matching the top-right
81
+ * stacked layout from the ToastContainer.
82
+ */
83
+ export const AllVariants = {
84
+ render: () => (_jsxs("div", { style: { padding: "24px", maxWidth: 400, display: "flex", flexDirection: "column", gap: "8px" }, children: [_jsx(Toast, { message: "Tenant created: Globex Industries", type: "success", onDismiss: () => { }, autoDismiss: 0 }), _jsx(Toast, { message: "Switched to CyberShield MSP context", type: "info", onDismiss: () => { }, autoDismiss: 0 }), _jsx(Toast, { message: "Config key 'app.legacy_mode' is deprecated", type: "warning", onDismiss: () => { }, autoDismiss: 0 }), _jsx(Toast, { message: "Failed to delete permission: tenant.manage is locked by root", type: "error", onDismiss: () => { } })] })),
85
+ };
86
+ /**
87
+ * Interactive ToastContainer demo. Click buttons to trigger different
88
+ * toast types and see the stacking behavior (max 3 visible).
89
+ */
90
+ export const InteractiveContainer = {
91
+ render: function InteractiveDemo() {
92
+ const [toasts, setToasts] = useState([]);
93
+ let counter = 0;
94
+ const addToast = (message, type) => {
95
+ counter += 1;
96
+ const id = `toast-${counter}-${Date.now()}`;
97
+ setToasts((prev) => [{ id, message, type }, ...prev]);
98
+ };
99
+ const dismiss = (id) => {
100
+ setToasts((prev) => prev.filter((t) => t.id !== id));
101
+ };
102
+ return (_jsxs("div", { style: { padding: "24px" }, children: [_jsxs("div", { style: { display: "flex", gap: "8px", flexWrap: "wrap", marginBottom: "24px" }, children: [_jsx("button", { type: "button", onClick: () => addToast("Config saved for CyberShield MSP", "success"), style: { padding: "8px 16px", borderRadius: "4px", border: "1px solid #059669", background: "#D1FAE5", cursor: "pointer" }, children: "Success Toast" }), _jsx("button", { type: "button", onClick: () => addToast("API error: rate limit exceeded (429)", "error"), style: { padding: "8px 16px", borderRadius: "4px", border: "1px solid #DC2626", background: "#FEE2E2", cursor: "pointer" }, children: "Error Toast" }), _jsx("button", { type: "button", onClick: () => addToast("Permission 'billing.view' expires in 7 days", "warning"), style: { padding: "8px 16px", borderRadius: "4px", border: "1px solid #D97706", background: "#FEF3C7", cursor: "pointer" }, children: "Warning Toast" }), _jsx("button", { type: "button", onClick: () => addToast("Tenant tree refreshed (8 tenants loaded)", "info"), style: { padding: "8px 16px", borderRadius: "4px", border: "1px solid #2563EB", background: "#DBEAFE", cursor: "pointer" }, children: "Info Toast" })] }), _jsxs("p", { style: { color: "#64748B", fontSize: "13px" }, children: ["Active toasts: ", toasts.length, " (max 3 visible)"] }), _jsx(ToastContainer, { toasts: toasts, onDismiss: dismiss, maxVisible: 3 })] }));
103
+ },
104
+ };
105
+ //# sourceMappingURL=Toast.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.stories.js","sourceRoot":"","sources":["../../src/components/Toast.stories.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ToastData } from "./Toast.js";
2
+ export interface ToastContainerProps {
3
+ /** Array of active toasts */
4
+ toasts: ToastData[];
5
+ /** Called with toast ID to dismiss */
6
+ onDismiss: (id: string) => void;
7
+ /** Max visible toasts. Default: 3 */
8
+ maxVisible?: number;
9
+ }
10
+ export declare function ToastContainer({ toasts, onDismiss, maxVisible, }: ToastContainerProps): import("react/jsx-runtime").JSX.Element | null;
11
+ //# sourceMappingURL=ToastContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastContainer.d.ts","sourceRoot":"","sources":["../../src/components/ToastContainer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,sCAAsC;IACtC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,UAAc,GACf,EAAE,mBAAmB,kDAiBrB"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Toast } from "./Toast.js";
3
+ export function ToastContainer({ toasts, onDismiss, maxVisible = 3, }) {
4
+ const visibleToasts = toasts.slice(0, maxVisible);
5
+ if (visibleToasts.length === 0)
6
+ return null;
7
+ return (_jsx("div", { className: "stratum-toast-container", "aria-live": "polite", "aria-label": "Notifications", children: visibleToasts.map((toast) => (_jsx(Toast, { message: toast.message, type: toast.type, onDismiss: () => onDismiss(toast.id) }, toast.id))) }));
8
+ }
9
+ //# sourceMappingURL=ToastContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastContainer.js","sourceRoot":"","sources":["../../src/components/ToastContainer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,UAAU,GAAG,CAAC,GACM;IACpB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAElD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,OAAO,CACL,cAAK,SAAS,EAAC,yBAAyB,eAAW,QAAQ,gBAAY,eAAe,YACnF,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,KAAC,KAAK,IAEJ,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAH/B,KAAK,CAAC,EAAE,CAIb,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import { type ConfigWithInheritance } from "../../hooks/use-config.js";
3
+ export interface HeadlessConfigEditorAPI {
4
+ config: ConfigWithInheritance[];
5
+ loading: boolean;
6
+ error: Error | null;
7
+ setConfigValue: (key: string, value: unknown, locked?: boolean) => Promise<void>;
8
+ deleteConfigValue: (key: string) => Promise<void>;
9
+ refresh: () => Promise<void>;
10
+ }
11
+ export interface HeadlessConfigEditorProps {
12
+ children: (api: HeadlessConfigEditorAPI) => React.ReactNode;
13
+ }
14
+ export declare function HeadlessConfigEditor({ children }: HeadlessConfigEditorProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=ConfigEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigEditor.d.ts","sourceRoot":"","sources":["../../../src/components/headless/ConfigEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAa,KAAK,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,KAAK,CAAC,SAAS,CAAC;CAC7D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAI3E"}
@@ -0,0 +1,7 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useConfig } from "../../hooks/use-config.js";
3
+ export function HeadlessConfigEditor({ children }) {
4
+ const { config, loading, error, setConfigValue, deleteConfigValue, refresh } = useConfig();
5
+ return _jsx(_Fragment, { children: children({ config, loading, error, setConfigValue, deleteConfigValue, refresh }) });
6
+ }
7
+ //# sourceMappingURL=ConfigEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigEditor.js","sourceRoot":"","sources":["../../../src/components/headless/ConfigEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAA8B,MAAM,2BAA2B,CAAC;AAelF,MAAM,UAAU,oBAAoB,CAAC,EAAE,QAAQ,EAA6B;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IAE3F,OAAO,4BAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,GAAI,CAAC;AACjG,CAAC"}
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import type { ResolvedPermission } from "@stratum-hq/core";
3
+ export interface HeadlessPermissionEditorAPI {
4
+ permissions: ResolvedPermission[];
5
+ loading: boolean;
6
+ error: Error | null;
7
+ createPermission: (key: string, value: unknown, mode: string, revocationMode: string) => Promise<void>;
8
+ deletePermission: (policyId: string) => Promise<void>;
9
+ refresh: () => Promise<void>;
10
+ }
11
+ export interface HeadlessPermissionEditorProps {
12
+ children: (api: HeadlessPermissionEditorAPI) => React.ReactNode;
13
+ }
14
+ export declare function HeadlessPermissionEditor({ children }: HeadlessPermissionEditorProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=PermissionEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionEditor.d.ts","sourceRoot":"","sources":["../../../src/components/headless/PermissionEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvG,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,CAAC,GAAG,EAAE,2BAA2B,KAAK,KAAK,CAAC,SAAS,CAAC;CACjE;AAED,wBAAgB,wBAAwB,CAAC,EAAE,QAAQ,EAAE,EAAE,6BAA6B,2CAInF"}
@@ -0,0 +1,7 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { usePermissions } from "../../hooks/use-permissions.js";
3
+ export function HeadlessPermissionEditor({ children }) {
4
+ const { permissions, loading, error, createPermission, deletePermission, refresh } = usePermissions();
5
+ return _jsx(_Fragment, { children: children({ permissions, loading, error, createPermission, deletePermission, refresh }) });
6
+ }
7
+ //# sourceMappingURL=PermissionEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionEditor.js","sourceRoot":"","sources":["../../../src/components/headless/PermissionEditor.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAehE,MAAM,UAAU,wBAAwB,CAAC,EAAE,QAAQ,EAAiC;IAClF,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAEtG,OAAO,4BAAG,QAAQ,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,GAAI,CAAC;AACvG,CAAC"}
@@ -0,0 +1,39 @@
1
+ /// <reference types="react" />
2
+ import type { TenantNode } from "@stratum-hq/core";
3
+ export interface HeadlessTenantSwitcherProps {
4
+ rootId?: string;
5
+ onTenantChange?: (tenantId: string) => void;
6
+ children: (api: HeadlessTenantSwitcherAPI) => React.ReactNode;
7
+ }
8
+ export interface HeadlessTenantSwitcherAPI {
9
+ isOpen: boolean;
10
+ toggle: () => void;
11
+ open: () => void;
12
+ close: () => void;
13
+ search: string;
14
+ setSearch: (value: string) => void;
15
+ items: {
16
+ node: TenantNode;
17
+ depth: number;
18
+ }[];
19
+ selectedId: string | null;
20
+ select: (tenantId: string) => Promise<void>;
21
+ loading: boolean;
22
+ triggerProps: {
23
+ onClick: () => void;
24
+ "aria-haspopup": "listbox";
25
+ "aria-expanded": boolean;
26
+ };
27
+ listProps: {
28
+ role: "listbox";
29
+ };
30
+ getItemProps: (tenantId: string) => {
31
+ role: "option";
32
+ "aria-selected": boolean;
33
+ onClick: () => void;
34
+ onKeyDown: (e: React.KeyboardEvent) => void;
35
+ tabIndex: number;
36
+ };
37
+ }
38
+ export declare function HeadlessTenantSwitcher({ rootId, onTenantChange, children, }: HeadlessTenantSwitcherProps): import("react/jsx-runtime").JSX.Element;
39
+ //# sourceMappingURL=TenantSwitcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantSwitcher.d.ts","sourceRoot":"","sources":["../../../src/components/headless/TenantSwitcher.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;CAC/D;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE;QACZ,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,eAAe,EAAE,SAAS,CAAC;QAC3B,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,SAAS,EAAE;QACT,IAAI,EAAE,SAAS,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK;QAClC,IAAI,EAAE,QAAQ,CAAC;QACf,eAAe,EAAE,OAAO,CAAC;QACzB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;QAC5C,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAgB,sBAAsB,CAAC,EACrC,MAAM,EACN,cAAc,EACd,QAAQ,GACT,EAAE,2BAA2B,2CA8D7B"}
@@ -0,0 +1,61 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo } from "react";
3
+ import { useTenantTree } from "../../hooks/use-tenant-tree.js";
4
+ import { useTenant } from "../../hooks/use-tenant.js";
5
+ export function HeadlessTenantSwitcher({ rootId, onTenantChange, children, }) {
6
+ const { tree, loading } = useTenantTree(rootId);
7
+ const { tenant, switchTenant } = useTenant();
8
+ const [isOpen, setIsOpen] = useState(false);
9
+ const [search, setSearch] = useState("");
10
+ const flatItems = useMemo(() => {
11
+ const result = [];
12
+ function walk(nodes, depth) {
13
+ for (const node of nodes) {
14
+ result.push({ node, depth });
15
+ walk(node.children, depth + 1);
16
+ }
17
+ }
18
+ walk(tree, 0);
19
+ return result;
20
+ }, [tree]);
21
+ const filtered = useMemo(() => {
22
+ if (!search)
23
+ return flatItems;
24
+ const lower = search.toLowerCase();
25
+ return flatItems.filter(({ node }) => node.name.toLowerCase().includes(lower) ||
26
+ node.slug.toLowerCase().includes(lower));
27
+ }, [flatItems, search]);
28
+ const select = async (tenantId) => {
29
+ await switchTenant(tenantId);
30
+ onTenantChange?.(tenantId);
31
+ setIsOpen(false);
32
+ setSearch("");
33
+ };
34
+ const api = {
35
+ isOpen,
36
+ toggle: () => setIsOpen(!isOpen),
37
+ open: () => setIsOpen(true),
38
+ close: () => setIsOpen(false),
39
+ search,
40
+ setSearch,
41
+ items: filtered,
42
+ selectedId: tenant?.id || null,
43
+ select,
44
+ loading,
45
+ triggerProps: {
46
+ onClick: () => setIsOpen(!isOpen),
47
+ "aria-haspopup": "listbox",
48
+ "aria-expanded": isOpen,
49
+ },
50
+ listProps: { role: "listbox" },
51
+ getItemProps: (tenantId) => ({
52
+ role: "option",
53
+ "aria-selected": tenant?.id === tenantId,
54
+ onClick: () => select(tenantId),
55
+ onKeyDown: (e) => e.key === "Enter" && select(tenantId),
56
+ tabIndex: 0,
57
+ }),
58
+ };
59
+ return _jsx(_Fragment, { children: children(api) });
60
+ }
61
+ //# sourceMappingURL=TenantSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantSwitcher.js","sourceRoot":"","sources":["../../../src/components/headless/TenantSwitcher.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { type TenantTreeNode } from "../../hooks/use-tenant-tree.js";
3
+ export interface HeadlessTenantTreeAPI {
4
+ tree: TenantTreeNode[];
5
+ selectedId: string | null;
6
+ loading: boolean;
7
+ error: Error | null;
8
+ toggleExpand: (nodeId: string) => void;
9
+ refresh: () => Promise<void>;
10
+ getNodeProps: (node: TenantTreeNode) => {
11
+ role: "treeitem";
12
+ "aria-expanded": boolean | undefined;
13
+ tabIndex: number;
14
+ };
15
+ }
16
+ export interface HeadlessTenantTreeProps {
17
+ rootId?: string;
18
+ children: (api: HeadlessTenantTreeAPI) => React.ReactNode;
19
+ }
20
+ export declare function HeadlessTenantTree({ rootId, children }: HeadlessTenantTreeProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=TenantTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantTree.d.ts","sourceRoot":"","sources":["../../../src/components/headless/TenantTree.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGpF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,YAAY,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK;QACtC,IAAI,EAAE,UAAU,CAAC;QACjB,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,KAAK,CAAC,SAAS,CAAC;CAC3D;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,uBAAuB,2CAmB/E"}
@@ -0,0 +1,22 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useTenantTree } from "../../hooks/use-tenant-tree.js";
3
+ import { useTenant } from "../../hooks/use-tenant.js";
4
+ export function HeadlessTenantTree({ rootId, children }) {
5
+ const { tree, loading, error, toggleExpand, refresh } = useTenantTree(rootId);
6
+ const { tenant } = useTenant();
7
+ const api = {
8
+ tree,
9
+ selectedId: tenant?.id || null,
10
+ loading,
11
+ error,
12
+ toggleExpand,
13
+ refresh,
14
+ getNodeProps: (node) => ({
15
+ role: "treeitem",
16
+ "aria-expanded": node.children.length > 0 ? node.expanded : undefined,
17
+ tabIndex: 0,
18
+ }),
19
+ };
20
+ return _jsx(_Fragment, { children: children(api) });
21
+ }
22
+ //# sourceMappingURL=TenantTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantTree.js","sourceRoot":"","sources":["../../../src/components/headless/TenantTree.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAuB,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAqBtD,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAA2B;IAC9E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9E,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,MAAM,GAAG,GAA0B;QACjC,IAAI;QACJ,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,IAAI;QAC9B,OAAO;QACP,KAAK;QACL,YAAY;QACZ,OAAO;QACP,YAAY,EAAE,CAAC,IAAoB,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,UAAmB;YACzB,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACrE,QAAQ,EAAE,CAAC;SACZ,CAAC;KACH,CAAC;IAEF,OAAO,4BAAG,QAAQ,CAAC,GAAG,CAAC,GAAI,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Shared mock data and decorator for Storybook stories.
3
+ *
4
+ * All styled components depend on StratumProvider context via useStratum().
5
+ * This module provides a MockStratumProvider that injects controlled data
6
+ * into the real StratumContext so all hooks work without a live API.
7
+ */
8
+ import { type ReactNode } from "react";
9
+ import type { TenantNode } from "@stratum-hq/core";
10
+ export declare const mockTenants: TenantNode[];
11
+ /** Generate a large list of tenants for stress-testing. */
12
+ export declare function generateManyTenants(count: number): TenantNode[];
13
+ export declare const deepHierarchyTenants: TenantNode[];
14
+ export declare const singleRootTenant: TenantNode[];
15
+ export declare const mockConfigEntries: ({
16
+ key: string;
17
+ value: string;
18
+ source_tenant_id: string;
19
+ inherited: boolean;
20
+ locked: boolean;
21
+ } | {
22
+ key: string;
23
+ value: boolean;
24
+ source_tenant_id: string;
25
+ inherited: boolean;
26
+ locked: boolean;
27
+ } | {
28
+ key: string;
29
+ value: number;
30
+ source_tenant_id: string;
31
+ inherited: boolean;
32
+ locked: boolean;
33
+ })[];
34
+ export declare const mockSensitiveConfigEntries: ({
35
+ key: string;
36
+ value: string;
37
+ source_tenant_id: string;
38
+ inherited: boolean;
39
+ locked: boolean;
40
+ } | {
41
+ key: string;
42
+ value: boolean;
43
+ source_tenant_id: string;
44
+ inherited: boolean;
45
+ locked: boolean;
46
+ } | {
47
+ key: string;
48
+ value: number;
49
+ source_tenant_id: string;
50
+ inherited: boolean;
51
+ locked: boolean;
52
+ })[];
53
+ export declare const mockLockedConfigEntries: ({
54
+ locked: boolean;
55
+ inherited: boolean;
56
+ source_tenant_id: string;
57
+ key: string;
58
+ value: string;
59
+ } | {
60
+ locked: boolean;
61
+ inherited: boolean;
62
+ source_tenant_id: string;
63
+ key: string;
64
+ value: boolean;
65
+ } | {
66
+ locked: boolean;
67
+ inherited: boolean;
68
+ source_tenant_id: string;
69
+ key: string;
70
+ value: number;
71
+ })[];
72
+ export declare const mockPermissions: {
73
+ policy_id: string;
74
+ key: string;
75
+ value: boolean;
76
+ mode: string;
77
+ source_tenant_id: string;
78
+ locked: boolean;
79
+ delegated: boolean;
80
+ }[];
81
+ interface MockStratumProviderProps {
82
+ tenants?: TenantNode[];
83
+ configEntries?: typeof mockConfigEntries;
84
+ permissions?: typeof mockPermissions;
85
+ initialTenantId?: string;
86
+ loading?: boolean;
87
+ children: ReactNode;
88
+ }
89
+ /**
90
+ * Wraps children with the real StratumContext populated by mock data.
91
+ * All real hooks (useTenant, useTenantTree, useConfig, usePermissions)
92
+ * will read from this context and receive controlled responses via apiCall.
93
+ */
94
+ export declare function MockStratumProvider({ tenants, configEntries, permissions, initialTenantId, loading: forceLoading, children, }: MockStratumProviderProps): import("react/jsx-runtime").JSX.Element;
95
+ export {};
96
+ //# sourceMappingURL=storybook-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storybook-helpers.d.ts","sourceRoot":"","sources":["../../src/components/storybook-helpers.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAc,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,eAAO,MAAM,WAAW,EAAE,UAAU,EAyHnC,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAsB/D;AAGD,eAAO,MAAM,oBAAoB,EAAE,UAAU,EA4E5C,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,UAAU,EAgBxC,CAAC;AAMF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;IAkD7B,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;IAgBtC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;IAKjC,CAAC;AAMJ,eAAO,MAAM,eAAe;;;;;;;;GAuD3B,CAAC;AAMF,UAAU,wBAAwB;IAChC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,iBAAiB,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,eAAe,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAqB,EACrB,aAAiC,EACjC,WAA6B,EAC7B,eAAe,EACf,OAAO,EAAE,YAAoB,EAC7B,QAAQ,GACT,EAAE,wBAAwB,2CA0F1B"}