@omnibase/shadcn 0.5.3 → 0.5.5

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 CHANGED
@@ -147,7 +147,7 @@ var alertVariants = (0, import_class_variance_authority.cva)(
147
147
  destructive: "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
148
148
  warning: "border-yellow-500/50 text-yellow-700 bg-yellow-50 dark:border-yellow-500 dark:text-yellow-200 dark:bg-yellow-950/20 [&>svg]:text-yellow-600 dark:[&>svg]:text-yellow-200",
149
149
  success: "border-green-500/50 text-green-700 bg-green-50 dark:border-green-500 dark:text-green-200 dark:bg-green-950/20 [&>svg]:text-green-600 dark:[&>svg]:text-green-200",
150
- info: "border-blue-500/50 text-blue-900 bg-blue-50 dark:border-blue-500 dark:text-blue-200 dark:bg-blue-950/20 [&>svg]:text-blue-900 dark:[&>svg]:text-blue-200"
150
+ info: "border-blue-500/50 text-blue-700 bg-blue-50 dark:border-blue-500 dark:text-blue-200 dark:bg-blue-950/20 [&>svg]:text-blue-600 dark:[&>svg]:text-blue-200"
151
151
  }
152
152
  },
153
153
  defaultVariants: {
@@ -1086,21 +1086,20 @@ var getCurrencySymbol = (currency) => {
1086
1086
  };
1087
1087
  var formatPrice = (price) => {
1088
1088
  const priceUI = price.ui || {};
1089
- if (priceUI.price_display?.custom_text)
1090
- return priceUI.price_display.custom_text;
1089
+ if (priceUI.priceDisplay?.customText) return priceUI.priceDisplay.customText;
1091
1090
  if (!price.amount || price.amount === 0) return "Free";
1092
1091
  const amount = price.amount / 100;
1093
- const currency = price.currency.toUpperCase();
1094
- let formattedPrice = priceUI.price_display?.show_currency !== false ? `${getCurrencySymbol(currency)}${amount.toFixed(2)}` : amount.toFixed(2);
1095
- if (priceUI.price_display?.suffix)
1096
- formattedPrice += ` ${priceUI.price_display.suffix}`;
1092
+ const currency = (price.currency || "USD").toUpperCase();
1093
+ let formattedPrice = priceUI.priceDisplay?.showCurrency !== false ? `${getCurrencySymbol(currency)}${amount.toFixed(2)}` : amount.toFixed(2);
1094
+ if (priceUI.priceDisplay?.suffix)
1095
+ formattedPrice += ` ${priceUI.priceDisplay.suffix}`;
1097
1096
  return formattedPrice;
1098
1097
  };
1099
1098
  var formatBillingPeriod = (price) => {
1100
1099
  const priceUI = price.ui || {};
1101
- if (priceUI.billing_period) return priceUI.billing_period;
1100
+ if (priceUI.billingPeriod) return priceUI.billingPeriod;
1102
1101
  if (price.interval) {
1103
- const count = price.interval_count || 1;
1102
+ const count = price.intervalCount || 1;
1104
1103
  return `per ${count === 1 ? price.interval : `${count} ${price.interval}s`}`;
1105
1104
  }
1106
1105
  return "one-time";
@@ -1135,7 +1134,7 @@ function PricingCard({
1135
1134
  ),
1136
1135
  children: [
1137
1136
  /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(CardHeader, { className: "text-center", children: [
1138
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CardTitle, { className: "text-xl font-bold", children: ui.display_name || product.name }),
1137
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CardTitle, { className: "text-xl font-bold", children: ui.displayName || product.name }),
1139
1138
  ui.tagline && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(CardDescription, { className: "text-base", children: ui.tagline })
1140
1139
  ] }),
1141
1140
  /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(CardContent, { className: "flex-1 space-y-6", children: [
@@ -1143,7 +1142,7 @@ function PricingCard({
1143
1142
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "text-3xl font-bold", children: formatPrice(displayedPrice) }),
1144
1143
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "text-sm text-muted-foreground", children: formatBillingPeriod(displayedPrice) })
1145
1144
  ] }),
1146
- (ui.features && ui.features.length > 0 || displayedPrice.ui?.features?.length > 0 || displayedPrice.ui?.limits?.length > 0) && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-4", children: [
1145
+ (ui.features && ui.features.length > 0 || (displayedPrice.ui?.features?.length ?? 0) > 0 || (displayedPrice.ui?.limits?.length ?? 0) > 0) && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-4", children: [
1147
1146
  ui.features && ui.features.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-2", children: [
1148
1147
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "Features" }),
1149
1148
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "space-y-2", children: ui.features.map((feature, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("li", { className: "flex items-start gap-2", children: [
@@ -1162,16 +1161,14 @@ function PricingCard({
1162
1161
  ] }),
1163
1162
  displayedPrice.ui?.limits && displayedPrice.ui.limits.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-2", children: [
1164
1163
  /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "Usage Limits" }),
1165
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "space-y-1", children: displayedPrice.ui.limits.map(
1166
- (limit, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1167
- "li",
1168
- {
1169
- className: "text-sm text-muted-foreground",
1170
- children: limit.text
1171
- },
1172
- index
1173
- )
1174
- ) })
1164
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "space-y-1", children: displayedPrice.ui.limits.map((limit, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1165
+ "li",
1166
+ {
1167
+ className: "text-sm text-muted-foreground",
1168
+ children: limit.text || ""
1169
+ },
1170
+ index
1171
+ )) })
1175
1172
  ] })
