@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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,67 @@
|
|
|
1
1
|
# @salt-ds/core
|
|
2
2
|
|
|
3
|
+
## 1.71.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5da6723: Added `LinkButton`, a button-styled link for prominent navigation. Supports neutral and accented sentiments, icons, icon-only labels, and routing-library integration via the `render` prop.
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { LinkButton } from "@salt-ds/core";
|
|
11
|
+
|
|
12
|
+
<LinkButton href="/reports">View reports</LinkButton>;
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- 0f92b84: Added `elevation` support to `Card`, `InteractableCard`, `LinkCard`, and `Panel`. Cards default to raised elevation to preserve their existing appearance, while `Panel` defaults to flat elevation. Added `borderColor` support to `Card`, `InteractableCard`, and `LinkCard`, including `borderColor="none"` for ghost cards.
|
|
16
|
+
- d7e777c: Added `DrawerHeader`, `DrawerContent` and `DrawerFooter`, implementing header and footer blocks in core `Drawer`. Composing a `Drawer` from `DrawerHeader`, `DrawerContent` and `DrawerFooter` is the recommended approach.
|
|
17
|
+
|
|
18
|
+
`DrawerHeader` takes optional `header`, `preheader`, `description` and `actions`, and displays an accent bar unless `disableAccent` is set. A close action should be passed to `actions` as a `Button`. `DrawerHeader` stays pinned to the top, `DrawerContent` is scrollable.
|
|
19
|
+
|
|
20
|
+
`DrawerHeader` names `Drawer` with its `header` and `preheader`, and describes it with its `description`, so `aria-labelledby` and `aria-describedby` no longer need to be set manually.
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import {
|
|
24
|
+
Button,
|
|
25
|
+
Drawer,
|
|
26
|
+
DrawerContent,
|
|
27
|
+
DrawerFooter,
|
|
28
|
+
DrawerHeader,
|
|
29
|
+
} from "@salt-ds/core";
|
|
30
|
+
import { CloseIcon } from "@salt-ds/icons";
|
|
31
|
+
|
|
32
|
+
<Drawer open={open} onOpenChange={setOpen}>
|
|
33
|
+
<DrawerHeader
|
|
34
|
+
header="Check deposit #1278"
|
|
35
|
+
actions={
|
|
36
|
+
<Button
|
|
37
|
+
aria-label="Close drawer"
|
|
38
|
+
appearance="transparent"
|
|
39
|
+
onClick={() => setOpen(false)}
|
|
40
|
+
>
|
|
41
|
+
<CloseIcon aria-hidden />
|
|
42
|
+
</Button>
|
|
43
|
+
}
|
|
44
|
+
/>
|
|
45
|
+
<DrawerContent>{content}</DrawerContent>
|
|
46
|
+
<DrawerFooter>
|
|
47
|
+
<Button appearance="transparent">Cancel</Button>
|
|
48
|
+
<Button sentiment="accented">Save</Button>
|
|
49
|
+
</DrawerFooter>
|
|
50
|
+
</Drawer>;
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Deprecated `DrawerCloseButton`. Use a `Button` with a `CloseIcon` in `DrawerHeader`'s `actions` instead.
|
|
54
|
+
|
|
55
|
+
### Patch Changes
|
|
56
|
+
|
|
57
|
+
- 0f92b84: Prevented disabled `Card` and `InteractableCard` components from receiving hover styling.
|
|
58
|
+
- 1417fa9: Fixed Tabs from announcing an ignored overflow selection when that value was later selected externally.
|
|
59
|
+
- dd17c26: Fixed duplicate menu close notifications during keyboard activation and prevented announcements from being queued after `AriaAnnouncerProvider` unmounts.
|
|
60
|
+
- d7e777c: Fixed `disableDismiss` on `Drawer` also preventing Escape from closing the drawer. It now only prevents dismissal on click away, matching its documentation and `Dialog`.
|
|
61
|
+
- 86080e7: Changed flat `Panel` instances to use sharp corners.
|
|
62
|
+
- f705932: Deprecated the `hoverable` prop on `Card`. Use `LinkCard` or `InteractableCard` when the entire card is interactive.
|
|
63
|
+
- 5ab650a: Fixed vertical alignment of smaller controls with larger controls in FormField.
|
|
64
|
+
|
|
3
65
|
## 1.70.0
|
|
4
66
|
|
|
5
67
|
### Minor Changes
|
package/css/salt-core.css
CHANGED
|
@@ -865,14 +865,17 @@ a.saltAvatar::after {
|
|
|
865
865
|
.saltCard {
|
|
866
866
|
border-width: var(--saltCard-borderWidth, var(--salt-size-fixed-100));
|
|
867
867
|
border-style: var(--salt-borderStyle-solid);
|
|
868
|
+
border-color: var(--saltCard-borderColor, var(--card-borderColor));
|
|
868
869
|
padding: var(--saltCard-padding, var(--card-padding));
|
|
869
870
|
position: relative;
|
|
870
|
-
box-shadow: var(--salt-overlayable-shadow);
|
|
871
871
|
transition: box-shadow var(--salt-duration-instant) ease-in-out;
|
|
872
872
|
box-sizing: border-box;
|
|
873
873
|
border-radius: var(--saltCard-borderRadius, var(--salt-palette-corner, 0));
|
|
874
874
|
overflow: hidden;
|
|
875
875
|
--card-accent-color: var(--salt-sentiment-accent-background);
|
|
876
|
+
--card-borderColor: var(--salt-container-borderColor);
|
|
877
|
+
--card-borderColor-strong: var(--salt-container-bold-borderColor);
|
|
878
|
+
--card-borderColor-subtle: var(--salt-container-subtle-borderColor);
|
|
876
879
|
--card-padding: var(--salt-spacing-200);
|
|
877
880
|
}
|
|
878
881
|
.saltCard.saltCard-sectioned {
|
|
@@ -889,19 +892,33 @@ a.saltAvatar::after {
|
|
|
889
892
|
}
|
|
890
893
|
.saltCard-primary {
|
|
891
894
|
background: var(--saltCard-background, var(--salt-container-primary-background));
|
|
892
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
893
895
|
}
|
|
894
896
|
.saltCard-secondary {
|
|
895
897
|
background: var(--saltCard-background, var(--salt-container-secondary-background));
|
|
896
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
897
898
|
}
|
|
898
899
|
.saltCard-tertiary {
|
|
899
900
|
background: var(--saltCard-background, var(--salt-container-tertiary-background));
|
|
900
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
901
901
|
}
|
|
902
902
|
.saltCard-ghost {
|
|
903
903
|
background: var(--saltCard-background, var(--salt-container-ghost-background));
|
|
904
|
-
|
|
904
|
+
--card-borderColor: var(--salt-container-ghost-borderColor);
|
|
905
|
+
--card-borderColor-strong: var(--salt-container-ghost-bold-borderColor);
|
|
906
|
+
--card-borderColor-subtle: var(--salt-container-ghost-subtle-borderColor);
|
|
907
|
+
}
|
|
908
|
+
.saltCard-flat {
|
|
909
|
+
box-shadow: var(--saltCard-boxShadow-flat, none);
|
|
910
|
+
}
|
|
911
|
+
.saltCard-raised {
|
|
912
|
+
box-shadow: var(--saltCard-boxShadow, var(--salt-overlayable-shadow));
|
|
913
|
+
}
|
|
914
|
+
.saltCard-borderColorStrong {
|
|
915
|
+
--card-borderColor: var(--card-borderColor-strong);
|
|
916
|
+
}
|
|
917
|
+
.saltCard-borderColorSubtle {
|
|
918
|
+
--card-borderColor: var(--card-borderColor-subtle);
|
|
919
|
+
}
|
|
920
|
+
.saltCard-borderColorNone {
|
|
921
|
+
--card-borderColor: transparent;
|
|
905
922
|
}
|
|
906
923
|
.saltCard-accent::after {
|
|
907
924
|
content: "";
|
|
@@ -941,10 +958,9 @@ a:focus .saltCard-interactable,
|
|
|
941
958
|
box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));
|
|
942
959
|
cursor: var(--saltCard-cursor-hover, var(--salt-cursor-hover));
|
|
943
960
|
border-color: var(--salt-actionable-accented-borderColor-hover);
|
|
944
|
-
position: relative;
|
|
945
961
|
}
|
|
946
962
|
@media (hover: hover) {
|
|
947
|
-
.saltCard-hoverable:hover {
|
|
963
|
+
.saltCard-hoverable:not(.saltCard-disabled):hover {
|
|
948
964
|
box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));
|
|
949
965
|
border-color: var(--salt-actionable-accented-borderColor-hover);
|
|
950
966
|
}
|
|
@@ -1480,6 +1496,14 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1480
1496
|
top: 0;
|
|
1481
1497
|
box-sizing: border-box;
|
|
1482
1498
|
}
|
|
1499
|
+
.saltDrawer.saltDrawer-sectioned {
|
|
1500
|
+
padding: 0;
|
|
1501
|
+
}
|
|
1502
|
+
@supports selector(:has(*)) {
|
|
1503
|
+
.saltDrawer:has(> .saltDrawerHeader, > .saltDrawerContent, > .saltDrawerFooter) {
|
|
1504
|
+
padding: 0;
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1483
1507
|
.saltDrawer-primary {
|
|
1484
1508
|
--drawer-background: var(--salt-container-primary-background);
|
|
1485
1509
|
}
|
|
@@ -1547,6 +1571,94 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1547
1571
|
margin-right: calc(var(--salt-spacing-300) * -1);
|
|
1548
1572
|
}
|
|
1549
1573
|
|
|
1574
|
+
/* src/drawer/DrawerContent.css */
|
|
1575
|
+
.saltDrawerContent {
|
|
1576
|
+
color: var(--salt-content-primary-foreground);
|
|
1577
|
+
padding: 0 var(--salt-spacing-300);
|
|
1578
|
+
flex: 1 1 auto;
|
|
1579
|
+
min-height: var(--salt-text-lineHeight);
|
|
1580
|
+
display: flex;
|
|
1581
|
+
box-sizing: border-box;
|
|
1582
|
+
}
|
|
1583
|
+
.saltDrawerContent:first-child {
|
|
1584
|
+
padding-top: var(--salt-spacing-300);
|
|
1585
|
+
}
|
|
1586
|
+
.saltDrawerContent:last-child {
|
|
1587
|
+
padding-bottom: var(--salt-spacing-300);
|
|
1588
|
+
}
|
|
1589
|
+
.saltDrawerContent-inner {
|
|
1590
|
+
flex: 1;
|
|
1591
|
+
min-width: 0;
|
|
1592
|
+
overflow-y: auto;
|
|
1593
|
+
border-top: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) transparent;
|
|
1594
|
+
border-bottom: var(--salt-size-fixed-100) var(--salt-borderStyle-solid) transparent;
|
|
1595
|
+
box-sizing: border-box;
|
|
1596
|
+
}
|
|
1597
|
+
.saltDrawerContent-inner:focus-visible {
|
|
1598
|
+
outline: var(--salt-focused-outline);
|
|
1599
|
+
outline-offset: calc(-1 * var(--salt-focused-outlineWidth));
|
|
1600
|
+
}
|
|
1601
|
+
.saltDrawerContent-inner.saltDrawerContent-scrollTop {
|
|
1602
|
+
border-top-color: var(--salt-separable-tertiary-borderColor);
|
|
1603
|
+
}
|
|
1604
|
+
.saltDrawerContent-inner.saltDrawerContent-scrollBottom {
|
|
1605
|
+
border-bottom-color: var(--salt-separable-tertiary-borderColor);
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
/* src/drawer/DrawerFooter.css */
|
|
1609
|
+
.saltDrawerFooter {
|
|
1610
|
+
padding: var(--salt-spacing-300);
|
|
1611
|
+
display: flex;
|
|
1612
|
+
justify-content: flex-end;
|
|
1613
|
+
align-items: center;
|
|
1614
|
+
gap: var(--salt-spacing-100);
|
|
1615
|
+
flex-shrink: 0;
|
|
1616
|
+
box-sizing: border-box;
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
/* src/drawer/DrawerHeader.css */
|
|
1620
|
+
.saltDrawerHeader {
|
|
1621
|
+
padding: var(--salt-spacing-300);
|
|
1622
|
+
display: flex;
|
|
1623
|
+
gap: var(--salt-spacing-100);
|
|
1624
|
+
flex-shrink: 0;
|
|
1625
|
+
box-sizing: border-box;
|
|
1626
|
+
}
|
|
1627
|
+
.saltDrawerHeader-header {
|
|
1628
|
+
margin: 0;
|
|
1629
|
+
}
|
|
1630
|
+
.saltDrawerHeader-container {
|
|
1631
|
+
flex-grow: 1;
|
|
1632
|
+
margin: 0;
|
|
1633
|
+
display: flex;
|
|
1634
|
+
flex-direction: column;
|
|
1635
|
+
gap: var(--salt-spacing-50);
|
|
1636
|
+
padding-top: calc((var(--salt-size-base) - var(--salt-text-h2-lineHeight)) / 2);
|
|
1637
|
+
align-items: flex-start;
|
|
1638
|
+
min-width: 0;
|
|
1639
|
+
word-break: break-word;
|
|
1640
|
+
}
|
|
1641
|
+
.saltDrawerHeader-header > .saltText {
|
|
1642
|
+
display: block;
|
|
1643
|
+
margin: 0;
|
|
1644
|
+
}
|
|
1645
|
+
.saltDrawerHeader-actionsContainer {
|
|
1646
|
+
align-self: flex-start;
|
|
1647
|
+
display: flex;
|
|
1648
|
+
}
|
|
1649
|
+
.saltDrawerHeader-withAccent {
|
|
1650
|
+
position: relative;
|
|
1651
|
+
}
|
|
1652
|
+
.saltDrawerHeader-withAccent::before {
|
|
1653
|
+
content: "";
|
|
1654
|
+
position: absolute;
|
|
1655
|
+
top: var(--salt-spacing-300);
|
|
1656
|
+
bottom: var(--salt-spacing-300);
|
|
1657
|
+
left: 0;
|
|
1658
|
+
width: var(--salt-size-bar);
|
|
1659
|
+
background: var(--salt-sentiment-accent-background);
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1550
1662
|
/* src/dropdown/Dropdown.css */
|
|
1551
1663
|
.saltDropdown {
|
|
1552
1664
|
all: unset;
|
|
@@ -1855,6 +1967,10 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1855
1967
|
grid-auto-rows: min-content;
|
|
1856
1968
|
grid-template-areas: "label" "controls";
|
|
1857
1969
|
}
|
|
1970
|
+
.saltFormField-labelTop.saltFormField-hasControls {
|
|
1971
|
+
align-content: start;
|
|
1972
|
+
grid-template-rows: min-content minmax(var(--salt-size-base), auto);
|
|
1973
|
+
}
|
|
1858
1974
|
.saltFormField-labelTop .saltFormFieldHelperText {
|
|
1859
1975
|
grid-area: 3 / 1;
|
|
1860
1976
|
}
|
|
@@ -1862,10 +1978,16 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1862
1978
|
grid-template-columns: var(--saltFormField-label-width, var(--formField-label-width, 40%)) 1fr;
|
|
1863
1979
|
grid-template-areas: "label controls";
|
|
1864
1980
|
}
|
|
1981
|
+
.saltFormField-labelLeft.saltFormField-hasControls {
|
|
1982
|
+
grid-template-rows: minmax(var(--salt-size-base), auto);
|
|
1983
|
+
}
|
|
1865
1984
|
.saltFormField-labelRight {
|
|
1866
1985
|
grid-template-columns: var(--saltFormField-label-width, var(--formField-label-width, 40%)) 1fr;
|
|
1867
1986
|
grid-template-areas: "label controls";
|
|
1868
1987
|
}
|
|
1988
|
+
.saltFormField-labelRight.saltFormField-hasControls {
|
|
1989
|
+
grid-template-rows: minmax(var(--salt-size-base), auto);
|
|
1990
|
+
}
|
|
1869
1991
|
.saltFormField-labelLeft .saltFormFieldHelperText,
|
|
1870
1992
|
.saltFormField-labelRight .saltFormFieldHelperText {
|
|
1871
1993
|
grid-area: 2 / 2;
|
|
@@ -1877,19 +1999,15 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1877
1999
|
.saltFormField-labelRight .saltFormFieldLabel {
|
|
1878
2000
|
text-align: right;
|
|
1879
2001
|
}
|
|
1880
|
-
.saltFormField-controls {
|
|
1881
|
-
align-items: center;
|
|
1882
|
-
display: grid;
|
|
1883
|
-
grid-auto-columns: minmax(0, 1fr);
|
|
1884
|
-
grid-auto-flow: column;
|
|
1885
|
-
grid-column-gap: var(--salt-spacing-100);
|
|
1886
|
-
}
|
|
1887
2002
|
.saltFormFieldLabel {
|
|
1888
2003
|
grid-area: label;
|
|
1889
2004
|
}
|
|
1890
2005
|
.saltFormFieldHelperText {
|
|
1891
2006
|
grid-area: helperText;
|
|
1892
2007
|
}
|
|
2008
|
+
.saltFormField-labelTop > :not(.saltFormFieldLabel):not(.saltFormFieldHelperText) {
|
|
2009
|
+
align-self: center;
|
|
2010
|
+
}
|
|
1893
2011
|
.saltFormField-disabled {
|
|
1894
2012
|
--saltInput-outline: none;
|
|
1895
2013
|
--saltCheckbox-outline: none;
|
|
@@ -1899,6 +2017,9 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1899
2017
|
.saltFormField:not(:has(.saltFormFieldLabel)) {
|
|
1900
2018
|
grid-template-areas: "controls";
|
|
1901
2019
|
}
|
|
2020
|
+
.saltFormField-hasControls:not(:has(.saltFormFieldLabel)) {
|
|
2021
|
+
grid-template-rows: minmax(var(--salt-size-base), auto);
|
|
2022
|
+
}
|
|
1902
2023
|
}
|
|
1903
2024
|
|
|
1904
2025
|
/* src/form-field/FormFieldHelperText.css */
|
|
@@ -1923,9 +2044,6 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
1923
2044
|
font-weight: var(--saltFormField-label-fontWeight, var(--salt-text-fontWeight-strong));
|
|
1924
2045
|
width: 100%;
|
|
1925
2046
|
}
|
|
1926
|
-
.saltFormFieldLabel:hover + .saltFormField-controls * {
|
|
1927
|
-
--input-borderColor: var(--input-borderColor-hover);
|
|
1928
|
-
}
|
|
1929
2047
|
.saltFormField-labelLeft .saltFormFieldLabel.saltText {
|
|
1930
2048
|
align-self: baseline;
|
|
1931
2049
|
padding-top: var(--salt-spacing-100);
|
|
@@ -2186,8 +2304,8 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2186
2304
|
.saltInteractableCard {
|
|
2187
2305
|
border-width: var(--saltInteractableCard-borderWidth, var(--salt-size-fixed-100));
|
|
2188
2306
|
border-style: var(--saltInteractableCard-borderStyle, var(--salt-borderStyle-solid));
|
|
2307
|
+
border-color: var(--saltInteractableCard-borderColor, var(--interactableCard-borderColor));
|
|
2189
2308
|
border-radius: var(--saltInteractableCard-borderRadius, var(--salt-palette-corner, 0));
|
|
2190
|
-
box-shadow: var(--salt-overlayable-shadow);
|
|
2191
2309
|
display: block;
|
|
2192
2310
|
padding: var(--saltInteractableCard-padding, var(--card-padding));
|
|
2193
2311
|
position: relative;
|
|
@@ -2195,6 +2313,7 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2195
2313
|
transition: box-shadow var(--salt-duration-instant) ease-in-out;
|
|
2196
2314
|
overflow: hidden;
|
|
2197
2315
|
--card-accent-color: var(--salt-sentiment-accent-background);
|
|
2316
|
+
--interactableCard-borderColor: var(--salt-container-borderColor);
|
|
2198
2317
|
--card-padding: var(--salt-spacing-200);
|
|
2199
2318
|
}
|
|
2200
2319
|
.saltInteractableCard.saltInteractableCard-sectioned {
|
|
@@ -2211,15 +2330,27 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2211
2330
|
}
|
|
2212
2331
|
.saltInteractableCard-primary {
|
|
2213
2332
|
background: var(--saltInteractableCard-background, var(--salt-container-primary-background));
|
|
2214
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
2215
2333
|
}
|
|
2216
2334
|
.saltInteractableCard-secondary {
|
|
2217
2335
|
background: var(--saltInteractableCard-background, var(--salt-container-secondary-background));
|
|
2218
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
2219
2336
|
}
|
|
2220
2337
|
.saltInteractableCard-tertiary {
|
|
2221
2338
|
background: var(--saltInteractableCard-background, var(--salt-container-tertiary-background));
|
|
2222
|
-
|
|
2339
|
+
}
|
|
2340
|
+
.saltInteractableCard-flat {
|
|
2341
|
+
box-shadow: var(--saltInteractableCard-boxShadow-flat, none);
|
|
2342
|
+
}
|
|
2343
|
+
.saltInteractableCard-raised {
|
|
2344
|
+
box-shadow: var(--saltInteractableCard-boxShadow, var(--salt-overlayable-shadow));
|
|
2345
|
+
}
|
|
2346
|
+
.saltInteractableCard-borderColorStrong {
|
|
2347
|
+
--interactableCard-borderColor: var(--salt-container-bold-borderColor);
|
|
2348
|
+
}
|
|
2349
|
+
.saltInteractableCard-borderColorSubtle {
|
|
2350
|
+
--interactableCard-borderColor: var(--salt-container-subtle-borderColor);
|
|
2351
|
+
}
|
|
2352
|
+
.saltInteractableCard-borderColorNone {
|
|
2353
|
+
--interactableCard-borderColor: transparent;
|
|
2223
2354
|
}
|
|
2224
2355
|
.saltInteractableCard-accent::after {
|
|
2225
2356
|
content: "";
|
|
@@ -2260,15 +2391,11 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2260
2391
|
outline-offset: var(--salt-focused-outlineOffset);
|
|
2261
2392
|
}
|
|
2262
2393
|
@media (hover: hover) {
|
|
2263
|
-
.saltInteractableCard:hover {
|
|
2394
|
+
.saltInteractableCard:not(.saltInteractableCard-disabled):hover {
|
|
2264
2395
|
cursor: var(--salt-cursor-hover);
|
|
2265
2396
|
box-shadow: var(--salt-overlayable-shadow-hover);
|
|
2266
2397
|
border-color: var(--salt-actionable-accented-borderColor-hover);
|
|
2267
2398
|
}
|
|
2268
|
-
.saltInteractableCard-disabled:hover {
|
|
2269
|
-
cursor: var(--salt-cursor-disabled);
|
|
2270
|
-
box-shadow: none;
|
|
2271
|
-
}
|
|
2272
2399
|
}
|
|
2273
2400
|
.saltInteractableCard-selected,
|
|
2274
2401
|
.saltInteractableCard:active,
|
|
@@ -2417,12 +2544,117 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2417
2544
|
-webkit-user-select: none;
|
|
2418
2545
|
}
|
|
2419
2546
|
|
|
2547
|
+
/* src/link-button/LinkButton.css */
|
|
2548
|
+
.saltLinkButton {
|
|
2549
|
+
--linkButton-borderWidth: var(--salt-size-fixed-100);
|
|
2550
|
+
align-items: var(--saltLinkButton-alignItems, center);
|
|
2551
|
+
appearance: none;
|
|
2552
|
+
background: var(--saltLinkButton-background, var(--linkButton-background));
|
|
2553
|
+
border-color: var(--saltLinkButton-borderColor, var(--linkButton-borderColor, transparent));
|
|
2554
|
+
border-style: var(--saltLinkButton-borderStyle, solid);
|
|
2555
|
+
border-width: var(--saltLinkButton-borderWidth, var(--linkButton-borderWidth));
|
|
2556
|
+
border-radius: var(--saltLinkButton-borderRadius, var(--salt-palette-corner-weak, 0));
|
|
2557
|
+
color: var(--saltLinkButton-text-color, var(--linkButton-text-color));
|
|
2558
|
+
display: inline-flex;
|
|
2559
|
+
gap: var(--salt-spacing-50);
|
|
2560
|
+
justify-content: var(--saltLinkButton-justifyContent, center);
|
|
2561
|
+
font-size: var(--saltLinkButton-fontSize, var(--salt-text-fontSize));
|
|
2562
|
+
font-family: var(--saltLinkButton-fontFamily, var(--salt-text-action-fontFamily));
|
|
2563
|
+
line-height: var(--saltLinkButton-lineHeight, var(--salt-text-lineHeight));
|
|
2564
|
+
letter-spacing: var(--saltLinkButton-letterSpacing, var(--salt-text-action-letterSpacing));
|
|
2565
|
+
text-transform: var(--saltLinkButton-textTransform, var(--salt-text-action-textTransform));
|
|
2566
|
+
padding: 0 var(--saltLinkButton-padding, calc(var(--salt-spacing-100) - var(--saltLinkButton-borderWidth, var(--linkButton-borderWidth))));
|
|
2567
|
+
margin: var(--saltLinkButton-margin, 0);
|
|
2568
|
+
height: var(--saltLinkButton-height, var(--salt-size-base));
|
|
2569
|
+
min-width: var(--saltLinkButton-minWidth, unset);
|
|
2570
|
+
position: relative;
|
|
2571
|
+
text-align: var(--saltLinkButton-textAlign, var(--salt-text-action-textAlign));
|
|
2572
|
+
text-decoration: var(--linkButton-textDecoration, var(--salt-typography-textDecoration-underline));
|
|
2573
|
+
text-underline-offset: var(--salt-spacing-fixed-200);
|
|
2574
|
+
transition: none;
|
|
2575
|
+
width: var(--saltLinkButton-width, auto);
|
|
2576
|
+
-webkit-appearance: none;
|
|
2577
|
+
-webkit-tap-highlight-color: transparent;
|
|
2578
|
+
font-weight: var(--saltLinkButton-fontWeight, var(--salt-text-action-fontWeight));
|
|
2579
|
+
}
|
|
2580
|
+
.saltLinkButton-underlineDefault {
|
|
2581
|
+
--linkButton-textDecoration: var(--salt-typography-textDecoration-underline);
|
|
2582
|
+
--linkButton-textDecoration-hover: var(--salt-typography-textDecoration-none);
|
|
2583
|
+
--linkButton-textDecoration-focus: var(--linkButton-textDecoration-hover);
|
|
2584
|
+
}
|
|
2585
|
+
.saltLinkButton-underlineNever {
|
|
2586
|
+
--linkButton-textDecoration: var(--salt-typography-textDecoration-none);
|
|
2587
|
+
--linkButton-textDecoration-hover: var(--salt-typography-textDecoration-none);
|
|
2588
|
+
--linkButton-textDecoration-focus: var(--salt-typography-textDecoration-none);
|
|
2589
|
+
}
|
|
2590
|
+
.saltLinkButton-externalLinkADA {
|
|
2591
|
+
position: absolute;
|
|
2592
|
+
width: 1px;
|
|
2593
|
+
height: 1px;
|
|
2594
|
+
padding: 0;
|
|
2595
|
+
margin: -1px;
|
|
2596
|
+
overflow: hidden;
|
|
2597
|
+
clip: rect(0, 0, 0, 0);
|
|
2598
|
+
clip-path: inset(50%);
|
|
2599
|
+
white-space: nowrap;
|
|
2600
|
+
border: 0;
|
|
2601
|
+
user-select: none;
|
|
2602
|
+
-webkit-user-select: none;
|
|
2603
|
+
}
|
|
2604
|
+
@media (hover: hover) {
|
|
2605
|
+
.saltLinkButton:hover {
|
|
2606
|
+
background: var(--saltLinkButton-background-hover, var(--linkButton-background-hover));
|
|
2607
|
+
color: var(--saltLinkButton-text-color-hover, var(--linkButton-text-color-hover));
|
|
2608
|
+
border-color: var(--saltLinkButton-borderColor-hover, var(--linkButton-borderColor-hover));
|
|
2609
|
+
cursor: var(--salt-cursor-hover);
|
|
2610
|
+
text-decoration: var(--linkButton-textDecoration-hover, var(--salt-typography-textDecoration-none));
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2613
|
+
.saltLinkButton:focus-visible {
|
|
2614
|
+
outline: var(--salt-focused-outline);
|
|
2615
|
+
background: var(--saltLinkButton-background-hover, var(--linkButton-background-hover));
|
|
2616
|
+
color: var(--saltLinkButton-text-color-hover, var(--linkButton-text-color-hover));
|
|
2617
|
+
border-color: var(--saltLinkButton-borderColor-hover, var(--linkButton-borderColor-hover));
|
|
2618
|
+
text-decoration: var(--linkButton-textDecoration-focus, var(--salt-typography-textDecoration-none));
|
|
2619
|
+
}
|
|
2620
|
+
.saltLinkButton.saltLinkButton-active:focus-visible,
|
|
2621
|
+
.saltLinkButton:focus-visible:active,
|
|
2622
|
+
.saltLinkButton:active,
|
|
2623
|
+
.saltLinkButton.saltLinkButton-active {
|
|
2624
|
+
background: var(--saltLinkButton-background-active, var(--linkButton-background-active));
|
|
2625
|
+
color: var(--saltLinkButton-text-color-active, var(--linkButton-text-color-active));
|
|
2626
|
+
border-color: var(--saltLinkButton-borderColor-active, var(--linkButton-borderColor-active));
|
|
2627
|
+
cursor: var(--salt-cursor-active);
|
|
2628
|
+
}
|
|
2629
|
+
.saltLinkButton-neutral {
|
|
2630
|
+
--linkButton-text-color: var(--salt-actionable-subtle-foreground);
|
|
2631
|
+
--linkButton-text-color-hover: var(--salt-actionable-subtle-foreground-hover);
|
|
2632
|
+
--linkButton-text-color-active: var(--salt-actionable-subtle-foreground-active);
|
|
2633
|
+
--linkButton-background: var(--salt-actionable-subtle-background);
|
|
2634
|
+
--linkButton-background-hover: var(--salt-actionable-subtle-background-hover);
|
|
2635
|
+
--linkButton-background-active: var(--salt-actionable-subtle-background-active);
|
|
2636
|
+
--linkButton-borderColor: var(--salt-actionable-subtle-borderColor);
|
|
2637
|
+
--linkButton-borderColor-hover: var(--salt-actionable-subtle-borderColor-hover);
|
|
2638
|
+
--linkButton-borderColor-active: var(--salt-actionable-subtle-borderColor-active);
|
|
2639
|
+
}
|
|
2640
|
+
.saltLinkButton-accented {
|
|
2641
|
+
--linkButton-text-color: var(--salt-actionable-accented-subtle-foreground);
|
|
2642
|
+
--linkButton-text-color-hover: var(--salt-actionable-accented-subtle-foreground-hover);
|
|
2643
|
+
--linkButton-text-color-active: var(--salt-actionable-accented-subtle-foreground-active);
|
|
2644
|
+
--linkButton-background: var(--salt-actionable-accented-subtle-background);
|
|
2645
|
+
--linkButton-background-hover: var(--salt-actionable-accented-subtle-background-hover);
|
|
2646
|
+
--linkButton-background-active: var(--salt-actionable-accented-subtle-background-active);
|
|
2647
|
+
--linkButton-borderColor: var(--salt-actionable-accented-subtle-borderColor);
|
|
2648
|
+
--linkButton-borderColor-hover: var(--salt-actionable-accented-subtle-borderColor-hover);
|
|
2649
|
+
--linkButton-borderColor-active: var(--salt-actionable-accented-subtle-borderColor-active);
|
|
2650
|
+
}
|
|
2651
|
+
|
|
2420
2652
|
/* src/link-card/LinkCard.css */
|
|
2421
2653
|
.saltLinkCard {
|
|
2422
2654
|
border-radius: var(--saltLinkCard-borderRadius, var(--salt-palette-corner, 0));
|
|
2423
2655
|
border-style: var(--saltLinkCard-borderStyle, var(--salt-borderStyle-solid));
|
|
2424
2656
|
border-width: var(--saltLinkCard-borderWidth, var(--salt-size-fixed-100));
|
|
2425
|
-
|
|
2657
|
+
border-color: var(--saltLinkCard-borderColor, var(--linkCard-borderColor));
|
|
2426
2658
|
display: block;
|
|
2427
2659
|
overflow: hidden;
|
|
2428
2660
|
padding: var(--saltLinkCard-padding, var(--card-padding));
|
|
@@ -2430,6 +2662,7 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2430
2662
|
text-decoration: none;
|
|
2431
2663
|
transition: box-shadow var(--salt-duration-instant) ease-in-out;
|
|
2432
2664
|
--linkCard-accent-color: var(--salt-sentiment-accent-background);
|
|
2665
|
+
--linkCard-borderColor: var(--salt-container-borderColor);
|
|
2433
2666
|
--card-padding: var(--salt-spacing-200);
|
|
2434
2667
|
}
|
|
2435
2668
|
.saltLinkCard.saltLinkCard-sectioned {
|
|
@@ -2446,15 +2679,27 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
2446
2679
|
}
|
|
2447
2680
|
.saltLinkCard-primary {
|
|
2448
2681
|
background: var(--saltLinkCard-background, var(--salt-container-primary-background));
|
|
2449
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
2450
2682
|
}
|
|
2451
2683
|
.saltLinkCard-secondary {
|
|
2452
2684
|
background: var(--saltLinkCard-background, var(--salt-container-secondary-background));
|
|
2453
|
-
border-color: var(--salt-container-bold-borderColor);
|
|
2454
2685
|
}
|
|
2455
2686
|
.saltLinkCard-tertiary {
|
|
2456
2687
|
background: var(--saltLinkCard-background, var(--salt-container-tertiary-background));
|
|
2457
|
-
|
|
2688
|
+
}
|
|
2689
|
+
.saltLinkCard-flat {
|
|
2690
|
+
box-shadow: var(--saltLinkCard-boxShadow-flat, none);
|
|
2691
|
+
}
|
|
2692
|
+
.saltLinkCard-raised {
|
|
2693
|
+
box-shadow: var(--saltLinkCard-boxShadow, var(--salt-overlayable-shadow));
|
|
2694
|
+
}
|
|
2695
|
+
.saltLinkCard-borderColorStrong {
|
|
2696
|
+
--linkCard-borderColor: var(--salt-container-bold-borderColor);
|
|
2697
|
+
}
|
|
2698
|
+
.saltLinkCard-borderColorSubtle {
|
|
2699
|
+
--linkCard-borderColor: var(--salt-container-subtle-borderColor);
|
|
2700
|
+
}
|
|
2701
|
+
.saltLinkCard-borderColorNone {
|
|
2702
|
+
--linkCard-borderColor: transparent;
|
|
2458
2703
|
}
|
|
2459
2704
|
.saltLinkCard-accent::after {
|
|
2460
2705
|
content: "";
|
|
@@ -3624,9 +3869,12 @@ a:focus .saltCard-interactable.saltCard-disabled {
|
|
|
3624
3869
|
overflow: auto;
|
|
3625
3870
|
padding: var(--saltPanel-padding, var(--salt-spacing-300));
|
|
3626
3871
|
width: var(--saltPanel-width, 100%);
|
|
3627
|
-
border-radius: var(--saltPanel-borderRadius, var(--salt-palette-corner, 0));
|
|
3628
3872
|
box-sizing: border-box;
|
|
3629
3873
|
}
|
|
3874
|
+
.saltPanel-raised {
|
|
3875
|
+
border-radius: var(--saltPanel-borderRadius, var(--salt-palette-corner, 0));
|
|
3876
|
+
box-shadow: var(--saltPanel-boxShadow, var(--salt-overlayable-shadow));
|
|
3877
|
+
}
|
|
3630
3878
|
|
|
3631
3879
|
/* src/parent-child-layout/ParentChildLayout.css */
|
|
3632
3880
|
.saltParentChildLayout {
|
|
@@ -7157,4 +7405,4 @@ label.saltText small,
|
|
|
7157
7405
|
box-shadow: 0 calc(var(--salt-size-fixed-100) * -1) 0 0 var(--salt-selectable-borderColor-selected), 0 var(--salt-size-fixed-100) 0 0 var(--salt-selectable-borderColor-selected);
|
|
7158
7406
|
}
|
|
7159
7407
|
|
|
7160
|
-
/* src/
|
|
7408
|
+
/* src/cb166099-faaf-4d81-b955-72294da7c0cb.css */
|
|
@@ -23,6 +23,7 @@ const AriaAnnouncerProvider = React.forwardRef(function AriaAnnouncerProvider2({
|
|
|
23
23
|
const [politeAnnouncements, setPoliteAnnouncements] = React.useState([]);
|
|
24
24
|
const [assertiveAnnouncements, setAssertiveAnnouncements] = React.useState([]);
|
|
25
25
|
const idCounterRef = React.useRef(0);
|
|
26
|
+
const isMountedRef = React.useRef(true);
|
|
26
27
|
const timeoutsRef = React.useRef(/* @__PURE__ */ new Set());
|
|
27
28
|
const scheduleRemoval = React.useCallback(
|
|
28
29
|
(id, assertiveness, duration) => {
|
|
@@ -40,6 +41,7 @@ const AriaAnnouncerProvider = React.forwardRef(function AriaAnnouncerProvider2({
|
|
|
40
41
|
);
|
|
41
42
|
const makeAnnouncement = React.useCallback(
|
|
42
43
|
(message, assertiveness = "polite", duration = ANNOUNCEMENT_TIME_IN_DOM) => {
|
|
44
|
+
if (!isMountedRef.current) return;
|
|
43
45
|
idCounterRef.current += 1;
|
|
44
46
|
const id = `announce-${assertiveness}-${Date.now()}-${idCounterRef.current}`;
|
|
45
47
|
if (assertiveness === "polite") {
|
|
@@ -55,6 +57,12 @@ const AriaAnnouncerProvider = React.forwardRef(function AriaAnnouncerProvider2({
|
|
|
55
57
|
},
|
|
56
58
|
[scheduleRemoval]
|
|
57
59
|
);
|
|
60
|
+
React.useEffect(() => {
|
|
61
|
+
isMountedRef.current = true;
|
|
62
|
+
return () => {
|
|
63
|
+
isMountedRef.current = false;
|
|
64
|
+
};
|
|
65
|
+
}, []);
|
|
58
66
|
React.useEffect(() => {
|
|
59
67
|
const timeouts = timeoutsRef.current;
|
|
60
68
|
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":["forwardRef","AnnouncementRegion","jsx","AriaAnnouncerProvider","useWindow","useState","useRef","useCallback","useEffect","useMemo","useIsomorphicLayoutEffect","registerAnnouncementTarget","jsxs","AriaAnnouncerContext"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
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
|
|
3
|
+
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";
|
|
4
4
|
|
|
5
5
|
module.exports = css_248z;
|
|
6
6
|
//# sourceMappingURL=Card.css.js.map
|