pixelize-design-library 2.3.16 → 2.3.19

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.
Files changed (37) hide show
  1. package/.cursor/modules/inputs-date-file/MODULE.md +1 -0
  2. package/.cursor/modules/layout-navigation/MODULE.md +46 -1
  3. package/dist/App.d.ts.map +1 -1
  4. package/dist/Assets/defaultLogo.tsx +30 -0
  5. package/dist/Components/DatePicker/SingleDatePicker.d.ts.map +1 -1
  6. package/dist/Components/DatePicker/SingleDatePicker.js +30 -2
  7. package/dist/Components/Input/textInputIconSize.test.d.ts +1 -0
  8. package/dist/Components/Input/textInputIconSize.test.js +27 -0
  9. package/dist/Components/KanbanBoard/AccountCard.test.d.ts +1 -0
  10. package/dist/Components/KanbanBoard/AccountCard.test.js +68 -0
  11. package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.test.d.ts +1 -0
  12. package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.test.js +49 -0
  13. package/dist/Components/KanbanBoard/KanbanBoard.test.d.ts +1 -0
  14. package/dist/Components/KanbanBoard/KanbanBoard.test.js +185 -0
  15. package/dist/Components/SearchSelect/searchSelectSize.test.d.ts +1 -0
  16. package/dist/Components/SearchSelect/searchSelectSize.test.js +22 -0
  17. package/dist/Components/SideBar/SideBar.d.ts.map +1 -1
  18. package/dist/Components/SideBar/SideBar.js +4 -2
  19. package/dist/Components/SideBar/components/OtherApps.test.d.ts +1 -0
  20. package/dist/Components/SideBar/components/OtherApps.test.js +111 -0
  21. package/dist/Components/Table/components/TableBody.virtualize.test.d.ts +1 -0
  22. package/dist/Components/Table/components/TableBody.virtualize.test.js +93 -0
  23. package/dist/Components/Table/settings/ManageColumns.test.d.ts +1 -0
  24. package/dist/Components/Table/settings/ManageColumns.test.js +146 -0
  25. package/dist/Hooks/useSidebarPrefs.d.ts +67 -0
  26. package/dist/Hooks/useSidebarPrefs.d.ts.map +1 -0
  27. package/dist/Hooks/useSidebarPrefs.js +72 -0
  28. package/dist/Theme/buildBrandTokens.test.d.ts +1 -0
  29. package/dist/Theme/buildBrandTokens.test.js +31 -0
  30. package/dist/Theme/chartColorsFromTheme.test.d.ts +1 -0
  31. package/dist/Theme/chartColorsFromTheme.test.js +35 -0
  32. package/dist/Utils/tableNormalizeCellValue.test.d.ts +1 -0
  33. package/dist/Utils/tableNormalizeCellValue.test.js +41 -0
  34. package/dist/index.d.ts +3 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3 -1
  37. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var react_1 = __importDefault(require("react"));