1176
1173
  ] })
1177
1174
  ] }),
@@ -1182,7 +1179,7 @@ function PricingCard({
1182
1179
  variant: isHighlighted ? "default" : "outline",
1183
1180
  size: "lg",
1184
1181
  onClick: () => onPriceSelect?.(displayedPrice.id, product.id),
1185
- children: ui.cta_text || "Choose Plan"
1182
+ children: ui.ctaText || "Choose Plan"
1186
1183
  }
1187
1184
  ) })
1188
1185
  ]
@@ -1206,7 +1203,7 @@ function PricingTable({
1206
1203
  const [carouselIndex, setCarouselIndex] = React11.useState(0);
1207
1204
  const sortedProducts = React11.useMemo(
1208
1205
  () => [...products].sort(
1209
- (a, b) => (a.ui?.sort_order ?? 999) - (b.ui?.sort_order ?? 999)
1206
+ (a, b) => (a.ui?.sortOrder ?? 999) - (b.ui?.sortOrder ?? 999)
1210
1207
  ),
1211
1208
  [products]
1212
1209
  );
@@ -1597,7 +1594,8 @@ function UserInvite({ roles, onInvite }) {
1597
1594
  try {
1598
1595
  const inviteData = {
1599
1596
  email: email.trim(),
1600
- role: selectedRole
1597
+ role: selectedRole,
1598
+ inviteUrl: ""
1601
1599
  };
1602
1600
  await onInvite?.(inviteData);
1603
1601
  setEmail("");
@@ -1749,12 +1747,12 @@ function RoleCreator({
1749
1747
  };
1750
1748
  }, [definitions]);
1751
1749
  const roleSuggestions = (0, import_react3.useMemo)(() => {
1752
- return roles.map((role) => role.role_name);
1750
+ return roles.map((role) => role.roleName);
1753
1751
  }, [roles]);
1754
1752
  const handleRoleNameChange = (value) => {
1755
1753
  setRoleName(value);
1756
1754
  const existingRole = roles.find(
1757
- (role) => role.role_name.toLowerCase() === value.toLowerCase()
1755
+ (role) => role.roleName.toLowerCase() === value.toLowerCase()
1758
1756
  );
1759
1757
  if (existingRole) {
1760
1758
  setIsEditMode(true);
@@ -1937,61 +1935,11 @@ function RoleCreator({
1937
1935
  ]
1938
1936
  },
1939
1937
  resource.id
1940
- )) }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "mt-3 p-4 border-2 border-dashed rounded-lg text-center", children: [
1941
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
1942
- "No ",
1943
- namespace.namespace.toLowerCase(),
1944
- " resources available"
1945
- ] }),
1946
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("p", { className: "text-xs text-muted-foreground mt-1", children: [
1947
- "Use wildcard permissions (e.g., ",
1948
- namespaceLower,
1949
- ":*#permission) for all resources"
1950
- ] })
1951
- ] }),
1952
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "mt-4 space-y-2", children: [
1953
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Label, { className: "text-sm font-medium", children: [
1954
- "Wildcard Permissions (All ",
1955
- namespace.namespace,
1956
- "s)"
1957
- ] }),
1958
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-3", children: namespace.relations.map((relation) => {
1959
- const permissionString = buildPermissionString(
1960
- namespace.namespace,
1961
- relation,
1962
- "*"
1963
- );
1964
- const isChecked = selectedPermissions.has(permissionString);
1965
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1966
- "div",
1967
- {
1968
- className: "flex items-center space-x-2",
1969
- children: [
1970
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1971
- Checkbox,
1972
- {
1973
- id: permissionString,
1974
- checked: isChecked,
1975
- onCheckedChange: () => togglePermission(permissionString)
1976
- }
1977
- ),
1978
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1979
- Label,
1980
- {
1981
- htmlFor: permissionString,
1982
- className: "text-sm font-normal cursor-pointer",
1983
- children: [
1984
- relation.replace(/_/g, " "),
1985
- " (all)"
1986
- ]
1987
- }
1988
- )
1989
- ]
1990
- },
1991
- permissionString
1992
- );
1993
- }) })
1994
- ] })
1938
+ )) }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "mt-3 p-4 border-2 border-dashed rounded-lg text-center", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
1939
+ "No ",
1940
+ namespace.namespace.toLowerCase(),
1941
+ " resources available"
1942
+ ] }) })
1995
1943
  ] }) }, namespace.id);
1996
1944
  })
1997
1945
  ] })
@@ -2159,7 +2107,7 @@ function UserViewer({
2159
2107
  if (!searchQuery.trim()) return users;
2160
2108
  const query = searchQuery.toLowerCase();
2161
2109
  return users.filter(
2162
- (user) => user.first_name.toLowerCase().includes(query) || user.last_name.toLowerCase().includes(query) || user.email.toLowerCase().includes(query) || user.role.toLowerCase().includes(query)
2110
+ (user) => user.firstName.toLowerCase().includes(query) || user.lastName.toLowerCase().includes(query) || user.email.toLowerCase().includes(query) || user.role.toLowerCase().includes(query)
2163
2111
  );
2164
2112
  }, [users, searchQuery]);
