@salt-ds/core 1.61.0 → 1.63.0
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 +41 -0
- package/css/salt-core.css +286 -1
- package/dist-cjs/index.js +24 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/side-panel/SidePanel.css.js +6 -0
- package/dist-cjs/side-panel/SidePanel.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanel.js +205 -0
- package/dist-cjs/side-panel/SidePanel.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelCloseButton.js +44 -0
- package/dist-cjs/side-panel/SidePanelCloseButton.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelContent.css.js +6 -0
- package/dist-cjs/side-panel/SidePanelContent.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelContent.js +70 -0
- package/dist-cjs/side-panel/SidePanelContent.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelHeader.css.js +6 -0
- package/dist-cjs/side-panel/SidePanelHeader.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelHeader.js +30 -0
- package/dist-cjs/side-panel/SidePanelHeader.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelProvider.js +83 -0
- package/dist-cjs/side-panel/SidePanelProvider.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelTitle.css.js +6 -0
- package/dist-cjs/side-panel/SidePanelTitle.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelTitle.js +60 -0
- package/dist-cjs/side-panel/SidePanelTitle.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelTrigger.js +43 -0
- package/dist-cjs/side-panel/SidePanelTrigger.js.map +1 -0
- package/dist-cjs/side-panel/internal/SidePanelContext.js +38 -0
- package/dist-cjs/side-panel/internal/SidePanelContext.js.map +1 -0
- package/dist-cjs/side-panel/internal/useIsScrollable.js +50 -0
- package/dist-cjs/side-panel/internal/useIsScrollable.js.map +1 -0
- package/dist-cjs/side-panel/internal/useSidePanelTabOrder.js +214 -0
- package/dist-cjs/side-panel/internal/useSidePanelTabOrder.js.map +1 -0
- package/dist-cjs/side-panel/useSidePanel.js +49 -0
- package/dist-cjs/side-panel/useSidePanel.js.map +1 -0
- package/dist-cjs/tree/Tree.css.js +6 -0
- package/dist-cjs/tree/Tree.css.js.map +1 -0
- package/dist-cjs/tree/Tree.js +308 -0
- package/dist-cjs/tree/Tree.js.map +1 -0
- package/dist-cjs/tree/TreeContext.js +37 -0
- package/dist-cjs/tree/TreeContext.js.map +1 -0
- package/dist-cjs/tree/TreeNode.css.js +6 -0
- package/dist-cjs/tree/TreeNode.css.js.map +1 -0
- package/dist-cjs/tree/TreeNode.js +109 -0
- package/dist-cjs/tree/TreeNode.js.map +1 -0
- 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 +67 -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 +30 -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 +161 -0
- package/dist-cjs/tree/TreeNodeTrigger.js.map +1 -0
- package/dist-cjs/tree/treeModel.js +61 -0
- package/dist-cjs/tree/treeModel.js.map +1 -0
- package/dist-cjs/tree/useTree.js +343 -0
- package/dist-cjs/tree/useTree.js.map +1 -0
- package/dist-es/index.js +12 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/side-panel/SidePanel.css.js +4 -0
- package/dist-es/side-panel/SidePanel.css.js.map +1 -0
- package/dist-es/side-panel/SidePanel.js +203 -0
- package/dist-es/side-panel/SidePanel.js.map +1 -0
- package/dist-es/side-panel/SidePanelCloseButton.js +42 -0
- package/dist-es/side-panel/SidePanelCloseButton.js.map +1 -0
- package/dist-es/side-panel/SidePanelContent.css.js +4 -0
- package/dist-es/side-panel/SidePanelContent.css.js.map +1 -0
- package/dist-es/side-panel/SidePanelContent.js +68 -0
- package/dist-es/side-panel/SidePanelContent.js.map +1 -0
- package/dist-es/side-panel/SidePanelHeader.css.js +4 -0
- package/dist-es/side-panel/SidePanelHeader.css.js.map +1 -0
- package/dist-es/side-panel/SidePanelHeader.js +28 -0
- package/dist-es/side-panel/SidePanelHeader.js.map +1 -0
- package/dist-es/side-panel/SidePanelProvider.js +81 -0
- package/dist-es/side-panel/SidePanelProvider.js.map +1 -0
- package/dist-es/side-panel/SidePanelTitle.css.js +4 -0
- package/dist-es/side-panel/SidePanelTitle.css.js.map +1 -0
- package/dist-es/side-panel/SidePanelTitle.js +58 -0
- package/dist-es/side-panel/SidePanelTitle.js.map +1 -0
- package/dist-es/side-panel/SidePanelTrigger.js +41 -0
- package/dist-es/side-panel/SidePanelTrigger.js.map +1 -0
- package/dist-es/side-panel/internal/SidePanelContext.js +35 -0
- package/dist-es/side-panel/internal/SidePanelContext.js.map +1 -0
- package/dist-es/side-panel/internal/useIsScrollable.js +48 -0
- package/dist-es/side-panel/internal/useIsScrollable.js.map +1 -0
- package/dist-es/side-panel/internal/useSidePanelTabOrder.js +212 -0
- package/dist-es/side-panel/internal/useSidePanelTabOrder.js.map +1 -0
- package/dist-es/side-panel/useSidePanel.js +47 -0
- package/dist-es/side-panel/useSidePanel.js.map +1 -0
- package/dist-es/tree/Tree.css.js +4 -0
- package/dist-es/tree/Tree.css.js.map +1 -0
- package/dist-es/tree/Tree.js +306 -0
- package/dist-es/tree/Tree.js.map +1 -0
- package/dist-es/tree/TreeContext.js +32 -0
- package/dist-es/tree/TreeContext.js.map +1 -0
- package/dist-es/tree/TreeNode.css.js +4 -0
- package/dist-es/tree/TreeNode.css.js.map +1 -0
- package/dist-es/tree/TreeNode.js +107 -0
- package/dist-es/tree/TreeNode.js.map +1 -0
- 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 +65 -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 +28 -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 +159 -0
- package/dist-es/tree/TreeNodeTrigger.js.map +1 -0
- package/dist-es/tree/treeModel.js +57 -0
- package/dist-es/tree/treeModel.js.map +1 -0
- package/dist-es/tree/useTree.js +341 -0
- package/dist-es/tree/useTree.js.map +1 -0
- package/dist-types/index.d.ts +2 -0
- package/dist-types/side-panel/SidePanel.d.ts +26 -0
- package/dist-types/side-panel/SidePanelCloseButton.d.ts +2 -0
- package/dist-types/side-panel/SidePanelContent.d.ts +5 -0
- package/dist-types/side-panel/SidePanelHeader.d.ts +5 -0
- package/dist-types/side-panel/SidePanelProvider.d.ts +20 -0
- package/dist-types/side-panel/SidePanelTitle.d.ts +3 -0
- package/dist-types/side-panel/SidePanelTrigger.d.ts +3 -0
- package/dist-types/side-panel/index.d.ts +8 -0
- package/dist-types/side-panel/internal/SidePanelContext.d.ts +52 -0
- package/dist-types/side-panel/internal/index.d.ts +3 -0
- package/dist-types/side-panel/internal/useIsScrollable.d.ts +2 -0
- package/dist-types/side-panel/internal/useSidePanelTabOrder.d.ts +7 -0
- package/dist-types/side-panel/useSidePanel.d.ts +58 -0
- package/dist-types/tree/Tree.d.ts +36 -0
- package/dist-types/tree/TreeContext.d.ts +77 -0
- package/dist-types/tree/TreeNode.d.ts +25 -0
- 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 +4 -0
- package/dist-types/tree/treeModel.d.ts +24 -0
- package/dist-types/tree/useTree.d.ts +68 -0
- package/package.json +1 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var clsx = require('clsx');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var Button = require('../button/Button.js');
|
|
7
|
+
var SemanticIconProvider = require('../semantic-icon-provider/SemanticIconProvider.js');
|
|
8
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
9
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
10
|
+
var useId = require('../utils/useId.js');
|
|
11
|
+
require('../salt-provider/SaltProvider.js');
|
|
12
|
+
require('../viewport/ViewportProvider.js');
|
|
13
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
14
|
+
require('tabbable');
|
|
15
|
+
|
|
16
|
+
const withBaseName = makePrefixer.makePrefixer("saltSidePanelCloseButton");
|
|
17
|
+
const SidePanelCloseButton = React.forwardRef(
|
|
18
|
+
function SidePanelCloseButton2({ className, onClick, id: idProp, ...rest }, ref) {
|
|
19
|
+
const { CollapseLeftIcon, CollapseRightIcon } = SemanticIconProvider.useIcon();
|
|
20
|
+
const { setOpen, titleId, position } = SidePanelContext.useSidePanelContext();
|
|
21
|
+
const closeButtonId = useId.useId(idProp);
|
|
22
|
+
const handleClick = (event) => {
|
|
23
|
+
onClick == null ? void 0 : onClick(event);
|
|
24
|
+
setOpen(false);
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
27
|
+
Button.Button,
|
|
28
|
+
{
|
|
29
|
+
ref,
|
|
30
|
+
id: closeButtonId,
|
|
31
|
+
"aria-label": "Close",
|
|
32
|
+
"aria-labelledby": titleId ? clsx.clsx(closeButtonId, titleId) : void 0,
|
|
33
|
+
appearance: "transparent",
|
|
34
|
+
className: clsx.clsx(withBaseName(), className),
|
|
35
|
+
onClick: handleClick,
|
|
36
|
+
...rest,
|
|
37
|
+
children: position === "left" ? /* @__PURE__ */ jsxRuntime.jsx(CollapseLeftIcon, { "aria-hidden": true }) : /* @__PURE__ */ jsxRuntime.jsx(CollapseRightIcon, { "aria-hidden": true })
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
exports.SidePanelCloseButton = SidePanelCloseButton;
|
|
44
|
+
//# sourceMappingURL=SidePanelCloseButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelCloseButton.js","sources":["../src/side-panel/SidePanelCloseButton.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { forwardRef, type MouseEvent } from \"react\";\nimport { Button, type ButtonProps } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer, useId } from \"../utils\";\nimport { useSidePanelContext } from \"./internal\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelCloseButton\");\n\nexport const SidePanelCloseButton = forwardRef<HTMLButtonElement, ButtonProps>(\n function SidePanelCloseButton(\n { className, onClick, id: idProp, ...rest },\n ref,\n ) {\n const { CollapseLeftIcon, CollapseRightIcon } = useIcon();\n const { setOpen, titleId, position } = useSidePanelContext();\n const closeButtonId = useId(idProp);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n setOpen(false);\n };\n\n return (\n <Button\n ref={ref}\n id={closeButtonId}\n aria-label=\"Close\"\n aria-labelledby={titleId ? clsx(closeButtonId, titleId) : undefined}\n appearance=\"transparent\"\n className={clsx(withBaseName(), className)}\n onClick={handleClick}\n {...rest}\n >\n {position === \"left\" ? (\n <CollapseLeftIcon aria-hidden />\n ) : (\n <CollapseRightIcon aria-hidden />\n )}\n </Button>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","SidePanelCloseButton","useIcon","useSidePanelContext","useId","jsx","Button","clsx"],"mappings":";;;;;;;;;;;;;;;AAOA,MAAM,YAAA,GAAeA,0BAAa,0BAA0B,CAAA;AAErD,MAAM,oBAAA,GAAuBC,gBAAA;AAAA,EAClC,SAASC,qBAAAA,CACP,EAAE,SAAA,EAAW,OAAA,EAAS,IAAI,MAAA,EAAQ,GAAG,IAAA,EAAK,EAC1C,GAAA,EACA;AACA,IAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAkB,GAAIC,4BAAA,EAAQ;AACxD,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,KAAaC,oCAAA,EAAoB;AAC3D,IAAA,MAAM,aAAA,GAAgBC,YAAM,MAAM,CAAA;AAElC,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,uBACEC,cAAA;AAAA,MAACC,aAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA,EAAI,aAAA;AAAA,QACJ,YAAA,EAAW,OAAA;AAAA,QACX,iBAAA,EAAiB,OAAA,GAAUC,SAAA,CAAK,aAAA,EAAe,OAAO,CAAA,GAAI,MAAA;AAAA,QAC1D,UAAA,EAAW,aAAA;AAAA,QACX,SAAA,EAAWA,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACzC,OAAA,EAAS,WAAA;AAAA,QACR,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA,QAAA,KAAa,MAAA,mBACZF,cAAA,CAAC,gBAAA,EAAA,EAAiB,aAAA,EAAW,MAAC,CAAA,mBAE9BA,cAAA,CAAC,iBAAA,EAAA,EAAkB,aAAA,EAAW,IAAA,EAAC;AAAA;AAAA,KAEnC;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltSidePanelContent {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n}\n\n.saltSidePanelContent-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=SidePanelContent.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelContent.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
9
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
10
|
+
var useId = require('../utils/useId.js');
|
|
11
|
+
require('../salt-provider/SaltProvider.js');
|
|
12
|
+
require('../viewport/ViewportProvider.js');
|
|
13
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
14
|
+
var useIsScrollable = require('./internal/useIsScrollable.js');
|
|
15
|
+
require('tabbable');
|
|
16
|
+
var SidePanelContent$1 = require('./SidePanelContent.css.js');
|
|
17
|
+
|
|
18
|
+
const withBaseName = makePrefixer.makePrefixer("saltSidePanelContent");
|
|
19
|
+
const SidePanelContent = React.forwardRef(function SidePanelContent2(props, ref) {
|
|
20
|
+
const {
|
|
21
|
+
children,
|
|
22
|
+
className,
|
|
23
|
+
"aria-labelledby": ariaLabelledBy,
|
|
24
|
+
"aria-label": ariaLabel,
|
|
25
|
+
...rest
|
|
26
|
+
} = props;
|
|
27
|
+
const { titleId } = SidePanelContext.useSidePanelContext();
|
|
28
|
+
const targetWindow = window.useWindow();
|
|
29
|
+
const contentSuffixId = useId.useId();
|
|
30
|
+
const bodyRef = React.useRef(null);
|
|
31
|
+
const isScrollable = useIsScrollable.useIsScrollable(bodyRef);
|
|
32
|
+
styles.useComponentCssInjection({
|
|
33
|
+
testId: "salt-side-panel-content",
|
|
34
|
+
css: SidePanelContent$1,
|
|
35
|
+
window: targetWindow
|
|
36
|
+
});
|
|
37
|
+
const explicitLabelledBy = ariaLabelledBy;
|
|
38
|
+
const explicitLabel = ariaLabel;
|
|
39
|
+
let bodyAriaLabelledBy;
|
|
40
|
+
let bodyAriaLabel;
|
|
41
|
+
if (isScrollable) {
|
|
42
|
+
if (explicitLabelledBy) {
|
|
43
|
+
bodyAriaLabelledBy = explicitLabelledBy;
|
|
44
|
+
} else if (titleId) {
|
|
45
|
+
bodyAriaLabelledBy = clsx.clsx(titleId, contentSuffixId) || void 0;
|
|
46
|
+
} else {
|
|
47
|
+
bodyAriaLabel = explicitLabel ?? "Content";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx.clsx(withBaseName(), className), ...rest, children: [
|
|
51
|
+
isScrollable ? /* @__PURE__ */ jsxRuntime.jsx("span", { id: contentSuffixId, hidden: true, children: "content" }) : null,
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
53
|
+
"div",
|
|
54
|
+
{
|
|
55
|
+
ref: bodyRef,
|
|
56
|
+
className: withBaseName("body"),
|
|
57
|
+
...isScrollable && {
|
|
58
|
+
role: "region",
|
|
59
|
+
tabIndex: 0,
|
|
60
|
+
"aria-labelledby": bodyAriaLabelledBy,
|
|
61
|
+
"aria-label": bodyAriaLabel
|
|
62
|
+
},
|
|
63
|
+
children
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] });
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
exports.SidePanelContent = SidePanelContent;
|
|
70
|
+
//# sourceMappingURL=SidePanelContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelContent.js","sources":["../src/side-panel/SidePanelContent.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef, useRef } from \"react\";\nimport { makePrefixer, useId } from \"../utils\";\nimport { useIsScrollable, useSidePanelContext } from \"./internal\";\nimport sidePanelContentCss from \"./SidePanelContent.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelContent\");\n\nexport type SidePanelContentProps = ComponentPropsWithRef<\"div\">;\n\nexport const SidePanelContent = forwardRef<\n HTMLDivElement,\n SidePanelContentProps\n>(function SidePanelContent(props, ref) {\n const {\n children,\n className,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n\n const { titleId } = useSidePanelContext();\n const targetWindow = useWindow();\n const contentSuffixId = useId();\n const bodyRef = useRef<HTMLDivElement>(null);\n const isScrollable = useIsScrollable(bodyRef);\n\n useComponentCssInjection({\n testId: \"salt-side-panel-content\",\n css: sidePanelContentCss,\n window: targetWindow,\n });\n\n const explicitLabelledBy = ariaLabelledBy;\n const explicitLabel = ariaLabel;\n\n let bodyAriaLabelledBy: string | undefined;\n let bodyAriaLabel: string | undefined;\n\n if (isScrollable) {\n if (explicitLabelledBy) {\n bodyAriaLabelledBy = explicitLabelledBy;\n } else if (titleId) {\n bodyAriaLabelledBy = clsx(titleId, contentSuffixId) || undefined;\n } else {\n bodyAriaLabel = explicitLabel ?? \"Content\";\n }\n }\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {isScrollable ? (\n <span id={contentSuffixId} hidden>\n content\n </span>\n ) : null}\n <div\n ref={bodyRef}\n className={withBaseName(\"body\")}\n {...(isScrollable && {\n role: \"region\",\n tabIndex: 0,\n \"aria-labelledby\": bodyAriaLabelledBy,\n \"aria-label\": bodyAriaLabel,\n })}\n >\n {children}\n </div>\n </div>\n );\n});\n"],"names":["makePrefixer","forwardRef","SidePanelContent","useSidePanelContext","useWindow","useId","useRef","useIsScrollable","useComponentCssInjection","sidePanelContentCss","clsx","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;AAQA,MAAM,YAAA,GAAeA,0BAAa,sBAAsB,CAAA;AAIjD,MAAM,gBAAA,GAAmBC,gBAAA,CAG9B,SAASC,iBAAAA,CAAiB,OAAO,GAAA,EAAK;AACtC,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA,EAAmB,cAAA;AAAA,IACnB,YAAA,EAAc,SAAA;AAAA,IACd,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAIC,oCAAA,EAAoB;AACxC,EAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,EAAA,MAAM,kBAAkBC,WAAA,EAAM;AAC9B,EAAA,MAAM,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAeC,gCAAgB,OAAO,CAAA;AAE5C,EAAAC,+BAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,yBAAA;AAAA,IACR,GAAA,EAAKC,kBAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqB,cAAA;AAC3B,EAAA,MAAM,aAAA,GAAgB,SAAA;AAEtB,EAAA,IAAI,kBAAA;AACJ,EAAA,IAAI,aAAA;AAEJ,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,kBAAA,GAAqB,kBAAA;AAAA,IACvB,WAAW,OAAA,EAAS;AAClB,MAAA,kBAAA,GAAqBC,SAAA,CAAK,OAAA,EAAS,eAAe,CAAA,IAAK,MAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,aAAA,IAAiB,SAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWD,SAAA,CAAK,cAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,EAAA;AAAA,IAAA,YAAA,kCACE,MAAA,EAAA,EAAK,EAAA,EAAI,iBAAiB,MAAA,EAAM,IAAA,EAAC,qBAElC,CAAA,GACE,IAAA;AAAA,oBACJE,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,QAC7B,GAAI,YAAA,IAAgB;AAAA,UACnB,IAAA,EAAM,QAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,iBAAA,EAAmB,kBAAA;AAAA,UACnB,YAAA,EAAc;AAAA,SAChB;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAC;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltSidePanelHeader {\n display: flex;\n align-items: flex-start;\n flex-shrink: 0;\n gap: var(--salt-spacing-100);\n padding: 0 0 var(--salt-spacing-300);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=SidePanelHeader.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelHeader.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
9
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
10
|
+
require('../utils/useId.js');
|
|
11
|
+
require('../salt-provider/SaltProvider.js');
|
|
12
|
+
require('../viewport/ViewportProvider.js');
|
|
13
|
+
var SidePanelHeader$1 = require('./SidePanelHeader.css.js');
|
|
14
|
+
|
|
15
|
+
const withBaseName = makePrefixer.makePrefixer("saltSidePanelHeader");
|
|
16
|
+
const SidePanelHeader = React.forwardRef(
|
|
17
|
+
function SidePanelHeader2(props, ref) {
|
|
18
|
+
const { children, className, ...rest } = props;
|
|
19
|
+
const targetWindow = window.useWindow();
|
|
20
|
+
styles.useComponentCssInjection({
|
|
21
|
+
testId: "salt-side-panel-header",
|
|
22
|
+
css: SidePanelHeader$1,
|
|
23
|
+
window: targetWindow
|
|
24
|
+
});
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx.clsx(withBaseName(), className), ...rest, children });
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
exports.SidePanelHeader = SidePanelHeader;
|
|
30
|
+
//# sourceMappingURL=SidePanelHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelHeader.js","sources":["../src/side-panel/SidePanelHeader.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport sidePanelHeaderCss from \"./SidePanelHeader.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelHeader\");\n\nexport type SidePanelHeaderProps = ComponentPropsWithRef<\"div\">;\n\nexport const SidePanelHeader = forwardRef<HTMLDivElement, SidePanelHeaderProps>(\n function SidePanelHeader(props, ref) {\n const { children, className, ...rest } = props;\n\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel-header\",\n css: sidePanelHeaderCss,\n window: targetWindow,\n });\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {children}\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","SidePanelHeader","useWindow","useComponentCssInjection","sidePanelHeaderCss","jsx","clsx"],"mappings":";;;;;;;;;;;;;;AAOA,MAAM,YAAA,GAAeA,0BAAa,qBAAqB,CAAA;AAIhD,MAAM,eAAA,GAAkBC,gBAAA;AAAA,EAC7B,SAASC,gBAAAA,CAAgB,KAAA,EAAO,GAAA,EAAK;AACnC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAEzC,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAE/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,wBAAA;AAAA,MACR,GAAA,EAAKC,iBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACEC,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('@floating-ui/react');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
require('clsx');
|
|
7
|
+
var useControlled = require('../utils/useControlled.js');
|
|
8
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
9
|
+
require('../utils/useId.js');
|
|
10
|
+
require('../salt-provider/SaltProvider.js');
|
|
11
|
+
require('../viewport/ViewportProvider.js');
|
|
12
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
13
|
+
var useSidePanelTabOrder = require('./internal/useSidePanelTabOrder.js');
|
|
14
|
+
|
|
15
|
+
function SidePanelProvider(props) {
|
|
16
|
+
const { children, open: openProp, defaultOpen, onOpenChange } = props;
|
|
17
|
+
const [openState, setOpenState] = useControlled.useControlled({
|
|
18
|
+
default: Boolean(defaultOpen),
|
|
19
|
+
controlled: openProp,
|
|
20
|
+
name: "SidePanelProvider",
|
|
21
|
+
state: "open"
|
|
22
|
+
});
|
|
23
|
+
const handleOpenChange = React.useCallback(
|
|
24
|
+
(newOpen) => {
|
|
25
|
+
setOpenState(newOpen);
|
|
26
|
+
onOpenChange == null ? void 0 : onOpenChange(newOpen);
|
|
27
|
+
},
|
|
28
|
+
[onOpenChange]
|
|
29
|
+
);
|
|
30
|
+
const [reference, setReference] = React.useState(null);
|
|
31
|
+
const [floating, setFloating] = React.useState(null);
|
|
32
|
+
const [panelId, setPanelId] = React.useState(void 0);
|
|
33
|
+
const [titleId, setTitleId] = React.useState(void 0);
|
|
34
|
+
const elements = React.useMemo(
|
|
35
|
+
() => ({ reference, floating }),
|
|
36
|
+
[reference, floating]
|
|
37
|
+
);
|
|
38
|
+
const floatingRootContext = react.useFloatingRootContext({
|
|
39
|
+
open: openState,
|
|
40
|
+
onOpenChange: handleOpenChange,
|
|
41
|
+
elements
|
|
42
|
+
});
|
|
43
|
+
React.useEffect(() => {
|
|
44
|
+
if (!openState || !floating) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const onKeyDown = (event) => {
|
|
48
|
+
if (event.key !== "Escape") {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
event.stopPropagation();
|
|
53
|
+
handleOpenChange(false);
|
|
54
|
+
};
|
|
55
|
+
floating.addEventListener("keydown", onKeyDown);
|
|
56
|
+
return () => {
|
|
57
|
+
floating.removeEventListener("keydown", onKeyDown);
|
|
58
|
+
};
|
|
59
|
+
}, [floating, openState, handleOpenChange]);
|
|
60
|
+
useSidePanelTabOrder.useSidePanelTabOrder({
|
|
61
|
+
floating,
|
|
62
|
+
open: openState,
|
|
63
|
+
reference
|
|
64
|
+
});
|
|
65
|
+
const context = React.useMemo(
|
|
66
|
+
() => ({
|
|
67
|
+
openState,
|
|
68
|
+
floatingRootContext,
|
|
69
|
+
setFloating,
|
|
70
|
+
setReference,
|
|
71
|
+
setOpen: handleOpenChange,
|
|
72
|
+
panelId,
|
|
73
|
+
setPanelId,
|
|
74
|
+
titleId,
|
|
75
|
+
setTitleId
|
|
76
|
+
}),
|
|
77
|
+
[openState, floatingRootContext, handleOpenChange, panelId, titleId]
|
|
78
|
+
);
|
|
79
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SidePanelContext.SidePanelContext.Provider, { value: context, children });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
exports.SidePanelProvider = SidePanelProvider;
|
|
83
|
+
//# sourceMappingURL=SidePanelProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelProvider.js","sources":["../src/side-panel/SidePanelProvider.tsx"],"sourcesContent":["import { useFloatingRootContext } from \"@floating-ui/react\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useControlled } from \"../utils\";\nimport { SidePanelContext, useSidePanelTabOrder } from \"./internal\";\n\nexport interface SidePanelProviderProps {\n /**\n * Whether the panel is open.\n */\n open?: boolean;\n /**\n * Default open state when initially rendered.\n */\n defaultOpen?: boolean;\n /**\n * Callback when open state changes.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * SidePanelProvider children, should include SidePanel and SidePanelTrigger.\n */\n children: ReactNode;\n}\n\nexport function SidePanelProvider(props: SidePanelProviderProps) {\n const { children, open: openProp, defaultOpen, onOpenChange } = props;\n\n const [openState, setOpenState] = useControlled({\n default: Boolean(defaultOpen),\n controlled: openProp,\n name: \"SidePanelProvider\",\n state: \"open\",\n });\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setOpenState(newOpen);\n onOpenChange?.(newOpen);\n },\n [onOpenChange],\n );\n\n const [reference, setReference] = useState<HTMLElement | null>(null);\n const [floating, setFloating] = useState<HTMLDivElement | null>(null);\n const [panelId, setPanelId] = useState<string | undefined>(undefined);\n const [titleId, setTitleId] = useState<string | undefined>(undefined);\n\n // Memoise so floating-ui's root context isn't recreated every render.\n const elements = useMemo(\n () => ({ reference, floating }),\n [reference, floating],\n );\n\n const floatingRootContext = useFloatingRootContext({\n open: openState,\n onOpenChange: handleOpenChange,\n elements,\n });\n\n useEffect(() => {\n if (!openState || !floating) {\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n handleOpenChange(false);\n };\n\n floating.addEventListener(\"keydown\", onKeyDown);\n return () => {\n floating.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [floating, openState, handleOpenChange]);\n\n useSidePanelTabOrder({\n floating,\n open: openState,\n reference,\n });\n\n const context = useMemo(\n () => ({\n openState,\n floatingRootContext,\n setFloating,\n setReference,\n setOpen: handleOpenChange,\n panelId,\n setPanelId,\n titleId,\n setTitleId,\n }),\n [openState, floatingRootContext, handleOpenChange, panelId, titleId],\n );\n\n return (\n <SidePanelContext.Provider value={context}>\n {children}\n </SidePanelContext.Provider>\n );\n}\n"],"names":["useControlled","useCallback","useState","useMemo","useFloatingRootContext","useEffect","useSidePanelTabOrder","SidePanelContext"],"mappings":";;;;;;;;;;;;;;AA8BO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,cAAa,GAAI,KAAA;AAEhE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,2BAAA,CAAc;AAAA,IAC9C,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,IAC5B,UAAA,EAAY,QAAA;AAAA,IACZ,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmBC,iBAAA;AAAA,IACvB,CAAC,OAAA,KAAqB;AACpB,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,OAAA,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAA6B,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAgC,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA6B,MAAS,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAGpE,EAAA,MAAM,QAAA,GAAWC,aAAA;AAAA,IACf,OAAO,EAAE,SAAA,EAAW,QAAA,EAAS,CAAA;AAAA,IAC7B,CAAC,WAAW,QAAQ;AAAA,GACtB;AAEA,EAAA,MAAM,sBAAsBC,4BAAA,CAAuB;AAAA,IACjD,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,gBAAA;AAAA,IACd;AAAA,GACD,CAAA;AAED,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAE1C,EAAAC,yCAAA,CAAqB;AAAA,IACnB,QAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,OAAA,GAAUH,aAAA;AAAA,IACd,OAAO;AAAA,MACL,SAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,mBAAA,EAAqB,gBAAA,EAAkB,SAAS,OAAO;AAAA,GACrE;AAEA,EAAA,sCACGI,iCAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAC/B,QAAA,EACH,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelTitle.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var styles = require('@salt-ds/styles');
|
|
5
|
+
var window = require('@salt-ds/window');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
require('../text/Code.js');
|
|
9
|
+
require('../text/Display.js');
|
|
10
|
+
require('../text/Headings.js');
|
|
11
|
+
require('../text/Label.js');
|
|
12
|
+
var Text = require('../text/Text.js');
|
|
13
|
+
require('../text/TextAction.js');
|
|
14
|
+
require('../text/TextNotation.js');
|
|
15
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
16
|
+
var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
|
|
17
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
18
|
+
var useId = require('../utils/useId.js');
|
|
19
|
+
require('../salt-provider/SaltProvider.js');
|
|
20
|
+
require('../viewport/ViewportProvider.js');
|
|
21
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
22
|
+
require('tabbable');
|
|
23
|
+
var SidePanelTitle$1 = require('./SidePanelTitle.css.js');
|
|
24
|
+
|
|
25
|
+
const withBaseName = makePrefixer.makePrefixer("saltSidePanelTitle");
|
|
26
|
+
const SidePanelTitle = React.forwardRef(
|
|
27
|
+
function SidePanelTitle2(props, ref) {
|
|
28
|
+
const { children, className, id, styleAs = "h2", ...rest } = props;
|
|
29
|
+
const { setTitleId } = SidePanelContext.useSidePanelContext();
|
|
30
|
+
const targetWindow = window.useWindow();
|
|
31
|
+
styles.useComponentCssInjection({
|
|
32
|
+
testId: "salt-side-panel-title",
|
|
33
|
+
css: SidePanelTitle$1,
|
|
34
|
+
window: targetWindow
|
|
35
|
+
});
|
|
36
|
+
const titleId = useId.useId(id);
|
|
37
|
+
useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
|
|
38
|
+
if (titleId) {
|
|
39
|
+
setTitleId(titleId);
|
|
40
|
+
}
|
|
41
|
+
return () => {
|
|
42
|
+
setTitleId(void 0);
|
|
43
|
+
};
|
|
44
|
+
}, [titleId, setTitleId]);
|
|
45
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
46
|
+
Text.Text,
|
|
47
|
+
{
|
|
48
|
+
ref,
|
|
49
|
+
id: titleId,
|
|
50
|
+
styleAs,
|
|
51
|
+
className: clsx.clsx(withBaseName(), className),
|
|
52
|
+
...rest,
|
|
53
|
+
children
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
exports.SidePanelTitle = SidePanelTitle;
|
|
60
|
+
//# sourceMappingURL=SidePanelTitle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelTitle.js","sources":["../src/side-panel/SidePanelTitle.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { Text, type TextProps } from \"../text\";\nimport { makePrefixer, useId, useIsomorphicLayoutEffect } from \"../utils\";\nimport { useSidePanelContext } from \"./internal\";\nimport sidePanelTitleCss from \"./SidePanelTitle.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelTitle\");\n\nexport type SidePanelTitleProps = TextProps<\"div\">;\n\nexport const SidePanelTitle = forwardRef<HTMLDivElement, SidePanelTitleProps>(\n function SidePanelTitle(props, ref) {\n const { children, className, id, styleAs = \"h2\", ...rest } = props;\n\n const { setTitleId } = useSidePanelContext();\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel-title\",\n css: sidePanelTitleCss,\n window: targetWindow,\n });\n\n const titleId = useId(id);\n\n useIsomorphicLayoutEffect(() => {\n if (titleId) {\n setTitleId(titleId);\n }\n\n return () => {\n setTitleId(undefined);\n };\n }, [titleId, setTitleId]);\n\n return (\n <Text\n ref={ref}\n id={titleId}\n styleAs={styleAs}\n className={clsx(withBaseName(), className)}\n {...rest}\n >\n {children}\n </Text>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","SidePanelTitle","useSidePanelContext","useWindow","useComponentCssInjection","sidePanelTitleCss","useId","useIsomorphicLayoutEffect","jsx","Text","clsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,YAAA,GAAeA,0BAAa,oBAAoB,CAAA;AAI/C,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAC5B,SAASC,eAAAA,CAAe,KAAA,EAAO,GAAA,EAAK;AAClC,IAAA,MAAM,EAAE,UAAU,SAAA,EAAW,EAAA,EAAI,UAAU,IAAA,EAAM,GAAG,MAAK,GAAI,KAAA;AAE7D,IAAA,MAAM,EAAE,UAAA,EAAW,GAAIC,oCAAA,EAAoB;AAC3C,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAE/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,gBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,OAAA,GAAUC,YAAM,EAAE,CAAA;AAExB,IAAAC,mDAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,OAAO,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,MAAM;AACX,QAAA,UAAA,CAAW,MAAS,CAAA;AAAA,MACtB,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,IAAA,uBACEC,cAAA;AAAA,MAACC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA,EAAI,OAAA;AAAA,QACJ,OAAA;AAAA,QACA,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACxC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var getRefFromChildren = require('../utils/getRefFromChildren.js');
|
|
6
|
+
var mergeProps = require('../utils/mergeProps.js');
|
|
7
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
8
|
+
var useForkRef = require('../utils/useForkRef.js');
|
|
9
|
+
require('../utils/useId.js');
|
|
10
|
+
require('../salt-provider/SaltProvider.js');
|
|
11
|
+
require('../viewport/ViewportProvider.js');
|
|
12
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
13
|
+
require('tabbable');
|
|
14
|
+
|
|
15
|
+
const SidePanelTrigger = React.forwardRef(function SidePanelTrigger2(props, ref) {
|
|
16
|
+
const { children, onClick, ...rest } = props;
|
|
17
|
+
const { setReference, openState, setOpen, panelId } = SidePanelContext.useSidePanelContext();
|
|
18
|
+
const combinedRef = useForkRef.useForkRef(setReference, ref);
|
|
19
|
+
const handleRef = useForkRef.useForkRef(combinedRef, getRefFromChildren.getRefFromChildren(children));
|
|
20
|
+
const handleClick = (event) => {
|
|
21
|
+
onClick == null ? void 0 : onClick(event);
|
|
22
|
+
setOpen(!openState);
|
|
23
|
+
};
|
|
24
|
+
if (!children || !React.isValidElement(children)) {
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
|
|
26
|
+
}
|
|
27
|
+
const mergedProps = mergeProps.mergeProps(
|
|
28
|
+
{
|
|
29
|
+
"aria-expanded": openState,
|
|
30
|
+
"aria-controls": openState ? panelId : void 0,
|
|
31
|
+
onClick: handleClick,
|
|
32
|
+
...rest
|
|
33
|
+
},
|
|
34
|
+
children.props
|
|
35
|
+
);
|
|
36
|
+
return React.cloneElement(children, {
|
|
37
|
+
...mergedProps,
|
|
38
|
+
ref: handleRef
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
exports.SidePanelTrigger = SidePanelTrigger;
|
|
43
|
+
//# sourceMappingURL=SidePanelTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelTrigger.js","sources":["../src/side-panel/SidePanelTrigger.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n cloneElement,\n forwardRef,\n isValidElement,\n type MouseEvent,\n} from \"react\";\nimport { getRefFromChildren, mergeProps, useForkRef } from \"../utils\";\nimport { useSidePanelContext } from \"./internal\";\n\nexport type SidePanelTriggerProps = ComponentPropsWithoutRef<\"button\">;\n\nexport const SidePanelTrigger = forwardRef<\n HTMLButtonElement,\n SidePanelTriggerProps\n>(function SidePanelTrigger(props, ref) {\n const { children, onClick, ...rest } = props;\n const { setReference, openState, setOpen, panelId } = useSidePanelContext();\n\n const combinedRef = useForkRef(setReference, ref);\n const handleRef = useForkRef(combinedRef, getRefFromChildren(children));\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n setOpen(!openState);\n };\n\n if (!children || !isValidElement(children)) {\n return <>{children}</>;\n }\n\n const mergedProps = mergeProps(\n {\n \"aria-expanded\": openState,\n \"aria-controls\": openState ? panelId : undefined,\n onClick: handleClick,\n ...rest,\n },\n children.props,\n );\n\n return cloneElement(children, {\n ...mergedProps,\n ref: handleRef,\n });\n});\n"],"names":["forwardRef","SidePanelTrigger","useSidePanelContext","useForkRef","getRefFromChildren","isValidElement","mergeProps","cloneElement"],"mappings":";;;;;;;;;;;;;;AAYO,MAAM,gBAAA,GAAmBA,gBAAA,CAG9B,SAASC,iBAAAA,CAAiB,OAAO,GAAA,EAAK;AACtC,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,GAAG,MAAK,GAAI,KAAA;AACvC,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAW,OAAA,EAAS,OAAA,KAAYC,oCAAA,EAAoB;AAE1E,EAAA,MAAM,WAAA,GAAcC,qBAAA,CAAW,YAAA,EAAc,GAAG,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,qBAAA,CAAW,WAAA,EAAaC,qCAAA,CAAmB,QAAQ,CAAC,CAAA;AAEtE,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,IAAA,OAAA,CAAQ,CAAC,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAACC,oBAAA,CAAe,QAAQ,CAAA,EAAG;AAC1C,IAAA,6DAAU,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,WAAA,GAAcC,qBAAA;AAAA,IAClB;AAAA,MACE,eAAA,EAAiB,SAAA;AAAA,MACjB,eAAA,EAAiB,YAAY,OAAA,GAAU,MAAA;AAAA,MACvC,OAAA,EAAS,WAAA;AAAA,MACT,GAAG;AAAA,KACL;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AAEA,EAAA,OAAOC,mBAAa,QAAA,EAAU;AAAA,IAC5B,GAAG,WAAA;AAAA,IACH,GAAA,EAAK;AAAA,GACN,CAAA;AACH,CAAC;;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var createContext = require('../../utils/createContext.js');
|
|
5
|
+
require('clsx');
|
|
6
|
+
require('react/jsx-runtime');
|
|
7
|
+
require('../../utils/useFloatingUI/useFloatingUI.js');
|
|
8
|
+
require('../../utils/useId.js');
|
|
9
|
+
require('../../salt-provider/SaltProvider.js');
|
|
10
|
+
require('../../viewport/ViewportProvider.js');
|
|
11
|
+
|
|
12
|
+
const SidePanelContext = createContext.createContext(
|
|
13
|
+
"SidePanelContext",
|
|
14
|
+
{
|
|
15
|
+
openState: false,
|
|
16
|
+
floatingRootContext: {},
|
|
17
|
+
setFloating: () => {
|
|
18
|
+
},
|
|
19
|
+
setReference: () => {
|
|
20
|
+
},
|
|
21
|
+
setOpen: () => {
|
|
22
|
+
},
|
|
23
|
+
panelId: void 0,
|
|
24
|
+
setPanelId: () => {
|
|
25
|
+
},
|
|
26
|
+
titleId: void 0,
|
|
27
|
+
setTitleId: () => {
|
|
28
|
+
},
|
|
29
|
+
position: void 0
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
function useSidePanelContext() {
|
|
33
|
+
return React.useContext(SidePanelContext);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
exports.SidePanelContext = SidePanelContext;
|
|
37
|
+
exports.useSidePanelContext = useSidePanelContext;
|
|
38
|
+
//# sourceMappingURL=SidePanelContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelContext.js","sources":["../src/side-panel/internal/SidePanelContext.ts"],"sourcesContent":["import type { FloatingRootContext } from \"@floating-ui/react\";\nimport { type Dispatch, type SetStateAction, useContext } from \"react\";\nimport { createContext } from \"../../utils\";\n\nexport interface SidePanelContextValue {\n /**\n * Whether the side panel is currently open.\n */\n openState: boolean;\n /**\n * The floating-ui root context shared between the trigger and the panel.\n * Coordinates interactions (click, dismiss, role) across both elements.\n */\n floatingRootContext: FloatingRootContext;\n /**\n * Ref setter for the panel element.\n * Registers the panel DOM node with floating-ui.\n */\n setFloating: Dispatch<SetStateAction<HTMLDivElement | null>>;\n /**\n * Ref setter for the reference (trigger) element.\n * Registers the trigger DOM node with floating-ui for focus return.\n */\n setReference: Dispatch<SetStateAction<HTMLElement | null>>;\n /**\n * Sets the open state of the panel.\n * Called by the close button in SidePanelHeader, or any consumer that needs to close the panel.\n */\n setOpen: (open: boolean) => void;\n /**\n * Side panel id used for aria-controls on the trigger.\n */\n panelId?: string;\n /**\n * Registers or clears the side panel id used for aria-controls/id linkage.\n */\n setPanelId: Dispatch<SetStateAction<string | undefined>>;\n /**\n * The auto-generated id placed on SidePanelTitle.\n * Used for aria-labelledby on the panel region and the scrollable body.\n */\n titleId?: string;\n /**\n * Registers the title id from SidePanelTitle back to the context\n * so that SidePanel and SidePanelContent can use it for aria-labelledby.\n */\n setTitleId: Dispatch<SetStateAction<string | undefined>>;\n /**\n * Edge the panel is anchored to. Set by SidePanel for its own subtree.\n */\n position?: \"right\" | \"left\";\n}\n\nexport const SidePanelContext = createContext<SidePanelContextValue>(\n \"SidePanelContext\",\n {\n openState: false,\n floatingRootContext: {} as FloatingRootContext,\n setFloating: () => {},\n setReference: () => {},\n setOpen: () => {},\n panelId: undefined,\n setPanelId: () => {},\n titleId: undefined,\n setTitleId: () => {},\n position: undefined,\n },\n);\n\nexport function useSidePanelContext() {\n return useContext(SidePanelContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;AAqDO,MAAM,gBAAA,GAAmBA,2BAAA;AAAA,EAC9B,kBAAA;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,qBAAqB,EAAC;AAAA,IACtB,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,OAAA,EAAS,MAAA;AAAA,IACT,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA;AAEd;AAEO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOC,iBAAW,gBAAgB,CAAA;AACpC;;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const observedAttributes = ["class", "hidden", "style"];
|
|
6
|
+
function useIsScrollable(ref) {
|
|
7
|
+
const [isScrollable, setIsScrollable] = React.useState(false);
|
|
8
|
+
React.useEffect(() => {
|
|
9
|
+
const element = ref.current;
|
|
10
|
+
const win = element == null ? void 0 : element.ownerDocument.defaultView;
|
|
11
|
+
if (!element || !win) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
let animationFrame;
|
|
15
|
+
const checkScrollable = () => {
|
|
16
|
+
animationFrame = void 0;
|
|
17
|
+
const nextIsScrollable = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
|
|
18
|
+
setIsScrollable(
|
|
19
|
+
(currentIsScrollable) => currentIsScrollable === nextIsScrollable ? currentIsScrollable : nextIsScrollable
|
|
20
|
+
);
|
|
21
|
+
};
|
|
22
|
+
const scheduleCheck = () => {
|
|
23
|
+
if (animationFrame === void 0) {
|
|
24
|
+
animationFrame = win.requestAnimationFrame(checkScrollable);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
scheduleCheck();
|
|
28
|
+
const resizeObserver = win.ResizeObserver ? new win.ResizeObserver(scheduleCheck) : void 0;
|
|
29
|
+
resizeObserver == null ? void 0 : resizeObserver.observe(element);
|
|
30
|
+
const mutationObserver = win.MutationObserver ? new win.MutationObserver(scheduleCheck) : void 0;
|
|
31
|
+
mutationObserver == null ? void 0 : mutationObserver.observe(element, {
|
|
32
|
+
attributeFilter: observedAttributes,
|
|
33
|
+
attributes: true,
|
|
34
|
+
characterData: true,
|
|
35
|
+
childList: true,
|
|
36
|
+
subtree: true
|
|
37
|
+
});
|
|
38
|
+
return () => {
|
|
39
|
+
if (animationFrame !== void 0) {
|
|
40
|
+
win.cancelAnimationFrame(animationFrame);
|
|
41
|
+
}
|
|
42
|
+
resizeObserver == null ? void 0 : resizeObserver.disconnect();
|
|
43
|
+
mutationObserver == null ? void 0 : mutationObserver.disconnect();
|
|
44
|
+
};
|
|
45
|
+
}, [ref]);
|
|
46
|
+
return isScrollable;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
exports.useIsScrollable = useIsScrollable;
|
|
50
|
+
//# sourceMappingURL=useIsScrollable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsScrollable.js","sources":["../src/side-panel/internal/useIsScrollable.ts"],"sourcesContent":["import { type RefObject, useEffect, useState } from \"react\";\n\nconst observedAttributes = [\"class\", \"hidden\", \"style\"];\n\nexport function useIsScrollable(ref: RefObject<HTMLElement>) {\n const [isScrollable, setIsScrollable] = useState(false);\n\n useEffect(() => {\n const element = ref.current;\n const win = element?.ownerDocument.defaultView;\n if (!element || !win) {\n return;\n }\n\n let animationFrame: number | undefined;\n\n const checkScrollable = () => {\n animationFrame = undefined;\n const nextIsScrollable =\n element.scrollHeight > element.clientHeight ||\n element.scrollWidth > element.clientWidth;\n\n setIsScrollable((currentIsScrollable) =>\n currentIsScrollable === nextIsScrollable\n ? currentIsScrollable\n : nextIsScrollable,\n );\n };\n\n const scheduleCheck = () => {\n if (animationFrame === undefined) {\n animationFrame = win.requestAnimationFrame(checkScrollable);\n }\n };\n\n scheduleCheck();\n\n const resizeObserver = win.ResizeObserver\n ? new win.ResizeObserver(scheduleCheck)\n : undefined;\n resizeObserver?.observe(element);\n\n const mutationObserver = win.MutationObserver\n ? new win.MutationObserver(scheduleCheck)\n : undefined;\n mutationObserver?.observe(element, {\n attributeFilter: observedAttributes,\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n\n return () => {\n if (animationFrame !== undefined) {\n win.cancelAnimationFrame(animationFrame);\n }\n resizeObserver?.disconnect();\n mutationObserver?.disconnect();\n };\n }, [ref]);\n\n return isScrollable;\n}\n"],"names":["useState","useEffect"],"mappings":";;;;AAEA,MAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAE/C,SAAS,gBAAgB,GAAA,EAA6B;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEtD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,MAAM,GAAA,GAAM,mCAAS,aAAA,CAAc,WAAA;AACnC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,GAAA,EAAK;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAA;AAEJ,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA,MAAM,mBACJ,OAAA,CAAQ,YAAA,GAAe,QAAQ,YAAA,IAC/B,OAAA,CAAQ,cAAc,OAAA,CAAQ,WAAA;AAEhC,MAAA,eAAA;AAAA,QAAgB,CAAC,mBAAA,KACf,mBAAA,KAAwB,gBAAA,GACpB,mBAAA,GACA;AAAA,OACN;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA,cAAA,GAAiB,GAAA,CAAI,sBAAsB,eAAe,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA;AAEA,IAAA,aAAA,EAAc;AAEd,IAAA,MAAM,iBAAiB,GAAA,CAAI,cAAA,GACvB,IAAI,GAAA,CAAI,cAAA,CAAe,aAAa,CAAA,GACpC,MAAA;AACJ,IAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,OAAA,CAAQ,OAAA,CAAA;AAExB,IAAA,MAAM,mBAAmB,GAAA,CAAI,gBAAA,GACzB,IAAI,GAAA,CAAI,gBAAA,CAAiB,aAAa,CAAA,GACtC,MAAA;AACJ,IAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,QAAQ,OAAA,EAAS;AAAA,MACjC,eAAA,EAAiB,kBAAA;AAAA,MACjB,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX,CAAA;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA,GAAA,CAAI,qBAAqB,cAAc,CAAA;AAAA,MACzC;AACA,MAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,UAAA,EAAA;AAChB,MAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,UAAA,EAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO,YAAA;AACT;;;;"}
|