@vuu-ui/vuu-ui-controls 4.0.0-alpha.20 → 4.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/package.json +13 -13
  2. package/src/drag-drop/Draggable.css.js +2 -2
  3. package/src/expando-input/ExpandoInput.css.js +1 -1
  4. package/src/icon-button/ToggleIconButton.css.js +1 -1
  5. package/src/index.js +1 -0
  6. package/src/item-picker/ItemPicker.css.js +1 -1
  7. package/src/price-ticker/PriceTicker.css.js +4 -4
  8. package/src/split-pane/SplitPane.css.js +82 -0
  9. package/src/split-pane/SplitPane.js +60 -0
  10. package/src/split-pane/Splitter.js +82 -0
  11. package/src/split-pane/index.js +1 -0
  12. package/src/split-pane/useSplitPane.js +101 -0
  13. package/src/tabstrip/Tab.css.js +3 -3
  14. package/src/tabstrip/Tabstrip.css.js +2 -2
  15. package/src/toolbar/Toolbar.css.js +1 -1
  16. package/types/context-panel-provider/ContextPanelProvider.d.ts +1 -1
  17. package/types/drag-drop/DragDropProvider.d.ts +1 -1
  18. package/types/hover-overlay/HoverOverlay.d.ts +1 -1
  19. package/types/icon-button/Icon.d.ts +1 -1
  20. package/types/icon-button/ToggleIconButton.d.ts +1 -1
  21. package/types/index.d.ts +1 -0
  22. package/types/instrument-picker/SearchCell.d.ts +1 -1
  23. package/types/instrument-picker/TablePicker.d.ts +1 -1
  24. package/types/item-picker/useItemPicker.d.ts +2 -2
  25. package/types/price-ticker/PriceTicker.d.ts +1 -1
  26. package/types/prompt/Prompt.d.ts +1 -1
  27. package/types/sortable-list/SortableList.d.ts +2 -2
  28. package/types/split-button/useSplitButton.d.ts +12 -12
  29. package/types/split-pane/SplitPane.d.ts +44 -0
  30. package/types/split-pane/Splitter.d.ts +10 -0
  31. package/types/split-pane/index.d.ts +2 -0
  32. package/types/split-pane/useSplitPane.d.ts +18 -0
  33. package/types/table-search/SearchCell.d.ts +1 -1
  34. package/types/table-search/TableSearch.d.ts +1 -1
  35. package/types/tabstrip/TabMenu.d.ts +1 -1
  36. package/types/tabstrip/Tabstrip.d.ts +1 -2
  37. package/types/toolbar/Toolbar.d.ts +1 -2
  38. package/types/vuu-date-picker/VuuDatePicker.d.ts +1 -1
  39. package/types/vuu-time-picker/VuuTimePicker.d.ts +1 -1
  40. package/types/vuu-typeahead-input/VuuTypeaheadInput.d.ts +1 -1
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.0.0-alpha.20",
2
+ "version": "4.0.0-alpha.21",
3
3
  "description": "VUU UI Controls",
4
4
  "main": "./src/index.js",
5
5
  "author": "heswell",
@@ -11,20 +11,20 @@
11
11
  "type-defs": "node ../../scripts/build-type-defs.mjs"
12
12
  },
13
13
  "devDependencies": {
14
- "@vuu-ui/vuu-data-types": "4.0.0-alpha.20",
15
- "@vuu-ui/vuu-protocol-types": "4.0.0-alpha.20",
16
- "@vuu-ui/vuu-table-types": "4.0.0-alpha.20"
14
+ "@vuu-ui/vuu-data-types": "4.0.0-alpha.21",
15
+ "@vuu-ui/vuu-protocol-types": "4.0.0-alpha.21",
16
+ "@vuu-ui/vuu-table-types": "4.0.0-alpha.21"
17
17
  },
18
18
  "dependencies": {
19
- "@vuu-ui/vuu-context-menu": "4.0.0-alpha.20",
20
- "@vuu-ui/vuu-data-react": "4.0.0-alpha.20",
21
- "@vuu-ui/vuu-popups": "4.0.0-alpha.20",
22
- "@vuu-ui/vuu-table": "4.0.0-alpha.20",
23
- "@vuu-ui/vuu-utils": "4.0.0-alpha.20",
24
- "@salt-ds/core": "1.67.0",
25
- "@salt-ds/icons": "1.16.0",
26
- "@salt-ds/styles": "0.2.1",
27
- "@salt-ds/window": "0.1.1",
19
+ "@vuu-ui/vuu-context-menu": "4.0.0-alpha.21",
20
+ "@vuu-ui/vuu-data-react": "4.0.0-alpha.21",
21
+ "@vuu-ui/vuu-popups": "4.0.0-alpha.21",
22
+ "@vuu-ui/vuu-table": "4.0.0-alpha.21",
23
+ "@vuu-ui/vuu-utils": "4.0.0-alpha.21",
24
+ "@salt-ds/core": "1.72.0",
25
+ "@salt-ds/icons": "1.18.3",
26
+ "@salt-ds/styles": "0.4.1",
27
+ "@salt-ds/window": "0.1.2",
28
28
  "tabbable": "^6.0.0"
29
29
  },
30
30
  "peerDependencies": {
@@ -26,14 +26,14 @@ const css = `
26
26
  }
27
27
 
28
28
  .vuuDraggable-dropIndicator {
29
- background-color: var(--salt-palette-accent-background);
29
+ background-color: var(--salt-sentiment-accent-background);
30
30
  width: 100%;
31
31
  height: 2px;
32
32
  }
33
33
 
34
34
  .vuuDraggable-dropIndicator:before {
35
35
  content: "";
36
- background-color: var(--salt-palette-accent-background);
36
+ background-color: var(--salt-sentiment-accent-background);
37
37
  border-radius: 3px;
38
38
  width: 6px;
39
39
  height: 6px;
@@ -31,7 +31,7 @@ const css = `
31
31
  }
