@salt-ds/core 1.70.0 → 1.72.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 +144 -0
- package/css/salt-core.css +466 -106
- package/dist-cjs/accordion/AccordionHeader.css.js +1 -1
- package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js +8 -0
- package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
- package/dist-cjs/avatar/Avatar.css.js +1 -1
- package/dist-cjs/badge/Badge.css.js +1 -1
- package/dist-cjs/banner/Banner.css.js +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumb.css.js +1 -1
- package/dist-cjs/breadcrumbs/Breadcrumbs.css.js +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/checkbox/Checkbox.css.js +1 -1
- package/dist-cjs/checkbox/CheckboxIcon.css.js +1 -1
- package/dist-cjs/combo-box/ComboBox.js +18 -36
- package/dist-cjs/combo-box/ComboBox.js.map +1 -1
- package/dist-cjs/combo-box/useComboBox.js +21 -21
- package/dist-cjs/combo-box/useComboBox.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/dropdown/Dropdown.js +29 -30
- package/dist-cjs/dropdown/Dropdown.js.map +1 -1
- package/dist-cjs/file-drop-zone/FileDropZone.css.js +1 -1
- 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/FormFieldHelperText.css.js +1 -1
- package/dist-cjs/form-field/FormFieldLabel.css.js +1 -1
- package/dist-cjs/form-field/FormFieldLabel.js +1 -1
- package/dist-cjs/form-field/FormFieldLabel.js.map +1 -1
- package/dist-cjs/index.js +10 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/input/Input.css.js +1 -1
- package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
- package/dist-cjs/interactable-card/InteractableCard.js +23 -7
- package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
- package/dist-cjs/interactable-card/InteractableCardGroup.js +71 -39
- package/dist-cjs/interactable-card/InteractableCardGroup.js.map +1 -1
- package/dist-cjs/interactable-card/InteractableCardGroupContext.js.map +1 -1
- package/dist-cjs/interactable-card/useInteractableCard.js +2 -3
- package/dist-cjs/interactable-card/useInteractableCard.js.map +1 -1
- package/dist-cjs/kbd/Kbd.css.js +1 -1
- package/dist-cjs/link/Link.css.js +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/list-box/ListBox.js +19 -26
- package/dist-cjs/list-box/ListBox.js.map +1 -1
- package/dist-cjs/list-control/ListControlNavigationKeys.js +74 -0
- package/dist-cjs/list-control/ListControlNavigationKeys.js.map +1 -0
- package/dist-cjs/list-control/ListControlOptionContext.js +47 -0
- package/dist-cjs/list-control/ListControlOptionContext.js.map +1 -0
- package/dist-cjs/list-control/ListControlOptionStore.js +159 -0
- package/dist-cjs/list-control/ListControlOptionStore.js.map +1 -0
- package/dist-cjs/list-control/ListControlProvider.js +39 -0
- package/dist-cjs/list-control/ListControlProvider.js.map +1 -0
- package/dist-cjs/list-control/ListControlRegistry.js +161 -0
- package/dist-cjs/list-control/ListControlRegistry.js.map +1 -0
- package/dist-cjs/list-control/ListControlState.js +137 -109
- package/dist-cjs/list-control/ListControlState.js.map +1 -1
- package/dist-cjs/mega-menu/MegaMenuGroupHeading.css.js +1 -1
- package/dist-cjs/mega-menu/MegaMenuListItem.css.js +1 -1
- package/dist-cjs/menu/MenuGroup.css.js +1 -1
- package/dist-cjs/menu/MenuItem.css.js +1 -1
- package/dist-cjs/menu/MenuItem.js +0 -1
- package/dist-cjs/menu/MenuItem.js.map +1 -1
- package/dist-cjs/navigation-item/NavigationItem.css.js +1 -1
- package/dist-cjs/number-input/NumberInput.js +2 -2
- package/dist-cjs/number-input/NumberInput.js.map +1 -1
- package/dist-cjs/option/Option.js +58 -39
- package/dist-cjs/option/Option.js.map +1 -1
- package/dist-cjs/option/OptionGroup.css.js +1 -1
- package/dist-cjs/overlay/Overlay.js +12 -2
- package/dist-cjs/overlay/Overlay.js.map +1 -1
- package/dist-cjs/overlay/OverlayContext.js +6 -0
- package/dist-cjs/overlay/OverlayContext.js.map +1 -1
- package/dist-cjs/overlay/OverlayFooter.css.js +6 -0
- package/dist-cjs/overlay/OverlayFooter.css.js.map +1 -0
- package/dist-cjs/overlay/OverlayFooter.js +30 -0
- package/dist-cjs/overlay/OverlayFooter.js.map +1 -0
- package/dist-cjs/overlay/OverlayHeader.css.js +1 -1
- package/dist-cjs/overlay/OverlayHeader.js +51 -11
- package/dist-cjs/overlay/OverlayHeader.js.map +1 -1
- package/dist-cjs/overlay/OverlayPanel.css.js +1 -1
- package/dist-cjs/overlay/OverlayPanel.js +20 -7
- package/dist-cjs/overlay/OverlayPanel.js.map +1 -1
- package/dist-cjs/overlay/OverlayPanelContent.css.js +1 -1
- package/dist-cjs/overlay/OverlayPanelContent.js +11 -13
- package/dist-cjs/overlay/OverlayPanelContent.js.map +1 -1
- package/dist-cjs/overlay/hasOverlaySection.js +24 -0
- package/dist-cjs/overlay/hasOverlaySection.js.map +1 -0
- 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/pill-input/PillInput.css.js +1 -1
- package/dist-cjs/pill-input/PillInput.js +2 -2
- package/dist-cjs/pill-input/PillInput.js.map +1 -1
- package/dist-cjs/radio-button/RadioButton.css.js +1 -1
- package/dist-cjs/radio-button/RadioButtonIcon.css.js +1 -1
- package/dist-cjs/rating/Rating.css.js +1 -1
- package/dist-cjs/slider/internal/SliderTrack.css.js +1 -1
- package/dist-cjs/stepper/internal/StepText.css.js +1 -1
- package/dist-cjs/switch/Switch.css.js +1 -1
- package/dist-cjs/table/Table.css.js +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-cjs/tag/Tag.css.js +1 -1
- package/dist-cjs/text/Text.css.js +1 -1
- package/dist-cjs/toast/Toast.css.js +1 -1
- package/dist-cjs/toggle-button/ToggleButton.js +8 -2
- package/dist-cjs/toggle-button/ToggleButton.js.map +1 -1
- package/dist-cjs/toggle-button-group/ToggleButtonGroup.js +71 -8
- package/dist-cjs/toggle-button-group/ToggleButtonGroup.js.map +1 -1
- package/dist-cjs/toggle-button-group/ToggleButtonGroupContext.js.map +1 -1
- package/dist-cjs/toggletip/ToggletipPanel.css.js +1 -1
- package/dist-cjs/tooltip/Tooltip.css.js +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigationItemContent.css.js +1 -1
- package/dist-cjs/vertical-navigation/VerticalNavigationSubMenu.css.js +1 -1
- package/dist-es/accordion/AccordionHeader.css.js +1 -1
- package/dist-es/aria-announcer/AriaAnnouncerProvider.js +8 -0
- package/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
- package/dist-es/avatar/Avatar.css.js +1 -1
- package/dist-es/badge/Badge.css.js +1 -1
- package/dist-es/banner/Banner.css.js +1 -1
- package/dist-es/breadcrumbs/Breadcrumb.css.js +1 -1
- package/dist-es/breadcrumbs/Breadcrumbs.css.js +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/checkbox/Checkbox.css.js +1 -1
- package/dist-es/checkbox/CheckboxIcon.css.js +1 -1
- package/dist-es/combo-box/ComboBox.js +18 -36
- package/dist-es/combo-box/ComboBox.js.map +1 -1
- package/dist-es/combo-box/useComboBox.js +21 -21
- package/dist-es/combo-box/useComboBox.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/dropdown/Dropdown.js +29 -30
- package/dist-es/dropdown/Dropdown.js.map +1 -1
- package/dist-es/file-drop-zone/FileDropZone.css.js +1 -1
- 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/FormFieldHelperText.css.js +1 -1
- package/dist-es/form-field/FormFieldLabel.css.js +1 -1
- package/dist-es/form-field/FormFieldLabel.js +1 -1
- package/dist-es/form-field/FormFieldLabel.js.map +1 -1
- package/dist-es/index.js +5 -0
- package/dist-es/index.js.map +1 -1
- package/dist-es/input/Input.css.js +1 -1
- package/dist-es/interactable-card/InteractableCard.css.js +1 -1
- package/dist-es/interactable-card/InteractableCard.js +23 -7
- package/dist-es/interactable-card/InteractableCard.js.map +1 -1
- package/dist-es/interactable-card/InteractableCardGroup.js +72 -40
- package/dist-es/interactable-card/InteractableCardGroup.js.map +1 -1
- package/dist-es/interactable-card/InteractableCardGroupContext.js.map +1 -1
- package/dist-es/interactable-card/useInteractableCard.js +2 -3
- package/dist-es/interactable-card/useInteractableCard.js.map +1 -1
- package/dist-es/kbd/Kbd.css.js +1 -1
- package/dist-es/link/Link.css.js +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/list-box/ListBox.js +19 -26
- package/dist-es/list-box/ListBox.js.map +1 -1
- package/dist-es/list-control/ListControlNavigationKeys.js +69 -0
- package/dist-es/list-control/ListControlNavigationKeys.js.map +1 -0
- package/dist-es/list-control/ListControlOptionContext.js +44 -0
- package/dist-es/list-control/ListControlOptionContext.js.map +1 -0
- package/dist-es/list-control/ListControlOptionStore.js +153 -0
- package/dist-es/list-control/ListControlOptionStore.js.map +1 -0
- package/dist-es/list-control/ListControlProvider.js +37 -0
- package/dist-es/list-control/ListControlProvider.js.map +1 -0
- package/dist-es/list-control/ListControlRegistry.js +158 -0
- package/dist-es/list-control/ListControlRegistry.js.map +1 -0
- package/dist-es/list-control/ListControlState.js +137 -110
- package/dist-es/list-control/ListControlState.js.map +1 -1
- package/dist-es/mega-menu/MegaMenuGroupHeading.css.js +1 -1
- package/dist-es/mega-menu/MegaMenuListItem.css.js +1 -1
- package/dist-es/menu/MenuGroup.css.js +1 -1
- package/dist-es/menu/MenuItem.css.js +1 -1
- package/dist-es/menu/MenuItem.js +0 -1
- package/dist-es/menu/MenuItem.js.map +1 -1
- package/dist-es/navigation-item/NavigationItem.css.js +1 -1
- package/dist-es/number-input/NumberInput.js +2 -2
- package/dist-es/number-input/NumberInput.js.map +1 -1
- package/dist-es/option/Option.js +59 -40
- package/dist-es/option/Option.js.map +1 -1
- package/dist-es/option/OptionGroup.css.js +1 -1
- package/dist-es/overlay/Overlay.js +13 -3
- package/dist-es/overlay/Overlay.js.map +1 -1
- package/dist-es/overlay/OverlayContext.js +6 -0
- package/dist-es/overlay/OverlayContext.js.map +1 -1
- package/dist-es/overlay/OverlayFooter.css.js +4 -0
- package/dist-es/overlay/OverlayFooter.css.js.map +1 -0
- package/dist-es/overlay/OverlayFooter.js +28 -0
- package/dist-es/overlay/OverlayFooter.js.map +1 -0
- package/dist-es/overlay/OverlayHeader.css.js +1 -1
- package/dist-es/overlay/OverlayHeader.js +51 -11
- package/dist-es/overlay/OverlayHeader.js.map +1 -1
- package/dist-es/overlay/OverlayPanel.css.js +1 -1
- package/dist-es/overlay/OverlayPanel.js +20 -7
- package/dist-es/overlay/OverlayPanel.js.map +1 -1
- package/dist-es/overlay/OverlayPanelContent.css.js +1 -1
- package/dist-es/overlay/OverlayPanelContent.js +11 -13
- package/dist-es/overlay/OverlayPanelContent.js.map +1 -1
- package/dist-es/overlay/hasOverlaySection.js +22 -0
- package/dist-es/overlay/hasOverlaySection.js.map +1 -0
- 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/pill-input/PillInput.css.js +1 -1
- package/dist-es/pill-input/PillInput.js +2 -2
- package/dist-es/pill-input/PillInput.js.map +1 -1
- package/dist-es/radio-button/RadioButton.css.js +1 -1
- package/dist-es/radio-button/RadioButtonIcon.css.js +1 -1
- package/dist-es/rating/Rating.css.js +1 -1
- package/dist-es/slider/internal/SliderTrack.css.js +1 -1
- package/dist-es/stepper/internal/StepText.css.js +1 -1
- package/dist-es/switch/Switch.css.js +1 -1
- package/dist-es/table/Table.css.js +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-es/tag/Tag.css.js +1 -1
- package/dist-es/text/Text.css.js +1 -1
- package/dist-es/toast/Toast.css.js +1 -1
- package/dist-es/toggle-button/ToggleButton.js +8 -2
- package/dist-es/toggle-button/ToggleButton.js.map +1 -1
- package/dist-es/toggle-button-group/ToggleButtonGroup.js +71 -8
- package/dist-es/toggle-button-group/ToggleButtonGroup.js.map +1 -1
- package/dist-es/toggle-button-group/ToggleButtonGroupContext.js.map +1 -1
- package/dist-es/toggletip/ToggletipPanel.css.js +1 -1
- package/dist-es/tooltip/Tooltip.css.js +1 -1
- package/dist-es/vertical-navigation/VerticalNavigationItemContent.css.js +1 -1
- package/dist-es/vertical-navigation/VerticalNavigationSubMenu.css.js +1 -1
- package/dist-types/card/Card.d.ts +10 -0
- package/dist-types/combo-box/useComboBox.d.ts +3 -6
- 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/interactable-card/InteractableCardGroupContext.d.ts +2 -0
- package/dist-types/interactable-card/useInteractableCard.d.ts +1 -2
- 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/list-control/ListControlNavigationKeys.d.ts +30 -0
- package/dist-types/list-control/ListControlOptionContext.d.ts +18 -0
- package/dist-types/list-control/ListControlOptionStore.d.ts +17 -0
- package/dist-types/list-control/ListControlProvider.d.ts +11 -0
- package/dist-types/list-control/ListControlRegistry.d.ts +22 -0
- package/dist-types/list-control/ListControlState.d.ts +6 -6
- package/dist-types/option/Option.d.ts +3 -1
- package/dist-types/overlay/Overlay.d.ts +2 -1
- package/dist-types/overlay/OverlayContext.d.ts +4 -0
- package/dist-types/overlay/OverlayFooter.d.ts +4 -0
- package/dist-types/overlay/hasOverlaySection.d.ts +2 -0
- package/dist-types/overlay/index.d.ts +1 -0
- package/dist-types/panel/Panel.d.ts +4 -0
- package/dist-types/toggle-button-group/ToggleButtonGroupContext.d.ts +2 -1
- package/dist-types/utils/useIsomorphicLayoutEffect.d.ts +2 -2
- package/package.json +14 -10
|
@@ -9,6 +9,7 @@ var hasCardSection = require('../card/hasCardSection.js');
|
|
|
9
9
|
var capitalize = require('../utils/capitalize.js');
|
|
10
10
|
var makePrefixer = require('../utils/makePrefixer.js');
|
|
11
11
|
var useControlled = require('../utils/useControlled.js');
|
|
12
|
+
var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
|
|
12
13
|
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
13
14
|
var useForkRef = require('../utils/useForkRef.js');
|
|
14
15
|
require('../utils/useId.js');
|
|
@@ -23,9 +24,11 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
|
|
|
23
24
|
const {
|
|
24
25
|
accent,
|
|
25
26
|
accentPlacement,
|
|
27
|
+
borderColor,
|
|
26
28
|
children,
|
|
27
29
|
className,
|
|
28
30
|
disabled: disabledProp,
|
|
31
|
+
elevation = "raised",
|
|
29
32
|
variant = "primary",
|
|
30
33
|
value,
|
|
31
34
|
onBlur,
|
|
@@ -56,7 +59,10 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
|
|
|
56
59
|
const ariaChecked = role === "radio" || role === "checkbox" ? selected : void 0;
|
|
57
60
|
const accentValue = accent || accentPlacement;
|
|
58
61
|
const handleClick = (event) => {
|
|
59
|
-
if (
|
|
62
|
+
if (disabled) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (interactableCardGroup) {
|
|
60
66
|
interactableCardGroup.select(event, value);
|
|
61
67
|
setSelected(!selected);
|
|
62
68
|
}
|
|
@@ -64,22 +70,29 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
|
|
|
64
70
|
onClick == null ? void 0 : onClick(event);
|
|
65
71
|
};
|
|
66
72
|
let tabIndex;
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
if (disabled) {
|
|
74
|
+
tabIndex = void 0;
|
|
75
|
+
} else if (interactableCardGroup) {
|
|
76
|
+
if (isMultiselect) {
|
|
71
77
|
tabIndex = 0;
|
|
72
78
|
} else {
|
|
73
79
|
tabIndex = selected ? 0 : -1;
|
|
74
|
-
|
|
80
|
+
const hasEnabledSelection = interactableCardGroup.hasEnabledSelection ?? Boolean(interactableCardGroup.value);
|
|
81
|
+
if (!hasEnabledSelection && isFirstChild) {
|
|
75
82
|
tabIndex = 0;
|
|
76
83
|
}
|
|
77
84
|
}
|
|
78
85
|
} else {
|
|
79
|
-
tabIndex =
|
|
86
|
+
tabIndex = 0;
|
|
80
87
|
}
|
|
81
88
|
const cardRef = React.useRef(null);
|
|
82
89
|
const handleRef = useForkRef.useForkRef(ref, cardRef);
|
|
90
|
+
const registerCard = interactableCardGroup == null ? void 0 : interactableCardGroup.registerCard;
|
|
91
|
+
useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
|
|
92
|
+
if (!disabled && cardRef.current && registerCard) {
|
|
93
|
+
return registerCard(value, cardRef.current);
|
|
94
|
+
}
|
|
95
|
+
}, [disabled, registerCard, value]);
|
|
83
96
|
const { active, cardProps } = useInteractableCard.useInteractableCard({
|
|
84
97
|
disabled,
|
|
85
98
|
onKeyUp,
|
|
@@ -90,6 +103,7 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
|
|
|
90
103
|
const sectioned = hasCardSection.hasCardSection(children);
|
|
91
104
|
return (
|
|
92
105
|
// biome-ignore lint/a11y/useAriaPropsSupportedByRole: Biome can't detect the role provided by the role variable. aria-checked is only used when the role is appropriate.
|
|
106
|
+
// biome-ignore lint/a11y/useKeyWithClickEvents: Keyboard event handlers are provided by cardProps.
|
|
93
107
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
94
108
|
"div",
|
|
95
109
|
{
|
|
@@ -101,9 +115,11 @@ const InteractableCard = React.forwardRef(function InteractableCard2(props, ref)
|
|
|
101
115
|
className: clsx.clsx(
|
|
102
116
|
withBaseName(),
|
|
103
117
|
withBaseName(variant),
|
|
118
|
+
borderColor && withBaseName(`borderColor${capitalize.capitalize(borderColor)}`),
|
|
104
119
|
{
|
|
105
120
|
[withBaseName("accent")]: accentValue,
|
|
106
121
|
[withBaseName(`accent${capitalize.capitalize(accentValue ?? "")}`)]: accentValue,
|
|
122
|
+
[withBaseName(elevation || "")]: elevation,
|
|
107
123
|
[withBaseName("active")]: role === "button" && active,
|
|
108
124
|
[withBaseName("disabled")]: disabled,
|
|
109
125
|
[withBaseName("selected")]: selected,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractableCard.js","sources":["../src/interactable-card/InteractableCard.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 MouseEvent,\n type SyntheticEvent,\n useRef,\n} from \"react\";\nimport { hasCardSection } from \"../card/hasCardSection\";\nimport {
|
|
1
|
+
{"version":3,"file":"InteractableCard.js","sources":["../src/interactable-card/InteractableCard.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 MouseEvent,\n type SyntheticEvent,\n useRef,\n} from \"react\";\nimport { hasCardSection } from \"../card/hasCardSection\";\nimport {\n capitalize,\n makePrefixer,\n useControlled,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"../utils\";\nimport interactableCardCss from \"./InteractableCard.css\";\nimport {\n type InteractableCardValue,\n useInteractableCardGroup,\n} from \"./InteractableCardGroupContext\";\nimport { useInteractableCard } from \"./useInteractableCard\";\n\nconst withBaseName = makePrefixer(\"saltInteractableCard\");\n\nexport interface InteractableCardProps 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 since 1.23.0. Use the `accent` prop instead.\n */\n accentPlacement?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * Callback fired when the selection changes.\n * @param event\n */\n onChange?: (event: SyntheticEvent<HTMLDivElement>) => void;\n /**\n * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n /**\n * Value of card (for selectable use case).\n */\n value?: InteractableCardValue;\n}\n\nexport const InteractableCard = forwardRef<\n HTMLDivElement,\n InteractableCardProps\n>(function InteractableCard(props, ref) {\n const {\n accent,\n accentPlacement,\n borderColor,\n children,\n className,\n disabled: disabledProp,\n elevation = \"raised\",\n variant = \"primary\",\n value,\n onBlur,\n onChange,\n onClick,\n onKeyUp,\n onKeyDown,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-interactable-card\",\n css: interactableCardCss,\n window: targetWindow,\n });\n\n const interactableCardGroup = useInteractableCardGroup();\n\n const interactableCardGroupSelected =\n interactableCardGroup?.isSelected(value);\n\n const disabled = interactableCardGroup?.disabled || disabledProp;\n\n const [selected, setSelected] = useControlled({\n controlled: interactableCardGroupSelected,\n default: Boolean(false),\n name: \"InteractableCard\",\n state: \"selected\",\n });\n\n const role = interactableCardGroup\n ? interactableCardGroup.multiSelect\n ? \"checkbox\"\n : \"radio\"\n : \"button\";\n\n const isMultiselect = interactableCardGroup?.multiSelect;\n\n const isFirstChild = interactableCardGroup?.isFirstChild(value);\n\n const ariaChecked =\n role === \"radio\" || role === \"checkbox\" ? selected : undefined;\n\n const accentValue = accent || accentPlacement;\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n\n if (interactableCardGroup) {\n interactableCardGroup.select(event, value);\n setSelected(!selected);\n }\n onChange?.(event);\n onClick?.(event);\n };\n\n // Disabled cards omit tabIndex so they can't receive focus, matching native disabled controls.\n let tabIndex: number | undefined;\n\n if (disabled) {\n tabIndex = undefined;\n } else if (interactableCardGroup) {\n if (isMultiselect) {\n tabIndex = 0; // All items focusable in multi-select\n } else {\n // Single select: only the selected card, or the first enabled card when no enabled card is selected, is focusable\n tabIndex = selected ? 0 : -1;\n // Fall back to the value for custom providers without hasEnabledSelection.\n const hasEnabledSelection =\n interactableCardGroup.hasEnabledSelection ??\n Boolean(interactableCardGroup.value);\n if (!hasEnabledSelection && isFirstChild) {\n tabIndex = 0;\n }\n }\n } else {\n tabIndex = 0;\n }\n\n const cardRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, cardRef);\n const registerCard = interactableCardGroup?.registerCard;\n\n useIsomorphicLayoutEffect(() => {\n if (!disabled && cardRef.current && registerCard) {\n return registerCard(value, cardRef.current);\n }\n }, [disabled, registerCard, value]);\n\n const { active, cardProps } = useInteractableCard({\n disabled,\n onKeyUp,\n onKeyDown,\n onBlur,\n onClick,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: Biome can't detect the role provided by the role variable. aria-checked is only used when the role is appropriate.\n // biome-ignore lint/a11y/useKeyWithClickEvents: Keyboard event handlers are provided by cardProps.\n <div\n {...cardProps}\n role={role}\n aria-checked={ariaChecked}\n aria-disabled={disabled}\n data-value={value}\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),\n {\n [withBaseName(\"accent\")]: accentValue,\n [withBaseName(`accent${capitalize(accentValue ?? \"\")}`)]: accentValue,\n [withBaseName(elevation || \"\")]: elevation,\n [withBaseName(\"active\")]: role === \"button\" && active,\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"selected\")]: selected,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n {...rest}\n onClick={handleClick}\n ref={handleRef}\n tabIndex={tabIndex}\n >\n {children}\n </div>\n );\n});\n"],"names":["makePrefixer","forwardRef","InteractableCard","useWindow","useComponentCssInjection","interactableCardCss","useInteractableCardGroup","useControlled","useRef","useForkRef","useIsomorphicLayoutEffect","useInteractableCard","hasCardSection","jsx","clsx","capitalize"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var React = require('react');
|
|
|
8
8
|
var makePrefixer = require('../utils/makePrefixer.js');
|
|
9
9
|
var ownerDocument = require('../utils/ownerDocument.js');
|
|
10
10
|
var useControlled = require('../utils/useControlled.js');
|
|
11
|
+
var useIsomorphicLayoutEffect = require('../utils/useIsomorphicLayoutEffect.js');
|
|
11
12
|
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
12
13
|
var useForkRef = require('../utils/useForkRef.js');
|
|
13
14
|
require('../utils/useId.js');
|
|
@@ -17,6 +18,15 @@ var InteractableCardGroup$1 = require('./InteractableCardGroup.css.js');
|
|
|
17
18
|
var InteractableCardGroupContext = require('./InteractableCardGroupContext.js');
|
|
18
19
|
|
|
19
20
|
const withBaseName = makePrefixer.makePrefixer("saltInteractableCardGroup");
|
|
21
|
+
const sortCards = (cards) => [...cards].sort((cardA, cardB) => {
|
|
22
|
+
const position = cardA.element.compareDocumentPosition(cardB.element);
|
|
23
|
+
if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
|
|
24
|
+
if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;
|
|
25
|
+
return 0;
|
|
26
|
+
});
|
|
27
|
+
const cardsAreEqual = (cardsA, cardsB) => cardsA.length === cardsB.length && cardsA.every(
|
|
28
|
+
(card, index) => card.element === cardsB[index].element && card.value === cardsB[index].value
|
|
29
|
+
);
|
|
20
30
|
const InteractableCardGroup = React.forwardRef(function InteractableCardGroup2(props, ref) {
|
|
21
31
|
const {
|
|
22
32
|
children,
|
|
@@ -43,15 +53,34 @@ const InteractableCardGroup = React.forwardRef(function InteractableCardGroup2(p
|
|
|
43
53
|
name: "InteractableCardGroup",
|
|
44
54
|
state: "value"
|
|
45
55
|
});
|
|
46
|
-
const [
|
|
47
|
-
React.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
56
|
+
const [enabledCards, setEnabledCards] = React.useState([]);
|
|
57
|
+
const registerCard = React.useCallback(
|
|
58
|
+
(cardValue, element) => {
|
|
59
|
+
const card = { element, value: cardValue };
|
|
60
|
+
setEnabledCards(
|
|
61
|
+
(currentCards) => sortCards([
|
|
62
|
+
...currentCards.filter(
|
|
63
|
+
(currentCard) => currentCard.element !== element
|
|
64
|
+
),
|
|
65
|
+
card
|
|
66
|
+
])
|
|
67
|
+
);
|
|
68
|
+
return () => {
|
|
69
|
+
setEnabledCards((currentCards) => {
|
|
70
|
+
const currentCard = currentCards.find(
|
|
71
|
+
(registeredCard) => registeredCard.element === element
|
|
72
|
+
);
|
|
73
|
+
return currentCard === card ? currentCards.filter((registeredCard) => registeredCard !== card) : currentCards;
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
[]
|
|
78
|
+
);
|
|
79
|
+
useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
|
|
80
|
+
setEnabledCards((currentCards) => {
|
|
81
|
+
const sortedCards = sortCards(currentCards);
|
|
82
|
+
return cardsAreEqual(currentCards, sortedCards) ? currentCards : sortedCards;
|
|
83
|
+
});
|
|
55
84
|
}, [children]);
|
|
56
85
|
const select = React.useCallback(
|
|
57
86
|
(event, newValue) => {
|
|
@@ -76,59 +105,62 @@ const InteractableCardGroup = React.forwardRef(function InteractableCardGroup2(p
|
|
|
76
105
|
);
|
|
77
106
|
const isFirstChild = React.useCallback(
|
|
78
107
|
(cardValue) => {
|
|
79
|
-
return
|
|
80
|
-
(element) => element.getAttribute("data-value") === cardValue
|
|
81
|
-
) === 0;
|
|
108
|
+
return enabledCards.findIndex((card) => card.value === cardValue) === 0;
|
|
82
109
|
},
|
|
83
|
-
[
|
|
110
|
+
[enabledCards]
|
|
84
111
|
);
|
|
85
112
|
const contextValue = React.useMemo(
|
|
86
113
|
() => ({
|
|
87
114
|
select,
|
|
115
|
+
registerCard,
|
|
116
|
+
hasEnabledSelection: !multiSelect && typeof value === "string" && enabledCards.some((card) => card.value === value),
|
|
88
117
|
isSelected,
|
|
89
118
|
isFirstChild,
|
|
90
119
|
disabled,
|
|
91
120
|
multiSelect,
|
|
92
121
|
value
|
|
93
122
|
}),
|
|
94
|
-
[
|
|
123
|
+
[
|
|
124
|
+
select,
|
|
125
|
+
registerCard,
|
|
126
|
+
enabledCards,
|
|
127
|
+
isSelected,
|
|
128
|
+
disabled,
|
|
129
|
+
multiSelect,
|
|
130
|
+
isFirstChild,
|
|
131
|
+
value
|
|
132
|
+
]
|
|
95
133
|
);
|
|
96
134
|
const handleKeyDown = (event) => {
|
|
97
|
-
var _a, _b;
|
|
135
|
+
var _a, _b, _c;
|
|
98
136
|
const doc = ownerDocument.ownerDocument(groupRef.current);
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
137
|
+
const currentCard = (_a = doc.activeElement) == null ? void 0 : _a.closest(
|
|
138
|
+
".saltInteractableCard"
|
|
139
|
+
);
|
|
140
|
+
const currentIndex = currentCard ? enabledCards.findIndex((card) => card.element === currentCard) : -1;
|
|
141
|
+
if (currentIndex === -1) {
|
|
142
|
+
onKeyDown == null ? void 0 : onKeyDown(event);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const nextIndex = (currentIndex + 1) % enabledCards.length;
|
|
146
|
+
const prevIndex = (currentIndex - 1 + enabledCards.length) % enabledCards.length;
|
|
102
147
|
if (event.key === " ") {
|
|
103
148
|
event.preventDefault();
|
|
104
|
-
select(
|
|
105
|
-
event,
|
|
106
|
-
elements[currentIndex].getAttribute(
|
|
107
|
-
"data-value"
|
|
108
|
-
)
|
|
109
|
-
);
|
|
149
|
+
select(event, enabledCards[currentIndex].value);
|
|
110
150
|
}
|
|
111
|
-
if (!multiSelect) {
|
|
151
|
+
if (!multiSelect && !event.altKey && !event.ctrlKey && !event.metaKey) {
|
|
112
152
|
switch (event.key) {
|
|
113
153
|
case "ArrowDown":
|
|
114
154
|
case "ArrowRight":
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"data-value"
|
|
119
|
-
)
|
|
120
|
-
);
|
|
121
|
-
(_a = elements[nextIndex]) == null ? void 0 : _a.focus();
|
|
155
|
+
event.preventDefault();
|
|
156
|
+
select(event, enabledCards[nextIndex].value);
|
|
157
|
+
(_b = enabledCards[nextIndex]) == null ? void 0 : _b.element.focus();
|
|
122
158
|
break;
|
|
123
159
|
case "ArrowUp":
|
|
124
160
|
case "ArrowLeft":
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
"data-value"
|
|
129
|
-
)
|
|
130
|
-
);
|
|
131
|
-
(_b = elements[prevIndex]) == null ? void 0 : _b.focus();
|
|
161
|
+
event.preventDefault();
|
|
162
|
+
select(event, enabledCards[prevIndex].value);
|
|
163
|
+
(_c = enabledCards[prevIndex]) == null ? void 0 : _c.element.focus();
|
|
132
164
|
break;
|
|
133
165
|
}
|
|
134
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractableCardGroup.js","sources":["../src/interactable-card/InteractableCardGroup.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 KeyboardEvent,\n type SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n makePrefixer,\n ownerDocument,\n useControlled,\n useForkRef,\n} from \"../utils\";\nimport interactableCardGroupCss from \"./InteractableCardGroup.css\";\nimport {\n InteractableCardGroupContext,\n type InteractableCardValue,\n} from \"./InteractableCardGroupContext\";\n\nexport interface InteractableCardGroupProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * The default value. Use when the component is not controlled. Should be an array when `multiSelect` is true.\n */\n defaultValue?: InteractableCardValue;\n /**\n * If `true`, the Interactable Card Group will be disabled.\n */\n disabled?: boolean;\n /**\n * The value. Use when the component is controlled. Should be an array when `multiSelect` is true.\n */\n value?: InteractableCardValue;\n /**\n * If `true` the Interactable Card Group will allow multiple selection functionality, with keyboard interactions matching those of a checkbox.\n * By default the group allows mutually exclusive selection with keyboard interactions matching radio buttons.\n */\n multiSelect?: boolean;\n /**\n * Callback fired when the selection changes.\n * @param event\n */\n onChange?: (\n event: SyntheticEvent<HTMLDivElement>,\n value: InteractableCardValue,\n ) => void;\n}\n\nconst withBaseName = makePrefixer(\"saltInteractableCardGroup\");\n\nexport const InteractableCardGroup = forwardRef<\n HTMLDivElement,\n InteractableCardGroupProps\n>(function InteractableCardGroup(props, ref) {\n const {\n children,\n className,\n value: valueProp,\n defaultValue,\n disabled,\n onChange,\n onKeyDown,\n multiSelect,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-interactable-card-group\",\n css: interactableCardGroupCss,\n window: targetWindow,\n });\n\n const groupRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, groupRef);\n\n const [value, setValue] = useControlled({\n default: defaultValue,\n controlled: valueProp,\n name: \"InteractableCardGroup\",\n state: \"value\",\n });\n\n const [elements, setElements] = useState<HTMLElement[]>([]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: queries the dom when children changes.\n useEffect(() => {\n const childElements: HTMLElement[] = Array.from(\n groupRef.current?.querySelectorAll(\n \".saltInteractableCard:not([disabled])\",\n ) ?? [],\n );\n setElements(childElements);\n }, [children]);\n\n const select = useCallback(\n (\n event: SyntheticEvent<HTMLDivElement>,\n newValue: InteractableCardValue,\n ) => {\n if (multiSelect) {\n const currentValues = Array.isArray(value) ? value : [];\n const isSelected = currentValues.includes(newValue);\n\n const nextValues = isSelected\n ? currentValues.filter((val) => val !== newValue)\n : [...currentValues, newValue];\n setValue(nextValues);\n onChange?.(event, nextValues);\n } else {\n setValue(newValue);\n if (value !== newValue) {\n onChange?.(event, newValue);\n }\n }\n },\n [onChange, value, multiSelect],\n );\n\n const isSelected = useCallback(\n (cardValue: InteractableCardValue) =>\n multiSelect\n ? Array.isArray(value) && value.includes(cardValue)\n : cardValue !== undefined && value === cardValue,\n [value, multiSelect],\n );\n\n const isFirstChild = useCallback(\n (cardValue: InteractableCardValue) => {\n return (\n elements.findIndex(\n (element) => element.getAttribute(\"data-value\") === cardValue,\n ) === 0\n );\n },\n [elements],\n );\n\n const contextValue = useMemo(\n () => ({\n select,\n isSelected,\n isFirstChild,\n disabled,\n multiSelect,\n value,\n }),\n [select, isSelected, disabled, multiSelect, isFirstChild, value],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const doc = ownerDocument(groupRef.current);\n\n const currentIndex = elements.indexOf(doc.activeElement as HTMLElement);\n const nextIndex = (currentIndex + 1) % elements.length;\n const prevIndex = (currentIndex - 1 + elements.length) % elements.length;\n\n if (event.key === \" \") {\n event.preventDefault();\n select(\n event,\n elements[currentIndex].getAttribute(\n \"data-value\",\n ) as InteractableCardValue,\n );\n }\n\n if (!multiSelect) {\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n select(\n event,\n elements[nextIndex].getAttribute(\n \"data-value\",\n ) as InteractableCardValue,\n );\n elements[nextIndex]?.focus();\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n select(\n event,\n elements[prevIndex].getAttribute(\n \"data-value\",\n ) as InteractableCardValue,\n );\n elements[prevIndex]?.focus();\n break;\n }\n }\n onKeyDown?.(event);\n };\n\n return (\n <InteractableCardGroupContext.Provider value={contextValue}>\n <div\n className={clsx(withBaseName(), className)}\n role={multiSelect ? \"group\" : \"radiogroup\"}\n onKeyDown={handleKeyDown}\n ref={handleRef}\n {...rest}\n >\n {children}\n </div>\n </InteractableCardGroupContext.Provider>\n );\n});\n"],"names":["makePrefixer","forwardRef","InteractableCardGroup","useWindow","useComponentCssInjection","interactableCardGroupCss","useRef","useForkRef","useControlled","useState","useEffect","useCallback","isSelected","useMemo","ownerDocument","jsx","InteractableCardGroupContext","clsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InteractableCardGroup.js","sources":["../src/interactable-card/InteractableCardGroup.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 KeyboardEvent,\n type SyntheticEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport {\n makePrefixer,\n ownerDocument,\n useControlled,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"../utils\";\nimport interactableCardGroupCss from \"./InteractableCardGroup.css\";\nimport {\n InteractableCardGroupContext,\n type InteractableCardValue,\n} from \"./InteractableCardGroupContext\";\n\nexport interface InteractableCardGroupProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n /**\n * The default value. Use when the component is not controlled. Should be an array when `multiSelect` is true.\n */\n defaultValue?: InteractableCardValue;\n /**\n * If `true`, the Interactable Card Group will be disabled.\n */\n disabled?: boolean;\n /**\n * The value. Use when the component is controlled. Should be an array when `multiSelect` is true.\n */\n value?: InteractableCardValue;\n /**\n * If `true` the Interactable Card Group will allow multiple selection functionality, with keyboard interactions matching those of a checkbox.\n * By default the group allows mutually exclusive selection with keyboard interactions matching radio buttons.\n */\n multiSelect?: boolean;\n /**\n * Callback fired when the selection changes.\n * @param event\n */\n onChange?: (\n event: SyntheticEvent<HTMLDivElement>,\n value: InteractableCardValue,\n ) => void;\n}\n\nconst withBaseName = makePrefixer(\"saltInteractableCardGroup\");\n\ninterface RegisteredCard {\n element: HTMLElement;\n value: InteractableCardValue;\n}\n\nconst sortCards = (cards: RegisteredCard[]) =>\n [...cards].sort((cardA, cardB) => {\n const position = cardA.element.compareDocumentPosition(cardB.element);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;\n return 0;\n });\n\nconst cardsAreEqual = (cardsA: RegisteredCard[], cardsB: RegisteredCard[]) =>\n cardsA.length === cardsB.length &&\n cardsA.every(\n (card, index) =>\n card.element === cardsB[index].element &&\n card.value === cardsB[index].value,\n );\n\nexport const InteractableCardGroup = forwardRef<\n HTMLDivElement,\n InteractableCardGroupProps\n>(function InteractableCardGroup(props, ref) {\n const {\n children,\n className,\n value: valueProp,\n defaultValue,\n disabled,\n onChange,\n onKeyDown,\n multiSelect,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-interactable-card-group\",\n css: interactableCardGroupCss,\n window: targetWindow,\n });\n\n const groupRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, groupRef);\n\n const [value, setValue] = useControlled({\n default: defaultValue,\n controlled: valueProp,\n name: \"InteractableCardGroup\",\n state: \"value\",\n });\n\n const [enabledCards, setEnabledCards] = useState<RegisteredCard[]>([]);\n\n const registerCard = useCallback(\n (cardValue: InteractableCardValue, element: HTMLElement) => {\n const card = { element, value: cardValue };\n setEnabledCards((currentCards) =>\n sortCards([\n ...currentCards.filter(\n (currentCard) => currentCard.element !== element,\n ),\n card,\n ]),\n );\n\n return () => {\n setEnabledCards((currentCards) => {\n const currentCard = currentCards.find(\n (registeredCard) => registeredCard.element === element,\n );\n return currentCard === card\n ? currentCards.filter((registeredCard) => registeredCard !== card)\n : currentCards;\n });\n };\n },\n [],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-sorts registered cards after children move.\n useIsomorphicLayoutEffect(() => {\n setEnabledCards((currentCards) => {\n const sortedCards = sortCards(currentCards);\n return cardsAreEqual(currentCards, sortedCards)\n ? currentCards\n : sortedCards;\n });\n }, [children]);\n\n const select = useCallback(\n (\n event: SyntheticEvent<HTMLDivElement>,\n newValue: InteractableCardValue,\n ) => {\n if (multiSelect) {\n const currentValues = Array.isArray(value) ? value : [];\n const isSelected = currentValues.includes(newValue);\n\n const nextValues = isSelected\n ? currentValues.filter((val) => val !== newValue)\n : [...currentValues, newValue];\n setValue(nextValues);\n onChange?.(event, nextValues);\n } else {\n setValue(newValue);\n if (value !== newValue) {\n onChange?.(event, newValue);\n }\n }\n },\n [onChange, value, multiSelect],\n );\n\n const isSelected = useCallback(\n (cardValue: InteractableCardValue) =>\n multiSelect\n ? Array.isArray(value) && value.includes(cardValue)\n : cardValue !== undefined && value === cardValue,\n [value, multiSelect],\n );\n\n const isFirstChild = useCallback(\n (cardValue: InteractableCardValue) => {\n return enabledCards.findIndex((card) => card.value === cardValue) === 0;\n },\n [enabledCards],\n );\n\n const contextValue = useMemo(\n () => ({\n select,\n registerCard,\n hasEnabledSelection:\n !multiSelect &&\n typeof value === \"string\" &&\n enabledCards.some((card) => card.value === value),\n isSelected,\n isFirstChild,\n disabled,\n multiSelect,\n value,\n }),\n [\n select,\n registerCard,\n enabledCards,\n isSelected,\n disabled,\n multiSelect,\n isFirstChild,\n value,\n ],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const doc = ownerDocument(groupRef.current);\n\n const currentCard = (doc.activeElement as HTMLElement | null)?.closest(\n \".saltInteractableCard\",\n );\n // Only enabled cards are registered; other key events just call onKeyDown.\n const currentIndex = currentCard\n ? enabledCards.findIndex((card) => card.element === currentCard)\n : -1;\n\n if (currentIndex === -1) {\n onKeyDown?.(event);\n return;\n }\n\n const nextIndex = (currentIndex + 1) % enabledCards.length;\n const prevIndex =\n (currentIndex - 1 + enabledCards.length) % enabledCards.length;\n\n if (event.key === \" \") {\n event.preventDefault();\n select(event, enabledCards[currentIndex].value);\n }\n\n // Leave modified arrow keys, e.g. Alt + Arrow for browser history, to the browser.\n if (!multiSelect && !event.altKey && !event.ctrlKey && !event.metaKey) {\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n event.preventDefault();\n select(event, enabledCards[nextIndex].value);\n enabledCards[nextIndex]?.element.focus();\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n event.preventDefault();\n select(event, enabledCards[prevIndex].value);\n enabledCards[prevIndex]?.element.focus();\n break;\n }\n }\n onKeyDown?.(event);\n };\n\n return (\n <InteractableCardGroupContext.Provider value={contextValue}>\n <div\n className={clsx(withBaseName(), className)}\n role={multiSelect ? \"group\" : \"radiogroup\"}\n onKeyDown={handleKeyDown}\n ref={handleRef}\n {...rest}\n >\n {children}\n </div>\n </InteractableCardGroupContext.Provider>\n );\n});\n"],"names":["makePrefixer","forwardRef","InteractableCardGroup","useWindow","useComponentCssInjection","interactableCardGroupCss","useRef","useForkRef","useControlled","useState","useCallback","useIsomorphicLayoutEffect","isSelected","useMemo","ownerDocument","jsx","InteractableCardGroupContext","clsx"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractableCardGroupContext.js","sources":["../src/interactable-card/InteractableCardGroupContext.tsx"],"sourcesContent":["import { type SyntheticEvent, useContext } from \"react\";\nimport { createContext } from \"../utils\";\n\nexport type InteractableCardValue = string | readonly string[] | undefined;\n\nexport interface InteractableCardGroupContextValue {\n disabled?: boolean;\n select: (\n event: SyntheticEvent<HTMLDivElement>,\n value: InteractableCardValue,\n ) => void;\n isSelected: (id: InteractableCardValue) => boolean;\n isFirstChild: (value: InteractableCardValue) => boolean;\n multiSelect?: boolean;\n value: InteractableCardValue;\n}\n\nexport const InteractableCardGroupContext = createContext<\n InteractableCardGroupContextValue | undefined\n>(\"InteractableCardGroupContext\", undefined);\n\nexport function useInteractableCardGroup() {\n return useContext(InteractableCardGroupContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"InteractableCardGroupContext.js","sources":["../src/interactable-card/InteractableCardGroupContext.tsx"],"sourcesContent":["import { type SyntheticEvent, useContext } from \"react\";\nimport { createContext } from \"../utils\";\n\nexport type InteractableCardValue = string | readonly string[] | undefined;\n\nexport interface InteractableCardGroupContextValue {\n disabled?: boolean;\n select: (\n event: SyntheticEvent<HTMLDivElement>,\n value: InteractableCardValue,\n ) => void;\n registerCard?: (\n value: InteractableCardValue,\n element: HTMLElement,\n ) => () => void;\n hasEnabledSelection?: boolean;\n isSelected: (id: InteractableCardValue) => boolean;\n isFirstChild: (value: InteractableCardValue) => boolean;\n multiSelect?: boolean;\n value: InteractableCardValue;\n}\n\nexport const InteractableCardGroupContext = createContext<\n InteractableCardGroupContextValue | undefined\n>(\"InteractableCardGroupContext\", undefined);\n\nexport function useInteractableCardGroup() {\n return useContext(InteractableCardGroupContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;;;;;AAsBO,MAAM,4BAAA,GAA+BA,2BAAA,CAE1C,8BAAA,EAAgC,MAAS;AAEpC,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOC,iBAAW,4BAA4B,CAAA;AAChD;;;;;"}
|
|
@@ -37,7 +37,7 @@ const useInteractableCard = ({
|
|
|
37
37
|
onBlur == null ? void 0 : onBlur(event);
|
|
38
38
|
};
|
|
39
39
|
const handleKeyDown = (event) => {
|
|
40
|
-
if (event.key === enter || event.key === space) {
|
|
40
|
+
if (!disabled && (event.key === enter || event.key === space)) {
|
|
41
41
|
setkeyIsDown(event.key);
|
|
42
42
|
event.preventDefault();
|
|
43
43
|
setActive(true);
|
|
@@ -47,8 +47,7 @@ const useInteractableCard = ({
|
|
|
47
47
|
};
|
|
48
48
|
const cardProps = {
|
|
49
49
|
"aria-disabled": disabled ? true : void 0,
|
|
50
|
-
disabled,
|
|
51
|
-
tabIndex: disabled ? -1 : 0,
|
|
50
|
+
tabIndex: disabled ? void 0 : 0,
|
|
52
51
|
onBlur: handleBlur,
|
|
53
52
|
onClick: !disabled ? handleClick : void 0,
|
|
54
53
|
onKeyDown: handleKeyDown,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInteractableCard.js","sources":["../src/interactable-card/useInteractableCard.ts"],"sourcesContent":["import {\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useState,\n} from \"react\";\n\nexport interface CardHookProps<T extends Element> {\n disabled?: boolean;\n onKeyUp?: (event: KeyboardEvent<T>) => void;\n onKeyDown?: (event: KeyboardEvent<T>) => void;\n onClick?: (event: MouseEvent<T>) => void;\n onBlur?: (event: FocusEvent<T>) => void;\n}\n\nexport interface CardHookResult<T extends Element> {\n active: boolean;\n cardProps: {\n \"aria-disabled\"?: boolean;\n
|
|
1
|
+
{"version":3,"file":"useInteractableCard.js","sources":["../src/interactable-card/useInteractableCard.ts"],"sourcesContent":["import {\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n useState,\n} from \"react\";\n\nexport interface CardHookProps<T extends Element> {\n disabled?: boolean;\n onKeyUp?: (event: KeyboardEvent<T>) => void;\n onKeyDown?: (event: KeyboardEvent<T>) => void;\n onClick?: (event: MouseEvent<T>) => void;\n onBlur?: (event: FocusEvent<T>) => void;\n}\n\nexport interface CardHookResult<T extends Element> {\n active: boolean;\n cardProps: {\n \"aria-disabled\"?: boolean;\n tabIndex?: number;\n onBlur: (event: FocusEvent<T>) => void;\n onClick?: (event: MouseEvent<T>) => void;\n onKeyDown: (event: KeyboardEvent<T>) => void;\n onKeyUp: (event: KeyboardEvent<T>) => void;\n };\n}\n\nexport const useInteractableCard = <T extends Element>({\n disabled,\n onKeyUp,\n onKeyDown,\n onClick,\n onBlur,\n}: CardHookProps<T>): CardHookResult<T> => {\n const [keyIsDown, setkeyIsDown] = useState(\"\");\n const [active, setActive] = useState(false);\n\n const enter = \"Enter\";\n const space = \" \";\n\n useEffect(() => {\n const t = setTimeout(() => {\n // This key state check is to stop continual visual state change when using Enter Key, which the browser treats as both key and click events on a Button-like component\n // This key state check also fixes Firefox Button where Space key is pressed but button fails to be in active state\n if (keyIsDown !== enter && keyIsDown !== space && active) {\n setActive(false);\n }\n }, 0);\n\n return () => {\n clearTimeout(t);\n };\n }, [active, keyIsDown]);\n\n const handleKeyUp = (event: KeyboardEvent<T>) => {\n setkeyIsDown(\"\");\n setActive(false);\n onKeyUp?.(event);\n };\n\n const handleClick = (event: MouseEvent<T>) => {\n setActive(true);\n onClick?.(event);\n };\n\n const handleBlur = (event: FocusEvent<T>) => {\n setActive(false);\n onBlur?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<T>) => {\n if (!disabled && (event.key === enter || event.key === space)) {\n setkeyIsDown(event.key);\n event.preventDefault();\n setActive(true);\n onClick?.(event as unknown as MouseEvent<T>);\n }\n onKeyDown?.(event);\n };\n\n const cardProps = {\n \"aria-disabled\": disabled ? true : undefined,\n tabIndex: disabled ? undefined : 0,\n onBlur: handleBlur,\n onClick: !disabled ? handleClick : undefined,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n };\n\n return {\n active,\n cardProps,\n };\n};\n"],"names":["useState","useEffect"],"mappings":";;;;AA4BO,MAAM,sBAAsB,CAAoB;AAAA,EACrD,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAA2C;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,KAAA,GAAQ,OAAA;AACd,EAAA,MAAM,KAAA,GAAQ,GAAA;AAEd,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,CAAA,GAAI,WAAW,MAAM;AAGzB,MAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,KAAA,IAAS,MAAA,EAAQ;AACxD,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,GAAG,CAAC,CAAA;AAEJ,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,CAAC,CAAA;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA4B;AAC/C,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyB;AAC5C,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAyB;AAC3C,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAS,KAAA,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA4B;AACjD,IAAA,IAAI,CAAC,QAAA,KAAa,KAAA,CAAM,QAAQ,KAAA,IAAS,KAAA,CAAM,QAAQ,KAAA,CAAA,EAAQ;AAC7D,MAAA,YAAA,CAAa,MAAM,GAAG,CAAA;AACtB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAAA,IACZ;AACA,IAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAY,KAAA,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,eAAA,EAAiB,WAAW,IAAA,GAAO,MAAA;AAAA,IACnC,QAAA,EAAU,WAAW,MAAA,GAAY,CAAA;AAAA,IACjC,MAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAS,CAAC,QAAA,GAAW,WAAA,GAAc,MAAA;AAAA,IACnC,SAAA,EAAW,aAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
package/dist-cjs/kbd/Kbd.css.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".saltKbd-primary {\n --kbd-background: var(--salt-container-primary-background);\n}\n\n.saltKbd-secondary {\n --kbd-background: var(--salt-container-secondary-background);\n}\n\n.saltKbd-tertiary {\n --kbd-background: var(--salt-container-tertiary-background);\n}\n\n.saltKbd {\n display: inline-flex;\n box-sizing: border-box;\n width: fit-content;\n border-radius: var(--salt-palette-corner-weaker);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-bold-borderColor);\n background: var(--kbd-background);\n box-shadow: 0 var(--salt-size-fixed-100) 0 0 var(--salt-container-bold-borderColor);\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n align-items: center;\n padding: 0 var(--salt-spacing-50);\n text-transform: capitalize;\n color: var(--salt-content-primary-foreground);\n font-family: var(--salt-text-code-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-style: normal;\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n}\n";
|
|
3
|
+
var css_248z = ".saltKbd-primary {\n --kbd-background: var(--salt-container-primary-background);\n}\n\n.saltKbd-secondary {\n --kbd-background: var(--salt-container-secondary-background);\n}\n\n.saltKbd-tertiary {\n --kbd-background: var(--salt-container-tertiary-background);\n}\n\n.saltKbd {\n display: inline-flex;\n box-sizing: border-box;\n width: fit-content;\n border-radius: var(--salt-palette-corner-weaker);\n border: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) var(--salt-container-bold-borderColor);\n background: var(--kbd-background);\n box-shadow: 0 var(--salt-size-fixed-100) 0 0 var(--salt-container-bold-borderColor);\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n align-items: center;\n padding: 0 var(--salt-spacing-50);\n text-transform: capitalize;\n color: var(--salt-content-primary-foreground);\n font-family: var(--salt-text-code-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-style: normal;\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n letter-spacing: var(--salt-text-letterSpacing);\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = css_248z;
|
|
6
6
|
//# sourceMappingURL=Kbd.css.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".saltLink {\n --link-color: \"inherit\";\n --link-color-hover: \"inherit\";\n --link-color-active: \"inherit\";\n --link-color-visited: var(--salt-content-foreground-visited);\n --link-color-focus: \"inherit\";\n --link-focus-outlineColor: currentColor;\n\n --link-fontFamily: var(--salt-text-fontFamily);\n}\n\n.saltLink-underlineDefault {\n --link-textDecoration: var(--salt-typography-textDecoration-underline);\n --link-textDecoration-hover: var(--salt-typography-textDecoration-none);\n /* Active takes default */\n --link-textDecoration-active: var(--link-textDecoration);\n /* Focus takes hover */\n --link-textDecoration-focus: var(--link-textDecoration-hover);\n /* Visited takes default */\n --link-textDecoration-visited: var(--link-textDecoration);\n}\n\n.saltLink-underlineNever {\n --link-textDecoration: var(--salt-typography-textDecoration-none);\n --link-textDecoration-hover: var(--salt-typography-textDecoration-none);\n}\n\n/* Main css class */\n.saltLink.saltText {\n color: var(--link-color);\n letter-spacing: var(--salt-text-letterSpacing);\n text-decoration: var(--link-textDecoration);\n font-family: var(--link-fontFamily);\n}\n\n/* Primary variant */\n.saltLink-primary {\n --link-color: var(--salt-content-primary-foreground);\n --link-color-hover: var(--salt-content-primary-foreground);\n --link-color-active: var(--salt-content-primary-foreground);\n --link-color-focus: var(--salt-content-primary-foreground);\n --link-focus-outlineColor: var(--salt-focused-outlineColor);\n --link-color-visited: var(--salt-content-foreground-visited);\n}\n\n/* Secondary variant */\n.saltLink-secondary {\n --link-color: var(--salt-content-secondary-foreground);\n --link-color-hover: var(--salt-content-secondary-foreground);\n --link-color-active: var(--salt-content-secondary-foreground);\n --link-color-focus: var(--salt-content-secondary-foreground);\n --link-focus-outlineColor: var(--salt-focused-outlineColor);\n --link-color-visited: var(--salt-content-foreground-visited);\n}\n\n.saltLink-accent {\n --link-color: var(--salt-content-accent-foreground);\n --link-color-hover: var(--salt-content-accent-foreground);\n --link-color-active: var(--salt-content-accent-foreground);\n --link-color-focus: var(--salt-content-accent-foreground);\n --link-focus-outlineColor: var(--salt-focused-outlineColor);\n --link-color-visited: var(--salt-content-foreground-visited);\n}\n\n/* External link's icon */\n.saltLink .saltLink-icon {\n margin-left: var(--salt-spacing-75);\n margin-bottom: -2px;\n}\n\n/* Set color for visited link */\n.saltLink:visited {\n color: var(--saltLink-color-visited, var(--link-color-visited));\n text-decoration: var(--link-textDecoration-visited);\n}\n\n/* Set color for hovered link */\n.saltLink:hover {\n color: var(--saltLink-color-hover, var(--link-color-hover));\n text-decoration: var(--link-textDecoration-hover);\n}\n\n/* Set color for active link */\n.saltLink:active {\n color: var(--saltLink-color-active, var(--link-color-active));\n text-decoration: var(--link-textDecoration-active);\n}\n\n/* Set color for focused link */\n.saltLink:focus {\n color: var(--saltLink-color-focus, var(--link-color-focus));\n outline: var(--salt-focused-outline);\n outline-color: var(--link-focus-outlineColor);\n text-decoration: var(--link-textDecoration-focus);\n}\n\n/* Class for ADA content - visually hidden but accessible to screen readers.\n Uses clip-path and prevents user selection so the text isn't included\n when users copy the link's visible content. */\n.saltLink-externalLinkADA {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n user-select: none;\n -webkit-user-select: none;\n}\n";
|
|
3
|
+
var css_248z = ".saltLink {\n --link-color: \"inherit\";\n --link-color-hover: \"inherit\";\n --link-color-active: \"inherit\";\n --link-color-visited: var(--salt-content-foreground-visited, var(--link-color));\n --link-color-focus: \"inherit\";\n --link-focus-outlineColor: currentColor;\n\n --link-fontFamily: var(--salt-text-fontFamily);\n}\n\n.saltLink-underlineDefault {\n --link-textDecoration: var(--salt-typography-textDecoration-underline);\n --link-textDecoration-hover: var(--salt-typography-textDecoration-none);\n /* Active takes default */\n --link-textDecoration-active: var(--link-textDecoration);\n /* Focus takes hover */\n --link-textDecoration-focus: var(--link-textDecoration-hover);\n /* Visited takes default */\n --link-textDecoration-visited: var(--link-textDecoration);\n}\n\n.saltLink-underlineNever {\n --link-textDecoration: var(--salt-typography-textDecoration-none);\n --link-textDecoration-hover: var(--salt-typography-textDecoration-none);\n}\n\n/* Main css class */\n.saltLink.saltText {\n color: var(--link-color);\n letter-spacing: var(--salt-text-letterSpacing);\n text-decoration: var(--link-textDecoration);\n font-family: var(--link-fontFamily);\n}\n\n/* Primary variant */\n.saltLink-primary {\n --link-color: var(--salt-content-primary-foreground);\n --link-color-hover: var(--salt-content-primary-foreground);\n --link-color-active: var(--salt-content-primary-foreground);\n --link-color-focus: var(--salt-content-primary-foreground);\n --link-focus-outlineColor: var(--salt-focused-outlineColor);\n --link-color-visited: var(--salt-content-foreground-visited, var(--link-color));\n}\n\n/* Secondary variant */\n.saltLink-secondary {\n --link-color: var(--salt-content-secondary-foreground);\n --link-color-hover: var(--salt-content-secondary-foreground);\n --link-color-active: var(--salt-content-secondary-foreground);\n --link-color-focus: var(--salt-content-secondary-foreground);\n --link-focus-outlineColor: var(--salt-focused-outlineColor);\n --link-color-visited: var(--salt-content-foreground-visited, var(--link-color));\n}\n\n.saltLink-accent {\n --link-color: var(--salt-content-accent-foreground);\n --link-color-hover: var(--salt-content-accent-foreground);\n --link-color-active: var(--salt-content-accent-foreground);\n --link-color-focus: var(--salt-content-accent-foreground);\n --link-focus-outlineColor: var(--salt-focused-outlineColor);\n --link-color-visited: var(--salt-content-foreground-visited, var(--link-color));\n}\n\n/* External link's icon */\n.saltLink .saltLink-icon {\n margin-left: var(--salt-spacing-75);\n margin-bottom: -2px;\n}\n\n/* Set color for visited link */\n.saltLink:visited {\n color: var(--saltLink-color-visited, var(--link-color-visited));\n text-decoration: var(--link-textDecoration-visited);\n}\n\n/* Set color for hovered link */\n.saltLink:hover {\n color: var(--saltLink-color-hover, var(--link-color-hover));\n text-decoration: var(--link-textDecoration-hover);\n}\n\n/* Set color for active link */\n.saltLink:active {\n color: var(--saltLink-color-active, var(--link-color-active));\n text-decoration: var(--link-textDecoration-active);\n}\n\n/* Set color for focused link */\n.saltLink:focus {\n color: var(--saltLink-color-focus, var(--link-color-focus));\n outline: var(--salt-focused-outline);\n outline-color: var(--link-focus-outlineColor);\n text-decoration: var(--link-textDecoration-focus);\n}\n\n/* Class for ADA content - visually hidden but accessible to screen readers.\n Uses clip-path and prevents user selection so the text isn't included\n when users copy the link's visible content. */\n.saltLink-externalLinkADA {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n user-select: none;\n -webkit-user-select: none;\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = css_248z;
|
|
6
6
|
//# sourceMappingURL=Link.css.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltLinkButton {\n --linkButton-borderWidth: var(--salt-size-fixed-100);\n\n align-items: var(--saltLinkButton-alignItems, center);\n appearance: none;\n background: var(--saltLinkButton-background, var(--linkButton-background));\n border-color: var(--saltLinkButton-borderColor, var(--linkButton-borderColor, transparent));\n border-style: var(--saltLinkButton-borderStyle, solid);\n border-width: var(--saltLinkButton-borderWidth, var(--linkButton-borderWidth));\n border-radius: var(--saltLinkButton-borderRadius, var(--salt-palette-corner-weak, 0));\n color: var(--saltLinkButton-text-color, var(--linkButton-text-color));\n display: inline-flex;\n gap: var(--salt-spacing-50);\n justify-content: var(--saltLinkButton-justifyContent, center);\n font-size: var(--saltLinkButton-fontSize, var(--salt-text-fontSize));\n font-family: var(--saltLinkButton-fontFamily, var(--salt-text-action-fontFamily));\n line-height: var(--saltLinkButton-lineHeight, var(--salt-text-lineHeight));\n letter-spacing: var(--saltLinkButton-letterSpacing, var(--salt-text-action-letterSpacing));\n text-transform: var(--saltLinkButton-textTransform, var(--salt-text-action-textTransform));\n padding: 0 var(--saltLinkButton-padding, calc(var(--salt-spacing-100) - var(--saltLinkButton-borderWidth, var(--linkButton-borderWidth))));\n margin: var(--saltLinkButton-margin, 0);\n height: var(--saltLinkButton-height, var(--salt-size-base));\n min-width: var(--saltLinkButton-minWidth, unset);\n position: relative;\n text-align: var(--saltLinkButton-textAlign, var(--salt-text-action-textAlign));\n text-decoration: var(--linkButton-textDecoration, var(--salt-typography-textDecoration-underline));\n text-underline-offset: var(--salt-spacing-fixed-200);\n transition: none;\n width: var(--saltLinkButton-width, auto);\n -webkit-appearance: none;\n -webkit-tap-highlight-color: transparent;\n /* Styles applied to align children*/\n font-weight: var(--saltLinkButton-fontWeight, var(--salt-text-action-fontWeight));\n}\n\n.saltLinkButton-underlineDefault {\n --linkButton-textDecoration: var(--salt-typography-textDecoration-underline);\n --linkButton-textDecoration-hover: var(--salt-typography-textDecoration-none);\n --linkButton-textDecoration-focus: var(--linkButton-textDecoration-hover);\n}\n\n.saltLinkButton-underlineNever {\n --linkButton-textDecoration: var(--salt-typography-textDecoration-none);\n --linkButton-textDecoration-hover: var(--salt-typography-textDecoration-none);\n --linkButton-textDecoration-focus: var(--salt-typography-textDecoration-none);\n}\n\n/* Class for ADA content - visually hidden but accessible to screen readers.\n Uses clip-path and prevents user selection so the text isn't included\n when users copy the link button's visible content. */\n.saltLinkButton-externalLinkADA {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n user-select: none;\n -webkit-user-select: none;\n}\n\n@media (hover: hover) {\n /* Pseudo-class applied to the root element on hover when LinkButton is not active or disabled */\n .saltLinkButton:hover {\n background: var(--saltLinkButton-background-hover, var(--linkButton-background-hover));\n color: var(--saltLinkButton-text-color-hover, var(--linkButton-text-color-hover));\n border-color: var(--saltLinkButton-borderColor-hover, var(--linkButton-borderColor-hover));\n cursor: var(--salt-cursor-hover);\n text-decoration: var(--linkButton-textDecoration-hover, var(--salt-typography-textDecoration-none));\n }\n}\n\n/* Pseudo-class applied to the root element on focus */\n.saltLinkButton:focus-visible {\n outline: var(--salt-focused-outline);\n\n background: var(--saltLinkButton-background-hover, var(--linkButton-background-hover));\n color: var(--saltLinkButton-text-color-hover, var(--linkButton-text-color-hover));\n border-color: var(--saltLinkButton-borderColor-hover, var(--linkButton-borderColor-hover));\n text-decoration: var(--linkButton-textDecoration-focus, var(--salt-typography-textDecoration-none));\n}\n\n/* Pseudo-class applied to the root element when LinkButton is active */\n.saltLinkButton.saltLinkButton-active:focus-visible,\n.saltLinkButton:focus-visible:active,\n.saltLinkButton:active,\n.saltLinkButton.saltLinkButton-active {\n background: var(--saltLinkButton-background-active, var(--linkButton-background-active));\n color: var(--saltLinkButton-text-color-active, var(--linkButton-text-color-active));\n border-color: var(--saltLinkButton-borderColor-active, var(--linkButton-borderColor-active));\n cursor: var(--salt-cursor-active);\n}\n\n.saltLinkButton-neutral {\n --linkButton-text-color: var(--salt-actionable-subtle-foreground);\n --linkButton-text-color-hover: var(--salt-actionable-subtle-foreground-hover);\n --linkButton-text-color-active: var(--salt-actionable-subtle-foreground-active);\n --linkButton-background: var(--salt-actionable-subtle-background);\n --linkButton-background-hover: var(--salt-actionable-subtle-background-hover);\n --linkButton-background-active: var(--salt-actionable-subtle-background-active);\n --linkButton-borderColor: var(--salt-actionable-subtle-borderColor);\n --linkButton-borderColor-hover: var(--salt-actionable-subtle-borderColor-hover);\n --linkButton-borderColor-active: var(--salt-actionable-subtle-borderColor-active);\n}\n\n.saltLinkButton-accented {\n --linkButton-text-color: var(--salt-actionable-accented-subtle-foreground);\n --linkButton-text-color-hover: var(--salt-actionable-accented-subtle-foreground-hover);\n --linkButton-text-color-active: var(--salt-actionable-accented-subtle-foreground-active);\n --linkButton-background: var(--salt-actionable-accented-subtle-background);\n --linkButton-background-hover: var(--salt-actionable-accented-subtle-background-hover);\n --linkButton-background-active: var(--salt-actionable-accented-subtle-background-active);\n --linkButton-borderColor: var(--salt-actionable-accented-subtle-borderColor);\n --linkButton-borderColor-hover: var(--salt-actionable-accented-subtle-borderColor-hover);\n --linkButton-borderColor-active: var(--salt-actionable-accented-subtle-borderColor-active);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=LinkButton.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkButton.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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('../button/Button.js');
|
|
9
|
+
var useButton = require('../button/useButton.js');
|
|
10
|
+
var SemanticIconProvider = require('../semantic-icon-provider/SemanticIconProvider.js');
|
|
11
|
+
var capitalize = require('../utils/capitalize.js');
|
|
12
|
+
var makePrefixer = require('../utils/makePrefixer.js');
|
|
13
|
+
var renderProps = require('../utils/renderProps.js');
|
|
14
|
+
require('../utils/useFloatingUI/useFloatingUI.js');
|
|
15
|
+
require('../utils/useId.js');
|
|
16
|
+
require('../salt-provider/SaltProvider.js');
|
|
17
|
+
require('../viewport/ViewportProvider.js');
|
|
18
|
+
var LinkButton$1 = require('./LinkButton.css.js');
|
|
19
|
+
|
|
20
|
+
const withBaseName = makePrefixer.makePrefixer("saltLinkButton");
|
|
21
|
+
const LinkButton = React.forwardRef(
|
|
22
|
+
function LinkButton2(props, ref) {
|
|
23
|
+
const {
|
|
24
|
+
children,
|
|
25
|
+
className,
|
|
26
|
+
IconComponent,
|
|
27
|
+
onBlur,
|
|
28
|
+
onClick,
|
|
29
|
+
onKeyDown,
|
|
30
|
+
onKeyUp,
|
|
31
|
+
sentiment = "neutral",
|
|
32
|
+
target = "_self",
|
|
33
|
+
underline = "default",
|
|
34
|
+
...rest
|
|
35
|
+
} = props;
|
|
36
|
+
const { active, buttonProps } = useButton.useButton({
|
|
37
|
+
onBlur,
|
|
38
|
+
onClick,
|
|
39
|
+
onKeyDown,
|
|
40
|
+
onKeyUp
|
|
41
|
+
});
|
|
42
|
+
const { tabIndex: _tabIndex, ...activeStateProps } = buttonProps;
|
|
43
|
+
const targetWindow = window.useWindow();
|
|
44
|
+
styles.useComponentCssInjection({
|
|
45
|
+
testId: "salt-link-button",
|
|
46
|
+
css: LinkButton$1,
|
|
47
|
+
window: targetWindow
|
|
48
|
+
});
|
|
49
|
+
const { ExternalIcon } = SemanticIconProvider.useIcon();
|
|
50
|
+
const LinkButtonIconComponent = IconComponent === void 0 ? ExternalIcon : IconComponent;
|
|
51
|
+
const linkButton = renderProps.renderProps("a", {
|
|
52
|
+
className: clsx.clsx(
|
|
53
|
+
withBaseName(),
|
|
54
|
+
withBaseName(sentiment),
|
|
55
|
+
withBaseName(`underline${capitalize.capitalize(underline)}`),
|
|
56
|
+
{ [withBaseName("active")]: active },
|
|
57
|
+
className
|
|
58
|
+
),
|
|
59
|
+
...activeStateProps,
|
|
60
|
+
...rest,
|
|
61
|
+
ref,
|
|
62
|
+
target,
|
|
63
|
+
children
|
|
64
|
+
});
|
|
65
|
+
if (linkButton.props.target !== "_blank") {
|
|
66
|
+
return linkButton;
|
|
67
|
+
}
|
|
68
|
+
return React.cloneElement(
|
|
69
|
+
linkButton,
|
|
70
|
+
void 0,
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
72
|
+
linkButton.props.children,
|
|
73
|
+
LinkButtonIconComponent && /* @__PURE__ */ jsxRuntime.jsx(
|
|
74
|
+
LinkButtonIconComponent,
|
|
75
|
+
{
|
|
76
|
+
className: withBaseName("icon"),
|
|
77
|
+
"aria-hidden": true
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: withBaseName("externalLinkADA"), children: "Opens in a new tab" })
|
|
81
|
+
] })
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
exports.LinkButton = LinkButton;
|
|
87
|
+
//# sourceMappingURL=LinkButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinkButton.js","sources":["../src/link-button/LinkButton.tsx"],"sourcesContent":["import type { IconProps } from \"@salt-ds/icons\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type ComponentType,\n cloneElement,\n forwardRef,\n} from \"react\";\nimport { useButton } from \"../button\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport {\n capitalize,\n makePrefixer,\n type RenderPropsType,\n renderProps,\n} from \"../utils\";\n\nimport linkButtonCss from \"./LinkButton.css\";\n\nconst withBaseName = makePrefixer(\"saltLinkButton\");\n\nexport interface LinkButtonProps extends ComponentPropsWithoutRef<\"a\"> {\n /**\n * Icon component displayed when `target=\"_blank\"`. Defaults to `ExternalIcon` from `SemanticIconProvider`.\n */\n IconComponent?: ComponentType<IconProps> | null;\n /**\n * The sentiment of the button. Options are 'accented' and 'neutral'.\n * 'neutral' is the default value.\n */\n sentiment?: \"accented\" | \"neutral\";\n /**\n * Render prop to enable customisation of anchor element.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * Either \"default\" or \"never\".\n * Determines when underline should be applied to the link button.\n *\n * @default \"default\".\n */\n underline?: \"default\" | \"never\";\n}\n\nexport const LinkButton = forwardRef<HTMLAnchorElement, LinkButtonProps>(\n function LinkButton(props, ref) {\n const {\n children,\n className,\n IconComponent,\n onBlur,\n onClick,\n onKeyDown,\n onKeyUp,\n sentiment = \"neutral\",\n target = \"_self\",\n underline = \"default\",\n ...rest\n } = props;\n\n const { active, buttonProps } = useButton<HTMLAnchorElement>({\n onBlur,\n onClick,\n onKeyDown,\n onKeyUp,\n });\n // Native anchors with an href do not require tabIndex=\"0\".\n const { tabIndex: _tabIndex, ...activeStateProps } = buttonProps;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-link-button\",\n css: linkButtonCss,\n window: targetWindow,\n });\n const { ExternalIcon } = useIcon();\n\n const LinkButtonIconComponent =\n IconComponent === undefined ? ExternalIcon : IconComponent;\n\n const linkButton = renderProps(\"a\", {\n className: clsx(\n withBaseName(),\n withBaseName(sentiment),\n withBaseName(`underline${capitalize(underline)}`),\n { [withBaseName(\"active\")]: active },\n className,\n ),\n ...activeStateProps,\n ...rest,\n ref,\n target,\n children,\n });\n\n if (linkButton.props.target !== \"_blank\") {\n return linkButton;\n }\n\n return cloneElement(\n linkButton,\n undefined,\n <>\n {linkButton.props.children}\n {LinkButtonIconComponent && (\n <LinkButtonIconComponent\n className={withBaseName(\"icon\")}\n aria-hidden\n />\n )}\n <span className={withBaseName(\"externalLinkADA\")}>\n Opens in a new tab\n </span>\n </>,\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","LinkButton","useButton","useWindow","useComponentCssInjection","linkButtonCss","useIcon","renderProps","clsx","capitalize","cloneElement","jsxs","Fragment","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBA,MAAM,YAAA,GAAeA,0BAAa,gBAAgB,CAAA;AAyB3C,MAAM,UAAA,GAAaC,gBAAA;AAAA,EACxB,SAASC,WAAAA,CAAW,KAAA,EAAO,GAAA,EAAK;AAC9B,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,GAAY,SAAA;AAAA,MACZ,MAAA,GAAS,OAAA;AAAA,MACT,SAAA,GAAY,SAAA;AAAA,MACZ,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIC,mBAAA,CAA6B;AAAA,MAC3D,MAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,kBAAiB,GAAI,WAAA;AAErD,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAA,EAAKC,YAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,EAAE,YAAA,EAAa,GAAIC,4BAAA,EAAQ;AAEjC,IAAA,MAAM,uBAAA,GACJ,aAAA,KAAkB,MAAA,GAAY,YAAA,GAAe,aAAA;AAE/C,IAAA,MAAM,UAAA,GAAaC,wBAAY,GAAA,EAAK;AAAA,MAClC,SAAA,EAAWC,SAAA;AAAA,QACT,YAAA,EAAa;AAAA,QACb,aAAa,SAAS,CAAA;AAAA,QACtB,YAAA,CAAa,CAAA,SAAA,EAAYC,qBAAA,CAAW,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,QAChD,EAAE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA,EAAO;AAAA,QACnC;AAAA,OACF;AAAA,MACA,GAAG,gBAAA;AAAA,MACH,GAAG,IAAA;AAAA,MACH,GAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,UAAA,CAAW,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AACxC,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,OAAOC,kBAAA;AAAA,MACL,UAAA;AAAA,MACA,MAAA;AAAA,sBACAC,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,UAAA,CAAW,KAAA,CAAM,QAAA;AAAA,QACjB,uBAAA,oBACCC,cAAA;AAAA,UAAC,uBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,YAC9B,aAAA,EAAW;AAAA;AAAA,SACb;AAAA,uCAED,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,iBAAiB,GAAG,QAAA,EAAA,oBAAA,EAElD;AAAA,OAAA,EACF;AAAA,KACF;AAAA,EACF;AACF;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css_248z = "/* Styles applied to LinkCard */\n.saltLinkCard {\n border-radius: var(--saltLinkCard-borderRadius, var(--salt-palette-corner, 0));\n border-style: var(--saltLinkCard-borderStyle, var(--salt-borderStyle-solid));\n border-width: var(--saltLinkCard-borderWidth, var(--salt-size-fixed-100));\n
|
|
3
|
+
var css_248z = "/* Styles applied to LinkCard */\n.saltLinkCard {\n border-radius: var(--saltLinkCard-borderRadius, var(--salt-palette-corner, 0));\n border-style: var(--saltLinkCard-borderStyle, var(--salt-borderStyle-solid));\n border-width: var(--saltLinkCard-borderWidth, var(--salt-size-fixed-100));\n border-color: var(--saltLinkCard-borderColor, var(--linkCard-borderColor));\n display: block;\n overflow: hidden;\n padding: var(--saltLinkCard-padding, var(--card-padding));\n position: relative;\n text-decoration: none;\n transition: box-shadow var(--salt-duration-instant) ease-in-out;\n --linkCard-accent-color: var(--salt-sentiment-accent-background);\n --linkCard-borderColor: var(--salt-container-borderColor);\n --card-padding: var(--salt-spacing-200);\n}\n\n.saltLinkCard.saltLinkCard-sectioned {\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n@supports selector(:has(*)) {\n .saltLinkCard:has(> .saltCardHeader, > .saltCardContent, > .saltCardFooter) {\n padding: 0;\n display: flex;\n flex-direction: column;\n }\n}\n\n/* Styles applied to LinkCard when variant=\"primary\" */\n.saltLinkCard-primary {\n background: var(--saltLinkCard-background, var(--salt-container-primary-background));\n}\n\n/* Styles applied to LinkCard when variant=\"secondary\" */\n.saltLinkCard-secondary {\n background: var(--saltLinkCard-background, var(--salt-container-secondary-background));\n}\n\n/* Styles applied to LinkCard when variant=\"tertiary\" */\n.saltLinkCard-tertiary {\n background: var(--saltLinkCard-background, var(--salt-container-tertiary-background));\n}\n\n/* Styles applied when elevation=\"flat\" */\n.saltLinkCard-flat {\n box-shadow: var(--saltLinkCard-boxShadow-flat, none);\n}\n\n/* Styles applied when elevation=\"raised\" */\n.saltLinkCard-raised {\n box-shadow: var(--saltLinkCard-boxShadow, var(--salt-overlayable-shadow));\n}\n\n/* Styles applied when borderColor=\"strong\" */\n.saltLinkCard-borderColorStrong {\n --linkCard-borderColor: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied when borderColor=\"subtle\" */\n.saltLinkCard-borderColorSubtle {\n --linkCard-borderColor: var(--salt-container-subtle-borderColor);\n}\n\n/* Styles applied when borderColor=\"none\" */\n.saltLinkCard-borderColorNone {\n --linkCard-borderColor: transparent;\n}\n\n/* Styles applied to create accent */\n.saltLinkCard-accent::after {\n content: \"\";\n position: absolute;\n background-color: var(--saltLinkCard-accent-color, var(--linkCard-accent-color));\n}\n\n/* Styles applied to LinkCard if `accent=\"bottom\"` */\n.saltLinkCard-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 LinkCard if `accent=\"left\"` */\n.saltLinkCard-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 LinkCard if `accent=\"top\"` */\n.saltLinkCard-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 LinkCard if `accent=\"right\"` */\n.saltLinkCard-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/* Styles applied to LinkCard on focus */\n.saltLinkCard:focus-visible {\n cursor: var(--salt-cursor-hover);\n box-shadow: var(--salt-overlayable-shadow-hover);\n outline-color: var(--salt-focused-outlineColor);\n outline-style: var(--salt-focused-outlineStyle);\n outline-width: var(--salt-focused-outlineWidth);\n outline-offset: var(--salt-focused-outlineOffset);\n --linkCard-accent-color: var(--salt-selectable-foreground-hover);\n}\n\n/* Styles applied on hover state to LinkCard */\n@media (hover: hover) {\n .saltLinkCard:hover {\n cursor: var(--salt-cursor-hover);\n box-shadow: var(--salt-overlayable-shadow-hover);\n border-color: var(--salt-actionable-accented-borderColor-hover);\n }\n}\n\n/* Styles applied on active state to LinkCard */\n.saltLinkCard:active {\n cursor: var(--salt-cursor-active);\n border-color: var(--salt-actionable-accented-borderColor-active);\n box-shadow: var(--salt-overlayable-shadow);\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = css_248z;
|
|
6
6
|
//# sourceMappingURL=LinkCard.css.js.map
|