@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/components/theme-provider.d.ts +3 -3
- package/dist/components/theme-provider.d.ts.map +1 -1
- package/dist/hooks/use-company-subdomain.d.ts +10 -0
- package/dist/hooks/use-company-subdomain.d.ts.map +1 -0
- package/dist/index.cjs +76 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/company-theme.d.ts +15 -0
- package/dist/lib/company-theme.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/components/theme-provider.tsx +5 -5
- package/src/hooks/use-company-subdomain.ts +51 -0
- package/src/index.ts +7 -2
- package/src/lib/company-theme.ts +54 -0
- package/dist/lib/tenant-theme.d.ts +0 -15
- package/dist/lib/tenant-theme.d.ts.map +0 -1
- package/src/lib/tenant-theme.ts +0 -42
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/
|
|
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
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
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] =
|
|
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] =
|
|
1127
|
-
const [mobileOpen, setMobileOpen] =
|
|
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
|
|
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] =
|
|
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
|
|
1389
|
+
import { useCallback, useState as useState9 } from "react";
|
|
1348
1390
|
function useDisclosure(initial = false) {
|
|
1349
|
-
const [open, setOpen] =
|
|
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
|
-
|
|
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,
|