@salt-ds/core 1.70.0 → 1.71.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 +62 -0
- package/css/salt-core.css +280 -32
- package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js +8 -0
- package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
- package/dist-cjs/card/Card.css.js +1 -1
- package/dist-cjs/card/Card.js +4 -0
- package/dist-cjs/card/Card.js.map +1 -1
- package/dist-cjs/drawer/Drawer.css.js +1 -1
- package/dist-cjs/drawer/Drawer.js +30 -5
- package/dist-cjs/drawer/Drawer.js.map +1 -1
- package/dist-cjs/drawer/DrawerCloseButton.js +1 -1
- package/dist-cjs/drawer/DrawerCloseButton.js.map +1 -1
- package/dist-cjs/drawer/DrawerContent.css.js +6 -0
- package/dist-cjs/drawer/DrawerContent.css.js.map +1 -0
- package/dist-cjs/drawer/DrawerContent.js +75 -0
- package/dist-cjs/drawer/DrawerContent.js.map +1 -0
- package/dist-cjs/drawer/DrawerContext.js +30 -0
- package/dist-cjs/drawer/DrawerContext.js.map +1 -0
- package/dist-cjs/drawer/DrawerFooter.css.js +6 -0
- package/dist-cjs/drawer/DrawerFooter.css.js.map +1 -0
- package/dist-cjs/drawer/DrawerFooter.js +30 -0
- package/dist-cjs/drawer/DrawerFooter.js.map +1 -0
- package/dist-cjs/drawer/DrawerHeader.css.js +6 -0
- package/dist-cjs/drawer/DrawerHeader.css.js.map +1 -0
- package/dist-cjs/drawer/DrawerHeader.js +95 -0
- package/dist-cjs/drawer/DrawerHeader.js.map +1 -0
- package/dist-cjs/drawer/hasDrawerSection.js +22 -0
- package/dist-cjs/drawer/hasDrawerSection.js.map +1 -0
- package/dist-cjs/form-field/FormField.css.js +1 -1
- package/dist-cjs/form-field/FormField.js +15 -0
- package/dist-cjs/form-field/FormField.js.map +1 -1
- package/dist-cjs/form-field/FormFieldLabel.css.js +1 -1
- package/dist-cjs/index.js +8 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
- package/dist-cjs/interactable-card/InteractableCard.js +5 -0
- package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
- package/dist-cjs/link-button/LinkButton.css.js +6 -0
- package/dist-cjs/link-button/LinkButton.css.js.map +1 -0
- package/dist-cjs/link-button/LinkButton.js +87 -0
- package/dist-cjs/link-button/LinkButton.js.map +1 -0
- package/dist-cjs/link-card/LinkCard.css.js +1 -1
- package/dist-cjs/link-card/LinkCard.js +4 -0
- package/dist-cjs/link-card/LinkCard.js.map +1 -1
- package/dist-cjs/menu/MenuItem.js +0 -1
- package/dist-cjs/menu/MenuItem.js.map +1 -1
- package/dist-cjs/panel/Panel.css.js +1 -1
- package/dist-cjs/panel/Panel.js +13 -2
- package/dist-cjs/panel/Panel.js.map +1 -1
- package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +10 -2
- package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -1
- package/dist-es/aria-announcer/AriaAnnouncerProvider.js +8 -0
- package/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
- package/dist-es/card/Card.css.js +1 -1
- package/dist-es/card/Card.js +4 -0
- package/dist-es/card/Card.js.map +1 -1
- package/dist-es/drawer/Drawer.css.js +1 -1
- package/dist-es/drawer/Drawer.js +31 -6
- package/dist-es/drawer/Drawer.js.map +1 -1
- package/dist-es/drawer/DrawerCloseButton.js +1 -1
- package/dist-es/drawer/DrawerCloseButton.js.map +1 -1
- package/dist-es/drawer/DrawerContent.css.js +4 -0
- package/dist-es/drawer/DrawerContent.css.js.map +1 -0
- package/dist-es/drawer/DrawerContent.js +73 -0
- package/dist-es/drawer/DrawerContent.js.map +1 -0
- package/dist-es/drawer/DrawerContext.js +27 -0
- package/dist-es/drawer/DrawerContext.js.map +1 -0
- package/dist-es/drawer/DrawerFooter.css.js +4 -0
- package/dist-es/drawer/DrawerFooter.css.js.map +1 -0
- package/dist-es/drawer/DrawerFooter.js +28 -0
- package/dist-es/drawer/DrawerFooter.js.map +1 -0
- package/dist-es/drawer/DrawerHeader.css.js +4 -0
- package/dist-es/drawer/DrawerHeader.css.js.map +1 -0
- package/dist-es/drawer/DrawerHeader.js +93 -0
- package/dist-es/drawer/DrawerHeader.js.map +1 -0
- package/dist-es/drawer/hasDrawerSection.js +20 -0
- package/dist-es/drawer/hasDrawerSection.js.map +1 -0
- package/dist-es/form-field/FormField.css.js +1 -1
- package/dist-es/form-field/FormField.js +16 -1
- package/dist-es/form-field/FormField.js.map +1 -1
- package/dist-es/form-field/FormFieldLabel.css.js +1 -1
- package/dist-es/index.js +4 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/interactable-card/InteractableCard.css.js +1 -1
- package/dist-es/interactable-card/InteractableCard.js +5 -0
- package/dist-es/interactable-card/InteractableCard.js.map +1 -1
- package/dist-es/link-button/LinkButton.css.js +4 -0
- package/dist-es/link-button/LinkButton.css.js.map +1 -0
- package/dist-es/link-button/LinkButton.js +85 -0
- package/dist-es/link-button/LinkButton.js.map +1 -0
- package/dist-es/link-card/LinkCard.css.js +1 -1
- package/dist-es/link-card/LinkCard.js +4 -0
- package/dist-es/link-card/LinkCard.js.map +1 -1
- package/dist-es/menu/MenuItem.js +0 -1
- package/dist-es/menu/MenuItem.js.map +1 -1
- package/dist-es/panel/Panel.css.js +1 -1
- package/dist-es/panel/Panel.js +13 -2
- package/dist-es/panel/Panel.js.map +1 -1
- package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +10 -2
- package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -1
- package/dist-types/card/Card.d.ts +10 -0
- package/dist-types/drawer/Drawer.d.ts +1 -1
- package/dist-types/drawer/DrawerCloseButton.d.ts +3 -0
- package/dist-types/drawer/DrawerContent.d.ts +3 -0
- package/dist-types/drawer/DrawerContext.d.ts +9 -0
- package/dist-types/drawer/DrawerFooter.d.ts +3 -0
- package/dist-types/drawer/DrawerHeader.d.ts +24 -0
- package/dist-types/drawer/hasDrawerSection.d.ts +2 -0
- package/dist-types/drawer/index.d.ts +3 -0
- package/dist-types/index.d.ts +1 -0
- package/dist-types/interactable-card/InteractableCard.d.ts +9 -1
- package/dist-types/link-button/LinkButton.d.ts +26 -0
- package/dist-types/link-button/index.d.ts +1 -0
- package/dist-types/link-card/LinkCard.d.ts +8 -0
- package/dist-types/panel/Panel.d.ts +4 -0
- package/dist-types/utils/useIsomorphicLayoutEffect.d.ts +2 -2
- package/package.json +11 -7
|
@@ -21,6 +21,7 @@ const AriaAnnouncerProvider = forwardRef(function AriaAnnouncerProvider2({ child
|
|
|
21
21
|
const [politeAnnouncements, setPoliteAnnouncements] = useState([]);
|
|
22
22
|
const [assertiveAnnouncements, setAssertiveAnnouncements] = useState([]);
|
|
23
23
|
const idCounterRef = useRef(0);
|
|
24
|
+
const isMountedRef = useRef(true);
|
|
24
25
|
const timeoutsRef = useRef(/* @__PURE__ */ new Set());
|
|
25
26
|
const scheduleRemoval = useCallback(
|
|
26
27
|
(id, assertiveness, duration) => {
|
|
@@ -38,6 +39,7 @@ const AriaAnnouncerProvider = forwardRef(function AriaAnnouncerProvider2({ child
|
|
|
38
39
|
);
|
|
39
40
|
const makeAnnouncement = useCallback(
|
|
40
41
|
(message, assertiveness = "polite", duration = ANNOUNCEMENT_TIME_IN_DOM) => {
|
|
42
|
+
if (!isMountedRef.current) return;
|
|
41
43
|
idCounterRef.current += 1;
|
|
42
44
|
const id = `announce-${assertiveness}-${Date.now()}-${idCounterRef.current}`;
|
|
43
45
|
if (assertiveness === "polite") {
|
|
@@ -53,6 +55,12 @@ const AriaAnnouncerProvider = forwardRef(function AriaAnnouncerProvider2({ child
|
|
|
53
55
|
},
|
|
54
56
|
[scheduleRemoval]
|
|
55
57
|
);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
isMountedRef.current = true;
|
|
60
|
+
return () => {
|
|
61
|
+
isMountedRef.current = false;
|
|
62
|
+
};
|
|
63
|
+
}, []);
|
|
56
64
|
useEffect(() => {
|
|
57
65
|
const timeouts = timeoutsRef.current;
|
|
58
66
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AriaAnnouncerProvider.js","sources":["../src/aria-announcer/AriaAnnouncerProvider.tsx"],"sourcesContent":["import { useWindow } from \"@salt-ds/window\";\nimport {\n type ComponentPropsWithRef,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils/useIsomorphicLayoutEffect\";\nimport {\n type AnnounceFnOptions,\n AriaAnnouncerContext,\n} from \"./AriaAnnouncerContext\";\nimport { registerAnnouncementTarget } from \"./announcementRegistry\";\n\nexport const ANNOUNCEMENT_TIME_IN_DOM = 300; // time between DOM updates\n\nexport interface AriaAnnouncerProviderProps\n extends ComponentPropsWithRef<\"div\"> {\n /**\n * Optional target key used to route announcements to this provider.\n */\n target?: string;\n}\n\nconst AnnouncementRegion = forwardRef<\n HTMLDivElement,\n ComponentPropsWithRef<\"div\">\n>(function AnnouncementRegion(props, ref) {\n return (\n <div\n // Keep the region simple for maximum assistive-tech compatibility.\n // aria-live is applied by the caller (polite/assertive).\n aria-atomic={false}\n ref={ref}\n {...props}\n />\n );\n});\n\ntype AnnouncementMessage = {\n id: string;\n message: string;\n};\n\nexport const AriaAnnouncerProvider = forwardRef<\n HTMLDivElement,\n AriaAnnouncerProviderProps\n>(function AriaAnnouncerProvider({ children, style, target, ...rest }, ref) {\n const targetWindow = useWindow();\n\n const [politeAnnouncements, setPoliteAnnouncements] = useState<\n AnnouncementMessage[]\n >([]);\n const [assertiveAnnouncements, setAssertiveAnnouncements] = useState<\n AnnouncementMessage[]\n >([]);\n\n const idCounterRef = useRef(0);\n const timeoutsRef = useRef<Set<number>>(new Set());\n\n const scheduleRemoval = useCallback(\n (id: string, assertiveness: \"polite\" | \"assertive\", duration: number) => {\n if (!targetWindow) return;\n\n const setter =\n assertiveness === \"polite\"\n ? setPoliteAnnouncements\n : setAssertiveAnnouncements;\n const handle = targetWindow.setTimeout(() => {\n timeoutsRef.current.delete(handle);\n setter((previous) =>\n previous.filter((announcement) => announcement.id !== id),\n );\n }, duration);\n timeoutsRef.current.add(handle);\n },\n [targetWindow],\n );\n\n const makeAnnouncement = useCallback(\n (\n message: string,\n assertiveness: \"polite\" | \"assertive\" = \"polite\",\n duration: number = ANNOUNCEMENT_TIME_IN_DOM,\n ) => {\n idCounterRef.current += 1;\n // Date.now() can collide when multiple announcements are created in the same millisecond\n // (e.g. tests with
|
|
1
|
+
{"version":3,"file":"AriaAnnouncerProvider.js","sources":["../src/aria-announcer/AriaAnnouncerProvider.tsx"],"sourcesContent":["import { useWindow } from \"@salt-ds/window\";\nimport {\n type ComponentPropsWithRef,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils/useIsomorphicLayoutEffect\";\nimport {\n type AnnounceFnOptions,\n AriaAnnouncerContext,\n} from \"./AriaAnnouncerContext\";\nimport { registerAnnouncementTarget } from \"./announcementRegistry\";\n\nexport const ANNOUNCEMENT_TIME_IN_DOM = 300; // time between DOM updates\n\nexport interface AriaAnnouncerProviderProps\n extends ComponentPropsWithRef<\"div\"> {\n /**\n * Optional target key used to route announcements to this provider.\n */\n target?: string;\n}\n\nconst AnnouncementRegion = forwardRef<\n HTMLDivElement,\n ComponentPropsWithRef<\"div\">\n>(function AnnouncementRegion(props, ref) {\n return (\n <div\n // Keep the region simple for maximum assistive-tech compatibility.\n // aria-live is applied by the caller (polite/assertive).\n aria-atomic={false}\n ref={ref}\n {...props}\n />\n );\n});\n\ntype AnnouncementMessage = {\n id: string;\n message: string;\n};\n\nexport const AriaAnnouncerProvider = forwardRef<\n HTMLDivElement,\n AriaAnnouncerProviderProps\n>(function AriaAnnouncerProvider({ children, style, target, ...rest }, ref) {\n const targetWindow = useWindow();\n\n const [politeAnnouncements, setPoliteAnnouncements] = useState<\n AnnouncementMessage[]\n >([]);\n const [assertiveAnnouncements, setAssertiveAnnouncements] = useState<\n AnnouncementMessage[]\n >([]);\n\n const idCounterRef = useRef(0);\n const isMountedRef = useRef(true);\n const timeoutsRef = useRef<Set<number>>(new Set());\n\n const scheduleRemoval = useCallback(\n (id: string, assertiveness: \"polite\" | \"assertive\", duration: number) => {\n if (!targetWindow) return;\n\n const setter =\n assertiveness === \"polite\"\n ? setPoliteAnnouncements\n : setAssertiveAnnouncements;\n const handle = targetWindow.setTimeout(() => {\n timeoutsRef.current.delete(handle);\n setter((previous) =>\n previous.filter((announcement) => announcement.id !== id),\n );\n }, duration);\n timeoutsRef.current.add(handle);\n },\n [targetWindow],\n );\n\n const makeAnnouncement = useCallback(\n (\n message: string,\n assertiveness: \"polite\" | \"assertive\" = \"polite\",\n duration: number = ANNOUNCEMENT_TIME_IN_DOM,\n ) => {\n if (!isMountedRef.current) return;\n\n idCounterRef.current += 1;\n // Date.now() can collide when multiple announcements are created in the same millisecond\n // (e.g. tests with fake timers, batching, or multiple announces during one tick).\n // Add a monotonic counter suffix to guarantee uniqueness.\n const id = `announce-${assertiveness}-${Date.now()}-${idCounterRef.current}`;\n if (assertiveness === \"polite\") {\n setPoliteAnnouncements((previous) => {\n return previous.concat({ id, message });\n });\n } else {\n setAssertiveAnnouncements((previous) => {\n return previous.concat({ id, message });\n });\n }\n scheduleRemoval(id, assertiveness, duration);\n },\n [scheduleRemoval],\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n const timeouts = timeoutsRef.current;\n return () => {\n for (const handle of timeouts) {\n targetWindow?.clearTimeout(handle);\n }\n timeouts.clear();\n };\n }, [targetWindow]);\n\n const announce = useCallback(\n (\n announcement: string,\n legacyDelayOrOptions: number | AnnounceFnOptions | undefined = {},\n ) => {\n // Legacy delay (number arg) is handled by useAriaAnnouncer; if we also delayed\n // here we'd apply it twice. Keep supporting the signature but ignore the delay.\n const options: AnnounceFnOptions =\n typeof legacyDelayOrOptions === \"object\" && legacyDelayOrOptions\n ? legacyDelayOrOptions\n : {};\n\n makeAnnouncement(\n announcement,\n options.ariaLive,\n options.duration ?? ANNOUNCEMENT_TIME_IN_DOM,\n );\n },\n [makeAnnouncement],\n );\n\n const value = useMemo(() => ({ announce }), [announce]);\n\n useIsomorphicLayoutEffect(() => {\n if (!target) {\n return;\n }\n return registerAnnouncementTarget(target, announce);\n }, [announce, target]);\n\n return (\n <AriaAnnouncerContext.Provider value={value}>\n {children}\n <div\n // hidden styling based on https://tailwindcss.com/docs/screen-readers\n style={{\n position: \"absolute\",\n height: 1,\n width: 1,\n padding: 0,\n margin: -1,\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n borderWidth: 0,\n ...style,\n }}\n {...rest}\n ref={ref}\n >\n <AnnouncementRegion aria-live=\"polite\">\n {politeAnnouncements.map((announcement) => (\n <div key={`polite-${announcement.id}`}>{announcement.message}</div>\n ))}\n </AnnouncementRegion>\n <AnnouncementRegion aria-live=\"assertive\">\n {assertiveAnnouncements.map((announcement) => (\n <div key={`assertive-${announcement.id}`}>\n {announcement.message}\n </div>\n ))}\n </AnnouncementRegion>\n </div>\n </AriaAnnouncerContext.Provider>\n );\n});\n"],"names":["AnnouncementRegion","AriaAnnouncerProvider"],"mappings":"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"}
|
package/dist-es/card/Card.css.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var css_248z = "/* Styles applied to the root element */\n.saltCard {\n border-width: var(--saltCard-borderWidth, var(--salt-size-fixed-100));\n border-style: var(--salt-borderStyle-solid);\n
|
|
1
|
+
var css_248z = "/* Styles applied to the root element */\n.saltCard {\n border-width: var(--saltCard-borderWidth, var(--salt-size-fixed-100));\n border-style: var(--salt-borderStyle-solid);\n border-color: var(--saltCard-borderColor, var(--card-borderColor));\n padding: var(--saltCard-padding, var(--card-padding));\n position: relative;\n transition: box-shadow var(--salt-duration-instant) ease-in-out;\n box-sizing: border-box;\n border-radius: var(--saltCard-borderRadius, var(--salt-palette-corner, 0));\n overflow: hidden;\n --card-accent-color: var(--salt-sentiment-accent-background);\n --card-borderColor: var(--salt-container-borderColor);\n --card-borderColor-strong: var(--salt-container-bold-borderColor);\n --card-borderColor-subtle: var(--salt-container-subtle-borderColor);\n --card-padding: var(--salt-spacing-200);\n}\n\n.saltCard.saltCard-sectioned {\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n@supports selector(:has(*)) {\n .saltCard:has(> .saltCardHeader, > .saltCardContent, > .saltCardFooter) {\n padding: 0;\n display: flex;\n flex-direction: column;\n }\n}\n\n.saltCard-primary {\n background: var(--saltCard-background, var(--salt-container-primary-background));\n}\n\n.saltCard-secondary {\n background: var(--saltCard-background, var(--salt-container-secondary-background));\n}\n\n.saltCard-tertiary {\n background: var(--saltCard-background, var(--salt-container-tertiary-background));\n}\n\n.saltCard-ghost {\n background: var(--saltCard-background, var(--salt-container-ghost-background));\n --card-borderColor: var(--salt-container-ghost-borderColor);\n --card-borderColor-strong: var(--salt-container-ghost-bold-borderColor);\n --card-borderColor-subtle: var(--salt-container-ghost-subtle-borderColor);\n}\n\n/* Styles applied when elevation=\"flat\" */\n.saltCard-flat {\n box-shadow: var(--saltCard-boxShadow-flat, none);\n}\n\n/* Styles applied when elevation=\"raised\" */\n.saltCard-raised {\n box-shadow: var(--saltCard-boxShadow, var(--salt-overlayable-shadow));\n}\n\n/* Styles applied when borderColor=\"strong\" */\n.saltCard-borderColorStrong {\n --card-borderColor: var(--card-borderColor-strong);\n}\n\n/* Styles applied when borderColor=\"subtle\" */\n.saltCard-borderColorSubtle {\n --card-borderColor: var(--card-borderColor-subtle);\n}\n\n/* Styles applied when borderColor=\"none\" */\n.saltCard-borderColorNone {\n --card-borderColor: transparent;\n}\n\n/* Styles applied to create accent */\n.saltCard-accent::after {\n content: \"\";\n position: absolute;\n background-color: var(--saltCard-accent-color, var(--card-accent-color));\n}\n\n/* Styles applied to Card if `accent=\"bottom\"` */\n.saltCard-accentBottom::after {\n left: calc(-1 * var(--salt-size-fixed-100));\n bottom: calc(-1 * var(--salt-size-fixed-100));\n height: var(--salt-size-bar);\n width: calc(100% + var(--salt-size-fixed-200));\n}\n\n/* Styles applied to Card if `accent=\"left\"` */\n.saltCard-accentLeft::after {\n left: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: calc(100% + var(--salt-size-fixed-200));\n width: var(--salt-size-bar);\n}\n\n/* Styles applied to Card if `accent=\"top\"` */\n.saltCard-accentTop::after {\n left: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: var(--salt-size-bar);\n width: calc(100% + var(--salt-size-fixed-200));\n}\n\n/* Styles applied to Card if `accent=\"right\"` */\n.saltCard-accentRight::after {\n right: calc(-1 * var(--salt-size-fixed-100));\n top: calc(-1 * var(--salt-size-fixed-100));\n height: calc(100% + var(--salt-size-fixed-200));\n width: var(--salt-size-bar);\n}\n\n/* Deprecated interactable styles. Use InteractableCard instead. */\n\n/* Styles applied if `interactable={true}` */\n.saltCard-interactable {\n display: block;\n transition: none;\n}\n\n/* Styles applied on hover if `interactable={true}` */\na:focus .saltCard-interactable,\n.saltCard-interactable:hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n cursor: var(--saltCard-cursor-hover, var(--salt-cursor-hover));\n border-color: var(--salt-actionable-accented-borderColor-hover);\n}\n\n/* Deprecated hoverable styles retained for backward compatibility. */\n@media (hover: hover) {\n .saltCard-hoverable:not(.saltCard-disabled):hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n border-color: var(--salt-actionable-accented-borderColor-hover);\n }\n}\n\n/* Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n border-color: var(--salt-actionable-accented-borderColor-active);\n box-shadow: var(--saltCard-boxShadow-active, var(--salt-overlayable-shadow-hover));\n outline: var(--salt-focused-outline);\n outline-offset: var(--salt-focused-outlineOffset);\n}\n\n/* Styles applied to disabled interactable states */\na:focus .saltCard-interactable.saltCard-disabled,\n.saltCard-interactable.saltCard-disabled:hover,\n.saltCard-interactable.saltCard-disabled:active {\n box-shadow: var(--saltCard-boxShadow-disabled, var(--salt-overlayable-shadow));\n}\n\n/* Styles applied if `disabled={true}` */\n.saltCard-disabled,\n.saltCard-disabled.saltCard-interactable,\na:focus .saltCard-interactable.saltCard-disabled {\n border-color: var(--salt-container-bold-borderColor-disabled);\n color: var(--saltCard-color-disabled, var(--salt-content-primary-foreground-disabled));\n cursor: var(--saltCard-cursor-disabled, var(--salt-cursor-disabled));\n outline: none;\n}\n\n/* Styles applied to nested divs if `disabled={true}` */\n.saltCard-disabled div {\n pointer-events: none;\n}\n";
|
|
2
2
|
|
|
3
3
|
export { css_248z as default };
|
|
4
4
|
//# sourceMappingURL=Card.css.js.map
|
package/dist-es/card/Card.js
CHANGED
|
@@ -17,9 +17,11 @@ const Card = forwardRef(
|
|
|
17
17
|
function Card2(props, ref) {
|
|
18
18
|
const {
|
|
19
19
|
accent,
|
|
20
|
+
borderColor,
|
|
20
21
|
children,
|
|
21
22
|
className,
|
|
22
23
|
disabled,
|
|
24
|
+
elevation = "raised",
|
|
23
25
|
interactable,
|
|
24
26
|
hoverable,
|
|
25
27
|
variant = "primary",
|
|
@@ -38,9 +40,11 @@ const Card = forwardRef(
|
|
|
38
40
|
className: clsx(
|
|
39
41
|
withBaseName(),
|
|
40
42
|
withBaseName(variant),
|
|
43
|
+
borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),
|
|
41
44
|
{
|
|
42
45
|
[withBaseName("accent")]: accent,
|
|
43
46
|
[withBaseName(`accent${capitalize(accent || "")}`)]: accent,
|
|
47
|
+
[withBaseName(elevation || "")]: elevation,
|
|
44
48
|
[withBaseName("hoverable")]: hoverable,
|
|
45
49
|
/* **Deprecated:** InteractableCard should be used instead for these features */
|
|
46
50
|
[withBaseName("disabled")]: disabled,
|
package/dist-es/card/Card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.js","sources":["../src/card/Card.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport cardCss from \"./Card.css\";\nimport { hasCardSection } from \"./hasCardSection\";\n\nconst withBaseName = makePrefixer(\"saltCard\");\nexport interface CardProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true` the card will have hover styling.\n */\n hoverable?: boolean;\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, interactive styles will be applied to `Card`. These styles give prominence to certain content\n * on the page.\n */\n interactable?: boolean;\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\" | \"ghost\";\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n function Card(props, ref) {\n const {\n accent,\n children,\n className,\n disabled,\n interactable,\n hoverable,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-card\",\n css: cardCss,\n window: targetWindow,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent || \"\")}`)]: accent,\n [withBaseName(\"hoverable\")]: hoverable,\n /* **Deprecated:** InteractableCard should be used instead for these features */\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"interactable\")]: interactable,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["Card","cardCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../src/card/Card.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport cardCss from \"./Card.css\";\nimport { hasCardSection } from \"./hasCardSection\";\n\nconst withBaseName = makePrefixer(\"saltCard\");\nexport interface CardProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * Visual elevation.\n */\n elevation?: \"flat\" | \"raised\";\n /**\n * Border color strength.\n */\n borderColor?: \"strong\" | \"subtle\" | \"none\";\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * @deprecated since 1.71.0. Use `LinkCard` or `InteractableCard` when the entire card is interactive.\n *\n * If `true` the card will have hover styling.\n */\n hoverable?: boolean;\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, interactive styles will be applied to `Card`. These styles give prominence to certain content\n * on the page.\n */\n interactable?: boolean;\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\" | \"ghost\";\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n function Card(props, ref) {\n const {\n accent,\n borderColor,\n children,\n className,\n disabled,\n elevation = \"raised\",\n interactable,\n hoverable,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-card\",\n css: cardCss,\n window: targetWindow,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent || \"\")}`)]: accent,\n [withBaseName(elevation || \"\")]: elevation,\n [withBaseName(\"hoverable\")]: hoverable,\n /* **Deprecated:** InteractableCard should be used instead for these features */\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"interactable\")]: interactable,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n {children}\n </div>\n );\n },\n);\n"],"names":["Card","cardCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA;AAuCrC,MAAM,IAAA,GAAO,UAAA;AAAA,EAClB,SAASA,KAAAA,CAAK,KAAA,EAAO,GAAA,EAAK;AACxB,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,GAAY,QAAA;AAAA,MACZ,YAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,WAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB,eAAe,YAAA,CAAa,CAAA,WAAA,EAAc,UAAA,CAAW,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,UACnE;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAAS,UAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,SAAA,IAAa,EAAE,CAAC,GAAG,SAAA;AAAA,YACjC,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,SAAA;AAAA;AAAA,YAE7B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,cAAc,CAAC,GAAG,YAAA;AAAA,YAChC,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var css_248z = "/* Styles applied to Drawer component */\n.saltDrawer {\n background: var(--drawer-background);\n display: flex;\n flex-direction: column;\n max-height: 100%;\n max-width: 100%;\n overflow: auto;\n padding: var(--salt-spacing-300);\n box-shadow: var(--salt-overlayable-shadow-modal);\n z-index: var(--salt-zIndex-drawer);\n position: fixed;\n top: 0;\n box-sizing: border-box;\n}\n\n/* Styles applied when variant = \"primary\" */\n.saltDrawer-primary {\n --drawer-background: var(--salt-container-primary-background);\n}\n\n/* Styles applied when variant = \"secondary\" */\n.saltDrawer-secondary {\n --drawer-background: var(--salt-container-secondary-background);\n}\n\n/* Styles applied when variant = \"tertiary\" */\n.saltDrawer-tertiary {\n --drawer-background: var(--salt-container-tertiary-background);\n}\n\n/* Styles applied when position = \"top\" */\n.saltDrawer-top {\n left: 0;\n right: 0;\n bottom: auto;\n}\n\n/* Styles applied when position = \"top\" and the component mounts */\n.saltDrawer-top.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-bottom);\n}\n\n/* Styles applied when position = \"top\" and the component unmounts */\n.saltDrawer-top.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-bottom);\n}\n\n/* Styles applied when position = \"right\" */\n.saltDrawer-right {\n left: auto;\n right: 0;\n height: 100%;\n}\n\n/* Styles applied when position = \"right\" and the component mounts */\n.saltDrawer-right.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-right);\n}\n\n/* Styles applied when position = \"right\" and the component unmounts */\n.saltDrawer-right.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-right);\n}\n\n/* Styles applied when position = \"left\" */\n.saltDrawer-left {\n left: 0;\n right: auto;\n height: 100%;\n}\n\n/* Styles applied when position = \"left\" and the component mounts */\n.saltDrawer-left.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-left);\n}\n\n/* Styles applied when position = \"left\" and the component unmounts */\n.saltDrawer-left.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-left);\n}\n\n/* Styles applied when position = \"bottom\" */\n.saltDrawer-bottom {\n left: 0;\n right: 0;\n bottom: 0;\n top: auto;\n}\n\n/* Styles applied when position = \"bottom\" and the component mounts */\n.saltDrawer-bottom.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-top);\n}\n\n/* Styles applied when position = \"bottom\" and the component unmounts */\n.saltDrawer-bottom.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-top);\n}\n";
|
|
1
|
+
var css_248z = "/* Styles applied to Drawer component */\n.saltDrawer {\n background: var(--drawer-background);\n display: flex;\n flex-direction: column;\n max-height: 100%;\n max-width: 100%;\n overflow: auto;\n /* Legacy padding for unsectioned drawers only. */\n padding: var(--salt-spacing-300);\n box-shadow: var(--salt-overlayable-shadow-modal);\n z-index: var(--salt-zIndex-drawer);\n position: fixed;\n top: 0;\n box-sizing: border-box;\n}\n\n.saltDrawer.saltDrawer-sectioned {\n padding: 0;\n}\n\n@supports selector(:has(*)) {\n .saltDrawer:has(> .saltDrawerHeader, > .saltDrawerContent, > .saltDrawerFooter) {\n padding: 0;\n }\n}\n\n/* Styles applied when variant = \"primary\" */\n.saltDrawer-primary {\n --drawer-background: var(--salt-container-primary-background);\n}\n\n/* Styles applied when variant = \"secondary\" */\n.saltDrawer-secondary {\n --drawer-background: var(--salt-container-secondary-background);\n}\n\n/* Styles applied when variant = \"tertiary\" */\n.saltDrawer-tertiary {\n --drawer-background: var(--salt-container-tertiary-background);\n}\n\n/* Styles applied when position = \"top\" */\n.saltDrawer-top {\n left: 0;\n right: 0;\n bottom: auto;\n}\n\n/* Styles applied when position = \"top\" and the component mounts */\n.saltDrawer-top.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-bottom);\n}\n\n/* Styles applied when position = \"top\" and the component unmounts */\n.saltDrawer-top.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-bottom);\n}\n\n/* Styles applied when position = \"right\" */\n.saltDrawer-right {\n left: auto;\n right: 0;\n height: 100%;\n}\n\n/* Styles applied when position = \"right\" and the component mounts */\n.saltDrawer-right.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-right);\n}\n\n/* Styles applied when position = \"right\" and the component unmounts */\n.saltDrawer-right.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-right);\n}\n\n/* Styles applied when position = \"left\" */\n.saltDrawer-left {\n left: 0;\n right: auto;\n height: 100%;\n}\n\n/* Styles applied when position = \"left\" and the component mounts */\n.saltDrawer-left.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-left);\n}\n\n/* Styles applied when position = \"left\" and the component unmounts */\n.saltDrawer-left.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-left);\n}\n\n/* Styles applied when position = \"bottom\" */\n.saltDrawer-bottom {\n left: 0;\n right: 0;\n bottom: 0;\n top: auto;\n}\n\n/* Styles applied when position = \"bottom\" and the component mounts */\n.saltDrawer-bottom.saltDrawer-enterAnimation {\n animation: var(--salt-animation-slide-in-top);\n}\n\n/* Styles applied when position = \"bottom\" and the component unmounts */\n.saltDrawer-bottom.saltDrawer-exitAnimation {\n animation: var(--salt-animation-slide-out-top);\n}\n";
|
|
2
2
|
|
|
3
3
|
export { css_248z as default };
|
|
4
4
|
//# sourceMappingURL=Drawer.css.js.map
|
package/dist-es/drawer/Drawer.js
CHANGED
|
@@ -3,15 +3,17 @@ import { useInteractions, useClick, useDismiss } from '@floating-ui/react';
|
|
|
3
3
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
4
|
import { useWindow } from '@salt-ds/window';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
6
|
-
import { forwardRef, useState, useEffect } from 'react';
|
|
6
|
+
import { forwardRef, useState, useEffect, useMemo } from 'react';
|
|
7
7
|
import { Scrim } from '../scrim/Scrim.js';
|
|
8
8
|
import { makePrefixer } from '../utils/makePrefixer.js';
|
|
9
9
|
import { useFloatingComponent, useFloatingUI } from '../utils/useFloatingUI/useFloatingUI.js';
|
|
10
10
|
import { useForkRef } from '../utils/useForkRef.js';
|
|
11
|
-
import '../utils/useId.js';
|
|
11
|
+
import { useId } from '../utils/useId.js';
|
|
12
12
|
import '../salt-provider/SaltProvider.js';
|
|
13
13
|
import '../viewport/ViewportProvider.js';
|
|
14
14
|
import css_248z from './Drawer.css.js';
|
|
15
|
+
import { DrawerContext } from './DrawerContext.js';
|
|
16
|
+
import { hasDrawerSection } from './hasDrawerSection.js';
|
|
15
17
|
|
|
16
18
|
const ConditionalScrimWrapper = ({
|
|
17
19
|
condition,
|
|
@@ -40,6 +42,9 @@ const Drawer = forwardRef(
|
|
|
40
42
|
disableDismiss,
|
|
41
43
|
disableScrim,
|
|
42
44
|
initialFocus,
|
|
45
|
+
id,
|
|
46
|
+
"aria-labelledby": ariaLabelledBy,
|
|
47
|
+
"aria-describedby": ariaDescribedBy,
|
|
43
48
|
...rest
|
|
44
49
|
} = props;
|
|
45
50
|
const targetWindow = useWindow();
|
|
@@ -48,7 +53,13 @@ const Drawer = forwardRef(
|
|
|
48
53
|
css: css_248z,
|
|
49
54
|
window: targetWindow
|
|
50
55
|
});
|
|
56
|
+
const drawerId = useId(id);
|
|
57
|
+
const sectioned = hasDrawerSection(children);
|
|
51
58
|
const [showComponent, setShowComponent] = useState(false);
|
|
59
|
+
const [headerId, setHeaderId] = useState(void 0);
|
|
60
|
+
const [descriptionId, setDescriptionId] = useState(
|
|
61
|
+
void 0
|
|
62
|
+
);
|
|
52
63
|
const { Component: FloatingComponent } = useFloatingComponent();
|
|
53
64
|
const { context, floating, elements } = useFloatingUI({
|
|
54
65
|
open: showComponent,
|
|
@@ -56,7 +67,7 @@ const Drawer = forwardRef(
|
|
|
56
67
|
});
|
|
57
68
|
const { getFloatingProps } = useInteractions([
|
|
58
69
|
useClick(context),
|
|
59
|
-
useDismiss(context, {
|
|
70
|
+
useDismiss(context, { outsidePress: !disableDismiss })
|
|
60
71
|
]);
|
|
61
72
|
const handleRef = useForkRef(floating, ref);
|
|
62
73
|
useEffect(() => {
|
|
@@ -70,15 +81,28 @@ const Drawer = forwardRef(
|
|
|
70
81
|
return () => clearTimeout(animate);
|
|
71
82
|
}
|
|
72
83
|
}, [open, showComponent]);
|
|
73
|
-
|
|
84
|
+
const contextValue = useMemo(
|
|
85
|
+
() => ({
|
|
86
|
+
drawerId,
|
|
87
|
+
headerId,
|
|
88
|
+
setHeaderId,
|
|
89
|
+
descriptionId,
|
|
90
|
+
setDescriptionId
|
|
91
|
+
}),
|
|
92
|
+
[drawerId, headerId, descriptionId]
|
|
93
|
+
);
|
|
94
|
+
return /* @__PURE__ */ jsx(DrawerContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(ConditionalScrimWrapper, { condition: showComponent && !disableScrim, children: /* @__PURE__ */ jsx(
|
|
74
95
|
FloatingComponent,
|
|
75
96
|
{
|
|
97
|
+
id: drawerId,
|
|
76
98
|
open: showComponent,
|
|
77
99
|
ref: handleRef,
|
|
78
100
|
role: "dialog",
|
|
79
101
|
width: (_a = elements.floating) == null ? void 0 : _a.offsetWidth,
|
|
80
102
|
height: (_b = elements.floating) == null ? void 0 : _b.offsetHeight,
|
|
81
103
|
"aria-modal": "true",
|
|
104
|
+
"aria-labelledby": clsx(ariaLabelledBy, headerId) || void 0,
|
|
105
|
+
"aria-describedby": clsx(ariaDescribedBy, descriptionId) || void 0,
|
|
82
106
|
focusManagerProps: {
|
|
83
107
|
context,
|
|
84
108
|
initialFocus,
|
|
@@ -90,7 +114,8 @@ const Drawer = forwardRef(
|
|
|
90
114
|
{
|
|
91
115
|
[withBaseName("enterAnimation")]: open,
|
|
92
116
|
[withBaseName("exitAnimation")]: !open,
|
|
93
|
-
[withBaseName(variant)]: variant
|
|
117
|
+
[withBaseName(variant)]: variant,
|
|
118
|
+
[withBaseName("sectioned")]: sectioned
|
|
94
119
|
},
|
|
95
120
|
className
|
|
96
121
|
),
|
|
@@ -98,7 +123,7 @@ const Drawer = forwardRef(
|
|
|
98
123
|
...rest,
|
|
99
124
|
children
|
|
100
125
|
}
|
|
101
|
-
) });
|
|
126
|
+
) }) });
|
|
102
127
|
}
|
|
103
128
|
);
|
|
104
129
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Drawer.js","sources":["../src/drawer/Drawer.tsx"],"sourcesContent":["import {\n type FloatingFocusManager,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type PropsWithChildren,\n useEffect,\n useState,\n} from \"react\";\nimport { Scrim } from \"../scrim\";\nimport {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n} from \"../utils\";\nimport drawerCss from \"./Drawer.css\";\n\ninterface ConditionalScrimWrapperProps extends PropsWithChildren {\n condition: boolean;\n}\n\nconst ConditionalScrimWrapper = ({\n condition,\n children,\n}: ConditionalScrimWrapperProps) => {\n return condition ? <Scrim fixed> {children} </Scrim> : <>{children} </>;\n};\n\nexport interface DrawerProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Defines the drawer position within the screen. Defaults to `left`.\n */\n position?: \"left\" | \"top\" | \"right\" | \"bottom\";\n /**\n * Display or hide the component.\n */\n open?: boolean;\n /**\n * Callback function triggered when open state changes.\n */\n onOpenChange?: (newOpen: boolean) => void;\n /**\n * Change background color palette\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n /**\n * Prevent the
|
|
1
|
+
{"version":3,"file":"Drawer.js","sources":["../src/drawer/Drawer.tsx"],"sourcesContent":["import {\n type FloatingFocusManager,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type PropsWithChildren,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { Scrim } from \"../scrim\";\nimport {\n makePrefixer,\n useFloatingComponent,\n useFloatingUI,\n useForkRef,\n useId,\n} from \"../utils\";\nimport drawerCss from \"./Drawer.css\";\nimport { DrawerContext } from \"./DrawerContext\";\nimport { hasDrawerSection } from \"./hasDrawerSection\";\n\ninterface ConditionalScrimWrapperProps extends PropsWithChildren {\n condition: boolean;\n}\n\nconst ConditionalScrimWrapper = ({\n condition,\n children,\n}: ConditionalScrimWrapperProps) => {\n return condition ? <Scrim fixed> {children} </Scrim> : <>{children} </>;\n};\n\nexport interface DrawerProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Defines the drawer position within the screen. Defaults to `left`.\n */\n position?: \"left\" | \"top\" | \"right\" | \"bottom\";\n /**\n * Display or hide the component.\n */\n open?: boolean;\n /**\n * Callback function triggered when open state changes.\n */\n onOpenChange?: (newOpen: boolean) => void;\n /**\n * Change background color palette\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n /**\n * Prevent the drawer closing on click away\n * */\n disableDismiss?: boolean;\n /**\n * Prevent Scrim from rendering\n * */\n disableScrim?: boolean;\n /**\n * Which element to initially focus. Can be either a number (tabbable index as specified by the order) or a ref.\n * Default value is 0 (first tabbable element).\n * */\n initialFocus?: ComponentPropsWithoutRef<\n typeof FloatingFocusManager\n >[\"initialFocus\"];\n}\n\nconst withBaseName = makePrefixer(\"saltDrawer\");\n\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(\n function Drawer(props, ref) {\n const {\n children,\n className,\n position = \"left\",\n open = false,\n onOpenChange,\n variant = \"primary\",\n disableDismiss,\n disableScrim,\n initialFocus,\n id,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-drawer\",\n css: drawerCss,\n window: targetWindow,\n });\n\n const drawerId = useId(id);\n\n const sectioned = hasDrawerSection(children);\n\n const [showComponent, setShowComponent] = useState(false);\n const [headerId, setHeaderId] = useState<string | undefined>(undefined);\n const [descriptionId, setDescriptionId] = useState<string | undefined>(\n undefined,\n );\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const { context, floating, elements } = useFloatingUI({\n open: showComponent,\n onOpenChange,\n });\n\n const { getFloatingProps } = useInteractions([\n useClick(context),\n useDismiss(context, { outsidePress: !disableDismiss }),\n ]);\n\n const handleRef = useForkRef<HTMLDivElement>(floating, ref);\n\n useEffect(() => {\n if (open && !showComponent) {\n setShowComponent(true);\n }\n\n if (!open && showComponent) {\n const animate = setTimeout(() => {\n setShowComponent(false);\n }, 300); // var(--salt-duration-perceptible)\n return () => clearTimeout(animate);\n }\n }, [open, showComponent]);\n\n const contextValue = useMemo(\n () => ({\n drawerId,\n headerId,\n setHeaderId,\n descriptionId,\n setDescriptionId,\n }),\n [drawerId, headerId, descriptionId],\n );\n\n return (\n <DrawerContext.Provider value={contextValue}>\n <ConditionalScrimWrapper condition={showComponent && !disableScrim}>\n <FloatingComponent\n id={drawerId}\n open={showComponent}\n ref={handleRef}\n role={\"dialog\"}\n width={elements.floating?.offsetWidth}\n height={elements.floating?.offsetHeight}\n aria-modal=\"true\"\n aria-labelledby={clsx(ariaLabelledBy, headerId) || undefined}\n aria-describedby={clsx(ariaDescribedBy, descriptionId) || undefined}\n focusManagerProps={{\n context: context,\n initialFocus,\n outsideElementsInert: true,\n }}\n className={clsx(\n withBaseName(),\n withBaseName(position),\n {\n [withBaseName(\"enterAnimation\")]: open,\n [withBaseName(\"exitAnimation\")]: !open,\n [withBaseName(variant)]: variant,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n {...getFloatingProps()}\n {...rest}\n >\n {children}\n </FloatingComponent>\n </ConditionalScrimWrapper>\n </DrawerContext.Provider>\n );\n },\n);\n"],"names":["Drawer","drawerCss"],"mappings":";;;;;;;;;;;;;;;;;AAiCA,MAAM,0BAA0B,CAAC;AAAA,EAC/B,SAAA;AAAA,EACA;AACF,CAAA,KAAoC;AAClC,EAAA,OAAO,SAAA,mBAAY,IAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAK,IAAA,EAAC,QAAA,EAAA;AAAA,IAAA,GAAA;AAAA,IAAE,QAAA;AAAA,IAAS;AAAA,GAAA,EAAC,oBAAW,IAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IAAS;AAAA,GAAA,EAAC,CAAA;AACtE,CAAA;AAoCA,MAAM,YAAA,GAAe,aAAa,YAAY,CAAA;AAEvC,MAAM,MAAA,GAAS,UAAA;AAAA,EACpB,SAASA,OAAAA,CAAO,KAAA,EAAO,GAAA,EAAK;AA7E9B,IAAA,IAAA,EAAA,EAAA,EAAA;AA8EI,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,GAAW,MAAA;AAAA,MACX,IAAA,GAAO,KAAA;AAAA,MACP,YAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,cAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,EAAA;AAAA,MACA,iBAAA,EAAmB,cAAA;AAAA,MACnB,kBAAA,EAAoB,eAAA;AAAA,MACpB,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,aAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,MAAM,EAAE,CAAA;AAEzB,IAAA,MAAM,SAAA,GAAY,iBAAiB,QAAQ,CAAA;AAE3C,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAA6B,MAAS,CAAA;AACtE,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,MACxC;AAAA,KACF;AACA,IAAA,MAAM,EAAE,SAAA,EAAW,iBAAA,EAAkB,GAAI,oBAAA,EAAqB;AAE9D,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,QAAA,KAAa,aAAA,CAAc;AAAA,MACpD,IAAA,EAAM,aAAA;AAAA,MACN;AAAA,KACD,CAAA;AAED,IAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,eAAA,CAAgB;AAAA,MAC3C,SAAS,OAAO,CAAA;AAAA,MAChB,WAAW,OAAA,EAAS,EAAE,YAAA,EAAc,CAAC,gBAAgB;AAAA,KACtD,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,UAAA,CAA2B,QAAA,EAAU,GAAG,CAAA;AAE1D,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,IAAA,IAAQ,CAAC,aAAA,EAAe;AAC1B,QAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACvB;AAEA,MAAA,IAAI,CAAC,QAAQ,aAAA,EAAe;AAC1B,QAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,UAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,QACxB,GAAG,GAAG,CAAA;AACN,QAAA,OAAO,MAAM,aAAa,OAAO,CAAA;AAAA,MACnC;AAAA,IACF,CAAA,EAAG,CAAC,IAAA,EAAM,aAAa,CAAC,CAAA;AAExB,IAAA,MAAM,YAAA,GAAe,OAAA;AAAA,MACnB,OAAO;AAAA,QACL,QAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,QAAA,EAAU,aAAa;AAAA,KACpC;AAEA,IAAA,uBACE,GAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,YAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,uBAAA,EAAA,EAAwB,SAAA,EAAW,aAAA,IAAiB,CAAC,YAAA,EACpD,QAAA,kBAAA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,aAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAA,CAAO,EAAA,GAAA,QAAA,CAAS,QAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,WAAA;AAAA,QAC1B,MAAA,EAAA,CAAQ,EAAA,GAAA,QAAA,CAAS,QAAA,KAAT,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmB,YAAA;AAAA,QAC3B,YAAA,EAAW,MAAA;AAAA,QACX,iBAAA,EAAiB,IAAA,CAAK,cAAA,EAAgB,QAAQ,CAAA,IAAK,MAAA;AAAA,QACnD,kBAAA,EAAkB,IAAA,CAAK,eAAA,EAAiB,aAAa,CAAA,IAAK,MAAA;AAAA,QAC1D,iBAAA,EAAmB;AAAA,UACjB,OAAA;AAAA,UACA,YAAA;AAAA,UACA,oBAAA,EAAsB;AAAA,SACxB;AAAA,QACA,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,QAAQ,CAAA;AAAA,UACrB;AAAA,YACE,CAAC,YAAA,CAAa,gBAAgB,CAAC,GAAG,IAAA;AAAA,YAClC,CAAC,YAAA,CAAa,eAAe,CAAC,GAAG,CAAC,IAAA;AAAA,YAClC,CAAC,YAAA,CAAa,OAAO,CAAC,GAAG,OAAA;AAAA,YACzB,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,gBAAA,EAAiB;AAAA,QACpB,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,OAEL,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrawerCloseButton.js","sources":["../src/drawer/DrawerCloseButton.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { Button, type ButtonProps } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer } from \"../utils\";\n\nimport drawerCloseButtonCss from \"./DrawerCloseButton.css\";\n\nconst withBaseName = makePrefixer(\"saltDrawerCloseButton\");\n\nexport const DrawerCloseButton = forwardRef<HTMLButtonElement, ButtonProps>(\n function DrawerCloseButton({ className, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-drawer-close-button\",\n css: drawerCloseButtonCss,\n window: targetWindow,\n });\n const { CloseIcon } = useIcon();\n\n return (\n <div className={withBaseName(\"container\")}>\n <Button\n ref={ref}\n aria-label=\"Close
|
|
1
|
+
{"version":3,"file":"DrawerCloseButton.js","sources":["../src/drawer/DrawerCloseButton.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { Button, type ButtonProps } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer } from \"../utils\";\n\nimport drawerCloseButtonCss from \"./DrawerCloseButton.css\";\n\nconst withBaseName = makePrefixer(\"saltDrawerCloseButton\");\n\n/**\n * @deprecated since 1.71.0. Use `Button` in `DrawerHeader`'s `actions` instead.\n */\nexport const DrawerCloseButton = forwardRef<HTMLButtonElement, ButtonProps>(\n function DrawerCloseButton({ className, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-drawer-close-button\",\n css: drawerCloseButtonCss,\n window: targetWindow,\n });\n const { CloseIcon } = useIcon();\n\n return (\n <div className={withBaseName(\"container\")}>\n <Button\n ref={ref}\n aria-label=\"Close drawer\"\n appearance=\"transparent\"\n className={clsx(withBaseName(), className)}\n {...rest}\n >\n <CloseIcon aria-hidden />\n </Button>\n </div>\n );\n },\n);\n"],"names":["DrawerCloseButton","drawerCloseButtonCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,uBAAuB,CAAA;AAKlD,MAAM,iBAAA,GAAoB,UAAA;AAAA,EAC/B,SAASA,kBAAAA,CAAkB,EAAE,WAAW,GAAG,IAAA,IAAQ,GAAA,EAAK;AACtD,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,0BAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,EAAQ;AAE9B,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,WAAW,CAAA,EACtC,QAAA,kBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,YAAA,EAAW,cAAA;AAAA,QACX,UAAA,EAAW,aAAA;AAAA,QACX,SAAA,EAAW,IAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACxC,GAAG,IAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,aAAA,EAAW,IAAA,EAAC;AAAA;AAAA,KACzB,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var css_248z = ".saltDrawerContent {\n color: var(--salt-content-primary-foreground);\n padding: 0 var(--salt-spacing-300);\n flex: 1 1 auto;\n min-height: var(--salt-text-lineHeight);\n display: flex;\n box-sizing: border-box;\n}\n\n.saltDrawerContent:first-child {\n padding-top: var(--salt-spacing-300);\n}\n\n.saltDrawerContent:last-child {\n padding-bottom: var(--salt-spacing-300);\n}\n\n.saltDrawerContent-inner {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) transparent;\n border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) transparent;\n box-sizing: border-box;\n}\n\n.saltDrawerContent-inner:focus-visible {\n outline: var(--salt-focused-outline);\n outline-offset: calc(-1 * var(--salt-focused-outlineWidth));\n}\n\n.saltDrawerContent-inner.saltDrawerContent-scrollTop {\n border-top-color: var(--salt-separable-tertiary-borderColor);\n}\n\n.saltDrawerContent-inner.saltDrawerContent-scrollBottom {\n border-bottom-color: var(--salt-separable-tertiary-borderColor);\n}\n";
|
|
2
|
+
|
|
3
|
+
export { css_248z as default };
|
|
4
|
+
//# sourceMappingURL=DrawerContent.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerContent.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
3
|
+
import { useWindow } from '@salt-ds/window';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { forwardRef, useRef, useState, useCallback } from 'react';
|
|
6
|
+
import { makePrefixer } from '../utils/makePrefixer.js';
|
|
7
|
+
import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
|
|
8
|
+
import '../utils/useFloatingUI/useFloatingUI.js';
|
|
9
|
+
import '../utils/useId.js';
|
|
10
|
+
import { useResizeObserver } from '../utils/useResizeObserver.js';
|
|
11
|
+
import '../salt-provider/SaltProvider.js';
|
|
12
|
+
import '../viewport/ViewportProvider.js';
|
|
13
|
+
import css_248z from './DrawerContent.css.js';
|
|
14
|
+
import { useDrawerContext } from './DrawerContext.js';
|
|
15
|
+
|
|
16
|
+
const withBaseName = makePrefixer("saltDrawerContent");
|
|
17
|
+
const DrawerContent = forwardRef(
|
|
18
|
+
function DrawerContent2(props, ref) {
|
|
19
|
+
const { children, className, onScroll, onScrollCapture, ...rest } = props;
|
|
20
|
+
const targetWindow = useWindow();
|
|
21
|
+
useComponentCssInjection({
|
|
22
|
+
testId: "salt-drawer-content",
|
|
23
|
+
css: css_248z,
|
|
24
|
+
window: targetWindow
|
|
25
|
+
});
|
|
26
|
+
const { drawerId, headerId } = useDrawerContext();
|
|
27
|
+
const scrollRef = useRef(null);
|
|
28
|
+
const [isOverflowing, setIsOverflowing] = useState(false);
|
|
29
|
+
const [canScrollUp, setCanScrollUp] = useState(false);
|
|
30
|
+
const [canScrollDown, setCanScrollDown] = useState(false);
|
|
31
|
+
const readScrollPosition = useCallback(() => {
|
|
32
|
+
const container = scrollRef.current;
|
|
33
|
+
if (!container) return;
|
|
34
|
+
const overflowingY = container.scrollHeight > container.clientHeight;
|
|
35
|
+
setIsOverflowing(
|
|
36
|
+
overflowingY || container.scrollWidth > container.clientWidth
|
|
37
|
+
);
|
|
38
|
+
setCanScrollUp(overflowingY && container.scrollTop > 0);
|
|
39
|
+
setCanScrollDown(
|
|
40
|
+
overflowingY && container.scrollHeight - container.scrollTop - container.clientHeight > 1
|
|
41
|
+
);
|
|
42
|
+
}, []);
|
|
43
|
+
const handleScrollCapture = (event) => {
|
|
44
|
+
targetWindow == null ? void 0 : targetWindow.requestAnimationFrame(readScrollPosition);
|
|
45
|
+
onScrollCapture == null ? void 0 : onScrollCapture(event);
|
|
46
|
+
};
|
|
47
|
+
useResizeObserver({ ref: scrollRef, onResize: readScrollPosition });
|
|
48
|
+
useIsomorphicLayoutEffect(() => {
|
|
49
|
+
readScrollPosition();
|
|
50
|
+
}, [readScrollPosition]);
|
|
51
|
+
return /* @__PURE__ */ jsx("div", { ref, className: clsx(withBaseName(), className), ...rest, children: /* @__PURE__ */ jsx(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
ref: scrollRef,
|
|
55
|
+
className: clsx(withBaseName("inner"), {
|
|
56
|
+
[withBaseName("scrollTop")]: canScrollUp,
|
|
57
|
+
[withBaseName("scrollBottom")]: canScrollDown
|
|
58
|
+
}),
|
|
59
|
+
onScroll,
|
|
60
|
+
onScrollCapture: handleScrollCapture,
|
|
61
|
+
...isOverflowing && {
|
|
62
|
+
tabIndex: 0,
|
|
63
|
+
role: "region",
|
|
64
|
+
"aria-labelledby": headerId ?? drawerId
|
|
65
|
+
},
|
|
66
|
+
children
|
|
67
|
+
}
|
|
68
|
+
) });
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
export { DrawerContent };
|
|
73
|
+
//# sourceMappingURL=DrawerContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerContent.js","sources":["../src/drawer/DrawerContent.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n forwardRef,\n type UIEventHandler,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n makePrefixer,\n useIsomorphicLayoutEffect,\n useResizeObserver,\n} from \"../utils\";\nimport drawerContentCss from \"./DrawerContent.css\";\nimport { useDrawerContext } from \"./DrawerContext\";\n\nconst withBaseName = makePrefixer(\"saltDrawerContent\");\n\nexport type DrawerContentProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const DrawerContent = forwardRef<HTMLDivElement, DrawerContentProps>(\n function DrawerContent(props, ref) {\n const { children, className, onScroll, onScrollCapture, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-drawer-content\",\n css: drawerContentCss,\n window: targetWindow,\n });\n\n const { drawerId, headerId } = useDrawerContext();\n\n const scrollRef = useRef<HTMLDivElement>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [canScrollUp, setCanScrollUp] = useState(false);\n const [canScrollDown, setCanScrollDown] = useState(false);\n\n const readScrollPosition = useCallback(() => {\n const container = scrollRef.current;\n if (!container) return;\n\n const overflowingY = container.scrollHeight > container.clientHeight;\n setIsOverflowing(\n overflowingY || container.scrollWidth > container.clientWidth,\n );\n setCanScrollUp(overflowingY && container.scrollTop > 0);\n setCanScrollDown(\n overflowingY &&\n container.scrollHeight -\n container.scrollTop -\n container.clientHeight >\n 1,\n );\n }, []);\n\n const handleScrollCapture: UIEventHandler<HTMLDivElement> = (event) => {\n targetWindow?.requestAnimationFrame(readScrollPosition);\n onScrollCapture?.(event);\n };\n\n useResizeObserver({ ref: scrollRef, onResize: readScrollPosition });\n\n useIsomorphicLayoutEffect(() => {\n readScrollPosition();\n }, [readScrollPosition]);\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n <div\n ref={scrollRef}\n className={clsx(withBaseName(\"inner\"), {\n [withBaseName(\"scrollTop\")]: canScrollUp,\n [withBaseName(\"scrollBottom\")]: canScrollDown,\n })}\n onScroll={onScroll}\n onScrollCapture={handleScrollCapture}\n {...(isOverflowing && {\n tabIndex: 0,\n role: \"region\",\n \"aria-labelledby\": headerId ?? drawerId,\n })}\n >\n {children}\n </div>\n </div>\n );\n },\n);\n"],"names":["DrawerContent","drawerContentCss"],"mappings":";;;;;;;;;;;;;;;AAmBA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA;AAI9C,MAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,SAASA,cAAAA,CAAc,KAAA,EAAO,GAAA,EAAK;AACjC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,UAAU,eAAA,EAAiB,GAAG,MAAK,GAAI,KAAA;AAEpE,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,qBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,gBAAA,EAAiB;AAEhD,IAAA,MAAM,SAAA,GAAY,OAAuB,IAAI,CAAA;AAC7C,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AAExD,IAAA,MAAM,kBAAA,GAAqB,YAAY,MAAM;AAC3C,MAAA,MAAM,YAAY,SAAA,CAAU,OAAA;AAC5B,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,YAAA,GAAe,SAAA,CAAU,YAAA;AACxD,MAAA,gBAAA;AAAA,QACE,YAAA,IAAgB,SAAA,CAAU,WAAA,GAAc,SAAA,CAAU;AAAA,OACpD;AACA,MAAA,cAAA,CAAe,YAAA,IAAgB,SAAA,CAAU,SAAA,GAAY,CAAC,CAAA;AACtD,MAAA,gBAAA;AAAA,QACE,gBACE,SAAA,CAAU,YAAA,GACR,SAAA,CAAU,SAAA,GACV,UAAU,YAAA,GACV;AAAA,OACN;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,mBAAA,GAAsD,CAAC,KAAA,KAAU;AACrE,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,qBAAA,CAAsB,kBAAA,CAAA;AACpC,MAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAkB,KAAA,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,iBAAA,CAAkB,EAAE,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,oBAAoB,CAAA;AAElE,IAAA,yBAAA,CAA0B,MAAM;AAC9B,MAAA,kBAAA,EAAmB;AAAA,IACrB,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,IAAA,CAAK,cAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC7D,QAAA,kBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAW,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,EAAG;AAAA,UACrC,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG,WAAA;AAAA,UAC7B,CAAC,YAAA,CAAa,cAAc,CAAC,GAAG;AAAA,SACjC,CAAA;AAAA,QACD,QAAA;AAAA,QACA,eAAA,EAAiB,mBAAA;AAAA,QAChB,GAAI,aAAA,IAAiB;AAAA,UACpB,QAAA,EAAU,CAAA;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,mBAAmB,QAAA,IAAY;AAAA,SACjC;AAAA,QAEC;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { createContext } from '../utils/createContext.js';
|
|
3
|
+
import 'clsx';
|
|
4
|
+
import 'react/jsx-runtime';
|
|
5
|
+
import '../utils/useFloatingUI/useFloatingUI.js';
|
|
6
|
+
import '../utils/useId.js';
|
|
7
|
+
import '../salt-provider/SaltProvider.js';
|
|
8
|
+
import '../viewport/ViewportProvider.js';
|
|
9
|
+
|
|
10
|
+
const DrawerContext = createContext(
|
|
11
|
+
"DrawerContext",
|
|
12
|
+
{
|
|
13
|
+
drawerId: void 0,
|
|
14
|
+
headerId: void 0,
|
|
15
|
+
setHeaderId: () => {
|
|
16
|
+
},
|
|
17
|
+
descriptionId: void 0,
|
|
18
|
+
setDescriptionId: () => {
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
const useDrawerContext = () => {
|
|
23
|
+
return useContext(DrawerContext);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { DrawerContext, useDrawerContext };
|
|
27
|
+
//# sourceMappingURL=DrawerContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerContext.js","sources":["../src/drawer/DrawerContext.ts"],"sourcesContent":["import { useContext } from \"react\";\nimport { createContext } from \"../utils\";\n\nexport interface DrawerContextValue {\n drawerId?: string;\n headerId?: string;\n setHeaderId?: (id: string | undefined) => void;\n descriptionId?: string;\n setDescriptionId?: (id: string | undefined) => void;\n}\n\nexport const DrawerContext = createContext<DrawerContextValue>(\n \"DrawerContext\",\n {\n drawerId: undefined,\n headerId: undefined,\n setHeaderId: () => {},\n descriptionId: undefined,\n setDescriptionId: () => {},\n },\n);\n\nexport const useDrawerContext = () => {\n return useContext(DrawerContext);\n};\n"],"names":[],"mappings":";;;;;;;;;AAWO,MAAM,aAAA,GAAgB,aAAA;AAAA,EAC3B,eAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,aAAA,EAAe,MAAA;AAAA,IACf,kBAAkB,MAAM;AAAA,IAAC;AAAA;AAE7B;AAEO,MAAM,mBAAmB,MAAM;AACpC,EAAA,OAAO,WAAW,aAAa,CAAA;AACjC;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var css_248z = ".saltDrawerFooter {\n padding: var(--salt-spacing-300);\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: var(--salt-spacing-100);\n flex-shrink: 0;\n box-sizing: border-box;\n}\n";
|
|
2
|
+
|
|
3
|
+
export { css_248z as default };
|
|
4
|
+
//# sourceMappingURL=DrawerFooter.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerFooter.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
3
|
+
import { useWindow } from '@salt-ds/window';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { forwardRef } from 'react';
|
|
6
|
+
import { makePrefixer } from '../utils/makePrefixer.js';
|
|
7
|
+
import '../utils/useFloatingUI/useFloatingUI.js';
|
|
8
|
+
import '../utils/useId.js';
|
|
9
|
+
import '../salt-provider/SaltProvider.js';
|
|
10
|
+
import '../viewport/ViewportProvider.js';
|
|
11
|
+
import css_248z from './DrawerFooter.css.js';
|
|
12
|
+
|
|
13
|
+
const withBaseName = makePrefixer("saltDrawerFooter");
|
|
14
|
+
const DrawerFooter = forwardRef(
|
|
15
|
+
function DrawerFooter2(props, ref) {
|
|
16
|
+
const { className, ...rest } = props;
|
|
17
|
+
const targetWindow = useWindow();
|
|
18
|
+
useComponentCssInjection({
|
|
19
|
+
testId: "salt-drawer-footer",
|
|
20
|
+
css: css_248z,
|
|
21
|
+
window: targetWindow
|
|
22
|
+
});
|
|
23
|
+
return /* @__PURE__ */ jsx("div", { className: clsx(withBaseName(), className), ref, ...rest });
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
export { DrawerFooter };
|
|
28
|
+
//# sourceMappingURL=DrawerFooter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerFooter.js","sources":["../src/drawer/DrawerFooter.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport drawerFooterCss from \"./DrawerFooter.css\";\n\nconst withBaseName = makePrefixer(\"saltDrawerFooter\");\n\nexport type DrawerFooterProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const DrawerFooter = forwardRef<HTMLDivElement, DrawerFooterProps>(\n function DrawerFooter(props, ref) {\n const { className, ...rest } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-drawer-footer\",\n css: drawerFooterCss,\n window: targetWindow,\n });\n\n return (\n <div className={clsx(withBaseName(), className)} ref={ref} {...rest} />\n );\n },\n);\n"],"names":["DrawerFooter","drawerFooterCss"],"mappings":";;;;;;;;;;;;AAOA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA;AAI7C,MAAM,YAAA,GAAe,UAAA;AAAA,EAC1B,SAASA,aAAAA,CAAa,KAAA,EAAO,GAAA,EAAK;AAChC,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,KAAA;AAE/B,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,oBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,IAAA,CAAK,YAAA,IAAgB,SAAS,CAAA,EAAG,GAAA,EAAW,GAAG,IAAA,EAAM,CAAA;AAAA,EAEzE;AACF;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var css_248z = ".saltDrawerHeader {\n padding: var(--salt-spacing-300);\n display: flex;\n gap: var(--salt-spacing-100);\n flex-shrink: 0;\n box-sizing: border-box;\n}\n\n.saltDrawerHeader-header {\n margin: 0;\n}\n\n.saltDrawerHeader-container {\n flex-grow: 1;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-50);\n padding-top: calc((var(--salt-size-base) - var(--salt-text-h2-lineHeight)) / 2);\n align-items: flex-start;\n min-width: 0;\n word-break: break-word;\n}\n\n.saltDrawerHeader-header > .saltText {\n display: block;\n margin: 0;\n}\n\n.saltDrawerHeader-actionsContainer {\n align-self: flex-start;\n display: flex;\n}\n\n.saltDrawerHeader-withAccent {\n position: relative;\n}\n\n.saltDrawerHeader-withAccent::before {\n content: \"\";\n position: absolute;\n top: var(--salt-spacing-300);\n bottom: var(--salt-spacing-300);\n left: 0;\n width: var(--salt-size-bar);\n background: var(--salt-sentiment-accent-background);\n}\n";
|
|
2
|
+
|
|
3
|
+
export { css_248z as default };
|
|
4
|
+
//# sourceMappingURL=DrawerHeader.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DrawerHeader.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
3
|
+
import { useWindow } from '@salt-ds/window';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { forwardRef } from 'react';
|
|
6
|
+
import '../text/Code.js';
|
|
7
|
+
import '../text/Display.js';
|
|
8
|
+
import { H2 } from '../text/Headings.js';
|
|
9
|
+
import '../text/Label.js';
|
|
10
|
+
import { Text } from '../text/Text.js';
|
|
11
|
+
import '../text/TextAction.js';
|
|
12
|
+
import '../text/TextNotation.js';
|
|
13
|
+
import { makePrefixer } from '../utils/makePrefixer.js';
|
|
14
|
+
import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
|
|
15
|
+
import '../utils/useFloatingUI/useFloatingUI.js';
|
|
16
|
+
import { useId } from '../utils/useId.js';
|
|
17
|
+
import '../salt-provider/SaltProvider.js';
|
|
18
|
+
import '../viewport/ViewportProvider.js';
|
|
19
|
+
import { useDrawerContext } from './DrawerContext.js';
|
|
20
|
+
import css_248z from './DrawerHeader.css.js';
|
|
21
|
+
|
|
22
|
+
const withBaseName = makePrefixer("saltDrawerHeader");
|
|
23
|
+
const DrawerHeader = forwardRef(
|
|
24
|
+
function DrawerHeader2(props, ref) {
|
|
25
|
+
const {
|
|
26
|
+
actions,
|
|
27
|
+
className,
|
|
28
|
+
description,
|
|
29
|
+
disableAccent,
|
|
30
|
+
header,
|
|
31
|
+
preheader,
|
|
32
|
+
...rest
|
|
33
|
+
} = props;
|
|
34
|
+
const targetWindow = useWindow();
|
|
35
|
+
useComponentCssInjection({
|
|
36
|
+
testId: "salt-drawer-header",
|
|
37
|
+
css: css_248z,
|
|
38
|
+
window: targetWindow
|
|
39
|
+
});
|
|
40
|
+
const { setHeaderId, setDescriptionId } = useDrawerContext();
|
|
41
|
+
const headingId = useId();
|
|
42
|
+
const descriptionId = useId();
|
|
43
|
+
const hasHeading = Boolean(header || preheader);
|
|
44
|
+
const hasDescription = Boolean(description);
|
|
45
|
+
useIsomorphicLayoutEffect(() => {
|
|
46
|
+
setHeaderId == null ? void 0 : setHeaderId(hasHeading ? headingId : void 0);
|
|
47
|
+
return () => {
|
|
48
|
+
setHeaderId == null ? void 0 : setHeaderId(void 0);
|
|
49
|
+
};
|
|
50
|
+
}, [hasHeading, headingId, setHeaderId]);
|
|
51
|
+
useIsomorphicLayoutEffect(() => {
|
|
52
|
+
setDescriptionId == null ? void 0 : setDescriptionId(hasDescription ? descriptionId : void 0);
|
|
53
|
+
return () => {
|
|
54
|
+
setDescriptionId == null ? void 0 : setDescriptionId(void 0);
|
|
55
|
+
};
|
|
56
|
+
}, [hasDescription, descriptionId, setDescriptionId]);
|
|
57
|
+
return /* @__PURE__ */ jsxs(
|
|
58
|
+
"div",
|
|
59
|
+
{
|
|
60
|
+
className: clsx(
|
|
61
|
+
withBaseName(),
|
|
62
|
+
{
|
|
63
|
+
[withBaseName("withAccent")]: !disableAccent
|
|
64
|
+
},
|
|
65
|
+
className
|
|
66
|
+
),
|
|
67
|
+
ref,
|
|
68
|
+
...rest,
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ jsxs("div", { className: withBaseName("container"), children: [
|
|
71
|
+
hasHeading && /* @__PURE__ */ jsxs(H2, { id: headingId, className: withBaseName("header"), children: [
|
|
72
|
+
preheader && /* @__PURE__ */ jsx(Text, { as: "span", color: "primary", children: preheader }),
|
|
73
|
+
header
|
|
74
|
+
] }),
|
|
75
|
+
description && /* @__PURE__ */ jsx(
|
|
76
|
+
Text,
|
|
77
|
+
{
|
|
78
|
+
id: descriptionId,
|
|
79
|
+
color: "secondary",
|
|
80
|
+
className: withBaseName("description"),
|
|
81
|
+
children: description
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] }),
|
|
85
|
+
actions && /* @__PURE__ */ jsx("div", { className: withBaseName("actionsContainer"), children: actions })
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
export { DrawerHeader };
|
|
93
|
+
//# sourceMappingURL=DrawerHeader.js.map
|