@paroicms/react-ui 0.5.3 → 0.5.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/Breadcrumb.d.ts +1 -0
- package/dist/Breadcrumb.js +4 -1
- package/dist/DataTable.js +1 -1
- package/dist/InputSwitch.d.ts +10 -0
- package/dist/InputSwitch.js +10 -0
- package/dist/MenuItem.js +2 -2
- package/dist/PopupMenu.d.ts +4 -2
- package/dist/PopupMenu.js +11 -4
- package/dist/SideMenu.js +13 -2
- package/dist/SortableList.js +1 -2
- package/dist/Spinner.d.ts +5 -1
- package/dist/Spinner.js +3 -2
- package/dist/SplitButton.js +1 -3
- package/dist/Tabs.js +1 -1
- package/dist/ToggleButton.d.ts +2 -1
- package/dist/ToggleButton.js +2 -2
- package/dist/ToggleGroup.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/paroi-ui-lib-types.d.ts +5 -1
- package/dist/popup-positioning.js +3 -2
- package/package.json +1 -1
- package/styles/Accordion.css +7 -0
- package/styles/Alert.css +7 -1
- package/styles/Breadcrumb.css +20 -11
- package/styles/Button.css +46 -10
- package/styles/Checkbox.css +3 -1
- package/styles/Chip.css +7 -1
- package/styles/DataTable.css +19 -9
- package/styles/DateInput.css +3 -0
- package/styles/Dialog.css +7 -1
- package/styles/Inplace.css +15 -2
- package/styles/InputNumber.css +4 -3
- package/styles/{Switch.css → InputSwitch.css} +10 -10
- package/styles/InputText.css +18 -13
- package/styles/MenuItem.css +47 -45
- package/styles/MultiSelect.css +11 -5
- package/styles/Panel.css +8 -1
- package/styles/PasswordInput.css +17 -5
- package/styles/PopupMenu.css +19 -0
- package/styles/RadioButton.css +3 -1
- package/styles/Select.css +16 -5
- package/styles/Spinner.css +8 -4
- package/styles/SplitButton.css +128 -36
- package/styles/Tabs.css +11 -3
- package/styles/Textarea.css +4 -3
- package/styles/ToggleButton.css +126 -12
- package/styles/ToggleGroup.css +6 -4
- package/styles/Tree.css +7 -1
- package/styles/theme/common.css +4 -4
- package/styles/theme/tokens.css +14 -1
- package/dist/Switch.d.ts +0 -9
- package/dist/Switch.js +0 -12
package/dist/Breadcrumb.d.ts
CHANGED
package/dist/Breadcrumb.js
CHANGED
|
@@ -5,6 +5,9 @@ import "../styles/Breadcrumb.css";
|
|
|
5
5
|
export function Breadcrumb({ items, separator = _jsx(ChevronRight, { size: 12 }), className, }) {
|
|
6
6
|
return (_jsx("nav", { className: clsx("PaBreadcrumb", className), "aria-label": "Breadcrumb", children: items.map((item, index) => {
|
|
7
7
|
const isLast = index === items.length - 1;
|
|
8
|
-
|
|
8
|
+
const linkClassName = clsx("PaBreadcrumb-link", {
|
|
9
|
+
iconBtn: item.icon && !item.label,
|
|
10
|
+
});
|
|
11
|
+
return (_jsxs("div", { className: clsx("PaBreadcrumb-item", item.className), children: [item.url ? (_jsxs("a", { href: item.url, className: linkClassName, children: [item.icon, item.label] })) : item.onClick ? (_jsxs("button", { type: "button", className: linkClassName, onClick: item.onClick, children: [item.icon, item.label] })) : (_jsxs("span", { className: linkClassName, children: [item.icon, item.label] })), !isLast && _jsx("span", { className: "PaBreadcrumb-separator", children: separator })] }, `${item.label}:${index}`));
|
|
9
12
|
}) }));
|
|
10
13
|
}
|
package/dist/DataTable.js
CHANGED
|
@@ -22,5 +22,5 @@ export function DataTable({ value, dataKey, size, loading, children, className,
|
|
|
22
22
|
const newOrder = sortField === field && sortOrder === 1 ? -1 : 1;
|
|
23
23
|
onSort({ field, order: newOrder });
|
|
24
24
|
};
|
|
25
|
-
return (_jsxs("div", { className: clsx("PaDataTable-wrapper", loading && "loading"), children: [loading && (_jsx("div", { className: "PaDataTable-overlay", children: _jsx(Spinner, {}) })), _jsx("div", { className: "PaDataTable-scrollable", children: _jsxs("table", { className: clsx("PaDataTable", size, className), children: [_jsx("thead", { className: "PaDataTable-header", children: _jsx("tr", { children: columns.map((col, i) => (_jsx("th", { className: clsx("PaDataTable-headerCell", col.sortable && "sortable"), style: col.style, onClick: col.sortable ? () => handleSort(col.field) : undefined, tabIndex: 0, children: _jsxs("span", { className: "PaDataTable-headerContent", children: [col.header, col.sortable && (_jsx("span", { className: "PaDataTable-sortIcon", children: col.field === sortField ? (sortOrder === 1 ? (_jsx(ArrowDown, { size: 14 })) : (_jsx(ArrowUp, { size: 14 }))) : (_jsx(ChevronsUpDown, { size: 14 })) }))] }) }, col.field ?? i))) }) }), _jsx("tbody", { children: value.length === 0 ? (_jsx("tr", { className: "PaDataTable-emptyRow", children: _jsx("td", { colSpan: columns.length, className: "PaDataTable-emptyCell", children: emptyMessage }) })) : (value.map((row) => (_jsx("tr", { className: clsx("PaDataTable-row", onRowClick && "clickable", rowClassName?.(row)), onClick: onRowClick ? (e) => onRowClick(row, e) : undefined, children: columns.map((col, i) => (_jsx("td", { className: clsx("PaDataTable-cell", col.bodyClassName), style: col.style, children: col.body ? col.body(row) : col.field ? String(row[col.field] ?? "") : null }, col.field ?? i))) }, String(row[dataKey]))))) })] }) }), paginator && onPage && pageCount >
|
|
25
|
+
return (_jsxs("div", { className: clsx("PaDataTable-wrapper", loading && "loading"), children: [loading && (_jsx("div", { className: "PaDataTable-overlay", children: _jsx(Spinner, {}) })), _jsx("div", { className: "PaDataTable-scrollable", children: _jsxs("table", { className: clsx("PaDataTable", size, className), children: [_jsx("thead", { className: "PaDataTable-header", children: _jsx("tr", { children: columns.map((col, i) => (_jsx("th", { className: clsx("PaDataTable-headerCell", col.sortable && "sortable"), style: col.style, onClick: col.sortable ? () => handleSort(col.field) : undefined, tabIndex: 0, children: _jsxs("span", { className: "PaDataTable-headerContent", children: [col.header, col.sortable && (_jsx("span", { className: "PaDataTable-sortIcon", children: col.field === sortField ? (sortOrder === 1 ? (_jsx(ArrowDown, { size: 14 })) : (_jsx(ArrowUp, { size: 14 }))) : (_jsx(ChevronsUpDown, { size: 14 })) }))] }) }, col.field ?? i))) }) }), _jsx("tbody", { children: value.length === 0 ? (_jsx("tr", { className: "PaDataTable-emptyRow", children: _jsx("td", { colSpan: columns.length, className: "PaDataTable-emptyCell", children: emptyMessage }) })) : (value.map((row) => (_jsx("tr", { className: clsx("PaDataTable-row", onRowClick && "clickable", rowClassName?.(row)), onClick: onRowClick ? (e) => onRowClick(row, e) : undefined, children: columns.map((col, i) => (_jsx("td", { className: clsx("PaDataTable-cell", col.bodyClassName), style: col.style, children: col.body ? col.body(row) : col.field ? String(row[col.field] ?? "") : null }, col.field ?? i))) }, String(row[dataKey]))))) })] }) }), paginator && onPage && pageCount > 1 && (_jsxs("div", { className: "PaDataTable-footer", children: [_jsxs("span", { className: "PaDataTable-totalCount", children: [total, " ", totalLabel ?? "items"] }), _jsxs("div", { className: "PaDataTable-pagination", children: [_jsx("button", { type: "button", className: "PaDataTable-paginationBtn", disabled: currentPage <= 1, onClick: () => onPage({ first: first - rows, rows }), children: _jsx(ChevronLeft, { size: 16 }) }), _jsxs("span", { className: "PaDataTable-paginationText", children: ["Page ", currentPage, " of ", pageCount] }), _jsx("button", { type: "button", className: "PaDataTable-paginationBtn", disabled: currentPage >= pageCount, onClick: () => onPage({ first: first + rows, rows }), children: _jsx(ChevronRight, { size: 16 }) }), rowsPerPageOptions && rowsPerPageOptions.length > 0 && (_jsx(Select, { className: "PaDataTable-rowsPerPage", value: String(rows), options: rowsPerPageOptions.map((n) => ({ label: String(n), value: String(n) })), onChange: (val) => onPage({ first: 0, rows: Number(val) }) }))] })] }))] }));
|
|
26
26
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "../styles/InputSwitch.css";
|
|
2
|
+
import type { ChangeEvent, InputHTMLAttributes } from "react";
|
|
3
|
+
export interface InputSwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "onChange"> {
|
|
4
|
+
checked: boolean;
|
|
5
|
+
onChange?: (checked: boolean, ev: ChangeEvent<HTMLInputElement>) => void;
|
|
6
|
+
label?: string;
|
|
7
|
+
inputLabel?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function InputSwitch({ checked, onChange, label, inputLabel, className, ...rest }: InputSwitchProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import "../styles/InputSwitch.css";
|
|
3
|
+
import { clsx } from "clsx";
|
|
4
|
+
export function InputSwitch({ checked, onChange, label, inputLabel, className, ...rest }) {
|
|
5
|
+
const handleChange = (e) => {
|
|
6
|
+
onChange?.(e.target.checked, e);
|
|
7
|
+
};
|
|
8
|
+
const fieldContent = inputLabel ? (_jsxs("label", { className: clsx("PaInputSwitch", className), children: [_jsx("input", { className: "PaInputSwitch-input", type: "checkbox", checked: checked, onChange: handleChange, ...rest }), _jsx("span", { className: "PaInputSwitch-track", children: _jsx("span", { className: "PaInputSwitch-thumb" }) }), _jsx("span", { className: "PaInputSwitch-label", children: inputLabel })] })) : (_jsxs("span", { className: clsx("PaInputSwitch", className), children: [_jsx("input", { className: "PaInputSwitch-input", type: "checkbox", checked: checked, onChange: handleChange, ...rest }), _jsx("span", { className: "PaInputSwitch-track", children: _jsx("span", { className: "PaInputSwitch-thumb" }) })] }));
|
|
9
|
+
return (_jsx(_Fragment, { children: label ? (_jsxs("label", { className: clsx("PaField", className), children: [_jsx("span", { className: "PaField-label", children: label }), fieldContent] })) : (fieldContent) }));
|
|
10
|
+
}
|
package/dist/MenuItem.js
CHANGED
|
@@ -9,10 +9,10 @@ export function MenuItem({ item, expanded, onToggle }) {
|
|
|
9
9
|
url = undefined;
|
|
10
10
|
command = undefined;
|
|
11
11
|
}
|
|
12
|
-
return (_jsxs("div", { className: clsx("PaMenuItem",
|
|
12
|
+
return (_jsxs("div", { className: clsx("PaMenuItem", { active }, className), style: style, children: [expanded !== undefined && onToggle ? (_jsx("button", { className: "PaMenuItem-left toggle", onClick: () => onToggle(!expanded), type: "button", children: expanded ? _jsx(ChevronDown, { size: 14 }) : _jsx(ChevronRight, { size: 14 }) })) : icon ? (_jsx("div", { className: "PaMenuItem-left icon", children: icon })) : undefined, url ? (_jsx("a", { className: clsx("PaMenuItem-label", { disabled }), href: url, onClick: url && command
|
|
13
13
|
? (ev) => {
|
|
14
14
|
ev.preventDefault();
|
|
15
15
|
command?.();
|
|
16
16
|
}
|
|
17
|
-
: undefined, children: label })) : command ? (_jsx("button", { className: "PaMenuItem-label", onClick: command, type: "button", children: label })) : (_jsx("span", { className: "PaMenuItem-label", children: label })), popupMenu && _jsx(PopupMenu, { className: "PaMenuItem-popup", items: popupMenu })] }, id));
|
|
17
|
+
: undefined, children: label })) : command ? (_jsx("button", { className: "PaMenuItem-label", onClick: command, type: "button", disabled: disabled, children: label })) : (_jsx("span", { className: clsx("PaMenuItem-label", { disabled }), children: label })), popupMenu && _jsx(PopupMenu, { className: "PaMenuItem-popup", items: popupMenu })] }, id));
|
|
18
18
|
}
|
package/dist/PopupMenu.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../styles/PopupMenu.css";
|
|
2
|
-
import { type MouseEvent, type ReactNode, type Ref } from "react";
|
|
2
|
+
import { type MouseEvent, type ReactElement, type ReactNode, type Ref } from "react";
|
|
3
3
|
import type { MenuNode } from "./paroi-ui-lib-types.js";
|
|
4
4
|
export interface PopupMenuProps {
|
|
5
5
|
items: MenuNode[];
|
|
@@ -9,6 +9,8 @@ export interface PopupMenuProps {
|
|
|
9
9
|
position?: "auto" | "topLeft" | "topRight" | "bottomLeft" | "bottomRight";
|
|
10
10
|
/** Optional custom trigger element. If provided, it will be used instead of the default button. */
|
|
11
11
|
children?: ReactNode;
|
|
12
|
+
/** Optional footer render prop. Receives a hide function to close the menu. */
|
|
13
|
+
footer?: (hide: () => void) => ReactElement;
|
|
12
14
|
ref?: Ref<PopupMenuRef>;
|
|
13
15
|
}
|
|
14
16
|
export interface PopupMenuRef {
|
|
@@ -16,4 +18,4 @@ export interface PopupMenuRef {
|
|
|
16
18
|
show: (event: MouseEvent) => void;
|
|
17
19
|
hide: () => void;
|
|
18
20
|
}
|
|
19
|
-
export declare function PopupMenu({ items, className, id, position, children, ref, }: PopupMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export declare function PopupMenu({ items, className, id, position, children, footer, ref, }: PopupMenuProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/PopupMenu.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import "../styles/PopupMenu.css";
|
|
3
3
|
import clsx from "clsx";
|
|
4
4
|
import { ChevronRight, ChevronsDown } from "lucide-react";
|
|
@@ -6,12 +6,15 @@ import { cloneElement, isValidElement, useEffect, useImperativeHandle, useRef, }
|
|
|
6
6
|
import { Button } from "./Button.js";
|
|
7
7
|
import { MenuItem } from "./MenuItem.js";
|
|
8
8
|
import { computePopupPosition, setupPopoverPositioning } from "./popup-positioning.js";
|
|
9
|
+
function isSeparator(item) {
|
|
10
|
+
return "separator" in item && item.separator === true;
|
|
11
|
+
}
|
|
9
12
|
const isPopoverSupported = typeof HTMLElement !== "undefined" && "showPopover" in HTMLElement.prototype;
|
|
10
13
|
if (!isPopoverSupported) {
|
|
11
14
|
console?.error("PopupMenu: Popover API is not supported in this browser.");
|
|
12
15
|
}
|
|
13
16
|
let seq = 0;
|
|
14
|
-
export function PopupMenu({ items, className, id, position = "auto", children, ref, }) {
|
|
17
|
+
export function PopupMenu({ items, className, id, position = "auto", children, footer, ref, }) {
|
|
15
18
|
const menuRef = useRef(null);
|
|
16
19
|
const triggerRef = useRef(null);
|
|
17
20
|
const menuIdRef = useRef(undefined);
|
|
@@ -62,7 +65,9 @@ export function PopupMenu({ items, className, id, position = "auto", children, r
|
|
|
62
65
|
}
|
|
63
66
|
return (_jsx(Button, { ref: triggerRef, className: clsx(className, "borderless"), outlined: true, severity: "secondary", "aria-label": "unfold", "aria-controls": menuIdRef.current, "aria-haspopup": true, ...triggerProps, children: _jsx(ChevronsDown, { size: 16 }) }));
|
|
64
67
|
};
|
|
65
|
-
return (_jsxs(_Fragment, { children: [renderTrigger(),
|
|
68
|
+
return (_jsxs(_Fragment, { children: [renderTrigger(), _jsxs("div", { className: "PaPopupMenu", ref: menuRef, id: menuIdRef.current, popover: "auto", children: [_jsx("div", { className: "PaPopupMenu-content", children: items.map((item, index) => isSeparator(item) ? (
|
|
69
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: separator items may not have unique keys
|
|
70
|
+
_jsx("div", { className: "PaPopupMenu-separator" }, `separator-${index}`)) : (_jsx(PopupMenuItemWrapper, { item: item, onHide: hide }, item.key))) }), footer && _jsx("div", { className: "PaPopupMenu-footer", children: footer(hide) })] })] }));
|
|
66
71
|
}
|
|
67
72
|
function PopupMenuItemWrapper({ item, onHide }) {
|
|
68
73
|
const subMenuRef = useRef(null);
|
|
@@ -102,5 +107,7 @@ function PopupMenuItemWrapper({ item, onHide }) {
|
|
|
102
107
|
return;
|
|
103
108
|
return setupPopoverPositioning(subMenuEl, () => computePopupPosition(parentEl, subMenuEl, "right", "cardinal"));
|
|
104
109
|
}, [item.subMenu]);
|
|
105
|
-
return (_jsxs("div", { className: "PaPopupMenu-item", popoverTargetAction: "toggle", popoverTarget: subMenuId.current, children: [_jsx(MenuItem, { item: itemWithSubmenuHandling }), item.subMenu && (_jsx("div", { className: "PaPopupMenu-submenu", popover: "auto", id: subMenuId.current, ref: subMenuRef, children: item.subMenu.map((subItem) => (
|
|
110
|
+
return (_jsxs("div", { className: "PaPopupMenu-item", popoverTargetAction: "toggle", popoverTarget: subMenuId.current, children: [_jsx(MenuItem, { item: itemWithSubmenuHandling }), item.subMenu && (_jsx("div", { className: "PaPopupMenu-submenu", popover: "auto", id: subMenuId.current, ref: subMenuRef, children: item.subMenu.map((subItem, index) => isSeparator(subItem) ? (
|
|
111
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: separator items may not have unique keys
|
|
112
|
+
_jsx("div", { className: "PaPopupMenu-separator" }, `separator-${index}`)) : (_jsx(PopupMenuItemWrapper, { item: subItem, onHide: onHide }, subItem.key))) }))] }));
|
|
106
113
|
}
|
package/dist/SideMenu.js
CHANGED
|
@@ -2,12 +2,23 @@ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
|
2
2
|
import "../styles/SideMenu.css";
|
|
3
3
|
import { Accordion } from "./Accordion.js";
|
|
4
4
|
import { MenuItem } from "./MenuItem.js";
|
|
5
|
+
function isSeparator(item) {
|
|
6
|
+
return "separator" in item && item.separator === true;
|
|
7
|
+
}
|
|
5
8
|
export function SideMenu({ menu }) {
|
|
6
|
-
return (_jsx(_Fragment, { children: menu.map((child) =>
|
|
9
|
+
return (_jsx(_Fragment, { children: menu.map((child, index) => {
|
|
10
|
+
return isSeparator(child) ? (
|
|
11
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: separator items may not have unique keys
|
|
12
|
+
_jsx("div", { className: "PaSideMenu-separator" }, `separator-${index}`)) : (_jsx(AccordionOrMenuItem, { item: child }, child.key));
|
|
13
|
+
}) }));
|
|
7
14
|
}
|
|
8
15
|
function AccordionOrMenuItem({ item }) {
|
|
9
16
|
if (item.subMenu) {
|
|
10
|
-
return (_jsx(Accordion, { header: item, expanded: item.expanded, children: item.subMenu.map((child) =>
|
|
17
|
+
return (_jsx(Accordion, { header: item, expanded: item.expanded, children: item.subMenu.map((child, index) => {
|
|
18
|
+
return isSeparator(child) ? (
|
|
19
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: separator items may not have unique keys
|
|
20
|
+
_jsx("div", { className: "PaSideMenu-separator" }, `separator-${index}`)) : (_jsx(AccordionOrMenuItem, { item: child }, child.key));
|
|
21
|
+
}) }));
|
|
11
22
|
}
|
|
12
23
|
return _jsx(MenuItem, { item: item });
|
|
13
24
|
}
|
package/dist/SortableList.js
CHANGED
|
@@ -17,9 +17,8 @@ export function SortableList({ items, onReorder, keyField, renderItem, direction
|
|
|
17
17
|
}, [items, keyField]);
|
|
18
18
|
const handleSetList = (newList) => {
|
|
19
19
|
// Ignore empty list updates from ReactSortable during initialization
|
|
20
|
-
if (newList.length === 0 && sortableItems.length > 0)
|
|
20
|
+
if (newList.length === 0 && sortableItems.length > 0)
|
|
21
21
|
return;
|
|
22
|
-
}
|
|
23
22
|
setSortableItems(newList);
|
|
24
23
|
onReorder(newList.map((item) => item.data));
|
|
25
24
|
};
|
package/dist/Spinner.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
import "../styles/Spinner.css";
|
|
2
|
-
export
|
|
2
|
+
export interface SpinnerProps {
|
|
3
|
+
/** @default `"medium"` */
|
|
4
|
+
size?: "small" | "medium" | "large";
|
|
5
|
+
}
|
|
6
|
+
export declare function Spinner({ size }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/Spinner.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import "../styles/Spinner.css";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
export function Spinner({ size = "medium" }) {
|
|
5
|
+
return _jsx("div", { className: clsx("PaSpinner", size) });
|
|
5
6
|
}
|
package/dist/SplitButton.js
CHANGED
|
@@ -10,8 +10,6 @@ export function SplitButton(props) {
|
|
|
10
10
|
const containerRef = useRef(null);
|
|
11
11
|
const menuRef = useRef(null);
|
|
12
12
|
const menuId = useRef(`pa-splitbtn-menu-${Math.random().toString(36).substring(2, 9)}`);
|
|
13
|
-
const severity = props.severity ?? "primary";
|
|
14
|
-
const disabled = props.disabled;
|
|
15
13
|
const hasEnabledItems = items.some((item) => !item.disabled);
|
|
16
14
|
useEffect(() => {
|
|
17
15
|
const menu = menuRef.current;
|
|
@@ -36,5 +34,5 @@ export function SplitButton(props) {
|
|
|
36
34
|
menuRef.current?.hidePopover();
|
|
37
35
|
}
|
|
38
36
|
};
|
|
39
|
-
return (_jsxs("div", { ref: containerRef, className: clsx("PaSplitBtn",
|
|
37
|
+
return (_jsxs("div", { ref: containerRef, className: clsx("PaSplitBtn", className, { outlined: props.outlined }), children: [_jsx(Button, { ...buttonProps, className: "PaSplitBtn-main" }), _jsx("button", { type: "button", className: clsx("PaSplitBtn-toggle", props.severity ?? "primary"), popoverTarget: menuId.current, popoverTargetAction: "toggle", "aria-haspopup": "menu", disabled: !hasEnabledItems, children: _jsx(ChevronDown, { className: "PaSplitBtn-toggleIcon" }) }), _jsx("div", { ref: menuRef, id: menuId.current, className: "PaSplitBtn-menu", role: "menu", popover: "auto", children: items.map((item) => (_jsxs("button", { type: "button", className: clsx("PaSplitBtn-menuItem", item.danger && "danger"), onClick: () => void handleItemClick(item), role: "menuitem", disabled: item.disabled, children: [item.icon && _jsx("span", { className: "PaSplitBtn-menuIcon", children: item.icon }), item.label] }, item.label))) })] }));
|
|
40
38
|
}
|
package/dist/Tabs.js
CHANGED
|
@@ -10,7 +10,7 @@ export function Tabs({ children, value, onChange, variant = "default", className
|
|
|
10
10
|
tabs.push(child.props);
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
|
-
return (_jsx("div", { className: clsx("PaTabs", variant, className), role: "tablist", children: tabs.map((tab) => (_jsxs("button", { type: "button", className: clsx("PaTab", value === tab.value && "active", tab.
|
|
13
|
+
return (_jsx("div", { className: clsx("PaTabs", variant, className), role: "tablist", children: tabs.map((tab) => (_jsxs("button", { type: "button", className: clsx("PaTab", value === tab.value && "active", tab.className), onClick: () => !tab.disabled && onChange(tab.value), disabled: tab.disabled, role: "tab", "aria-selected": value === tab.value, children: [tab.icon && _jsx("span", { className: "PaTab-icon", children: tab.icon }), tab.label] }, tab.value))) }));
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Render-less component for tab definition.
|
package/dist/ToggleButton.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export interface ToggleButtonProps {
|
|
|
6
6
|
children: ReactNode;
|
|
7
7
|
className?: string;
|
|
8
8
|
disabled?: boolean;
|
|
9
|
+
severity?: "primary" | "secondary" | "success" | "info" | "warning" | "danger" | "ghost";
|
|
9
10
|
"aria-label"?: string;
|
|
10
11
|
}
|
|
11
|
-
export declare function ToggleButton({ checked, onChange, children, className, disabled, ...rest }: ToggleButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function ToggleButton({ checked, onChange, children, className, disabled, severity, ...rest }: ToggleButtonProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/ToggleButton.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import "../styles/ToggleButton.css";
|
|
3
3
|
import { clsx } from "clsx";
|
|
4
|
-
export function ToggleButton({ checked, onChange, children, className, disabled, ...rest }) {
|
|
5
|
-
return (_jsx("button", { type: "button", className: clsx("PaToggleBtn", checked && "active",
|
|
4
|
+
export function ToggleButton({ checked, onChange, children, className, disabled, severity = "primary", ...rest }) {
|
|
5
|
+
return (_jsx("button", { type: "button", className: clsx("PaToggleBtn", severity, checked && "active", className), onClick: () => !disabled && onChange(!checked), disabled: disabled, "aria-pressed": checked, ...rest, children: children }));
|
|
6
6
|
}
|
package/dist/ToggleGroup.js
CHANGED
|
@@ -2,5 +2,5 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import "../styles/ToggleGroup.css";
|
|
3
3
|
import { clsx } from "clsx";
|
|
4
4
|
export function ToggleGroup({ value, onChange, options, className, disabled }) {
|
|
5
|
-
return (_jsx("fieldset", { className: clsx("PaToggleGroup",
|
|
5
|
+
return (_jsx("fieldset", { className: clsx("PaToggleGroup", className), disabled: disabled, children: options.map((option) => (_jsx("button", { type: "button", className: clsx("PaToggleGroup-item", value === option.value && "active"), onClick: () => !option.disabled && onChange(option.value), disabled: option.disabled, "aria-pressed": value === option.value, children: option.label }, option.value))) }));
|
|
6
6
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,12 +2,12 @@ import "../styles/theme/index.css";
|
|
|
2
2
|
export * from "./Checkbox.js";
|
|
3
3
|
export * from "./DateInput.js";
|
|
4
4
|
export * from "./InputNumber.js";
|
|
5
|
+
export * from "./InputSwitch.js";
|
|
5
6
|
export * from "./InputText.js";
|
|
6
7
|
export * from "./MultiSelect.js";
|
|
7
8
|
export * from "./PasswordInput.js";
|
|
8
9
|
export * from "./RadioButton.js";
|
|
9
10
|
export * from "./Select.js";
|
|
10
|
-
export * from "./Switch.js";
|
|
11
11
|
export * from "./Textarea.js";
|
|
12
12
|
export * from "./ToggleGroup.js";
|
|
13
13
|
export * from "./Button.js";
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ import "../styles/theme/index.css";
|
|
|
3
3
|
export * from "./Checkbox.js";
|
|
4
4
|
export * from "./DateInput.js";
|
|
5
5
|
export * from "./InputNumber.js";
|
|
6
|
+
export * from "./InputSwitch.js";
|
|
6
7
|
export * from "./InputText.js";
|
|
7
8
|
export * from "./MultiSelect.js";
|
|
8
9
|
export * from "./PasswordInput.js";
|
|
9
10
|
export * from "./RadioButton.js";
|
|
10
11
|
export * from "./Select.js";
|
|
11
|
-
export * from "./Switch.js";
|
|
12
12
|
export * from "./Textarea.js";
|
|
13
13
|
export * from "./ToggleGroup.js";
|
|
14
14
|
// Buttons
|
|
@@ -35,7 +35,8 @@ export interface MenuOption {
|
|
|
35
35
|
popupMenu?: MenuNode[];
|
|
36
36
|
active?: boolean;
|
|
37
37
|
}
|
|
38
|
-
export
|
|
38
|
+
export type MenuNode = OptionMenuNode | SeparatorMenuNode;
|
|
39
|
+
export interface OptionMenuNode extends MenuOption {
|
|
39
40
|
/**
|
|
40
41
|
* An array of child menu items.
|
|
41
42
|
*/
|
|
@@ -45,3 +46,6 @@ export interface MenuNode extends MenuOption {
|
|
|
45
46
|
*/
|
|
46
47
|
expanded?: boolean;
|
|
47
48
|
}
|
|
49
|
+
export interface SeparatorMenuNode {
|
|
50
|
+
separator: true;
|
|
51
|
+
}
|
|
@@ -45,11 +45,12 @@ function getConstrainingBounds(triggerEl) {
|
|
|
45
45
|
bottom: rect.bottom,
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
+
const viewport = window.visualViewport;
|
|
48
49
|
return {
|
|
49
50
|
top: 0,
|
|
50
51
|
left: 0,
|
|
51
|
-
right: window.innerWidth,
|
|
52
|
-
bottom: window.innerHeight,
|
|
52
|
+
right: viewport?.width ?? window.innerWidth,
|
|
53
|
+
bottom: viewport?.height ?? window.innerHeight,
|
|
53
54
|
};
|
|
54
55
|
}
|
|
55
56
|
function computeCornerPosition(triggerRect, popupWidth, popupHeight, bounds, preferredPosition) {
|
package/package.json
CHANGED
package/styles/Accordion.css
CHANGED
|
@@ -24,6 +24,13 @@
|
|
|
24
24
|
background: var(--color-bg-subtle);
|
|
25
25
|
transition: background-color var(--transition);
|
|
26
26
|
|
|
27
|
+
&:disabled,
|
|
28
|
+
&.disabled {
|
|
29
|
+
color: var(--color-text-muted);
|
|
30
|
+
pointer-events: none;
|
|
31
|
+
cursor: not-allowed;
|
|
32
|
+
}
|
|
33
|
+
|
|
27
34
|
/* &:hover {
|
|
28
35
|
background: var(--color-bg-section);
|
|
29
36
|
} */
|
package/styles/Alert.css
CHANGED
|
@@ -55,10 +55,16 @@
|
|
|
55
55
|
color 0.15s,
|
|
56
56
|
background-color 0.15s;
|
|
57
57
|
|
|
58
|
-
&:hover {
|
|
58
|
+
&:hover:not(:disabled) {
|
|
59
59
|
color: var(--color-text);
|
|
60
60
|
background: rgb(0 0 0 / 10%);
|
|
61
61
|
}
|
|
62
|
+
|
|
63
|
+
&:disabled {
|
|
64
|
+
color: var(--color-text-light);
|
|
65
|
+
pointer-events: none;
|
|
66
|
+
cursor: not-allowed;
|
|
67
|
+
}
|
|
62
68
|
}
|
|
63
69
|
|
|
64
70
|
.PaAlert-title {
|
package/styles/Breadcrumb.css
CHANGED
|
@@ -21,15 +21,34 @@
|
|
|
21
21
|
font-size: var(--text-sm);
|
|
22
22
|
color: var(--color-text-muted);
|
|
23
23
|
white-space: nowrap;
|
|
24
|
+
|
|
25
|
+
&.iconBtn {
|
|
26
|
+
display: flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
width: 32px;
|
|
30
|
+
height: 32px;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
._mobile .PaNavbar-item {
|
|
35
|
+
padding: 0 var(--space-2);
|
|
24
36
|
}
|
|
25
37
|
|
|
26
38
|
.PaBreadcrumb-link:is(a, button) {
|
|
27
39
|
cursor: pointer;
|
|
28
40
|
transition: color var(--transition);
|
|
29
41
|
|
|
30
|
-
&:hover {
|
|
42
|
+
&:hover:not(:disabled):not(.disabled) {
|
|
31
43
|
color: var(--color-primary);
|
|
32
44
|
}
|
|
45
|
+
|
|
46
|
+
&:disabled,
|
|
47
|
+
&.disabled {
|
|
48
|
+
color: var(--color-text-muted);
|
|
49
|
+
pointer-events: none;
|
|
50
|
+
cursor: not-allowed;
|
|
51
|
+
}
|
|
33
52
|
}
|
|
34
53
|
|
|
35
54
|
.PaBreadcrumb-separator {
|
|
@@ -45,13 +64,3 @@
|
|
|
45
64
|
height: 16px;
|
|
46
65
|
}
|
|
47
66
|
}
|
|
48
|
-
|
|
49
|
-
.PaBreadcrumb-current {
|
|
50
|
-
max-width: 200px;
|
|
51
|
-
overflow: hidden;
|
|
52
|
-
text-overflow: ellipsis;
|
|
53
|
-
font-size: var(--text-sm);
|
|
54
|
-
font-weight: var(--font-medium);
|
|
55
|
-
color: var(--color-text);
|
|
56
|
-
white-space: nowrap;
|
|
57
|
-
}
|
package/styles/Button.css
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* ========================================
|
|
2
2
|
Buttons
|
|
3
3
|
======================================== */
|
|
4
|
+
._paForm button,
|
|
4
5
|
.PaBtn {
|
|
5
6
|
display: inline-flex;
|
|
6
7
|
gap: var(--space-2);
|
|
@@ -24,11 +25,12 @@
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
/* Primary button */
|
|
28
|
+
&,
|
|
27
29
|
&.primary {
|
|
28
30
|
color: var(--color-text-inverse);
|
|
29
31
|
background: var(--color-primary);
|
|
30
32
|
|
|
31
|
-
&:hover {
|
|
33
|
+
&:hover:not(:disabled):not(.disabled) {
|
|
32
34
|
background: var(--color-primary-hover);
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -40,10 +42,10 @@
|
|
|
40
42
|
/* Secondary button (outline) */
|
|
41
43
|
&.secondary {
|
|
42
44
|
color: var(--color-text-muted);
|
|
43
|
-
background:
|
|
45
|
+
background: var(--color-bg-muted);
|
|
44
46
|
border: 1px solid var(--color-border);
|
|
45
47
|
|
|
46
|
-
&:hover {
|
|
48
|
+
&:hover:not(:disabled):not(.disabled) {
|
|
47
49
|
color: var(--color-text);
|
|
48
50
|
background: var(--color-bg-subtle);
|
|
49
51
|
border-color: var(--color-text-muted);
|
|
@@ -60,7 +62,7 @@
|
|
|
60
62
|
color: var(--color-text-muted);
|
|
61
63
|
background: transparent;
|
|
62
64
|
|
|
63
|
-
&:hover {
|
|
65
|
+
&:hover:not(:disabled):not(.disabled) {
|
|
64
66
|
color: var(--color-text);
|
|
65
67
|
background: var(--color-bg-subtle);
|
|
66
68
|
}
|
|
@@ -71,7 +73,7 @@
|
|
|
71
73
|
color: var(--color-text-inverse);
|
|
72
74
|
background: var(--color-danger);
|
|
73
75
|
|
|
74
|
-
&:hover {
|
|
76
|
+
&:hover:not(:disabled):not(.disabled) {
|
|
75
77
|
background: var(--color-danger-dark);
|
|
76
78
|
}
|
|
77
79
|
}
|
|
@@ -82,7 +84,7 @@
|
|
|
82
84
|
background: transparent;
|
|
83
85
|
border: 2px solid var(--color-yellow);
|
|
84
86
|
|
|
85
|
-
&:hover {
|
|
87
|
+
&:hover:not(:disabled):not(.disabled) {
|
|
86
88
|
background: var(--color-yellow-light);
|
|
87
89
|
}
|
|
88
90
|
}
|
|
@@ -107,10 +109,44 @@
|
|
|
107
109
|
/* Disabled state */
|
|
108
110
|
&:disabled,
|
|
109
111
|
&.disabled {
|
|
112
|
+
color: var(--color-text-disabled);
|
|
110
113
|
pointer-events: none;
|
|
111
114
|
cursor: not-allowed;
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
background: var(--color-bg-disabled);
|
|
116
|
+
border-color: var(--color-bg-disabled);
|
|
117
|
+
|
|
118
|
+
&.outlined {
|
|
119
|
+
background: transparent;
|
|
120
|
+
border-color: var(--color-border-disabled);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
&.primary {
|
|
124
|
+
color: var(--color-primary-disabled);
|
|
125
|
+
background: var(--color-primary-bg-disabled);
|
|
126
|
+
border-color: var(--color-primary-bg-disabled);
|
|
127
|
+
|
|
128
|
+
&.outlined {
|
|
129
|
+
background: transparent;
|
|
130
|
+
border-color: var(--color-primary-disabled);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
&.danger {
|
|
135
|
+
color: var(--color-danger-disabled);
|
|
136
|
+
background: var(--color-danger-bg-disabled);
|
|
137
|
+
border-color: var(--color-danger-bg-disabled);
|
|
138
|
+
|
|
139
|
+
&.outlined {
|
|
140
|
+
background: transparent;
|
|
141
|
+
border-color: var(--color-danger-disabled);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
&.warning {
|
|
146
|
+
color: var(--color-warning-disabled);
|
|
147
|
+
background: transparent;
|
|
148
|
+
border-color: var(--color-warning-disabled);
|
|
149
|
+
}
|
|
114
150
|
}
|
|
115
151
|
|
|
116
152
|
/* Outlined variant */
|
|
@@ -119,7 +155,7 @@
|
|
|
119
155
|
border: 1px solid currentColor;
|
|
120
156
|
}
|
|
121
157
|
|
|
122
|
-
&.danger.outlined {
|
|
158
|
+
&.danger.outlined:not(:disabled):not(.disabled) {
|
|
123
159
|
color: var(--color-danger);
|
|
124
160
|
|
|
125
161
|
&:hover {
|
|
@@ -127,7 +163,7 @@
|
|
|
127
163
|
}
|
|
128
164
|
}
|
|
129
165
|
|
|
130
|
-
&.primary.outlined {
|
|
166
|
+
&.primary.outlined:not(:disabled):not(.disabled) {
|
|
131
167
|
color: var(--color-primary);
|
|
132
168
|
|
|
133
169
|
&:hover {
|
package/styles/Checkbox.css
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
user-select: none;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
._paForm input[type="checkbox"],
|
|
12
13
|
.PaCheckboxInput {
|
|
13
14
|
display: flex;
|
|
14
15
|
flex-shrink: 0;
|
|
@@ -51,7 +52,8 @@
|
|
|
51
52
|
|
|
52
53
|
&:disabled {
|
|
53
54
|
cursor: not-allowed;
|
|
54
|
-
|
|
55
|
+
background: var(--color-bg-muted);
|
|
56
|
+
border-color: var(--color-border-light);
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
|
package/styles/Chip.css
CHANGED
|
@@ -28,8 +28,14 @@
|
|
|
28
28
|
border-radius: var(--radius-full);
|
|
29
29
|
transition: all var(--transition);
|
|
30
30
|
|
|
31
|
-
&:hover {
|
|
31
|
+
&:hover:not(:disabled) {
|
|
32
32
|
color: var(--color-danger);
|
|
33
33
|
background: var(--color-danger-light);
|
|
34
34
|
}
|
|
35
|
+
|
|
36
|
+
&:disabled {
|
|
37
|
+
color: var(--color-text-light);
|
|
38
|
+
pointer-events: none;
|
|
39
|
+
cursor: not-allowed;
|
|
40
|
+
}
|
|
35
41
|
}
|