43
+ var react_2 = require("@testing-library/react");
44
+ var user_event_1 = __importDefault(require("@testing-library/user-event"));
45
+ require("@testing-library/jest-dom");
46
+ var react_3 = require("@chakra-ui/react");
47
+ var OtherApps_1 = __importDefault(require("./OtherApps"));
48
+ jest.mock("../../../Theme/useCustomTheme", function () { return ({
49
+ useCustomTheme: function () { return ({
50
+ colors: {
51
+ white: "#fff",
52
+ gray: { 400: "#a0aec0" },
53
+ primary: { 500: "#3182ce", 700: "#2c5282" },
54
+ sidebar: {
55
+ background: {
56
+ 200: "#2d3748",
57
+ 500: "#1a202c",
58
+ },
59
+ },
60
+ },
61
+ }); },
62
+ }); });
63
+ var sampleApps = [
64
+ {
65
+ name: "Billing",
66
+ color: "#3182ce",
67
+ description: "Billing app",
68
+ onClick: jest.fn(),
69
+ },
70
+ {
71
+ name: "Tickets",
72
+ color: "#38a169",
73
+ onClick: jest.fn(),
74
+ },
75
+ ];
76
+ var renderWithChakra = function (ui) { return (0, react_2.render)(react_1.default.createElement(react_3.ChakraProvider, null, ui)); };
77
+ describe("OtherApps", function () {
78
+ beforeEach(function () {
79
+ jest.clearAllMocks();
80
+ });
81
+ it("does not render flyout copy when expanded", function () {
82
+ renderWithChakra(react_1.default.createElement(OtherApps_1.default, { toggle: false, otherApps: sampleApps }));
83
+ expect(react_2.screen.getByText("Other Apps")).toBeInTheDocument();
84
+ expect(react_2.screen.getByText("Billing")).toBeInTheDocument();
85
+ expect(react_2.screen.queryAllByRole("tooltip")).toHaveLength(0);
86
+ });
87
+ it("shows flyout with Open label on hover when collapsed", function () { return __awaiter(void 0, void 0, void 0, function () {
88
+ var buttons, _a;
89
+ return __generator(this, function (_b) {
90
+ switch (_b.label) {
91
+ case 0:
92
+ renderWithChakra(react_1.default.createElement(OtherApps_1.default, { toggle: true, otherApps: sampleApps }));
93
+ buttons = react_2.screen.getAllByRole("button");
94
+ expect(buttons).toHaveLength(2);
95
+ return [4 /*yield*/, user_event_1.default.hover(buttons[0])];
96
+ case 1:
97
+ _b.sent();
98
+ _a = expect;
99
+ return [4 /*yield*/, react_2.screen.findByText("Billing app")];
100
+ case 2:
101
+ _a.apply(void 0, [_b.sent()]).toBeInTheDocument();
102
+ return [2 /*return*/];
103
+ }
104
+ });
105
+ }); });
106
+ it("renders no app rows when otherApps is empty", function () {
107
+ renderWithChakra(react_1.default.createElement(OtherApps_1.default, { toggle: true, otherApps: [] }));
108
+ expect(react_2.screen.queryByRole("button")).not.toBeInTheDocument();
109
+ expect(react_2.screen.queryByText("Billing")).not.toBeInTheDocument();
110
+ });
111
+ });
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom";
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var react_1 = __importStar(require("react"));
40
+ var react_2 = require("@testing-library/react");
41
+ require("@testing-library/jest-dom");
42
+ var react_3 = require("@chakra-ui/react");
43
+ var TableBody_1 = __importDefault(require("./TableBody"));
44
+ jest.mock("../../../Theme/useCustomTheme", function () { return ({
45
+ useCustomTheme: function () { return ({
46
+ colors: {
47
+ background: { 50: "#fff", 100: "#f9f9f9" },
48
+ backgroundColor: { light: "#fafafa", secondary: "#eee", muted: "#f3f3f3" },
49
+ disabled: { 100: "#eee" },
50
+ gray: { 100: "#f0f0f0", 200: "#eee", 300: "#ddd", 400: "#ccc", 500: "#bbb", 600: "#666" },
51
+ border: { 500: "#ddd" },
52
+ primary: { 500: "#3182ce" },
53
+ text: { 500: "#555" },
54
+ secondary: { opacity: { 4: "rgba(0,0,0,0.04)" } },
55
+ white: "#fff",
56
+ },
57
+ shadows: { lg: "0 0 0" },
58
+ }); },
59
+ }); });
60
+ var columns = [{ id: "name", label: "Name" }];
61
+ var makeData = function (n) {
62
+ return Array.from({ length: n }, function (_, i) { return ({ id: i, name: "Row ".concat(i) }); });
63
+ };
64
+ var Harness = function (_a) {
65
+ var count = _a.count;
66
+ var ref = (0, react_1.useRef)(null);
67
+ return (react_1.default.createElement(react_3.ChakraProvider, null,
68
+ react_1.default.createElement("div", { ref: ref },
69
+ react_1.default.createElement(react_3.Table, null,
70
+ react_1.default.createElement(react_3.Tbody, null,
71
+ react_1.default.createElement(TableBody_1.default, { data: makeData(count), columns: columns, startRow: 0, endRow: count, columnWidths: [120], isCheckbox: false, isContent: false, isLink: false, isActionFreeze: false, noBorders: false, selections: [], handleCheckbox: function () { }, scrollContainerRef: ref }))))));
72
+ };
73
+ describe("TableBody virtualization", function () {
74
+ it("windows large pages and reserves height with spacer rows", function () {
75
+ var _a = (0, react_2.render)(react_1.default.createElement(Harness, { count: 100 })), container = _a.container, queryByText = _a.queryByText;
76
+ // jsdom clientHeight=0 -> 500px fallback -> ceil(500/45)+12 = 24 rows
77
+ expect(queryByText("Row 0")).toBeInTheDocument();
78
+ expect(queryByText("Row 23")).toBeInTheDocument();
79
+ // Rows beyond the window are not mounted.
80
+ expect(queryByText("Row 50")).not.toBeInTheDocument();
81
+ expect(queryByText("Row 99")).not.toBeInTheDocument();
82
+ // A trailing spacer reserves the height of the unrendered rows.
83
+ var spacers = container.querySelectorAll('tr[aria-hidden="true"]');
84
+ expect(spacers.length).toBe(1);
85
+ expect(spacers[0]).toHaveStyle({ height: "".concat((100 - 24) * 45, "px") });
86
+ });
87
+ it("renders every row and no spacers below the threshold", function () {
88
+ var _a = (0, react_2.render)(react_1.default.createElement(Harness, { count: 30 })), container = _a.container, queryByText = _a.queryByText;
89
+ expect(queryByText("Row 0")).toBeInTheDocument();
90
+ expect(queryByText("Row 29")).toBeInTheDocument();
91
+ expect(container.querySelectorAll('tr[aria-hidden="true"]').length).toBe(0);
92
+ });
93
+ });
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom";
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
70
+ };
71
+ var __importDefault = (this && this.__importDefault) || function (mod) {
72
+ return (mod && mod.__esModule) ? mod : { "default": mod };
73
+ };
74
+ Object.defineProperty(exports, "__esModule", { value: true });
75
+ var react_1 = __importStar(require("react"));
76
+ var react_2 = require("@testing-library/react");
77
+ require("@testing-library/jest-dom");
78
+ var react_3 = require("@chakra-ui/react");
79
+ var ManageColumns_1 = __importDefault(require("./ManageColumns"));
80
+ jest.mock("../../../Theme/useCustomTheme", function () { return ({
81
+ useCustomTheme: function () { return ({
82
+ colors: {
83
+ gray: {
84
+ 50: "#fafafa",
85
+ 100: "#f5f5f5",
86
+ 200: "#eee",
87
+ 400: "#ccc",
88
+ 500: "#999",
89
+ 600: "#666",
90
+ },
91
+ primary: {
92
+ 50: "#eef",
93
+ 100: "#ddf",
94
+ 300: "#99c",
95
+ 400: "#66a",
96
+ 500: "#338",
97
+ },
98
+ red: { 50: "#fee", 200: "#fcc", 600: "#c00" },
99
+ border: { 200: "#e2e8f0" },
100
+ white: "#fff",
101
+ },
102
+ shadows: { sm: "0 1px 2px rgba(0,0,0,0.05)" },
103
+ }); },
104
+ }); });
105
+ var renderWithChakra = function (ui) {
106
+ return (0, react_2.render)(react_1.default.createElement(react_3.ChakraProvider, null, ui));
107
+ };
108
+ function ManageColumnsHarness(_a) {
109
+ var columns = _a.columns, childRef = _a.childRef;
110
+ var _b = (0, react_1.useState)(columns), items = _b[0], setItems = _b[1];
111
+ return (react_1.default.createElement(ManageColumns_1.default, { columns: columns, items: items, setItems: setItems, childInputMethodsRef: childRef }));
112
+ }
113
+ describe("ManageColumns", function () {
114
+ it("syncs local column state when the columns prop changes", function () { return __awaiter(void 0, void 0, void 0, function () {
115
+ var childRef, columnsA, columnsB, rerender;
116
+ var _a, _b;
117
+ return __generator(this, function (_c) {
118
+ switch (_c.label) {
119
+ case 0:
120
+ childRef = (0, react_1.createRef)();
121
+ columnsA = [
122
+ { id: "a", label: "Alpha", isHidden: false },
123
+ { id: "b", label: "Beta", isHidden: true },
124
+ ];
125
+ columnsB = [
126
+ { id: "a", label: "Alpha", isHidden: true },
127
+ { id: "b", label: "Beta", isHidden: false },
128
+ ];
129
+ rerender = renderWithChakra(react_1.default.createElement(ManageColumnsHarness, { columns: columnsA, childRef: childRef })).rerender;
130
+ expect(react_2.screen.getByRole("checkbox", { name: "Alpha" })).toBeChecked();
131
+ expect(react_2.screen.getByRole("checkbox", { name: "Beta" })).not.toBeChecked();
132
+ expect((_a = childRef.current) === null || _a === void 0 ? void 0 : _a.getManageColumnsData()).toEqual(columnsA);
133
+ rerender(react_1.default.createElement(react_3.ChakraProvider, null,
134
+ react_1.default.createElement(ManageColumnsHarness, { columns: columnsB, childRef: childRef })));
135
+ return [4 /*yield*/, (0, react_2.waitFor)(function () {
136
+ expect(react_2.screen.getByRole("checkbox", { name: "Alpha" })).not.toBeChecked();
137
+ expect(react_2.screen.getByRole("checkbox", { name: "Beta" })).toBeChecked();
138
+ })];
139
+ case 1:
140
+ _c.sent();
141
+ expect((_b = childRef.current) === null || _b === void 0 ? void 0 : _b.getManageColumnsData()).toEqual(columnsB);
142
+ return [2 /*return*/];
143
+ }
144
+ });
145
+ }); });
146
+ });
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Persisted sidebar preferences (localStorage-backed, opt-in).
3
+ *
4
+ * Persists the user's explicit layout choices so they survive reloads and browser
5
+ * restarts (restoring the sidebar to exactly the same state):
6
+ * - `mobileNav` — "navbar mode" forced on a large screen via the Hide/Show toggle
7
+ * - `collapsed` — the mini-rail (collapse) state
8
+ * - `mobileOpen` — whether the overlay drawer is currently open
9
+ *
10
+ * It deliberately does NOT persist viewport-driven state (the `lg` breakpoint /
11
+ * `belowLg`) — that must always reflect the live screen size, not a saved value.
12
+ *
13
+ * SSR-safe: reads/writes are guarded with `typeof window` so it no-ops during
14
+ * server render and hydrates from storage on the client.
15
+ *
16
+ * Adoption — wire the returned values straight onto the library's `SideBar` +
17
+ * `NavigationBar`; the composed handlers (`onToggleMobileNav`, `closeMobile`) mean
18
+ * a consuming app does not re-implement the "entering navbar mode opens the drawer"
19
+ * behavior itself:
20
+ *
21
+ * @example
22
+ * const sb = useSidebarPrefs();
23
+ * <SideBar
24
+ * toggle={sb.collapsed}
25
+ * changeToggle={sb.toggleCollapsed}
26
+ * mobileNav={sb.mobileNav}
27
+ * onToggleMobileNav={sb.onToggleMobileNav}
28
+ * mobileOpen={sb.mobileOpen}
29
+ * onMobileClose={sb.closeMobile}
30
+ * // ...your menus, user, etc.
31
+ * />
32
+ * <NavBar
33
+ * sideBarToggole={sb.mobileOpen}
34
+ * onSideBarToggole={sb.toggleMobileOpen}
35
+ * forceSideBarToggle={sb.mobileNav}
36
+ * // ...your nav props
37
+ * />
38
+ */
39
+ export type SidebarPrefs = {
40
+ mobileNav: boolean;
41
+ collapsed: boolean;
42
+ mobileOpen: boolean;
43
+ };
44
+ export type UseSidebarPrefsOptions = {
45
+ /** localStorage key. Versioned so a future shape change can bump it. */
46
+ storageKey?: string;
47
+ /** Defaults used on first visit / when nothing is stored. */
48
+ defaults?: Partial<SidebarPrefs>;
49
+ };
50
+ export type UseSidebarPrefsResult = SidebarPrefs & {
51
+ setMobileNav: (next: boolean) => void;
52
+ setCollapsed: (next: boolean) => void;
53
+ setMobileOpen: (next: boolean) => void;
54
+ toggleMobileNav: () => void;
55
+ toggleCollapsed: () => void;
56
+ toggleMobileOpen: () => void;
57
+ /**
58
+ * Ready handler for SideBar's `onToggleMobileNav`. Flips navbar mode AND syncs
59
+ * the drawer (entering → open, leaving → docked) so apps get this right for free.
60
+ */
61
+ onToggleMobileNav: () => void;
62
+ /** Ready handler for SideBar's `onMobileClose` — closes the overlay drawer. */
63
+ closeMobile: () => void;
64
+ };
65
+ export declare const useSidebarPrefs: (options?: UseSidebarPrefsOptions) => UseSidebarPrefsResult;
66
+ export default useSidebarPrefs;
67
+ //# sourceMappingURL=useSidebarPrefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSidebarPrefs.d.ts","sourceRoot":"","sources":["../../src/Hooks/useSidebarPrefs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG;IACjD,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,+EAA+E;IAC/E,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAwBF,eAAO,MAAM,eAAe,GAC1B,UAAS,sBAA2B,KACnC,qBA0EF,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSidebarPrefs = void 0;
4
+ const react_1 = require("react");
5
+ const DEFAULT_KEY = "pixelize:sidebar-prefs:v1";
6
+ const readPrefs = (key, defaults) => {
7
+ if (typeof window === "undefined" || !window.localStorage)
8
+ return defaults;
9
+ try {
10
+ const raw = window.localStorage.getItem(key);
11
+ if (!raw)
12
+ return defaults;
13
+ const parsed = JSON.parse(raw);
14
+ return {
15
+ mobileNav: typeof parsed.mobileNav === "boolean" ? parsed.mobileNav : defaults.mobileNav,
16
+ collapsed: typeof parsed.collapsed === "boolean" ? parsed.collapsed : defaults.collapsed,
17
+ mobileOpen: typeof parsed.mobileOpen === "boolean" ? parsed.mobileOpen : defaults.mobileOpen,
18
+ };
19
+ }
20
+ catch {
21
+ // Corrupt / unreadable value — fall back to defaults rather than throwing.
22
+ return defaults;
23
+ }
24
+ };
25
+ const useSidebarPrefs = (options = {}) => {
26
+ var _a, _b, _c;
27
+ const { storageKey = DEFAULT_KEY, defaults } = options;
28
+ const resolvedDefaults = {
29
+ mobileNav: (_a = defaults === null || defaults === void 0 ? void 0 : defaults.mobileNav) !== null && _a !== void 0 ? _a : false,
30
+ collapsed: (_b = defaults === null || defaults === void 0 ? void 0 : defaults.collapsed) !== null && _b !== void 0 ? _b : false,
31
+ mobileOpen: (_c = defaults === null || defaults === void 0 ? void 0 : defaults.mobileOpen) !== null && _c !== void 0 ? _c : false,
32
+ };
33
+ // Lazy initializer so the synchronous read happens once, on the client.
34
+ const [prefs, setPrefs] = (0, react_1.useState)(() => readPrefs(storageKey, resolvedDefaults));
35
+ (0, react_1.useEffect)(() => {
36
+ if (typeof window === "undefined" || !window.localStorage)
37
+ return;
38
+ try {
39
+ window.localStorage.setItem(storageKey, JSON.stringify(prefs));
40
+ }
41
+ catch {
42
+ // Storage full / disabled (private mode) — preference simply won't persist.
43
+ }
44
+ }, [storageKey, prefs]);
45
+ const setMobileNav = (0, react_1.useCallback)((next) => setPrefs((p) => ({ ...p, mobileNav: next })), []);
46
+ const setCollapsed = (0, react_1.useCallback)((next) => setPrefs((p) => ({ ...p, collapsed: next })), []);
47
+ const setMobileOpen = (0, react_1.useCallback)((next) => setPrefs((p) => ({ ...p, mobileOpen: next })), []);
48
+ const toggleMobileNav = (0, react_1.useCallback)(() => setPrefs((p) => ({ ...p, mobileNav: !p.mobileNav })), []);
49
+ const toggleCollapsed = (0, react_1.useCallback)(() => setPrefs((p) => ({ ...p, collapsed: !p.collapsed })), []);
50
+ const toggleMobileOpen = (0, react_1.useCallback)(() => setPrefs((p) => ({ ...p, mobileOpen: !p.mobileOpen })), []);
51
+ // Composed handlers — map directly onto SideBar props so apps don't re-implement
52
+ // the navbar-mode/drawer behavior (the part that's easy to get wrong per app).
53
+ const onToggleMobileNav = (0, react_1.useCallback)(() => setPrefs((p) => {
54
+ const next = !p.mobileNav;
55
+ // Entering navbar mode opens the drawer; leaving docks it.
56
+ return { ...p, mobileNav: next, mobileOpen: next };
57
+ }), []);
58
+ const closeMobile = (0, react_1.useCallback)(() => setPrefs((p) => ({ ...p, mobileOpen: false })), []);
59
+ return {
60
+ ...prefs,
61
+ setMobileNav,
62
+ setCollapsed,
63
+ setMobileOpen,
64
+ toggleMobileNav,
65
+ toggleCollapsed,
66
+ toggleMobileOpen,
67
+ onToggleMobileNav,
68
+ closeMobile,
69
+ };
70
+ };
71
+ exports.useSidebarPrefs = useSidebarPrefs;
72
+ exports.default = exports.useSidebarPrefs;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var buildBrandTokens_1 = require("./buildBrandTokens");
4
+ describe("normalizeHex", function () {
5
+ it("adds hash and lowercases", function () {
6
+ expect((0, buildBrandTokens_1.normalizeHex)("9A4FE5")).toBe("#9a4fe5");
7
+ expect((0, buildBrandTokens_1.normalizeHex)("#2CAA3D")).toBe("#2caa3d");
8
+ });
9
+ it("rejects invalid hex", function () {
10
+ expect(function () { return (0, buildBrandTokens_1.normalizeHex)("gggggg"); }).toThrow(/Invalid hex/);
11
+ expect(function () { return (0, buildBrandTokens_1.normalizeHex)("#fff"); }).toThrow(/Invalid hex/);
12
+ });
13
+ });
14
+ describe("buildPrimaryOpacity", function () {
15
+ it("appends alpha steps to brand hex", function () {
16
+ expect((0, buildBrandTokens_1.buildPrimaryOpacity)("#2caa3d")).toEqual({
17
+ 4: "#2caa3d0a",
18
+ 8: "#2caa3d14",
19
+ 16: "#2caa3d29",
20
+ 24: "#2caa3d3d",
21
+ 32: "#2caa3d52",
22
+ 40: "#2caa3d66",
23
+ 48: "#2caa3d7a",
24
+ });
25
+ });
26
+ });
27
+ describe("buildPrimaryShadowTint", function () {
28
+ it("returns 8-digit hex with shadow alpha", function () {
29
+ expect((0, buildBrandTokens_1.buildPrimaryShadowTint)("#0088cc")).toBe("#0088cc47");
30
+ });
31
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var chartColorsFromTheme_1 = require("./chartColorsFromTheme");
4
+ var mockColors = {
5
+ primary: { 500: "#111111" },
6
+ semantic: {
7
+ error: { 500: "#222222" },
8
+ success: { 500: "#333333" },
9
+ },
10
+ orange: { 500: "#444444" },
11
+ gray: { 700: "#555555" },
12
+ white: "#ffffff",
13
+ };
14
+ describe("chartColorsFromTheme", function () {
15
+ it("getDefaultSeriesColors returns four theme hues", function () {
16
+ expect((0, chartColorsFromTheme_1.getDefaultSeriesColors)(mockColors)).toEqual([
17
+ "#111111",
18
+ "#222222",
19
+ "#333333",
20
+ "#444444",
21
+ ]);
22
+ });
23
+ it("mergeChartTitleStyle applies primary then overrides", function () {
24
+ expect((0, chartColorsFromTheme_1.mergeChartTitleStyle)(mockColors, { fontSize: "20px" })).toMatchObject({
25
+ color: "#111111",
26
+ fontSize: "20px",
27
+ fontWeight: 600,
28
+ fontFamily: "Arial",
29
+ });
30
+ expect((0, chartColorsFromTheme_1.mergeChartTitleStyle)(mockColors, { color: "#999999" }).color).toBe("#999999");
31
+ });
32
+ it("chartAxisLabelColor reads gray scale", function () {
33
+ expect((0, chartColorsFromTheme_1.chartAxisLabelColor)(mockColors)).toBe("#555555");
34
+ });
35
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var table_1 = require("./table");
8
+ describe("normalizeTableCellValue", function () {
9
+ it("returns primitives as-is (string/number/boolean)", function () {
10
+ expect((0, table_1.normalizeTableCellValue)("x")).toBe("x");
11
+ expect((0, table_1.normalizeTableCellValue)(42)).toBe(42);
12
+ expect((0, table_1.normalizeTableCellValue)(false)).toBe(false);
13
+ });
14
+ it("returns empty string for null and undefined", function () {
15
+ expect((0, table_1.normalizeTableCellValue)(null)).toBe("");
16
+ expect((0, table_1.normalizeTableCellValue)(undefined)).toBe("");
17
+ });
18
+ it("returns React elements unchanged", function () {
19
+ var el = react_1.default.createElement("span", null, "hi");
20
+ expect((0, table_1.normalizeTableCellValue)(el)).toBe(el);
21
+ });
22
+ it("uses label or name on plain objects (relation fields)", function () {
23
+ expect((0, table_1.normalizeTableCellValue)({
24
+ id: 1,
25
+ label: "Owner Name",
26
+ email: "a@b.com",
27
+ role: "admin",
28
+ company_name: "Acme",
29
+ })).toBe("Owner Name");
30
+ expect((0, table_1.normalizeTableCellValue)({ id: 2, name: "Jane", email: "j@b.com" })).toBe("Jane");
31
+ });
32
+ it("returns company_name when label/name missing", function () {
33
+ expect((0, table_1.normalizeTableCellValue)({
34
+ id: 3,
35
+ company_name: "Solo Co",
36
+ })).toBe("Solo Co");
37
+ });
38
+ it("returns empty string for unrecognized objects", function () {
39
+ expect((0, table_1.normalizeTableCellValue)({ a: 1, b: 2 })).toBe("");
40
+ });
41
+ });
package/dist/index.d.ts CHANGED
@@ -49,6 +49,7 @@ import VerifyEmailOtp from "./Components/EmailCards/VerifyEmailOtp/VerifyEmailOt
49
49
  import TableToggle from "./Components/Toggle/TableToggle";
50
50
  import withTheme from "./withTheme";
51
51
  import { useCustomTheme } from "./Theme/useCustomTheme";
52
+ import { useSidebarPrefs } from "./Hooks/useSidebarPrefs";
52
53
  import { ThemesList } from "./Theme";
53
54
  import { debounce } from "./Utils/table";
54
55
  import ProductCard from "./Components/ProductCard/ProductCard";
@@ -77,11 +78,12 @@ import RolesPermission from "./Components/RolesPermission/RolesPermission";
77
78
  import CustomModulesTable from "./Components/CustomModulesTable/CustomModulesTable";
78
79
  import SignInActivityTable from "./Components/SignInActivityTable/SignInActivityTable";
79
80
  import OrganizationDetails from "./Components/OrganizationDetails/OrganizationDetails";
80
- export { Accordian, AlertDialog, ApexBarChart, ApexPieChart, ApexPolarChart, ApexLineChart, Breadcrumbs, Button, ButtonGroupIcon, Card, Checkbox, ContactForm, DatePicker, Drawer, DrawerHeader, DrawerBody, DrawerFooter, Dropdown, Editor, EmptyState, FieldSelectModal, FilePreview, FilePreviewTrigger, FileUpload, FileUploader, FilterSidebar, FormWrapper, LazyWrapper, MoreItems, PdfViewer, ScrollToTop, CopyButton, StageProgress, StageItem, OrgSwitcher, UpgradeButton, UserDetails, RolesPermission, CustomModulesTable, SignInActivityTable, OrganizationDetails, Header, HeaderActions, InputTextArea, InputSwitch, KanbanBoard, Loading, Modal, ModalHeader, ModalBody, ModalFooter, NavigationBar, Notification, NoteTextArea, MultiSelect, NumberInput, PaymentCard, PhoneNumberInput, PinInput, ProductCard, ProductDetails, ProfileCard, ProfileCardHeader, ProfileCardBody, ProfileCardFooter, ProfilePhotoViewer, ProgressBar, RadioButton, RadioButtonGroup, Reorder, Search, Select, SearchSelect, SelectSearch, SideBar, Slider, Skeletons, Switch, Table, TableToggle, Tag, TextInput, Timeline, Toaster, ToolTip, useToaster, VerifyEmailOtp, useCustomTheme, ThemesList, debounce, };
81
+ export { Accordian, AlertDialog, ApexBarChart, ApexPieChart, ApexPolarChart, ApexLineChart, Breadcrumbs, Button, ButtonGroupIcon, Card, Checkbox, ContactForm, DatePicker, Drawer, DrawerHeader, DrawerBody, DrawerFooter, Dropdown, Editor, EmptyState, FieldSelectModal, FilePreview, FilePreviewTrigger, FileUpload, FileUploader, FilterSidebar, FormWrapper, LazyWrapper, MoreItems, PdfViewer, ScrollToTop, CopyButton, StageProgress, StageItem, OrgSwitcher, UpgradeButton, UserDetails, RolesPermission, CustomModulesTable, SignInActivityTable, OrganizationDetails, Header, HeaderActions, InputTextArea, InputSwitch, KanbanBoard, Loading, Modal, ModalHeader, ModalBody, ModalFooter, NavigationBar, Notification, NoteTextArea, MultiSelect, NumberInput, PaymentCard, PhoneNumberInput, PinInput, ProductCard, ProductDetails, ProfileCard, ProfileCardHeader, ProfileCardBody, ProfileCardFooter, ProfilePhotoViewer, ProgressBar, RadioButton, RadioButtonGroup, Reorder, Search, Select, SearchSelect, SelectSearch, SideBar, Slider, Skeletons, Switch, Table, TableToggle, Tag, TextInput, Timeline, Toaster, ToolTip, useToaster, VerifyEmailOtp, useSidebarPrefs, useCustomTheme, ThemesList, debounce, };
81
82
  export default withTheme;
82
83
  export type { UserDetailsProps, UserDetailsLabels, UserListItem, SelectedUserDetail, UserDetailRow, RoleOption, AddUserFormValues, ChangeRoleSubmitPayload, } from "./Components/UserDetails/UserDetailsProps";
83
84
  export type { RolesPermissionProps, RolesPermissionLabels, RolesPermissionView, RolesPermissionMode, Permission, PermissionKey, RoleData, } from "./Components/RolesPermission/RolesPermissionProps";
84
85
  export type { CustomModulesTableProps, CustomModulesTableLabels, ModuleItem, UpdateModulePayload, } from "./Components/CustomModulesTable/CustomModulesTableProps";
85
86
  export type { SignInActivityTableProps, SignInActivityLabels, SignInDevice, } from "./Components/SignInActivityTable/SignInActivityTableProps";
86
87
  export type { OrganizationDetailsProps, OrganizationDetailsLabels, OrganizationItem, CreateOrgFormValues, } from "./Components/OrganizationDetails/OrganizationDetailsProps";
88
+ export type { SidebarPrefs, UseSidebarPrefsOptions, UseSidebarPrefsResult, } from "./Hooks/useSidebarPrefs";
87
89
  //# sourceMappingURL=index.d.ts.map