@motor-hero/ui-kit 0.19.0 → 0.20.1

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.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // src/components/theme-provider.tsx
2
2
  import { createContext, useContext, useEffect, useState } from "react";
3
3
 
4
- // src/lib/tenant-theme.ts
4
+ // src/lib/company-theme.ts
5
5
  var VAR_MAP = {
6
6
  primary: "--color-primary",
7
7
  primaryForeground: "--color-primary-foreground",
@@ -11,8 +11,14 @@ var VAR_MAP = {
11
11
  accentForeground: "--color-accent-foreground",
12
12
  ring: "--color-ring"
13
13
  };
14
- function applyTenantTheme(root, tenantTheme, mode) {
15
- const tokens = tenantTheme ? mode === "dark" ? { ...tenantTheme.light, ...tenantTheme.dark } : tenantTheme.light : {};
14
+ function definedTokens(tokens) {
15
+ if (!tokens) return {};
16
+ return Object.fromEntries(
17
+ Object.entries(tokens).filter(([, value]) => value != null)
18
+ );
19
+ }
20
+ function applyCompanyTheme(root, companyTheme, mode) {
21
+ const tokens = companyTheme ? mode === "dark" ? { ...companyTheme.light, ...definedTokens(companyTheme.dark) } : companyTheme.light : {};
16
22
  for (const key of Object.keys(VAR_MAP)) {
17
23
  const value = tokens[key];
18
24
  if (value) root.style.setProperty(VAR_MAP[key], value);
@@ -31,7 +37,7 @@ function ThemeProvider({
31
37
  children,
32
38
  defaultTheme = "system",
33
39
  storageKey = "ui-theme",
34
- tenantTheme,
40
+ companyTheme,
35
41
  ...props
36
42
  }) {
37
43
  const [theme, setTheme] = useState(
@@ -42,7 +48,7 @@ function ThemeProvider({
42
48
  const applyResolved = (resolved) => {
43
49
  root.classList.remove("light", "dark");
44
50
  root.classList.add(resolved);
45
- applyTenantTheme(root, tenantTheme, resolved);
51
+ applyCompanyTheme(root, companyTheme, resolved);
46
52
  };
47
53
  if (theme === "system") {
48
54
  const mql = window.matchMedia("(prefers-color-scheme: dark)");
@@ -52,7 +58,7 @@ function ThemeProvider({
52
58
  return () => mql.removeEventListener("change", onChange);
53
59
  }
54
60
  applyResolved(theme);
55
- }, [theme, tenantTheme]);
61
+ }, [theme, companyTheme]);
56
62
  const value = {
57
63
  theme,
58
64
  setTheme: (theme2) => {
@@ -70,6 +76,42 @@ function useTheme() {
70
76
  return context;
71
77
  }
72
78
 
79
+ // src/hooks/use-company-subdomain.ts
80
+ import { useState as useState2 } from "react";
81
+ function getSubdomain(hostname) {
82
+ const labels = hostname.split(".");
83
+ if (labels.length < 2) return void 0;
84
+ const first = labels[0];
85
+ if (!first || first === "www" || first === "localhost") return void 0;
86
+ return first;
87
+ }
88
+ function resolveOverride(storageKey) {
89
+ if (typeof window === "undefined") return void 0;
90
+ const params = new URLSearchParams(window.location.search);
91
+ if (params.has("company")) {
92
+ const value = params.get("company");
93
+ if (value) {
94
+ window.localStorage.setItem(storageKey, value);
95
+ return value;
96
+ }
97
+ window.localStorage.removeItem(storageKey);
98
+ return void 0;
99
+ }
100
+ return window.localStorage.getItem(storageKey) ?? void 0;
101
+ }
102
+ function useCompanySubdomain(opts = {}) {
103
+ const { enableOverride = false, overrideStorageKey = "company-subdomain" } = opts;
104
+ const [subdomain] = useState2(() => {
105
+ if (enableOverride) {
106
+ const override = resolveOverride(overrideStorageKey);
107
+ if (override) return override;
108
+ }
109
+ if (typeof window === "undefined") return void 0;
110
+ return getSubdomain(window.location.hostname);
111
+ });
112
+ return { subdomain };
113
+ }
114
+
73
115
  // src/components/mode-toggle.tsx
74
116
  import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
75
117
  import { Moon, Sun, Monitor } from "lucide-react";
@@ -888,7 +930,7 @@ function Toaster(props) {
888
930
 
889
931
  // src/components/app-shell.tsx
890
932
  import { ChevronLeft, ChevronRight, Menu } from "lucide-react";
891
- import { useState as useState6 } from "react";
933
+ import { useState as useState7 } from "react";
892
934
 
893
935
  // src/components/sidebar-nav.tsx
894
936
  import { Fragment as Fragment3 } from "react";
@@ -937,7 +979,7 @@ function SidebarNav({
937
979
  // src/components/user-menu.tsx
938
980
  import * as DropdownMenu2 from "@radix-ui/react-dropdown-menu";
939
981
  import { LogOut, User } from "lucide-react";
940
- import { useState as useState5 } from "react";
982
+ import { useState as useState6 } from "react";
941
983
  import { Drawer as DrawerPrimitive2 } from "vaul";
942
984
  import { Fragment as Fragment5, jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
943
985
  function initials(user) {
@@ -958,7 +1000,7 @@ function UserMenu({
958
1000
  align = "end"
959
1001
  }) {
960
1002
  const isDesktop = useIsDesktop();
961
- const [open, setOpen] = useState5(false);
1003
+ const [open, setOpen] = useState6(false);
962
1004
  const label = initials(user);
963
1005
  const trigger = /* @__PURE__ */ jsx24(
964
1006
  "button",
@@ -1123,8 +1165,8 @@ function AppShell({
1123
1165
  defaultCollapsed = false,
1124
1166
  children
1125
1167
  }) {
1126
- const [collapsed, setCollapsed] = useState6(defaultCollapsed);
1127
- const [mobileOpen, setMobileOpen] = useState6(false);
1168
+ const [collapsed, setCollapsed] = useState7(defaultCollapsed);
1169
+ const [mobileOpen, setMobileOpen] = useState7(false);
1128
1170
  const nav = (isCollapsed, onNavigate) => /* @__PURE__ */ jsx25(
1129
1171
  SidebarNav,
1130
1172
  {
@@ -1213,7 +1255,7 @@ function AppShell({
1213
1255
  // src/components/row-actions-menu.tsx
1214
1256
  import * as DropdownMenu3 from "@radix-ui/react-dropdown-menu";
1215
1257
  import { MoreVertical } from "lucide-react";
1216
- import { useState as useState7 } from "react";
1258
+ import { useState as useState8 } from "react";
1217
1259
  import { Drawer as DrawerPrimitive3 } from "vaul";
1218
1260
  import { Fragment as Fragment6, jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1219
1261
  var triggerClass = "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50";
@@ -1227,7 +1269,7 @@ function RowActionsMenu({
1227
1269
  renderLink = defaultRenderLink
1228
1270
  }) {
1229
1271
  const isDesktop = useIsDesktop();
1230
- const [open, setOpen] = useState7(false);
1272
+ const [open, setOpen] = useState8(false);
1231
1273
  if (actions.length === 0) return null;
1232
1274
  const trigger = /* @__PURE__ */ jsx26(
1233
1275
  "button",
@@ -1344,9 +1386,9 @@ function extractApiError(err, fallbackMessage = "Ocorreu um erro inesperado.") {
1344
1386
  }
1345
1387
 
1346
1388
  // src/hooks/use-disclosure.ts
1347
- import { useCallback, useState as useState8 } from "react";
1389
+ import { useCallback, useState as useState9 } from "react";
1348
1390
  function useDisclosure(initial = false) {
1349
- const [open, setOpen] = useState8(initial);
1391
+ const [open, setOpen] = useState9(initial);
1350
1392
  const onOpen = useCallback(() => setOpen(true), []);
1351
1393
  const onClose = useCallback(() => setOpen(false), []);
1352
1394
  const onToggle = useCallback(() => setOpen((v) => !v), []);
@@ -1405,11 +1447,13 @@ export {
1405
1447
  ThemeProvider,
1406
1448
  Toaster,
1407
1449
  UserMenu,
1408
- applyTenantTheme,
1450
+ applyCompanyTheme,
1409
1451
  cn,
1410
1452
  defaultRenderLink,
1411
1453
  extractApiError,
1454
+ getSubdomain,
1412
1455
  toast,
1456
+ useCompanySubdomain,
1413
1457
  useCustomToast,
1414
1458
  useDisclosure,
1415
1459
  useIsDesktop,