@vritti/quantum-ui 0.4.3 → 0.5.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.
- package/dist/Button.js +3 -2
- package/dist/Button.js.map +1 -1
- package/dist/DropdownMenu.js +59 -25
- package/dist/DropdownMenu.js.map +1 -1
- package/dist/OfferingSelector.js +21 -0
- package/dist/OfferingSelector.js.map +1 -0
- package/dist/OfferingVariantSelector.js +24 -0
- package/dist/OfferingVariantSelector.js.map +1 -0
- package/dist/PermissionGate.js +22 -7
- package/dist/PermissionGate.js.map +1 -1
- package/dist/Sidebar.js +1 -1
- package/dist/Switch.js +25 -6
- package/dist/Switch.js.map +1 -1
- package/dist/components/TokenInput.js +3 -4
- package/dist/components/TokenInput.js.map +1 -1
- package/dist/dropdown-menu.js +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/components/Button/Button.d.ts.map +1 -1
- package/dist/lib/components/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/lib/components/DropdownMenu/types.d.ts +4 -0
- package/dist/lib/components/DropdownMenu/types.d.ts.map +1 -1
- package/dist/lib/components/PermissionGate/PermissionGate.d.ts +5 -3
- package/dist/lib/components/PermissionGate/PermissionGate.d.ts.map +1 -1
- package/dist/lib/components/Switch/Switch.d.ts +2 -0
- package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
- package/dist/lib/components/TokenInput/TokenInput.d.ts.map +1 -1
- package/dist/lib/selects/index.d.ts +2 -0
- package/dist/lib/selects/index.d.ts.map +1 -1
- package/dist/lib/selects/offering/OfferingSelector.d.ts +4 -0
- package/dist/lib/selects/offering/OfferingSelector.d.ts.map +1 -0
- package/dist/lib/selects/offering/index.d.ts +2 -0
- package/dist/lib/selects/offering/index.d.ts.map +1 -0
- package/dist/lib/selects/offering-variant/OfferingVariantSelector.d.ts +6 -0
- package/dist/lib/selects/offering-variant/OfferingVariantSelector.d.ts.map +1 -0
- package/dist/lib/selects/offering-variant/index.d.ts +2 -0
- package/dist/lib/selects/offering-variant/index.d.ts.map +1 -0
- package/dist/lib/types/catalog-resolver.d.ts +4 -4
- package/dist/lib/types/catalog-resolver.d.ts.map +1 -1
- package/dist/selects/offering-variant.js +2 -0
- package/dist/selects/offering-variant.js.map +1 -0
- package/dist/selects/offering.js +2 -0
- package/dist/selects/offering.js.map +1 -0
- package/dist/types/catalog-resolver.js.map +1 -1
- package/package.json +9 -1
package/dist/Button.js
CHANGED
|
@@ -20,11 +20,12 @@ const Button = forwardRef(
|
|
|
20
20
|
asChild,
|
|
21
21
|
...props
|
|
22
22
|
}, ref) => {
|
|
23
|
-
const
|
|
23
|
+
const gate = usePermission(permission);
|
|
24
|
+
const { granted, locked, reason } = gate;
|
|
24
25
|
if (!granted) {
|
|
25
26
|
return null;
|
|
26
27
|
}
|
|
27
|
-
const lockTip = locked ? lockedTip(
|
|
28
|
+
const lockTip = locked ? lockedTip(gate) : void 0;
|
|
28
29
|
const isActuallyDisabled = disabled === true || locked;
|
|
29
30
|
const button = /* @__PURE__ */ jsx(
|
|
30
31
|
Button$1,
|
package/dist/Button.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sources":["../lib/components/Button/Button.tsx"],"sourcesContent":["import type React from 'react';\nimport { forwardRef } from 'react';\nimport { buttonVariants, Button as ShadcnButton } from '../../../shadcn/shadcnButton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../../shadcn/shadcnTooltip';\nimport { cn } from '../../../shadcn/utils';\nimport { lockedTip, PermissionLockIcon, usePermission } from '../PermissionGate';\nimport { Spinner } from '../Spinner';\n\nexport interface ButtonProps extends React.ComponentProps<typeof ShadcnButton> {\n isLoading?: boolean;\n loadingText?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n disabledTip?: string;\n permission?: string;\n}\n\n// Button with built-in loading state, adornment support, and optional permission gating\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n isLoading = false,\n loadingText,\n startAdornment,\n endAdornment,\n disabled,\n disabledTip,\n permission,\n className,\n asChild,\n ...props\n },\n ref,\n ) => {\n const { granted, locked, reason
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../lib/components/Button/Button.tsx"],"sourcesContent":["import type React from 'react';\nimport { forwardRef } from 'react';\nimport { buttonVariants, Button as ShadcnButton } from '../../../shadcn/shadcnButton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../../shadcn/shadcnTooltip';\nimport { cn } from '../../../shadcn/utils';\nimport { lockedTip, PermissionLockIcon, usePermission } from '../PermissionGate';\nimport { Spinner } from '../Spinner';\n\nexport interface ButtonProps extends React.ComponentProps<typeof ShadcnButton> {\n isLoading?: boolean;\n loadingText?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n disabledTip?: string;\n permission?: string;\n}\n\n// Button with built-in loading state, adornment support, and optional permission gating\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n isLoading = false,\n loadingText,\n startAdornment,\n endAdornment,\n disabled,\n disabledTip,\n permission,\n className,\n asChild,\n ...props\n },\n ref,\n ) => {\n const gate = usePermission(permission);\n const { granted, locked, reason } = gate;\n\n // render = role: the role doesn't grant this action, so the control doesn't exist for this user\n if (!granted) {\n return null;\n }\n\n // enable = role ∧ plan ∧ BU: granted but locked renders disabled with the upsell as its tooltip\n const lockTip = locked ? lockedTip(gate) : undefined;\n const isActuallyDisabled = disabled === true || locked;\n\n const button = (\n <ShadcnButton\n ref={ref}\n asChild={asChild}\n disabled={disabled || isLoading || locked}\n aria-busy={isLoading}\n className={cn(isLoading && 'cursor-wait', className)}\n {...props}\n >\n {isLoading ? (\n <>\n <Spinner className=\"mr-2\" />\n {loadingText ?? children}\n </>\n ) : (\n <>\n {locked ? <PermissionLockIcon reason={reason} className=\"size-3.5\" /> : startAdornment}\n {children}\n {endAdornment}\n </>\n )}\n </ShadcnButton>\n );\n\n const tip = lockTip ?? disabledTip;\n if (!tip || !isActuallyDisabled || asChild) {\n return button;\n }\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n {/* Disabled buttons do not emit hover/focus events, so the tooltip trigger lives on a wrapper. */}\n <span className=\"inline-flex max-w-full cursor-not-allowed\">{button}</span>\n </TooltipTrigger>\n <TooltipContent>{tip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n },\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n"],"names":["ShadcnButton"],"mappings":";;;;;;;;AAkBA,MAAM,MAAA,GAAS,UAAA;AAAA,EACb,CACE;AAAA,IACE,QAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,IAAA,GAAO,cAAc,UAAU,CAAA;AACrC,IAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAO,GAAI,IAAA;AAGpC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,MAAA,GAAS,SAAA,CAAU,IAAI,CAAA,GAAI,MAAA;AAC3C,IAAA,MAAM,kBAAA,GAAqB,aAAa,IAAA,IAAQ,MAAA;AAEhD,IAAA,MAAM,MAAA,mBACJ,GAAA;AAAA,MAACA,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA,EAAU,YAAY,SAAA,IAAa,MAAA;AAAA,QACnC,WAAA,EAAW,SAAA;AAAA,QACX,SAAA,EAAW,EAAA,CAAG,SAAA,IAAa,aAAA,EAAe,SAAS,CAAA;AAAA,QAClD,GAAG,KAAA;AAAA,QAEH,sCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,WAAU,MAAA,EAAO,CAAA;AAAA,UACzB,WAAA,IAAe;AAAA,SAAA,EAClB,oBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,MAAA,mBAAS,GAAA,CAAC,kBAAA,EAAA,EAAmB,MAAA,EAAgB,SAAA,EAAU,YAAW,CAAA,GAAK,cAAA;AAAA,UACvE,QAAA;AAAA,UACA;AAAA,SAAA,EACH;AAAA;AAAA,KAEJ;AAGF,IAAA,MAAM,MAAM,OAAA,IAAW,WAAA;AACvB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,kBAAA,IAAsB,OAAA,EAAS;AAC1C,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,uBACE,GAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EAErB,QAAA,kBAAA,GAAA,CAAC,UAAK,SAAA,EAAU,2CAAA,EAA6C,kBAAO,CAAA,EACtE,CAAA;AAAA,sBACA,GAAA,CAAC,kBAAgB,QAAA,EAAA,GAAA,EAAI;AAAA,KAAA,EACvB,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;;;;"}
|
package/dist/DropdownMenu.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useState, Fragment as Fragment$1 } from 'react';
|
|
2
|
+
import { useState, useMemo, Fragment as Fragment$1 } from 'react';
|
|
3
3
|
import { B as Button } from './Button.js';
|
|
4
4
|
import { D as Dialog } from './Dialog.js';
|
|
5
|
-
import {
|
|
5
|
+
import { c as usePermissionGate, l as lockedTip, b as PermissionLockIcon } from './PermissionGate.js';
|
|
6
|
+
import { D as DropdownMenu$1, a as DropdownMenuTrigger$1, b as DropdownMenuContent$1, c as DropdownMenuItem$1, d as DropdownMenuShortcut$1, e as DropdownMenuGroup$1, f as DropdownMenuLabel$1, g as DropdownMenuSub$1, h as DropdownMenuSubTrigger$1, i as DropdownMenuPortal$1, j as DropdownMenuSubContent$1, k as DropdownMenuRadioGroup$1, l as DropdownMenuRadioItem$1, m as DropdownMenuCheckboxItem$1, n as DropdownMenuSeparator$1 } from './dropdown-menu.js';
|
|
6
7
|
|
|
7
8
|
const DropdownMenuRoot = DropdownMenu$1;
|
|
8
9
|
const DropdownMenuCheckboxItem = DropdownMenuCheckboxItem$1;
|
|
@@ -19,31 +20,61 @@ const DropdownMenuSub = DropdownMenuSub$1;
|
|
|
19
20
|
const DropdownMenuSubContent = DropdownMenuSubContent$1;
|
|
20
21
|
const DropdownMenuSubTrigger = DropdownMenuSubTrigger$1;
|
|
21
22
|
const DropdownMenuTrigger = DropdownMenuTrigger$1;
|
|
22
|
-
const
|
|
23
|
+
const resolveItems = (items, gate, locks) => {
|
|
24
|
+
const resolved = [];
|
|
25
|
+
for (const item of items) {
|
|
26
|
+
const entry = item.type === "sub" || item.type === "group" ? { ...item, items: resolveItems(item.items, gate, locks) } : item;
|
|
27
|
+
if ((entry.type === "sub" || entry.type === "group") && entry.items.length === 0) continue;
|
|
28
|
+
if ("hidden" in entry && entry.hidden) continue;
|
|
29
|
+
if (!("permission" in entry) || !entry.permission) {
|
|
30
|
+
resolved.push(entry);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const result = gate(entry.permission);
|
|
34
|
+
if (!result.granted) continue;
|
|
35
|
+
if (result.locked) {
|
|
36
|
+
locks.set(entry.id, { reason: result.reason, tip: lockedTip(result) });
|
|
37
|
+
resolved.push({ ...entry, disabled: true });
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
resolved.push(entry);
|
|
41
|
+
}
|
|
42
|
+
return resolved.filter((item, index, list) => {
|
|
43
|
+
if (item.type !== "separator") return true;
|
|
44
|
+
const previous = list[index - 1];
|
|
45
|
+
const next = list.slice(index + 1).find((candidate) => candidate.type !== "separator");
|
|
46
|
+
return previous !== void 0 && previous.type !== "separator" && next !== void 0;
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
const LeadingIcon = ({ icon: Icon, lock }) => {
|
|
50
|
+
if (lock) return /* @__PURE__ */ jsx(PermissionLockIcon, { reason: lock.reason, className: "mr-2 h-4 w-4" });
|
|
51
|
+
return Icon ? /* @__PURE__ */ jsx(Icon, { className: "mr-2 h-4 w-4" }) : null;
|
|
52
|
+
};
|
|
53
|
+
const renderMenuItem = (item, index, locks, onDialogSelect) => {
|
|
54
|
+
const lock = item.id ? locks.get(item.id) : void 0;
|
|
23
55
|
switch (item.type) {
|
|
24
56
|
case "separator":
|
|
25
57
|
return /* @__PURE__ */ jsx(DropdownMenuSeparator, {}, item.id ?? `separator-${index}`);
|
|
26
58
|
case "label":
|
|
27
59
|
return /* @__PURE__ */ jsx(DropdownMenuLabel, { children: item.label }, item.id);
|
|
28
60
|
case "item": {
|
|
29
|
-
const
|
|
61
|
+
const trailing = lock?.tip ?? item.shortcut;
|
|
30
62
|
return /* @__PURE__ */ jsxs(
|
|
31
63
|
DropdownMenuItem,
|
|
32
64
|
{
|
|
33
65
|
onClick: item.onClick,
|
|
34
66
|
disabled: item.disabled,
|
|
35
|
-
className: item.variant === "destructive" ? "text-destructive focus:text-destructive" : void 0,
|
|
67
|
+
className: item.variant === "destructive" && !lock ? "text-destructive focus:text-destructive" : void 0,
|
|
36
68
|
children: [
|
|
37
|
-
|
|
69
|
+
/* @__PURE__ */ jsx(LeadingIcon, { icon: item.icon, lock }),
|
|
38
70
|
/* @__PURE__ */ jsx("span", { children: item.label }),
|
|
39
|
-
|
|
71
|
+
trailing && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: trailing })
|
|
40
72
|
]
|
|
41
73
|
},
|
|
42
74
|
item.id
|
|
43
75
|
);
|
|
44
76
|
}
|
|
45
|
-
case "checkbox":
|
|
46
|
-
const Icon = item.icon;
|
|
77
|
+
case "checkbox":
|
|
47
78
|
return /* @__PURE__ */ jsxs(
|
|
48
79
|
DropdownMenuCheckboxItem,
|
|
49
80
|
{
|
|
@@ -51,13 +82,13 @@ const renderMenuItem = (item, index, onDialogSelect) => {
|
|
|
51
82
|
onCheckedChange: item.onCheckedChange,
|
|
52
83
|
disabled: item.disabled,
|
|
53
84
|
children: [
|
|
54
|
-
|
|
55
|
-
item.label
|
|
85
|
+
/* @__PURE__ */ jsx(LeadingIcon, { icon: item.icon, lock }),
|
|
86
|
+
item.label,
|
|
87
|
+
lock && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: lock.tip })
|
|
56
88
|
]
|
|
57
89
|
},
|
|
58
90
|
item.id
|
|
59
91
|
);
|
|
60
|
-
}
|
|
61
92
|
case "radio-group":
|
|
62
93
|
return /* @__PURE__ */ jsx(DropdownMenuRadioGroup, { value: item.value, onValueChange: item.onValueChange, children: item.items.map((radioItem) => {
|
|
63
94
|
const Icon = radioItem.icon;
|
|
@@ -66,23 +97,20 @@ const renderMenuItem = (item, index, onDialogSelect) => {
|
|
|
66
97
|
radioItem.label
|
|
67
98
|
] }, radioItem.value);
|
|
68
99
|
}) }, item.id);
|
|
69
|
-
case "sub":
|
|
70
|
-
const Icon = item.icon;
|
|
100
|
+
case "sub":
|
|
71
101
|
return /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [
|
|
72
102
|
/* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { disabled: item.disabled, children: [
|
|
73
|
-
|
|
103
|
+
/* @__PURE__ */ jsx(LeadingIcon, { icon: item.icon, lock }),
|
|
74
104
|
/* @__PURE__ */ jsx("span", { children: item.label })
|
|
75
105
|
] }),
|
|
76
|
-
/* @__PURE__ */ jsx(DropdownMenuPortal, { children: /* @__PURE__ */ jsx(DropdownMenuSubContent, { children: item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, onDialogSelect)) }) })
|
|
106
|
+
/* @__PURE__ */ jsx(DropdownMenuPortal, { children: /* @__PURE__ */ jsx(DropdownMenuSubContent, { children: item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, locks, onDialogSelect)) }) })
|
|
77
107
|
] }, item.id);
|
|
78
|
-
}
|
|
79
108
|
case "group":
|
|
80
109
|
return /* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
|
|
81
110
|
item.label && /* @__PURE__ */ jsx(DropdownMenuLabel, { children: item.label }),
|
|
82
|
-
item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, onDialogSelect))
|
|
111
|
+
item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, locks, onDialogSelect))
|
|
83
112
|
] }, item.id);
|
|
84
|
-
case "dialog":
|
|
85
|
-
const Icon = item.icon;
|
|
113
|
+
case "dialog":
|
|
86
114
|
return /* @__PURE__ */ jsxs(
|
|
87
115
|
DropdownMenuItem,
|
|
88
116
|
{
|
|
@@ -92,13 +120,13 @@ const renderMenuItem = (item, index, onDialogSelect) => {
|
|
|
92
120
|
onDialogSelect?.(item.id);
|
|
93
121
|
},
|
|
94
122
|
children: [
|
|
95
|
-
|
|
96
|
-
/* @__PURE__ */ jsx("span", { children: item.label })
|
|
123
|
+
/* @__PURE__ */ jsx(LeadingIcon, { icon: item.icon, lock }),
|
|
124
|
+
/* @__PURE__ */ jsx("span", { children: item.label }),
|
|
125
|
+
lock && /* @__PURE__ */ jsx(DropdownMenuShortcut, { children: lock.tip })
|
|
97
126
|
]
|
|
98
127
|
},
|
|
99
128
|
item.id
|
|
100
129
|
);
|
|
101
|
-
}
|
|
102
130
|
case "custom": {
|
|
103
131
|
const content = typeof item.render === "function" ? item.render() : item.render;
|
|
104
132
|
if (item.asMenuItem) {
|
|
@@ -120,6 +148,11 @@ const DropdownMenu = ({
|
|
|
120
148
|
}) => {
|
|
121
149
|
const [activeDialogId, setActiveDialogId] = useState(null);
|
|
122
150
|
const TriggerIcon = trigger.icon;
|
|
151
|
+
const gate = usePermissionGate();
|
|
152
|
+
const { visible, locks } = useMemo(() => {
|
|
153
|
+
const resolvedLocks = /* @__PURE__ */ new Map();
|
|
154
|
+
return { visible: resolveItems(items, gate, resolvedLocks), locks: resolvedLocks };
|
|
155
|
+
}, [items, gate]);
|
|
123
156
|
const collectDialogItems = (menuItems) => {
|
|
124
157
|
const result = [];
|
|
125
158
|
for (const item of menuItems) {
|
|
@@ -128,7 +161,8 @@ const DropdownMenu = ({
|
|
|
128
161
|
}
|
|
129
162
|
return result;
|
|
130
163
|
};
|
|
131
|
-
const dialogItems = collectDialogItems(
|
|
164
|
+
const dialogItems = collectDialogItems(visible);
|
|
165
|
+
if (visible.length === 0) return null;
|
|
132
166
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
133
167
|
/* @__PURE__ */ jsxs(DropdownMenuRoot, { modal, children: [
|
|
134
168
|
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: trigger.children ?? /* @__PURE__ */ jsxs(Button, { variant: trigger.variant, className: trigger.className, children: [
|
|
@@ -146,7 +180,7 @@ const DropdownMenu = ({
|
|
|
146
180
|
event.preventDefault();
|
|
147
181
|
}
|
|
148
182
|
},
|
|
149
|
-
children:
|
|
183
|
+
children: visible.map((item, index) => renderMenuItem(item, index, locks, setActiveDialogId))
|
|
150
184
|
}
|
|
151
185
|
)
|
|
152
186
|
] }),
|
package/dist/DropdownMenu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sources":["../lib/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type React from 'react';\nimport { Fragment, useState } from 'react';\nimport {\n DropdownMenuCheckboxItem as ShadcnDropdownMenuCheckboxItem,\n DropdownMenuContent as ShadcnDropdownMenuContent,\n DropdownMenuGroup as ShadcnDropdownMenuGroup,\n DropdownMenuItem as ShadcnDropdownMenuItem,\n DropdownMenuLabel as ShadcnDropdownMenuLabel,\n DropdownMenuPortal as ShadcnDropdownMenuPortal,\n DropdownMenuRadioGroup as ShadcnDropdownMenuRadioGroup,\n DropdownMenuRadioItem as ShadcnDropdownMenuRadioItem,\n DropdownMenu as ShadcnDropdownMenuRoot,\n DropdownMenuSeparator as ShadcnDropdownMenuSeparator,\n DropdownMenuShortcut as ShadcnDropdownMenuShortcut,\n DropdownMenuSub as ShadcnDropdownMenuSub,\n DropdownMenuSubContent as ShadcnDropdownMenuSubContent,\n DropdownMenuSubTrigger as ShadcnDropdownMenuSubTrigger,\n DropdownMenuTrigger as ShadcnDropdownMenuTrigger,\n} from '../../../shadcn/shadcnDropdownMenu';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport type { DialogMenuItem, DropdownMenuProps, MenuItem } from './types';\n\nconst DropdownMenuRoot = ShadcnDropdownMenuRoot;\nconst DropdownMenuCheckboxItem = ShadcnDropdownMenuCheckboxItem;\nconst DropdownMenuContent = ShadcnDropdownMenuContent;\nconst DropdownMenuGroup = ShadcnDropdownMenuGroup;\nconst DropdownMenuItem = ShadcnDropdownMenuItem;\nconst DropdownMenuLabel = ShadcnDropdownMenuLabel;\nconst DropdownMenuPortal = ShadcnDropdownMenuPortal;\nconst DropdownMenuRadioGroup = ShadcnDropdownMenuRadioGroup;\nconst DropdownMenuRadioItem = ShadcnDropdownMenuRadioItem;\nconst DropdownMenuSeparator = ShadcnDropdownMenuSeparator;\nconst DropdownMenuShortcut = ShadcnDropdownMenuShortcut;\nconst DropdownMenuSub = ShadcnDropdownMenuSub;\nconst DropdownMenuSubContent = ShadcnDropdownMenuSubContent;\nconst DropdownMenuSubTrigger = ShadcnDropdownMenuSubTrigger;\nconst DropdownMenuTrigger = ShadcnDropdownMenuTrigger;\n\n// Renders a single menu item based on its type — supports nested submenus\nconst renderMenuItem = (item: MenuItem, index: number, onDialogSelect?: (id: string) => void): React.ReactNode => {\n switch (item.type) {\n case 'separator':\n return <DropdownMenuSeparator key={item.id ?? `separator-${index}`} />;\n\n case 'label':\n return <DropdownMenuLabel key={item.id}>{item.label}</DropdownMenuLabel>;\n\n case 'item': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n onClick={item.onClick}\n disabled={item.disabled}\n className={item.variant === 'destructive' ? 'text-destructive focus:text-destructive' : undefined}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n {item.shortcut && <DropdownMenuShortcut>{item.shortcut}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n }\n\n case 'checkbox': {\n const Icon = item.icon;\n return (\n <DropdownMenuCheckboxItem\n key={item.id}\n checked={item.checked}\n onCheckedChange={item.onCheckedChange}\n disabled={item.disabled}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {item.label}\n </DropdownMenuCheckboxItem>\n );\n }\n\n case 'radio-group':\n return (\n <DropdownMenuRadioGroup key={item.id} value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((radioItem) => {\n const Icon = radioItem.icon;\n return (\n <DropdownMenuRadioItem key={radioItem.value} value={radioItem.value} disabled={radioItem.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {radioItem.label}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n );\n\n case 'sub': {\n const Icon = item.icon;\n return (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, onDialogSelect))}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n );\n }\n\n case 'group':\n return (\n <DropdownMenuGroup key={item.id}>\n {item.label && <DropdownMenuLabel>{item.label}</DropdownMenuLabel>}\n {item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, onDialogSelect))}\n </DropdownMenuGroup>\n );\n\n case 'dialog': {\n const Icon = item.icon;\n return (\n <DropdownMenuItem\n key={item.id}\n disabled={item.disabled}\n onSelect={(e) => {\n e.preventDefault();\n onDialogSelect?.(item.id);\n }}\n >\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n <span>{item.label}</span>\n </DropdownMenuItem>\n );\n }\n\n case 'custom': {\n const content = typeof item.render === 'function' ? item.render() : item.render;\n if (item.asMenuItem) {\n return (\n <DropdownMenuItem key={item.id} onClick={item.onClick} disabled={item.disabled}>\n {content}\n </DropdownMenuItem>\n );\n }\n return <Fragment key={item.id}>{content}</Fragment>;\n }\n\n default:\n return null;\n }\n};\n\n// A flexible, data-driven dropdown menu built from a declarative items array\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n modal = false,\n contentClassName,\n align = 'end',\n side,\n}) => {\n const [activeDialogId, setActiveDialogId] = useState<string | null>(null);\n const TriggerIcon = trigger.icon;\n\n // Collect all dialog-type items (including nested) for rendering outside the Radix root\n const collectDialogItems = (menuItems: MenuItem[]): DialogMenuItem[] => {\n const result: DialogMenuItem[] = [];\n for (const item of menuItems) {\n if (item.type === 'dialog') result.push(item);\n if (item.type === 'sub' || item.type === 'group') result.push(...collectDialogItems(item.items));\n }\n return result;\n };\n\n const dialogItems = collectDialogItems(items);\n\n return (\n <>\n <DropdownMenuRoot modal={modal}>\n <DropdownMenuTrigger asChild>\n {trigger.children ?? (\n <Button variant={trigger.variant} className={trigger.className}>\n {TriggerIcon && <TriggerIcon className=\"mr-2 h-4 w-4\" />}\n {trigger.label}\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={contentClassName}\n align={align}\n side={side}\n onCloseAutoFocus={(event) => {\n if (!modal) {\n event.preventDefault();\n }\n }}\n >\n {items.map((item, index) => renderMenuItem(item, index, setActiveDialogId))}\n </DropdownMenuContent>\n </DropdownMenuRoot>\n {dialogItems.map((item) => {\n const handle: DialogHandle = {\n isOpen: activeDialogId === item.id,\n open: () => setActiveDialogId(item.id),\n close: () => setActiveDialogId(null),\n onOpenChange: (val) => {\n if (!val) setActiveDialogId(null);\n },\n };\n return (\n <Dialog\n key={item.id}\n handle={handle}\n icon={item.icon}\n title={item.dialog.title}\n description={item.dialog.description}\n badgeSlot={item.dialog.badgeSlot}\n content={item.dialog.content}\n />\n );\n })}\n </>\n );\n};\n\nDropdownMenu.displayName = 'DropdownMenu';\n"],"names":["ShadcnDropdownMenuRoot","ShadcnDropdownMenuCheckboxItem","ShadcnDropdownMenuContent","ShadcnDropdownMenuGroup","ShadcnDropdownMenuItem","ShadcnDropdownMenuLabel","ShadcnDropdownMenuPortal","ShadcnDropdownMenuRadioGroup","ShadcnDropdownMenuRadioItem","ShadcnDropdownMenuSeparator","ShadcnDropdownMenuShortcut","ShadcnDropdownMenuSub","ShadcnDropdownMenuSubContent","ShadcnDropdownMenuSubTrigger","ShadcnDropdownMenuTrigger","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sources":["../lib/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport type React from 'react';\nimport { Fragment, useMemo, useState } from 'react';\nimport {\n DropdownMenuCheckboxItem as ShadcnDropdownMenuCheckboxItem,\n DropdownMenuContent as ShadcnDropdownMenuContent,\n DropdownMenuGroup as ShadcnDropdownMenuGroup,\n DropdownMenuItem as ShadcnDropdownMenuItem,\n DropdownMenuLabel as ShadcnDropdownMenuLabel,\n DropdownMenuPortal as ShadcnDropdownMenuPortal,\n DropdownMenuRadioGroup as ShadcnDropdownMenuRadioGroup,\n DropdownMenuRadioItem as ShadcnDropdownMenuRadioItem,\n DropdownMenu as ShadcnDropdownMenuRoot,\n DropdownMenuSeparator as ShadcnDropdownMenuSeparator,\n DropdownMenuShortcut as ShadcnDropdownMenuShortcut,\n DropdownMenuSub as ShadcnDropdownMenuSub,\n DropdownMenuSubContent as ShadcnDropdownMenuSubContent,\n DropdownMenuSubTrigger as ShadcnDropdownMenuSubTrigger,\n DropdownMenuTrigger as ShadcnDropdownMenuTrigger,\n} from '../../../shadcn/shadcnDropdownMenu';\nimport type { DialogHandle } from '../../hooks/useDialog';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport {\n lockedTip,\n type PermissionGateFn,\n PermissionLockIcon,\n type PermissionLockReason,\n usePermissionGate,\n} from '../PermissionGate';\nimport type { DialogMenuItem, DropdownMenuProps, MenuItem } from './types';\n\nconst DropdownMenuRoot = ShadcnDropdownMenuRoot;\nconst DropdownMenuCheckboxItem = ShadcnDropdownMenuCheckboxItem;\nconst DropdownMenuContent = ShadcnDropdownMenuContent;\nconst DropdownMenuGroup = ShadcnDropdownMenuGroup;\nconst DropdownMenuItem = ShadcnDropdownMenuItem;\nconst DropdownMenuLabel = ShadcnDropdownMenuLabel;\nconst DropdownMenuPortal = ShadcnDropdownMenuPortal;\nconst DropdownMenuRadioGroup = ShadcnDropdownMenuRadioGroup;\nconst DropdownMenuRadioItem = ShadcnDropdownMenuRadioItem;\nconst DropdownMenuSeparator = ShadcnDropdownMenuSeparator;\nconst DropdownMenuShortcut = ShadcnDropdownMenuShortcut;\nconst DropdownMenuSub = ShadcnDropdownMenuSub;\nconst DropdownMenuSubContent = ShadcnDropdownMenuSubContent;\nconst DropdownMenuSubTrigger = ShadcnDropdownMenuSubTrigger;\nconst DropdownMenuTrigger = ShadcnDropdownMenuTrigger;\n\ninterface LockInfo {\n reason: PermissionLockReason | null;\n tip: string;\n}\n\ntype LockMap = Map<string, LockInfo>;\n\nconst resolveItems = (items: MenuItem[], gate: PermissionGateFn, locks: LockMap): MenuItem[] => {\n const resolved: MenuItem[] = [];\n\n for (const item of items) {\n const entry =\n item.type === 'sub' || item.type === 'group' ? { ...item, items: resolveItems(item.items, gate, locks) } : item;\n\n if ((entry.type === 'sub' || entry.type === 'group') && entry.items.length === 0) continue;\n if ('hidden' in entry && entry.hidden) continue;\n\n if (!('permission' in entry) || !entry.permission) {\n resolved.push(entry);\n continue;\n }\n\n const result = gate(entry.permission);\n if (!result.granted) continue;\n if (result.locked) {\n locks.set(entry.id, { reason: result.reason, tip: lockedTip(result) });\n resolved.push({ ...entry, disabled: true });\n continue;\n }\n resolved.push(entry);\n }\n\n return resolved.filter((item, index, list) => {\n if (item.type !== 'separator') return true;\n const previous = list[index - 1];\n const next = list.slice(index + 1).find((candidate) => candidate.type !== 'separator');\n return previous !== undefined && previous.type !== 'separator' && next !== undefined;\n });\n};\n\nconst LeadingIcon: React.FC<{ icon?: LucideIcon; lock?: LockInfo }> = ({ icon: Icon, lock }) => {\n if (lock) return <PermissionLockIcon reason={lock.reason} className=\"mr-2 h-4 w-4\" />;\n return Icon ? <Icon className=\"mr-2 h-4 w-4\" /> : null;\n};\n\n// Renders a single menu item based on its type — supports nested submenus\nconst renderMenuItem = (\n item: MenuItem,\n index: number,\n locks: LockMap,\n onDialogSelect?: (id: string) => void,\n): React.ReactNode => {\n const lock = item.id ? locks.get(item.id) : undefined;\n\n switch (item.type) {\n case 'separator':\n return <DropdownMenuSeparator key={item.id ?? `separator-${index}`} />;\n\n case 'label':\n return <DropdownMenuLabel key={item.id}>{item.label}</DropdownMenuLabel>;\n\n case 'item': {\n const trailing = lock?.tip ?? item.shortcut;\n return (\n <DropdownMenuItem\n key={item.id}\n onClick={item.onClick}\n disabled={item.disabled}\n className={item.variant === 'destructive' && !lock ? 'text-destructive focus:text-destructive' : undefined}\n >\n <LeadingIcon icon={item.icon} lock={lock} />\n <span>{item.label}</span>\n {trailing && <DropdownMenuShortcut>{trailing}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n }\n\n case 'checkbox':\n return (\n <DropdownMenuCheckboxItem\n key={item.id}\n checked={item.checked}\n onCheckedChange={item.onCheckedChange}\n disabled={item.disabled}\n >\n <LeadingIcon icon={item.icon} lock={lock} />\n {item.label}\n {lock && <DropdownMenuShortcut>{lock.tip}</DropdownMenuShortcut>}\n </DropdownMenuCheckboxItem>\n );\n\n case 'radio-group':\n return (\n <DropdownMenuRadioGroup key={item.id} value={item.value} onValueChange={item.onValueChange}>\n {item.items.map((radioItem) => {\n const Icon = radioItem.icon;\n return (\n <DropdownMenuRadioItem key={radioItem.value} value={radioItem.value} disabled={radioItem.disabled}>\n {Icon && <Icon className=\"mr-2 h-4 w-4\" />}\n {radioItem.label}\n </DropdownMenuRadioItem>\n );\n })}\n </DropdownMenuRadioGroup>\n );\n\n case 'sub':\n return (\n <DropdownMenuSub key={item.id}>\n <DropdownMenuSubTrigger disabled={item.disabled}>\n <LeadingIcon icon={item.icon} lock={lock} />\n <span>{item.label}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n {item.items.map((subItem, subIndex) => renderMenuItem(subItem, subIndex, locks, onDialogSelect))}\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n );\n\n case 'group':\n return (\n <DropdownMenuGroup key={item.id}>\n {item.label && <DropdownMenuLabel>{item.label}</DropdownMenuLabel>}\n {item.items.map((groupItem, groupIndex) => renderMenuItem(groupItem, groupIndex, locks, onDialogSelect))}\n </DropdownMenuGroup>\n );\n\n case 'dialog':\n return (\n <DropdownMenuItem\n key={item.id}\n disabled={item.disabled}\n onSelect={(e) => {\n e.preventDefault();\n onDialogSelect?.(item.id);\n }}\n >\n <LeadingIcon icon={item.icon} lock={lock} />\n <span>{item.label}</span>\n {lock && <DropdownMenuShortcut>{lock.tip}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n\n case 'custom': {\n const content = typeof item.render === 'function' ? item.render() : item.render;\n if (item.asMenuItem) {\n return (\n <DropdownMenuItem key={item.id} onClick={item.onClick} disabled={item.disabled}>\n {content}\n </DropdownMenuItem>\n );\n }\n return <Fragment key={item.id}>{content}</Fragment>;\n }\n\n default:\n return null;\n }\n};\n\n// A flexible, data-driven dropdown menu built from a declarative items array\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n trigger,\n items,\n modal = false,\n contentClassName,\n align = 'end',\n side,\n}) => {\n const [activeDialogId, setActiveDialogId] = useState<string | null>(null);\n const TriggerIcon = trigger.icon;\n const gate = usePermissionGate();\n\n const { visible, locks } = useMemo(() => {\n const resolvedLocks: LockMap = new Map();\n return { visible: resolveItems(items, gate, resolvedLocks), locks: resolvedLocks };\n }, [items, gate]);\n\n // Collect all dialog-type items (including nested) for rendering outside the Radix root\n const collectDialogItems = (menuItems: MenuItem[]): DialogMenuItem[] => {\n const result: DialogMenuItem[] = [];\n for (const item of menuItems) {\n if (item.type === 'dialog') result.push(item);\n if (item.type === 'sub' || item.type === 'group') result.push(...collectDialogItems(item.items));\n }\n return result;\n };\n\n const dialogItems = collectDialogItems(visible);\n\n if (visible.length === 0) return null;\n\n return (\n <>\n <DropdownMenuRoot modal={modal}>\n <DropdownMenuTrigger asChild>\n {trigger.children ?? (\n <Button variant={trigger.variant} className={trigger.className}>\n {TriggerIcon && <TriggerIcon className=\"mr-2 h-4 w-4\" />}\n {trigger.label}\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className={contentClassName}\n align={align}\n side={side}\n onCloseAutoFocus={(event) => {\n if (!modal) {\n event.preventDefault();\n }\n }}\n >\n {visible.map((item, index) => renderMenuItem(item, index, locks, setActiveDialogId))}\n </DropdownMenuContent>\n </DropdownMenuRoot>\n {dialogItems.map((item) => {\n const handle: DialogHandle = {\n isOpen: activeDialogId === item.id,\n open: () => setActiveDialogId(item.id),\n close: () => setActiveDialogId(null),\n onOpenChange: (val) => {\n if (!val) setActiveDialogId(null);\n },\n };\n return (\n <Dialog\n key={item.id}\n handle={handle}\n icon={item.icon}\n title={item.dialog.title}\n description={item.dialog.description}\n badgeSlot={item.dialog.badgeSlot}\n content={item.dialog.content}\n />\n );\n })}\n </>\n );\n};\n\nDropdownMenu.displayName = 'DropdownMenu';\n"],"names":["ShadcnDropdownMenuRoot","ShadcnDropdownMenuCheckboxItem","ShadcnDropdownMenuContent","ShadcnDropdownMenuGroup","ShadcnDropdownMenuItem","ShadcnDropdownMenuLabel","ShadcnDropdownMenuPortal","ShadcnDropdownMenuRadioGroup","ShadcnDropdownMenuRadioItem","ShadcnDropdownMenuSeparator","ShadcnDropdownMenuShortcut","ShadcnDropdownMenuSub","ShadcnDropdownMenuSubContent","ShadcnDropdownMenuSubTrigger","ShadcnDropdownMenuTrigger","Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { S as Select } from './Select.js';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_FIELD_KEYS = { valueKey: "id", labelKey: "name", descriptionKey: "code" };
|
|
6
|
+
const OfferingSelector = forwardRef(({ fieldKeys, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
7
|
+
Select,
|
|
8
|
+
{
|
|
9
|
+
ref,
|
|
10
|
+
label: "Offering",
|
|
11
|
+
placeholder: "Select offering",
|
|
12
|
+
searchable: true,
|
|
13
|
+
optionsEndpoint: "commerce-api/select-api/offerings",
|
|
14
|
+
...props,
|
|
15
|
+
fieldKeys: { ...DEFAULT_FIELD_KEYS, ...fieldKeys }
|
|
16
|
+
}
|
|
17
|
+
));
|
|
18
|
+
OfferingSelector.displayName = "OfferingSelector";
|
|
19
|
+
|
|
20
|
+
export { OfferingSelector as O };
|
|
21
|
+
//# sourceMappingURL=OfferingSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfferingSelector.js","sources":["../lib/selects/offering/OfferingSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport type OfferingSelectorProps = SelectProps;\n\nconst DEFAULT_FIELD_KEYS = { valueKey: 'id', labelKey: 'name', descriptionKey: 'code' } as const;\n\n// Pre-configured Select for offering selection with async search\nexport const OfferingSelector = forwardRef<HTMLButtonElement, OfferingSelectorProps>(({ fieldKeys, ...props }, ref) => (\n <Select\n ref={ref}\n label=\"Offering\"\n placeholder=\"Select offering\"\n searchable\n optionsEndpoint=\"commerce-api/select-api/offerings\"\n {...props}\n fieldKeys={{ ...DEFAULT_FIELD_KEYS, ...fieldKeys }}\n />\n));\nOfferingSelector.displayName = 'OfferingSelector';\n"],"names":[],"mappings":";;;;AAKA,MAAM,qBAAqB,EAAE,QAAA,EAAU,MAAM,QAAA,EAAU,MAAA,EAAQ,gBAAgB,MAAA,EAAO;AAG/E,MAAM,gBAAA,GAAmB,WAAqD,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC7G,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAY,iBAAA;AAAA,IACZ,UAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAgB,mCAAA;AAAA,IACf,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAE,GAAG,kBAAA,EAAoB,GAAG,SAAA;AAAU;AACnD,CACD;AACD,gBAAA,CAAiB,WAAA,GAAc,kBAAA;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { S as Select } from './Select.js';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_FIELD_KEYS = { valueKey: "id", labelKey: "sku", descriptionKey: "name" };
|
|
6
|
+
const OfferingVariantSelector = forwardRef(
|
|
7
|
+
({ offeringId, fieldKeys, params, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
8
|
+
Select,
|
|
9
|
+
{
|
|
10
|
+
ref,
|
|
11
|
+
label: "Variant",
|
|
12
|
+
placeholder: "Select variant",
|
|
13
|
+
searchable: true,
|
|
14
|
+
optionsEndpoint: "commerce-api/select-api/offering-variants",
|
|
15
|
+
...props,
|
|
16
|
+
params: { ...params, offeringId },
|
|
17
|
+
fieldKeys: { ...DEFAULT_FIELD_KEYS, ...fieldKeys }
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
);
|
|
21
|
+
OfferingVariantSelector.displayName = "OfferingVariantSelector";
|
|
22
|
+
|
|
23
|
+
export { OfferingVariantSelector as O };
|
|
24
|
+
//# sourceMappingURL=OfferingVariantSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfferingVariantSelector.js","sources":["../lib/selects/offering-variant/OfferingVariantSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport interface OfferingVariantSelectorProps extends SelectProps {\n // Variants are only meaningful within their offering, so the parent scopes every query\n offeringId: string;\n}\n\nconst DEFAULT_FIELD_KEYS = { valueKey: 'id', labelKey: 'sku', descriptionKey: 'name' } as const;\n\n// Pre-configured Select for the variants of one offering, keyed by SKU\nexport const OfferingVariantSelector = forwardRef<HTMLButtonElement, OfferingVariantSelectorProps>(\n ({ offeringId, fieldKeys, params, ...props }, ref) => (\n <Select\n ref={ref}\n label=\"Variant\"\n placeholder=\"Select variant\"\n searchable\n optionsEndpoint=\"commerce-api/select-api/offering-variants\"\n {...props}\n params={{ ...params, offeringId }}\n fieldKeys={{ ...DEFAULT_FIELD_KEYS, ...fieldKeys }}\n />\n ),\n);\nOfferingVariantSelector.displayName = 'OfferingVariantSelector';\n"],"names":[],"mappings":";;;;AAQA,MAAM,qBAAqB,EAAE,QAAA,EAAU,MAAM,QAAA,EAAU,KAAA,EAAO,gBAAgB,MAAA,EAAO;AAG9E,MAAM,uBAAA,GAA0B,UAAA;AAAA,EACrC,CAAC,EAAE,UAAA,EAAY,SAAA,EAAW,QAAQ,GAAG,KAAA,IAAS,GAAA,qBAC5C,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,KAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAY,gBAAA;AAAA,MACZ,UAAA,EAAU,IAAA;AAAA,MACV,eAAA,EAAgB,2CAAA;AAAA,MACf,GAAG,KAAA;AAAA,MACJ,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAW;AAAA,MAChC,SAAA,EAAW,EAAE,GAAG,kBAAA,EAAoB,GAAG,SAAA;AAAU;AAAA;AAGvD;AACA,uBAAA,CAAwB,WAAA,GAAc,yBAAA;;;;"}
|
package/dist/PermissionGate.js
CHANGED
|
@@ -21,7 +21,9 @@ const ALLOW = Object.freeze({
|
|
|
21
21
|
unlockPlans: [],
|
|
22
22
|
missingServices: [],
|
|
23
23
|
available: true,
|
|
24
|
-
featureName: null
|
|
24
|
+
featureName: null,
|
|
25
|
+
workspaceLabel: null,
|
|
26
|
+
workspaceScope: null
|
|
25
27
|
});
|
|
26
28
|
const ALLOW_GATE = () => ALLOW;
|
|
27
29
|
const GATE_CONTEXT_KEY = /* @__PURE__ */ Symbol.for("@vritti/quantum-ui/PermissionGate");
|
|
@@ -41,7 +43,7 @@ const PermissionLockIcon = ({
|
|
|
41
43
|
className
|
|
42
44
|
}) => {
|
|
43
45
|
switch (reason) {
|
|
44
|
-
case "
|
|
46
|
+
case "WORKSPACE":
|
|
45
47
|
return /* @__PURE__ */ jsx(LockKeyhole, { className: cn("text-destructive", className) });
|
|
46
48
|
case "SERVICE":
|
|
47
49
|
return /* @__PURE__ */ jsx(Lock, { className: cn("text-destructive", className) });
|
|
@@ -49,14 +51,25 @@ const PermissionLockIcon = ({
|
|
|
49
51
|
return /* @__PURE__ */ jsx(Lock, { className: cn("text-warning", className) });
|
|
50
52
|
}
|
|
51
53
|
};
|
|
54
|
+
const SCOPE_NOUN = {
|
|
55
|
+
ORG: "this organization",
|
|
56
|
+
LE: "this company",
|
|
57
|
+
SITE_GROUP: "this group",
|
|
58
|
+
SITE: "this outlet"
|
|
59
|
+
};
|
|
60
|
+
function workspaceNoun(label, scope) {
|
|
61
|
+
return label ?? (scope ? SCOPE_NOUN[scope] : "this workspace");
|
|
62
|
+
}
|
|
52
63
|
function lockedTip({
|
|
53
64
|
reason,
|
|
54
65
|
unlockPlans,
|
|
55
|
-
missingServices = []
|
|
66
|
+
missingServices = [],
|
|
67
|
+
workspaceLabel = null,
|
|
68
|
+
workspaceScope = null
|
|
56
69
|
}) {
|
|
57
70
|
switch (reason) {
|
|
58
|
-
case "
|
|
59
|
-
return
|
|
71
|
+
case "WORKSPACE":
|
|
72
|
+
return `Not enabled for ${workspaceNoun(workspaceLabel, workspaceScope)}`;
|
|
60
73
|
case "SERVICE":
|
|
61
74
|
return `Requires ${serviceLabels(missingServices)}`;
|
|
62
75
|
default:
|
|
@@ -72,11 +85,13 @@ function lockMessages(result) {
|
|
|
72
85
|
};
|
|
73
86
|
}
|
|
74
87
|
switch (result.reason) {
|
|
75
|
-
case "
|
|
88
|
+
case "WORKSPACE": {
|
|
89
|
+
const where = workspaceNoun(result.workspaceLabel ?? null, result.workspaceScope ?? null);
|
|
76
90
|
return {
|
|
77
91
|
title: name ? `${name} not enabled here` : "Not available here",
|
|
78
|
-
tip: name ? `${name} isn't enabled for
|
|
92
|
+
tip: name ? `${name} isn't enabled for ${where}.` : `Not enabled for ${where}.`
|
|
79
93
|
};
|
|
94
|
+
}
|
|
80
95
|
case "SERVICE": {
|
|
81
96
|
const needs = serviceLabels(result.missingServices ?? []);
|
|
82
97
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionGate.js","sources":["../lib/utils/services.ts","../lib/components/PermissionGate/PermissionGate.tsx"],"sourcesContent":["import type { ServiceCode } from '../types/catalog-resolver';\n\n// Human copy for each external service a feature can depend on. Adding a service means adding one entry\n// here — no lock surface branches on a specific service code.\nexport const SERVICE_LABELS: Record<ServiceCode, string> = {\n GITEA: 'a git organization',\n};\n\n// Joins the missing services into a phrase, e.g. \"a git organization\" / \"a git organization and X\"\nexport function serviceLabels(services: ServiceCode[]): string {\n const labels = services.map((service) => SERVICE_LABELS[service] ?? service);\n if (labels.length === 0) return 'a service';\n if (labels.length === 1) return labels[0];\n return `${labels.slice(0, -1).join(', ')} and ${labels[labels.length - 1]}`;\n}\n","import { Lock, LockKeyhole } from 'lucide-react';\nimport type React from 'react';\nimport { createContext, useContext } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport type { ServiceCode } from '../../types/catalog-resolver';\nimport { serviceLabels } from '../../utils/services';\n\nexport type PermissionLockReason = 'PLAN' | 'SITE' | 'SERVICE';\n\nexport interface PermissionGateResult {\n granted: boolean;\n locked: boolean;\n reason: PermissionLockReason | null;\n unlockPlans: string[];\n // Which external services the org still has to provision — only populated when reason is 'SERVICE'\n missingServices: ServiceCode[];\n available: boolean;\n featureName: string | null;\n}\n\nexport type PermissionGateFn = (code: string) => PermissionGateResult;\n\nconst ALLOW: PermissionGateResult = Object.freeze({\n granted: true,\n locked: false,\n reason: null,\n unlockPlans: [],\n missingServices: [],\n available: true,\n featureName: null,\n});\n\nconst ALLOW_GATE: PermissionGateFn = () => ALLOW;\n\nconst GATE_CONTEXT_KEY = Symbol.for('@vritti/quantum-ui/PermissionGate');\ntype GateRegistry = { [GATE_CONTEXT_KEY]?: React.Context<PermissionGateFn | null> };\nconst registry = globalThis as GateRegistry;\nregistry[GATE_CONTEXT_KEY] ??= createContext<PermissionGateFn | null>(null);\nconst PermissionGateContext = registry[GATE_CONTEXT_KEY];\n\nexport const PermissionGateProvider = PermissionGateContext.Provider;\n\n// The raw gate for mapping over collections; ALLOW-everything when no provider is mounted\nexport function usePermissionGate(): PermissionGateFn {\n return useContext(PermissionGateContext) ?? ALLOW_GATE;\n}\n\n// Total: no provider / no code resolves to ALLOW, so callers never branch on null\nexport function usePermission(code?: string): PermissionGateResult {\n const gate = useContext(PermissionGateContext);\n return code && gate ? gate(code) : ALLOW;\n}\n\n// The lock symbol for a locked control — plan locks show a warning lock, BU locks a red keyhole lock,\n// service locks a red lock (blocked until the org provisions it, not an entitlement the user can buy)\nexport const PermissionLockIcon: React.FC<{ reason: PermissionLockReason | null; className?: string }> = ({\n reason,\n className,\n}) => {\n switch (reason) {\n case 'SITE':\n return <LockKeyhole className={cn('text-destructive', className)} />;\n case 'SERVICE':\n return <Lock className={cn('text-destructive', className)} />;\n default:\n return <Lock className={cn('text-warning', className)} />;\n }\n};\n\n// Shared tooltip copy for locked controls — upsell for plan locks, restriction notice for BU locks,\n// setup notice for service locks\nexport function lockedTip({\n reason,\n unlockPlans,\n missingServices = [],\n}: Pick<PermissionGateResult, 'reason' | 'unlockPlans'> &\n Partial<Pick<PermissionGateResult, 'missingServices'>>): string {\n switch (reason) {\n case 'SITE':\n return 'Not enabled for this site';\n case 'SERVICE':\n return `Requires ${serviceLabels(missingServices)}`;\n default:\n return unlockPlans.length > 0 ? `Available in ${unlockPlans.join(', ')}` : 'Not included in your plan';\n }\n}\n\n// Resolves a blocked control's heading + description, keyed off the resolved feature name when known\nfunction lockMessages(\n result: Pick<PermissionGateResult, 'granted' | 'reason' | 'unlockPlans' | 'featureName'> &\n Partial<Pick<PermissionGateResult, 'missingServices'>>,\n): {\n title: string;\n tip: string;\n} {\n const name = result.featureName;\n if (!result.granted) {\n return {\n title: name ? `${name} is restricted` : 'No access',\n tip: name ? `You don't have permission to view ${name}.` : \"You don't have permission to access this.\",\n };\n }\n switch (result.reason) {\n case 'SITE':\n return {\n title: name ? `${name} not enabled here` : 'Not available here',\n tip: name ? `${name} isn't enabled for this site.` : 'Not enabled for this site.',\n };\n case 'SERVICE': {\n const needs = serviceLabels(result.missingServices ?? []);\n return {\n title: 'Setup required',\n tip: name ? `${name} needs ${needs}. Set it up to continue.` : `This needs ${needs}. Set it up to continue.`,\n };\n }\n default: {\n if (result.unlockPlans.length > 0) {\n const plans = result.unlockPlans.join(', ');\n return {\n title: name ? `Unlock ${name}` : 'Upgrade required',\n tip: name ? `${name} is available on ${plans}.` : `Available in ${plans}.`,\n };\n }\n return {\n title: name ? `Unlock ${name}` : 'Upgrade required',\n tip: name ? `${name} isn't included in your plan.` : 'Not included in your plan.',\n };\n }\n }\n}\n\nexport interface PermissionGateProps {\n permission?: string;\n children: React.ReactNode;\n fallback?: React.ReactNode | ((result: PermissionGateResult & { title: string; tip: string }) => React.ReactNode);\n}\n\n// Default fallback — a centered lock panel with the feature-specific restriction message\nconst DefaultLockFallback: React.FC<{ result: PermissionGateResult }> = ({ result }) => (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-2 text-center\">\n <PermissionLockIcon reason={result.reason} className=\"size-10\" />\n <p className=\"max-w-sm text-sm text-muted-foreground\">{lockMessages(result).tip}</p>\n </div>\n);\n\n// Gates a subtree by permission code: children mount only when granted AND unlocked, else renders `fallback`\nexport const PermissionGate: React.FC<PermissionGateProps> = ({ permission, children, fallback }) => {\n const result = usePermission(permission);\n if (result.available) return <>{children}</>;\n if (fallback !== undefined)\n return <>{typeof fallback === 'function' ? fallback({ ...result, ...lockMessages(result) }) : fallback}</>;\n return <DefaultLockFallback result={result} />;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionGate.js","sources":["../lib/utils/services.ts","../lib/components/PermissionGate/PermissionGate.tsx"],"sourcesContent":["import type { ServiceCode } from '../types/catalog-resolver';\n\n// Human copy for each external service a feature can depend on. Adding a service means adding one entry\n// here — no lock surface branches on a specific service code.\nexport const SERVICE_LABELS: Record<ServiceCode, string> = {\n GITEA: 'a git organization',\n};\n\n// Joins the missing services into a phrase, e.g. \"a git organization\" / \"a git organization and X\"\nexport function serviceLabels(services: ServiceCode[]): string {\n const labels = services.map((service) => SERVICE_LABELS[service] ?? service);\n if (labels.length === 0) return 'a service';\n if (labels.length === 1) return labels[0];\n return `${labels.slice(0, -1).join(', ')} and ${labels[labels.length - 1]}`;\n}\n","import { Lock, LockKeyhole } from 'lucide-react';\nimport type React from 'react';\nimport { createContext, useContext } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport type { ScopeType, ServiceCode } from '../../types/catalog-resolver';\nimport { serviceLabels } from '../../utils/services';\n\nexport type PermissionLockReason = 'PLAN' | 'WORKSPACE' | 'SERVICE';\n\nexport interface PermissionGateResult {\n granted: boolean;\n locked: boolean;\n reason: PermissionLockReason | null;\n unlockPlans: string[];\n // Which external services the org still has to provision — only populated when reason is 'SERVICE'\n missingServices: ServiceCode[];\n available: boolean;\n featureName: string | null;\n // The workspace holding the lock — its name when the host resolved one, else its scope, so a\n // WORKSPACE lock can say which workspace rather than assuming a site\n workspaceLabel: string | null;\n workspaceScope: ScopeType | null;\n}\n\nexport type PermissionGateFn = (code: string) => PermissionGateResult;\n\nconst ALLOW: PermissionGateResult = Object.freeze({\n granted: true,\n locked: false,\n reason: null,\n unlockPlans: [],\n missingServices: [],\n available: true,\n featureName: null,\n workspaceLabel: null,\n workspaceScope: null,\n});\n\nconst ALLOW_GATE: PermissionGateFn = () => ALLOW;\n\nconst GATE_CONTEXT_KEY = Symbol.for('@vritti/quantum-ui/PermissionGate');\ntype GateRegistry = { [GATE_CONTEXT_KEY]?: React.Context<PermissionGateFn | null> };\nconst registry = globalThis as GateRegistry;\nregistry[GATE_CONTEXT_KEY] ??= createContext<PermissionGateFn | null>(null);\nconst PermissionGateContext = registry[GATE_CONTEXT_KEY];\n\nexport const PermissionGateProvider = PermissionGateContext.Provider;\n\n// The raw gate for mapping over collections; ALLOW-everything when no provider is mounted\nexport function usePermissionGate(): PermissionGateFn {\n return useContext(PermissionGateContext) ?? ALLOW_GATE;\n}\n\n// Total: no provider / no code resolves to ALLOW, so callers never branch on null\nexport function usePermission(code?: string): PermissionGateResult {\n const gate = useContext(PermissionGateContext);\n return code && gate ? gate(code) : ALLOW;\n}\n\n// The lock symbol for a locked control — plan locks show a warning lock, workspace locks a red keyhole\n// lock, service locks a red lock (blocked until the org provisions it, not an entitlement the user can buy)\nexport const PermissionLockIcon: React.FC<{ reason: PermissionLockReason | null; className?: string }> = ({\n reason,\n className,\n}) => {\n switch (reason) {\n case 'WORKSPACE':\n return <LockKeyhole className={cn('text-destructive', className)} />;\n case 'SERVICE':\n return <Lock className={cn('text-destructive', className)} />;\n default:\n return <Lock className={cn('text-warning', className)} />;\n }\n};\n\n// Names the workspace a lock sits on: its own name when the host resolved one, else the noun for its\n// scope, else a neutral fallback. A lock may sit on the org, legal entity, site group or site, so the\n// copy must never assume a site.\nconst SCOPE_NOUN: Record<ScopeType, string> = {\n ORG: 'this organization',\n LE: 'this company',\n SITE_GROUP: 'this group',\n SITE: 'this outlet',\n};\n\nfunction workspaceNoun(label: string | null, scope: ScopeType | null): string {\n return label ?? (scope ? SCOPE_NOUN[scope] : 'this workspace');\n}\n\n// Shared tooltip copy for locked controls — upsell for plan locks, restriction notice for workspace\n// locks, setup notice for service locks. A workspace lock may sit on the org, legal entity, site group\n// or site, so the copy names the workspace rather than assuming a site.\nexport function lockedTip({\n reason,\n unlockPlans,\n missingServices = [],\n workspaceLabel = null,\n workspaceScope = null,\n}: Pick<PermissionGateResult, 'reason' | 'unlockPlans'> &\n Partial<Pick<PermissionGateResult, 'missingServices' | 'workspaceLabel' | 'workspaceScope'>>): string {\n switch (reason) {\n case 'WORKSPACE':\n return `Not enabled for ${workspaceNoun(workspaceLabel, workspaceScope)}`;\n case 'SERVICE':\n return `Requires ${serviceLabels(missingServices)}`;\n default:\n return unlockPlans.length > 0 ? `Available in ${unlockPlans.join(', ')}` : 'Not included in your plan';\n }\n}\n\n// Resolves a blocked control's heading + description, keyed off the resolved feature name when known\nfunction lockMessages(\n result: Pick<PermissionGateResult, 'granted' | 'reason' | 'unlockPlans' | 'featureName'> &\n Partial<Pick<PermissionGateResult, 'missingServices' | 'workspaceLabel' | 'workspaceScope'>>,\n): {\n title: string;\n tip: string;\n} {\n const name = result.featureName;\n if (!result.granted) {\n return {\n title: name ? `${name} is restricted` : 'No access',\n tip: name ? `You don't have permission to view ${name}.` : \"You don't have permission to access this.\",\n };\n }\n switch (result.reason) {\n case 'WORKSPACE': {\n const where = workspaceNoun(result.workspaceLabel ?? null, result.workspaceScope ?? null);\n return {\n title: name ? `${name} not enabled here` : 'Not available here',\n tip: name ? `${name} isn't enabled for ${where}.` : `Not enabled for ${where}.`,\n };\n }\n case 'SERVICE': {\n const needs = serviceLabels(result.missingServices ?? []);\n return {\n title: 'Setup required',\n tip: name ? `${name} needs ${needs}. Set it up to continue.` : `This needs ${needs}. Set it up to continue.`,\n };\n }\n default: {\n if (result.unlockPlans.length > 0) {\n const plans = result.unlockPlans.join(', ');\n return {\n title: name ? `Unlock ${name}` : 'Upgrade required',\n tip: name ? `${name} is available on ${plans}.` : `Available in ${plans}.`,\n };\n }\n return {\n title: name ? `Unlock ${name}` : 'Upgrade required',\n tip: name ? `${name} isn't included in your plan.` : 'Not included in your plan.',\n };\n }\n }\n}\n\nexport interface PermissionGateProps {\n permission?: string;\n children: React.ReactNode;\n fallback?: React.ReactNode | ((result: PermissionGateResult & { title: string; tip: string }) => React.ReactNode);\n}\n\n// Default fallback — a centered lock panel with the feature-specific restriction message\nconst DefaultLockFallback: React.FC<{ result: PermissionGateResult }> = ({ result }) => (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-2 text-center\">\n <PermissionLockIcon reason={result.reason} className=\"size-10\" />\n <p className=\"max-w-sm text-sm text-muted-foreground\">{lockMessages(result).tip}</p>\n </div>\n);\n\n// Gates a subtree by permission code: children mount only when granted AND unlocked, else renders `fallback`\nexport const PermissionGate: React.FC<PermissionGateProps> = ({ permission, children, fallback }) => {\n const result = usePermission(permission);\n if (result.available) return <>{children}</>;\n if (fallback !== undefined)\n return <>{typeof fallback === 'function' ? fallback({ ...result, ...lockMessages(result) }) : fallback}</>;\n return <DefaultLockFallback result={result} />;\n};\n"],"names":[],"mappings":"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"}
|
package/dist/Sidebar.js
CHANGED
|
@@ -8,7 +8,7 @@ import { c as cn } from './utils.js';
|
|
|
8
8
|
import { T as TooltipProvider, a as Tooltip, b as TooltipTrigger, c as TooltipContent } from './tooltip2.js';
|
|
9
9
|
import { R as Root, P as Portal, C as Content, a as Close, b as Title, D as Description, O as Overlay } from './index30.js';
|
|
10
10
|
import { X } from './x.js';
|
|
11
|
-
import { D as DropdownMenu, a as DropdownMenuTrigger, b as DropdownMenuContent,
|
|
11
|
+
import { D as DropdownMenu, a as DropdownMenuTrigger, b as DropdownMenuContent, f as DropdownMenuLabel, c as DropdownMenuItem } from './dropdown-menu.js';
|
|
12
12
|
import { P as PanelLeft } from './panel-left.js';
|
|
13
13
|
import { C as Collapsible, a as CollapsibleTrigger, b as CollapsibleContent } from './collapsible2.js';
|
|
14
14
|
import { C as ChevronRight } from './chevron-right.js';
|
package/dist/Switch.js
CHANGED
|
@@ -3,6 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import React__default from 'react';
|
|
4
4
|
import { F as Field, e as FieldLabel, c as FieldError } from './field.js';
|
|
5
5
|
import { w as withDisabledTip } from './disabledTip.js';
|
|
6
|
+
import { u as usePermission, l as lockedTip, b as PermissionLockIcon } from './PermissionGate.js';
|
|
6
7
|
import { u as useControllableState, P as Primitive, c as composeEventHandlers } from './index20.js';
|
|
7
8
|
import { u as useComposedRefs } from './index12.js';
|
|
8
9
|
import { c as createContextScope } from './index21.js';
|
|
@@ -178,12 +179,22 @@ function Switch$1({
|
|
|
178
179
|
}
|
|
179
180
|
|
|
180
181
|
const Switch = React__default.forwardRef(
|
|
181
|
-
({ label, description, error, disabledTip, id, size = "lg", ...props }, ref) => {
|
|
182
|
+
({ label, description, error, disabledTip, permission, id, size = "lg", ...props }, ref) => {
|
|
182
183
|
const generatedId = React__default.useId();
|
|
183
184
|
const fieldId = id || generatedId;
|
|
184
185
|
const hasError = !!error;
|
|
185
|
-
|
|
186
|
-
|
|
186
|
+
const gate = usePermission(permission);
|
|
187
|
+
const { granted, locked, reason } = gate;
|
|
188
|
+
if (!granted) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const isDisabled = props.disabled || locked;
|
|
192
|
+
const tip = locked ? lockedTip(gate) : disabledTip;
|
|
193
|
+
return /* @__PURE__ */ jsxs(Field, { "data-disabled": isDisabled, "data-invalid": hasError, children: [
|
|
194
|
+
label && /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: fieldId, className: "flex cursor-pointer items-center gap-1.5", children: [
|
|
195
|
+
locked && /* @__PURE__ */ jsx(PermissionLockIcon, { reason, className: "size-3.5" }),
|
|
196
|
+
label
|
|
197
|
+
] }),
|
|
187
198
|
/* @__PURE__ */ jsxs("div", { className: "flex min-h-9 items-center gap-3", children: [
|
|
188
199
|
description && /* @__PURE__ */ jsx(
|
|
189
200
|
"label",
|
|
@@ -202,12 +213,13 @@ const Switch = React__default.forwardRef(
|
|
|
202
213
|
ref,
|
|
203
214
|
id: fieldId,
|
|
204
215
|
size,
|
|
216
|
+
disabled: isDisabled,
|
|
205
217
|
"aria-describedby": description || error ? `${fieldId}-description ${fieldId}-error` : void 0,
|
|
206
218
|
"aria-invalid": hasError
|
|
207
219
|
}
|
|
208
220
|
),
|
|
209
|
-
|
|
210
|
-
|
|
221
|
+
tip,
|
|
222
|
+
isDisabled
|
|
211
223
|
)
|
|
212
224
|
] }),
|
|
213
225
|
error && /* @__PURE__ */ jsx(FieldError, { id: `${fieldId}-error`, children: error })
|
|
@@ -215,7 +227,14 @@ const Switch = React__default.forwardRef(
|
|
|
215
227
|
}
|
|
216
228
|
);
|
|
217
229
|
Switch.displayName = "Switch";
|
|
218
|
-
const CompactSwitch = ({ size = "sm", disabledTip, ...props }) =>
|
|
230
|
+
const CompactSwitch = ({ size = "sm", disabledTip, permission, ...props }) => {
|
|
231
|
+
const gate = usePermission(permission);
|
|
232
|
+
const { granted, locked } = gate;
|
|
233
|
+
if (!granted) return null;
|
|
234
|
+
const isDisabled = props.disabled || locked;
|
|
235
|
+
const tip = locked ? lockedTip(gate) : disabledTip;
|
|
236
|
+
return withDisabledTip(/* @__PURE__ */ jsx(Switch$1, { size, ...props, disabled: isDisabled }), tip, isDisabled);
|
|
237
|
+
};
|
|
219
238
|
CompactSwitch.displayName = "CompactSwitch";
|
|
220
239
|
|
|
221
240
|
export { CompactSwitch as C, Switch as S, Switch$1 as a };
|
package/dist/Switch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.js","sources":["../node_modules/.pnpm/@radix-ui+react-switch@1.2.6_@types+react-dom@19.2.3_@types+react@19.2.14__@types+react_c3445f43106be928beab9f2bef095c25/node_modules/@radix-ui/react-switch/dist/index.mjs","../shadcn/shadcnSwitch/Switch.tsx","../lib/components/Switch/Switch.tsx"],"sourcesContent":["\"use client\";\n\n// src/switch.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar SWITCH_NAME = \"Switch\";\nvar [createSwitchContext, createSwitchScope] = createContextScope(SWITCH_NAME);\nvar [SwitchProvider, useSwitchContext] = createSwitchContext(SWITCH_NAME);\nvar Switch = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSwitch,\n name,\n checked: checkedProp,\n defaultChecked,\n required,\n disabled,\n value = \"on\",\n onCheckedChange,\n form,\n ...switchProps\n } = props;\n const [button, setButton] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node));\n const hasConsumerStoppedPropagationRef = React.useRef(false);\n const isFormControl = button ? form || !!button.closest(\"form\") : true;\n const [checked, setChecked] = useControllableState({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n caller: SWITCH_NAME\n });\n return /* @__PURE__ */ jsxs(SwitchProvider, { scope: __scopeSwitch, checked, disabled, children: [\n /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"switch\",\n \"aria-checked\": checked,\n \"aria-required\": required,\n \"data-state\": getState(checked),\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n value,\n ...switchProps,\n ref: composedRefs,\n onClick: composeEventHandlers(props.onClick, (event) => {\n setChecked((prevChecked) => !prevChecked);\n if (isFormControl) {\n hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();\n if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();\n }\n })\n }\n ),\n isFormControl && /* @__PURE__ */ jsx(\n SwitchBubbleInput,\n {\n control: button,\n bubbles: !hasConsumerStoppedPropagationRef.current,\n name,\n value,\n checked,\n required,\n disabled,\n form,\n style: { transform: \"translateX(-100%)\" }\n }\n )\n ] });\n }\n);\nSwitch.displayName = SWITCH_NAME;\nvar THUMB_NAME = \"SwitchThumb\";\nvar SwitchThumb = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSwitch, ...thumbProps } = props;\n const context = useSwitchContext(THUMB_NAME, __scopeSwitch);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-state\": getState(context.checked),\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...thumbProps,\n ref: forwardedRef\n }\n );\n }\n);\nSwitchThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"SwitchBubbleInput\";\nvar SwitchBubbleInput = React.forwardRef(\n ({\n __scopeSwitch,\n control,\n checked,\n bubbles = true,\n ...props\n }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevChecked = usePrevious(checked);\n const controlSize = useSize(control);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n inputProto,\n \"checked\"\n );\n const setChecked = descriptor.set;\n if (prevChecked !== checked && setChecked) {\n const event = new Event(\"click\", { bubbles });\n setChecked.call(input, checked);\n input.dispatchEvent(event);\n }\n }, [prevChecked, checked, bubbles]);\n return /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n \"aria-hidden\": true,\n defaultChecked: checked,\n ...props,\n tabIndex: -1,\n ref: composedRefs,\n style: {\n ...props.style,\n ...controlSize,\n position: \"absolute\",\n pointerEvents: \"none\",\n opacity: 0,\n margin: 0\n }\n }\n );\n }\n);\nSwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getState(checked) {\n return checked ? \"checked\" : \"unchecked\";\n}\nvar Root = Switch;\nvar Thumb = SwitchThumb;\nexport {\n Root,\n Switch,\n SwitchThumb,\n Thumb,\n createSwitchScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nfunction Switch({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: 'sm' | 'default' | 'lg';\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] data-[size=lg]:h-[24px] data-[size=lg]:w-[40px]',\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"bg-primary-foreground shadow-sm pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=lg]/switch:size-5 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import React from 'react';\nimport { Field, FieldError, FieldLabel } from '../../../shadcn/shadcnField';\nimport { Switch as ShadcnSwitch } from '../../../shadcn/shadcnSwitch';\nimport { withDisabledTip } from '../../utils/disabledTip';\n\nexport interface SwitchProps extends React.ComponentPropsWithoutRef<typeof ShadcnSwitch> {\n label?: React.ReactNode;\n\n description: React.ReactNode;\n\n error?: string;\n\n disabledTip?: string;\n}\n\n// Switch for toggling on/off; label + description on the left with the toggle pinned right (description required)\nexport const Switch = React.forwardRef<React.ElementRef<typeof ShadcnSwitch>, SwitchProps>(\n ({ label, description, error, disabledTip, id, size = 'lg', ...props }, ref) => {\n const generatedId = React.useId();\n const fieldId = id || generatedId;\n const hasError = !!error;\n\n return (\n <Field data-disabled={props.disabled} data-invalid={hasError}>\n {label && (\n <FieldLabel htmlFor={fieldId} className=\"cursor-pointer\">\n {label}\n </FieldLabel>\n )}\n <div className=\"flex min-h-9 items-center gap-3\">\n {description && (\n <label\n htmlFor={fieldId}\n id={`${fieldId}-description`}\n className=\"flex-1 cursor-pointer text-sm leading-snug text-muted-foreground\"\n >\n {description}\n </label>\n )}\n {withDisabledTip(\n <ShadcnSwitch\n {...props}\n ref={ref}\n id={fieldId}\n size={size}\n aria-describedby={description || error ? `${fieldId}-description ${fieldId}-error` : undefined}\n aria-invalid={hasError}\n />,\n disabledTip,\n props.disabled,\n )}\n </div>\n {error && <FieldError id={`${fieldId}-error`}>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n\nexport type CompactSwitchProps = React.ComponentProps<typeof ShadcnSwitch> & { disabledTip?: string };\n\n// Bare compact switch with no Field wrapper, defaults to sm size for dense layouts like table/matrix cells\nexport const CompactSwitch: React.FC<CompactSwitchProps> = ({ size = 'sm', disabledTip, ...props }) =>\n withDisabledTip(<ShadcnSwitch size={size} {...props} />, disabledTip, props.disabled);\n\nCompactSwitch.displayName = 'CompactSwitch';\n"],"names":["Switch","SwitchPrimitive.Root","SwitchPrimitive.Thumb","React","ShadcnSwitch"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../node_modules/.pnpm/@radix-ui+react-switch@1.2.6_@types+react-dom@19.2.3_@types+react@19.2.14__@types+react_c3445f43106be928beab9f2bef095c25/node_modules/@radix-ui/react-switch/dist/index.mjs","../shadcn/shadcnSwitch/Switch.tsx","../lib/components/Switch/Switch.tsx"],"sourcesContent":["\"use client\";\n\n// src/switch.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { createContextScope } from \"@radix-ui/react-context\";\nimport { useControllableState } from \"@radix-ui/react-use-controllable-state\";\nimport { usePrevious } from \"@radix-ui/react-use-previous\";\nimport { useSize } from \"@radix-ui/react-use-size\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar SWITCH_NAME = \"Switch\";\nvar [createSwitchContext, createSwitchScope] = createContextScope(SWITCH_NAME);\nvar [SwitchProvider, useSwitchContext] = createSwitchContext(SWITCH_NAME);\nvar Switch = React.forwardRef(\n (props, forwardedRef) => {\n const {\n __scopeSwitch,\n name,\n checked: checkedProp,\n defaultChecked,\n required,\n disabled,\n value = \"on\",\n onCheckedChange,\n form,\n ...switchProps\n } = props;\n const [button, setButton] = React.useState(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setButton(node));\n const hasConsumerStoppedPropagationRef = React.useRef(false);\n const isFormControl = button ? form || !!button.closest(\"form\") : true;\n const [checked, setChecked] = useControllableState({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n caller: SWITCH_NAME\n });\n return /* @__PURE__ */ jsxs(SwitchProvider, { scope: __scopeSwitch, checked, disabled, children: [\n /* @__PURE__ */ jsx(\n Primitive.button,\n {\n type: \"button\",\n role: \"switch\",\n \"aria-checked\": checked,\n \"aria-required\": required,\n \"data-state\": getState(checked),\n \"data-disabled\": disabled ? \"\" : void 0,\n disabled,\n value,\n ...switchProps,\n ref: composedRefs,\n onClick: composeEventHandlers(props.onClick, (event) => {\n setChecked((prevChecked) => !prevChecked);\n if (isFormControl) {\n hasConsumerStoppedPropagationRef.current = event.isPropagationStopped();\n if (!hasConsumerStoppedPropagationRef.current) event.stopPropagation();\n }\n })\n }\n ),\n isFormControl && /* @__PURE__ */ jsx(\n SwitchBubbleInput,\n {\n control: button,\n bubbles: !hasConsumerStoppedPropagationRef.current,\n name,\n value,\n checked,\n required,\n disabled,\n form,\n style: { transform: \"translateX(-100%)\" }\n }\n )\n ] });\n }\n);\nSwitch.displayName = SWITCH_NAME;\nvar THUMB_NAME = \"SwitchThumb\";\nvar SwitchThumb = React.forwardRef(\n (props, forwardedRef) => {\n const { __scopeSwitch, ...thumbProps } = props;\n const context = useSwitchContext(THUMB_NAME, __scopeSwitch);\n return /* @__PURE__ */ jsx(\n Primitive.span,\n {\n \"data-state\": getState(context.checked),\n \"data-disabled\": context.disabled ? \"\" : void 0,\n ...thumbProps,\n ref: forwardedRef\n }\n );\n }\n);\nSwitchThumb.displayName = THUMB_NAME;\nvar BUBBLE_INPUT_NAME = \"SwitchBubbleInput\";\nvar SwitchBubbleInput = React.forwardRef(\n ({\n __scopeSwitch,\n control,\n checked,\n bubbles = true,\n ...props\n }, forwardedRef) => {\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(ref, forwardedRef);\n const prevChecked = usePrevious(checked);\n const controlSize = useSize(control);\n React.useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const inputProto = window.HTMLInputElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n inputProto,\n \"checked\"\n );\n const setChecked = descriptor.set;\n if (prevChecked !== checked && setChecked) {\n const event = new Event(\"click\", { bubbles });\n setChecked.call(input, checked);\n input.dispatchEvent(event);\n }\n }, [prevChecked, checked, bubbles]);\n return /* @__PURE__ */ jsx(\n \"input\",\n {\n type: \"checkbox\",\n \"aria-hidden\": true,\n defaultChecked: checked,\n ...props,\n tabIndex: -1,\n ref: composedRefs,\n style: {\n ...props.style,\n ...controlSize,\n position: \"absolute\",\n pointerEvents: \"none\",\n opacity: 0,\n margin: 0\n }\n }\n );\n }\n);\nSwitchBubbleInput.displayName = BUBBLE_INPUT_NAME;\nfunction getState(checked) {\n return checked ? \"checked\" : \"unchecked\";\n}\nvar Root = Switch;\nvar Thumb = SwitchThumb;\nexport {\n Root,\n Switch,\n SwitchThumb,\n Thumb,\n createSwitchScope\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport type * as React from 'react';\n\nimport { cn } from '../utils';\n\nfunction Switch({\n className,\n size = 'default',\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: 'sm' | 'default' | 'lg';\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] data-[size=lg]:h-[24px] data-[size=lg]:w-[40px]',\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"bg-primary-foreground shadow-sm pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=lg]/switch:size-5 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import React from 'react';\nimport { Field, FieldError, FieldLabel } from '../../../shadcn/shadcnField';\nimport { Switch as ShadcnSwitch } from '../../../shadcn/shadcnSwitch';\nimport { withDisabledTip } from '../../utils/disabledTip';\nimport { lockedTip, PermissionLockIcon, usePermission } from '../PermissionGate';\n\nexport interface SwitchProps extends React.ComponentPropsWithoutRef<typeof ShadcnSwitch> {\n label?: React.ReactNode;\n\n description: React.ReactNode;\n\n error?: string;\n\n disabledTip?: string;\n\n permission?: string;\n}\n\n// Switch for toggling on/off; label + description on the left with the toggle pinned right (description required)\nexport const Switch = React.forwardRef<React.ElementRef<typeof ShadcnSwitch>, SwitchProps>(\n ({ label, description, error, disabledTip, permission, id, size = 'lg', ...props }, ref) => {\n const generatedId = React.useId();\n const fieldId = id || generatedId;\n const hasError = !!error;\n const gate = usePermission(permission);\n const { granted, locked, reason } = gate;\n\n // render = role: the role doesn't grant this action, so the control doesn't exist for this user\n if (!granted) {\n return null;\n }\n\n // enable = role ∧ plan ∧ BU: granted but locked renders disabled with the upsell as its tooltip\n const isDisabled = props.disabled || locked;\n const tip = locked ? lockedTip(gate) : disabledTip;\n\n return (\n <Field data-disabled={isDisabled} data-invalid={hasError}>\n {label && (\n <FieldLabel htmlFor={fieldId} className=\"flex cursor-pointer items-center gap-1.5\">\n {locked && <PermissionLockIcon reason={reason} className=\"size-3.5\" />}\n {label}\n </FieldLabel>\n )}\n <div className=\"flex min-h-9 items-center gap-3\">\n {description && (\n <label\n htmlFor={fieldId}\n id={`${fieldId}-description`}\n className=\"flex-1 cursor-pointer text-sm leading-snug text-muted-foreground\"\n >\n {description}\n </label>\n )}\n {withDisabledTip(\n <ShadcnSwitch\n {...props}\n ref={ref}\n id={fieldId}\n size={size}\n disabled={isDisabled}\n aria-describedby={description || error ? `${fieldId}-description ${fieldId}-error` : undefined}\n aria-invalid={hasError}\n />,\n tip,\n isDisabled,\n )}\n </div>\n {error && <FieldError id={`${fieldId}-error`}>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n\nexport type CompactSwitchProps = React.ComponentProps<typeof ShadcnSwitch> & {\n disabledTip?: string;\n permission?: string;\n};\n\n// Bare compact switch with no Field wrapper, defaults to sm size for dense layouts like table/matrix cells\nexport const CompactSwitch: React.FC<CompactSwitchProps> = ({ size = 'sm', disabledTip, permission, ...props }) => {\n const gate = usePermission(permission);\n const { granted, locked } = gate;\n if (!granted) return null;\n\n // No adornment slot here, so a locked switch reads as disabled with the upsell on hover\n const isDisabled = props.disabled || locked;\n const tip = locked ? lockedTip(gate) : disabledTip;\n return withDisabledTip(<ShadcnSwitch size={size} {...props} disabled={isDisabled} />, tip, isDisabled);\n};\n\nCompactSwitch.displayName = 'CompactSwitch';\n"],"names":["Switch","SwitchPrimitive.Root","SwitchPrimitive.Thumb","React","ShadcnSwitch"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -65,11 +65,10 @@ const TokenInput = React__default.forwardRef(
|
|
|
65
65
|
return /* @__PURE__ */ jsxs(Field, { "data-disabled": disabled, children: [
|
|
66
66
|
label && /* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
67
67
|
/* @__PURE__ */ jsxs(
|
|
68
|
-
"
|
|
68
|
+
"div",
|
|
69
69
|
{
|
|
70
|
-
|
|
71
|
-
disabled,
|
|
72
|
-
onClick: () => inputRef.current?.focus(),
|
|
70
|
+
"aria-disabled": disabled,
|
|
71
|
+
onClick: disabled ? void 0 : () => inputRef.current?.focus(),
|
|
73
72
|
"aria-invalid": !!error,
|
|
74
73
|
className: cn(
|
|
75
74
|
"flex min-h-11 flex-wrap items-center gap-2 rounded-md border bg-background px-2.5 py-2 text-left",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenInput.js","sources":["../../lib/components/TokenInput/TokenInput.tsx"],"sourcesContent":["import { Lock, X } from 'lucide-react';\nimport React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\nexport interface TokenInputProps {\n name?: string;\n value?: string[];\n onChange?: (value: string[]) => void;\n onBlur?: () => void;\n label?: React.ReactNode;\n description?: React.ReactNode;\n placeholder?: string;\n error?: string;\n disabled?: boolean;\n deletableValues?: string[];\n}\n\nexport const TokenInput = React.forwardRef<HTMLInputElement, TokenInputProps>(\n (\n { name, value, onChange, onBlur, label, description, placeholder = 'value', error, disabled, deletableValues },\n ref,\n ) => {\n const tokens = value ?? [];\n const [draft, setDraft] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n const initialValuesRef = React.useRef<string[]>(value ?? []);\n\n const assignRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const isRemovable = React.useCallback(\n (token: string) => {\n if (disabled) return false;\n if (deletableValues === undefined) return true;\n if (deletableValues.includes(token)) return true;\n return !initialValuesRef.current.includes(token);\n },\n [disabled, deletableValues],\n );\n\n const commit = () => {\n const next = draft.trim();\n setDraft('');\n if (disabled || !next || tokens.includes(next)) return;\n onChange?.([...tokens, next]);\n };\n\n const remove = (token: string) => {\n if (disabled || !isRemovable(token)) return;\n onChange?.(tokens.filter((t) => t !== token));\n inputRef.current?.focus();\n };\n\n const removeLastRemovable = () => {\n for (let i = tokens.length - 1; i >= 0; i--) {\n if (isRemovable(tokens[i])) {\n remove(tokens[i]);\n return;\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n event.stopPropagation();\n commit();\n return;\n }\n if (event.key === 'Backspace' && draft.length === 0 && tokens.length > 0) {\n event.preventDefault();\n removeLastRemovable();\n }\n };\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => inputRef.current?.focus()}\n aria-invalid={!!error}\n className={cn(\n 'flex min-h-11 flex-wrap items-center gap-2 rounded-md border bg-background px-2.5 py-2 text-left',\n 'focus-within:ring-2 focus-within:ring-ring',\n error && 'border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {tokens.map((token) => {\n const removable = isRemovable(token);\n return (\n <span\n key={token}\n className={cn(\n 'flex items-center gap-1.5 rounded-full border py-1 text-sm',\n removable ? 'bg-card pl-3 pr-1.5' : 'bg-muted px-3 text-muted-foreground',\n )}\n >\n {!removable && <Lock className=\"size-3\" aria-hidden=\"true\" />}\n {token}\n {removable ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n remove(token);\n }}\n aria-label={`Remove ${token}`}\n className=\"flex size-4 items-center justify-center rounded-full text-muted-foreground hover:text-destructive\"\n >\n <X className=\"size-3.5\" />\n </button>\n ) : (\n <span title=\"In use — cannot be removed\" className=\"sr-only\">\n In use — cannot be removed\n </span>\n )}\n </span>\n );\n })}\n <span className=\"flex items-center gap-1 rounded-full border border-dashed px-3 py-1 text-sm text-muted-foreground focus-within:border-ring focus-within:text-foreground\">\n +\n <input\n ref={assignRef}\n name={name}\n value={draft}\n disabled={disabled}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => {\n commit();\n onBlur?.();\n }}\n placeholder={placeholder}\n className=\"w-24 border-0 bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n />\n </span>\n </button>\n\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nTokenInput.displayName = 'TokenInput';\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TokenInput.js","sources":["../../lib/components/TokenInput/TokenInput.tsx"],"sourcesContent":["import { Lock, X } from 'lucide-react';\nimport React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Field, FieldDescription, FieldError, FieldLabel } from '../Field';\n\nexport interface TokenInputProps {\n name?: string;\n value?: string[];\n onChange?: (value: string[]) => void;\n onBlur?: () => void;\n label?: React.ReactNode;\n description?: React.ReactNode;\n placeholder?: string;\n error?: string;\n disabled?: boolean;\n deletableValues?: string[];\n}\n\nexport const TokenInput = React.forwardRef<HTMLInputElement, TokenInputProps>(\n (\n { name, value, onChange, onBlur, label, description, placeholder = 'value', error, disabled, deletableValues },\n ref,\n ) => {\n const tokens = value ?? [];\n const [draft, setDraft] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n const initialValuesRef = React.useRef<string[]>(value ?? []);\n\n const assignRef = React.useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const isRemovable = React.useCallback(\n (token: string) => {\n if (disabled) return false;\n if (deletableValues === undefined) return true;\n if (deletableValues.includes(token)) return true;\n return !initialValuesRef.current.includes(token);\n },\n [disabled, deletableValues],\n );\n\n const commit = () => {\n const next = draft.trim();\n setDraft('');\n if (disabled || !next || tokens.includes(next)) return;\n onChange?.([...tokens, next]);\n };\n\n const remove = (token: string) => {\n if (disabled || !isRemovable(token)) return;\n onChange?.(tokens.filter((t) => t !== token));\n inputRef.current?.focus();\n };\n\n const removeLastRemovable = () => {\n for (let i = tokens.length - 1; i >= 0; i--) {\n if (isRemovable(tokens[i])) {\n remove(tokens[i]);\n return;\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n event.stopPropagation();\n commit();\n return;\n }\n if (event.key === 'Backspace' && draft.length === 0 && tokens.length > 0) {\n event.preventDefault();\n removeLastRemovable();\n }\n };\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {/* A div, not a button: the tokens carry their own remove buttons and a button cannot contain\n one. The click only forwards focus to the input, which is itself a tab stop — so this adds\n a mouse target for the padding rather than any behaviour of its own. */}\n {/** biome-ignore lint/a11y/useKeyWithClickEvents: the nested input is the keyboard path */}\n {/** biome-ignore lint/a11y/noStaticElementInteractions: click-to-focus surface, not a control */}\n <div\n aria-disabled={disabled}\n onClick={disabled ? undefined : () => inputRef.current?.focus()}\n aria-invalid={!!error}\n className={cn(\n 'flex min-h-11 flex-wrap items-center gap-2 rounded-md border bg-background px-2.5 py-2 text-left',\n 'focus-within:ring-2 focus-within:ring-ring',\n error && 'border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n >\n {tokens.map((token) => {\n const removable = isRemovable(token);\n return (\n <span\n key={token}\n className={cn(\n 'flex items-center gap-1.5 rounded-full border py-1 text-sm',\n removable ? 'bg-card pl-3 pr-1.5' : 'bg-muted px-3 text-muted-foreground',\n )}\n >\n {!removable && <Lock className=\"size-3\" aria-hidden=\"true\" />}\n {token}\n {removable ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n remove(token);\n }}\n aria-label={`Remove ${token}`}\n className=\"flex size-4 items-center justify-center rounded-full text-muted-foreground hover:text-destructive\"\n >\n <X className=\"size-3.5\" />\n </button>\n ) : (\n <span title=\"In use — cannot be removed\" className=\"sr-only\">\n In use — cannot be removed\n </span>\n )}\n </span>\n );\n })}\n <span className=\"flex items-center gap-1 rounded-full border border-dashed px-3 py-1 text-sm text-muted-foreground focus-within:border-ring focus-within:text-foreground\">\n +\n <input\n ref={assignRef}\n name={name}\n value={draft}\n disabled={disabled}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => {\n commit();\n onBlur?.();\n }}\n placeholder={placeholder}\n className=\"w-24 border-0 bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n />\n </span>\n </div>\n\n {description && !error && <FieldDescription>{description}</FieldDescription>}\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n },\n);\n\nTokenInput.displayName = 'TokenInput';\n"],"names":["React"],"mappings":"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"}
|
package/dist/dropdown-menu.js
CHANGED
|
@@ -1193,5 +1193,5 @@ const DropdownMenuShortcut = ({ className, ...props }) => {
|
|
|
1193
1193
|
};
|
|
1194
1194
|
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
|
|
1195
1195
|
|
|
1196
|
-
export { DropdownMenu as D, DropdownMenuTrigger as a, DropdownMenuContent as b, DropdownMenuItem as c,
|
|
1196
|
+
export { DropdownMenu as D, DropdownMenuTrigger as a, DropdownMenuContent as b, DropdownMenuItem as c, DropdownMenuShortcut as d, DropdownMenuGroup as e, DropdownMenuLabel as f, DropdownMenuSub as g, DropdownMenuSubTrigger as h, DropdownMenuPortal as i, DropdownMenuSubContent as j, DropdownMenuRadioGroup as k, DropdownMenuRadioItem as l, DropdownMenuCheckboxItem as m, DropdownMenuSeparator as n };
|
|
1197
1197
|
//# sourceMappingURL=dropdown-menu.js.map
|
package/dist/index.js
CHANGED
|
@@ -72,6 +72,8 @@ export { j as MultiSelect, S as Select, u as useSelect } from './Select.js';
|
|
|
72
72
|
export { MultiSelectActions, MultiSelectContent, MultiSelectEmpty, MultiSelectGroup, MultiSelectGroupLabel, MultiSelectList, MultiSelectRoot, MultiSelectRow, MultiSelectSearch, MultiSelectTrigger, SingleSelectClear, SingleSelectContent, SingleSelectEmpty, SingleSelectGroup, SingleSelectGroupLabel, SingleSelectList, SingleSelectRoot, SingleSelectRow, SingleSelectSearch, SingleSelectTrigger } from './components/Select.js';
|
|
73
73
|
export { M as MultiSelectFilter, S as SelectFilter, a as SingleSelectFilter } from './SelectFilter.js';
|
|
74
74
|
export { O as OTPField } from './OTPField.js';
|
|
75
|
+
export { O as OfferingSelector } from './OfferingSelector.js';
|
|
76
|
+
export { O as OfferingVariantSelector } from './OfferingVariantSelector.js';
|
|
75
77
|
export { P as PageContent, a as PageContentDetails, b as PageContentPanel, c as PanelSkeleton, S as SidePanelListItem } from './PageContent.js';
|
|
76
78
|
export { P as PageHeader, a as PageHeaderSkeleton } from './PageHeaderSkeleton.js';
|
|
77
79
|
export { P as PasswordField } from './PasswordField.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../lib/components/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAMtF,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,QAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../../lib/components/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAMtF,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,QAAA,MAAM,MAAM,oGAsEX,CAAC;AAIF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../../lib/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../../lib/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA6B/B,OAAO,KAAK,EAAkB,iBAAiB,EAAY,MAAM,SAAS,CAAC;AAqL3E,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8EpD,CAAC"}
|
|
@@ -5,6 +5,8 @@ export interface MenuItemBase {
|
|
|
5
5
|
label: string;
|
|
6
6
|
icon?: LucideIcon;
|
|
7
7
|
disabled?: boolean;
|
|
8
|
+
permission?: string;
|
|
9
|
+
hidden?: boolean;
|
|
8
10
|
}
|
|
9
11
|
export interface StandardMenuItem extends MenuItemBase {
|
|
10
12
|
type: 'item';
|
|
@@ -53,6 +55,8 @@ export interface CustomMenuItem {
|
|
|
53
55
|
asMenuItem?: boolean;
|
|
54
56
|
onClick?: () => void;
|
|
55
57
|
disabled?: boolean;
|
|
58
|
+
permission?: string;
|
|
59
|
+
hidden?: boolean;
|
|
56
60
|
}
|
|
57
61
|
export interface DialogMenuItem extends MenuItemBase {
|
|
58
62
|
type: 'dialog';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../lib/components/DropdownMenu/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../lib/components/DropdownMenu/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import { ServiceCode } from '../../types/catalog-resolver';
|
|
3
|
-
export type PermissionLockReason = 'PLAN' | '
|
|
2
|
+
import { ScopeType, ServiceCode } from '../../types/catalog-resolver';
|
|
3
|
+
export type PermissionLockReason = 'PLAN' | 'WORKSPACE' | 'SERVICE';
|
|
4
4
|
export interface PermissionGateResult {
|
|
5
5
|
granted: boolean;
|
|
6
6
|
locked: boolean;
|
|
@@ -9,6 +9,8 @@ export interface PermissionGateResult {
|
|
|
9
9
|
missingServices: ServiceCode[];
|
|
10
10
|
available: boolean;
|
|
11
11
|
featureName: string | null;
|
|
12
|
+
workspaceLabel: string | null;
|
|
13
|
+
workspaceScope: ScopeType | null;
|
|
12
14
|
}
|
|
13
15
|
export type PermissionGateFn = (code: string) => PermissionGateResult;
|
|
14
16
|
export declare const PermissionGateProvider: React.Provider<PermissionGateFn | null>;
|
|
@@ -18,7 +20,7 @@ export declare const PermissionLockIcon: React.FC<{
|
|
|
18
20
|
reason: PermissionLockReason | null;
|
|
19
21
|
className?: string;
|
|
20
22
|
}>;
|
|
21
|
-
export declare function lockedTip({ reason, unlockPlans, missingServices, }: Pick<PermissionGateResult, 'reason' | 'unlockPlans'> & Partial<Pick<PermissionGateResult, 'missingServices'>>): string;
|
|
23
|
+
export declare function lockedTip({ reason, unlockPlans, missingServices, workspaceLabel, workspaceScope, }: Pick<PermissionGateResult, 'reason' | 'unlockPlans'> & Partial<Pick<PermissionGateResult, 'missingServices' | 'workspaceLabel' | 'workspaceScope'>>): string;
|
|
22
24
|
export interface PermissionGateProps {
|
|
23
25
|
permission?: string;
|
|
24
26
|
children: React.ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionGate.d.ts","sourceRoot":"","sources":["../../../../lib/components/PermissionGate/PermissionGate.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"PermissionGate.d.ts","sourceRoot":"","sources":["../../../../lib/components/PermissionGate/PermissionGate.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAG3E,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpC,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,SAAS,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,oBAAoB,CAAC;AAsBtE,eAAO,MAAM,sBAAsB,yCAAiC,CAAC;AAGrE,wBAAgB,iBAAiB,IAAI,gBAAgB,CAEpD;AAGD,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAGjE;AAID,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAYpG,CAAC;AAmBF,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,WAAW,EACX,eAAoB,EACpB,cAAqB,EACrB,cAAqB,GACtB,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,aAAa,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAStG;AAgDD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,oBAAoB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;CACnH;AAWD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAMxD,CAAC"}
|
|
@@ -5,10 +5,12 @@ export interface SwitchProps extends React.ComponentPropsWithoutRef<typeof Shadc
|
|
|
5
5
|
description: React.ReactNode;
|
|
6
6
|
error?: string;
|
|
7
7
|
disabledTip?: string;
|
|
8
|
+
permission?: string;
|
|
8
9
|
}
|
|
9
10
|
export declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
|
|
10
11
|
export type CompactSwitchProps = React.ComponentProps<typeof ShadcnSwitch> & {
|
|
11
12
|
disabledTip?: string;
|
|
13
|
+
permission?: string;
|
|
12
14
|
};
|
|
13
15
|
export declare const CompactSwitch: React.FC<CompactSwitchProps>;
|
|
14
16
|
//# sourceMappingURL=Switch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../../lib/components/Switch/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../../lib/components/Switch/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAItE,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,YAAY,CAAC;IACtF,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAExB,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAE7B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,eAAO,MAAM,MAAM,uFAqDlB,CAAC;AAIF,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,GAAG;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAStD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenInput.d.ts","sourceRoot":"","sources":["../../../../lib/components/TokenInput/TokenInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"TokenInput.d.ts","sourceRoot":"","sources":["../../../../lib/components/TokenInput/TokenInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,UAAU,0FA+ItB,CAAC"}
|
|
@@ -19,6 +19,8 @@ export * from './lot';
|
|
|
19
19
|
export * from './microfrontend';
|
|
20
20
|
export * from './modifier-group';
|
|
21
21
|
export * from './plan';
|
|
22
|
+
export * from './offering';
|
|
23
|
+
export * from './offering-variant';
|
|
22
24
|
export * from './purchase-order';
|
|
23
25
|
export * from './quant';
|
|
24
26
|
export * from './region';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/selects/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/selects/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { SelectProps } from '../../components/Select/Select';
|
|
2
|
+
export type OfferingSelectorProps = SelectProps;
|
|
3
|
+
export declare const OfferingSelector: import('react').ForwardRefExoticComponent<SelectProps & import('react').RefAttributes<HTMLButtonElement>>;
|
|
4
|
+
//# sourceMappingURL=OfferingSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfferingSelector.d.ts","sourceRoot":"","sources":["../../../../lib/selects/offering/OfferingSelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG,WAAW,CAAC;AAKhD,eAAO,MAAM,gBAAgB,2GAU3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/selects/offering/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SelectProps } from '../../components/Select/Select';
|
|
2
|
+
export interface OfferingVariantSelectorProps extends SelectProps {
|
|
3
|
+
offeringId: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const OfferingVariantSelector: import('react').ForwardRefExoticComponent<OfferingVariantSelectorProps & import('react').RefAttributes<HTMLButtonElement>>;
|
|
6
|
+
//# sourceMappingURL=OfferingVariantSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OfferingVariantSelector.d.ts","sourceRoot":"","sources":["../../../../lib/selects/offering-variant/OfferingVariantSelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,WAAW,4BAA6B,SAAQ,WAAW;IAE/D,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,eAAO,MAAM,uBAAuB,4HAanC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/selects/offering-variant/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,KAAK,4BAA4B,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -23,7 +23,7 @@ export interface PlatformDenyCodes {
|
|
|
23
23
|
}
|
|
24
24
|
export type FeatureUnlocks = Record<string, PlatformCodes>;
|
|
25
25
|
export type FeatureLocks = Record<string, PlatformDenyCodes>;
|
|
26
|
-
export type
|
|
26
|
+
export type WorkspaceFeatureLocks = FeatureLocks;
|
|
27
27
|
export interface PermissionGroupRef {
|
|
28
28
|
code: string;
|
|
29
29
|
label: string;
|
|
@@ -125,7 +125,7 @@ export interface VersionSnapshot {
|
|
|
125
125
|
}
|
|
126
126
|
export declare function snapshotFeatureKey(code: string, scope: ScopeType): string;
|
|
127
127
|
export declare const SNAPSHOT_SCHEMA_VERSION = 6;
|
|
128
|
-
export type LockReason = 'PLAN' | '
|
|
128
|
+
export type LockReason = 'PLAN' | 'WORKSPACE' | 'SERVICE';
|
|
129
129
|
export interface CatalogPermission {
|
|
130
130
|
code: string;
|
|
131
131
|
locked: boolean;
|
|
@@ -205,7 +205,7 @@ export interface SiteMatrix {
|
|
|
205
205
|
name: string;
|
|
206
206
|
};
|
|
207
207
|
apps: SiteMatrixApp[];
|
|
208
|
-
locks:
|
|
208
|
+
locks: WorkspaceFeatureLocks;
|
|
209
209
|
}
|
|
210
210
|
export type RevokedGrants = Record<string, PlatformDenyCodes>;
|
|
211
211
|
export type ClientPlatform = 'web' | 'ios' | 'android' | 'graphql' | 'http';
|
|
@@ -246,7 +246,7 @@ export interface ResolveUserFeaturesParams {
|
|
|
246
246
|
snapshot: VersionSnapshot;
|
|
247
247
|
businessCode: string;
|
|
248
248
|
planCode: string | undefined;
|
|
249
|
-
|
|
249
|
+
workspaceLocks: WorkspaceFeatureLocks | undefined;
|
|
250
250
|
roleFeatures: FeatureUnlocks;
|
|
251
251
|
platform: ClientPlatform;
|
|
252
252
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-resolver.d.ts","sourceRoot":"","sources":["../../../lib/types/catalog-resolver.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,eAAO,MAAM,SAAS,EAAE,cAAc,EAAyC,CAAC;AAGhF,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEhD,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAAsB,CAAC;AAGlE,eAAO,MAAM,YAAY,8BAA+B,CAAC;AACzD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAGvD,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;AAElE,eAAO,MAAM,WAAW,EAAE,SAAS,EAAwB,CAAC;AAE5D,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAwC,CAAC;AACrG,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,CAAwC,CAAC;AAErG,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,IAAI,SAAS,CAEvE;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAC7D,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"catalog-resolver.d.ts","sourceRoot":"","sources":["../../../lib/types/catalog-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offering-variant.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offering.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-resolver.js","sources":["../../lib/types/catalog-resolver.ts"],"sourcesContent":["// Frontend mirror of @vritti/api-sdk/catalog-resolver types — keep field-for-field in sync\n\n/**\n * The surfaces a permission can be granted on.\n *\n * `web` and `mobile` are UI buckets, reached by loading a microfrontend. `graphql` and `http` are\n * API surfaces a credential signs its own requests against — no microfrontend and no route, so a\n * headless feature is grantable there and nowhere else, and each surface is entitled independently.\n */\nexport type PlatformBucket = 'web' | 'mobile' | 'graphql' | 'http';\n\nexport const PLATFORMS: PlatformBucket[] = ['web', 'mobile', 'graphql', 'http'];\n\n/** Buckets that reach their feature through a microfrontend, and so require one to resolve. */\nexport type UiPlatformBucket = 'web' | 'mobile';\n\nexport const UI_PLATFORMS: UiPlatformBucket[] = ['web', 'mobile'];\n\n// The API surfaces an app credential can present — the values of core's `app_type` enum\nexport const API_SURFACES = ['GRAPHQL', 'HTTP'] as const;\nexport type ApiSurface = (typeof API_SURFACES)[number];\n\n/** Buckets that admit an API credential rather than a person — exactly one per surface. */\nexport type ApiBucket = Exclude<PlatformBucket, UiPlatformBucket>;\n\nexport const API_BUCKETS: ApiBucket[] = ['graphql', 'http'];\n\nexport const SURFACE_BY_BUCKET: Record<ApiBucket, ApiSurface> = { graphql: 'GRAPHQL', http: 'HTTP' };\nexport const BUCKET_BY_SURFACE: Record<ApiSurface, ApiBucket> = { GRAPHQL: 'graphql', HTTP: 'http' };\n\nexport function isApiBucket(bucket: PlatformBucket): bucket is ApiBucket {\n return bucket === 'graphql' || bucket === 'http';\n}\n\nexport interface PlatformCodes {\n web?: string[];\n mobile?: string[];\n graphql?: string[];\n http?: string[];\n}\n\nexport interface PlatformDenyCodes {\n web?: string[] | null;\n mobile?: string[] | null;\n graphql?: string[] | null;\n http?: string[] | null;\n}\n\nexport type FeatureUnlocks = Record<string, PlatformCodes>;\n\nexport type FeatureLocks = Record<string, PlatformDenyCodes>;\nexport type
|
|
1
|
+
{"version":3,"file":"catalog-resolver.js","sources":["../../lib/types/catalog-resolver.ts"],"sourcesContent":["// Frontend mirror of @vritti/api-sdk/catalog-resolver types — keep field-for-field in sync\n\n/**\n * The surfaces a permission can be granted on.\n *\n * `web` and `mobile` are UI buckets, reached by loading a microfrontend. `graphql` and `http` are\n * API surfaces a credential signs its own requests against — no microfrontend and no route, so a\n * headless feature is grantable there and nowhere else, and each surface is entitled independently.\n */\nexport type PlatformBucket = 'web' | 'mobile' | 'graphql' | 'http';\n\nexport const PLATFORMS: PlatformBucket[] = ['web', 'mobile', 'graphql', 'http'];\n\n/** Buckets that reach their feature through a microfrontend, and so require one to resolve. */\nexport type UiPlatformBucket = 'web' | 'mobile';\n\nexport const UI_PLATFORMS: UiPlatformBucket[] = ['web', 'mobile'];\n\n// The API surfaces an app credential can present — the values of core's `app_type` enum\nexport const API_SURFACES = ['GRAPHQL', 'HTTP'] as const;\nexport type ApiSurface = (typeof API_SURFACES)[number];\n\n/** Buckets that admit an API credential rather than a person — exactly one per surface. */\nexport type ApiBucket = Exclude<PlatformBucket, UiPlatformBucket>;\n\nexport const API_BUCKETS: ApiBucket[] = ['graphql', 'http'];\n\nexport const SURFACE_BY_BUCKET: Record<ApiBucket, ApiSurface> = { graphql: 'GRAPHQL', http: 'HTTP' };\nexport const BUCKET_BY_SURFACE: Record<ApiSurface, ApiBucket> = { GRAPHQL: 'graphql', HTTP: 'http' };\n\nexport function isApiBucket(bucket: PlatformBucket): bucket is ApiBucket {\n return bucket === 'graphql' || bucket === 'http';\n}\n\nexport interface PlatformCodes {\n web?: string[];\n mobile?: string[];\n graphql?: string[];\n http?: string[];\n}\n\nexport interface PlatformDenyCodes {\n web?: string[] | null;\n mobile?: string[] | null;\n graphql?: string[] | null;\n http?: string[] | null;\n}\n\nexport type FeatureUnlocks = Record<string, PlatformCodes>;\n\nexport type FeatureLocks = Record<string, PlatformDenyCodes>;\nexport type WorkspaceFeatureLocks = FeatureLocks;\n\nexport interface PermissionGroupRef {\n code: string;\n label: string;\n sortOrder: number;\n}\n\nexport interface SnapshotPermission {\n code: string;\n label: string;\n isGlobal: boolean;\n businesses: string[];\n dependsOn: string[];\n platforms: PlatformBucket[];\n group?: string;\n}\n\nexport interface SnapshotMicrofrontendWeb {\n code: string;\n name: string;\n remoteEntry: string;\n exposedModule: string;\n routePrefix: string;\n}\n\nexport interface SnapshotMicrofrontendMobile {\n code: string;\n name: string;\n remoteEntryAndroid: string;\n remoteEntryIos: string;\n exposedModule: string;\n routePrefix: string;\n}\n\nexport interface SnapshotMicrofrontends {\n web?: SnapshotMicrofrontendWeb;\n mobile?: SnapshotMicrofrontendMobile;\n}\n\nexport type ScopeType = 'ORG' | 'LE' | 'SITE_GROUP' | 'SITE';\nexport type SiteType = 'OUTLET' | 'WAREHOUSE' | 'PRODUCTION';\nexport const SERVICE_CODES = ['GITEA'] as const;\nexport type ServiceCode = (typeof SERVICE_CODES)[number];\nexport interface SnapshotFeature {\n code: string;\n name: string;\n lucideIcon: string;\n sfSymbol: string;\n materialSymbol: string;\n scope: ScopeType;\n applicableSiteTypes: SiteType[];\n permissions: SnapshotPermission[];\n microfrontends: SnapshotMicrofrontends;\n requiredServices: ServiceCode[];\n permissionGroups: PermissionGroupRef[];\n // Strict — it decides which of the `graphql`/`http` buckets the feature offers at all\n apiSurfaces: ApiSurface[];\n}\n\nexport interface SnapshotAppFeatureRef {\n code: string;\n scope: ScopeType;\n}\n\nexport interface SnapshotApp {\n code: string;\n name: string;\n icon: string;\n sortOrder: number;\n features: SnapshotAppFeatureRef[];\n}\n\nexport interface SnapshotRoleTemplate {\n name: string;\n code: string;\n scope: ScopeType;\n siteType: SiteType;\n features: FeatureUnlocks;\n}\n\nexport interface SnapshotPlan {\n code: string;\n name: string;\n isCustom: boolean;\n maxSites: number | null;\n unlockedPermissions: FeatureUnlocks;\n}\n\nexport interface VocabularyEntry {\n singular: string;\n plural: string;\n}\nexport interface BusinessVocabulary {\n site?: VocabularyEntry;\n siteGroup?: VocabularyEntry;\n outlet?: VocabularyEntry;\n warehouse?: VocabularyEntry;\n production?: VocabularyEntry;\n}\nexport interface SnapshotBusiness {\n name: string;\n vocabulary?: BusinessVocabulary;\n roleTemplates: Record<string, SnapshotRoleTemplate>;\n plans: Record<string, SnapshotPlan>;\n}\n\nexport interface VersionSnapshot {\n schemaVersion?: number;\n // Flat feature dictionary keyed by `${scope}.${code}` (see snapshotFeatureKey) — same-code features at different scopes stay distinct\n features: Record<string, SnapshotFeature>;\n apps: SnapshotApp[];\n businesses: Record<string, SnapshotBusiness>;\n}\n\n// Composite key for the snapshot feature dictionary — feature identity is (scope, code)\nexport function snapshotFeatureKey(code: string, scope: ScopeType): string {\n return `${scope}.${code}`;\n}\n\nexport const SNAPSHOT_SCHEMA_VERSION = 6;\n\nexport type LockReason = 'PLAN' | 'WORKSPACE' | 'SERVICE';\n\nexport interface CatalogPermission {\n code: string;\n locked: boolean;\n lockReason: LockReason | null;\n unlockPlans: string[];\n missingServices: ServiceCode[];\n}\n\nexport interface FeatureCatalogEntry {\n code: string;\n name: string;\n lucideIcon: string | null;\n sfSymbol: string;\n materialSymbol: string;\n web: {\n remoteEntry: string;\n exposedModule: string;\n routePrefix: string;\n } | null;\n mobile: {\n remoteEntryAndroid: string;\n remoteEntryIos: string;\n exposedModule: string;\n routePrefix: string;\n } | null;\n appCode: string;\n appName: string;\n appIcon: string | null;\n appSortOrder: number;\n locked: boolean;\n lockReason: LockReason | null;\n unlockPlans: string[];\n missingServices: ServiceCode[];\n permissions: CatalogPermission[];\n}\n\nexport type RoleItem = SnapshotRoleTemplate;\n\nexport interface SiteMatrixCell {\n inPlan: boolean;\n selected: boolean;\n availableIn: string[];\n}\n\nexport interface SiteMatrixPermission {\n code: string;\n label: string;\n dependsOn: string[];\n group?: PermissionGroupRef;\n web: SiteMatrixCell | null;\n mobile: SiteMatrixCell | null;\n graphql: SiteMatrixCell | null;\n http: SiteMatrixCell | null;\n}\n\nexport interface SiteMatrixFeature {\n code: string;\n name: string;\n icon: string | null;\n scope: ScopeType;\n applicableSiteTypes: SiteType[];\n platforms: PlatformBucket[];\n inPlan: boolean;\n availableIn: string[];\n // API surfaces the feature declares — lets the app-credential editor filter by credential type\n apiSurfaces: ApiSurface[];\n permissions: SiteMatrixPermission[];\n}\n\nexport interface MatrixCounts {\n unlocked: number;\n total: number;\n}\n\nexport interface SiteMatrixApp {\n code: string;\n name: string;\n icon: string | null;\n counts: Record<PlatformBucket, MatrixCounts>;\n features: SiteMatrixFeature[];\n}\n\nexport interface SiteMatrix {\n plan: { code: string; name: string };\n apps: SiteMatrixApp[];\n locks: WorkspaceFeatureLocks;\n}\n\nexport type RevokedGrants = Record<string, PlatformDenyCodes>;\n\nexport type ClientPlatform = 'web' | 'ios' | 'android' | 'graphql' | 'http';\n\nexport interface LockedPermission {\n code: string;\n reason: LockReason | null;\n unlockPlans: string[];\n missingServices: ServiceCode[];\n}\n\nexport interface PlanUpsell {\n plan: string;\n features: string[];\n}\n\nexport interface PermissionFeature {\n code: string;\n name: string;\n lucideIcon: string | null;\n sfSymbol: string;\n materialSymbol: string;\n permissions: string[];\n locked: boolean;\n lockReason: LockReason | null;\n unlockPlans: string[];\n // Which declared services the org has not provisioned — empty unless lockReason is 'SERVICE'\n missingServices: ServiceCode[];\n lockedPermissions: LockedPermission[];\n upsell: PlanUpsell[];\n route: {\n remoteEntry: string;\n exposedModule: string;\n routePrefix: string;\n };\n appCode: string;\n appName: string;\n appIcon: string | null;\n appSortOrder: number;\n}\n\nexport interface ResolveUserFeaturesParams {\n snapshot: VersionSnapshot;\n businessCode: string;\n planCode: string | undefined;\n workspaceLocks: WorkspaceFeatureLocks | undefined;\n roleFeatures: FeatureUnlocks;\n platform: ClientPlatform;\n}\n\nexport interface ComposeRoleGrantsParams {\n baseFeatures: FeatureUnlocks | undefined;\n additions: FeatureUnlocks;\n revoked: RevokedGrants | undefined;\n}\n"],"names":[],"mappings":"AAWO,MAAM,SAAA,GAA8B,CAAC,KAAA,EAAO,QAAA,EAAU,WAAW,MAAM;AAKvE,MAAM,YAAA,GAAmC,CAAC,KAAA,EAAO,QAAQ;AAGzD,MAAM,YAAA,GAAe,CAAC,SAAA,EAAW,MAAM;AAMvC,MAAM,WAAA,GAA2B,CAAC,SAAA,EAAW,MAAM;AAEnD,MAAM,iBAAA,GAAmD,EAAE,OAAA,EAAS,SAAA,EAAW,MAAM,MAAA;AACrF,MAAM,iBAAA,GAAmD,EAAE,OAAA,EAAS,SAAA,EAAW,MAAM,MAAA;AAErF,SAAS,YAAY,MAAA,EAA6C;AACvE,EAAA,OAAO,MAAA,KAAW,aAAa,MAAA,KAAW,MAAA;AAC5C;AA6DO,MAAM,aAAA,GAAgB,CAAC,OAAO;AA0E9B,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAA0B;AACzE,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACzB;AAEO,MAAM,uBAAA,GAA0B;;;;"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.5.0",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"sideEffects": false,
|
|
11
11
|
"repository": {
|
|
@@ -224,6 +224,14 @@
|
|
|
224
224
|
"types": "./dist/lib/selects/feature-permission/index.d.ts",
|
|
225
225
|
"import": "./dist/selects/feature-permission.js"
|
|
226
226
|
},
|
|
227
|
+
"./selects/offering": {
|
|
228
|
+
"types": "./dist/lib/selects/offering/index.d.ts",
|
|
229
|
+
"import": "./dist/selects/offering.js"
|
|
230
|
+
},
|
|
231
|
+
"./selects/offering-variant": {
|
|
232
|
+
"types": "./dist/lib/selects/offering-variant/index.d.ts",
|
|
233
|
+
"import": "./dist/selects/offering-variant.js"
|
|
234
|
+
},
|
|
227
235
|
"./selects/permission-group": {
|
|
228
236
|
"types": "./dist/lib/selects/permission-group/index.d.ts",
|
|
229
237
|
"import": "./dist/selects/permission-group.js"
|