2165
2113
  const handleRoleUpdate = async (userId, newRole) => {
@@ -2227,12 +2175,12 @@ function UserViewer({
2227
2175
  ] }) }),
2228
2176
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(TableBody, { children: filteredUsers.map((user) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(TableRow, { children: [
2229
2177
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(TableCell, { className: "font-medium", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex items-center gap-3", children: [
2230
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Avatar, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(AvatarFallback, { children: getInitials(user.first_name, user.last_name) }) }),
2178
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Avatar, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(AvatarFallback, { children: getInitials(user.firstName, user.lastName) }) }),
2231
2179
  /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { children: [
2232
2180
  /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "font-medium", children: [
2233
- user.first_name,
2181
+ user.firstName,
2234
2182
  " ",
2235
- user.last_name
2183
+ user.lastName
2236
2184
  ] }),
2237
2185
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "text-xs text-muted-foreground md:hidden", children: user.email })
2238
2186
  ] })
@@ -2242,8 +2190,8 @@ function UserViewer({
2242
2190
  Select,
2243
2191
  {
2244
2192
  value: user.role,
2245
- onValueChange: (newRole) => handleRoleUpdate(user.user_id, newRole),
2246
- disabled: isUpdating[user.user_id],
2193
+ onValueChange: (newRole) => handleRoleUpdate(user.userId, newRole),
2194
+ disabled: isUpdating[user.userId],
2247
2195
  children: [
2248
2196
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SelectTrigger, { className: "w-full", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SelectValue, {}) }),
2249
2197
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SelectContent, { children: availableRoles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SelectItem, { value: role, children: role }, role)) })
@@ -2255,8 +2203,8 @@ function UserViewer({
2255
2203
  {
2256
2204
  variant: "ghost",
2257
2205
  size: "icon",
2258
- onClick: () => handleRemoveUser(user.user_id),
2259
- disabled: isUpdating[user.user_id],
2206
+ onClick: () => handleRemoveUser(user.userId),
2207
+ disabled: isUpdating[user.userId],
2260
2208
  className: "h-8 w-8",
2261
2209
  children: [
2262
2210
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react4.UserX, { className: "h-4 w-4" }),
@@ -2264,7 +2212,7 @@ function UserViewer({
2264
2212
  ]
2265
2213
  }
2266
2214
  ) })
2267
- ] }, user.user_id)) })
2215
+ ] }, user.userId)) })
2268
2216
  ] }) }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "text-center py-12 border rounded-lg", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-muted-foreground", children: searchQuery ? "No users found matching your search" : "No users in this organization yet" }) })
2269
2217
  ] })
2270
2218
  ] });
package/dist/index.d.cts CHANGED
@@ -1,9 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { LoginFlow, RegistrationFlow, VerificationFlow, RecoveryFlow, SettingsFlow, UiNode, UiNodeInputAttributes } from '@ory/client-fetch';
3
3
  import * as React$1 from 'react';
4
- import { Tenant } from '@omnibase/core-js/tenants';
5
- import { Product } from '@omnibase/core-js/payments';
6
- import { NamespaceDefinition, Role } from '@omnibase/core-js';
4
+ import { ModelsTenant, ModelsProduct, TenantsCreateTenantUserInviteRequest, ModelsNamespaceDefinition, ModelsRole, TenantsTenantUserResponse } from '@omnibase/core-js';
7
5
 
