pixelize-design-library 2.4.2-beta.2 → 2.4.2-beta.4
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/Accordion/Accordion.js +2 -2
- package/dist/Components/Button/Button.styles.js +4 -3
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +5 -5
- package/dist/Components/Common/fieldStyles.js +1 -1
- package/dist/Components/CopyButton/CopyButton.js +1 -1
- package/dist/Components/CustomModulesTable/EditModuleModal.js +1 -1
- package/dist/Components/DatePicker/CalendarPanel.js +1 -1
- package/dist/Components/DatePicker/RangeDatePicker.js +1 -1
- package/dist/Components/DatePicker/SingleDatePicker.js +1 -1
- package/dist/Components/DatePicker/TimeOnlyPicker.js +1 -1
- package/dist/Components/Dropdown/DropDown.js +3 -13
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +1 -1
- package/dist/Components/FilePreview/FilePreview.js +1 -1
- package/dist/Components/FilterSidebar/FilterSidebar.js +2 -2
- package/dist/Components/Input/TextInput.styles.js +5 -1
- package/dist/Components/KanbanBoard/KanbanBoard.js +5 -45
- package/dist/Components/LimitReachedModal/LimitReachedModal.js +4 -5
- package/dist/Components/MultiSelect/MultiSelect.js +1 -1
- package/dist/Components/OrgSwitcher/OrgSwitcher.js +2 -2
- package/dist/Components/PinInput/PinInput.js +1 -1
- package/dist/Components/PlanPill/PlanPill.js +5 -5
- package/dist/Components/PlanPill/planPillGradient.d.ts +2 -14
- package/dist/Components/PlanPill/planPillGradient.js +3 -15
- package/dist/Components/ProductCard/ProductPrice.js +1 -1
- package/dist/Components/ProfileCard/ProfileCard.js +1 -1
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +1 -1
- package/dist/Components/Reorder/Reorder.js +1 -1
- package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +13 -0
- package/dist/Components/ScrollbarBox/ScrollbarBox.js +11 -0
- package/dist/Components/SearchSelect/SearchSelect.js +3 -3
- package/dist/Components/Select/Select.styles.js +1 -1
- package/dist/Components/SelectSearch/SelectSearch.js +3 -3
- package/dist/Components/SelectV2/SelectV2.js +3 -10
- package/dist/Components/StageProgress/StageProgress.js +2 -9
- package/dist/Components/Table/Table.js +7 -20
- package/dist/Components/Table/components/TableBody.js +1 -1
- package/dist/Components/Table/components/TableHeader.js +1 -1
- package/dist/Components/Table/filters/ActiveFilters.js +2 -18
- package/dist/Components/Table/settings/ManageColumns.js +2 -16
- package/dist/Components/Table/settings/TableSettings.js +4 -10
- package/dist/Components/Timeline/Timeline.js +2 -2
- package/dist/Components/Toaster/Toaster.js +1 -1
- package/dist/Components/UpgradeButton/UpgradeButton.js +3 -3
- package/dist/Constants/Sidebar.js +3 -2
- package/dist/Theme/chakra/Menu.styles.d.ts +7 -6
- package/dist/Theme/chakra/Menu.styles.js +9 -5
- package/dist/Theme/chakra/Popover.styles.d.ts +3 -3
- package/dist/Theme/chakra/Popover.styles.js +7 -6
- package/dist/Theme/chakra/Switch.styles.d.ts +1 -1
- package/dist/Theme/chakra/Switch.styles.js +7 -9
- package/dist/Theme/chakra/componentStyles.d.ts +10 -9
- package/dist/Theme/chakra/createBrandTheme.js +3 -16
- package/dist/Theme/provider/PixelizeThemeProvider.js +18 -20
- package/dist/Theme/provider/ThemeSwitcher.js +10 -20
- package/dist/Theme/tokens/brands/lavender/palette.light.js +2 -6
- package/dist/Theme/tokens/brands/slate/palette.light.js +1 -5
- package/dist/Theme/tokens/builders/gradientInk.d.ts +22 -0
- package/dist/Theme/tokens/builders/gradientInk.js +28 -0
- package/dist/Theme/tokens/builders/index.d.ts +2 -0
- package/dist/Theme/tokens/builders/index.js +2 -0
- package/dist/Theme/tokens/builders/outlineRung.d.ts +5 -0
- package/dist/Theme/tokens/builders/outlineRung.js +19 -0
- package/dist/Theme/tokens/builders/scrollbar.d.ts +12 -0
- package/dist/Theme/tokens/builders/scrollbar.js +57 -0
- package/dist/Theme/tokens/builders/surfaceRungs.d.ts +2 -0
- package/dist/Theme/tokens/builders/surfaceRungs.js +7 -2
- package/dist/esm/Components/Accordion/Accordion.js +2 -2
- package/dist/esm/Components/Button/Button.styles.js +5 -4
- package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +5 -5
- package/dist/esm/Components/Common/fieldStyles.js +1 -1
- package/dist/esm/Components/CopyButton/CopyButton.js +1 -1
- package/dist/esm/Components/CustomModulesTable/EditModuleModal.js +1 -1
- package/dist/esm/Components/DatePicker/CalendarPanel.js +1 -1
- package/dist/esm/Components/DatePicker/RangeDatePicker.js +1 -1
- package/dist/esm/Components/DatePicker/SingleDatePicker.js +1 -1
- package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +1 -1
- package/dist/esm/Components/Dropdown/DropDown.js +3 -13
- package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +1 -1
- package/dist/esm/Components/FilePreview/FilePreview.js +1 -1
- package/dist/esm/Components/FilterSidebar/FilterSidebar.js +2 -2
- package/dist/esm/Components/Input/TextInput.styles.js +5 -1
- package/dist/esm/Components/KanbanBoard/KanbanBoard.js +5 -45
- package/dist/esm/Components/LimitReachedModal/LimitReachedModal.js +4 -5
- package/dist/esm/Components/MultiSelect/MultiSelect.js +1 -1
- package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +2 -2
- package/dist/esm/Components/PinInput/PinInput.js +1 -1
- package/dist/esm/Components/PlanPill/PlanPill.js +6 -6
- package/dist/esm/Components/PlanPill/planPillGradient.js +3 -15
- package/dist/esm/Components/ProductCard/ProductPrice.js +1 -1
- package/dist/esm/Components/ProfileCard/ProfileCard.js +1 -1
- package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +1 -1
- package/dist/esm/Components/Reorder/Reorder.js +1 -1
- package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +9 -0
- package/dist/esm/Components/SearchSelect/SearchSelect.js +3 -3
- package/dist/esm/Components/Select/Select.styles.js +1 -1
- package/dist/esm/Components/SelectSearch/SelectSearch.js +3 -3
- package/dist/esm/Components/SelectV2/SelectV2.js +3 -10
- package/dist/esm/Components/StageProgress/StageProgress.js +2 -9
- package/dist/esm/Components/Table/Table.js +7 -20
- package/dist/esm/Components/Table/components/TableBody.js +1 -1
- package/dist/esm/Components/Table/components/TableHeader.js +1 -1
- package/dist/esm/Components/Table/filters/ActiveFilters.js +2 -18
- package/dist/esm/Components/Table/settings/ManageColumns.js +2 -16
- package/dist/esm/Components/Table/settings/TableSettings.js +4 -10
- package/dist/esm/Components/Timeline/Timeline.js +2 -2
- package/dist/esm/Components/Toaster/Toaster.js +1 -1
- package/dist/esm/Components/UpgradeButton/UpgradeButton.js +3 -3
- package/dist/esm/Constants/Sidebar.js +3 -2
- package/dist/esm/Theme/chakra/Menu.styles.js +9 -5
- package/dist/esm/Theme/chakra/Popover.styles.js +7 -6
- package/dist/esm/Theme/chakra/Switch.styles.js +7 -9
- package/dist/esm/Theme/chakra/createBrandTheme.js +3 -16
- package/dist/esm/Theme/provider/PixelizeThemeProvider.js +18 -20
- package/dist/esm/Theme/provider/ThemeSwitcher.js +10 -20
- package/dist/esm/Theme/tokens/brands/lavender/palette.light.js +2 -6
- package/dist/esm/Theme/tokens/brands/slate/palette.light.js +1 -5
- package/dist/esm/Theme/tokens/builders/gradientInk.js +22 -0
- package/dist/esm/Theme/tokens/builders/index.js +2 -0
- package/dist/esm/Theme/tokens/builders/outlineRung.js +18 -0
- package/dist/esm/Theme/tokens/builders/scrollbar.js +52 -0
- package/dist/esm/Theme/tokens/builders/surfaceRungs.js +7 -2
- package/dist/esm/index.js +3 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +9 -3
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ import Pagination from "./components/Pagination.js";
|
|
|
8
8
|
import TableHeader from "./components/TableHeader.js";
|
|
9
9
|
import TableBody from "./components/TableBody.js";
|
|
10
10
|
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
11
|
+
import { scrollbarStyles, SCROLLBAR_WIDTH } from "../../Theme/tokens/builders/scrollbar.js";
|
|
11
12
|
import useTable from "./hooks/useTable.js";
|
|
12
13
|
import { searchAndSortData, SortMultiColumnData, groupRows, buildTablePalette, pickTableColor } from "../../Utils/table.js";
|
|
13
14
|
import { useGetPreferences, useSavePreferences, } from "../../Hooks/usePreferences.js";
|
|
@@ -386,29 +387,15 @@ export default function Table({ data, columns, onSelection, isLoading, isCheckbo
|
|
|
386
387
|
}, children: _jsx(RefreshCw, { size: 16 }) }) })] })), headerActions && (_jsxs(_Fragment, { children: [_jsx(VeritcalDivider, {}), _jsx(HeaderActions, { actions: headerActions, selections: selection })] })), _jsx(ActiveFilters, { columns: columnsList, columnsSearch: columnsSearch, setColumnsSearch: setColumnsSearch }), _jsxs(Box, { ml: "auto", display: "flex", alignItems: "center", gap: 2, children: [groupLoadMoreActive && loadMorePosition === "top" && (groupLoadMoreCaption || canGroupLoadMore) && (_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, flex: "0 0 auto", children: [groupLoadMoreCaption && (_jsx(Box, { fontSize: "0.75rem", color: theme.colors.text[500], whiteSpace: "nowrap", children: groupLoadMoreCaption })), canGroupLoadMore && (_jsx(Button, { size: "xs", variant: "outline", colorScheme: "gray", isLoading: isLoadingMore, loadingText: loadMoreText, onClick: handleGroupLoadMore, label: loadMoreText }))] })), (isPagination || isServerPagination) && !isGrouped && !canInfinite && !isCompactHeader && (_jsx("div", { children: _jsx(Pagination, { columns: columns, currentPage: currentPage, setCurrentPage: setCurrentPage, rowsPerPage: rowsPerPage, pages: pages, paginationText: tablePaginationText, handlePageSizeChange: handlePageSizeChange, dataLength: tableData.length, isServerPagination: isServerPagination, paginationSelectOptions: paginationSelectOptions, isVisiblity: true }) })), (isPagination || isServerPagination) && !isGrouped && !canInfinite && isCompactHeader && tableData.length > 0 && (_jsxs(Popover, { isOpen: isPaginationPopoverOpen, onClose: () => setIsPaginationPopoverOpen(false), placement: "bottom-end", children: [_jsx(PopoverTrigger, { children: _jsx(IconButton, { "aria-label": "Pagination", size: "sm", variant: "ghost", icon: _jsx(EllipsisVertical, { size: 18 }), color: theme.colors.text[500], _hover: {
|
|
387
388
|
color: theme.colors.accentText,
|
|
388
389
|
}, onClick: () => setIsPaginationPopoverOpen((open) => !open) }) }), _jsx(Portal, { children: _jsx(PopoverContent, { maxW: "22rem", p: 2, zIndex: 1600, bg: theme.colors.background[50], boxShadow: "lg", children: _jsx(PopoverBody, { p: 0, children: _jsx(Pagination, { columns: columns, currentPage: currentPage, setCurrentPage: setCurrentPage, rowsPerPage: rowsPerPage, pages: pages, paginationText: tablePaginationText, handlePageSizeChange: handlePageSizeChange, dataLength: tableData.length, isServerPagination: isServerPagination, paginationSelectOptions: paginationSelectOptions, isVisiblity: true }) }) }) })] }))] })] }), _jsxs(TableContainer, { ref: tableContainerRef, position: "relative", h: isTableLoading ? tableMaxH : undefined, maxH: !isTableLoading ? tableMaxH : undefined, pb: isTableLoading ? 0 : compactScrollbarPadding, overflowY: isCompactRows ? "hidden" : "auto", overflowX: "auto", sx: {
|
|
390
|
+
...scrollbarStyles(theme.colors),
|
|
391
|
+
// Compact rows hide the horizontal bar until hover to keep the row height.
|
|
389
392
|
'&::-webkit-scrollbar': {
|
|
390
|
-
width:
|
|
391
|
-
height: isCompactRows ? '0px' :
|
|
392
|
-
},
|
|
393
|
-
'&:hover::-webkit-scrollbar': {
|
|
394
|
-
height: '6px',
|
|
395
|
-
},
|
|
396
|
-
'&::-webkit-scrollbar-track': {
|
|
397
|
-
background: theme.colors.gray[100],
|
|
398
|
-
borderRadius: 'base',
|
|
399
|
-
},
|
|
400
|
-
'&::-webkit-scrollbar-thumb': {
|
|
401
|
-
background: theme.colors.gray[400],
|
|
402
|
-
borderRadius: 'base',
|
|
403
|
-
},
|
|
404
|
-
'&::-webkit-scrollbar-thumb:hover': {
|
|
405
|
-
background: theme.colors.gray[500],
|
|
393
|
+
width: SCROLLBAR_WIDTH,
|
|
394
|
+
height: isCompactRows ? '0px' : SCROLLBAR_WIDTH,
|
|
406
395
|
},
|
|
396
|
+
'&:hover::-webkit-scrollbar': { height: SCROLLBAR_WIDTH },
|
|
407
397
|
scrollbarWidth: isCompactRows ? 'none' : 'thin',
|
|
408
|
-
'&:hover': {
|
|
409
|
-
scrollbarWidth: 'thin',
|
|
410
|
-
},
|
|
411
|
-
scrollbarColor: `${theme.colors.gray[400]} ${theme.colors.gray[100]}`,
|
|
398
|
+
'&:hover': { scrollbarWidth: 'thin' },
|
|
412
399
|
}, children: [_jsxs(ChakraTable, { variant: "simple", size: "sm", minW: "100%", role: "grid", "aria-rowcount": isGrouped ? undefined : _filteredData.length + 1, className: "table_wrapper", sx: {
|
|
413
400
|
width: "100%",
|
|
414
401
|
// `separate` (not `collapse`) so sticky header cells paint an opaque
|
|
@@ -285,7 +285,7 @@ const TableBody = ({ data, isCheckbox, columns, startRow, columnWidths, freezedB
|
|
|
285
285
|
return { heights, offsets, totalH: acc };
|
|
286
286
|
}, [groupItems, groupVirtualize, rowHeight, GROUP_HEADER_H]);
|
|
287
287
|
if (isLoading && data.length === 0) {
|
|
288
|
-
return (_jsx(TableBodyLoading, { noOfColumns: totalVisibleColumns, borderColor: theme.colors.boxborder[
|
|
288
|
+
return (_jsx(TableBodyLoading, { noOfColumns: totalVisibleColumns, borderColor: theme.colors.boxborder[200], rowsCount: typeof loadingSkeletonRows === "number" ? loadingSkeletonRows : 4 }));
|
|
289
289
|
}
|
|
290
290
|
if (!isLoading && data.length === 0) {
|
|
291
291
|
const isStructured = emptyState && typeof emptyState === "object" && !React.isValidElement(emptyState);
|
|
@@ -77,7 +77,7 @@ const ColumnHeader = memo(({ header, index, columnWidths, isCheckbox, noBorders,
|
|
|
77
77
|
document.addEventListener("mouseup", onMouseUp);
|
|
78
78
|
};
|
|
79
79
|
const isSortActive = !!(isSorting === null || isSorting === void 0 ? void 0 : isSorting.direction) && isSorting.direction !== "none";
|
|
80
|
-
return (_jsx(Th, { scope: "col", ref: (el) => (headerRefs.current[index] = el), "aria-sort": ariaSort, textTransform: "capitalize", fontSize: 13, fontWeight: 600, position: isFrozen ? "sticky" : undefined, left: isFrozen ? leftOffset : undefined, minWidth: 120, backgroundColor: theme.colors.table.hover[200], maxWidth: 500, zIndex: isFrozen ? 2 : 1, py: 2, pr: 0, overflow: "hidden", borderTop: "none", borderBottom: noBorders ? "none" : `0.063rem solid ${theme.colors.border[500]}`, borderRight: noBorders ? "none" : `0.063rem solid ${theme.colors.boxborder[
|
|
80
|
+
return (_jsx(Th, { scope: "col", ref: (el) => (headerRefs.current[index] = el), "aria-sort": ariaSort, textTransform: "capitalize", fontSize: 13, fontWeight: 600, position: isFrozen ? "sticky" : undefined, left: isFrozen ? leftOffset : undefined, minWidth: 120, backgroundColor: theme.colors.table.hover[200], maxWidth: 500, zIndex: isFrozen ? 2 : 1, py: 2, pr: 0, overflow: "hidden", borderTop: "none", borderBottom: noBorders ? "none" : `0.063rem solid ${theme.colors.border[500]}`, borderRight: noBorders ? "none" : `0.063rem solid ${theme.colors.boxborder[200]}`, className: `columns ${isFrozen ? "sticky-columns" : "scrollable-columns"}`, height: 45, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children: _jsxs(Box, { display: "flex", color: accentTextOnCanvas(theme.colors.secondary, theme.colors.table.hover[200]), lineHeight: "1.25rem", justifyContent: "space-between", alignItems: "center", position: "relative", children: [_jsx(Box, { textOverflow: "ellipsis", whiteSpace: "nowrap", display: "inline-block", overflow: "hidden", children: header.label }), _jsxs(Box, { display: "inline-flex", alignItems: "center", children: [header.isSort && (_jsx(SortingIcon, { label: String(header.label), sortState: (_a = isSorting === null || isSorting === void 0 ? void 0 : isSorting.direction) !== null && _a !== void 0 ? _a : "none", isVisible: isHovered || isSortActive, handleSortClick: () => {
|
|
81
81
|
let direction = "asc";
|
|
82
82
|
if ((isSorting === null || isSorting === void 0 ? void 0 : isSorting.direction) === "asc") {
|
|
83
83
|
direction = "desc";
|
|
@@ -4,6 +4,7 @@ import { Box, Flex, Text, IconButton } from "@chakra-ui/react";
|
|
|
4
4
|
import { X } from "lucide-react";
|
|
5
5
|
import { useCustomTheme } from "../../../Theme/useCustomTheme.js";
|
|
6
6
|
import { accentTextOnCanvas } from "../../../Theme/tokens/builders/accentText.js";
|
|
7
|
+
import { scrollbarStyles } from "../../../Theme/tokens/builders/scrollbar.js";
|
|
7
8
|
import VeritcalDivider from "../../Divider/Divider.js";
|
|
8
9
|
const ActiveFilters = React.memo(({ columns, columnsSearch, setColumnsSearch, }) => {
|
|
9
10
|
const theme = useCustomTheme();
|
|
@@ -34,24 +35,7 @@ const ActiveFilters = React.memo(({ columns, columnsSearch, setColumnsSearch, })
|
|
|
34
35
|
if (activeFilters.length === 0) {
|
|
35
36
|
return null;
|
|
36
37
|
}
|
|
37
|
-
return (_jsx(Box, { px: 2, py: 1, bg: theme.colors.background[100], overflowX: "auto", sx: {
|
|
38
|
-
'&::-webkit-scrollbar': {
|
|
39
|
-
height: '6px',
|
|
40
|
-
},
|
|
41
|
-
'&::-webkit-scrollbar-track': {
|
|
42
|
-
background: theme.colors.gray[100],
|
|
43
|
-
borderRadius: 'base',
|
|
44
|
-
},
|
|
45
|
-
'&::-webkit-scrollbar-thumb': {
|
|
46
|
-
background: theme.colors.gray[400],
|
|
47
|
-
borderRadius: 'base',
|
|
48
|
-
},
|
|
49
|
-
'&::-webkit-scrollbar-thumb:hover': {
|
|
50
|
-
background: theme.colors.gray[500],
|
|
51
|
-
},
|
|
52
|
-
scrollbarWidth: 'thin',
|
|
53
|
-
scrollbarColor: `${theme.colors.gray[400]} ${theme.colors.gray[100]}`,
|
|
54
|
-
}, children: _jsxs(Box, { display: "flex", alignItems: "center", gap: 2, flexWrap: "nowrap", minW: "max-content", children: [activeFilters.length > 0 && _jsx(VeritcalDivider, {}), activeFilters.map((filter) => (_jsxs(Flex, { alignItems: "center", gap: 1, px: 2, py: 1, bg: theme.colors.blue[50], borderRadius: "md", border: `0.063rem solid ${theme.colors.blue[200]}`, flexShrink: 0, children: [_jsxs(Text, { fontSize: "sm", color: accentTextOnCanvas(theme.colors.blue, theme.colors.blue[50]), whiteSpace: "nowrap", children: [_jsxs(Text, { as: "span", fontWeight: 600, children: [filter.label, ":"] }), " ", filter.value] }), _jsx(IconButton, { "aria-label": `Remove filter for ${filter.label}`, icon: _jsx(X, { size: 14 }), size: "xs", variant: "ghost", onClick: () => handleRemoveFilter(filter.columnId), _hover: {
|
|
38
|
+
return (_jsx(Box, { px: 2, py: 1, bg: theme.colors.background[100], overflowX: "auto", sx: scrollbarStyles(theme.colors), children: _jsxs(Box, { display: "flex", alignItems: "center", gap: 2, flexWrap: "nowrap", minW: "max-content", children: [activeFilters.length > 0 && _jsx(VeritcalDivider, {}), activeFilters.map((filter) => (_jsxs(Flex, { alignItems: "center", gap: 1, px: 2, py: 1, bg: theme.colors.blue[50], borderRadius: "md", border: `0.063rem solid ${theme.colors.blue[200]}`, flexShrink: 0, children: [_jsxs(Text, { fontSize: "sm", color: accentTextOnCanvas(theme.colors.blue, theme.colors.blue[50]), whiteSpace: "nowrap", children: [_jsxs(Text, { as: "span", fontWeight: 600, children: [filter.label, ":"] }), " ", filter.value] }), _jsx(IconButton, { "aria-label": `Remove filter for ${filter.label}`, icon: _jsx(X, { size: 14 }), size: "xs", variant: "ghost", onClick: () => handleRemoveFilter(filter.columnId), _hover: {
|
|
55
39
|
bg: theme.colors.blue[100],
|
|
56
40
|
}, minW: "auto", h: "auto", p: 0.5, flexShrink: 0 })] }, filter.columnId))), activeFilters.length > 1 && (_jsx(Text, { as: "p", className: "clear-all-text", "aria-label": "Clear All", fontSize: "sm", color: accentTextOnCanvas(theme.colors.blue, theme.colors.background[100]), cursor: "pointer", fontWeight: 500, onClick: handleClearAll, _hover: {
|
|
57
41
|
textDecoration: "underline",
|
|
@@ -3,6 +3,7 @@ import { useImperativeHandle, useMemo, useState, useEffect } from "react";
|
|
|
3
3
|
import { Box, Flex, IconButton, Input, List, ListItem, Text, } from "@chakra-ui/react";
|
|
4
4
|
import Checkbox from "../../Checkbox/Checkbox.js";
|
|
5
5
|
import { useCustomTheme } from "../../../Theme/useCustomTheme.js";
|
|
6
|
+
import { scrollbarStyles } from "../../../Theme/tokens/builders/scrollbar.js";
|
|
6
7
|
import { ChevronDown, ChevronUp, GripVertical } from "lucide-react";
|
|
7
8
|
const ManageColumns = ({ columns, items, setItems, childInputMethodsRef, }) => {
|
|
8
9
|
const theme = useCustomTheme();
|
|
@@ -69,22 +70,7 @@ const ManageColumns = ({ columns, items, setItems, childInputMethodsRef, }) => {
|
|
|
69
70
|
setError(null);
|
|
70
71
|
}
|
|
71
72
|
};
|
|
72
|
-
return (_jsxs(Box, { mt: 2, children: [error && (_jsx(Box, { mb: 2, px: 3, py: 2, bg: theme.colors.red[50], borderRadius: "md", border: "1px solid", borderColor: theme.colors.red[200], children: _jsx(Text, { color: theme.colors.red[600], fontSize: "xs", fontWeight: 500, children: error }) })), _jsx(Input, { placeholder: "Search columns...", mb: 2, value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), size: "sm", borderRadius: "md" }), !searchTerm.length && (_jsx(Flex, { align: "center", mb: 1, bg: theme.colors.gray[100], px: 2, py: 1, borderRadius: "md", children: _jsx(Checkbox, { label: "Show all columns", isChecked: allChecked, isIndeterminate: someChecked, onChange: handleSelectAll }) })), _jsx(List, { spacing: 0, maxH: "300px", overflowY: "auto", sx: {
|
|
73
|
-
"&::-webkit-scrollbar": { width: "3px", height: "3px" },
|
|
74
|
-
"&::-webkit-scrollbar-track": {
|
|
75
|
-
background: theme.colors.gray[100],
|
|
76
|
-
borderRadius: "sm",
|
|
77
|
-
},
|
|
78
|
-
"&::-webkit-scrollbar-thumb": {
|
|
79
|
-
background: theme.colors.gray[400],
|
|
80
|
-
borderRadius: "sm",
|
|
81
|
-
},
|
|
82
|
-
"&::-webkit-scrollbar-thumb:hover": {
|
|
83
|
-
background: theme.colors.gray[500],
|
|
84
|
-
},
|
|
85
|
-
scrollbarWidth: "thin",
|
|
86
|
-
scrollbarColor: `${theme.colors.gray[400]} ${theme.colors.gray[100]}`,
|
|
87
|
-
}, children: filteredItems.length > 0 ? (filteredItems.map((item, index) => {
|
|
73
|
+
return (_jsxs(Box, { mt: 2, children: [error && (_jsx(Box, { mb: 2, px: 3, py: 2, bg: theme.colors.red[50], borderRadius: "md", border: "1px solid", borderColor: theme.colors.red[200], children: _jsx(Text, { color: theme.colors.red[600], fontSize: "xs", fontWeight: 500, children: error }) })), _jsx(Input, { placeholder: "Search columns...", mb: 2, value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), size: "sm", borderRadius: "md" }), !searchTerm.length && (_jsx(Flex, { align: "center", mb: 1, bg: theme.colors.gray[100], px: 2, py: 1, borderRadius: "md", children: _jsx(Checkbox, { label: "Show all columns", isChecked: allChecked, isIndeterminate: someChecked, onChange: handleSelectAll }) })), _jsx(List, { spacing: 0, maxH: "300px", overflowY: "auto", sx: scrollbarStyles(theme.colors), children: filteredItems.length > 0 ? (filteredItems.map((item, index) => {
|
|
88
74
|
const isDraggingThisItem = draggedItemIndex === index;
|
|
89
75
|
const isDropZone = draggedItemIndex !== null && draggedItemIndex !== index;
|
|
90
76
|
const realIndex = items.findIndex((i) => i.id === item.id);
|
|
@@ -5,6 +5,7 @@ import { motion } from "framer-motion";
|
|
|
5
5
|
import ManageColumns from "./ManageColumns.js";
|
|
6
6
|
import Button from "../../Button/Button.js";
|
|
7
7
|
import { useCustomTheme } from "../../../Theme/useCustomTheme.js";
|
|
8
|
+
import { scrollbarStyles } from "../../../Theme/tokens/builders/scrollbar.js";
|
|
8
9
|
import { Settings, Check } from "lucide-react";
|
|
9
10
|
import ToolTip from "../../ToolTip/ToolTip.js";
|
|
10
11
|
const MotionModalContent = motion(ModalContent);
|
|
@@ -47,16 +48,9 @@ const TableSettings = ({ columns, onSave, density = "normal", onDensityChange, g
|
|
|
47
48
|
return (_jsxs(Box, { children: [_jsx(ToolTip, { label: "Table Settings", placement: "top", children: _jsx(IconButton, { "aria-label": "Table settings", icon: _jsx(Settings, { size: "1.25rem" }), onClick: handleOpen, variant: "unstyled", minW: "auto", h: "auto", display: "flex", justifyContent: "flex-end", cursor: "pointer", transition: "all 0.2s ease", color: theme.colors.text[500], _hover: {
|
|
48
49
|
transform: "scale(1.1)",
|
|
49
50
|
color: theme.colors.accentText
|
|
50
|
-
} }) }), _jsxs(Modal, { isOpen: settingsOpen, onClose: () => setSettingsOpen(false), size: "md", children: [_jsx(ModalOverlay, {}), _jsxs(MotionModalContent, { mt: "0", top: "0", position: "absolute", borderTopRadius: "none", initial: { y: "-100%", opacity: 0 }, animate: { y: 0, opacity: 1 }, exit: { y: "-100%", opacity: 0 }, transition: { duration: 0.4, ease: "easeOut" }, padding: "0", minW: "620px", minH: "520px", maxH: "90vh", display: "flex", flexDirection: "column", bg: theme.colors.background[50], overflow: "hidden", children: [_jsx(ModalCloseButton, { top: 3, right: 3, zIndex: 2 }), _jsxs(Tabs, { index: selectedIndex, onChange: setSelectedIndex, variant: "unstyled", display: "flex", flexDirection: "column", flex: "1", minH: 0, children: [_jsxs(Box, { pt: 4, px: 4, children: [_jsx(Text, { fontWeight: 600, fontSize: "md", mb: 3, children: "Table Settings" }), _jsxs(TabList, { gap: 0, borderBottom: "1px solid", borderColor: theme.colors.border[200], children: [_jsx(Tab, { ...tabStyle, children: "Density" }), _jsx(Tab, { ...tabStyle, children: "Manage Columns" }), _jsx(Tab, { ...tabStyle, children: "Group" })] })] }), _jsx(ModalBody, { px: 4, py: 3, flex: "1", overflowY: "auto", sx: {
|
|
51
|
-
"&::-webkit-scrollbar": { width: "3px", height: "3px" },
|
|
52
|
-
"&::-webkit-scrollbar-track": { background: theme.colors.gray[100], borderRadius: "sm" },
|
|
53
|
-
"&::-webkit-scrollbar-thumb": { background: theme.colors.gray[400], borderRadius: "sm" },
|
|
54
|
-
"&::-webkit-scrollbar-thumb:hover": { background: theme.colors.gray[500] },
|
|
55
|
-
scrollbarWidth: "thin",
|
|
56
|
-
scrollbarColor: `${theme.colors.gray[400]} ${theme.colors.gray[100]}`,
|
|
57
|
-
}, children: _jsxs(TabPanels, { children: [_jsx(TabPanel, { px: 0, py: 1, children: _jsx(Flex, { direction: "column", gap: 2, children: DENSITY_OPTIONS.map((opt) => {
|
|
51
|
+
} }) }), _jsxs(Modal, { isOpen: settingsOpen, onClose: () => setSettingsOpen(false), size: "md", children: [_jsx(ModalOverlay, {}), _jsxs(MotionModalContent, { mt: "0", top: "0", position: "absolute", borderTopRadius: "none", initial: { y: "-100%", opacity: 0 }, animate: { y: 0, opacity: 1 }, exit: { y: "-100%", opacity: 0 }, transition: { duration: 0.4, ease: "easeOut" }, padding: "0", minW: "620px", minH: "520px", maxH: "90vh", display: "flex", flexDirection: "column", bg: theme.colors.background[50], overflow: "hidden", children: [_jsx(ModalCloseButton, { top: 3, right: 3, zIndex: 2 }), _jsxs(Tabs, { index: selectedIndex, onChange: setSelectedIndex, variant: "unstyled", display: "flex", flexDirection: "column", flex: "1", minH: 0, children: [_jsxs(Box, { pt: 4, px: 4, children: [_jsx(Text, { fontWeight: 600, fontSize: "md", mb: 3, children: "Table Settings" }), _jsxs(TabList, { gap: 0, borderBottom: "1px solid", borderColor: theme.colors.border[200], children: [_jsx(Tab, { ...tabStyle, children: "Density" }), _jsx(Tab, { ...tabStyle, children: "Manage Columns" }), _jsx(Tab, { ...tabStyle, children: "Group" })] })] }), _jsx(ModalBody, { px: 4, py: 3, flex: "1", overflowY: "auto", sx: scrollbarStyles(theme.colors), children: _jsxs(TabPanels, { children: [_jsx(TabPanel, { px: 0, py: 1, children: _jsx(Flex, { direction: "column", gap: 2, children: DENSITY_OPTIONS.map((opt) => {
|
|
58
52
|
const selected = density === opt.value;
|
|
59
|
-
return (_jsxs(Flex, { as: "button", type: "button", align: "center", gap: 3, px: 3, py: 2.5, borderRadius: "lg", border: "1px solid", borderColor: selected ? theme.colors.accentText : theme.colors.boxborder[
|
|
53
|
+
return (_jsxs(Flex, { as: "button", type: "button", align: "center", gap: 3, px: 3, py: 2.5, borderRadius: "lg", border: "1px solid", borderColor: selected ? theme.colors.accentText : theme.colors.boxborder[200], bg: selected ? theme.colors.primary.opacity[8] : theme.colors.transparent, transition: "all 0.15s", _hover: { borderColor: theme.colors.accentText }, onClick: () => onDensityChange === null || onDensityChange === void 0 ? void 0 : onDensityChange(opt.value), children: [_jsx(Box, { boxSize: "1.1rem", borderRadius: "full", border: "2px solid", borderColor: selected ? theme.colors.accentText : theme.colors.boxborder[500], display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0, children: selected && _jsx(Check, { size: 11, color: theme.colors.accentText, strokeWidth: 3 }) }), _jsxs(Box, { textAlign: "left", children: [_jsx(Text, { fontSize: "13px", fontWeight: 600, color: theme.colors.text[700], children: opt.label }), _jsx(Text, { fontSize: "11px", color: theme.colors.textMuted, children: opt.desc })] })] }, opt.value));
|
|
60
54
|
}) }) }), _jsx(TabPanel, { px: 0, py: 0, children: _jsx(Box, { sx: {
|
|
61
55
|
"& [role='listitem'], & > div > div": {
|
|
62
56
|
py: "4px !important",
|
|
@@ -74,7 +68,7 @@ const TableSettings = ({ columns, onSave, density = "normal", onDensityChange, g
|
|
|
74
68
|
.map((opt) => {
|
|
75
69
|
var _a;
|
|
76
70
|
const selected = selectedGroup === opt.id;
|
|
77
|
-
return (_jsxs(Flex, { as: "button", type: "button", align: "center", gap: 3, px: 3, py: 2.5, borderRadius: "lg", border: "1px solid", borderColor: selected ? theme.colors.accentText : theme.colors.boxborder[
|
|
71
|
+
return (_jsxs(Flex, { as: "button", type: "button", align: "center", gap: 3, px: 3, py: 2.5, borderRadius: "lg", border: "1px solid", borderColor: selected ? theme.colors.accentText : theme.colors.boxborder[200], bg: selected ? theme.colors.primary.opacity[8] : theme.colors.transparent, transition: "all 0.15s", _hover: { borderColor: theme.colors.accentText }, onClick: () => setSelectedGroup(opt.id), children: [_jsx(Box, { boxSize: "1.1rem", borderRadius: "full", border: "2px solid", borderColor: selected ? theme.colors.accentText : theme.colors.boxborder[500], display: "flex", alignItems: "center", justifyContent: "center", flexShrink: 0, children: selected && _jsx(Check, { size: 11, color: theme.colors.accentText, strokeWidth: 3 }) }), _jsx(Text, { fontSize: "13px", fontWeight: 600, color: theme.colors.text[700], textAlign: "left", children: opt.label })] }, String((_a = opt.id) !== null && _a !== void 0 ? _a : "__none__")));
|
|
78
72
|
}) })] })] }) })] }), _jsxs(ModalFooter, { gap: "0.5rem", borderTop: "1px solid", borderColor: theme.colors.border[200], pt: 3, pb: 3, px: 4, children: [_jsx(Button, { label: "Close", size: "sm", onClick: () => setSettingsOpen(false), variant: "outline", colorScheme: "red" }), _jsx(Button, { label: "Save", size: "sm", onClick: handleSave })] })] })] })] }));
|
|
79
73
|
};
|
|
80
74
|
export default TableSettings;
|
|
@@ -163,7 +163,7 @@ const EventCard = React.memo(function EventCard({ event, index, accent, colors,
|
|
|
163
163
|
const scale = getEventScale(colors, event.title);
|
|
164
164
|
const changes = useMemo(() => parseChanges(event.changes), [event.changes]);
|
|
165
165
|
const clickable = typeof onEventClick === "function";
|
|
166
|
-
return (_jsxs(Box, { _hover: { ".timeline-add-note": { opacity: 1 } }, _focusWithin: { ".timeline-add-note": { opacity: 1 } }, children: [_jsxs(Box, { as: clickable ? "button" : undefined, type: clickable ? "button" : undefined, display: clickable ? "block" : undefined, w: clickable ? "100%" : undefined, textAlign: clickable ? "start" : undefined, position: "relative", zIndex: 1, bg: colors.background[50], border: `0.063rem solid ${colors.boxborder[
|
|
166
|
+
return (_jsxs(Box, { _hover: { ".timeline-add-note": { opacity: 1 } }, _focusWithin: { ".timeline-add-note": { opacity: 1 } }, children: [_jsxs(Box, { as: clickable ? "button" : undefined, type: clickable ? "button" : undefined, display: clickable ? "block" : undefined, w: clickable ? "100%" : undefined, textAlign: clickable ? "start" : undefined, position: "relative", zIndex: 1, bg: colors.background[50], border: `0.063rem solid ${colors.boxborder[200]}`, borderInlineStartWidth: accent === "left" ? "0.1875rem" : undefined, borderInlineEndWidth: accent === "right" ? "0.1875rem" : undefined, borderInlineStartColor: accent === "left" ? scale[400] : undefined, borderInlineEndColor: accent === "right" ? scale[400] : undefined, borderRadius: "xl", px: 3.5, py: 2.5, transition: "all 0.15s ease", cursor: clickable ? "pointer" : "default", onClick: clickable ? () => onEventClick(event, index) : undefined, _hover: {
|
|
167
167
|
borderColor: scale[300],
|
|
168
168
|
boxShadow: (_a = theme.shadows) === null || _a === void 0 ? void 0 : _a.md,
|
|
169
169
|
transform: clickable ? "translateY(-1px)" : undefined,
|
|
@@ -224,7 +224,7 @@ const Timeline = ({ timelineEvents, onEventClick, onAddNote, onEditNote, onDelet
|
|
|
224
224
|
// -------------------------------------------------------------------------
|
|
225
225
|
return (_jsxs(Box, { position: "relative", maxW: "60rem", mx: "auto", px: 4, py: 2, children: [_jsx(Box, { position: "absolute", left: "50%", top: "0.5rem", bottom: "0.5rem", w: "0.015rem", borderRadius: "full", bg: colors.gray[300], transform: "translateX(-50%)" }), Object.keys(groupedEvents).map((date) => {
|
|
226
226
|
var _a;
|
|
227
|
-
return (_jsxs(Box, { mb: 2, children: [_jsx(Flex, { justify: "center", mb: 5, mt: 3, position: "relative", zIndex: 2, children: _jsx(Text, { fontSize: "0.75rem", fontWeight: 600, textTransform: "uppercase", letterSpacing: "0.02em", color: colors.textMuted, bg: colors.background[50], border: `0.063rem solid ${colors.boxborder[
|
|
227
|
+
return (_jsxs(Box, { mb: 2, children: [_jsx(Flex, { justify: "center", mb: 5, mt: 3, position: "relative", zIndex: 2, children: _jsx(Text, { fontSize: "0.75rem", fontWeight: 600, textTransform: "uppercase", letterSpacing: "0.02em", color: colors.textMuted, bg: colors.background[50], border: `0.063rem solid ${colors.boxborder[200]}`, boxShadow: (_a = theme.shadows) === null || _a === void 0 ? void 0 : _a.xs, borderRadius: "full", px: 4, py: 1.5, whiteSpace: "nowrap", children: date }) }), groupedEvents[date].map(({ event, globalIndex }, index) => {
|
|
228
228
|
var _a;
|
|
229
229
|
const isLeft = index % 2 === 0;
|
|
230
230
|
const scale = getEventScale(colors, event.title);
|
|
@@ -46,7 +46,7 @@ function ToastCard({ onClose, title, description, actions, isClosable, duration,
|
|
|
46
46
|
initial: { opacity: 0, x: 24 }, animate: { opacity: 1, x: 0 }, exit: { opacity: 0, x: 24 }, transition: { duration: 0.24, ease: [0.22, 1, 0.36, 1] }, onHoverStart: () => setPaused(true), onHoverEnd: () => setPaused(false), position: "relative",
|
|
47
47
|
// Surface token, not `colors.white`: `white` is a foreground token and stays
|
|
48
48
|
// white in dark mode. `background[50]` is #ffffff in light, near-black in dark.
|
|
49
|
-
bg: c.background[50], border: `0.063rem solid ${c.boxborder[
|
|
49
|
+
bg: c.background[50], border: `0.063rem solid ${c.boxborder[200]}`, boxShadow: shadowLg !== null && shadowLg !== void 0 ? shadowLg : "lg", borderRadius: "2xl", overflow: "hidden", minW: "22.5rem", maxW: "26rem", willChange: "transform, opacity", sx: {
|
|
50
50
|
transition: "box-shadow 0.18s ease",
|
|
51
51
|
_hover: { boxShadow: "xl" },
|
|
52
52
|
}, children: [_jsxs(Flex, { p: 3.5, gap: 3, align: actions ? "flex-start" : "center", children: [_jsx(Flex, { align: "center", justify: "center", boxSize: "2rem", minW: "2rem", borderRadius: "full", bg: tone.bg, color: tone.fg, sx: {
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Box, Flex, Spinner, Text } from "@chakra-ui/react";
|
|
3
3
|
import { Sparkles } from "lucide-react";
|
|
4
4
|
import { useCustomTheme } from "../../Theme/useCustomTheme.js";
|
|
5
|
-
import {
|
|
5
|
+
import { resolveGradient } from "../../Theme/tokens/builders/gradientInk.js";
|
|
6
6
|
import { contrastRatio } from "../../Theme/tokens/builders/color.js";
|
|
7
7
|
import { AA_NON_TEXT } from "../../Theme/tokens/builders/outlineRung.js";
|
|
8
8
|
/** The brand's gold sparkle accent, kept only where it clears 3:1 on the button's own fill. */
|
|
@@ -33,10 +33,10 @@ const UpgradeButton = ({ label, mobileLabel, subtitle, icon = Sparkles, iconColo
|
|
|
33
33
|
danger: { from: c.semantic.error[400], to: c.semantic.error[600] },
|
|
34
34
|
info: { from: c.semantic.info[400], to: c.semantic.info[600] },
|
|
35
35
|
};
|
|
36
|
-
const resolved = gradient !== null && gradient !== void 0 ? gradient : variantGradient[variant];
|
|
37
36
|
// `iconColor`'s gold default fails AA as body text against this gradient (measured ~1.4-3.3
|
|
38
37
|
// across brands) — the label/subtitle share this computed ink instead.
|
|
39
|
-
const
|
|
38
|
+
const resolved = resolveGradient(gradient !== null && gradient !== void 0 ? gradient : variantGradient[variant], c.white, c.black);
|
|
39
|
+
const ink = resolved.ink;
|
|
40
40
|
// The gold only clears 1.4.11's 3:1 on a DARK gradient. zinc dark inverts `primary` to a
|
|
41
41
|
// near-white fill, where gold-on-near-white measures ~1.3:1 and the icon vanishes, so fall
|
|
42
42
|
// back to the label's ink whenever the gold misses either stop.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { SCROLLBAR_WIDTH } from "../Theme/tokens/builders/scrollbar.js";
|
|
1
2
|
export const HEADER_HEIGHT = "4.3rem";
|
|
2
3
|
export const FlexCss = {
|
|
3
4
|
"&::-webkit-scrollbar": {
|
|
4
|
-
width:
|
|
5
|
+
width: SCROLLBAR_WIDTH,
|
|
5
6
|
},
|
|
6
7
|
"&::-webkit-scrollbar-track": {
|
|
7
8
|
background: "transparent",
|
|
@@ -16,7 +17,7 @@ export const FlexCss = {
|
|
|
16
17
|
};
|
|
17
18
|
export const cssForScrollBar = (theme) => ({
|
|
18
19
|
"&::-webkit-scrollbar": {
|
|
19
|
-
width:
|
|
20
|
+
width: SCROLLBAR_WIDTH,
|
|
20
21
|
},
|
|
21
22
|
"&::-webkit-scrollbar-track": {
|
|
22
23
|
background: theme.colors.sidebar.background[500],
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createMultiStyleConfigHelpers, cssVar } from "@chakra-ui/react";
|
|
2
2
|
import { menuAnatomy } from "@chakra-ui/anatomy";
|
|
3
|
+
import { paletteOf } from "./paletteFromTheme.js";
|
|
3
4
|
const { defineMultiStyleConfig, definePartsStyle } = createMultiStyleConfigHelpers(menuAnatomy.keys);
|
|
4
5
|
const $bg = cssVar("menu-bg");
|
|
5
6
|
/**
|
|
@@ -19,14 +20,17 @@ const $bg = cssVar("menu-bg");
|
|
|
19
20
|
*/
|
|
20
21
|
const $itemBg = cssVar("menu-item-bg");
|
|
21
22
|
const baseStyle = definePartsStyle(({ theme }) => {
|
|
22
|
-
|
|
23
|
-
const hoverBg =
|
|
24
|
-
const activeBg =
|
|
23
|
+
const colors = paletteOf(theme);
|
|
24
|
+
const hoverBg = colors.primary.opacity[8];
|
|
25
|
+
const activeBg = colors.primary.opacity[16];
|
|
25
26
|
return {
|
|
26
27
|
list: {
|
|
27
|
-
[$bg.variable]:
|
|
28
|
+
[$bg.variable]: colors.backgroundColor.light,
|
|
28
29
|
bg: $bg.reference,
|
|
29
|
-
color:
|
|
30
|
+
color: colors.text[900],
|
|
31
|
+
// Chakra's default is its own gray.200, which reads as a hard rule against our
|
|
32
|
+
// surfaces. The menu is already separated by its shadow.
|
|
33
|
+
borderColor: colors.border[200],
|
|
30
34
|
},
|
|
31
35
|
// Own CSS var (`--menu-item-bg`), NOT the list's `--menu-bg` — Chakra's stock item
|
|
32
36
|
// baseStyle rewrites `--menu-bg` itself on hover/focus, so reusing that same var name
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createMultiStyleConfigHelpers, cssVar } from "@chakra-ui/react";
|
|
2
2
|
import { popoverAnatomy } from "@chakra-ui/anatomy";
|
|
3
|
+
import { paletteOf } from "./paletteFromTheme.js";
|
|
3
4
|
const { defineMultiStyleConfig, definePartsStyle } = createMultiStyleConfigHelpers(popoverAnatomy.keys);
|
|
4
5
|
const $popperBg = cssVar("popper-bg");
|
|
5
6
|
const $arrowShadowColor = cssVar("popper-arrow-shadow-color");
|
|
@@ -12,15 +13,15 @@ const $arrowShadowColor = cssVar("popper-arrow-shadow-color");
|
|
|
12
13
|
* fixing `$popperBg` here fixes the arrow fill too.
|
|
13
14
|
*/
|
|
14
15
|
const baseStyle = definePartsStyle(({ theme }) => {
|
|
15
|
-
|
|
16
|
-
return
|
|
16
|
+
const colors = paletteOf(theme);
|
|
17
|
+
return {
|
|
17
18
|
content: {
|
|
18
|
-
[$popperBg.variable]:
|
|
19
|
+
[$popperBg.variable]: colors.backgroundColor.light,
|
|
19
20
|
bg: $popperBg.reference,
|
|
20
|
-
[$arrowShadowColor.variable]:
|
|
21
|
-
color:
|
|
21
|
+
[$arrowShadowColor.variable]: colors.border[200],
|
|
22
|
+
color: colors.text[900],
|
|
22
23
|
},
|
|
23
|
-
}
|
|
24
|
+
};
|
|
24
25
|
});
|
|
25
26
|
export const Popover = defineMultiStyleConfig({
|
|
26
27
|
baseStyle,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createMultiStyleConfigHelpers, cssVar } from "@chakra-ui/react";
|
|
2
2
|
import { switchAnatomy } from "@chakra-ui/anatomy";
|
|
3
|
+
import { paletteOf } from "./paletteFromTheme.js";
|
|
3
4
|
const { defineMultiStyleConfig, definePartsStyle } = createMultiStyleConfigHelpers(switchAnatomy.keys);
|
|
4
5
|
const $thumbBg = cssVar("switch-thumb-bg");
|
|
5
6
|
/**
|
|
@@ -7,15 +8,12 @@ const $thumbBg = cssVar("switch-thumb-bg");
|
|
|
7
8
|
* `_dark` gate at all, so every bare `<Switch>` renders a literal white knob on the dark canvas
|
|
8
9
|
* regardless of mode.
|
|
9
10
|
*/
|
|
10
|
-
const baseStyle = definePartsStyle(({ theme }) => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
});
|
|
11
|
+
const baseStyle = definePartsStyle(({ theme }) => ({
|
|
12
|
+
thumb: {
|
|
13
|
+
[$thumbBg.variable]: paletteOf(theme).backgroundColor.light,
|
|
14
|
+
bg: $thumbBg.reference,
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
19
17
|
export const Switch = defineMultiStyleConfig({
|
|
20
18
|
baseStyle,
|
|
21
19
|
});
|
|
@@ -3,6 +3,7 @@ import common from "./common.web.js";
|
|
|
3
3
|
import fonts from "./fonts.web.js";
|
|
4
4
|
import { componentStyles } from "./componentStyles.js";
|
|
5
5
|
import { onFilled } from "../tokens/builders/accentText.js";
|
|
6
|
+
import { globalScrollbarStyles } from "../tokens/builders/scrollbar.js";
|
|
6
7
|
/**
|
|
7
8
|
* Builds a Chakra theme from a pure brand palette.
|
|
8
9
|
*
|
|
@@ -83,22 +84,8 @@ export const createBrandTheme = (palette, options = {}) => {
|
|
|
83
84
|
color: onFilled(palette.primary[500], palette.white, palette.black),
|
|
84
85
|
},
|
|
85
86
|
// `color-scheme: dark` gives WebKit/Blink a dark scrollbar by default, but it's the
|
|
86
|
-
// OS's generic dark gray, not brand-aware
|
|
87
|
-
|
|
88
|
-
"::-webkit-scrollbar": {
|
|
89
|
-
width: "10px",
|
|
90
|
-
height: "10px",
|
|
91
|
-
},
|
|
92
|
-
"::-webkit-scrollbar-track": {
|
|
93
|
-
background: palette.backgroundColor.main,
|
|
94
|
-
},
|
|
95
|
-
"::-webkit-scrollbar-thumb": {
|
|
96
|
-
background: palette.gray[600],
|
|
97
|
-
borderRadius: "6px",
|
|
98
|
-
},
|
|
99
|
-
"::-webkit-scrollbar-thumb:hover": {
|
|
100
|
-
background: palette.gray[500],
|
|
101
|
-
},
|
|
87
|
+
// OS's generic dark gray, not brand-aware.
|
|
88
|
+
...globalScrollbarStyles(palette),
|
|
102
89
|
// Chrome/Edge autofill paints its own opaque yellow/white fill behind the input
|
|
103
90
|
// text via `-webkit-box-shadow` (not `background`), so a plain `bg` override never
|
|
104
91
|
// reaches it — a bright light box survives on every dark autofilled field unless
|
|
@@ -159,42 +159,40 @@ export const PixelizeThemeProvider = ({ children, brand: brandProp = DEFAULT_BRA
|
|
|
159
159
|
* `data-mode` for consumers that want to hook their own dark CSS.
|
|
160
160
|
*/
|
|
161
161
|
useLayoutEffect(() => {
|
|
162
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
163
162
|
const root = document.documentElement;
|
|
164
163
|
root.dataset.mode = resolvedMode;
|
|
165
|
-
const colors = resolvedTheme
|
|
166
|
-
const
|
|
167
|
-
const gray = colors.gray;
|
|
164
|
+
const { colors } = resolvedTheme;
|
|
165
|
+
const { gray, semantic } = colors;
|
|
168
166
|
const HUE_SCALES = [
|
|
169
167
|
"primary", "gray", "red", "orange", "yellow",
|
|
170
168
|
"green", "teal", "blue", "cyan", "purple", "pink",
|
|
171
169
|
];
|
|
172
|
-
const SEMANTIC_SCALES = ["success", "error", "warning", "info"];
|
|
170
|
+
const SEMANTIC_SCALES = ["success", "error", "warning", "info"];
|
|
173
171
|
const RUNGS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900];
|
|
174
|
-
//
|
|
175
|
-
//
|
|
172
|
+
// The dark gray ramp runs dark(50) → light(900), so low rungs read as surfaces
|
|
173
|
+
// and high rungs as text — correct in dark, cleared in light.
|
|
176
174
|
const SEMANTIC_VARS = {
|
|
177
|
-
"text-heading": gray
|
|
178
|
-
"text-subtle": gray
|
|
179
|
-
"bg-main": gray
|
|
180
|
-
"bg-quaternary": gray
|
|
181
|
-
"bg-accent": gray
|
|
182
|
-
"bg-neutral": gray
|
|
183
|
-
"border-default": gray
|
|
184
|
-
"border-dark": gray
|
|
185
|
-
"border-error":
|
|
186
|
-
"border-warning":
|
|
175
|
+
"text-heading": gray[900], "text-body": gray[700],
|
|
176
|
+
"text-subtle": gray[500], "text-input": gray[500],
|
|
177
|
+
"bg-main": gray[50], "bg-secondary": gray[100], "bg-tertiary": gray[100],
|
|
178
|
+
"bg-quaternary": gray[200], "bg-light": gray[50], "bg-medium": gray[100],
|
|
179
|
+
"bg-accent": gray[200], "bg-subtle": gray[100], "bg-muted": gray[200],
|
|
180
|
+
"bg-neutral": gray[100], "bg-base": gray[50], "bg-table-header": gray[100],
|
|
181
|
+
"border-default": gray[200], "border-light": gray[100],
|
|
182
|
+
"border-dark": gray[300], "border-input": gray[300],
|
|
183
|
+
"border-error": semantic.error[500], "border-success": semantic.success[500],
|
|
184
|
+
"border-warning": semantic.warning[500], "border-info": semantic.info[500],
|
|
187
185
|
};
|
|
188
|
-
const set = (name, val) =>
|
|
186
|
+
const set = (name, val) => root.style.setProperty(`--color-${name}`, val);
|
|
189
187
|
const clear = (name) => root.style.removeProperty(`--color-${name}`);
|
|
190
188
|
const allRampNames = [...HUE_SCALES, ...SEMANTIC_SCALES].flatMap((s) => RUNGS.map((r) => `${s}-${r}`));
|
|
191
189
|
if (resolvedMode === "dark") {
|
|
192
190
|
for (const s of HUE_SCALES)
|
|
193
191
|
for (const r of RUNGS)
|
|
194
|
-
set(`${s}-${r}`,
|
|
192
|
+
set(`${s}-${r}`, colors[s][r]);
|
|
195
193
|
for (const s of SEMANTIC_SCALES)
|
|
196
194
|
for (const r of RUNGS)
|
|
197
|
-
set(`${s}-${r}`,
|
|
195
|
+
set(`${s}-${r}`, semantic[s][r]);
|
|
198
196
|
for (const [name, val] of Object.entries(SEMANTIC_VARS))
|
|
199
197
|
set(name, val);
|
|
200
198
|
}
|
|
@@ -22,33 +22,23 @@ const toBrandLabel = (brand) => brand.charAt(0).toUpperCase() + brand.slice(1);
|
|
|
22
22
|
* the dot always matches what selecting that brand actually looks like,
|
|
23
23
|
* regardless of which brand/mode is currently active.
|
|
24
24
|
*/
|
|
25
|
-
const brandSwatchColor = (brand) =>
|
|
26
|
-
var _a, _b, _c, _d, _e;
|
|
27
|
-
return (_e = (_d = (_c = (_b = (_a = brandThemes[brand]) === null || _a === void 0 ? void 0 : _a.light) === null || _b === void 0 ? void 0 : _b.colors) === null || _c === void 0 ? void 0 : _c.primary) === null || _d === void 0 ? void 0 : _d[500]) !== null && _e !== void 0 ? _e : "gray.400";
|
|
28
|
-
};
|
|
25
|
+
const brandSwatchColor = (brand) => brandThemes[brand].light.colors.primary[500];
|
|
29
26
|
const BrandSwatch = ({ brand }) => (_jsx(Box, { as: "span", display: "inline-block", w: "0.625rem", h: "0.625rem", borderRadius: "full", bg: brandSwatchColor(brand), border: "1px solid", borderColor: "whiteAlpha.300", flexShrink: 0 }));
|
|
30
27
|
/**
|
|
31
28
|
* Palette values already differ per color mode (`brandThemes[brand].light|dark`), so tokens
|
|
32
29
|
* are read straight from the active theme — no `useColorModeValue` pairing needed here.
|
|
33
|
-
* Fallbacks are Chakra token names, never literal colors, for themes without a brand palette.
|
|
34
30
|
*/
|
|
35
31
|
const useSwitcherColors = () => {
|
|
36
|
-
|
|
37
|
-
const colors = useCustomTheme().colors;
|
|
32
|
+
const { colors } = useCustomTheme();
|
|
38
33
|
return {
|
|
39
|
-
trackBg:
|
|
40
|
-
activeBg:
|
|
41
|
-
activeColor:
|
|
42
|
-
mutedColor:
|
|
43
|
-
hoverBg:
|
|
44
|
-
borderColor:
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
// Re-deriving it here too and pushing it back via `sx` on every render caused a redundant
|
|
48
|
-
// Emotion style recompute per render, which showed up as flicker while hovering/scrolling
|
|
49
|
-
// this list. Keep menuColor (Menu.styles.ts doesn't set list `color` per this component's
|
|
50
|
-
// needs) but stop duplicating menuBg.
|
|
51
|
-
menuColor: (_0 = (_y = (_x = colors === null || colors === void 0 ? void 0 : colors.text) === null || _x === void 0 ? void 0 : _x[900]) !== null && _y !== void 0 ? _y : (_z = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _z === void 0 ? void 0 : _z[900]) !== null && _0 !== void 0 ? _0 : "gray.900",
|
|
34
|
+
trackBg: colors.backgroundColor.secondary,
|
|
35
|
+
activeBg: colors.backgroundColor.main,
|
|
36
|
+
activeColor: colors.primary[500],
|
|
37
|
+
mutedColor: colors.text[600],
|
|
38
|
+
hoverBg: colors.gray[100],
|
|
39
|
+
borderColor: colors.border[200],
|
|
40
|
+
// NOTE: menuBg lives in Menu.styles.ts — re-pushing it via `sx` flickers on every render.
|
|
41
|
+
menuColor: colors.text[900],
|
|
52
42
|
};
|
|
53
43
|
};
|
|
54
44
|
const BrandMenu = ({ size }) => {
|
|
@@ -186,12 +186,8 @@ const disabled = {
|
|
|
186
186
|
800: "#625d75",
|
|
187
187
|
900: "#4b4759",
|
|
188
188
|
};
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
// original let white drop to 3.53 there (`from` already passed at 5.76, unchanged).
|
|
192
|
-
// Nudged one step further (4.511 -> 4.609): the first pass cleared AA by <0.02, too thin a
|
|
193
|
-
// margin to trust against rounding/rendering variance.
|
|
194
|
-
const gradient = { from: "#8B3FC8", to: "#df187a" };
|
|
189
|
+
// Single-hue gradient: white clears AA by margin, not by hundredths. See gradientTone.test.ts.
|
|
190
|
+
const gradient = { from: "#8b3fc8", to: "#762d9d" };
|
|
195
191
|
const palette = {
|
|
196
192
|
gradient,
|
|
197
193
|
primary,
|
|
@@ -18,11 +18,7 @@ const primary = {
|
|
|
18
18
|
const palette = {
|
|
19
19
|
...neutralTokens,
|
|
20
20
|
...buildBrandInk(PRIMARY_500),
|
|
21
|
-
|
|
22
|
-
// original let white drop to 2.98 there (`from` already passed at 4.83, unchanged).
|
|
23
|
-
// Nudged one step further (4.520 -> 4.608): the first pass cleared AA by <0.02, too thin a
|
|
24
|
-
// margin to trust against rounding/rendering variance.
|
|
25
|
-
gradient: { from: "#6b7280", to: "#5664f6" }, // slate gray → indigo
|
|
21
|
+
gradient: { from: "#666d7a", to: "#4a4e59" },
|
|
26
22
|
primary,
|
|
27
23
|
tertiary: { ...primary },
|
|
28
24
|
gray: {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { onGradient } from "./accentText.js";
|
|
2
|
+
import { resolveAvatarFill } from "./statusTone.js";
|
|
3
|
+
/**
|
|
4
|
+
* Sinks both stops until WHITE ink clears AA, keeping each stop's hue. Any mid-tone gradient
|
|
5
|
+
* otherwise flips `onGradient` to black ink, so the same element reads white-on-colour in one
|
|
6
|
+
* brand and black-on-pastel in the next.
|
|
7
|
+
*/
|
|
8
|
+
export const inkSafeGradient = (gradient) => ({
|
|
9
|
+
from: resolveAvatarFill(gradient.from),
|
|
10
|
+
to: resolveAvatarFill(gradient.to),
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* The only correct way to paint text on a gradient: returns the stops to draw AND the ink for
|
|
14
|
+
* them. Calling `onGradient` on raw stops is the black-text bug — it picks ink for a backdrop
|
|
15
|
+
* that is then painted differently.
|
|
16
|
+
*/
|
|
17
|
+
export const resolveGradient = (gradient, white, black) => {
|
|
18
|
+
const { from, to } = inkSafeGradient(gradient);
|
|
19
|
+
return { from, to, ink: onGradient(from, to, white, black) };
|
|
20
|
+
};
|
|
21
|
+
/** `linear-gradient(...)` for a resolved pair — one spelling of the CSS everywhere. */
|
|
22
|
+
export const gradientCss = (g, angle = "135deg") => `linear-gradient(${angle}, ${g.from} 0%, ${g.to} 100%)`;
|