32
32
 
33
33
  .vuuExpandoInput-error {
34
- border-color: var(--vuu-color-red-50);
34
+ border-color: var(--salt-color-red-500);
35
35
  }
36
36
 
37
37
  .vuuExpandoInput .saltInput {
@@ -37,7 +37,7 @@ const css = `
37
37
  .vuuTableGroupCell:hover {
38
38
  & .vuuToggleIconButton {
39
39
  & .vuuIcon:after {
40
- --vuu-icon-color: var(--salt-palette-interact-cta-background-hover);
40
+ --vuu-icon-color: var(--salt-sentiment-accent-background);
41
41
  }
42
42
  }
43
43
  }
package/src/index.js CHANGED
@@ -14,6 +14,7 @@ export * from "./measured-container/index.js";
14
14
  export * from "./overflow-container/index.js";
15
15
  export * from "./price-ticker/index.js";
16
16
  export * from "./split-button/index.js";
17
+ export * from "./split-pane/index.js";
17
18
  export * from "./table-search/index.js";
18
19
  export * from "./tabs-next/index.js";
19
20
  export * from "./tabstrip/index.js";
@@ -35,7 +35,7 @@ const css = `
35
35
  }
36
36
 
37
37
  & .vuuHighlight {
38
- color: var(--vuu-color-blue-40);
38
+ color: var(--salt-color-blue-400);
39
39
  text-decoration: underline;
40
40
  }
41
41
 