8
6
  type LoginFormProps = {
9
7
  flow: LoginFlow;
@@ -55,7 +53,7 @@ declare function groupNodesByGroup(nodes: UiNode[]): Record<string, UiNode[]>;
55
53
 
56
54
  interface SwitchActiveTenantProps {
57
55
  /** Array of tenants available to the user */
58
- tenants: Tenant[];
56
+ tenants: ModelsTenant[];
59
57
  /** Currently active tenant ID */
60
58
  currentTenantId?: string;
61
59
  /** Custom form action to handle tenant switching */
@@ -83,7 +81,7 @@ interface SwitchActiveTenantProps {
83
81
  declare function SwitchActiveTenant({ tenants, currentTenantId, formAction, placeholder, className, onTenantChange, }: SwitchActiveTenantProps): react_jsx_runtime.JSX.Element;
84
82
 
85
83
  interface PricingTableProps {
86
- products: Product[];
84
+ products: ModelsProduct[];
87
85
  selectedPriceId?: string;
88
86
  onPriceSelect?: (priceId: string, productId: string) => void;
89
87
  className?: string;
@@ -127,13 +125,9 @@ interface TenantCreatorProps {
127
125
  }
128
126
  declare function TenantCreator({ config, formActions, className, }: TenantCreatorProps): react_jsx_runtime.JSX.Element;
129
127
 
130
- interface UserInviteData {
131
- email: string;
132
- role: string;
133
- }
134
128
  interface UserInviteProps {
135
129
  roles: string[];
136
- onInvite?: (inviteData: UserInviteData) => void | Promise<void>;
130
+ onInvite?: (inviteData: TenantsCreateTenantUserInviteRequest) => void | Promise<void>;
137
131
  }
138
132
  declare function UserInvite({ roles, onInvite }: UserInviteProps): react_jsx_runtime.JSX.Element;
139
133
 
@@ -142,8 +136,8 @@ interface NamespaceMapEntry {
142
136
  label: string;
143
137
  }
144
138
  interface RoleCreatorProps {
145
- definitions: NamespaceDefinition[];
146
- roles: Role[];
139
+ definitions: ModelsNamespaceDefinition[];
140
+ roles: ModelsRole[];
147
141
  namespaceMap?: Record<string, NamespaceMapEntry[]>;
148
142
  onRoleCreate?: (roleData: {
149
143
  role_name: string;
@@ -157,15 +151,8 @@ interface RoleCreatorProps {
157
151
  }
158
152
  declare function RoleCreator({ definitions, roles, namespaceMap, onRoleCreate, onRoleUpdate, }: RoleCreatorProps): react_jsx_runtime.JSX.Element;
159
153
 
160
- interface TenantUser {
161
- user_id: string;
162
- first_name: string;
163
- last_name: string;
164
- email: string;
165
- role: string;
166
- }
167
154
  interface UserViewerProps {
168
- users: TenantUser[];
155
+ users: TenantsTenantUserResponse[];
169
156
  availableRoles: string[];
170
157
  canEditUsers: boolean;
171
158
  onRoleUpdate?: (userId: string, newRole: string) => void | Promise<void>;
@@ -173,4 +160,4 @@ interface UserViewerProps {
173
160
  }
174
161
  declare function UserViewer({ users, availableRoles, canEditUsers, onRoleUpdate, onRemoveUser, }: UserViewerProps): react_jsx_runtime.JSX.Element;
175
162
 
176
- export { type CustomFormProps, type FlowType, LoginForm, type LoginFormProps, type NodesByGroup, PricingTable, type PricingTableProps, RecoveryForm, type RecoveryFormProps, RegistrationForm, type RegistrationFormProps, RoleCreator, SettingsForm, type SettingsFormProps, SwitchActiveTenant, type SwitchActiveTenantProps, TenantCreator, type TenantCreatorConfig, type TenantCreatorFormActions, type TenantCreatorProps, type TenantUser, UserInvite, UserViewer, VerificationForm, type VerificationFormProps, filterInputNodes, findAnchorNode, findCsrfToken, findSubmitButton, groupNodesByGroup, isUiNodeInputAttributes, sortNodes };
163
+ export { type CustomFormProps, type FlowType, LoginForm, type LoginFormProps, type NodesByGroup, PricingTable, type PricingTableProps, RecoveryForm, type RecoveryFormProps, RegistrationForm, type RegistrationFormProps, RoleCreator, SettingsForm, type SettingsFormProps, SwitchActiveTenant, type SwitchActiveTenantProps, TenantCreator, type TenantCreatorConfig, type TenantCreatorFormActions, type TenantCreatorProps, UserInvite, UserViewer, VerificationForm, type VerificationFormProps, filterInputNodes, findAnchorNode, findCsrfToken, findSubmitButton, groupNodesByGroup, isUiNodeInputAttributes, sortNodes };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { LoginFlow, RegistrationFlow, VerificationFlow, RecoveryFlow, SettingsFlow, UiNode, UiNodeInputAttributes } from '@ory/client-fetch';
3
3
  import * as React$1 from 'react';
4
- import { Tenant } from '@omnibase/core-js/tenants';
5
- import { Product } from '@omnibase/core-js/payments';
6
- import { NamespaceDefinition, Role } from '@omnibase/core-js';
4
+ import { ModelsTenant, ModelsProduct, TenantsCreateTenantUserInviteRequest, ModelsNamespaceDefinition, ModelsRole, TenantsTenantUserResponse } from '@omnibase/core-js';
7
5
 
8
6
  type LoginFormProps = {
9
7
  flow: LoginFlow;
@@ -55,7 +53,7 @@ declare function groupNodesByGroup(nodes: UiNode[]): Record<string, UiNode[]>;
55
53
 
56
54
  interface SwitchActiveTenantProps {
57
55
  /** Array of tenants available to the user */
58
- tenants: Tenant[];
56
+ tenants: ModelsTenant[];
59
57
  /** Currently active tenant ID */
60
58
  currentTenantId?: string;
61
59
  /** Custom form action to handle tenant switching */
@@ -83,7 +81,7 @@ interface SwitchActiveTenantProps {
83
81
  declare function SwitchActiveTenant({ tenants, currentTenantId, formAction, placeholder, className, onTenantChange, }: SwitchActiveTenantProps): react_jsx_runtime.JSX.Element;
84
82
 
85
83
  interface PricingTableProps {
86
- products: Product[];
84
+ products: ModelsProduct[];
87
85
  selectedPriceId?: string;
88
86
  onPriceSelect?: (priceId: string, productId: string) => void;
89
87
  className?: string;
@@ -127,13 +125,9 @@ interface TenantCreatorProps {
127
125
  }
128
126
  declare function TenantCreator({ config, formActions, className, }: TenantCreatorProps): react_jsx_runtime.JSX.Element;
129
127
 
130
- interface UserInviteData {
131
- email: string;
132
- role: string;
133
- }
134
128
  interface UserInviteProps {
135
129
  roles: string[];
136
- onInvite?: (inviteData: UserInviteData) => void | Promise<void>;
130
+ onInvite?: (inviteData: TenantsCreateTenantUserInviteRequest) => void | Promise<void>;
137
131
  }
138
132
  declare function UserInvite({ roles, onInvite }: UserInviteProps): react_jsx_runtime.JSX.Element;
139
133
 
@@ -142,8 +136,8 @@ interface NamespaceMapEntry {
142
136
  label: string;
143
137
  }
144
138
  interface RoleCreatorProps {
145
- definitions: NamespaceDefinition[];
146
- roles: Role[];
139
+ definitions: ModelsNamespaceDefinition[];
140
+ roles: ModelsRole[];
147
141
  namespaceMap?: Record<string, NamespaceMapEntry[]>;
148
142
  onRoleCreate?: (roleData: {
149
143
  role_name: string;
@@ -157,15 +151,8 @@ interface RoleCreatorProps {
157
151
  }
158
152
  declare function RoleCreator({ definitions, roles, namespaceMap, onRoleCreate, onRoleUpdate, }: RoleCreatorProps): react_jsx_runtime.JSX.Element;
159
153
 
160
- interface TenantUser {
161
- user_id: string;
162
- first_name: string;
163
- last_name: string;
164
- email: string;
165
- role: string;
166
- }
167
154
  interface UserViewerProps {
168
- users: TenantUser[];
155
+ users: TenantsTenantUserResponse[];
169
156
  availableRoles: string[];
170
157
  canEditUsers: boolean;
171
158
  onRoleUpdate?: (userId: string, newRole: string) => void | Promise<void>;
@@ -173,4 +160,4 @@ interface UserViewerProps {
173
160
  }
174
161
  declare function UserViewer({ users, availableRoles, canEditUsers, onRoleUpdate, onRemoveUser, }: UserViewerProps): react_jsx_runtime.JSX.Element;
175
162
 
176
- export { type CustomFormProps, type FlowType, LoginForm, type LoginFormProps, type NodesByGroup, PricingTable, type PricingTableProps, RecoveryForm, type RecoveryFormProps, RegistrationForm, type RegistrationFormProps, RoleCreator, SettingsForm, type SettingsFormProps, SwitchActiveTenant, type SwitchActiveTenantProps, TenantCreator, type TenantCreatorConfig, type TenantCreatorFormActions, type TenantCreatorProps, type TenantUser, UserInvite, UserViewer, VerificationForm, type VerificationFormProps, filterInputNodes, findAnchorNode, findCsrfToken, findSubmitButton, groupNodesByGroup, isUiNodeInputAttributes, sortNodes };
163
+ export { type CustomFormProps, type FlowType, LoginForm, type LoginFormProps, type NodesByGroup, PricingTable, type PricingTableProps, RecoveryForm, type RecoveryFormProps, RegistrationForm, type RegistrationFormProps, RoleCreator, SettingsForm, type SettingsFormProps, SwitchActiveTenant, type SwitchActiveTenantProps, TenantCreator, type TenantCreatorConfig, type TenantCreatorFormActions, type TenantCreatorProps, UserInvite, UserViewer, VerificationForm, type VerificationFormProps, filterInputNodes, findAnchorNode, findCsrfToken, findSubmitButton, groupNodesByGroup, isUiNodeInputAttributes, sortNodes };
package/dist/index.js CHANGED
@@ -95,7 +95,7 @@ var alertVariants = cva(
95
95
  destructive: "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
96
96
  warning: "border-yellow-500/50 text-yellow-700 bg-yellow-50 dark:border-yellow-500 dark:text-yellow-200 dark:bg-yellow-950/20 [&>svg]:text-yellow-600 dark:[&>svg]:text-yellow-200",
97
97
  success: "border-green-500/50 text-green-700 bg-green-50 dark:border-green-500 dark:text-green-200 dark:bg-green-950/20 [&>svg]:text-green-600 dark:[&>svg]:text-green-200",
98
- info: "border-blue-500/50 text-blue-900 bg-blue-50 dark:border-blue-500 dark:text-blue-200 dark:bg-blue-950/20 [&>svg]:text-blue-900 dark:[&>svg]:text-blue-200"
98
+ info: "border-blue-500/50 text-blue-700 bg-blue-50 dark:border-blue-500 dark:text-blue-200 dark:bg-blue-950/20 [&>svg]:text-blue-600 dark:[&>svg]:text-blue-200"
99
99
  }
100
100
  },
101
101
  defaultVariants: {
@@ -1034,21 +1034,20 @@ var getCurrencySymbol = (currency) => {
1034
1034
  };
1035
1035
  var formatPrice = (price) => {
1036
1036
  const priceUI = price.ui || {};
1037
- if (priceUI.price_display?.custom_text)
1038
- return priceUI.price_display.custom_text;
1037
+ if (priceUI.priceDisplay?.customText) return priceUI.priceDisplay.customText;
1039
1038
  if (!price.amount || price.amount === 0) return "Free";
1040
1039
  const amount = price.amount / 100;
1041
- const currency = price.currency.toUpperCase();
1042
- let formattedPrice = priceUI.price_display?.show_currency !== false ? `${getCurrencySymbol(currency)}${amount.toFixed(2)}` : amount.toFixed(2);
1043
- if (priceUI.price_display?.suffix)
1044
- formattedPrice += ` ${priceUI.price_display.suffix}`;
1040
+ const currency = (price.currency || "USD").toUpperCase();
1041
+ let formattedPrice = priceUI.priceDisplay?.showCurrency !== false ? `${getCurrencySymbol(currency)}${amount.toFixed(2)}` : amount.toFixed(2);
1042
+ if (priceUI.priceDisplay?.suffix)
1043
+ formattedPrice += ` ${priceUI.priceDisplay.suffix}`;
1045
1044
  return formattedPrice;
1046
1045
  };
1047
1046
  var formatBillingPeriod = (price) => {
1048
1047
  const priceUI = price.ui || {};
1049
- if (priceUI.billing_period) return priceUI.billing_period;
1048
+ if (priceUI.billingPeriod) return priceUI.billingPeriod;
1050
1049
  if (price.interval) {
1051
- const count = price.interval_count || 1;
1050
+ const count = price.intervalCount || 1;
1052
1051
  return `per ${count === 1 ? price.interval : `${count} ${price.interval}s`}`;
1053
1052
  }
1054
1053
  return "one-time";
@@ -1083,7 +1082,7 @@ function PricingCard({
1083
1082
  ),
1084
1083
  children: [
1085
1084
  /* @__PURE__ */ jsxs12(CardHeader, { className: "text-center", children: [
1086
- /* @__PURE__ */ jsx21(CardTitle, { className: "text-xl font-bold", children: ui.display_name || product.name }),
1085
+ /* @__PURE__ */ jsx21(CardTitle, { className: "text-xl font-bold", children: ui.displayName || product.name }),
1087
1086
  ui.tagline && /* @__PURE__ */ jsx21(CardDescription, { className: "text-base", children: ui.tagline })
1088
1087
  ] }),
1089
1088
  /* @__PURE__ */ jsxs12(CardContent, { className: "flex-1 space-y-6", children: [
@@ -1091,7 +1090,7 @@ function PricingCard({
1091
1090
  /* @__PURE__ */ jsx21("div", { className: "text-3xl font-bold", children: formatPrice(displayedPrice) }),
1092
1091
  /* @__PURE__ */ jsx21("div", { className: "text-sm text-muted-foreground", children: formatBillingPeriod(displayedPrice) })
1093
1092
  ] }),
1094
- (ui.features && ui.features.length > 0 || displayedPrice.ui?.features?.length > 0 || displayedPrice.ui?.limits?.length > 0) && /* @__PURE__ */ jsxs12("div", { className: "space-y-4", children: [
1093
+ (ui.features && ui.features.length > 0 || (displayedPrice.ui?.features?.length ?? 0) > 0 || (displayedPrice.ui?.limits?.length ?? 0) > 0) && /* @__PURE__ */ jsxs12("div", { className: "space-y-4", children: [
1095
1094
  ui.features && ui.features.length > 0 && /* @__PURE__ */ jsxs12("div", { className: "space-y-2", children: [
1096
1095
  /* @__PURE__ */ jsx21("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "Features" }),
1097
1096
  /* @__PURE__ */ jsx21("ul", { className: "space-y-2", children: ui.features.map((feature, index) => /* @__PURE__ */ jsxs12("li", { className: "flex items-start gap-2", children: [
@@ -1110,16 +1109,14 @@ function PricingCard({
1110
1109
  ] }),
1111
1110
  displayedPrice.ui?.limits && displayedPrice.ui.limits.length > 0 && /* @__PURE__ */ jsxs12("div", { className: "space-y-2", children: [
1112
1111
  /* @__PURE__ */ jsx21("h4", { className: "font-medium text-sm text-muted-foreground uppercase tracking-wide", children: "Usage Limits" }),
1113
- /* @__PURE__ */ jsx21("ul", { className: "space-y-1", children: displayedPrice.ui.limits.map(
1114
- (limit, index) => /* @__PURE__ */ jsx21(
1115
- "li",
1116
- {
1117
- className: "text-sm text-muted-foreground",
1118
- children: limit.text
1119
- },
1120
- index
1121
- )
1122
- ) })
1112
+ /* @__PURE__ */ jsx21("ul", { className: "space-y-1", children: displayedPrice.ui.limits.map((limit, index) => /* @__PURE__ */ jsx21(
1113
+ "li",
1114
+ {
1115
+ className: "text-sm text-muted-foreground",
1116
+ children: limit.text || ""
1117
+ },
1118
+ index
1119
+ )) })
1123
1120
  ] })
1124
1121
  ] })
1125
1122
  ] }),
@@ -1130,7 +1127,7 @@ function PricingCard({
1130
1127
  variant: isHighlighted ? "default" : "outline",
1131
1128
  size: "lg",
1132
1129
  onClick: () => onPriceSelect?.(displayedPrice.id, product.id),
1133
- children: ui.cta_text || "Choose Plan"
1130
+ children: ui.ctaText || "Choose Plan"
1134
1131
  }
1135
1132
  ) })
1136
1133
  ]
@@ -1154,7 +1151,7 @@ function PricingTable({
1154
1151
  const [carouselIndex, setCarouselIndex] = React11.useState(0);
1155
1152
  const sortedProducts = React11.useMemo(
1156
1153
  () => [...products].sort(
1157
- (a, b) => (a.ui?.sort_order ?? 999) - (b.ui?.sort_order ?? 999)
1154
+ (a, b) => (a.ui?.sortOrder ?? 999) - (b.ui?.sortOrder ?? 999)
1158
1155
  ),
1159
1156
  [products]
1160
1157
  );
@@ -1545,7 +1542,8 @@ function UserInvite({ roles, onInvite }) {
1545
1542
  try {
1546
1543
  const inviteData = {
1547
1544
  email: email.trim(),
1548
- role: selectedRole
1545
+ role: selectedRole,
1546
+ inviteUrl: ""
1549
1547
  };
1550
1548
  await onInvite?.(inviteData);
1551
1549
  setEmail("");
@@ -1697,12 +1695,12 @@ function RoleCreator({
1697
1695
  };
1698
1696
  }, [definitions]);
1699
1697
  const roleSuggestions = useMemo2(() => {
1700
- return roles.map((role) => role.role_name);
1698
+ return roles.map((role) => role.roleName);
1701
1699
  }, [roles]);
1702
1700
  const handleRoleNameChange = (value) => {
1703
1701
  setRoleName(value);
1704
1702
  const existingRole = roles.find(
1705
- (role) => role.role_name.toLowerCase() === value.toLowerCase()
1703
+ (role) => role.roleName.toLowerCase() === value.toLowerCase()
1706
1704
  );
1707
1705
  if (existingRole) {
1708
1706
  setIsEditMode(true);
@@ -1885,61 +1883,11 @@ function RoleCreator({
1885
1883
  ]
1886
1884
  },
1887
1885
  resource.id
1888
- )) }) : /* @__PURE__ */ jsxs15("div", { className: "mt-3 p-4 border-2 border-dashed rounded-lg text-center", children: [
1889
- /* @__PURE__ */ jsxs15("p", { className: "text-sm text-muted-foreground", children: [
1890
- "No ",
1891
- namespace.namespace.toLowerCase(),
1892
- " resources available"
1893
- ] }),
1894
- /* @__PURE__ */ jsxs15("p", { className: "text-xs text-muted-foreground mt-1", children: [
1895
- "Use wildcard permissions (e.g., ",
1896
- namespaceLower,
1897
- ":*#permission) for all resources"
1898
- ] })
1899
- ] }),
1900
- /* @__PURE__ */ jsxs15("div", { className: "mt-4 space-y-2", children: [
1901
- /* @__PURE__ */ jsxs15(Label, { className: "text-sm font-medium", children: [
1902
- "Wildcard Permissions (All ",
1903
- namespace.namespace,
1904
- "s)"
1905
- ] }),
1906
- /* @__PURE__ */ jsx26("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-3", children: namespace.relations.map((relation) => {
1907
- const permissionString = buildPermissionString(
1908
- namespace.namespace,
1909
- relation,
1910
- "*"
1911
- );
1912
- const isChecked = selectedPermissions.has(permissionString);
1913
- return /* @__PURE__ */ jsxs15(
1914
- "div",
1915
- {
1916
- className: "flex items-center space-x-2",
1917
- children: [
1918
- /* @__PURE__ */ jsx26(
1919
- Checkbox,
1920
- {
1921
- id: permissionString,
1922
- checked: isChecked,
1923
- onCheckedChange: () => togglePermission(permissionString)
1924
- }
1925
- ),
1926
- /* @__PURE__ */ jsxs15(
1927
- Label,
1928
- {
1929
- htmlFor: permissionString,
1930
- className: "text-sm font-normal cursor-pointer",
1931
- children: [
1932
- relation.replace(/_/g, " "),
1933
- " (all)"
1934
- ]
1935
- }
1936
- )
1937
- ]
1938
- },
1939
- permissionString
1940
- );
1941
- }) })
1942
- ] })
1886
+ )) }) : /* @__PURE__ */ jsx26("div", { className: "mt-3 p-4 border-2 border-dashed rounded-lg text-center", children: /* @__PURE__ */ jsxs15("p", { className: "text-sm text-muted-foreground", children: [
1887
+ "No ",
1888
+ namespace.namespace.toLowerCase(),
1889
+ " resources available"
1890
+ ] }) })
1943
1891
  ] }) }, namespace.id);
1944
1892
  })
1945
1893
  ] })
@@ -2107,7 +2055,7 @@ function UserViewer({
2107
2055
  if (!searchQuery.trim()) return users;
2108
2056
  const query = searchQuery.toLowerCase();
2109
2057
  return users.filter(
2110
- (user) => user.first_name.toLowerCase().includes(query) || user.last_name.toLowerCase().includes(query) || user.email.toLowerCase().includes(query) || user.role.toLowerCase().includes(query)
2058
+ (user) => user.firstName.toLowerCase().includes(query) || user.lastName.toLowerCase().includes(query) || user.email.toLowerCase().includes(query) || user.role.toLowerCase().includes(query)
2111
2059
  );
2112
2060
  }, [users, searchQuery]);
2113
2061
  const handleRoleUpdate = async (userId, newRole) => {
@@ -2175,12 +2123,12 @@ function UserViewer({
2175
2123
  ] }) }),
2176
2124
  /* @__PURE__ */ jsx29(TableBody, { children: filteredUsers.map((user) => /* @__PURE__ */ jsxs16(TableRow, { children: [
2177
2125
  /* @__PURE__ */ jsx29(TableCell, { className: "font-medium", children: /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-3", children: [
2178
- /* @__PURE__ */ jsx29(Avatar, { children: /* @__PURE__ */ jsx29(AvatarFallback, { children: getInitials(user.first_name, user.last_name) }) }),
2126
+ /* @__PURE__ */ jsx29(Avatar, { children: /* @__PURE__ */ jsx29(AvatarFallback, { children: getInitials(user.firstName, user.lastName) }) }),
2179
2127
  /* @__PURE__ */ jsxs16("div", { children: [
2180
2128
  /* @__PURE__ */ jsxs16("div", { className: "font-medium", children: [
2181
- user.first_name,
2129
+ user.firstName,
2182
2130
  " ",
2183
- user.last_name
2131
+ user.lastName
2184
2132
  ] }),
2185
2133
  /* @__PURE__ */ jsx29("div", { className: "text-xs text-muted-foreground md:hidden", children: user.email })
2186
2134
  ] })
@@ -2190,8 +2138,8 @@ function UserViewer({
2190
2138
  Select,
2191
2139
  {
2192
2140
  value: user.role,
2193
- onValueChange: (newRole) => handleRoleUpdate(user.user_id, newRole),
2194
- disabled: isUpdating[user.user_id],
2141
+ onValueChange: (newRole) => handleRoleUpdate(user.userId, newRole),
2142
+ disabled: isUpdating[user.userId],
2195
2143
  children: [
2196
2144
  /* @__PURE__ */ jsx29(SelectTrigger, { className: "w-full", children: /* @__PURE__ */ jsx29(SelectValue, {}) }),
2197
2145
  /* @__PURE__ */ jsx29(SelectContent, { children: availableRoles.map((role) => /* @__PURE__ */ jsx29(SelectItem, { value: role, children: role }, role)) })
@@ -2203,8 +2151,8 @@ function UserViewer({
2203
2151
  {
2204
2152
  variant: "ghost",
2205
2153
  size: "icon",
2206
- onClick: () => handleRemoveUser(user.user_id),
2207
- disabled: isUpdating[user.user_id],
2154
+ onClick: () => handleRemoveUser(user.userId),
2155
+ disabled: isUpdating[user.userId],
2208
2156
  className: "h-8 w-8",
2209
2157
  children: [
2210
2158
  /* @__PURE__ */ jsx29(UserX, { className: "h-4 w-4" }),
@@ -2212,7 +2160,7 @@ function UserViewer({
2212
2160
  ]
2213
2161
  }
2214
2162
  ) })
2215
- ] }, user.user_id)) })
2163
+ ] }, user.userId)) })
2216
2164
  ] }) }) : /* @__PURE__ */ jsx29("div", { className: "text-center py-12 border rounded-lg", children: /* @__PURE__ */ jsx29("p", { className: "text-muted-foreground", children: searchQuery ? "No users found matching your search" : "No users in this organization yet" }) })
2217
2165
  ] })
2218
2166
  ] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnibase/shadcn",
3
- "version": "0.5.3",
3
+ "version": "0.5.5",
4
4
  "description": "OmniBase ShadCN UI Package",
5
5
  "type": "module",
6
6
  "exports": {
@@ -36,22 +36,22 @@
36
36
  "react-dom": "^19.1.0"
37
37
  },
38
38
  "dependencies": {
39
- "@radix-ui/react-avatar": "^1.1.10",
39
+ "@omnibase/core-js": "^0.9.4",
40
+ "@radix-ui/react-avatar": "^1.1.11",
40
41
  "@radix-ui/react-checkbox": "^1.3.3",
41
- "@radix-ui/react-label": "^2.1.7",
42
+ "@radix-ui/react-label": "^2.1.8",
42
43
  "@radix-ui/react-select": "^2.2.6",
43
- "@radix-ui/react-separator": "^1.1.7",
44
- "@radix-ui/react-slot": "^1.2.3",
45
- "@types/node": "^24.9.1",
44
+ "@radix-ui/react-separator": "^1.1.8",
45
+ "@radix-ui/react-slot": "^1.2.4",
46
+ "@types/node": "^24.10.0",
46
47
  "class-variance-authority": "^0.7.1",
47
48
  "clsx": "^2.1.1",
48
49
  "lucide-react": "^0.544.0",
49
50
  "tailwind-merge": "^2.6.0"
50
51
  },
51
52
  "devDependencies": {
52
- "@omnibase/core-js": "0.7.6",
53
- "@storybook/addon-docs": "^9.1.15",
54
- "@storybook/react-vite": "^9.1.15",
53
+ "@storybook/addon-docs": "^9.1.16",
54
+ "@storybook/react-vite": "^9.1.16",
55
55
  "@tailwindcss/vite": "^4.1.16",
56
56
  "@types/react": "^19.2.2",
57
57
  "@types/react-dom": "^19.2.2",
@@ -62,14 +62,14 @@
62
62
  "autoprefixer": "^10.4.21",
63
63
  "eslint": "^8.57.1",
64
64
  "eslint-plugin-react-hooks": "^4.6.2",
65
- "eslint-plugin-storybook": "^9.1.15",
65
+ "eslint-plugin-storybook": "^9.1.16",
66
66
  "react": "^19.2.0",
67
67
  "react-dom": "^19.2.0",
68
- "storybook": "^9.1.15",
68
+ "storybook": "^9.1.16",
69
69
  "tailwindcss": "^4.1.16",
70
70
  "tsup": "^8.5.0",
71
71
  "typescript": "^5.9.3",
72
- "vite": "^7.1.12",
72
+ "vite": "^7.2.1",
73
73
  "vite-plugin-dts": "^4.5.4"
74
74
  }
75
75
  }