@salt-ds/lab 1.0.0-alpha.86 → 1.0.0-alpha.88
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/CHANGELOG.md +126 -0
- package/css/salt-lab.css +145 -212
- package/dist-cjs/calendar/internal/CalendarDay.css.js +1 -1
- package/dist-cjs/common-hooks/useSelection.js +0 -2
- package/dist-cjs/common-hooks/useSelection.js.map +1 -1
- package/dist-cjs/contact-details/ContactDetails.css.js +1 -1
- package/dist-cjs/date-input/DateInput.css.js +1 -1
- package/dist-cjs/date-input/DateInputRange.js +2 -8
- package/dist-cjs/date-input/DateInputRange.js.map +1 -1
- package/dist-cjs/date-input/DateInputSingle.js +1 -1
- package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
- package/dist-cjs/index.js +6 -2
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/list-deprecated/ListItem.js.map +1 -1
- package/dist-cjs/rating/Rating.css.js +1 -1
- package/dist-cjs/rating/Rating.js +8 -7
- package/dist-cjs/rating/Rating.js.map +1 -1
- package/dist-cjs/tabs-next/TabListNext.js +1 -1
- package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.js +2 -2
- package/dist-cjs/tokenized-input-next/TokenizedInputNext.js.map +1 -1
- package/dist-cjs/tree/Tree.css.js +1 -1
- package/dist-cjs/tree/Tree.js +274 -207
- package/dist-cjs/tree/Tree.js.map +1 -1
- package/dist-cjs/tree/TreeContext.js +31 -0
- package/dist-cjs/tree/TreeContext.js.map +1 -0
- package/dist-cjs/tree/TreeNode.css.js +1 -1
- package/dist-cjs/tree/TreeNode.js +86 -42
- package/dist-cjs/tree/TreeNode.js.map +1 -1
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js +6 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.css.js.map +1 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.js +62 -0
- package/dist-cjs/tree/TreeNodeExpansionIcon.js.map +1 -0
- package/dist-cjs/tree/TreeNodeLabel.css.js +6 -0
- package/dist-cjs/tree/TreeNodeLabel.css.js.map +1 -0
- package/dist-cjs/tree/TreeNodeLabel.js +26 -0
- package/dist-cjs/tree/TreeNodeLabel.js.map +1 -0
- package/dist-cjs/tree/TreeNodeTrigger.css.js +6 -0
- package/dist-cjs/tree/TreeNodeTrigger.css.js.map +1 -0
- package/dist-cjs/tree/TreeNodeTrigger.js +152 -0
- package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -0
- package/dist-cjs/tree/useTree.js +305 -133
- package/dist-cjs/tree/useTree.js.map +1 -1
- package/dist-es/calendar/internal/CalendarDay.css.js +1 -1
- package/dist-es/combo-box-deprecated/internal/DefaultComboBox.js +1 -1
- package/dist-es/combo-box-deprecated/internal/MultiSelectComboBox.js +1 -1
- package/dist-es/combo-box-deprecated/internal/useComboBox.js +1 -1
- package/dist-es/combo-box-deprecated/internal/useMultiSelectComboBox.js +1 -1
- package/dist-es/common-hooks/useCollectionItems.js +1 -1
- package/dist-es/common-hooks/useSelection.js +1 -2
- package/dist-es/common-hooks/useSelection.js.map +1 -1
- package/dist-es/contact-details/ContactDetails.css.js +1 -1
- package/dist-es/date-input/DateInput.css.js +1 -1
- package/dist-es/date-input/DateInputRange.js +2 -8
- package/dist-es/date-input/DateInputRange.js.map +1 -1
- package/dist-es/date-input/DateInputSingle.js +1 -1
- package/dist-es/date-input/DateInputSingle.js.map +1 -1
- package/dist-es/dropdown/DropdownBase.js +1 -1
- package/dist-es/index.js +3 -1
- package/dist-es/index.js.map +1 -1
- package/dist-es/list-deprecated/ListItem.js.map +1 -1
- package/dist-es/rating/Rating.css.js +1 -1
- package/dist-es/rating/Rating.js +8 -7
- package/dist-es/rating/Rating.js.map +1 -1
- package/dist-es/tabs/drag-drop/useDragDropNaturalMovement.js +1 -1
- package/dist-es/tabs-next/TabListNext.js +1 -1
- package/dist-es/tabs-next/TabListNext.js.map +1 -1
- package/dist-es/tokenized-input/TokenizedInputBase.js +1 -1
- package/dist-es/tokenized-input-next/TokenizedInputNext.js +2 -2
- package/dist-es/tokenized-input-next/TokenizedInputNext.js.map +1 -1
- package/dist-es/tree/Tree.css.js +1 -1
- package/dist-es/tree/Tree.js +275 -208
- package/dist-es/tree/Tree.js.map +1 -1
- package/dist-es/tree/TreeContext.js +26 -0
- package/dist-es/tree/TreeContext.js.map +1 -0
- package/dist-es/tree/TreeNode.css.js +1 -1
- package/dist-es/tree/TreeNode.js +87 -43
- package/dist-es/tree/TreeNode.js.map +1 -1
- package/dist-es/tree/TreeNodeExpansionIcon.css.js +4 -0
- package/dist-es/tree/TreeNodeExpansionIcon.css.js.map +1 -0
- package/dist-es/tree/TreeNodeExpansionIcon.js +60 -0
- package/dist-es/tree/TreeNodeExpansionIcon.js.map +1 -0
- package/dist-es/tree/TreeNodeLabel.css.js +4 -0
- package/dist-es/tree/TreeNodeLabel.css.js.map +1 -0
- package/dist-es/tree/TreeNodeLabel.js +24 -0
- package/dist-es/tree/TreeNodeLabel.js.map +1 -0
- package/dist-es/tree/TreeNodeTrigger.css.js +4 -0
- package/dist-es/tree/TreeNodeTrigger.css.js.map +1 -0
- package/dist-es/tree/TreeNodeTrigger.js +150 -0
- package/dist-es/tree/TreeNodeTrigger.js.map +1 -0
- package/dist-es/tree/useTree.js +306 -134
- package/dist-es/tree/useTree.js.map +1 -1
- package/dist-types/date-input/DateInputRange.d.ts +1 -1
- package/dist-types/date-input/DateInputSingle.d.ts +1 -1
- package/dist-types/index.d.ts +0 -1
- package/dist-types/list-deprecated/ListItem.d.ts +1 -0
- package/dist-types/rating/Rating.d.ts +5 -6
- package/dist-types/tokenized-input/internal/InputPill.d.ts +1 -1
- package/dist-types/tokenized-input-next/internal/InputPill.d.ts +1 -1
- package/dist-types/tree/Tree.d.ts +36 -3
- package/dist-types/tree/TreeContext.d.ts +71 -0
- package/dist-types/tree/TreeNode.d.ts +23 -10
- package/dist-types/tree/TreeNodeExpansionIcon.d.ts +4 -0
- package/dist-types/tree/TreeNodeLabel.d.ts +4 -0
- package/dist-types/tree/TreeNodeTrigger.d.ts +8 -0
- package/dist-types/tree/index.d.ts +3 -0
- package/dist-types/tree/useTree.d.ts +79 -3
- package/package.json +3 -3
- package/dist-cjs/common-hooks/calcPreferredHeight.js +0 -27
- package/dist-cjs/common-hooks/calcPreferredHeight.js.map +0 -1
- package/dist-cjs/common-hooks/useAutoSizer.js +0 -33
- package/dist-cjs/common-hooks/useAutoSizer.js.map +0 -1
- package/dist-cjs/kbd/Kbd.css.js +0 -6
- package/dist-cjs/kbd/Kbd.css.js.map +0 -1
- package/dist-cjs/kbd/Kbd.js +0 -34
- package/dist-cjs/kbd/Kbd.js.map +0 -1
- package/dist-cjs/tree/use-tree-keyboard-navigation.js +0 -51
- package/dist-cjs/tree/use-tree-keyboard-navigation.js.map +0 -1
- package/dist-es/common-hooks/calcPreferredHeight.js +0 -25
- package/dist-es/common-hooks/calcPreferredHeight.js.map +0 -1
- package/dist-es/common-hooks/useAutoSizer.js +0 -31
- package/dist-es/common-hooks/useAutoSizer.js.map +0 -1
- package/dist-es/kbd/Kbd.css.js +0 -4
- package/dist-es/kbd/Kbd.css.js.map +0 -1
- package/dist-es/kbd/Kbd.js +0 -32
- package/dist-es/kbd/Kbd.js.map +0 -1
- package/dist-es/tree/use-tree-keyboard-navigation.js +0 -48
- package/dist-es/tree/use-tree-keyboard-navigation.js.map +0 -1
- package/dist-types/kbd/Kbd.d.ts +0 -8
- package/dist-types/kbd/index.d.ts +0 -1
- package/dist-types/tree/treeTypes.d.ts +0 -42
- package/dist-types/tree/use-tree-keyboard-navigation.d.ts +0 -15
|
@@ -1,3 +1,36 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { type ComponentPropsWithoutRef, type SyntheticEvent } from "react";
|
|
2
|
+
export interface TreeProps extends ComponentPropsWithoutRef<"ul"> {
|
|
3
|
+
/**
|
|
4
|
+
* Default expanded nodes (uncontrolled)
|
|
5
|
+
*/
|
|
6
|
+
defaultExpanded?: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Expanded nodes (controlled)
|
|
9
|
+
*/
|
|
10
|
+
expanded?: string[];
|
|
11
|
+
/**
|
|
12
|
+
* Callback on expanded nodes change
|
|
13
|
+
*/
|
|
14
|
+
onExpandedChange?: (event: SyntheticEvent, expanded: string[]) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Default selected nodes (uncontrolled)
|
|
17
|
+
*/
|
|
18
|
+
defaultSelected?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Selected nodes
|
|
21
|
+
*/
|
|
22
|
+
selected?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* Callback on selected nodes change
|
|
25
|
+
*/
|
|
26
|
+
onSelectionChange?: (event: SyntheticEvent, selected: string[]) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Sets multiselect mode with checkboxes and allows for multiple node selection
|
|
29
|
+
*/
|
|
30
|
+
multiselect?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Sets tree to disabled state, preventing all interaction
|
|
33
|
+
*/
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare const Tree: import("react").ForwardRefExoticComponent<TreeProps & import("react").RefAttributes<HTMLUListElement>>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type Dispatch, type ReactNode, type SetStateAction, type SyntheticEvent } from "react";
|
|
2
|
+
import type { TreeModel, TreeNodeMeta } from "./useTree";
|
|
3
|
+
export interface TreeContextValue {
|
|
4
|
+
expandedState: Set<string>;
|
|
5
|
+
/** Toggle a node expansion state */
|
|
6
|
+
toggleExpanded: (event: SyntheticEvent, value: string) => void;
|
|
7
|
+
/** Selected node values */
|
|
8
|
+
selectedState: string[];
|
|
9
|
+
/** Selected node values as Set for O(1) lookups */
|
|
10
|
+
selectedSet: Set<string>;
|
|
11
|
+
/** Set selected state directly */
|
|
12
|
+
setSelectedState: Dispatch<SetStateAction<string[]>>;
|
|
13
|
+
/** Select node */
|
|
14
|
+
select: (event: SyntheticEvent, value: string) => void;
|
|
15
|
+
/** Whether multiselect mode with checkboxes is enabled */
|
|
16
|
+
multiselect: boolean;
|
|
17
|
+
/** Disabled state of the tree */
|
|
18
|
+
disabled: boolean;
|
|
19
|
+
/** Set of disabled node IDs */
|
|
20
|
+
disabledIdsSet: Set<string>;
|
|
21
|
+
/** Tree model for traversal */
|
|
22
|
+
treeModel: TreeModel;
|
|
23
|
+
/** Get node metadata from tree model */
|
|
24
|
+
getNodeMeta: (value: string) => TreeNodeMeta | undefined;
|
|
25
|
+
/** Get parent of a node */
|
|
26
|
+
getParent: (value: string) => string | undefined;
|
|
27
|
+
/** Get children of a node */
|
|
28
|
+
getChildren: (value: string) => string[];
|
|
29
|
+
/** Get all descendants of a node */
|
|
30
|
+
getDescendants: (value: string) => string[];
|
|
31
|
+
/** Get all ancestors of a node */
|
|
32
|
+
getAncestors: (value: string) => string[];
|
|
33
|
+
/** Memoized visible (navigable) nodes in tree order */
|
|
34
|
+
visibleNodes: string[];
|
|
35
|
+
/** Memoized tabbable node ID for roving tabindex (computed once at tree level) */
|
|
36
|
+
tabbableNodeId: string | undefined;
|
|
37
|
+
/** Register a DOM element for focus management */
|
|
38
|
+
registerElement: (value: string, element: HTMLElement) => () => void;
|
|
39
|
+
/** Get DOM element for a node (if mounted) */
|
|
40
|
+
getElement: (value: string) => HTMLElement | undefined;
|
|
41
|
+
/** Active node value */
|
|
42
|
+
activeNode: string | undefined;
|
|
43
|
+
/** Set the active node */
|
|
44
|
+
setActiveNode: Dispatch<SetStateAction<string | undefined>>;
|
|
45
|
+
/** Set of indeterminate (partially selected) node IDs */
|
|
46
|
+
indeterminateState: Set<string>;
|
|
47
|
+
}
|
|
48
|
+
export declare const TreeProvider: import("react").Provider<TreeContextValue | undefined>;
|
|
49
|
+
export declare function useTreeContext(): TreeContextValue;
|
|
50
|
+
export interface TreeNodeContextValue {
|
|
51
|
+
/** Current node value */
|
|
52
|
+
value: string;
|
|
53
|
+
/** Current depth level */
|
|
54
|
+
level: number;
|
|
55
|
+
/** Whether node has children */
|
|
56
|
+
hasChildren: boolean;
|
|
57
|
+
/** Whether node is expanded */
|
|
58
|
+
expanded: boolean;
|
|
59
|
+
/** Whether node is disabled */
|
|
60
|
+
disabled: boolean;
|
|
61
|
+
/** Node id for the li element */
|
|
62
|
+
id: string;
|
|
63
|
+
/** Whether node is selected */
|
|
64
|
+
selected: boolean;
|
|
65
|
+
/** Whether node is in indeterminate state (partially selected children) */
|
|
66
|
+
indeterminate: boolean;
|
|
67
|
+
/** Child TreeNode elements to be rendered inside the group */
|
|
68
|
+
nodeChildren: ReactNode;
|
|
69
|
+
}
|
|
70
|
+
export declare const TreeNodeProvider: import("react").Provider<TreeNodeContextValue | undefined>;
|
|
71
|
+
export declare function useTreeNodeContext(): TreeNodeContextValue | undefined;
|
|
@@ -1,12 +1,25 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { IconProps } from "@salt-ds/icons";
|
|
2
|
+
import { type ComponentType, type ReactNode } from "react";
|
|
3
|
+
export interface TreeNodeProps {
|
|
4
|
+
/**
|
|
5
|
+
* Unique value representing this node within the tree
|
|
6
|
+
*/
|
|
7
|
+
value: string;
|
|
8
|
+
/**
|
|
9
|
+
* Label for the node. When provided, TreeNode automatically renders a TreeNodeTrigger.
|
|
10
|
+
*/
|
|
11
|
+
label?: ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Optional icon to display before the label
|
|
14
|
+
*/
|
|
15
|
+
icon?: ComponentType<IconProps>;
|
|
16
|
+
/**
|
|
17
|
+
* Whether the node is disabled.
|
|
18
|
+
*/
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Child nodes or content.
|
|
22
|
+
*/
|
|
3
23
|
children?: ReactNode;
|
|
4
|
-
description?: string;
|
|
5
|
-
highlighted?: boolean;
|
|
6
|
-
idx?: number;
|
|
7
|
-
isLeaf?: boolean;
|
|
8
|
-
label?: string;
|
|
9
|
-
onMouseEnter?: MouseEventHandler;
|
|
10
|
-
selected?: boolean;
|
|
11
24
|
}
|
|
12
|
-
export declare const TreeNode: (
|
|
25
|
+
export declare const TreeNode: import("react").ForwardRefExoticComponent<TreeNodeProps & import("react").RefAttributes<HTMLLIElement>>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef } from "react";
|
|
2
|
+
export interface TreeNodeExpansionIconProps extends ComponentPropsWithoutRef<"span"> {
|
|
3
|
+
}
|
|
4
|
+
export declare const TreeNodeExpansionIcon: import("react").ForwardRefExoticComponent<TreeNodeExpansionIconProps & import("react").RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef } from "react";
|
|
2
|
+
export interface TreeNodeLabelProps extends ComponentPropsWithoutRef<"span"> {
|
|
3
|
+
}
|
|
4
|
+
export declare const TreeNodeLabel: import("react").ForwardRefExoticComponent<TreeNodeLabelProps & import("react").RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef } from "react";
|
|
2
|
+
export interface TreeNodeTriggerProps extends ComponentPropsWithoutRef<"li"> {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* The forwarded ref points to the inner trigger content span (for tooltip positioning),
|
|
6
|
+
* while the <li> handles focus, ARIA, and event handling.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TreeNodeTrigger: import("react").ForwardRefExoticComponent<TreeNodeTriggerProps & import("react").RefAttributes<HTMLSpanElement>>;
|
|
@@ -1,3 +1,79 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { type ReactNode, type SyntheticEvent } from "react";
|
|
2
|
+
export interface UseTreeProps {
|
|
3
|
+
/**
|
|
4
|
+
* Default expanded nodes (uncontrolled)
|
|
5
|
+
*/
|
|
6
|
+
defaultExpanded?: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Expanded nodes (controlled)
|
|
9
|
+
*/
|
|
10
|
+
expanded?: string[];
|
|
11
|
+
/**
|
|
12
|
+
* Callback on expanded nodes change
|
|
13
|
+
*/
|
|
14
|
+
onExpandedChange?: (event: SyntheticEvent, expanded: string[]) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Default selected nodes (uncontrolled)
|
|
17
|
+
*/
|
|
18
|
+
defaultSelected?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Selected nodes
|
|
21
|
+
*/
|
|
22
|
+
selected?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* Callback on selected nodes change
|
|
25
|
+
*/
|
|
26
|
+
onSelectionChange?: (event: SyntheticEvent, selected: string[]) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Sets multiselect mode with checkboxes and allows for multiple node selection
|
|
29
|
+
*/
|
|
30
|
+
multiselect?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Sets tree to disabled state, preventing all interaction
|
|
33
|
+
*/
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Tree children used to build the tree model for traversal an state management
|
|
37
|
+
*/
|
|
38
|
+
children?: ReactNode;
|
|
39
|
+
}
|
|
40
|
+
export interface TreeNodeMeta {
|
|
41
|
+
value: string;
|
|
42
|
+
parentValue: string | undefined;
|
|
43
|
+
hasChildren: boolean;
|
|
44
|
+
disabled: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface TreeModel {
|
|
47
|
+
/** All nodes indexed by value */
|
|
48
|
+
nodes: Map<string, TreeNodeMeta>;
|
|
49
|
+
/** Ordered list of root node values */
|
|
50
|
+
rootValues: string[];
|
|
51
|
+
/** Maps parent value to ordered list of child values */
|
|
52
|
+
childrenOf: Map<string, string[]>;
|
|
53
|
+
}
|
|
54
|
+
export declare function useTree(props: UseTreeProps): {
|
|
55
|
+
expandedArray: string[];
|
|
56
|
+
setExpandedArray: import("react").Dispatch<import("react").SetStateAction<string[]>>;
|
|
57
|
+
expandedState: Set<string>;
|
|
58
|
+
toggleExpanded: (event: SyntheticEvent, value: string) => void;
|
|
59
|
+
selectedState: string[];
|
|
60
|
+
selectedSet: Set<string>;
|
|
61
|
+
setSelectedState: import("react").Dispatch<import("react").SetStateAction<string[]>>;
|
|
62
|
+
select: (event: SyntheticEvent, value: string) => void;
|
|
63
|
+
multiselect: boolean;
|
|
64
|
+
disabled: boolean;
|
|
65
|
+
disabledIdsSet: Set<string>;
|
|
66
|
+
treeModel: TreeModel;
|
|
67
|
+
getNodeMeta: (value: string) => TreeNodeMeta | undefined;
|
|
68
|
+
getParent: (value: string) => string | undefined;
|
|
69
|
+
getChildren: (parentValue: string) => string[];
|
|
70
|
+
getDescendants: (value: string) => string[];
|
|
71
|
+
getAncestors: (value: string) => string[];
|
|
72
|
+
visibleNodes: string[];
|
|
73
|
+
tabbableNodeId: string | undefined;
|
|
74
|
+
registerElement: (value: string, element: HTMLElement) => () => void;
|
|
75
|
+
getElement: (value: string) => HTMLElement | undefined;
|
|
76
|
+
activeNode: string | undefined;
|
|
77
|
+
setActiveNode: import("react").Dispatch<import("react").SetStateAction<string | undefined>>;
|
|
78
|
+
indeterminateState: Set<string>;
|
|
79
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salt-ds/lab",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.88",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@floating-ui/react": "^0.26.28",
|
|
24
|
-
"@salt-ds/core": "^1.
|
|
24
|
+
"@salt-ds/core": "^1.59.0",
|
|
25
25
|
"@salt-ds/date-adapters": "0.1.0-alpha.6",
|
|
26
|
-
"@salt-ds/icons": "^1.
|
|
26
|
+
"@salt-ds/icons": "^1.18.0",
|
|
27
27
|
"@salt-ds/styles": "0.3.0",
|
|
28
28
|
"@salt-ds/window": "0.1.1",
|
|
29
29
|
"@types/react-window": "^1.8.2",
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const calcPreferredHeight = (props = {}) => {
|
|
4
|
-
const {
|
|
5
|
-
borderless,
|
|
6
|
-
displayedItemCount = 0,
|
|
7
|
-
itemCount = 0,
|
|
8
|
-
itemHeight = 0,
|
|
9
|
-
getItemHeight,
|
|
10
|
-
gapSize = 1
|
|
11
|
-
} = props;
|
|
12
|
-
let preferredHeight = borderless ? 0 : 2;
|
|
13
|
-
const preferredItemCount = itemCount === 0 ? displayedItemCount : Math.min(displayedItemCount, itemCount);
|
|
14
|
-
if (typeof getItemHeight === "function") {
|
|
15
|
-
preferredHeight += Array.from({ length: preferredItemCount }).reduce(
|
|
16
|
-
(total, _, index) => total + Number(getItemHeight(index)) + gapSize,
|
|
17
|
-
0
|
|
18
|
-
) - // We don't want gap after the last item
|
|
19
|
-
gapSize;
|
|
20
|
-
} else {
|
|
21
|
-
preferredHeight += preferredItemCount * Number(itemHeight) + (preferredItemCount - 1) * gapSize;
|
|
22
|
-
}
|
|
23
|
-
return Number.isNaN(preferredHeight) ? void 0 : preferredHeight;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
exports.calcPreferredHeight = calcPreferredHeight;
|
|
27
|
-
//# sourceMappingURL=calcPreferredHeight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calcPreferredHeight.js","sources":["../src/common-hooks/calcPreferredHeight.js"],"sourcesContent":["// TODO refactor this into hook. See useListHeight hook. This code was originally used by List and Tree. List has been refactored,\n// Tree hasn't yet. When Tree is finalised, probably want to share the useListHeight hook, and rename it to make it more generic.\nexport const calcPreferredHeight = (props = {}) => {\n const {\n borderless,\n displayedItemCount = 0,\n itemCount = 0,\n itemHeight = 0,\n getItemHeight,\n gapSize = 1,\n } = props;\n\n let preferredHeight = borderless ? 0 : 2;\n\n // if there is no item we render with the preferred count\n const preferredItemCount =\n itemCount === 0\n ? displayedItemCount\n : Math.min(displayedItemCount, itemCount);\n\n if (typeof getItemHeight === \"function\") {\n preferredHeight +=\n Array.from({ length: preferredItemCount }).reduce(\n (total, _, index) => total + Number(getItemHeight(index)) + gapSize,\n 0,\n ) -\n // We don't want gap after the last item\n gapSize;\n } else {\n preferredHeight +=\n preferredItemCount * Number(itemHeight) +\n (preferredItemCount - 1) * gapSize;\n }\n\n // list height will be undefined if the item height can not be\n // converted to a number, for example rem or a percentage string\n return Number.isNaN(preferredHeight) ? undefined : preferredHeight;\n};\n"],"names":[],"mappings":";;AAEO,MAAM,mBAAA,GAAsB,CAAC,KAAA,GAAQ,EAAC,KAAM;AACjD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA,GAAqB,CAAA;AAAA,IACrB,SAAA,GAAY,CAAA;AAAA,IACZ,UAAA,GAAa,CAAA;AAAA,IACb,aAAA;AAAA,IACA,OAAA,GAAU;AAAA,GACZ,GAAI,KAAA;AAEJ,EAAA,IAAI,eAAA,GAAkB,aAAa,CAAA,GAAI,CAAA;AAGvC,EAAA,MAAM,qBACJ,SAAA,KAAc,CAAA,GACV,qBACA,IAAA,CAAK,GAAA,CAAI,oBAAoB,SAAS,CAAA;AAE5C,EAAA,IAAI,OAAO,kBAAkB,UAAA,EAAY;AACvC,IAAA,eAAA,IACE,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,kBAAA,EAAoB,CAAA,CAAE,MAAA;AAAA,MACzC,CAAC,OAAO,CAAA,EAAG,KAAA,KAAU,QAAQ,MAAA,CAAO,aAAA,CAAc,KAAK,CAAC,CAAA,GAAI,OAAA;AAAA,MAC5D;AAAA,KACF;AAAA,IAEA,OAAA;AAAA,EACJ,CAAA,MAAO;AACL,IAAA,eAAA,IACE,kBAAA,GAAqB,MAAA,CAAO,UAAU,CAAA,GAAA,CACrC,qBAAqB,CAAA,IAAK,OAAA;AAAA,EAC/B;AAIA,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA,GAAI,MAAA,GAAY,eAAA;AACrD;;;;"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var core = require('@salt-ds/core');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
|
|
6
|
-
function useAutoSizer(props) {
|
|
7
|
-
const { containerRef: ref, responsive, width, height } = props;
|
|
8
|
-
const [size, setSize] = react.useState({ width, height });
|
|
9
|
-
const handleResize = react.useCallback(function handleResize2(contentRect) {
|
|
10
|
-
if (contentRect.width > 0 && contentRect.height > 0) {
|
|
11
|
-
setSize({
|
|
12
|
-
width: contentRect.width,
|
|
13
|
-
height: contentRect.height
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
}, []);
|
|
17
|
-
core.useIsomorphicLayoutEffect(() => {
|
|
18
|
-
setSize({ width, height });
|
|
19
|
-
}, [width, height]);
|
|
20
|
-
core.useIsomorphicLayoutEffect(() => {
|
|
21
|
-
if (responsive) {
|
|
22
|
-
if (ref.current) {
|
|
23
|
-
handleResize(ref.current.getBoundingClientRect());
|
|
24
|
-
}
|
|
25
|
-
return () => {
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
}, [handleResize, responsive, ref]);
|
|
29
|
-
return size;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
exports.useAutoSizer = useAutoSizer;
|
|
33
|
-
//# sourceMappingURL=useAutoSizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAutoSizer.js","sources":["../src/common-hooks/useAutoSizer.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { type RefObject, useCallback, useState } from \"react\";\n\nexport interface ListAutosizerProps {\n containerRef: RefObject<Element>;\n responsive: boolean;\n height?: number | string;\n width?: number | string;\n}\n\ninterface size {\n height?: number | string;\n width?: number | string;\n}\n\nexport function useAutoSizer(props: ListAutosizerProps): size {\n const { containerRef: ref, responsive, width, height } = props;\n const [size, setSize] = useState({ width, height });\n\n const handleResize = useCallback(function handleResize(contentRect: DOMRect) {\n if (contentRect.width > 0 && contentRect.height > 0) {\n setSize({\n width: contentRect.width,\n height: contentRect.height,\n });\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n setSize({ width, height });\n }, [width, height]);\n\n useIsomorphicLayoutEffect(() => {\n if (responsive) {\n // let observer: ResizeObserver;\n if (ref.current) {\n handleResize(ref.current.getBoundingClientRect());\n // observer = new ResizeObserver(\n // ([{ contentRect }]: ResizeObserverEntry[]) => {\n // // TODO (currently firing because of scrollbar)\n // // handleResize(contentRect);\n // },\n // );\n // observer.observe(ref.current);\n }\n return () => {\n // if (observer) {\n // observer.disconnect();\n // }\n };\n }\n }, [handleResize, responsive, ref]);\n\n return size;\n}\n"],"names":["useState","useCallback","handleResize","useIsomorphicLayoutEffect"],"mappings":";;;;;AAeO,SAAS,aAAa,KAAA,EAAiC;AAC5D,EAAA,MAAM,EAAE,YAAA,EAAc,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAO,GAAI,KAAA;AACzD,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,KAAA,EAAO,QAAQ,CAAA;AAElD,EAAA,MAAM,YAAA,GAAeC,iBAAA,CAAY,SAASC,aAAAA,CAAa,WAAA,EAAsB;AAC3E,IAAA,IAAI,WAAA,CAAY,KAAA,GAAQ,CAAA,IAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ;AAAA,QACN,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,QAAQ,WAAA,CAAY;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,8BAAA,CAA0B,MAAM;AAC9B,IAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAAA,8BAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,CAAA;AAAA,MAQlD;AACA,MAAA,OAAO,MAAM;AAAA,MAIb,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAElC,EAAA,OAAO,IAAA;AACT;;;;"}
|
package/dist-cjs/kbd/Kbd.css.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var css_248z = ".saltKbd-primary {\n --kbd-background: var(--salt-container-primary-background);\n}\n\n.saltKbd-secondary {\n --kbd-background: var(--salt-container-secondary-background);\n}\n\n.saltKbd-tertiary {\n --kbd-background: var(--salt-container-tertiary-background);\n}\n\n.saltKbd {\n display: inline-flex;\n box-sizing: border-box;\n width: fit-content;\n border-radius: var(--salt-palette-corner-weaker);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-primary-borderColor);\n background: var(--kbd-background);\n box-shadow: 0 var(--salt-size-fixed-100) 0 0 var(--salt-container-primary-borderColor);\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n align-items: center;\n padding: 0 var(--salt-spacing-50);\n text-transform: capitalize;\n color: var(--salt-content-primary-foreground);\n font-family: var(--salt-text-code-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-style: normal;\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n}\n";
|
|
4
|
-
|
|
5
|
-
module.exports = css_248z;
|
|
6
|
-
//# sourceMappingURL=Kbd.css.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/dist-cjs/kbd/Kbd.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var core = require('@salt-ds/core');
|
|
5
|
-
var styles = require('@salt-ds/styles');
|
|
6
|
-
var window = require('@salt-ds/window');
|
|
7
|
-
var clsx = require('clsx');
|
|
8
|
-
var react = require('react');
|
|
9
|
-
var Kbd$1 = require('./Kbd.css.js');
|
|
10
|
-
|
|
11
|
-
const withBaseName = core.makePrefixer("saltKbd");
|
|
12
|
-
const Kbd = react.forwardRef(
|
|
13
|
-
function Kbd2(props, ref) {
|
|
14
|
-
const { children, className, variant = "primary", ...rest } = props;
|
|
15
|
-
const targetWindow = window.useWindow();
|
|
16
|
-
styles.useComponentCssInjection({
|
|
17
|
-
testId: "salt-kbd",
|
|
18
|
-
css: Kbd$1,
|
|
19
|
-
window: targetWindow
|
|
20
|
-
});
|
|
21
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
-
"kbd",
|
|
23
|
-
{
|
|
24
|
-
ref,
|
|
25
|
-
className: clsx.clsx(withBaseName(), withBaseName(variant), className),
|
|
26
|
-
...rest,
|
|
27
|
-
children
|
|
28
|
-
}
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
exports.Kbd = Kbd;
|
|
34
|
-
//# sourceMappingURL=Kbd.js.map
|
package/dist-cjs/kbd/Kbd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.js","sources":["../src/kbd/Kbd.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport kbdCss from \"./Kbd.css\";\n\nexport interface KbdProps extends ComponentPropsWithoutRef<\"kbd\"> {\n /**\n * The variant of the kbd. Defaults to `\"primary\"`.\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nconst withBaseName = makePrefixer(\"saltKbd\");\n\nexport const Kbd = forwardRef<HTMLDivElement, KbdProps>(\n function Kbd(props, ref) {\n const { children, className, variant = \"primary\", ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-kbd\",\n css: kbdCss,\n window: targetWindow,\n });\n\n return (\n <kbd\n ref={ref}\n className={clsx(withBaseName(), withBaseName(variant), className)}\n {...rest}\n >\n {children}\n </kbd>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Kbd","useWindow","useComponentCssInjection","kbdCss","jsx","clsx"],"mappings":";;;;;;;;;;AAeA,MAAM,YAAA,GAAeA,kBAAa,SAAS,CAAA;AAEpC,MAAM,GAAA,GAAMC,gBAAA;AAAA,EACjB,SAASC,IAAAA,CAAI,KAAA,EAAO,GAAA,EAAK;AACvB,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,UAAU,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAE9D,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAKC,KAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACEC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAWC,SAAA,CAAK,YAAA,IAAgB,YAAA,CAAa,OAAO,GAAG,SAAS,CAAA;AAAA,QAC/D,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
var keyUtils = require('../common-hooks/keyUtils.js');
|
|
5
|
-
|
|
6
|
-
const getNodeParentPath = ({ id }) => {
|
|
7
|
-
let pos = id.lastIndexOf("-");
|
|
8
|
-
if (pos !== -1) {
|
|
9
|
-
const path = id.slice(pos + 1);
|
|
10
|
-
const steps = path.split(".");
|
|
11
|
-
if (steps.length === 1) {
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
steps.pop();
|
|
15
|
-
return `${id.slice(0, pos)}-${steps.join(".")}`;
|
|
16
|
-
}
|
|
17
|
-
pos = id.lastIndexOf("/");
|
|
18
|
-
if (pos !== -1) {
|
|
19
|
-
return id.slice(0, pos);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
const useKeyboardNavigation = ({
|
|
23
|
-
collectionHook,
|
|
24
|
-
highlightedIdx,
|
|
25
|
-
highlightItemAtIndex
|
|
26
|
-
}) => {
|
|
27
|
-
const handleKeyDown = react.useCallback(
|
|
28
|
-
(e) => {
|
|
29
|
-
if (e.key === keyUtils.ArrowLeft) {
|
|
30
|
-
const node = collectionHook.data[highlightedIdx];
|
|
31
|
-
const parentId = getNodeParentPath(node);
|
|
32
|
-
if (parentId) {
|
|
33
|
-
highlightItemAtIndex(
|
|
34
|
-
collectionHook.data.findIndex((item) => item.id === parentId)
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
[highlightedIdx, highlightItemAtIndex]
|
|
40
|
-
);
|
|
41
|
-
const listHandlers = {
|
|
42
|
-
onKeyDown: handleKeyDown
|
|
43
|
-
};
|
|
44
|
-
return {
|
|
45
|
-
listHandlers
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
exports.getNodeParentPath = getNodeParentPath;
|
|
50
|
-
exports.useKeyboardNavigation = useKeyboardNavigation;
|
|
51
|
-
//# sourceMappingURL=use-tree-keyboard-navigation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-tree-keyboard-navigation.js","sources":["../src/tree/use-tree-keyboard-navigation.ts"],"sourcesContent":["import { type KeyboardEvent, useCallback } from \"react\";\nimport type { CollectionHookResult, CollectionItem } from \"../common-hooks\";\nimport { ArrowLeft } from \"../common-hooks/keyUtils\";\n\nexport const getNodeParentPath = ({ id }: CollectionItem<any>) => {\n let pos = id.lastIndexOf(\"-\");\n if (pos !== -1) {\n // using the built-in hierarchical id scheme\n // rootId-n-n.n\n const path = id.slice(pos + 1);\n const steps = path.split(\".\");\n if (steps.length === 1) {\n return null;\n }\n steps.pop();\n return `${id.slice(0, pos)}-${steps.join(\".\")}`;\n }\n\n pos = id.lastIndexOf(\"/\");\n if (pos !== -1) {\n // using a path scheme step/step/step\n return id.slice(0, pos);\n }\n};\n\ninterface TreeNavigationHookProps<Item> {\n collectionHook: CollectionHookResult<Item>;\n highlightedIdx: number;\n highlightItemAtIndex: (index: number) => void;\n}\n\ninterface TreeNavigationHookResult {\n listHandlers: {\n onKeyDown: (evt: KeyboardEvent) => void;\n };\n}\n\n// we need a way to set highlightedIdx when selection changes\nexport const useKeyboardNavigation = <Item>({\n collectionHook,\n highlightedIdx,\n highlightItemAtIndex,\n}: TreeNavigationHookProps<Item>): TreeNavigationHookResult => {\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === ArrowLeft) {\n const node = collectionHook.data[highlightedIdx];\n const parentId = getNodeParentPath(node);\n if (parentId) {\n highlightItemAtIndex(\n collectionHook.data.findIndex((item) => item.id === parentId),\n );\n }\n }\n },\n [highlightedIdx, highlightItemAtIndex],\n );\n\n const listHandlers = {\n onKeyDown: handleKeyDown,\n };\n\n return {\n listHandlers,\n };\n};\n"],"names":["useCallback","ArrowLeft"],"mappings":";;;;;AAIO,MAAM,iBAAA,GAAoB,CAAC,EAAE,EAAA,EAAG,KAA2B;AAChE,EAAA,IAAI,GAAA,GAAM,EAAA,CAAG,WAAA,CAAY,GAAG,CAAA;AAC5B,EAAA,IAAI,QAAQ,EAAA,EAAI;AAGd,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,KAAA,CAAM,GAAA,EAAI;AACV,IAAA,OAAO,CAAA,EAAG,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,EAC/C;AAEA,EAAA,GAAA,GAAM,EAAA,CAAG,YAAY,GAAG,CAAA;AACxB,EAAA,IAAI,QAAQ,EAAA,EAAI;AAEd,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EACxB;AACF;AAeO,MAAM,wBAAwB,CAAO;AAAA,EAC1C,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAA+D;AAC7D,EAAA,MAAM,aAAA,GAAgBA,iBAAA;AAAA,IACpB,CAAC,CAAA,KAAqB;AACpB,MAAA,IAAI,CAAA,CAAE,QAAQC,kBAAA,EAAW;AACvB,QAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,cAAc,CAAA;AAC/C,QAAA,MAAM,QAAA,GAAW,kBAAkB,IAAI,CAAA;AACvC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,oBAAA;AAAA,YACE,eAAe,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,QAAQ;AAAA,WAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,gBAAgB,oBAAoB;AAAA,GACvC;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;;;;;"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const calcPreferredHeight = (props = {}) => {
|
|
2
|
-
const {
|
|
3
|
-
borderless,
|
|
4
|
-
displayedItemCount = 0,
|
|
5
|
-
itemCount = 0,
|
|
6
|
-
itemHeight = 0,
|
|
7
|
-
getItemHeight,
|
|
8
|
-
gapSize = 1
|
|
9
|
-
} = props;
|
|
10
|
-
let preferredHeight = borderless ? 0 : 2;
|
|
11
|
-
const preferredItemCount = itemCount === 0 ? displayedItemCount : Math.min(displayedItemCount, itemCount);
|
|
12
|
-
if (typeof getItemHeight === "function") {
|
|
13
|
-
preferredHeight += Array.from({ length: preferredItemCount }).reduce(
|
|
14
|
-
(total, _, index) => total + Number(getItemHeight(index)) + gapSize,
|
|
15
|
-
0
|
|
16
|
-
) - // We don't want gap after the last item
|
|
17
|
-
gapSize;
|
|
18
|
-
} else {
|
|
19
|
-
preferredHeight += preferredItemCount * Number(itemHeight) + (preferredItemCount - 1) * gapSize;
|
|
20
|
-
}
|
|
21
|
-
return Number.isNaN(preferredHeight) ? void 0 : preferredHeight;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export { calcPreferredHeight };
|
|
25
|
-
//# sourceMappingURL=calcPreferredHeight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calcPreferredHeight.js","sources":["../src/common-hooks/calcPreferredHeight.js"],"sourcesContent":["// TODO refactor this into hook. See useListHeight hook. This code was originally used by List and Tree. List has been refactored,\n// Tree hasn't yet. When Tree is finalised, probably want to share the useListHeight hook, and rename it to make it more generic.\nexport const calcPreferredHeight = (props = {}) => {\n const {\n borderless,\n displayedItemCount = 0,\n itemCount = 0,\n itemHeight = 0,\n getItemHeight,\n gapSize = 1,\n } = props;\n\n let preferredHeight = borderless ? 0 : 2;\n\n // if there is no item we render with the preferred count\n const preferredItemCount =\n itemCount === 0\n ? displayedItemCount\n : Math.min(displayedItemCount, itemCount);\n\n if (typeof getItemHeight === \"function\") {\n preferredHeight +=\n Array.from({ length: preferredItemCount }).reduce(\n (total, _, index) => total + Number(getItemHeight(index)) + gapSize,\n 0,\n ) -\n // We don't want gap after the last item\n gapSize;\n } else {\n preferredHeight +=\n preferredItemCount * Number(itemHeight) +\n (preferredItemCount - 1) * gapSize;\n }\n\n // list height will be undefined if the item height can not be\n // converted to a number, for example rem or a percentage string\n return Number.isNaN(preferredHeight) ? undefined : preferredHeight;\n};\n"],"names":[],"mappings":"AAEO,MAAM,mBAAA,GAAsB,CAAC,KAAA,GAAQ,EAAC,KAAM;AACjD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA,GAAqB,CAAA;AAAA,IACrB,SAAA,GAAY,CAAA;AAAA,IACZ,UAAA,GAAa,CAAA;AAAA,IACb,aAAA;AAAA,IACA,OAAA,GAAU;AAAA,GACZ,GAAI,KAAA;AAEJ,EAAA,IAAI,eAAA,GAAkB,aAAa,CAAA,GAAI,CAAA;AAGvC,EAAA,MAAM,qBACJ,SAAA,KAAc,CAAA,GACV,qBACA,IAAA,CAAK,GAAA,CAAI,oBAAoB,SAAS,CAAA;AAE5C,EAAA,IAAI,OAAO,kBAAkB,UAAA,EAAY;AACvC,IAAA,eAAA,IACE,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,kBAAA,EAAoB,CAAA,CAAE,MAAA;AAAA,MACzC,CAAC,OAAO,CAAA,EAAG,KAAA,KAAU,QAAQ,MAAA,CAAO,aAAA,CAAc,KAAK,CAAC,CAAA,GAAI,OAAA;AAAA,MAC5D;AAAA,KACF;AAAA,IAEA,OAAA;AAAA,EACJ,CAAA,MAAO;AACL,IAAA,eAAA,IACE,kBAAA,GAAqB,MAAA,CAAO,UAAU,CAAA,GAAA,CACrC,qBAAqB,CAAA,IAAK,OAAA;AAAA,EAC/B;AAIA,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA,GAAI,MAAA,GAAY,eAAA;AACrD;;;;"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { useIsomorphicLayoutEffect } from '@salt-ds/core';
|
|
2
|
-
import { useState, useCallback } from 'react';
|
|
3
|
-
|
|
4
|
-
function useAutoSizer(props) {
|
|
5
|
-
const { containerRef: ref, responsive, width, height } = props;
|
|
6
|
-
const [size, setSize] = useState({ width, height });
|
|
7
|
-
const handleResize = useCallback(function handleResize2(contentRect) {
|
|
8
|
-
if (contentRect.width > 0 && contentRect.height > 0) {
|
|
9
|
-
setSize({
|
|
10
|
-
width: contentRect.width,
|
|
11
|
-
height: contentRect.height
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
}, []);
|
|
15
|
-
useIsomorphicLayoutEffect(() => {
|
|
16
|
-
setSize({ width, height });
|
|
17
|
-
}, [width, height]);
|
|
18
|
-
useIsomorphicLayoutEffect(() => {
|
|
19
|
-
if (responsive) {
|
|
20
|
-
if (ref.current) {
|
|
21
|
-
handleResize(ref.current.getBoundingClientRect());
|
|
22
|
-
}
|
|
23
|
-
return () => {
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
}, [handleResize, responsive, ref]);
|
|
27
|
-
return size;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export { useAutoSizer };
|
|
31
|
-
//# sourceMappingURL=useAutoSizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAutoSizer.js","sources":["../src/common-hooks/useAutoSizer.ts"],"sourcesContent":["import { useIsomorphicLayoutEffect } from \"@salt-ds/core\";\nimport { type RefObject, useCallback, useState } from \"react\";\n\nexport interface ListAutosizerProps {\n containerRef: RefObject<Element>;\n responsive: boolean;\n height?: number | string;\n width?: number | string;\n}\n\ninterface size {\n height?: number | string;\n width?: number | string;\n}\n\nexport function useAutoSizer(props: ListAutosizerProps): size {\n const { containerRef: ref, responsive, width, height } = props;\n const [size, setSize] = useState({ width, height });\n\n const handleResize = useCallback(function handleResize(contentRect: DOMRect) {\n if (contentRect.width > 0 && contentRect.height > 0) {\n setSize({\n width: contentRect.width,\n height: contentRect.height,\n });\n }\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n setSize({ width, height });\n }, [width, height]);\n\n useIsomorphicLayoutEffect(() => {\n if (responsive) {\n // let observer: ResizeObserver;\n if (ref.current) {\n handleResize(ref.current.getBoundingClientRect());\n // observer = new ResizeObserver(\n // ([{ contentRect }]: ResizeObserverEntry[]) => {\n // // TODO (currently firing because of scrollbar)\n // // handleResize(contentRect);\n // },\n // );\n // observer.observe(ref.current);\n }\n return () => {\n // if (observer) {\n // observer.disconnect();\n // }\n };\n }\n }, [handleResize, responsive, ref]);\n\n return size;\n}\n"],"names":["handleResize"],"mappings":";;;AAeO,SAAS,aAAa,KAAA,EAAiC;AAC5D,EAAA,MAAM,EAAE,YAAA,EAAc,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAO,GAAI,KAAA;AACzD,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAI,SAAS,EAAE,KAAA,EAAO,QAAQ,CAAA;AAElD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,SAASA,aAAAA,CAAa,WAAA,EAAsB;AAC3E,IAAA,IAAI,WAAA,CAAY,KAAA,GAAQ,CAAA,IAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AACnD,MAAA,OAAA,CAAQ;AAAA,QACN,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,QAAQ,WAAA,CAAY;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,UAAA,EAAY;AAEd,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,CAAA;AAAA,MAQlD;AACA,MAAA,OAAO,MAAM;AAAA,MAIb,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,UAAA,EAAY,GAAG,CAAC,CAAA;AAElC,EAAA,OAAO,IAAA;AACT;;;;"}
|
package/dist-es/kbd/Kbd.css.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
var css_248z = ".saltKbd-primary {\n --kbd-background: var(--salt-container-primary-background);\n}\n\n.saltKbd-secondary {\n --kbd-background: var(--salt-container-secondary-background);\n}\n\n.saltKbd-tertiary {\n --kbd-background: var(--salt-container-tertiary-background);\n}\n\n.saltKbd {\n display: inline-flex;\n box-sizing: border-box;\n width: fit-content;\n border-radius: var(--salt-palette-corner-weaker);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-primary-borderColor);\n background: var(--kbd-background);\n box-shadow: 0 var(--salt-size-fixed-100) 0 0 var(--salt-container-primary-borderColor);\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n align-items: center;\n padding: 0 var(--salt-spacing-50);\n text-transform: capitalize;\n color: var(--salt-content-primary-foreground);\n font-family: var(--salt-text-code-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-style: normal;\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n}\n";
|
|
2
|
-
|
|
3
|
-
export { css_248z as default };
|
|
4
|
-
//# sourceMappingURL=Kbd.css.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/dist-es/kbd/Kbd.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { makePrefixer } from '@salt-ds/core';
|
|
3
|
-
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
|
-
import { useWindow } from '@salt-ds/window';
|
|
5
|
-
import { clsx } from 'clsx';
|
|
6
|
-
import { forwardRef } from 'react';
|
|
7
|
-
import css_248z from './Kbd.css.js';
|
|
8
|
-
|
|
9
|
-
const withBaseName = makePrefixer("saltKbd");
|
|
10
|
-
const Kbd = forwardRef(
|
|
11
|
-
function Kbd2(props, ref) {
|
|
12
|
-
const { children, className, variant = "primary", ...rest } = props;
|
|
13
|
-
const targetWindow = useWindow();
|
|
14
|
-
useComponentCssInjection({
|
|
15
|
-
testId: "salt-kbd",
|
|
16
|
-
css: css_248z,
|
|
17
|
-
window: targetWindow
|
|
18
|
-
});
|
|
19
|
-
return /* @__PURE__ */ jsx(
|
|
20
|
-
"kbd",
|
|
21
|
-
{
|
|
22
|
-
ref,
|
|
23
|
-
className: clsx(withBaseName(), withBaseName(variant), className),
|
|
24
|
-
...rest,
|
|
25
|
-
children
|
|
26
|
-
}
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
export { Kbd };
|
|
32
|
-
//# sourceMappingURL=Kbd.js.map
|
package/dist-es/kbd/Kbd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.js","sources":["../src/kbd/Kbd.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport kbdCss from \"./Kbd.css\";\n\nexport interface KbdProps extends ComponentPropsWithoutRef<\"kbd\"> {\n /**\n * The variant of the kbd. Defaults to `\"primary\"`.\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nconst withBaseName = makePrefixer(\"saltKbd\");\n\nexport const Kbd = forwardRef<HTMLDivElement, KbdProps>(\n function Kbd(props, ref) {\n const { children, className, variant = \"primary\", ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-kbd\",\n css: kbdCss,\n window: targetWindow,\n });\n\n return (\n <kbd\n ref={ref}\n className={clsx(withBaseName(), withBaseName(variant), className)}\n {...rest}\n >\n {children}\n </kbd>\n );\n },\n);\n"],"names":["Kbd","kbdCss"],"mappings":";;;;;;;;AAeA,MAAM,YAAA,GAAe,aAAa,SAAS,CAAA;AAEpC,MAAM,GAAA,GAAM,UAAA;AAAA,EACjB,SAASA,IAAAA,CAAI,KAAA,EAAO,GAAA,EAAK;AACvB,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,UAAU,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAE9D,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,UAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAW,IAAA,CAAK,YAAA,IAAgB,YAAA,CAAa,OAAO,GAAG,SAAS,CAAA;AAAA,QAC/D,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { useCallback } from 'react';
|
|
2
|
-
import { ArrowLeft } from '../common-hooks/keyUtils.js';
|
|
3
|
-
|
|
4
|
-
const getNodeParentPath = ({ id }) => {
|
|
5
|
-
let pos = id.lastIndexOf("-");
|
|
6
|
-
if (pos !== -1) {
|
|
7
|
-
const path = id.slice(pos + 1);
|
|
8
|
-
const steps = path.split(".");
|
|
9
|
-
if (steps.length === 1) {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
steps.pop();
|
|
13
|
-
return `${id.slice(0, pos)}-${steps.join(".")}`;
|
|
14
|
-
}
|
|
15
|
-
pos = id.lastIndexOf("/");
|
|
16
|
-
if (pos !== -1) {
|
|
17
|
-
return id.slice(0, pos);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
const useKeyboardNavigation = ({
|
|
21
|
-
collectionHook,
|
|
22
|
-
highlightedIdx,
|
|
23
|
-
highlightItemAtIndex
|
|
24
|
-
}) => {
|
|
25
|
-
const handleKeyDown = useCallback(
|
|
26
|
-
(e) => {
|
|
27
|
-
if (e.key === ArrowLeft) {
|
|
28
|
-
const node = collectionHook.data[highlightedIdx];
|
|
29
|
-
const parentId = getNodeParentPath(node);
|
|
30
|
-
if (parentId) {
|
|
31
|
-
highlightItemAtIndex(
|
|
32
|
-
collectionHook.data.findIndex((item) => item.id === parentId)
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
[highlightedIdx, highlightItemAtIndex]
|
|
38
|
-
);
|
|
39
|
-
const listHandlers = {
|
|
40
|
-
onKeyDown: handleKeyDown
|
|
41
|
-
};
|
|
42
|
-
return {
|
|
43
|
-
listHandlers
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
export { getNodeParentPath, useKeyboardNavigation };
|
|
48
|
-
//# sourceMappingURL=use-tree-keyboard-navigation.js.map
|