@@ -15,15 +15,15 @@ const css = `
15
15
  }
16
16
 
17
17
  .vuuPriceTicker.up1, .vuuPriceTicker.up2 {
18
- --vuu-icon-color: var(--vuu-color-green-50);
19
- color: var(--vuu-color-green-50);
18
+ --vuu-icon-color: var(--salt-color-green-500);
19
+ color: var(--salt-color-green-500);
20
20
  animation-duration: 30s;
21
21
  }
22
22
 
23
23
  .vuuPriceTicker.down1, .vuuPriceTicker.down2 {
24
24
  --vuu-icon-transform: rotate(180deg);
25
- --vuu-icon-color: var(--vuu-color-red-50);
26
- color: var(--vuu-color-red-50);
25
+ --vuu-icon-color: var(--salt-color-red-500);
26
+ color: var(--salt-color-red-500);
27
27
  animation-duration: 30s;
28
28
  }
29
29
 
@@ -0,0 +1,82 @@
1
+ const css = `
2
+ .vuuSplitPane {
3
+ --vuuSplitPane-align: stretch;
4
+ --vuuSplitPane-direction: row;
5
+ --vuuSplitPane-gap: 0;
6
+ --vuuSplitPane-justify: flex-start;
7
+ --vuuSplitPane-margin: 0;
8
+ --vuuSplitPane-padding: 0;
9
+ --vuuSplitPane-splitterSize: 3px;
10
+ --vuuSplitPane-splitter-background: var(--salt-separable-secondary-borderColor);
11
+ --vuuSplitPane-splitter-background-active: var(--salt-separable-primary-borderColor);
12
+ --vuuSplitPane-splitter-grabZone: 4px;
13
+ align-items: var(--vuuSplitPane-align);
14
+ box-sizing: border-box;
15
+ flex-direction: var(--vuuSplitPane-direction);
16
+ gap: var(--vuuSplitPane-gap);
17
+ justify-content: var(--vuuSplitPane-justify);
18
+ margin: var(--vuuSplitPane-margin);
19
+ min-width: 0;
20
+ min-height: 0;
21
+ padding: var(--vuuSplitPane-padding);
22
+ flex-wrap: nowrap;
23
+ display: flex;
24
+ overflow: hidden;
25
+ }
26
+
27
+ :where(.vuuSplitPane) > :where(:not(.vuuSplitPane-splitter)) {
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ :where(.vuuSplitPane-row) > :where(:not(.vuuSplitPane-splitter)) {
32
+ min-width: 0;
33
+ }
34
+
35
+ :where(.vuuSplitPane-column) > :where(:not(.vuuSplitPane-splitter)) {
36
+ min-height: 0;
37
+ }
38
+
39
+ .vuuSplitPane-splitter {
40
+ background-color: var(--vuuSplitPane-splitter-background);
41
+ flex: 0 0 var(--vuuSplitPane-splitterSize);
42
+ touch-action: none;
43
+ z-index: 1;
44
+ outline: none;
45
+ position: relative;
46
+ }
47
+
48
+ .vuuSplitPane-splitter:before {
49
+ content: "";
50
+ position: absolute;
51
+ inset: 0;
52
+ }
53
+
54
+ .vuuSplitPane-row > .vuuSplitPane-splitter {
55
+ cursor: ew-resize;
56
+ }
57
+
58
+ .vuuSplitPane-row > .vuuSplitPane-splitter:before {
59
+ left: calc(-1 * var(--vuuSplitPane-splitter-grabZone));
60
+ right: calc(-1 * var(--vuuSplitPane-splitter-grabZone));
61
+ }
62
+
63
+ .vuuSplitPane-column > .vuuSplitPane-splitter {
64
+ cursor: ns-resize;
65
+ }
66
+
67
+ .vuuSplitPane-column > .vuuSplitPane-splitter:before {
68
+ bottom: calc(-1 * var(--vuuSplitPane-splitter-grabZone));
69
+ top: calc(-1 * var(--vuuSplitPane-splitter-grabZone));
70
+ }
71
+
72
+ .vuuSplitPane-splitter:hover, .vuuSplitPane-splitter-active {
73
+ --vuuSplitPane-splitter-background: var(--vuuSplitPane-splitter-background-active);
74
+ }
75
+
76
+ .vuuSplitPane-splitter:focus-visible {
77
+ outline: var(--salt-focused-outline);
78
+ }
79
+
80
+
81
+ `;
82
+ export default css;
@@ -0,0 +1,60 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { resolveResponsiveValue, useBreakpoint, useForkRef } 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 { Children, forwardRef } from "react";
7
+ import { Splitter } from "./Splitter.js";
8
+ import { useSplitPane } from "./useSplitPane.js";
9
+ import SplitPane_0 from "./SplitPane.css";
10
+ const classBase = "vuuSplitPane";
11
+ const parseSpacing = (value)=>"number" == typeof value ? `calc(var(--salt-spacing-100) * ${value})` : value;
12
+ const parseAlignment = (value)=>"start" === value || "end" === value ? `flex-${value}` : value;
13
+ const SplitPane_SplitPane = /*#__PURE__*/ forwardRef(function({ align, children, className, direction = "row", gap = 0, justify, margin = 0, onSplitterMoved, padding = 0, splitterSize, style, ...htmlAttributes }, forwardedRef) {
14
+ const targetWindow = useWindow();
15
+ useComponentCssInjection({
16
+ testId: "vuu-split-pane",
17
+ css: SplitPane_0,
18
+ window: targetWindow
19
+ });
20
+ const { matchedBreakpoints } = useBreakpoint();
21
+ const flexDirection = resolveResponsiveValue(direction, matchedBreakpoints) ?? "row";
22
+ const flexGap = resolveResponsiveValue(gap, matchedBreakpoints);
23
+ const flexMargin = resolveResponsiveValue(margin, matchedBreakpoints);
24
+ const flexPadding = resolveResponsiveValue(padding, matchedBreakpoints);
25
+ const panes = Children.toArray(children);
26
+ if (panes.length > 2) throw Error(`[SplitPane] supports a maximum of two children, ${panes.length} were provided`);
27
+ const { beginResize, endResize, resize, rootRef, splitterPosition } = useSplitPane({
28
+ direction: flexDirection,
29
+ onSplitterMoved,
30
+ paneCount: panes.length
31
+ });
32
+ const splitPaneStyle = {
33
+ ...style,
34
+ "--vuuSplitPane-align": parseAlignment(align),
35
+ "--vuuSplitPane-direction": flexDirection,
36
+ "--vuuSplitPane-gap": parseSpacing(flexGap),
37
+ "--vuuSplitPane-justify": parseAlignment(justify),
38
+ "--vuuSplitPane-margin": parseSpacing(flexMargin),
39
+ "--vuuSplitPane-padding": parseSpacing(flexPadding),
40
+ "--vuuSplitPane-splitterSize": void 0 === splitterSize ? void 0 : `${splitterSize}px`
41
+ };
42
+ return /*#__PURE__*/ jsxs("div", {
43
+ ...htmlAttributes,
44
+ className: clsx(classBase, `${classBase}-${flexDirection}`, className),
45
+ ref: useForkRef(rootRef, forwardedRef),
46
+ style: splitPaneStyle,
47
+ children: [
48
+ panes[0],
49
+ 2 === panes.length ? /*#__PURE__*/ jsx(Splitter, {
50
+ direction: flexDirection,
51
+ onResize: resize,
52
+ onResizeEnd: endResize,
53
+ onResizeStart: beginResize,
54
+ position: splitterPosition
55
+ }) : null,
56
+ panes[1]
57
+ ]
58
+ });
59
+ });
60
+ export { SplitPane_SplitPane as SplitPane };
@@ -0,0 +1,82 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import clsx from "clsx";
3
+ import { useCallback, useRef, useState } from "react";
4
+ const classBase = "vuuSplitPane-splitter";
5
+ const KEYBOARD_STEP = 1;
6
+ const KEYBOARD_STEP_LARGE = 10;
7
+ const Splitter = ({ className, direction, onResize, onResizeEnd, onResizeStart, position, ...htmlAttributes })=>{
8
+ const startPosRef = useRef(void 0);
9
+ const [active, setActive] = useState(false);
10
+ const isColumn = "column" === direction;
11
+ const getPointerPos = useCallback((e)=>isColumn ? e.clientY : e.clientX, [
12
+ isColumn
13
+ ]);
14
+ const handlePointerDown = useCallback((e)=>{
15
+ if (0 === e.button && onResizeStart()) {
16
+ e.preventDefault();
17
+ e.currentTarget.focus();
18
+ e.currentTarget.setPointerCapture(e.pointerId);
19
+ startPosRef.current = getPointerPos(e);
20
+ setActive(true);
21
+ }
22
+ }, [
23
+ getPointerPos,
24
+ onResizeStart
25
+ ]);
26
+ const handlePointerMove = useCallback((e)=>{
27
+ if (void 0 !== startPosRef.current) onResize(getPointerPos(e) - startPosRef.current);
28
+ }, [
29
+ getPointerPos,
30
+ onResize
31
+ ]);
32
+ const handlePointerEnd = useCallback(()=>{
33
+ if (void 0 !== startPosRef.current) {
34
+ startPosRef.current = void 0;
35
+ setActive(false);
36
+ onResizeEnd();
37
+ }
38
+ }, [
39
+ onResizeEnd
40
+ ]);
41
+ const handleKeyDown = useCallback((e)=>{
42
+ const step = e.shiftKey ? KEYBOARD_STEP_LARGE : KEYBOARD_STEP;
43
+ const [decrementKey, incrementKey] = isColumn ? [
44
+ "ArrowUp",
45
+ "ArrowDown"
46
+ ] : [
47
+ "ArrowLeft",
48
+ "ArrowRight"
49
+ ];
50
+ const distance = e.key === decrementKey ? -step : e.key === incrementKey ? step : "Home" === e.key ? -1 / 0 : "End" === e.key ? 1 / 0 : void 0;
51
+ if (void 0 !== distance && onResizeStart()) {
52
+ e.preventDefault();
53
+ onResize(distance);
54
+ onResizeEnd();
55
+ }
56
+ }, [
57
+ isColumn,
58
+ onResize,
59
+ onResizeEnd,
60
+ onResizeStart
61
+ ]);
62
+ return /*#__PURE__*/ jsx("div", {
63
+ "aria-label": "Resize",
64
+ ...htmlAttributes,
65
+ "aria-orientation": isColumn ? "horizontal" : "vertical",
66
+ "aria-valuemax": 100,
67
+ "aria-valuemin": 0,
68
+ "aria-valuenow": position,
69
+ className: clsx(classBase, className, {
70
+ [`${classBase}-active`]: active
71
+ }),
72
+ onKeyDown: handleKeyDown,
73
+ onLostPointerCapture: handlePointerEnd,
74
+ onPointerCancel: handlePointerEnd,
75
+ onPointerDown: handlePointerDown,
76
+ onPointerMove: handlePointerMove,
77
+ onPointerUp: handlePointerEnd,
78
+ role: "separator",
79
+ tabIndex: 0
80
+ });
81
+ };
82
+ export { Splitter };
@@ -0,0 +1 @@
1
+ export * from "./SplitPane.js";
@@ -0,0 +1,101 @@
1
+ import { useCallback, useLayoutEffect, useRef, useState } from "react";
2
+ const parsePx = (value, defaultValue)=>value.endsWith("px") ? parseFloat(value) : defaultValue;
3
+ const measurePane = (el, dimension)=>{
4
+ const { [dimension]: size } = el.getBoundingClientRect();
5
+ const style = getComputedStyle(el);
6
+ return {
7
+ size,
8
+ minSize: parsePx(style.getPropertyValue(`min-${dimension}`), 0),
9
+ maxSize: parsePx(style.getPropertyValue(`max-${dimension}`), 1 / 0)
10
+ };
11
+ };
12
+ const getPanes = (root)=>{
13
+ const pane1 = root?.children[0];
14
+ const pane2 = root?.children[2];
15
+ if (pane1 && pane2) return [
16
+ pane1,
17
+ pane2
18
+ ];
19
+ };
20
+ const toPercentage = ([size1, size2])=>{
21
+ const total = size1 + size2;
22
+ return 0 === total ? 0 : Math.round(size1 / total * 100);
23
+ };
24
+ const useSplitPane = ({ direction, onSplitterMoved, paneCount })=>{
25
+ const rootRef = useRef(null);
26
+ const resizeStateRef = useRef(void 0);
27
+ const [splitterPosition, setSplitterPosition] = useState(void 0);
28
+ const dimension = "column" === direction ? "height" : "width";
29
+ const hasSplitter = 2 === paneCount;
30
+ useLayoutEffect(()=>{
31
+ const panes = hasSplitter ? getPanes(rootRef.current) : void 0;
32
+ if (panes) {
33
+ const [pane1, pane2] = panes;
34
+ setSplitterPosition(toPercentage([
35
+ pane1.getBoundingClientRect()[dimension],
36
+ pane2.getBoundingClientRect()[dimension]
37
+ ]));
38
+ }
39
+ }, [
40
+ dimension,
41
+ hasSplitter
42
+ ]);
43
+ const beginResize = useCallback(()=>{
44
+ const panes = getPanes(rootRef.current);
45
+ if (panes) {
46
+ const [pane1, pane2] = panes;
47
+ const measurements = [
48
+ measurePane(pane1, dimension),
49
+ measurePane(pane2, dimension)
50
+ ];
51
+ resizeStateRef.current = {
52
+ panes,
53
+ measurements,
54
+ sizes: [
55
+ measurements[0].size,
56
+ measurements[1].size
57
+ ]
58
+ };
59
+ return true;
60
+ }
61
+ return false;
62
+ }, [
63
+ dimension
64
+ ]);
65
+ const resize = useCallback((distance)=>{
66
+ const resizeState = resizeStateRef.current;
67
+ if (resizeState) {
68
+ const { panes: [pane1, pane2], measurements: [m1, m2] } = resizeState;
69
+ const total = m1.size + m2.size;
70
+ const lowerBound = Math.max(m1.minSize, total - m2.maxSize);
71
+ const upperBound = Math.min(m1.maxSize, total - m2.minSize);
72
+ const size1 = Math.max(lowerBound, Math.min(upperBound, m1.size + distance));
73
+ const size2 = total - size1;
74
+ pane1.style.flexBasis = `${size1}px`;
75
+ pane2.style.flexBasis = `${size2}px`;
76
+ resizeState.sizes = [
77
+ size1,
78
+ size2
79
+ ];
80
+ }
81
+ }, []);
82
+ const endResize = useCallback(()=>{
83
+ const resizeState = resizeStateRef.current;
84
+ if (resizeState) {
85
+ resizeStateRef.current = void 0;
86
+ const { measurements, sizes } = resizeState;
87
+ setSplitterPosition(toPercentage(sizes));
88
+ if (sizes[0] !== measurements[0].size || sizes[1] !== measurements[1].size) onSplitterMoved?.(sizes);
89
+ }
90
+ }, [
91
+ onSplitterMoved
92
+ ]);
93
+ return {
94
+ beginResize,
95
+ endResize,
96
+ resize,
97
+ rootRef,
98
+ splitterPosition
99
+ };
100
+ };
101
+ export { useSplitPane };
@@ -101,7 +101,7 @@ const css = `
101
101
  }
