@omnibase/shadcn 0.6.2 → 0.7.2
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/index.cjs +265 -229
- package/dist/index.d.cts +16 -3
- package/dist/index.d.ts +16 -3
- package/dist/index.js +264 -229
- package/package.json +7 -3
package/dist/index.cjs
CHANGED
|
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
// src/index.ts
|
|
32
32
|
var index_exports = {};
|
|
33
33
|
__export(index_exports, {
|
|
34
|
+
ErrorForm: () => ErrorForm,
|
|
34
35
|
LoginForm: () => LoginForm,
|
|
35
36
|
PermissionsSelector: () => PermissionsSelector,
|
|
36
37
|
PricingTable: () => PricingTable,
|
|
@@ -916,6 +917,27 @@ function SettingsForm({ flow }) {
|
|
|
916
917
|
] });
|
|
917
918
|
}
|
|
918
919
|
|
|
920
|
+
// src/form/error.tsx
|
|
921
|
+
var import_jsx_runtime19 = require("react/jsx-runtime");
|
|
922
|
+
function ErrorForm({
|
|
923
|
+
error,
|
|
924
|
+
login_url = "/auth/login",
|
|
925
|
+
Header
|
|
926
|
+
}) {
|
|
927
|
+
const errorDetails = error.error;
|
|
928
|
+
return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(Card, { className: "w-full max-w-md mx-auto", children: [
|
|
929
|
+
Header && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardTitle, { className: "text-center pb-1", children: Header }) }),
|
|
930
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(CardContent, { className: "space-y-4", children: [
|
|
931
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(Alert, { variant: "destructive", children: [
|
|
932
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AlertTitle, { children: errorDetails?.status || "Authentication Error" }),
|
|
933
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(AlertDescription, { children: errorDetails?.message || "An unexpected error occurred." })
|
|
934
|
+
] }),
|
|
935
|
+
errorDetails?.reason && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-sm text-muted-foreground", children: errorDetails.reason }),
|
|
936
|
+
/* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Button, { asChild: true, className: "w-full", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("a", { href: login_url, children: "Back to Login" }) })
|
|
937
|
+
] })
|
|
938
|
+
] }) });
|
|
939
|
+
}
|
|
940
|
+
|
|
919
941
|
// src/tenant-switcher/index.tsx
|
|
920
942
|
var React10 = __toESM(require("react"), 1);
|
|
921
943
|
|
|
@@ -923,10 +945,10 @@ var React10 = __toESM(require("react"), 1);
|
|
|
923
945
|
var React9 = __toESM(require("react"), 1);
|
|
924
946
|
var SelectPrimitive = __toESM(require("@radix-ui/react-select"), 1);
|
|
925
947
|
var import_lucide_react = require("lucide-react");
|
|
926
|
-
var
|
|
948
|
+
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
927
949
|
var Select = SelectPrimitive.Root;
|
|
928
950
|
var SelectValue = SelectPrimitive.Value;
|
|
929
|
-
var SelectTrigger = React9.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0,
|
|
951
|
+
var SelectTrigger = React9.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
930
952
|
SelectPrimitive.Trigger,
|
|
931
953
|
{
|
|
932
954
|
ref,
|
|
@@ -937,12 +959,12 @@ var SelectTrigger = React9.forwardRef(({ className, children, ...props }, ref) =
|
|
|
937
959
|
...props,
|
|
938
960
|
children: [
|
|
939
961
|
children,
|
|
940
|
-
/* @__PURE__ */ (0,
|
|
962
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react.ChevronDown, { className: "h-4 w-4 opacity-50" }) })
|
|
941
963
|
]
|
|
942
964
|
}
|
|
943
965
|
));
|
|
944
966
|
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
945
|
-
var SelectScrollUpButton = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
967
|
+
var SelectScrollUpButton = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
946
968
|
SelectPrimitive.ScrollUpButton,
|
|
947
969
|
{
|
|
948
970
|
ref,
|
|
@@ -951,11 +973,11 @@ var SelectScrollUpButton = React9.forwardRef(({ className, ...props }, ref) => /
|
|
|
951
973
|
className
|
|
952
974
|
),
|
|
953
975
|
...props,
|
|
954
|
-
children: /* @__PURE__ */ (0,
|
|
976
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react.ChevronUp, { className: "h-4 w-4" })
|
|
955
977
|
}
|
|
956
978
|
));
|
|
957
979
|
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
958
|
-
var SelectScrollDownButton = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
980
|
+
var SelectScrollDownButton = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
959
981
|
SelectPrimitive.ScrollDownButton,
|
|
960
982
|
{
|
|
961
983
|
ref,
|
|
@@ -964,11 +986,11 @@ var SelectScrollDownButton = React9.forwardRef(({ className, ...props }, ref) =>
|
|
|
964
986
|
className
|
|
965
987
|
),
|
|
966
988
|
...props,
|
|
967
|
-
children: /* @__PURE__ */ (0,
|
|
989
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react.ChevronDown, { className: "h-4 w-4" })
|
|
968
990
|
}
|
|
969
991
|
));
|
|
970
992
|
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
971
|
-
var SelectContent = React9.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ (0,
|
|
993
|
+
var SelectContent = React9.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
972
994
|
SelectPrimitive.Content,
|
|
973
995
|
{
|
|
974
996
|
ref,
|
|
@@ -980,8 +1002,8 @@ var SelectContent = React9.forwardRef(({ className, children, position = "popper
|
|
|
980
1002
|
position,
|
|
981
1003
|
...props,
|
|
982
1004
|
children: [
|
|
983
|
-
/* @__PURE__ */ (0,
|
|
984
|
-
/* @__PURE__ */ (0,
|
|
1005
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectScrollUpButton, {}),
|
|
1006
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
985
1007
|
SelectPrimitive.Viewport,
|
|
986
1008
|
{
|
|
987
1009
|
className: cn(
|
|
@@ -991,12 +1013,12 @@ var SelectContent = React9.forwardRef(({ className, children, position = "popper
|
|
|
991
1013
|
children
|
|
992
1014
|
}
|
|
993
1015
|
),
|
|
994
|
-
/* @__PURE__ */ (0,
|
|
1016
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectScrollDownButton, {})
|
|
995
1017
|
]
|
|
996
1018
|
}
|
|
997
1019
|
) }));
|
|
998
1020
|
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
999
|
-
var SelectLabel = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1021
|
+
var SelectLabel = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
1000
1022
|
SelectPrimitive.Label,
|
|
1001
1023
|
{
|
|
1002
1024
|
ref,
|
|
@@ -1005,7 +1027,7 @@ var SelectLabel = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
1005
1027
|
}
|
|
1006
1028
|
));
|
|
1007
1029
|
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
1008
|
-
var SelectItem = React9.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1030
|
+
var SelectItem = React9.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
1009
1031
|
SelectPrimitive.Item,
|
|
1010
1032
|
{
|
|
1011
1033
|
ref,
|
|
@@ -1015,13 +1037,13 @@ var SelectItem = React9.forwardRef(({ className, children, ...props }, ref) => /
|
|
|
1015
1037
|
),
|
|
1016
1038
|
...props,
|
|
1017
1039
|
children: [
|
|
1018
|
-
/* @__PURE__ */ (0,
|
|
1019
|
-
/* @__PURE__ */ (0,
|
|
1040
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_lucide_react.Check, { className: "h-4 w-4" }) }) }),
|
|
1041
|
+
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)(SelectPrimitive.ItemText, { children })
|
|
1020
1042
|
]
|
|
1021
1043
|
}
|
|
1022
1044
|
));
|
|
1023
1045
|
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
1024
|
-
var SelectSeparator = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0,
|
|
1046
|
+
var SelectSeparator = React9.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
|
|
1025
1047
|
SelectPrimitive.Separator,
|
|
1026
1048
|
{
|
|
1027
1049
|
ref,
|
|
@@ -1032,24 +1054,31 @@ var SelectSeparator = React9.forwardRef(({ className, ...props }, ref) => /* @__
|
|
|
1032
1054
|
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
1033
1055
|
|
|
1034
1056
|
// src/tenant-switcher/index.tsx
|
|
1035
|
-
var
|
|
1057
|
+
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
1058
|
+
var CREATE_TENANT_VALUE = "__create_tenant__";
|
|
1036
1059
|
function SwitchActiveTenant({
|
|
1037
1060
|
tenants,
|
|
1038
1061
|
currentTenantId,
|
|
1039
1062
|
formAction,
|
|
1040
1063
|
placeholder = "Select tenant...",
|
|
1041
1064
|
className,
|
|
1042
|
-
onTenantChange
|
|
1065
|
+
onTenantChange,
|
|
1066
|
+
onCreateTenant,
|
|
1067
|
+
createTenantLabel = "Create Tenant"
|
|
1043
1068
|
}) {
|
|
1044
1069
|
const [isLoading, setIsLoading] = React10.useState(false);
|
|
1045
|
-
const handleTenantChange = async (
|
|
1046
|
-
if (
|
|
1070
|
+
const handleTenantChange = async (value) => {
|
|
1071
|
+
if (value === CREATE_TENANT_VALUE) {
|
|
1072
|
+
onCreateTenant?.();
|
|
1073
|
+
return;
|
|
1074
|
+
}
|
|
1075
|
+
if (value === currentTenantId) return;
|
|
1047
1076
|
setIsLoading(true);
|
|
1048
1077
|
try {
|
|
1049
|
-
onTenantChange?.(
|
|
1078
|
+
onTenantChange?.(value);
|
|
1050
1079
|
if (formAction) {
|
|
1051
1080
|
const formData = new FormData();
|
|
1052
|
-
formData.append("tenant_id",
|
|
1081
|
+
formData.append("tenant_id", value);
|
|
1053
1082
|
await formAction(formData);
|
|
1054
1083
|
}
|
|
1055
1084
|
} catch (error) {
|
|
@@ -1059,15 +1088,21 @@ function SwitchActiveTenant({
|
|
|
1059
1088
|
}
|
|
1060
1089
|
};
|
|
1061
1090
|
const currentTenant = tenants.find((tenant) => tenant.id === currentTenantId);
|
|
1062
|
-
return /* @__PURE__ */ (0,
|
|
1091
|
+
return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
|
|
1063
1092
|
Select,
|
|
1064
1093
|
{
|
|
1065
1094
|
value: currentTenantId,
|
|
1066
1095
|
onValueChange: handleTenantChange,
|
|
1067
1096
|
disabled: isLoading,
|
|
1068
1097
|
children: [
|
|
1069
|
-
/* @__PURE__ */ (0,
|
|
1070
|
-
/* @__PURE__ */ (0,
|
|
1098
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SelectTrigger, { className: cn("max-w-64", className), children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SelectValue, { placeholder, children: currentTenant ? currentTenant.name : placeholder }) }),
|
|
1099
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(SelectContent, { children: [
|
|
1100
|
+
tenants.map((tenant) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SelectItem, { value: tenant.id, children: tenant.name }, tenant.id)),
|
|
1101
|
+
onCreateTenant && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
|
|
1102
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SelectSeparator, {}),
|
|
1103
|
+
/* @__PURE__ */ (0, import_jsx_runtime21.jsx)(SelectItem, { value: CREATE_TENANT_VALUE, children: createTenantLabel })
|
|
1104
|
+
] })
|
|
1105
|
+
] })
|
|
1071
1106
|
]
|
|
1072
1107
|
}
|
|
1073
1108
|
);
|
|
@@ -1076,7 +1111,7 @@ function SwitchActiveTenant({
|
|
|
1076
1111
|
// src/pricing-table/index.tsx
|
|
1077
1112
|
var React11 = __toESM(require("react"), 1);
|
|
1078
1113
|
var import_lucide_react2 = require("lucide-react");
|
|
1079
|
-
var
|
|
1114
|
+
var import_jsx_runtime22 = require("react/jsx-runtime");
|
|
1080
1115
|
var getCurrencySymbol = (currency) => {
|
|
1081
1116
|
const symbols = {
|
|
1082
1117
|
USD: "$",
|
|
@@ -1116,7 +1151,7 @@ function PricingCard({
|
|
|
1116
1151
|
}) {
|
|
1117
1152
|
const ui = product.ui || {};
|
|
1118
1153
|
const isHighlighted = ui.highlighted;
|
|
1119
|
-
return /* @__PURE__ */ (0,
|
|
1154
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
1120
1155
|
"div",
|
|
1121
1156
|
{
|
|
1122
1157
|
className: cn(
|
|
@@ -1124,11 +1159,11 @@ function PricingCard({
|
|
|
1124
1159
|
isHighlighted ? "relative" : ""
|
|
1125
1160
|
),
|
|
1126
1161
|
children: [
|
|
1127
|
-
/* @__PURE__ */ (0,
|
|
1128
|
-
ui.badge === "Most Popular" && /* @__PURE__ */ (0,
|
|
1162
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-4 flex-shrink-0 relative", children: ui.badge && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "absolute top-0 left-1/2 transform -translate-x-1/2 z-10", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "bg-primary text-primary-foreground px-3 py-1 rounded-full text-sm font-medium flex items-center gap-1 whitespace-nowrap shadow-md", children: [
|
|
1163
|
+
ui.badge === "Most Popular" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.Star, { className: "w-3 h-3" }),
|
|
1129
1164
|
ui.badge
|
|
1130
1165
|
] }) }) }),
|
|
1131
|
-
/* @__PURE__ */ (0,
|
|
1166
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
|
|
1132
1167
|
Card,
|
|
1133
1168
|
{
|
|
1134
1169
|
className: cn(
|
|
@@ -1137,35 +1172,35 @@ function PricingCard({
|
|
|
1137
1172
|
isSelected && "ring-2 ring-primary"
|
|
1138
1173
|
),
|
|
1139
1174
|
children: [
|
|
1140
|
-
/* @__PURE__ */ (0,
|
|
1141
|
-
/* @__PURE__ */ (0,
|
|
1142
|
-
ui.tagline && /* @__PURE__ */ (0,
|
|
1175
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(CardHeader, { className: "text-center", children: [
|
|
1176
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(CardTitle, { className: "text-xl font-bold", children: ui.displayName || product.name }),
|
|
1177
|
+
ui.tagline && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(CardDescription, { className: "text-base", children: ui.tagline })
|
|
1143
1178
|
] }),
|
|
1144
|
-
/* @__PURE__ */ (0,
|
|
1145
|
-
/* @__PURE__ */ (0,
|
|
1146
|
-
/* @__PURE__ */ (0,
|
|
1147
|
-
/* @__PURE__ */ (0,
|
|
1179
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(CardContent, { className: "flex-1 space-y-6", children: [
|
|
1180
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "text-center", children: [
|
|
1181
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "text-3xl font-bold", children: formatPrice(displayedPrice) }),
|
|
1182
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "text-sm text-muted-foreground", children: formatBillingPeriod(displayedPrice) })
|
|
1148
1183
|
] }),
|
|
1149
|
-
(ui.features && ui.features.length > 0 || (displayedPrice.ui?.features?.length ?? 0) > 0 || (displayedPrice.ui?.limits?.length ?? 0) > 0) && /* @__PURE__ */ (0,
|
|
1150
|
-
ui.features && ui.features.length > 0 && /* @__PURE__ */ (0,
|
|
1151
|
-
/* @__PURE__ */ (0,
|
|
1152
|
-
/* @__PURE__ */ (0,
|
|
1153
|
-
/* @__PURE__ */ (0,
|
|
1154
|
-
/* @__PURE__ */ (0,
|
|
1184
|
+
(ui.features && ui.features.length > 0 || (displayedPrice.ui?.features?.length ?? 0) > 0 || (displayedPrice.ui?.limits?.length ?? 0) > 0) && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-4", children: [
|
|
1185
|
+
ui.features && ui.features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-2", children: [
|
|
1186
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "Features" }),
|
|
1187
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ul", { className: "space-y-2", children: ui.features.map((feature, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("li", { className: "flex items-start gap-2", children: [
|
|
1188
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.Check, { className: "w-4 h-4 text-green-500 mt-0.5 flex-shrink-0" }),
|
|
1189
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "text-sm", children: feature })
|
|
1155
1190
|
] }, index)) })
|
|
1156
1191
|
] }),
|
|
1157
|
-
displayedPrice.ui?.features && displayedPrice.ui.features.length > 0 && /* @__PURE__ */ (0,
|
|
1158
|
-
/* @__PURE__ */ (0,
|
|
1159
|
-
/* @__PURE__ */ (0,
|
|
1160
|
-
(feature, index) => /* @__PURE__ */ (0,
|
|
1161
|
-
/* @__PURE__ */ (0,
|
|
1162
|
-
/* @__PURE__ */ (0,
|
|
1192
|
+
displayedPrice.ui?.features && displayedPrice.ui.features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-2", children: [
|
|
1193
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "This Plan" }),
|
|
1194
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ul", { className: "space-y-2", children: displayedPrice.ui.features.map(
|
|
1195
|
+
(feature, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("li", { className: "flex items-start gap-2", children: [
|
|
1196
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.Check, { className: "w-4 h-4 text-blue-500 mt-0.5 flex-0" }),
|
|
1197
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "text-sm", children: feature })
|
|
1163
1198
|
] }, index)
|
|
1164
1199
|
) })
|
|
1165
1200
|
] }),
|
|
1166
|
-
displayedPrice.ui?.limits && displayedPrice.ui.limits.length > 0 && /* @__PURE__ */ (0,
|
|
1167
|
-
/* @__PURE__ */ (0,
|
|
1168
|
-
/* @__PURE__ */ (0,
|
|
1201
|
+
displayedPrice.ui?.limits && displayedPrice.ui.limits.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-2", children: [
|
|
1202
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "Usage Limits" }),
|
|
1203
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ul", { className: "space-y-1", children: displayedPrice.ui.limits.map((limit, index) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1169
1204
|
"li",
|
|
1170
1205
|
{
|
|
1171
1206
|
className: "text-sm text-muted-foreground",
|
|
@@ -1176,7 +1211,7 @@ function PricingCard({
|
|
|
1176
1211
|
] })
|
|
1177
1212
|
] })
|
|
1178
1213
|
] }),
|
|
1179
|
-
/* @__PURE__ */ (0,
|
|
1214
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(CardFooter, { children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1180
1215
|
Button,
|
|
1181
1216
|
{
|
|
1182
1217
|
className: "w-full",
|
|
@@ -1220,7 +1255,7 @@ function PricingTable({
|
|
|
1220
1255
|
const getDisplayedPrice = (product) => product.prices.find((price) => price.interval === selectedInterval) || product.prices[0];
|
|
1221
1256
|
const renderCard = (product) => {
|
|
1222
1257
|
const displayedPrice = getDisplayedPrice(product);
|
|
1223
|
-
return /* @__PURE__ */ (0,
|
|
1258
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1224
1259
|
PricingCard,
|
|
1225
1260
|
{
|
|
1226
1261
|
product,
|
|
@@ -1230,8 +1265,8 @@ function PricingTable({
|
|
|
1230
1265
|
}
|
|
1231
1266
|
);
|
|
1232
1267
|
};
|
|
1233
|
-
const desktopCarousel = /* @__PURE__ */ (0,
|
|
1234
|
-
/* @__PURE__ */ (0,
|
|
1268
|
+
const desktopCarousel = /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "relative max-w-7xl mx-auto", children: [
|
|
1269
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1235
1270
|
Button,
|
|
1236
1271
|
{
|
|
1237
1272
|
variant: "ghost",
|
|
@@ -1239,15 +1274,15 @@ function PricingTable({
|
|
|
1239
1274
|
className: "absolute left-0 top-1/2 transform -translate-y-1/2 -translate-x-4 z-10 bg-white shadow-lg border hover:bg-gray-50 disabled:opacity-50",
|
|
1240
1275
|
onClick: () => setCarouselIndex(Math.max(0, carouselIndex - 1)),
|
|
1241
1276
|
disabled: carouselIndex === 0,
|
|
1242
|
-
children: /* @__PURE__ */ (0,
|
|
1277
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.ChevronLeft, { className: "w-4 h-4" })
|
|
1243
1278
|
}
|
|
1244
1279
|
),
|
|
1245
|
-
/* @__PURE__ */ (0,
|
|
1280
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1246
1281
|
"div",
|
|
1247
1282
|
{
|
|
1248
1283
|
className: "overflow-hidden mx-auto",
|
|
1249
1284
|
style: { width: `${3 * CARD_WIDTH + 2 * GAP}px` },
|
|
1250
|
-
children: /* @__PURE__ */ (0,
|
|
1285
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1251
1286
|
"div",
|
|
1252
1287
|
{
|
|
1253
1288
|
className: "flex items-stretch transition-transform duration-300 ease-in-out",
|
|
@@ -1255,7 +1290,7 @@ function PricingTable({
|
|
|
1255
1290
|
transform: `translateX(-${carouselIndex * (CARD_WIDTH + GAP)}px)`,
|
|
1256
1291
|
gap: `${GAP}px`
|
|
1257
1292
|
},
|
|
1258
|
-
children: sortedProducts.map((p) => /* @__PURE__ */ (0,
|
|
1293
|
+
children: sortedProducts.map((p) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1259
1294
|
"div",
|
|
1260
1295
|
{
|
|
1261
1296
|
style: { width: `${CARD_WIDTH}px` },
|
|
@@ -1268,7 +1303,7 @@ function PricingTable({
|
|
|
1268
1303
|
)
|
|
1269
1304
|
}
|
|
1270
1305
|
),
|
|
1271
|
-
/* @__PURE__ */ (0,
|
|
1306
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1272
1307
|
Button,
|
|
1273
1308
|
{
|
|
1274
1309
|
variant: "ghost",
|
|
@@ -1278,12 +1313,12 @@ function PricingTable({
|
|
|
1278
1313
|
Math.min(sortedProducts.length - 3, carouselIndex + 1)
|
|
1279
1314
|
),
|
|
1280
1315
|
disabled: carouselIndex >= sortedProducts.length - 3,
|
|
1281
|
-
children: /* @__PURE__ */ (0,
|
|
1316
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.ChevronRight, { className: "w-4 h-4" })
|
|
1282
1317
|
}
|
|
1283
1318
|
),
|
|
1284
|
-
/* @__PURE__ */ (0,
|
|
1319
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "flex justify-center mt-6 space-x-2", children: Array.from(
|
|
1285
1320
|
{ length: Math.max(1, sortedProducts.length - 2) },
|
|
1286
|
-
(_, i) => /* @__PURE__ */ (0,
|
|
1321
|
+
(_, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1287
1322
|
"button",
|
|
1288
1323
|
{
|
|
1289
1324
|
onClick: () => setCarouselIndex(i),
|
|
@@ -1297,12 +1332,12 @@ function PricingTable({
|
|
|
1297
1332
|
)
|
|
1298
1333
|
) })
|
|
1299
1334
|
] });
|
|
1300
|
-
const staticLayout = /* @__PURE__ */ (0,
|
|
1335
|
+
const staticLayout = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1301
1336
|
"div",
|
|
1302
1337
|
{
|
|
1303
1338
|
className: "flex flex-row items-stretch justify-center",
|
|
1304
1339
|
style: { gap: `${GAP}px` },
|
|
1305
|
-
children: sortedProducts.map((p) => /* @__PURE__ */ (0,
|
|
1340
|
+
children: sortedProducts.map((p) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1306
1341
|
"div",
|
|
1307
1342
|
{
|
|
1308
1343
|
style: { width: `${CARD_WIDTH}px` },
|
|
@@ -1313,9 +1348,9 @@ function PricingTable({
|
|
|
1313
1348
|
))
|
|
1314
1349
|
}
|
|
1315
1350
|
);
|
|
1316
|
-
return /* @__PURE__ */ (0,
|
|
1317
|
-
showPricingToggle && hasMultipleIntervals && /* @__PURE__ */ (0,
|
|
1318
|
-
/* @__PURE__ */ (0,
|
|
1351
|
+
return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: cn("w-full", className), children: [
|
|
1352
|
+
showPricingToggle && hasMultipleIntervals && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "flex justify-center mb-4", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex bg-gray-100 p-1 rounded-lg", children: [
|
|
1353
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1319
1354
|
Button,
|
|
1320
1355
|
{
|
|
1321
1356
|
variant: selectedInterval === "month" ? "default" : "ghost",
|
|
@@ -1325,7 +1360,7 @@ function PricingTable({
|
|
|
1325
1360
|
children: "Monthly"
|
|
1326
1361
|
}
|
|
1327
1362
|
),
|
|
1328
|
-
/* @__PURE__ */ (0,
|
|
1363
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1329
1364
|
Button,
|
|
1330
1365
|
{
|
|
1331
1366
|
variant: selectedInterval === "year" ? "default" : "ghost",
|
|
@@ -1336,20 +1371,20 @@ function PricingTable({
|
|
|
1336
1371
|
}
|
|
1337
1372
|
)
|
|
1338
1373
|
] }) }),
|
|
1339
|
-
/* @__PURE__ */ (0,
|
|
1340
|
-
/* @__PURE__ */ (0,
|
|
1374
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "lg:hidden relative", children: [
|
|
1375
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1341
1376
|
"div",
|
|
1342
1377
|
{
|
|
1343
1378
|
className: "overflow-hidden mx-auto",
|
|
1344
1379
|
style: { width: `${CARD_WIDTH}px` },
|
|
1345
|
-
children: /* @__PURE__ */ (0,
|
|
1380
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1346
1381
|
"div",
|
|
1347
1382
|
{
|
|
1348
1383
|
className: "flex transition-transform duration-300 ease-in-out items-stretch",
|
|
1349
1384
|
style: {
|
|
1350
1385
|
transform: `translateX(-${carouselIndex * CARD_WIDTH}px)`
|
|
1351
1386
|
},
|
|
1352
|
-
children: sortedProducts.map((product) => /* @__PURE__ */ (0,
|
|
1387
|
+
children: sortedProducts.map((product) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1353
1388
|
"div",
|
|
1354
1389
|
{
|
|
1355
1390
|
className: "flex-shrink-0",
|
|
@@ -1362,8 +1397,8 @@ function PricingTable({
|
|
|
1362
1397
|
)
|
|
1363
1398
|
}
|
|
1364
1399
|
),
|
|
1365
|
-
sortedProducts.length > 1 && /* @__PURE__ */ (0,
|
|
1366
|
-
/* @__PURE__ */ (0,
|
|
1400
|
+
sortedProducts.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
|
|
1401
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1367
1402
|
Button,
|
|
1368
1403
|
{
|
|
1369
1404
|
variant: "ghost",
|
|
@@ -1371,10 +1406,10 @@ function PricingTable({
|
|
|
1371
1406
|
className: "absolute left-0 top-1/2 -translate-y-1/2 -translate-x-2 z-10 bg-white shadow-lg border hover:bg-gray-50 disabled:opacity-50",
|
|
1372
1407
|
onClick: () => setCarouselIndex((prev) => Math.max(0, prev - 1)),
|
|
1373
1408
|
disabled: carouselIndex === 0,
|
|
1374
|
-
children: /* @__PURE__ */ (0,
|
|
1409
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.ChevronLeft, { className: "w-5 h-5" })
|
|
1375
1410
|
}
|
|
1376
1411
|
),
|
|
1377
|
-
/* @__PURE__ */ (0,
|
|
1412
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1378
1413
|
Button,
|
|
1379
1414
|
{
|
|
1380
1415
|
variant: "ghost",
|
|
@@ -1384,10 +1419,10 @@ function PricingTable({
|
|
|
1384
1419
|
(prev) => Math.min(sortedProducts.length - 1, prev + 1)
|
|
1385
1420
|
),
|
|
1386
1421
|
disabled: carouselIndex >= sortedProducts.length - 1,
|
|
1387
|
-
children: /* @__PURE__ */ (0,
|
|
1422
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react2.ChevronRight, { className: "w-5 h-5" })
|
|
1388
1423
|
}
|
|
1389
1424
|
),
|
|
1390
|
-
/* @__PURE__ */ (0,
|
|
1425
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "flex justify-center mt-6 space-x-2", children: Array.from({ length: sortedProducts.length }, (_, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
|
|
1391
1426
|
"button",
|
|
1392
1427
|
{
|
|
1393
1428
|
onClick: () => setCarouselIndex(i),
|
|
@@ -1401,13 +1436,13 @@ function PricingTable({
|
|
|
1401
1436
|
)) })
|
|
1402
1437
|
] })
|
|
1403
1438
|
] }),
|
|
1404
|
-
/* @__PURE__ */ (0,
|
|
1439
|
+
/* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "hidden lg:block", children: sortedProducts.length <= 3 ? staticLayout : desktopCarousel })
|
|
1405
1440
|
] });
|
|
1406
1441
|
}
|
|
1407
1442
|
|
|
1408
1443
|
// src/tenant-creator/index.tsx
|
|
1409
1444
|
var import_react = require("react");
|
|
1410
|
-
var
|
|
1445
|
+
var import_jsx_runtime23 = require("react/jsx-runtime");
|
|
1411
1446
|
function TenantCreator({
|
|
1412
1447
|
config = {},
|
|
1413
1448
|
formActions = {},
|
|
@@ -1456,14 +1491,14 @@ function TenantCreator({
|
|
|
1456
1491
|
setIsLoading(false);
|
|
1457
1492
|
}
|
|
1458
1493
|
};
|
|
1459
|
-
return /* @__PURE__ */ (0,
|
|
1460
|
-
/* @__PURE__ */ (0,
|
|
1461
|
-
/* @__PURE__ */ (0,
|
|
1462
|
-
/* @__PURE__ */ (0,
|
|
1494
|
+
return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(Card, { className: cn("w-full max-w-md mx-auto", className), children: [
|
|
1495
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardHeader, { children: [
|
|
1496
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardTitle, { children: "Organization Setup" }),
|
|
1497
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CardDescription, { children: "Choose how you want to get started with your organization." })
|
|
1463
1498
|
] }),
|
|
1464
|
-
/* @__PURE__ */ (0,
|
|
1465
|
-
/* @__PURE__ */ (0,
|
|
1466
|
-
/* @__PURE__ */ (0,
|
|
1499
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
1500
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "grid grid-cols-2 rounded-lg bg-muted p-1", children: [
|
|
1501
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
1467
1502
|
"label",
|
|
1468
1503
|
{
|
|
1469
1504
|
className: cn(
|
|
@@ -1472,7 +1507,7 @@ function TenantCreator({
|
|
|
1472
1507
|
isLoading && "pointer-events-none opacity-50"
|
|
1473
1508
|
),
|
|
1474
1509
|
children: [
|
|
1475
|
-
/* @__PURE__ */ (0,
|
|
1510
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
1476
1511
|
"input",
|
|
1477
1512
|
{
|
|
1478
1513
|
type: "radio",
|
|
@@ -1488,7 +1523,7 @@ function TenantCreator({
|
|
|
1488
1523
|
]
|
|
1489
1524
|
}
|
|
1490
1525
|
),
|
|
1491
|
-
/* @__PURE__ */ (0,
|
|
1526
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
|
|
1492
1527
|
"label",
|
|
1493
1528
|
{
|
|
1494
1529
|
className: cn(
|
|
@@ -1497,7 +1532,7 @@ function TenantCreator({
|
|
|
1497
1532
|
isLoading && "pointer-events-none opacity-50"
|
|
1498
1533
|
),
|
|
1499
1534
|
children: [
|
|
1500
|
-
/* @__PURE__ */ (0,
|
|
1535
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
1501
1536
|
"input",
|
|
1502
1537
|
{
|
|
1503
1538
|
type: "radio",
|
|
@@ -1514,10 +1549,10 @@ function TenantCreator({
|
|
|
1514
1549
|
}
|
|
1515
1550
|
)
|
|
1516
1551
|
] }),
|
|
1517
|
-
mode === "create" && /* @__PURE__ */ (0,
|
|
1518
|
-
/* @__PURE__ */ (0,
|
|
1519
|
-
/* @__PURE__ */ (0,
|
|
1520
|
-
/* @__PURE__ */ (0,
|
|
1552
|
+
mode === "create" && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("form", { onSubmit: handleCreateSubmit, className: "space-y-4", children: [
|
|
1553
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-2", children: [
|
|
1554
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Label, { htmlFor: "organizationName", children: config.createForm?.organizationName?.label || "Organization Name" }),
|
|
1555
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
1521
1556
|
Input,
|
|
1522
1557
|
{
|
|
1523
1558
|
id: "organizationName",
|
|
@@ -1531,9 +1566,9 @@ function TenantCreator({
|
|
|
1531
1566
|
}
|
|
1532
1567
|
)
|
|
1533
1568
|
] }),
|
|
1534
|
-
/* @__PURE__ */ (0,
|
|
1535
|
-
/* @__PURE__ */ (0,
|
|
1536
|
-
/* @__PURE__ */ (0,
|
|
1569
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-2", children: [
|
|
1570
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Label, { htmlFor: "billingEmail", children: config.createForm?.billingEmail?.label || "Billing Email" }),
|
|
1571
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
1537
1572
|
Input,
|
|
1538
1573
|
{
|
|
1539
1574
|
id: "billingEmail",
|
|
@@ -1547,12 +1582,12 @@ function TenantCreator({
|
|
|
1547
1582
|
}
|
|
1548
1583
|
)
|
|
1549
1584
|
] }),
|
|
1550
|
-
/* @__PURE__ */ (0,
|
|
1585
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button, { type: "submit", className: "w-full", disabled: isLoading, children: isLoading ? "Creating..." : "Create Organization" })
|
|
1551
1586
|
] }),
|
|
1552
|
-
mode === "join" && /* @__PURE__ */ (0,
|
|
1553
|
-
/* @__PURE__ */ (0,
|
|
1554
|
-
/* @__PURE__ */ (0,
|
|
1555
|
-
/* @__PURE__ */ (0,
|
|
1587
|
+
mode === "join" && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("form", { onSubmit: handleJoinSubmit, className: "space-y-4", children: [
|
|
1588
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-2", children: [
|
|
1589
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Label, { htmlFor: "token", children: config.joinForm?.token?.label || "Invitation Token" }),
|
|
1590
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
|
|
1556
1591
|
Input,
|
|
1557
1592
|
{
|
|
1558
1593
|
id: "token",
|
|
@@ -1566,7 +1601,7 @@ function TenantCreator({
|
|
|
1566
1601
|
}
|
|
1567
1602
|
)
|
|
1568
1603
|
] }),
|
|
1569
|
-
/* @__PURE__ */ (0,
|
|
1604
|
+
/* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button, { type: "submit", className: "w-full", disabled: isLoading, children: isLoading ? "Joining..." : "Join Organization" })
|
|
1570
1605
|
] })
|
|
1571
1606
|
] })
|
|
1572
1607
|
] });
|
|
@@ -1574,7 +1609,7 @@ function TenantCreator({
|
|
|
1574
1609
|
|
|
1575
1610
|
// src/user-invite/index.tsx
|
|
1576
1611
|
var import_react2 = require("react");
|
|
1577
|
-
var
|
|
1612
|
+
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
1578
1613
|
function UserInvite({ roles, onInvite }) {
|
|
1579
1614
|
const [email, setEmail] = (0, import_react2.useState)("");
|
|
1580
1615
|
const [selectedRole, setSelectedRole] = (0, import_react2.useState)("");
|
|
@@ -1619,15 +1654,15 @@ function UserInvite({ roles, onInvite }) {
|
|
|
1619
1654
|
setSelectedRole("");
|
|
1620
1655
|
setError(null);
|
|
1621
1656
|
};
|
|
1622
|
-
return /* @__PURE__ */ (0,
|
|
1623
|
-
/* @__PURE__ */ (0,
|
|
1624
|
-
/* @__PURE__ */ (0,
|
|
1625
|
-
/* @__PURE__ */ (0,
|
|
1657
|
+
return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(Card, { className: "w-full max-w-2xl", children: [
|
|
1658
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(CardHeader, { children: [
|
|
1659
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(CardTitle, { children: "Invite User" }),
|
|
1660
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(CardDescription, { children: "Send an invitation to a new user to join your organization" })
|
|
1626
1661
|
] }),
|
|
1627
|
-
/* @__PURE__ */ (0,
|
|
1628
|
-
/* @__PURE__ */ (0,
|
|
1629
|
-
/* @__PURE__ */ (0,
|
|
1630
|
-
/* @__PURE__ */ (0,
|
|
1662
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(CardContent, { children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-6", children: [
|
|
1663
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-2", children: [
|
|
1664
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Label, { htmlFor: "email", children: "Email Address" }),
|
|
1665
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
1631
1666
|
Input,
|
|
1632
1667
|
{
|
|
1633
1668
|
id: "email",
|
|
@@ -1638,19 +1673,19 @@ function UserInvite({ roles, onInvite }) {
|
|
|
1638
1673
|
"aria-invalid": email !== "" && !isValidEmail(email)
|
|
1639
1674
|
}
|
|
1640
1675
|
),
|
|
1641
|
-
email !== "" && !isValidEmail(email) && /* @__PURE__ */ (0,
|
|
1676
|
+
email !== "" && !isValidEmail(email) && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-xs text-destructive", children: "Please enter a valid email address" })
|
|
1642
1677
|
] }),
|
|
1643
|
-
/* @__PURE__ */ (0,
|
|
1644
|
-
/* @__PURE__ */ (0,
|
|
1645
|
-
/* @__PURE__ */ (0,
|
|
1646
|
-
/* @__PURE__ */ (0,
|
|
1647
|
-
/* @__PURE__ */ (0,
|
|
1678
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-2", children: [
|
|
1679
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Label, { htmlFor: "role", children: "Role" }),
|
|
1680
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(Select, { value: selectedRole, onValueChange: setSelectedRole, children: [
|
|
1681
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SelectTrigger, { id: "role", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SelectValue, { placeholder: "Select a role" }) }),
|
|
1682
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SelectContent, { children: roles.length > 0 ? roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SelectItem, { value: role, children: role }, role)) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(SelectItem, { value: "no-roles", disabled: true, children: "No roles available" }) })
|
|
1648
1683
|
] }),
|
|
1649
|
-
/* @__PURE__ */ (0,
|
|
1684
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-xs text-muted-foreground", children: "The role determines what permissions the user will have" })
|
|
1650
1685
|
] }),
|
|
1651
|
-
error && /* @__PURE__ */ (0,
|
|
1652
|
-
/* @__PURE__ */ (0,
|
|
1653
|
-
/* @__PURE__ */ (0,
|
|
1686
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "p-3 rounded-md bg-destructive/10 border border-destructive/20", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-sm text-destructive", children: error }) }),
|
|
1687
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-end space-x-3", children: [
|
|
1688
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
|
|
1654
1689
|
Button,
|
|
1655
1690
|
{
|
|
1656
1691
|
type: "button",
|
|
@@ -1660,7 +1695,7 @@ function UserInvite({ roles, onInvite }) {
|
|
|
1660
1695
|
children: "Reset"
|
|
1661
1696
|
}
|
|
1662
1697
|
),
|
|
1663
|
-
/* @__PURE__ */ (0,
|
|
1698
|
+
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Button, { type: "submit", disabled: !isFormValid() || isSubmitting, children: isSubmitting ? "Sending..." : "Send Invitation" })
|
|
1664
1699
|
] })
|
|
1665
1700
|
] }) })
|
|
1666
1701
|
] });
|
|
@@ -1672,14 +1707,14 @@ var import_react4 = require("react");
|
|
|
1672
1707
|
// src/components/ui/separator.tsx
|
|
1673
1708
|
var React14 = require("react");
|
|
1674
1709
|
var SeparatorPrimitive = __toESM(require("@radix-ui/react-separator"), 1);
|
|
1675
|
-
var
|
|
1710
|
+
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
1676
1711
|
function Separator2({
|
|
1677
1712
|
className,
|
|
1678
1713
|
orientation = "horizontal",
|
|
1679
1714
|
decorative = true,
|
|
1680
1715
|
...props
|
|
1681
1716
|
}) {
|
|
1682
|
-
return /* @__PURE__ */ (0,
|
|
1717
|
+
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
|
|
1683
1718
|
SeparatorPrimitive.Root,
|
|
1684
1719
|
{
|
|
1685
1720
|
"data-slot": "separator",
|
|
@@ -1700,16 +1735,16 @@ var import_react3 = require("react");
|
|
|
1700
1735
|
// src/components/ui/popover.tsx
|
|
1701
1736
|
var React15 = require("react");
|
|
1702
1737
|
var PopoverPrimitive = __toESM(require("@radix-ui/react-popover"), 1);
|
|
1703
|
-
var
|
|
1738
|
+
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
1704
1739
|
function Popover({
|
|
1705
1740
|
...props
|
|
1706
1741
|
}) {
|
|
1707
|
-
return /* @__PURE__ */ (0,
|
|
1742
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
|
|
1708
1743
|
}
|
|
1709
1744
|
function PopoverTrigger({
|
|
1710
1745
|
...props
|
|
1711
1746
|
}) {
|
|
1712
|
-
return /* @__PURE__ */ (0,
|
|
1747
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
|
|
1713
1748
|
}
|
|
1714
1749
|
function PopoverContent({
|
|
1715
1750
|
className,
|
|
@@ -1717,7 +1752,7 @@ function PopoverContent({
|
|
|
1717
1752
|
sideOffset = 4,
|
|
1718
1753
|
...props
|
|
1719
1754
|
}) {
|
|
1720
|
-
return /* @__PURE__ */ (0,
|
|
1755
|
+
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(PopoverPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
|
|
1721
1756
|
PopoverPrimitive.Content,
|
|
1722
1757
|
{
|
|
1723
1758
|
"data-slot": "popover-content",
|
|
@@ -1741,15 +1776,15 @@ var import_lucide_react4 = require("lucide-react");
|
|
|
1741
1776
|
var React16 = require("react");
|
|
1742
1777
|
var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"), 1);
|
|
1743
1778
|
var import_lucide_react3 = require("lucide-react");
|
|
1744
|
-
var
|
|
1779
|
+
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
1745
1780
|
|
|
1746
1781
|
// src/components/ui/command.tsx
|
|
1747
|
-
var
|
|
1782
|
+
var import_jsx_runtime28 = require("react/jsx-runtime");
|
|
1748
1783
|
function Command({
|
|
1749
1784
|
className,
|
|
1750
1785
|
...props
|
|
1751
1786
|
}) {
|
|
1752
|
-
return /* @__PURE__ */ (0,
|
|
1787
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1753
1788
|
import_cmdk.Command,
|
|
1754
1789
|
{
|
|
1755
1790
|
"data-slot": "command",
|
|
@@ -1765,14 +1800,14 @@ function CommandInput({
|
|
|
1765
1800
|
className,
|
|
1766
1801
|
...props
|
|
1767
1802
|
}) {
|
|
1768
|
-
return /* @__PURE__ */ (0,
|
|
1803
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
|
|
1769
1804
|
"div",
|
|
1770
1805
|
{
|
|
1771
1806
|
"data-slot": "command-input-wrapper",
|
|
1772
1807
|
className: "flex h-9 items-center gap-2 border-b px-3",
|
|
1773
1808
|
children: [
|
|
1774
|
-
/* @__PURE__ */ (0,
|
|
1775
|
-
/* @__PURE__ */ (0,
|
|
1809
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_lucide_react4.SearchIcon, { className: "size-4 shrink-0 opacity-50" }),
|
|
1810
|
+
/* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1776
1811
|
import_cmdk.Command.Input,
|
|
1777
1812
|
{
|
|
1778
1813
|
"data-slot": "command-input",
|
|
@@ -1791,7 +1826,7 @@ function CommandList({
|
|
|
1791
1826
|
className,
|
|
1792
1827
|
...props
|
|
1793
1828
|
}) {
|
|
1794
|
-
return /* @__PURE__ */ (0,
|
|
1829
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1795
1830
|
import_cmdk.Command.List,
|
|
1796
1831
|
{
|
|
1797
1832
|
"data-slot": "command-list",
|
|
@@ -1806,7 +1841,7 @@ function CommandList({
|
|
|
1806
1841
|
function CommandEmpty({
|
|
1807
1842
|
...props
|
|
1808
1843
|
}) {
|
|
1809
|
-
return /* @__PURE__ */ (0,
|
|
1844
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1810
1845
|
import_cmdk.Command.Empty,
|
|
1811
1846
|
{
|
|
1812
1847
|
"data-slot": "command-empty",
|
|
@@ -1819,7 +1854,7 @@ function CommandGroup({
|
|
|
1819
1854
|
className,
|
|
1820
1855
|
...props
|
|
1821
1856
|
}) {
|
|
1822
|
-
return /* @__PURE__ */ (0,
|
|
1857
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1823
1858
|
import_cmdk.Command.Group,
|
|
1824
1859
|
{
|
|
1825
1860
|
"data-slot": "command-group",
|
|
@@ -1835,7 +1870,7 @@ function CommandItem({
|
|
|
1835
1870
|
className,
|
|
1836
1871
|
...props
|
|
1837
1872
|
}) {
|
|
1838
|
-
return /* @__PURE__ */ (0,
|
|
1873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
|
|
1839
1874
|
import_cmdk.Command.Item,
|
|
1840
1875
|
{
|
|
1841
1876
|
"data-slot": "command-item",
|
|
@@ -1850,7 +1885,7 @@ function CommandItem({
|
|
|
1850
1885
|
|
|
1851
1886
|
// src/permissions-selector/index.tsx
|
|
1852
1887
|
var import_lucide_react5 = require("lucide-react");
|
|
1853
|
-
var
|
|
1888
|
+
var import_jsx_runtime29 = require("react/jsx-runtime");
|
|
1854
1889
|
function Combobox({
|
|
1855
1890
|
options,
|
|
1856
1891
|
value,
|
|
@@ -1864,8 +1899,8 @@ function Combobox({
|
|
|
1864
1899
|
const [open, setOpen] = (0, import_react3.useState)(false);
|
|
1865
1900
|
const selectedOption = options.find((opt) => opt.value === value);
|
|
1866
1901
|
const isEmpty = options.length === 0;
|
|
1867
|
-
return /* @__PURE__ */ (0,
|
|
1868
|
-
/* @__PURE__ */ (0,
|
|
1902
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(Popover, { open, onOpenChange: setOpen, children: [
|
|
1903
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
1869
1904
|
Button,
|
|
1870
1905
|
{
|
|
1871
1906
|
variant: "outline",
|
|
@@ -1878,21 +1913,21 @@ function Combobox({
|
|
|
1878
1913
|
className
|
|
1879
1914
|
),
|
|
1880
1915
|
children: [
|
|
1881
|
-
isEmpty ? /* @__PURE__ */ (0,
|
|
1882
|
-
/* @__PURE__ */ (0,
|
|
1916
|
+
isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "text-muted-foreground", children: "None" }) : selectedOption ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "truncate", children: selectedOption.label }) : placeholder,
|
|
1917
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react5.ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })
|
|
1883
1918
|
]
|
|
1884
1919
|
}
|
|
1885
1920
|
) }),
|
|
1886
|
-
/* @__PURE__ */ (0,
|
|
1921
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1887
1922
|
PopoverContent,
|
|
1888
1923
|
{
|
|
1889
1924
|
className: "w-[--radix-popover-trigger-width] p-0",
|
|
1890
1925
|
align: "start",
|
|
1891
|
-
children: /* @__PURE__ */ (0,
|
|
1892
|
-
/* @__PURE__ */ (0,
|
|
1893
|
-
/* @__PURE__ */ (0,
|
|
1894
|
-
/* @__PURE__ */ (0,
|
|
1895
|
-
/* @__PURE__ */ (0,
|
|
1926
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(Command, { children: [
|
|
1927
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CommandInput, { placeholder: searchPlaceholder }),
|
|
1928
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(CommandList, { children: [
|
|
1929
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CommandEmpty, { children: emptyText }),
|
|
1930
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(CommandGroup, { children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
|
|
1896
1931
|
CommandItem,
|
|
1897
1932
|
{
|
|
1898
1933
|
value: option.label,
|
|
@@ -1901,7 +1936,7 @@ function Combobox({
|
|
|
1901
1936
|
setOpen(false);
|
|
1902
1937
|
},
|
|
1903
1938
|
children: [
|
|
1904
|
-
/* @__PURE__ */ (0,
|
|
1939
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
1905
1940
|
import_lucide_react5.Check,
|
|
1906
1941
|
{
|
|
1907
1942
|
className: cn(
|
|
@@ -2007,13 +2042,13 @@ function PermissionsSelector({
|
|
|
2007
2042
|
setPermissionRows(initialPermissions);
|
|
2008
2043
|
}
|
|
2009
2044
|
}, [initialPermissions]);
|
|
2010
|
-
return /* @__PURE__ */ (0,
|
|
2011
|
-
/* @__PURE__ */ (0,
|
|
2045
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: cn("space-y-4", className), children: [
|
|
2046
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "space-y-3", children: permissionRows.map((row) => {
|
|
2012
2047
|
const relationOptions = getRelationsForNamespace(row.namespace);
|
|
2013
2048
|
const objectOptions = getObjectsForNamespace(row.namespace);
|
|
2014
2049
|
const showObjectSelect = objectOptions !== null;
|
|
2015
|
-
return /* @__PURE__ */ (0,
|
|
2016
|
-
/* @__PURE__ */ (0,
|
|
2050
|
+
return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-start gap-2", children: [
|
|
2051
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
2017
2052
|
Button,
|
|
2018
2053
|
{
|
|
2019
2054
|
type: "button",
|
|
@@ -2022,11 +2057,11 @@ function PermissionsSelector({
|
|
|
2022
2057
|
onClick: () => removePermissionRow(row.id),
|
|
2023
2058
|
disabled: disabled || permissionRows.length === 1,
|
|
2024
2059
|
className: "shrink-0",
|
|
2025
|
-
children: /* @__PURE__ */ (0,
|
|
2060
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react5.Trash2, { className: "h-4 w-4 text-muted-foreground" })
|
|
2026
2061
|
}
|
|
2027
2062
|
),
|
|
2028
|
-
/* @__PURE__ */ (0,
|
|
2029
|
-
/* @__PURE__ */ (0,
|
|
2063
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex flex-1 gap-0", children: [
|
|
2064
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
2030
2065
|
Combobox,
|
|
2031
2066
|
{
|
|
2032
2067
|
options: namespaceOptions,
|
|
@@ -2038,7 +2073,7 @@ function PermissionsSelector({
|
|
|
2038
2073
|
className: "w-1/3 min-w-[120px] rounded-r-none border-r-0"
|
|
2039
2074
|
}
|
|
2040
2075
|
),
|
|
2041
|
-
/* @__PURE__ */ (0,
|
|
2076
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
2042
2077
|
Combobox,
|
|
2043
2078
|
{
|
|
2044
2079
|
options: relationOptions,
|
|
@@ -2053,7 +2088,7 @@ function PermissionsSelector({
|
|
|
2053
2088
|
)
|
|
2054
2089
|
}
|
|
2055
2090
|
),
|
|
2056
|
-
/* @__PURE__ */ (0,
|
|
2091
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
|
|
2057
2092
|
Combobox,
|
|
2058
2093
|
{
|
|
2059
2094
|
options: objectOptions ?? [],
|
|
@@ -2071,15 +2106,15 @@ function PermissionsSelector({
|
|
|
2071
2106
|
] })
|
|
2072
2107
|
] }, row.id);
|
|
2073
2108
|
}) }),
|
|
2074
|
-
showPreview && permissionRows.some((row) => row.namespace && row.relation) && /* @__PURE__ */ (0,
|
|
2075
|
-
/* @__PURE__ */ (0,
|
|
2076
|
-
/* @__PURE__ */ (0,
|
|
2109
|
+
showPreview && permissionRows.some((row) => row.namespace && row.relation) && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "rounded-md bg-muted p-3", children: [
|
|
2110
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-xs text-muted-foreground mb-2", children: "Permissions to be granted:" }),
|
|
2111
|
+
/* @__PURE__ */ (0, import_jsx_runtime29.jsx)("ul", { className: "space-y-1 text-xs font-mono", children: buildPermissions().map((perm, idx) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("li", { className: "text-muted-foreground", children: perm }, idx)) })
|
|
2077
2112
|
] })
|
|
2078
2113
|
] });
|
|
2079
2114
|
}
|
|
2080
2115
|
|
|
2081
2116
|
// src/role-creator/index.tsx
|
|
2082
|
-
var
|
|
2117
|
+
var import_jsx_runtime30 = require("react/jsx-runtime");
|
|
2083
2118
|
function RoleCreator({
|
|
2084
2119
|
definitions,
|
|
2085
2120
|
roles,
|
|
@@ -2174,15 +2209,15 @@ function RoleCreator({
|
|
|
2174
2209
|
setIsEditMode(false);
|
|
2175
2210
|
setEditingRoleId(null);
|
|
2176
2211
|
};
|
|
2177
|
-
return /* @__PURE__ */ (0,
|
|
2178
|
-
/* @__PURE__ */ (0,
|
|
2179
|
-
/* @__PURE__ */ (0,
|
|
2180
|
-
/* @__PURE__ */ (0,
|
|
2212
|
+
return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Card, { className: "w-full max-w-4xl", children: [
|
|
2213
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(CardHeader, { children: [
|
|
2214
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(CardTitle, { children: isEditMode ? `Edit Role: ${roleName}` : "Create New Role" }),
|
|
2215
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(CardDescription, { children: isEditMode ? "Update permissions for this existing role" : "Define a new role with specific permissions" })
|
|
2181
2216
|
] }),
|
|
2182
|
-
/* @__PURE__ */ (0,
|
|
2183
|
-
/* @__PURE__ */ (0,
|
|
2184
|
-
/* @__PURE__ */ (0,
|
|
2185
|
-
/* @__PURE__ */ (0,
|
|
2217
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(CardContent, { className: "space-y-6", children: [
|
|
2218
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-2 relative", children: [
|
|
2219
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Label, { htmlFor: "role-name", children: "Role Name" }),
|
|
2220
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
2186
2221
|
Input,
|
|
2187
2222
|
{
|
|
2188
2223
|
id: "role-name",
|
|
@@ -2193,9 +2228,9 @@ function RoleCreator({
|
|
|
2193
2228
|
onBlur: () => setTimeout(() => setShowSuggestions(false), 200)
|
|
2194
2229
|
}
|
|
2195
2230
|
),
|
|
2196
|
-
showSuggestions && roleSuggestions.length > 0 && /* @__PURE__ */ (0,
|
|
2231
|
+
showSuggestions && roleSuggestions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "absolute z-10 w-full mt-1 bg-background border rounded-md shadow-lg max-h-48 overflow-y-auto", children: roleSuggestions.filter(
|
|
2197
2232
|
(suggestion) => suggestion.toLowerCase().includes(roleName.toLowerCase())
|
|
2198
|
-
).map((suggestion) => /* @__PURE__ */ (0,
|
|
2233
|
+
).map((suggestion) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
2199
2234
|
"button",
|
|
2200
2235
|
{
|
|
2201
2236
|
className: "w-full px-4 py-2 text-left hover:bg-accent hover:text-accent-foreground text-sm",
|
|
@@ -2207,12 +2242,12 @@ function RoleCreator({
|
|
|
2207
2242
|
},
|
|
2208
2243
|
suggestion
|
|
2209
2244
|
)) }),
|
|
2210
|
-
isEditMode && /* @__PURE__ */ (0,
|
|
2245
|
+
isEditMode && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "text-xs text-amber-600 dark:text-amber-400", children: "Editing existing role - changes will update all users with this role" })
|
|
2211
2246
|
] }),
|
|
2212
|
-
/* @__PURE__ */ (0,
|
|
2213
|
-
/* @__PURE__ */ (0,
|
|
2214
|
-
/* @__PURE__ */ (0,
|
|
2215
|
-
/* @__PURE__ */ (0,
|
|
2247
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Separator2, {}),
|
|
2248
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-4", children: [
|
|
2249
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Label, { children: "Permissions" }),
|
|
2250
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
2216
2251
|
PermissionsSelector,
|
|
2217
2252
|
{
|
|
2218
2253
|
definitions,
|
|
@@ -2222,10 +2257,10 @@ function RoleCreator({
|
|
|
2222
2257
|
}
|
|
2223
2258
|
)
|
|
2224
2259
|
] }),
|
|
2225
|
-
/* @__PURE__ */ (0,
|
|
2226
|
-
/* @__PURE__ */ (0,
|
|
2227
|
-
/* @__PURE__ */ (0,
|
|
2228
|
-
/* @__PURE__ */ (0,
|
|
2260
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Separator2, {}),
|
|
2261
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex justify-end space-x-3", children: [
|
|
2262
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Button, { variant: "outline", onClick: handleReset, children: "Reset" }),
|
|
2263
|
+
/* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
|
|
2229
2264
|
Button,
|
|
2230
2265
|
{
|
|
2231
2266
|
onClick: handleSubmit,
|
|
@@ -2243,14 +2278,14 @@ var import_react5 = require("react");
|
|
|
2243
2278
|
|
|
2244
2279
|
// src/components/ui/table.tsx
|
|
2245
2280
|
var React18 = require("react");
|
|
2246
|
-
var
|
|
2281
|
+
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
2247
2282
|
function Table({ className, ...props }) {
|
|
2248
|
-
return /* @__PURE__ */ (0,
|
|
2283
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2249
2284
|
"div",
|
|
2250
2285
|
{
|
|
2251
2286
|
"data-slot": "table-container",
|
|
2252
2287
|
className: "relative w-full overflow-x-auto",
|
|
2253
|
-
children: /* @__PURE__ */ (0,
|
|
2288
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2254
2289
|
"table",
|
|
2255
2290
|
{
|
|
2256
2291
|
"data-slot": "table",
|
|
@@ -2262,7 +2297,7 @@ function Table({ className, ...props }) {
|
|
|
2262
2297
|
);
|
|
2263
2298
|
}
|
|
2264
2299
|
function TableHeader({ className, ...props }) {
|
|
2265
|
-
return /* @__PURE__ */ (0,
|
|
2300
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2266
2301
|
"thead",
|
|
2267
2302
|
{
|
|
2268
2303
|
"data-slot": "table-header",
|
|
@@ -2272,7 +2307,7 @@ function TableHeader({ className, ...props }) {
|
|
|
2272
2307
|
);
|
|
2273
2308
|
}
|
|
2274
2309
|
function TableBody({ className, ...props }) {
|
|
2275
|
-
return /* @__PURE__ */ (0,
|
|
2310
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2276
2311
|
"tbody",
|
|
2277
2312
|
{
|
|
2278
2313
|
"data-slot": "table-body",
|
|
@@ -2282,7 +2317,7 @@ function TableBody({ className, ...props }) {
|
|
|
2282
2317
|
);
|
|
2283
2318
|
}
|
|
2284
2319
|
function TableRow({ className, ...props }) {
|
|
2285
|
-
return /* @__PURE__ */ (0,
|
|
2320
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2286
2321
|
"tr",
|
|
2287
2322
|
{
|
|
2288
2323
|
"data-slot": "table-row",
|
|
@@ -2295,7 +2330,7 @@ function TableRow({ className, ...props }) {
|
|
|
2295
2330
|
);
|
|
2296
2331
|
}
|
|
2297
2332
|
function TableHead({ className, ...props }) {
|
|
2298
|
-
return /* @__PURE__ */ (0,
|
|
2333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2299
2334
|
"th",
|
|
2300
2335
|
{
|
|
2301
2336
|
"data-slot": "table-head",
|
|
@@ -2308,7 +2343,7 @@ function TableHead({ className, ...props }) {
|
|
|
2308
2343
|
);
|
|
2309
2344
|
}
|
|
2310
2345
|
function TableCell({ className, ...props }) {
|
|
2311
|
-
return /* @__PURE__ */ (0,
|
|
2346
|
+
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
|
|
2312
2347
|
"td",
|
|
2313
2348
|
{
|
|
2314
2349
|
"data-slot": "table-cell",
|
|
@@ -2324,12 +2359,12 @@ function TableCell({ className, ...props }) {
|
|
|
2324
2359
|
// src/components/ui/avatar.tsx
|
|
2325
2360
|
var React19 = require("react");
|
|
2326
2361
|
var AvatarPrimitive = __toESM(require("@radix-ui/react-avatar"), 1);
|
|
2327
|
-
var
|
|
2362
|
+
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
2328
2363
|
function Avatar({
|
|
2329
2364
|
className,
|
|
2330
2365
|
...props
|
|
2331
2366
|
}) {
|
|
2332
|
-
return /* @__PURE__ */ (0,
|
|
2367
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
2333
2368
|
AvatarPrimitive.Root,
|
|
2334
2369
|
{
|
|
2335
2370
|
"data-slot": "avatar",
|
|
@@ -2345,7 +2380,7 @@ function AvatarFallback({
|
|
|
2345
2380
|
className,
|
|
2346
2381
|
...props
|
|
2347
2382
|
}) {
|
|
2348
|
-
return /* @__PURE__ */ (0,
|
|
2383
|
+
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
|
|
2349
2384
|
AvatarPrimitive.Fallback,
|
|
2350
2385
|
{
|
|
2351
2386
|
"data-slot": "avatar-fallback",
|
|
@@ -2360,7 +2395,7 @@ function AvatarFallback({
|
|
|
2360
2395
|
|
|
2361
2396
|
// src/user-viewer/index.tsx
|
|
2362
2397
|
var import_lucide_react6 = require("lucide-react");
|
|
2363
|
-
var
|
|
2398
|
+
var import_jsx_runtime33 = require("react/jsx-runtime");
|
|
2364
2399
|
function UserViewer({
|
|
2365
2400
|
users,
|
|
2366
2401
|
availableRoles,
|
|
@@ -2406,17 +2441,17 @@ function UserViewer({
|
|
|
2406
2441
|
setIsUpdating((prev) => ({ ...prev, [userId]: false }));
|
|
2407
2442
|
}
|
|
2408
2443
|
};
|
|
2409
|
-
return /* @__PURE__ */ (0,
|
|
2410
|
-
/* @__PURE__ */ (0,
|
|
2411
|
-
/* @__PURE__ */ (0,
|
|
2412
|
-
/* @__PURE__ */ (0,
|
|
2444
|
+
return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(Card, { className: "w-full max-w-6xl", children: [
|
|
2445
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(CardHeader, { children: [
|
|
2446
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(CardTitle, { children: "Team Members" }),
|
|
2447
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(CardDescription, { children: canEditUsers ? "View and manage users in your organization" : "View users in your organization" })
|
|
2413
2448
|
] }),
|
|
2414
|
-
/* @__PURE__ */ (0,
|
|
2415
|
-
/* @__PURE__ */ (0,
|
|
2416
|
-
/* @__PURE__ */ (0,
|
|
2417
|
-
/* @__PURE__ */ (0,
|
|
2418
|
-
/* @__PURE__ */ (0,
|
|
2419
|
-
/* @__PURE__ */ (0,
|
|
2449
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(CardContent, { children: [
|
|
2450
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "mb-6", children: [
|
|
2451
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Label, { htmlFor: "search", className: "sr-only", children: "Search users" }),
|
|
2452
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "relative", children: [
|
|
2453
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react6.Search, { className: "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" }),
|
|
2454
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
|
|
2420
2455
|
Input,
|
|
2421
2456
|
{
|
|
2422
2457
|
id: "search",
|
|
@@ -2428,7 +2463,7 @@ function UserViewer({
|
|
|
2428
2463
|
}
|
|
2429
2464
|
)
|
|
2430
2465
|
] }),
|
|
2431
|
-
/* @__PURE__ */ (0,
|
|
2466
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("p", { className: "text-xs text-muted-foreground mt-2", children: [
|
|
2432
2467
|
"Showing ",
|
|
2433
2468
|
filteredUsers.length,
|
|
2434
2469
|
" of ",
|
|
@@ -2436,39 +2471,39 @@ function UserViewer({
|
|
|
2436
2471
|
" users"
|
|
2437
2472
|
] })
|
|
2438
2473
|
] }),
|
|
2439
|
-
filteredUsers.length > 0 ? /* @__PURE__ */ (0,
|
|
2440
|
-
/* @__PURE__ */ (0,
|
|
2441
|
-
/* @__PURE__ */ (0,
|
|
2442
|
-
/* @__PURE__ */ (0,
|
|
2443
|
-
/* @__PURE__ */ (0,
|
|
2444
|
-
canEditUsers && onRemoveUser && /* @__PURE__ */ (0,
|
|
2474
|
+
filteredUsers.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "border rounded-lg overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(Table, { children: [
|
|
2475
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TableRow, { children: [
|
|
2476
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { className: "w-[300px]", children: "User" }),
|
|
2477
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { children: "Email" }),
|
|
2478
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { className: "w-[180px]", children: "Role" }),
|
|
2479
|
+
canEditUsers && onRemoveUser && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableHead, { className: "w-[100px] text-right", children: "Actions" })
|
|
2445
2480
|
] }) }),
|
|
2446
|
-
/* @__PURE__ */ (0,
|
|
2447
|
-
/* @__PURE__ */ (0,
|
|
2448
|
-
/* @__PURE__ */ (0,
|
|
2449
|
-
/* @__PURE__ */ (0,
|
|
2450
|
-
/* @__PURE__ */ (0,
|
|
2481
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableBody, { children: filteredUsers.map((user) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(TableRow, { children: [
|
|
2482
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { className: "font-medium", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
2483
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Avatar, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(AvatarFallback, { children: getInitials(user.firstName, user.lastName) }) }),
|
|
2484
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { children: [
|
|
2485
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "font-medium", children: [
|
|
2451
2486
|
user.firstName,
|
|
2452
2487
|
" ",
|
|
2453
2488
|
user.lastName
|
|
2454
2489
|
] }),
|
|
2455
|
-
/* @__PURE__ */ (0,
|
|
2490
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-xs text-muted-foreground md:hidden", children: user.email })
|
|
2456
2491
|
] })
|
|
2457
2492
|
] }) }),
|
|
2458
|
-
/* @__PURE__ */ (0,
|
|
2459
|
-
/* @__PURE__ */ (0,
|
|
2493
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { className: "hidden md:table-cell", children: user.email }),
|
|
2494
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { children: canEditUsers && onRoleUpdate ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
2460
2495
|
Select,
|
|
2461
2496
|
{
|
|
2462
2497
|
value: user.role,
|
|
2463
2498
|
onValueChange: (newRole) => handleRoleUpdate(user.userId, newRole),
|
|
2464
2499
|
disabled: isUpdating[user.userId],
|
|
2465
2500
|
children: [
|
|
2466
|
-
/* @__PURE__ */ (0,
|
|
2467
|
-
/* @__PURE__ */ (0,
|
|
2501
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SelectTrigger, { className: "w-full", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SelectValue, {}) }),
|
|
2502
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SelectContent, { children: availableRoles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(SelectItem, { value: role, children: role }, role)) })
|
|
2468
2503
|
]
|
|
2469
2504
|
}
|
|
2470
|
-
) : /* @__PURE__ */ (0,
|
|
2471
|
-
canEditUsers && onRemoveUser && /* @__PURE__ */ (0,
|
|
2505
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "capitalize text-sm font-medium", children: user.role }) }),
|
|
2506
|
+
canEditUsers && onRemoveUser && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(TableCell, { className: "text-right", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
|
|
2472
2507
|
Button,
|
|
2473
2508
|
{
|
|
2474
2509
|
variant: "ghost",
|
|
@@ -2477,18 +2512,19 @@ function UserViewer({
|
|
|
2477
2512
|
disabled: isUpdating[user.userId],
|
|
2478
2513
|
className: "h-8 w-8",
|
|
2479
2514
|
children: [
|
|
2480
|
-
/* @__PURE__ */ (0,
|
|
2481
|
-
/* @__PURE__ */ (0,
|
|
2515
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_lucide_react6.UserX, { className: "h-4 w-4" }),
|
|
2516
|
+
/* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "sr-only", children: "Remove user" })
|
|
2482
2517
|
]
|
|
2483
2518
|
}
|
|
2484
2519
|
) })
|
|
2485
2520
|
] }, user.userId)) })
|
|
2486
|
-
] }) }) : /* @__PURE__ */ (0,
|
|
2521
|
+
] }) }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "text-center py-12 border rounded-lg", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("p", { className: "text-muted-foreground", children: searchQuery ? "No users found matching your search" : "No users in this organization yet" }) })
|
|
2487
2522
|
] })
|
|
2488
2523
|
] });
|
|
2489
2524
|
}
|
|
2490
2525
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2491
2526
|
0 && (module.exports = {
|
|
2527
|
+
ErrorForm,
|
|
2492
2528
|
LoginForm,
|
|
2493
2529
|
PermissionsSelector,
|
|
2494
2530
|
PricingTable,
|