102
102
 
103
103
  .vuuTab.vuuFocusVisible {
104
- background: var(--vuuTab-hover-background, var(--salt-navigable-primary-background-hover));
104
+ background: var(--vuuTab-hover-background, var(--salt-navigable-background-hover));
105
105
  outline-color: var(--vuuTab-focusVisible-color, var(--salt-focused-outlineColor));
106
106
  outline-offset: -1px;
107
107
  outline-width: 1px;
@@ -121,7 +121,7 @@ const css = `
121
121
 
122
122
  .vuuTabstrip-draggingTab .vuuTab-selected:before {
123
123
  --tab-before-content: "";
124
- --tab-before-background: var(--salt-navigable-indicator-color-active);
124
+ --tab-before-background: var(--salt-navigable-accent-indicator-active);
125
125
  --tab-before-height: var(--tab-thumb-height);
126
126
  --tab-before-inset: var(--tab-activationIndicator-inset);
127
127
  --tab-before-width: var(--tab-activationIndicator-thumb-width);
@@ -140,7 +140,7 @@ const css = `
140
140
  }
141
141
 
142
142
  .vuuTab:hover:not(.vuuTab-closeHover, .vuuTab-selected) {
143
- background: var(--vuuTab-hover-background, var(--salt-navigable-primary-background-hover));
143
+ background: var(--vuuTab-hover-background, var(--salt-navigable-background-hover));
144
144
  }
145
145
 
146
146
 
@@ -52,7 +52,7 @@ const css = `
52
52
 
53
53
  .vuuTabstrip-overflowMenu-open {
54
54
  --saltButton-background: var(--salt-actionable-subtle-background-active);
55
- --saltButton-text-color: var(--salt-actionable-subtle-text-color-active);
55
+ --saltButton-text-color: var(--salt-actionable-subtle-foreground-active);
56
56
  }
57
57
 
58
58
  .vuuTabstrip-overflowMenu-open .saltButton {
@@ -82,7 +82,7 @@ const css = `
82
82
  --tabstrip-display: flex;
83
83
  --tabstrip-height: 100%;
84
84
  --tabstrip-dragging-display: block;
85
- --tabs-tab-background: var(--salt-navigable-primary-background-hover);
85
+ --tabs-tab-background: var(--salt-navigable-background-hover);
86
86
  --tabs-tab-before-content: "";
87
87
  --tabs-tab-before-background: var(--salt-navigable-indicator-hover);
88
88
  --tabs-tab-before-height: var(--tab-activationIndicator-thumb-height);
@@ -35,7 +35,7 @@ const css = `
35
35
  }
36
36
 
37
37
  .vuuToolbarItem:focus, .vuuToolbarItem:focus-visible {
38
- outline-color: var(--vuuToolbarItem-outlineColor, var(--vuu-color-purple-10));
38
+ outline-color: var(--vuuToolbarItem-outlineColor, var(--vuu-color-purple));
39
39
  outline-offset: 0px;
40
40
  outline-width: 1px;
41
41
  outline-style: dashed;
@@ -9,6 +9,6 @@ export declare const ContextPanelContext: import("react").Context<ContextPanelPr
9
9
  export declare const ContextPanelProvider: ({ children, hideContextPanel: hideContextPanelProp, resolveComponent, showContextPanel: showContextPanelProp, }: Partial<ContextPanelProps> & {
10
10
  children: ReactNode;
11
11
  resolveComponent?: ResolveContextPanelComponent;
12
- }) => import("react").JSX.Element;
12
+ }) => import("react/jsx-runtime").JSX.Element;
13
13
  export declare function useContextPanel(): ShowContextPanel;
14
14
  export declare function useHideContextPanel(): (() => void) | undefined;
@@ -27,7 +27,7 @@ export type MeasuredTarget = {
27
27
  right: number;
28
28
  top: number;
29
29
  };
30
- export declare const DragDropProvider: ({ children, dragSources: dragSourcesProp, }: DragDropProviderProps) => import("react").JSX.Element;
30
+ export declare const DragDropProvider: ({ children, dragSources: dragSourcesProp, }: DragDropProviderProps) => import("react/jsx-runtime").JSX.Element;
31
31
  export interface DragDropProviderResult {
32
32
  isDragSource?: boolean;
33
33
  isDropTarget?: boolean;
@@ -5,4 +5,4 @@ export interface HoverOverlayProps extends Pick<OverlayProps, "placement" | "onO
5
5
  open?: boolean;
6
6
  trigger: ReactNode;
7
7
  }
8
- export declare const HoverOverlay: ({ children, open: openProp, onOpenChange, placement, trigger, }: HoverOverlayProps) => import("react").JSX.Element;
8
+ export declare const HoverOverlay: ({ children, open: openProp, onOpenChange, placement, trigger, }: HoverOverlayProps) => import("react/jsx-runtime").JSX.Element;
@@ -3,4 +3,4 @@ export interface IconProps extends HTMLAttributes<HTMLSpanElement> {
3
3
  name: string;
4
4
  size?: number;
5
5
  }
6
- export declare const Icon: ({ className, name, size, style: styleProp, ...htmlAttributes }: IconProps) => import("react").JSX.Element;
6
+ export declare const Icon: ({ className, name, size, style: styleProp, ...htmlAttributes }: IconProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,4 +2,4 @@ import { IconButtonProps } from "./IconButton";
2
2
  export interface ToggleIconButtonProps extends Omit<IconButtonProps, "icon"> {
3
3
  isExpanded: boolean;
4
4
  }
5
- export declare const ToggleIconButton: ({ className, isExpanded, size, ...props }: ToggleIconButtonProps) => import("react").JSX.Element;
5
+ export declare const ToggleIconButton: ({ className, isExpanded, size, ...props }: ToggleIconButtonProps) => import("react/jsx-runtime").JSX.Element;
package/types/index.d.ts CHANGED
@@ -20,6 +20,7 @@ export * from "./price-ticker";
20
20
  export { Prompt, type PromptProps } from "./prompt/Prompt";
21
21
  export { SortableList, SortableOption } from "./sortable-list/SortableList";
22
22
  export * from "./split-button";
23
+ export * from "./split-pane";
23
24
  export * from "./table-search";
24
25
  export * from "./tabs-next";
25
26
  export * from "./tabstrip";
@@ -1,2 +1,2 @@
1
1
  import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
- export declare const SearchCell: ({ column, dataRow }: TableCellRendererProps) => import("react").JSX.Element;
2
+ export declare const SearchCell: ({ column, dataRow }: TableCellRendererProps) => import("react/jsx-runtime").JSX.Element;
@@ -8,4 +8,4 @@ export interface TablePickerProps extends Omit<HTMLAttributes<HTMLElement>, "onS
8
8
  schema: TableSchema;
9
9
  searchColumns?: string[];
10
10
  }
11
- export declare const TablePicker: ({ TableProps, onSelect, rowToString, schema, searchColumns, ...htmlAttributes }: TablePickerProps) => import("react").JSX.Element;
11
+ export declare const TablePicker: ({ TableProps, onSelect, rowToString, schema, searchColumns, ...htmlAttributes }: TablePickerProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- import { type ChangeEventHandler, type MouseEventHandler } from "react";
1
+ import { type FormEventHandler, type MouseEventHandler } from "react";
2
2
  export type SelectedItemsChangeHandler = (newSelectedItems: readonly ItemDescriptor[]) => void;
3
3
  /** This is a public description of an Item that can be displayed in the ItemPicker component, defining all the
4
4
  * mandatory and option attributes that can be defined by the client. */
@@ -25,7 +25,7 @@ export declare const useItemPicker: ({ allItems, selectedItems, maxSelections, o
25
25
  selectedItemsFiltered: readonly ItemDescriptor[];
26
26
  availableItemsFiltered: ItemDescriptor[];
27
27
  searchText: string;
28
- onChangeSearchInput: ChangeEventHandler;
28
+ onChangeSearchInput: FormEventHandler;
29
29
  onAddItemToSelectedList: MouseEventHandler<HTMLButtonElement>;
30
30
  onRemoveItemFromSelectedList: MouseEventHandler<HTMLButtonElement>;
31
31
  onReorderSelectedItems: (orderedItemNames: string[]) => void;
@@ -4,4 +4,4 @@ export interface PriceTickerProps extends HTMLAttributes<HTMLDivElement> {
4
4
  price?: number;
5
5
  showArrow?: boolean;
6
6
  }
7
- export declare const PriceTicker: import("react").MemoExoticComponent<({ className, decimals, price, showArrow, ...htmlAttributes }: PriceTickerProps) => import("react").JSX.Element>;
7
+ export declare const PriceTicker: import("react").MemoExoticComponent<({ className, decimals, price, showArrow, ...htmlAttributes }: PriceTickerProps) => import("react/jsx-runtime").JSX.Element>;
@@ -50,4 +50,4 @@ export interface PromptProps extends Pick<DialogProps, "disableDismiss" | "onOpe
50
50
  showConfirmButton?: boolean;
51
51
  title: string;
52
52
  }
53
- export declare const Prompt: ({ children, className, cancelButtonLabel, cancelButtonProps, confirmButtonLabel, confirmButtonProps, customAction, disableDismiss, disableAccent, headerTag, icon, initialFocusedItem, onCancel, onClose, onConfirm, onOpenChange, open, showCancelButton, showCloseButton, showConfirmButton, status, title, ...htmlAttributes }: PromptProps) => import("react").JSX.Element;
53
+ export declare const Prompt: ({ children, className, cancelButtonLabel, cancelButtonProps, confirmButtonLabel, confirmButtonProps, customAction, disableDismiss, disableAccent, headerTag, icon, initialFocusedItem, onCancel, onClose, onConfirm, onOpenChange, open, showCancelButton, showCloseButton, showConfirmButton, status, title, ...htmlAttributes }: PromptProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,7 +2,7 @@ import { ListBoxProps, OptionProps } from "@salt-ds/core";
2
2
  export declare const SortableOption: ({ id, index, value, ...optionProps }: OptionProps & {
3
3
  id: string;
4
4
  index: number;
5
- }) => import("react").JSX.Element;
5
+ }) => import("react/jsx-runtime").JSX.Element;
6
6
  export declare const SortableList: ({ children, onReorderListItems, ...listBoxProps }: ListBoxProps & {
7
7
  onReorderListItems?: (listItems: unknown[]) => void;
8
- }) => import("react").JSX.Element;
8
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -27,18 +27,18 @@ export declare const useSplitButton: ({ ButtonProps: ButtonPropsProp, PopupMenuP
27
27
  onFocusCapture?: FocusEventHandler<HTMLButtonElement> | undefined;
28
28
  onBlur?: FocusEventHandler<HTMLButtonElement> | undefined;
29
29
  onBlurCapture?: FocusEventHandler<HTMLButtonElement> | undefined;
30
- onChange?: import("react").ChangeEventHandler<HTMLButtonElement, Element> | undefined;
31
- onChangeCapture?: import("react").ChangeEventHandler<HTMLButtonElement, Element> | undefined;
30
+ onChange?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
31
+ onChangeCapture?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
32
32
  onBeforeInput?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
33
- onBeforeInputCapture?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
34
- onInput?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
35
- onInputCapture?: import("react").InputEventHandler<HTMLButtonElement> | undefined;
36
- onReset?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
37
- onResetCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
38
- onSubmit?: import("react").SubmitEventHandler<HTMLButtonElement> | undefined;
39
- onSubmitCapture?: import("react").SubmitEventHandler<HTMLButtonElement> | undefined;
40
- onInvalid?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
41
- onInvalidCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
33
+ onBeforeInputCapture?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
34
+ onInput?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
35
+ onInputCapture?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
36
+ onReset?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
37
+ onResetCapture?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
38
+ onSubmit?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
39
+ onSubmitCapture?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
40
+ onInvalid?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
41
+ onInvalidCapture?: import("react").FormEventHandler<HTMLButtonElement> | undefined;
42
42
  onLoad?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
43
43
  onLoadCapture?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
44
44
  onError?: import("react").ReactEventHandler<HTMLButtonElement> | undefined;
@@ -277,7 +277,7 @@ export declare const useSplitButton: ({ ButtonProps: ButtonPropsProp, PopupMenuP
277
277
  results?: number | undefined;
278
278
  security?: string | undefined;
279
279
  unselectable?: "on" | "off" | undefined;
280
- popover?: "" | "auto" | "manual" | "hint" | undefined;
280
+ popover?: "" | "auto" | "manual" | undefined;
281
281
  popoverTargetAction?: "toggle" | "show" | "hide" | undefined;
282
282
  popoverTarget?: string | undefined;
283
283
  inert?: boolean | undefined;
@@ -0,0 +1,44 @@
1
+ import { type FlexAlignment, type FlexContentAlignment, type ResponsiveProp } from "@salt-ds/core";
2
+ import { type HTMLAttributes, type ReactElement, type ReactNode } from "react";
3
+ import { type SplitPaneDirection, type SplitterMovedHandler } from "./useSplitPane";
4
+ export interface SplitPaneProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
5
+ /**
6
+ * Defines the default behavior for how flex items are laid out along the cross axis, default is "stretch".
7
+ */
8
+ align?: FlexAlignment | "stretch" | "baseline";
9
+ /**
10
+ * Exactly two children, typically Salt `FlexItem` components. A Splitter
11
+ * will be rendered between them. A single child is also accepted (e.g. when
12
+ * one pane is conditionally rendered), in which case no Splitter is rendered.
13
+ */
14
+ children: ReactElement | [ReactNode, ReactNode];
15
+ /**
16
+ * Establishes the main-axis, defining the direction children are placed. Default is "row".
17
+ */
18
+ direction?: ResponsiveProp<SplitPaneDirection>;
19
+ /**
20
+ * Controls the space between each item and the Splitter, default is 0.
21
+ */
22
+ gap?: ResponsiveProp<number | string>;
23
+ /**
24
+ * Defines the alignment along the main axis, default is "start".
25
+ */
26
+ justify?: FlexContentAlignment;
27
+ /**
28
+ * Defines the margin around the component. It can be specified as a number (which acts as a multiplier) or a string representing the margin value. Default is `0`.
29
+ */
30
+ margin?: ResponsiveProp<number | string>;
31
+ /**
32
+ * Invoked when user has finished moving the Splitter, receives the new sizes (px) of both panes.
33
+ */
34
+ onSplitterMoved?: SplitterMovedHandler;
35
+ /**
36
+ * Defines the padding within the component. It can be specified as a number (which acts as a multiplier) or a string representing the padding value. Default is `0`.
37
+ */
38
+ padding?: ResponsiveProp<number | string>;
39
+ /**
40
+ * Size (thickness) of the Splitter, in px. Default is 3.
41
+ */
42
+ splitterSize?: number;
43
+ }
44
+ export declare const SplitPane: import("react").ForwardRefExoticComponent<SplitPaneProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,10 @@
1
+ import { type HTMLAttributes } from "react";
2
+ import type { SplitPaneDirection } from "./useSplitPane";
3
+ export interface SplitterProps extends Omit<HTMLAttributes<HTMLDivElement>, "onResize"> {
4
+ direction: SplitPaneDirection;
5
+ onResizeStart: () => boolean;
6
+ onResize: (distance: number) => void;
7
+ onResizeEnd: () => void;
8
+ position?: number;
9
+ }
10
+ export declare const Splitter: ({ className, direction, onResize, onResizeEnd, onResizeStart, position, ...htmlAttributes }: SplitterProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export * from "./SplitPane";
2
+ export type { SplitPaneDirection, SplitPaneSizes, SplitterMovedHandler, } from "./useSplitPane";
@@ -0,0 +1,18 @@
1
+ export type SplitPaneDirection = "row" | "column";
2
+ /**
3
+ * Sizes (in px) of the two panes, measured along the main axis.
4
+ */
5
+ export type SplitPaneSizes = [number, number];
6
+ export type SplitterMovedHandler = (sizes: SplitPaneSizes) => void;
7
+ export interface SplitPaneHookProps {
8
+ direction: SplitPaneDirection;
9
+ onSplitterMoved?: SplitterMovedHandler;
10
+ paneCount: number;
11
+ }
12
+ export declare const useSplitPane: ({ direction, onSplitterMoved, paneCount, }: SplitPaneHookProps) => {
13
+ beginResize: () => boolean;
14
+ endResize: () => void;
15
+ resize: (distance: number) => void;
16
+ rootRef: import("react").RefObject<HTMLDivElement | null>;
17
+ splitterPosition: number | undefined;
18
+ };
@@ -1,2 +1,2 @@
1
1
  import { TableCellRendererProps } from "@vuu-ui/vuu-table-types";
2
- export declare const SearchCell: ({ column, dataRow, searchPattern, }: TableCellRendererProps) => import("react").JSX.Element;
2
+ export declare const SearchCell: ({ column, dataRow, searchPattern, }: TableCellRendererProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,4 +6,4 @@ export interface TableSearchProps extends HTMLAttributes<HTMLDivElement> {
6
6
  placeHolder?: string;
7
7
  searchColumns: string[];
8
8
  }
9
- export declare const TableSearch: ({ TableProps: { dataSource: dataSourceProp, ...TableProps }, autoFocus, className, placeHolder, searchColumns, ...htmlAttributes }: TableSearchProps) => import("react").JSX.Element;
9
+ export declare const TableSearch: ({ TableProps: { dataSource: dataSourceProp, ...TableProps }, autoFocus, className, placeHolder, searchColumns, ...htmlAttributes }: TableSearchProps) => import("react/jsx-runtime").JSX.Element;
@@ -20,4 +20,4 @@ export interface TabMenuProps {
20
20
  */
21
21
  controlledComponentTitle?: string;
22
22
  }
23
- export declare const TabMenu: ({ allowClose, allowRename, controlledComponentId, controlledComponentTitle, location, onMenuAction, onMenuClose, index, }: TabMenuProps) => import("react").JSX.Element;
23
+ export declare const TabMenu: ({ allowClose, allowRename, controlledComponentId, controlledComponentTitle, location, onMenuAction, onMenuClose, index, }: TabMenuProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,3 +1,2 @@
1
- import React from "react";
2
1
  import type { TabstripProps } from "./TabsTypes";
3
- export declare const Tabstrip: ({ activeTabIndex: activeTabIndexProp, allowAddTab, allowCloseTab, allowDragDrop, allowRenameTab, animateSelectionThumb, children, className: classNameProp, id: idProp, keyBoardActivation, location, onActiveChange, onAddTab, onCloseTab, onExitEditMode, onMoveTab, orientation, showTabMenuButton, style: styleProp, tabClassName, variant, ...htmlAttributes }: TabstripProps) => React.JSX.Element;
2
+ export declare const Tabstrip: ({ activeTabIndex: activeTabIndexProp, allowAddTab, allowCloseTab, allowDragDrop, allowRenameTab, animateSelectionThumb, children, className: classNameProp, id: idProp, keyBoardActivation, location, onActiveChange, onAddTab, onCloseTab, onExitEditMode, onMoveTab, orientation, showTabMenuButton, style: styleProp, tabClassName, variant, ...htmlAttributes }: TabstripProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { OverflowContainerProps } from "../overflow-container";
3
2
  import { SelectionStrategy, SpecialKeyMultipleSelection } from "../common-hooks";
4
3
  export type ActiveItemChangeHandler = (itemIndex: number[]) => void;
@@ -17,4 +16,4 @@ export interface ToolbarProps extends OverflowContainerProps {
17
16
  selectionStrategy?: SelectionStrategy | SpecialKeyMultipleSelection;
18
17
  showSeparators?: boolean;
19
18
  }
20
- export declare const Toolbar: ({ activeItemIndex: activeItemIndexProp, alignItems, defaultActiveItemIndex, children, className, id: idProp, onActiveChange, onNavigateOutOfBounds, orientation, selectionStrategy, showSeparators, ...props }: ToolbarProps) => React.JSX.Element;
19
+ export declare const Toolbar: ({ activeItemIndex: activeItemIndexProp, alignItems, defaultActiveItemIndex, children, className, id: idProp, onActiveChange, onNavigateOutOfBounds, orientation, selectionStrategy, showSeparators, ...props }: ToolbarProps) => import("react/jsx-runtime").JSX.Element;
@@ -20,4 +20,4 @@ export interface VuuDatePickerProps extends Omit<DatePickerProps<SingleSelection
20
20
  */
21
21
  value?: EpochTimestamp | number;
22
22
  }
23
- export declare const VuuDatePicker: ({ className, onSelectionChange, onCommit, preserveFocusOnSelect, selectedDate: selectedDateProp, timeZone, value, ...props }: VuuDatePickerProps) => import("react").JSX.Element;
23
+ export declare const VuuDatePicker: ({ className, onSelectionChange, onCommit, preserveFocusOnSelect, selectedDate: selectedDateProp, timeZone, value, ...props }: VuuDatePickerProps) => import("react/jsx-runtime").JSX.Element;
@@ -5,5 +5,5 @@ type TimePickerInputProps = "defaultValue" | "milliseconds" | "onChange" | "onCo
5
5
  export type VuuTimePickerSecondsProps = Pick<TimeInputSecondsProps, TimePickerInputProps> & VuuTimePickerHtmlAttributes;
6
6
  export type VuuTimePickerMillisecondsProps = Pick<TimeInputMillisecondsProps, TimePickerInputProps> & VuuTimePickerHtmlAttributes;
7
7
  export type VuuTimePickerProps = VuuTimePickerSecondsProps | VuuTimePickerMillisecondsProps;
8
- export declare const VuuTimePicker: ({ className, defaultValue, milliseconds, onChange, onCommit, value, ...htmlAttributes }: VuuTimePickerProps) => import("react").JSX.Element;
8
+ export declare const VuuTimePicker: ({ className, defaultValue, milliseconds, onChange, onCommit, value, ...htmlAttributes }: VuuTimePickerProps) => import("react/jsx-runtime").JSX.Element;
9
9
  export {};
@@ -3,4 +3,4 @@ import { VuuTypeaheadInputHookProps } from "./useVuuTypeaheadInput";
3
3
  export interface VuuTypeaheadInputProps extends VuuTypeaheadInputHookProps, Pick<ComboBoxProps, "selectOnTab"> {
4
4
  className?: string;
5
5
  }
6
- export declare const VuuTypeaheadInput: ({ allowFreeInput, className, column, freeTextWarning, highlightFirstSuggestion, inputProps: inputPropsProp, minCharacterCountToTriggerSuggestions, onCommit, selectOnTab, table, }: VuuTypeaheadInputProps) => import("react").JSX.Element;
6
+ export declare const VuuTypeaheadInput: ({ allowFreeInput, className, column, freeTextWarning, highlightFirstSuggestion, inputProps: inputPropsProp, minCharacterCountToTriggerSuggestions, onCommit, selectOnTab, table, }: VuuTypeaheadInputProps) => import("react/jsx-runtime").JSX.Element;