@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.
Files changed (117) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/css/salt-core.css +280 -32
  3. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js +8 -0
  4. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  5. package/dist-cjs/card/Card.css.js +1 -1
  6. package/dist-cjs/card/Card.js +4 -0
  7. package/dist-cjs/card/Card.js.map +1 -1
  8. package/dist-cjs/drawer/Drawer.css.js +1 -1
  9. package/dist-cjs/drawer/Drawer.js +30 -5
  10. package/dist-cjs/drawer/Drawer.js.map +1 -1
  11. package/dist-cjs/drawer/DrawerCloseButton.js +1 -1
  12. package/dist-cjs/drawer/DrawerCloseButton.js.map +1 -1
  13. package/dist-cjs/drawer/DrawerContent.css.js +6 -0
  14. package/dist-cjs/drawer/DrawerContent.css.js.map +1 -0
  15. package/dist-cjs/drawer/DrawerContent.js +75 -0
  16. package/dist-cjs/drawer/DrawerContent.js.map +1 -0
  17. package/dist-cjs/drawer/DrawerContext.js +30 -0
  18. package/dist-cjs/drawer/DrawerContext.js.map +1 -0
  19. package/dist-cjs/drawer/DrawerFooter.css.js +6 -0
  20. package/dist-cjs/drawer/DrawerFooter.css.js.map +1 -0
  21. package/dist-cjs/drawer/DrawerFooter.js +30 -0
  22. package/dist-cjs/drawer/DrawerFooter.js.map +1 -0
  23. package/dist-cjs/drawer/DrawerHeader.css.js +6 -0
  24. package/dist-cjs/drawer/DrawerHeader.css.js.map +1 -0
  25. package/dist-cjs/drawer/DrawerHeader.js +95 -0
  26. package/dist-cjs/drawer/DrawerHeader.js.map +1 -0
  27. package/dist-cjs/drawer/hasDrawerSection.js +22 -0
  28. package/dist-cjs/drawer/hasDrawerSection.js.map +1 -0
  29. package/dist-cjs/form-field/FormField.css.js +1 -1
  30. package/dist-cjs/form-field/FormField.js +15 -0
  31. package/dist-cjs/form-field/FormField.js.map +1 -1
  32. package/dist-cjs/form-field/FormFieldLabel.css.js +1 -1
  33. package/dist-cjs/index.js +8 -0
  34. package/dist-cjs/index.js.map +1 -1
  35. package/dist-cjs/interactable-card/InteractableCard.css.js +1 -1
  36. package/dist-cjs/interactable-card/InteractableCard.js +5 -0
  37. package/dist-cjs/interactable-card/InteractableCard.js.map +1 -1
  38. package/dist-cjs/link-button/LinkButton.css.js +6 -0
  39. package/dist-cjs/link-button/LinkButton.css.js.map +1 -0
  40. package/dist-cjs/link-button/LinkButton.js +87 -0
  41. package/dist-cjs/link-button/LinkButton.js.map +1 -0
  42. package/dist-cjs/link-card/LinkCard.css.js +1 -1
  43. package/dist-cjs/link-card/LinkCard.js +4 -0
  44. package/dist-cjs/link-card/LinkCard.js.map +1 -1
  45. package/dist-cjs/menu/MenuItem.js +0 -1
  46. package/dist-cjs/menu/MenuItem.js.map +1 -1
  47. package/dist-cjs/panel/Panel.css.js +1 -1
  48. package/dist-cjs/panel/Panel.js +13 -2
  49. package/dist-cjs/panel/Panel.js.map +1 -1
  50. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js +10 -2
  51. package/dist-cjs/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -1
  52. package/dist-es/aria-announcer/AriaAnnouncerProvider.js +8 -0
  53. package/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  54. package/dist-es/card/Card.css.js +1 -1
  55. package/dist-es/card/Card.js +4 -0
  56. package/dist-es/card/Card.js.map +1 -1
  57. package/dist-es/drawer/Drawer.css.js +1 -1
  58. package/dist-es/drawer/Drawer.js +31 -6
  59. package/dist-es/drawer/Drawer.js.map +1 -1
  60. package/dist-es/drawer/DrawerCloseButton.js +1 -1
  61. package/dist-es/drawer/DrawerCloseButton.js.map +1 -1
  62. package/dist-es/drawer/DrawerContent.css.js +4 -0
  63. package/dist-es/drawer/DrawerContent.css.js.map +1 -0
  64. package/dist-es/drawer/DrawerContent.js +73 -0
  65. package/dist-es/drawer/DrawerContent.js.map +1 -0
  66. package/dist-es/drawer/DrawerContext.js +27 -0
  67. package/dist-es/drawer/DrawerContext.js.map +1 -0
  68. package/dist-es/drawer/DrawerFooter.css.js +4 -0
  69. package/dist-es/drawer/DrawerFooter.css.js.map +1 -0
  70. package/dist-es/drawer/DrawerFooter.js +28 -0
  71. package/dist-es/drawer/DrawerFooter.js.map +1 -0
  72. package/dist-es/drawer/DrawerHeader.css.js +4 -0
  73. package/dist-es/drawer/DrawerHeader.css.js.map +1 -0
  74. package/dist-es/drawer/DrawerHeader.js +93 -0
  75. package/dist-es/drawer/DrawerHeader.js.map +1 -0
  76. package/dist-es/drawer/hasDrawerSection.js +20 -0
  77. package/dist-es/drawer/hasDrawerSection.js.map +1 -0
  78. package/dist-es/form-field/FormField.css.js +1 -1
  79. package/dist-es/form-field/FormField.js +16 -1
  80. package/dist-es/form-field/FormField.js.map +1 -1
  81. package/dist-es/form-field/FormFieldLabel.css.js +1 -1
  82. package/dist-es/index.js +4 -0
  83. package/dist-es/index.js.map +1 -1
  84. package/dist-es/interactable-card/InteractableCard.css.js +1 -1
  85. package/dist-es/interactable-card/InteractableCard.js +5 -0
  86. package/dist-es/interactable-card/InteractableCard.js.map +1 -1
  87. package/dist-es/link-button/LinkButton.css.js +4 -0
  88. package/dist-es/link-button/LinkButton.css.js.map +1 -0
  89. package/dist-es/link-button/LinkButton.js +85 -0
  90. package/dist-es/link-button/LinkButton.js.map +1 -0
  91. package/dist-es/link-card/LinkCard.css.js +1 -1
  92. package/dist-es/link-card/LinkCard.js +4 -0
  93. package/dist-es/link-card/LinkCard.js.map +1 -1
  94. package/dist-es/menu/MenuItem.js +0 -1
  95. package/dist-es/menu/MenuItem.js.map +1 -1
  96. package/dist-es/panel/Panel.css.js +1 -1
  97. package/dist-es/panel/Panel.js +13 -2
  98. package/dist-es/panel/Panel.js.map +1 -1
  99. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js +10 -2
  100. package/dist-es/tabs/internal/overflow/useOverflowSelectionState.js.map +1 -1
  101. package/dist-types/card/Card.d.ts +10 -0
  102. package/dist-types/drawer/Drawer.d.ts +1 -1
  103. package/dist-types/drawer/DrawerCloseButton.d.ts +3 -0
  104. package/dist-types/drawer/DrawerContent.d.ts +3 -0
  105. package/dist-types/drawer/DrawerContext.d.ts +9 -0
  106. package/dist-types/drawer/DrawerFooter.d.ts +3 -0
  107. package/dist-types/drawer/DrawerHeader.d.ts +24 -0
  108. package/dist-types/drawer/hasDrawerSection.d.ts +2 -0
  109. package/dist-types/drawer/index.d.ts +3 -0
  110. package/dist-types/index.d.ts +1 -0
  111. package/dist-types/interactable-card/InteractableCard.d.ts +9 -1
  112. package/dist-types/link-button/LinkButton.d.ts +26 -0
  113. package/dist-types/link-button/index.d.ts +1 -0
  114. package/dist-types/link-card/LinkCard.d.ts +8 -0
  115. package/dist-types/panel/Panel.d.ts +4 -0
  116. package/dist-types/utils/useIsomorphicLayoutEffect.d.ts +2 -2
  117. package/package.json +11 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrawerHeader.js","sources":["../src/drawer/DrawerHeader.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 ReactNode,\n} from \"react\";\nimport { H2, Text } from \"../text\";\nimport { makePrefixer, useId, useIsomorphicLayoutEffect } from \"../utils\";\nimport { useDrawerContext } from \"./DrawerContext\";\nimport drawerHeaderCss from \"./DrawerHeader.css\";\n\nconst withBaseName = makePrefixer(\"saltDrawerHeader\");\n\nexport interface DrawerHeaderProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * Hides the accent bar in the Drawer Header. Defaults to `false`.\n */\n disableAccent?: boolean;\n /**\n * Displays the header at the top of the Drawer\n */\n header?: ReactNode;\n /**\n * Displays the preheader just above the header\n **/\n preheader?: ReactNode;\n /**\n * Description text is displayed just below the header\n **/\n description?: ReactNode;\n /**\n * Actions to be displayed in header\n */\n actions?: ReactNode;\n}\n\nexport const DrawerHeader = forwardRef<HTMLDivElement, DrawerHeaderProps>(\n function DrawerHeader(props, ref) {\n const {\n actions,\n className,\n description,\n disableAccent,\n header,\n preheader,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-drawer-header\",\n css: drawerHeaderCss,\n window: targetWindow,\n });\n\n const { setHeaderId, setDescriptionId } = useDrawerContext();\n const headingId = useId();\n const descriptionId = useId();\n const hasHeading = Boolean(header || preheader);\n const hasDescription = Boolean(description);\n\n useIsomorphicLayoutEffect(() => {\n setHeaderId?.(hasHeading ? headingId : undefined);\n\n return () => {\n setHeaderId?.(undefined);\n };\n }, [hasHeading, headingId, setHeaderId]);\n\n useIsomorphicLayoutEffect(() => {\n setDescriptionId?.(hasDescription ? descriptionId : undefined);\n\n return () => {\n setDescriptionId?.(undefined);\n };\n }, [hasDescription, descriptionId, setDescriptionId]);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"withAccent\")]: !disableAccent,\n },\n className,\n )}\n ref={ref}\n {...rest}\n >\n <div className={withBaseName(\"container\")}>\n {hasHeading && (\n <H2 id={headingId} className={withBaseName(\"header\")}>\n {preheader && (\n <Text as=\"span\" color=\"primary\">\n {preheader}\n </Text>\n )}\n {header}\n </H2>\n )}\n {description && (\n <Text\n id={descriptionId}\n color=\"secondary\"\n className={withBaseName(\"description\")}\n >\n {description}\n </Text>\n )}\n </div>\n {actions && (\n <div className={withBaseName(\"actionsContainer\")}>{actions}</div>\n )}\n </div>\n );\n },\n);\n"],"names":["DrawerHeader","drawerHeaderCss"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Children, isValidElement, Fragment } from 'react';
2
+ import { DrawerContent } from './DrawerContent.js';
3
+ import { DrawerFooter } from './DrawerFooter.js';
4
+ import { DrawerHeader } from './DrawerHeader.js';
5
+
6
+ const drawerSectionTypes = [DrawerHeader, DrawerContent, DrawerFooter];
7
+ function hasDrawerSection(children) {
8
+ return Children.toArray(children).some((child) => {
9
+ if (!isValidElement(child)) return false;
10
+ if (child.type === Fragment) {
11
+ return hasDrawerSection(
12
+ child.props.children
13
+ );
14
+ }
15
+ return drawerSectionTypes.some((sectionType) => child.type === sectionType);
16
+ });
17
+ }
18
+
19
+ export { hasDrawerSection };
20
+ //# sourceMappingURL=hasDrawerSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasDrawerSection.js","sources":["../src/drawer/hasDrawerSection.ts"],"sourcesContent":["import { Children, Fragment, isValidElement, type ReactNode } from \"react\";\nimport { DrawerContent } from \"./DrawerContent\";\nimport { DrawerFooter } from \"./DrawerFooter\";\nimport { DrawerHeader } from \"./DrawerHeader\";\n\nconst drawerSectionTypes = [DrawerHeader, DrawerContent, DrawerFooter];\n\nexport function hasDrawerSection(children: ReactNode): boolean {\n return Children.toArray(children).some((child) => {\n if (!isValidElement(child)) return false;\n\n if (child.type === Fragment) {\n return hasDrawerSection(\n (child.props as { children?: ReactNode }).children,\n );\n }\n\n return drawerSectionTypes.some((sectionType) => child.type === sectionType);\n });\n}\n"],"names":[],"mappings":";;;;;AAKA,MAAM,kBAAA,GAAqB,CAAC,YAAA,EAAc,aAAA,EAAe,YAAY,CAAA;AAE9D,SAAS,iBAAiB,QAAA,EAA8B;AAC7D,EAAA,OAAO,SAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAChD,IAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,OAAO,gBAAA;AAAA,QACJ,MAAM,KAAA,CAAmC;AAAA,OAC5C;AAAA,IACF;AAEA,IAAA,OAAO,mBAAmB,IAAA,CAAK,CAAC,WAAA,KAAgB,KAAA,CAAM,SAAS,WAAW,CAAA;AAAA,EAC5E,CAAC,CAAA;AACH;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltFormField {\n display: inline-grid;\n position: relative;\n gap: var(--salt-spacing-100);\n text-align: left;\n width: var(--saltFormField-width, 100%);\n\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n}\n\n.saltFormField-labelTop {\n gap: var(--salt-spacing-75);\n grid-auto-rows: min-content;\n grid-template-areas:\n \"label\"\n \"controls\";\n}\n\n.saltFormField-labelTop .saltFormFieldHelperText {\n grid-area: 3 / 1;\n}\n\n.saltFormField-labelLeft {\n grid-template-columns: var(--saltFormField-label-width, var(--formField-label-width, 40%)) 1fr;\n grid-template-areas: \"label controls\";\n}\n\n.saltFormField-labelRight {\n grid-template-columns: var(--saltFormField-label-width, var(--formField-label-width, 40%)) 1fr;\n grid-template-areas: \"label controls\";\n}\n\n.saltFormField-labelLeft .saltFormFieldHelperText,\n.saltFormField-labelRight .saltFormFieldHelperText {\n grid-area: 2 / 2;\n}\n\n.saltFormField-labelRight .saltFormFieldLabel,\n.saltFormField-labelLeft .saltFormFieldLabel {\n padding-top: var(--salt-spacing-100);\n}\n\n.saltFormField-labelRight .saltFormFieldLabel {\n text-align: right;\n}\n\n.saltFormField-controls {\n align-items: center;\n display: grid;\n grid-auto-columns: minmax(0, 1fr);\n grid-auto-flow: column;\n grid-column-gap: var(--salt-spacing-100);\n}\n\n.saltFormFieldLabel {\n grid-area: label;\n}\n\n.saltFormFieldHelperText {\n grid-area: helperText;\n}\n\n.saltFormField-disabled {\n --saltInput-outline: none;\n --saltCheckbox-outline: none;\n --saltRadioButton-outline: none;\n}\n\n@supports selector(:has(*)) {\n .saltFormField:not(:has(.saltFormFieldLabel)) {\n grid-template-areas: \"controls\";\n }\n}\n";
1
+ var css_248z = ".saltFormField {\n display: inline-grid;\n position: relative;\n gap: var(--salt-spacing-100);\n text-align: left;\n width: var(--saltFormField-width, 100%);\n\n font-family: var(--salt-text-fontFamily);\n font-size: var(--salt-text-fontSize);\n font-weight: var(--salt-text-fontWeight);\n line-height: var(--salt-text-lineHeight);\n}\n\n.saltFormField-labelTop {\n gap: var(--salt-spacing-75);\n grid-auto-rows: min-content;\n grid-template-areas:\n \"label\"\n \"controls\";\n}\n\n.saltFormField-labelTop.saltFormField-hasControls {\n align-content: start;\n grid-template-rows: min-content minmax(var(--salt-size-base), auto);\n}\n\n.saltFormField-labelTop .saltFormFieldHelperText {\n grid-area: 3 / 1;\n}\n\n.saltFormField-labelLeft {\n grid-template-columns: var(--saltFormField-label-width, var(--formField-label-width, 40%)) 1fr;\n grid-template-areas: \"label controls\";\n}\n\n.saltFormField-labelLeft.saltFormField-hasControls {\n grid-template-rows: minmax(var(--salt-size-base), auto);\n}\n\n.saltFormField-labelRight {\n grid-template-columns: var(--saltFormField-label-width, var(--formField-label-width, 40%)) 1fr;\n grid-template-areas: \"label controls\";\n}\n\n.saltFormField-labelRight.saltFormField-hasControls {\n grid-template-rows: minmax(var(--salt-size-base), auto);\n}\n\n.saltFormField-labelLeft .saltFormFieldHelperText,\n.saltFormField-labelRight .saltFormFieldHelperText {\n grid-area: 2 / 2;\n}\n\n.saltFormField-labelRight .saltFormFieldLabel,\n.saltFormField-labelLeft .saltFormFieldLabel {\n padding-top: var(--salt-spacing-100);\n}\n\n.saltFormField-labelRight .saltFormFieldLabel {\n text-align: right;\n}\n\n.saltFormFieldLabel {\n grid-area: label;\n}\n\n.saltFormFieldHelperText {\n grid-area: helperText;\n}\n\n.saltFormField-labelTop > :not(.saltFormFieldLabel):not(.saltFormFieldHelperText) {\n align-self: center;\n}\n\n.saltFormField-disabled {\n --saltInput-outline: none;\n --saltCheckbox-outline: none;\n --saltRadioButton-outline: none;\n}\n\n@supports selector(:has(*)) {\n .saltFormField:not(:has(.saltFormFieldLabel)) {\n grid-template-areas: \"controls\";\n }\n\n .saltFormField-hasControls:not(:has(.saltFormFieldLabel)) {\n grid-template-rows: minmax(var(--salt-size-base), auto);\n }\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=FormField.css.js.map
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { useComponentCssInjection } from '@salt-ds/styles';
3
3
  import { useWindow } from '@salt-ds/window';
4
4
  import { clsx } from 'clsx';
5
- import { forwardRef, useRef } from 'react';
5
+ import { forwardRef, useRef, Children, isValidElement, Fragment } from 'react';
6
6
  import { FormFieldContext } from '../form-field-context/FormFieldContext.js';
7
7
  import { capitalize } from '../utils/capitalize.js';
8
8
  import { makePrefixer } from '../utils/makePrefixer.js';
@@ -12,8 +12,21 @@ import { useId } from '../utils/useId.js';
12
12
  import '../salt-provider/SaltProvider.js';
13
13
  import '../viewport/ViewportProvider.js';
14
14
  import css_248z from './FormField.css.js';
15
+ import { FormFieldHelperText } from './FormFieldHelperText.js';
16
+ import { FormFieldLabel } from './FormFieldLabel.js';
15
17
 
16
18
  const withBaseName = makePrefixer("saltFormField");
19
+ function hasFormFieldControls(children) {
20
+ return Children.toArray(children).some((child) => {
21
+ if (!isValidElement(child)) {
22
+ return true;
23
+ }
24
+ if (child.type === Fragment) {
25
+ return hasFormFieldControls(child.props.children);
26
+ }
27
+ return child.type !== FormFieldLabel && child.type !== FormFieldHelperText;
28
+ });
29
+ }
17
30
  const FormField = forwardRef(
18
31
  ({
19
32
  children,
@@ -35,6 +48,7 @@ const FormField = forwardRef(
35
48
  const formFieldRef = useRef(null);
36
49
  const handleRef = useForkRef(ref, formFieldRef);
37
50
  const formId = useId(idProp);
51
+ const hasControls = hasFormFieldControls(children);
38
52
  const labelId = formId ? `label-${formId}` : void 0;
39
53
  const helperTextId = formId ? `helperText-${formId}` : void 0;
40
54
  return /* @__PURE__ */ jsx(
@@ -45,6 +59,7 @@ const FormField = forwardRef(
45
59
  withBaseName(),
46
60
  {
47
61
  [withBaseName("disabled")]: disabled,
62
+ [withBaseName("hasControls")]: hasControls,
48
63
  [withBaseName(`label${capitalize(labelPlacement)}`)]: labelPlacement
49
64
  },
50
65
  className
@@ -1 +1 @@
1
- {"version":3,"file":"FormField.js","sources":["../src/form-field/FormField.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, type HTMLAttributes, useRef } from \"react\";\nimport {\n type A11yValueProps,\n FormFieldContext,\n type FormFieldValidationStatus,\n} from \"../form-field-context\";\nimport { capitalize, makePrefixer, useForkRef, useId } from \"../utils\";\n\nimport formFieldCss from \"./FormField.css\";\n\nexport type FormFieldLabelPlacement = \"top\" | \"left\" | \"right\";\n\nexport interface FormFieldProps\n extends HTMLAttributes<HTMLDivElement>,\n A11yValueProps {\n /**\n * If `true`, the field will be disabled.\n */\n disabled?: boolean;\n /**\n * Location of the label relative to the control.\n *\n * Either 'top', 'left', or 'right'`.\n */\n labelPlacement?: FormFieldLabelPlacement;\n /**\n * If `true`, the field will be read-only.\n */\n readOnly?: boolean;\n /**\n * Optional id prop\n *\n * Used as suffix of FormFieldLabel id: `label-{id}`\n * Used as suffix of FormFieldHelperText id: `helperText-{id}`\n */\n id?: string;\n /**\n * Displays necessity on label\n */\n necessity?: \"required\" | \"optional\" | \"asterisk\";\n /**\n * Validation status\n */\n validationStatus?: FormFieldValidationStatus;\n}\n\nconst withBaseName = makePrefixer(\"saltFormField\");\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n (\n {\n children,\n className,\n disabled = false,\n id: idProp,\n labelPlacement = \"top\",\n necessity,\n readOnly = false,\n validationStatus,\n ...restProps\n },\n ref,\n ) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-form-field\",\n css: formFieldCss,\n window: targetWindow,\n });\n\n const formFieldRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, formFieldRef);\n\n const formId = useId(idProp);\n\n const labelId = formId ? `label-${formId}` : undefined;\n const helperTextId = formId ? `helperText-${formId}` : undefined;\n\n return (\n <div\n ref={handleRef}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(`label${capitalize(labelPlacement)}`)]:\n labelPlacement,\n },\n className,\n )}\n {...restProps}\n >\n <FormFieldContext.Provider\n value={{\n a11yProps: {\n \"aria-labelledby\": labelId,\n \"aria-describedby\": helperTextId,\n },\n disabled,\n necessity,\n readOnly,\n validationStatus,\n formFieldRef,\n }}\n >\n {children}\n </FormFieldContext.Provider>\n </div>\n );\n },\n);\n"],"names":["formFieldCss"],"mappings":";;;;;;;;;;;;;;;AAiDA,MAAM,YAAA,GAAe,aAAa,eAAe,CAAA;AAE1C,MAAM,SAAA,GAAY,UAAA;AAAA,EACvB,CACE;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,EAAA,EAAI,MAAA;AAAA,IACJ,cAAA,GAAiB,KAAA;AAAA,IACjB,SAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,gBAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,iBAAA;AAAA,MACR,GAAA,EAAKA,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,EAAK,YAAY,CAAA;AAE9C,IAAA,MAAM,MAAA,GAAS,MAAM,MAAM,CAAA;AAE3B,IAAA,MAAM,OAAA,GAAU,MAAA,GAAS,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA,GAAK,MAAA;AAC7C,IAAA,MAAM,YAAA,GAAe,MAAA,GAAS,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,GAAK,MAAA;AAEvD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,aAAa,CAAA,KAAA,EAAQ,UAAA,CAAW,cAAc,CAAC,CAAA,CAAE,CAAC,GACjD;AAAA,WACJ;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,SAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA;AAAA,UAAC,gBAAA,CAAiB,QAAA;AAAA,UAAjB;AAAA,YACC,KAAA,EAAO;AAAA,cACL,SAAA,EAAW;AAAA,gBACT,iBAAA,EAAmB,OAAA;AAAA,gBACnB,kBAAA,EAAoB;AAAA,eACtB;AAAA,cACA,QAAA;AAAA,cACA,SAAA;AAAA,cACA,QAAA;AAAA,cACA,gBAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC;AAAA;AAAA;AACH;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"FormField.js","sources":["../src/form-field/FormField.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n Children,\n Fragment,\n forwardRef,\n type HTMLAttributes,\n isValidElement,\n type ReactNode,\n useRef,\n} from \"react\";\nimport {\n type A11yValueProps,\n FormFieldContext,\n type FormFieldValidationStatus,\n} from \"../form-field-context\";\nimport { capitalize, makePrefixer, useForkRef, useId } from \"../utils\";\n\nimport formFieldCss from \"./FormField.css\";\nimport { FormFieldHelperText } from \"./FormFieldHelperText\";\nimport { FormFieldLabel } from \"./FormFieldLabel\";\n\nexport type FormFieldLabelPlacement = \"top\" | \"left\" | \"right\";\n\nexport interface FormFieldProps\n extends HTMLAttributes<HTMLDivElement>,\n A11yValueProps {\n /**\n * If `true`, the field will be disabled.\n */\n disabled?: boolean;\n /**\n * Location of the label relative to the control.\n *\n * Either 'top', 'left', or 'right'`.\n */\n labelPlacement?: FormFieldLabelPlacement;\n /**\n * If `true`, the field will be read-only.\n */\n readOnly?: boolean;\n /**\n * Optional id prop\n *\n * Used as suffix of FormFieldLabel id: `label-{id}`\n * Used as suffix of FormFieldHelperText id: `helperText-{id}`\n */\n id?: string;\n /**\n * Displays necessity on label\n */\n necessity?: \"required\" | \"optional\" | \"asterisk\";\n /**\n * Validation status\n */\n validationStatus?: FormFieldValidationStatus;\n}\n\nconst withBaseName = makePrefixer(\"saltFormField\");\n\nfunction hasFormFieldControls(children: ReactNode): boolean {\n return Children.toArray(children).some((child) => {\n if (!isValidElement<{ children?: ReactNode }>(child)) {\n return true;\n }\n\n if (child.type === Fragment) {\n return hasFormFieldControls(child.props.children);\n }\n\n return child.type !== FormFieldLabel && child.type !== FormFieldHelperText;\n });\n}\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n (\n {\n children,\n className,\n disabled = false,\n id: idProp,\n labelPlacement = \"top\",\n necessity,\n readOnly = false,\n validationStatus,\n ...restProps\n },\n ref,\n ) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-form-field\",\n css: formFieldCss,\n window: targetWindow,\n });\n\n const formFieldRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, formFieldRef);\n\n const formId = useId(idProp);\n const hasControls = hasFormFieldControls(children);\n\n const labelId = formId ? `label-${formId}` : undefined;\n const helperTextId = formId ? `helperText-${formId}` : undefined;\n\n return (\n <div\n ref={handleRef}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"hasControls\")]: hasControls,\n [withBaseName(`label${capitalize(labelPlacement)}`)]:\n labelPlacement,\n },\n className,\n )}\n {...restProps}\n >\n <FormFieldContext.Provider\n value={{\n a11yProps: {\n \"aria-labelledby\": labelId,\n \"aria-describedby\": helperTextId,\n },\n disabled,\n necessity,\n readOnly,\n validationStatus,\n formFieldRef,\n }}\n >\n {children}\n </FormFieldContext.Provider>\n </div>\n );\n },\n);\n"],"names":["formFieldCss"],"mappings":";;;;;;;;;;;;;;;;;AA2DA,MAAM,YAAA,GAAe,aAAa,eAAe,CAAA;AAEjD,SAAS,qBAAqB,QAAA,EAA8B;AAC1D,EAAA,OAAO,SAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAChD,IAAA,IAAI,CAAC,cAAA,CAAyC,KAAK,CAAA,EAAG;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,OAAO,oBAAA,CAAqB,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,KAAS,cAAA,IAAkB,KAAA,CAAM,IAAA,KAAS,mBAAA;AAAA,EACzD,CAAC,CAAA;AACH;AAEO,MAAM,SAAA,GAAY,UAAA;AAAA,EACvB,CACE;AAAA,IACE,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,EAAA,EAAI,MAAA;AAAA,IACJ,cAAA,GAAiB,KAAA;AAAA,IACjB,SAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,gBAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,iBAAA;AAAA,MACR,GAAA,EAAKA,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,EAAK,YAAY,CAAA;AAE9C,IAAA,MAAM,MAAA,GAAS,MAAM,MAAM,CAAA;AAC3B,IAAA,MAAM,WAAA,GAAc,qBAAqB,QAAQ,CAAA;AAEjD,IAAA,MAAM,OAAA,GAAU,MAAA,GAAS,CAAA,MAAA,EAAS,MAAM,CAAA,CAAA,GAAK,MAAA;AAC7C,IAAA,MAAM,YAAA,GAAe,MAAA,GAAS,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,GAAK,MAAA;AAEvD,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb;AAAA,YACE,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,QAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,aAAa,CAAC,GAAG,WAAA;AAAA,YAC/B,CAAC,aAAa,CAAA,KAAA,EAAQ,UAAA,CAAW,cAAc,CAAC,CAAA,CAAE,CAAC,GACjD;AAAA,WACJ;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,SAAA;AAAA,QAEJ,QAAA,kBAAA,GAAA;AAAA,UAAC,gBAAA,CAAiB,QAAA;AAAA,UAAjB;AAAA,YACC,KAAA,EAAO;AAAA,cACL,SAAA,EAAW;AAAA,gBACT,iBAAA,EAAmB,OAAA;AAAA,gBACnB,kBAAA,EAAoB;AAAA,eACtB;AAAA,cACA,QAAA;AAAA,cACA,SAAA;AAAA,cACA,QAAA;AAAA,cACA,gBAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC;AAAA;AAAA;AACH;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = ".saltFormFieldLabel.saltText {\n font-weight: var(--saltFormField-label-fontWeight, var(--salt-text-fontWeight-strong));\n width: 100%;\n}\n\n.saltFormFieldLabel:hover + .saltFormField-controls * {\n --input-borderColor: var(--input-borderColor-hover);\n}\n\n.saltFormField-labelLeft .saltFormFieldLabel.saltText {\n align-self: baseline;\n padding-top: var(--salt-spacing-100);\n}\n\n.saltFormField-labelTop .saltFormFieldLabel.saltText {\n width: fit-content;\n}\n\n.saltFormFieldLabel-necessityLabel {\n font-weight: var(--salt-text-fontWeight);\n font-style: var(--salt-typography-textDecoration-italic);\n}\n\n.saltFormFieldLabel-sentence.saltText {\n color: var(--salt-content-primary-foreground);\n font-size: var(--salt-text-fontSize);\n}\n";
1
+ var css_248z = ".saltFormFieldLabel.saltText {\n font-weight: var(--saltFormField-label-fontWeight, var(--salt-text-fontWeight-strong));\n width: 100%;\n}\n\n.saltFormField-labelLeft .saltFormFieldLabel.saltText {\n align-self: baseline;\n padding-top: var(--salt-spacing-100);\n}\n\n.saltFormField-labelTop .saltFormFieldLabel.saltText {\n width: fit-content;\n}\n\n.saltFormFieldLabel-necessityLabel {\n font-weight: var(--salt-text-fontWeight);\n font-style: var(--salt-typography-textDecoration-italic);\n}\n\n.saltFormFieldLabel-sentence.saltText {\n color: var(--salt-content-primary-foreground);\n font-size: var(--salt-text-fontSize);\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=FormFieldLabel.css.js.map
package/dist-es/index.js CHANGED
@@ -42,6 +42,9 @@ export { DialogHeader } from './dialog/DialogHeader.js';
42
42
  export { Divider } from './divider/Divider.js';
43
43
  export { Drawer } from './drawer/Drawer.js';
44
44
  export { DrawerCloseButton } from './drawer/DrawerCloseButton.js';
45
+ export { DrawerContent } from './drawer/DrawerContent.js';
46
+ export { DrawerFooter } from './drawer/DrawerFooter.js';
47
+ export { DrawerHeader } from './drawer/DrawerHeader.js';
45
48
  export { Dropdown } from './dropdown/Dropdown.js';
46
49
  export { FileDropZone } from './file-drop-zone/FileDropZone.js';
47
50
  export { FileDropZoneIcon } from './file-drop-zone/FileDropZoneIcon.js';
@@ -62,6 +65,7 @@ export { InteractableCardGroup } from './interactable-card/InteractableCardGroup
62
65
  export { InteractableCardGroupContext, useInteractableCardGroup } from './interactable-card/InteractableCardGroupContext.js';
63
66
  export { Kbd } from './kbd/Kbd.js';
64
67
  export { Link } from './link/Link.js';
68
+ export { LinkButton } from './link-button/LinkButton.js';
65
69
  export { LinkCard } from './link-card/LinkCard.js';
66
70
  export { ListBox } from './list-box/ListBox.js';
67
71
  export { useListControlContext } from './list-control/ListControlContext.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = "/* Styles applied to InteractableCard */\n.saltInteractableCard {\n border-width: var(--saltInteractableCard-borderWidth, var(--salt-size-fixed-100));\n border-style: var(--saltInteractableCard-borderStyle, var(--salt-borderStyle-solid));\n border-radius: var(--saltInteractableCard-borderRadius, var(--salt-palette-corner, 0));\n box-shadow: var(--salt-overlayable-shadow);\n display: block;\n padding: var(--saltInteractableCard-padding, var(--card-padding));\n position: relative;\n text-align: start;\n transition: box-shadow var(--salt-duration-instant) ease-in-out;\n overflow: hidden;\n --card-accent-color: var(--salt-sentiment-accent-background);\n --card-padding: var(--salt-spacing-200);\n}\n\n.saltInteractableCard.saltInteractableCard-sectioned {\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n@supports selector(:has(*)) {\n .saltInteractableCard:has(> .saltCardHeader, > .saltCardContent, > .saltCardFooter) {\n padding: 0;\n display: flex;\n flex-direction: column;\n }\n}\n\n/* Styles applied to InteractableCard when variant=\"primary\" */\n.saltInteractableCard-primary {\n background: var(--saltInteractableCard-background, var(--salt-container-primary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied to InteractableCard when variant=\"secondary\" */\n.saltInteractableCard-secondary {\n background: var(--saltInteractableCard-background, var(--salt-container-secondary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied to InteractableCard when variant=\"tertiary\" */\n.saltInteractableCard-tertiary {\n background: var(--saltInteractableCard-background, var(--salt-container-tertiary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied to create accent */\n.saltInteractableCard-accent::after {\n content: \"\";\n position: absolute;\n background-color: var(--saltInteractableCard-accent-color, var(--card-accent-color));\n}\n\n/* Styles applied to InteractableCard if `accent=\"bottom\"` */\n.saltInteractableCard-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 InteractableCard if `accent=\"left\"` */\n.saltInteractableCard-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 InteractableCard if `accent=\"top\"` */\n.saltInteractableCard-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 InteractableCard if `accent=\"right\"` */\n.saltInteractableCard-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 InteractableCard on focus */\n.saltInteractableCard:focus-visible {\n cursor: var(--salt-cursor-hover);\n box-shadow: var(--salt-overlayable-shadow-hover);\n color: var(--saltInteractableCard-color-focus, var(--salt-content-primary-foreground));\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}\n\n/* Styles applied on hover state to InteractableCard */\n@media (hover: hover) {\n .saltInteractableCard: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 .saltInteractableCard-disabled:hover {\n cursor: var(--salt-cursor-disabled);\n box-shadow: none;\n }\n}\n\n/* Styles applied on active state to InteractableCard and if `selected={true}` */\n.saltInteractableCard-selected,\n.saltInteractableCard:active,\n.saltInteractableCard-active {\n cursor: var(--salt-cursor-hover);\n box-shadow: var(--salt-overlayable-shadow);\n border-color: var(--salt-actionable-accented-borderColor-active);\n}\n\n/* Styles applied to InteractableCard if `disabled={true}` */\n.saltInteractableCard-disabled,\n.saltInteractableCard-disabled:focus,\n.saltInteractableCard-disabled:focus-visible,\n.saltInteractableCard-disabled:hover,\n.saltInteractableCard-disabled:active {\n box-shadow: none;\n cursor: var(--salt-cursor-disabled);\n outline: none;\n opacity: 0.4;\n}\n\n/* Styles applied to nested divs in InteractableCard if `disabled={true}` */\n.saltInteractableCard-disabled div {\n pointer-events: none;\n}\n";
1
+ var css_248z = "/* Styles applied to InteractableCard */\n.saltInteractableCard {\n border-width: var(--saltInteractableCard-borderWidth, var(--salt-size-fixed-100));\n border-style: var(--saltInteractableCard-borderStyle, var(--salt-borderStyle-solid));\n border-color: var(--saltInteractableCard-borderColor, var(--interactableCard-borderColor));\n border-radius: var(--saltInteractableCard-borderRadius, var(--salt-palette-corner, 0));\n display: block;\n padding: var(--saltInteractableCard-padding, var(--card-padding));\n position: relative;\n text-align: start;\n transition: box-shadow var(--salt-duration-instant) ease-in-out;\n overflow: hidden;\n --card-accent-color: var(--salt-sentiment-accent-background);\n --interactableCard-borderColor: var(--salt-container-borderColor);\n --card-padding: var(--salt-spacing-200);\n}\n\n.saltInteractableCard.saltInteractableCard-sectioned {\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n@supports selector(:has(*)) {\n .saltInteractableCard:has(> .saltCardHeader, > .saltCardContent, > .saltCardFooter) {\n padding: 0;\n display: flex;\n flex-direction: column;\n }\n}\n\n/* Styles applied to InteractableCard when variant=\"primary\" */\n.saltInteractableCard-primary {\n background: var(--saltInteractableCard-background, var(--salt-container-primary-background));\n}\n\n/* Styles applied to InteractableCard when variant=\"secondary\" */\n.saltInteractableCard-secondary {\n background: var(--saltInteractableCard-background, var(--salt-container-secondary-background));\n}\n\n/* Styles applied to InteractableCard when variant=\"tertiary\" */\n.saltInteractableCard-tertiary {\n background: var(--saltInteractableCard-background, var(--salt-container-tertiary-background));\n}\n\n/* Styles applied when elevation=\"flat\" */\n.saltInteractableCard-flat {\n box-shadow: var(--saltInteractableCard-boxShadow-flat, none);\n}\n\n/* Styles applied when elevation=\"raised\" */\n.saltInteractableCard-raised {\n box-shadow: var(--saltInteractableCard-boxShadow, var(--salt-overlayable-shadow));\n}\n\n/* Styles applied when borderColor=\"strong\" */\n.saltInteractableCard-borderColorStrong {\n --interactableCard-borderColor: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied when borderColor=\"subtle\" */\n.saltInteractableCard-borderColorSubtle {\n --interactableCard-borderColor: var(--salt-container-subtle-borderColor);\n}\n\n/* Styles applied when borderColor=\"none\" */\n.saltInteractableCard-borderColorNone {\n --interactableCard-borderColor: transparent;\n}\n\n/* Styles applied to create accent */\n.saltInteractableCard-accent::after {\n content: \"\";\n position: absolute;\n background-color: var(--saltInteractableCard-accent-color, var(--card-accent-color));\n}\n\n/* Styles applied to InteractableCard if `accent=\"bottom\"` */\n.saltInteractableCard-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 InteractableCard if `accent=\"left\"` */\n.saltInteractableCard-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 InteractableCard if `accent=\"top\"` */\n.saltInteractableCard-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 InteractableCard if `accent=\"right\"` */\n.saltInteractableCard-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 InteractableCard on focus */\n.saltInteractableCard:focus-visible {\n cursor: var(--salt-cursor-hover);\n box-shadow: var(--salt-overlayable-shadow-hover);\n color: var(--saltInteractableCard-color-focus, var(--salt-content-primary-foreground));\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}\n\n/* Styles applied on hover state to InteractableCard */\n@media (hover: hover) {\n .saltInteractableCard:not(.saltInteractableCard-disabled):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 InteractableCard and if `selected={true}` */\n.saltInteractableCard-selected,\n.saltInteractableCard:active,\n.saltInteractableCard-active {\n cursor: var(--salt-cursor-hover);\n box-shadow: var(--salt-overlayable-shadow);\n border-color: var(--salt-actionable-accented-borderColor-active);\n}\n\n/* Styles applied to InteractableCard if `disabled={true}` */\n.saltInteractableCard-disabled,\n.saltInteractableCard-disabled:focus,\n.saltInteractableCard-disabled:focus-visible,\n.saltInteractableCard-disabled:hover,\n.saltInteractableCard-disabled:active {\n box-shadow: none;\n cursor: var(--salt-cursor-disabled);\n outline: none;\n opacity: 0.4;\n}\n\n/* Styles applied to nested divs in InteractableCard if `disabled={true}` */\n.saltInteractableCard-disabled div {\n pointer-events: none;\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=InteractableCard.css.js.map
@@ -21,9 +21,11 @@ const InteractableCard = forwardRef(function InteractableCard2(props, ref) {
21
21
  const {
22
22
  accent,
23
23
  accentPlacement,
24
+ borderColor,
24
25
  children,
25
26
  className,
26
27
  disabled: disabledProp,
28
+ elevation = "raised",
27
29
  variant = "primary",
28
30
  value,
29
31
  onBlur,
@@ -88,6 +90,7 @@ const InteractableCard = forwardRef(function InteractableCard2(props, ref) {
88
90
  const sectioned = hasCardSection(children);
89
91
  return (
90
92
  // 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.
93
+ // biome-ignore lint/a11y/useKeyWithClickEvents: Keyboard event handlers are provided by cardProps.
91
94
  /* @__PURE__ */ jsx(
92
95
  "div",
93
96
  {
@@ -99,9 +102,11 @@ const InteractableCard = forwardRef(function InteractableCard2(props, ref) {
99
102
  className: clsx(
100
103
  withBaseName(),
101
104
  withBaseName(variant),
105
+ borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),
102
106
  {
103
107
  [withBaseName("accent")]: accentValue,
104
108
  [withBaseName(`accent${capitalize(accentValue ?? "")}`)]: accentValue,
109
+ [withBaseName(elevation || "")]: elevation,
105
110
  [withBaseName("active")]: role === "button" && active,
106
111
  [withBaseName("disabled")]: disabled,
107
112
  [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 { capitalize, makePrefixer, useControlled, useForkRef } 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 * Accent border position: defaults to \"bottom\"\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\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 children,\n className,\n disabled: disabledProp,\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 (interactableCardGroup && !disabled) {\n interactableCardGroup.select(event, value);\n setSelected(!selected);\n }\n onChange?.(event);\n onClick?.(event);\n };\n\n let tabIndex: number;\n\n if (interactableCardGroup) {\n if (disabled) {\n tabIndex = -1;\n } else if (isMultiselect) {\n tabIndex = 0; // All items focusable in multi-select\n } else {\n // Single select: Only selected or first item (if none are selected) is focusable\n tabIndex = selected ? 0 : -1;\n if (!interactableCardGroup.value && isFirstChild) {\n tabIndex = 0;\n }\n }\n } else {\n tabIndex = disabled ? -1 : 0;\n }\n\n const cardRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, cardRef);\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 <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 {\n [withBaseName(\"accent\")]: accentValue,\n [withBaseName(`accent${capitalize(accentValue ?? \"\")}`)]: accentValue,\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":["InteractableCard","interactableCardCss"],"mappings":"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"}
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 { capitalize, makePrefixer, useControlled, useForkRef } 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 (interactableCardGroup && !disabled) {\n interactableCardGroup.select(event, value);\n setSelected(!selected);\n }\n onChange?.(event);\n onClick?.(event);\n };\n\n let tabIndex: number;\n\n if (interactableCardGroup) {\n if (disabled) {\n tabIndex = -1;\n } else if (isMultiselect) {\n tabIndex = 0; // All items focusable in multi-select\n } else {\n // Single select: Only selected or first item (if none are selected) is focusable\n tabIndex = selected ? 0 : -1;\n if (!interactableCardGroup.value && isFirstChild) {\n tabIndex = 0;\n }\n }\n } else {\n tabIndex = disabled ? -1 : 0;\n }\n\n const cardRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(ref, cardRef);\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":["InteractableCard","interactableCardCss"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ 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";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=LinkButton.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkButton.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,85 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import { clsx } from 'clsx';
5
+ import { forwardRef, cloneElement } from 'react';
6
+ import '../button/Button.js';
7
+ import { useButton } from '../button/useButton.js';
8
+ import { useIcon } from '../semantic-icon-provider/SemanticIconProvider.js';
9
+ import { capitalize } from '../utils/capitalize.js';
10
+ import { makePrefixer } from '../utils/makePrefixer.js';
11
+ import { renderProps } from '../utils/renderProps.js';
12
+ import '../utils/useFloatingUI/useFloatingUI.js';
13
+ import '../utils/useId.js';
14
+ import '../salt-provider/SaltProvider.js';
15
+ import '../viewport/ViewportProvider.js';
16
+ import css_248z from './LinkButton.css.js';
17
+
18
+ const withBaseName = makePrefixer("saltLinkButton");
19
+ const LinkButton = forwardRef(
20
+ function LinkButton2(props, ref) {
21
+ const {
22
+ children,
23
+ className,
24
+ IconComponent,
25
+ onBlur,
26
+ onClick,
27
+ onKeyDown,
28
+ onKeyUp,
29
+ sentiment = "neutral",
30
+ target = "_self",
31
+ underline = "default",
32
+ ...rest
33
+ } = props;
34
+ const { active, buttonProps } = useButton({
35
+ onBlur,
36
+ onClick,
37
+ onKeyDown,
38
+ onKeyUp
39
+ });
40
+ const { tabIndex: _tabIndex, ...activeStateProps } = buttonProps;
41
+ const targetWindow = useWindow();
42
+ useComponentCssInjection({
43
+ testId: "salt-link-button",
44
+ css: css_248z,
45
+ window: targetWindow
46
+ });
47
+ const { ExternalIcon } = useIcon();
48
+ const LinkButtonIconComponent = IconComponent === void 0 ? ExternalIcon : IconComponent;
49
+ const linkButton = renderProps("a", {
50
+ className: clsx(
51
+ withBaseName(),
52
+ withBaseName(sentiment),
53
+ withBaseName(`underline${capitalize(underline)}`),
54
+ { [withBaseName("active")]: active },
55
+ className
56
+ ),
57
+ ...activeStateProps,
58
+ ...rest,
59
+ ref,
60
+ target,
61
+ children
62
+ });
63
+ if (linkButton.props.target !== "_blank") {
64
+ return linkButton;
65
+ }
66
+ return cloneElement(
67
+ linkButton,
68
+ void 0,
69
+ /* @__PURE__ */ jsxs(Fragment, { children: [
70
+ linkButton.props.children,
71
+ LinkButtonIconComponent && /* @__PURE__ */ jsx(
72
+ LinkButtonIconComponent,
73
+ {
74
+ className: withBaseName("icon"),
75
+ "aria-hidden": true
76
+ }
77
+ ),
78
+ /* @__PURE__ */ jsx("span", { className: withBaseName("externalLinkADA"), children: "Opens in a new tab" })
79
+ ] })
80
+ );
81
+ }
82
+ );
83
+
84
+ export { LinkButton };
85
+ //# 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":["LinkButton","linkButtonCss"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,MAAM,YAAA,GAAe,aAAa,gBAAgB,CAAA;AAyB3C,MAAM,UAAA,GAAa,UAAA;AAAA,EACxB,SAASA,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,GAAI,SAAA,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,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,kBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,MAAM,EAAE,YAAA,EAAa,GAAI,OAAA,EAAQ;AAEjC,IAAA,MAAM,uBAAA,GACJ,aAAA,KAAkB,MAAA,GAAY,YAAA,GAAe,aAAA;AAE/C,IAAA,MAAM,UAAA,GAAa,YAAY,GAAA,EAAK;AAAA,MAClC,SAAA,EAAW,IAAA;AAAA,QACT,YAAA,EAAa;AAAA,QACb,aAAa,SAAS,CAAA;AAAA,QACtB,YAAA,CAAa,CAAA,SAAA,EAAY,UAAA,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,OAAO,YAAA;AAAA,MACL,UAAA;AAAA,MACA,MAAA;AAAA,sBACA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,UAAA,CAAW,KAAA,CAAM,QAAA;AAAA,QACjB,uBAAA,oBACC,GAAA;AAAA,UAAC,uBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,YAC9B,aAAA,EAAW;AAAA;AAAA,SACb;AAAA,4BAED,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,iBAAiB,GAAG,QAAA,EAAA,oBAAA,EAElD;AAAA,OAAA,EACF;AAAA,KACF;AAAA,EACF;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- 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 box-shadow: var(--salt-overlayable-shadow);\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 --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 border-color: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied to LinkCard when variant=\"secondary\" */\n.saltLinkCard-secondary {\n background: var(--saltLinkCard-background, var(--salt-container-secondary-background));\n border-color: var(--salt-container-bold-borderColor);\n}\n\n/* Styles applied to LinkCard when variant=\"tertiary\" */\n.saltLinkCard-tertiary {\n background: var(--saltLinkCard-background, var(--salt-container-tertiary-background));\n border-color: var(--salt-container-bold-borderColor);\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\"` (default) */\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";
1
+ 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";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=LinkCard.css.js.map
@@ -17,8 +17,10 @@ const LinkCard = forwardRef(
17
17
  function LinkCard2(props, ref) {
18
18
  const {
19
19
  accent,
20
+ borderColor,
20
21
  children,
21
22
  className,
23
+ elevation = "raised",
22
24
  href,
23
25
  variant = "primary",
24
26
  ...rest
@@ -36,9 +38,11 @@ const LinkCard = forwardRef(
36
38
  className: clsx(
37
39
  withBaseName(),
38
40
  withBaseName(variant),
41
+ borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),
39
42
  {
40
43
  [withBaseName("accent")]: accent,
41
44
  [withBaseName(`accent${capitalize(accent ?? "")}`)]: accent,
45
+ [withBaseName(elevation || "")]: elevation,
42
46
  [withBaseName("sectioned")]: sectioned
43
47
  },
44
48
  className
@@ -1 +1 @@
1
- {"version":3,"file":"LinkCard.js","sources":["../src/link-card/LinkCard.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { hasCardSection } from \"../card/hasCardSection\";\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport linkCardCss from \"./LinkCard.css\";\n\nconst withBaseName = makePrefixer(\"saltLinkCard\");\n\nexport interface LinkCardProps extends ComponentPropsWithoutRef<\"a\"> {\n /**\n * If provided an accent is shown in the specified position.\n */\n accent?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nexport const LinkCard = forwardRef<HTMLAnchorElement, LinkCardProps>(\n function LinkCard(props, ref) {\n const {\n accent,\n children,\n className,\n href,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-link-card\",\n css: linkCardCss,\n window: targetWindow,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n <a\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent ?? \"\")}`)]: accent,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n href={href}\n {...rest}\n ref={ref}\n >\n {children}\n </a>\n );\n },\n);\n"],"names":["LinkCard","linkCardCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AAazC,MAAM,QAAA,GAAW,UAAA;AAAA,EACtB,SAASA,SAAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,gBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,IAAA,uBACE,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAAS,UAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAA;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"LinkCard.js","sources":["../src/link-card/LinkCard.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithoutRef, forwardRef } from \"react\";\n\nimport { hasCardSection } from \"../card/hasCardSection\";\nimport { capitalize, makePrefixer } from \"../utils\";\n\nimport linkCardCss from \"./LinkCard.css\";\n\nconst withBaseName = makePrefixer(\"saltLinkCard\");\n\nexport interface LinkCardProps extends ComponentPropsWithoutRef<\"a\"> {\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 * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nexport const LinkCard = forwardRef<HTMLAnchorElement, LinkCardProps>(\n function LinkCard(props, ref) {\n const {\n accent,\n borderColor,\n children,\n className,\n elevation = \"raised\",\n href,\n variant = \"primary\",\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-link-card\",\n css: linkCardCss,\n window: targetWindow,\n });\n\n const sectioned = hasCardSection(children);\n\n return (\n <a\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n borderColor && withBaseName(`borderColor${capitalize(borderColor)}`),\n {\n [withBaseName(\"accent\")]: accent,\n [withBaseName(`accent${capitalize(accent ?? \"\")}`)]: accent,\n [withBaseName(elevation || \"\")]: elevation,\n [withBaseName(\"sectioned\")]: sectioned,\n },\n className,\n )}\n href={href}\n {...rest}\n ref={ref}\n >\n {children}\n </a>\n );\n },\n);\n"],"names":["LinkCard","linkCardCss"],"mappings":";;;;;;;;;;;;;;AAUA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AAqBzC,MAAM,QAAA,GAAW,UAAA;AAAA,EACtB,SAASA,SAAAA,CAAS,KAAA,EAAO,GAAA,EAAK;AAC5B,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,GAAY,QAAA;AAAA,MACZ,IAAA;AAAA,MACA,OAAA,GAAU,SAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,IAAA,wBAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,gBAAA;AAAA,MACR,GAAA,EAAKC,QAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,eAAe,QAAQ,CAAA;AAEzC,IAAA,uBACE,GAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,IAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB,eAAe,YAAA,CAAa,CAAA,WAAA,EAAc,UAAA,CAAW,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,UACnE;AAAA,YACE,CAAC,YAAA,CAAa,QAAQ,CAAC,GAAG,MAAA;AAAA,YAC1B,CAAC,aAAa,CAAA,MAAA,EAAS,UAAA,CAAW,UAAU,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,MAAA;AAAA,YACrD,CAAC,YAAA,CAAa,SAAA,IAAa,EAAE,CAAC,GAAG,SAAA;AAAA,YACjC,CAAC,YAAA,CAAa,WAAW,CAAC,GAAG;AAAA,WAC/B;AAAA,UACA;AAAA,SACF;AAAA,QACA,IAAA;AAAA,QACC,GAAG,IAAA;AAAA,QACJ,GAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -70,7 +70,6 @@ const MenuItem = forwardRef(
70
70
  new window.MouseEvent("click", eventInit)
71
71
  );
72
72
  });
73
- tree == null ? void 0 : tree.events.emit("click");
74
73
  }
75
74
  },
76
75
  onClick(event) {
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItem.js","sources":["../src/menu/MenuItem.tsx"],"sourcesContent":["import { useFloatingTree, useListItem } from \"@floating-ui/react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n} from \"react\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer, useForkRef } from \"../utils\";\nimport { useMenuContext } from \"./MenuContext\";\nimport menuItemCss from \"./MenuItem.css\";\nimport { useMenuPanelContext } from \"./MenuPanelContext\";\nimport { useIsMenuTrigger } from \"./MenuTriggerContext\";\nexport interface MenuItemProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If `true`, the item will be disabled.\n */\n disabled?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltMenuItem\");\n\nexport const MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n function MenuItem(props, ref) {\n const {\n children,\n className,\n disabled,\n onClick,\n onFocus,\n onKeyDown,\n ...rest\n } = props;\n\n const { triggersSubmenu, blurActive } = useIsMenuTrigger();\n const { setTriggerDisabled } = useMenuContext();\n const { ExpandGroupIcon } = useIcon();\n const { activeIndex, getItemProps, setFocusInside } = useMenuPanelContext();\n const item = useListItem();\n const tree = useFloatingTree();\n const active = item.index === activeIndex;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-menu-item\",\n css: menuItemCss,\n window: targetWindow,\n });\n const handleRef = useForkRef<HTMLDivElement>(ref, item.ref);\n\n useEffect(() => {\n setTriggerDisabled(!!disabled);\n }, [disabled, setTriggerDisabled]);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"blurActive\")]: blurActive,\n },\n className,\n )}\n role=\"menuitem\"\n aria-disabled={disabled || undefined}\n {...getItemProps({\n tabIndex: disabled ? undefined : active ? 0 : -1,\n onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const element = event.currentTarget;\n onKeyDown?.(event);\n if (\n (event.key === \" \" || event.key === \"Enter\") &&\n !triggersSubmenu &&\n !disabled\n ) {\n event.preventDefault();\n const { view, ...eventInit } = event;\n queueMicrotask(() => {\n element.dispatchEvent(\n new window.MouseEvent(\"click\", eventInit),\n );\n });\n tree?.events.emit(\"click\");\n }\n },\n onClick(event: MouseEvent<HTMLDivElement>) {\n if (!disabled) {\n onClick?.(event);\n if (!triggersSubmenu) {\n tree?.events.emit(\"click\");\n }\n }\n },\n onFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n setFocusInside(true);\n },\n ...rest,\n })}\n ref={handleRef}\n >\n {children}\n {triggersSubmenu && (\n <ExpandGroupIcon className={withBaseName(\"expandIcon\")} aria-hidden />\n )}\n </div>\n );\n },\n);\n"],"names":["MenuItem","menuItemCss"],"mappings":"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"}
1
+ {"version":3,"file":"MenuItem.js","sources":["../src/menu/MenuItem.tsx"],"sourcesContent":["import { useFloatingTree, useListItem } from \"@floating-ui/react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type FocusEvent,\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n useEffect,\n} from \"react\";\nimport { useIcon } from \"../semantic-icon-provider\";\nimport { makePrefixer, useForkRef } from \"../utils\";\nimport { useMenuContext } from \"./MenuContext\";\nimport menuItemCss from \"./MenuItem.css\";\nimport { useMenuPanelContext } from \"./MenuPanelContext\";\nimport { useIsMenuTrigger } from \"./MenuTriggerContext\";\nexport interface MenuItemProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If `true`, the item will be disabled.\n */\n disabled?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltMenuItem\");\n\nexport const MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(\n function MenuItem(props, ref) {\n const {\n children,\n className,\n disabled,\n onClick,\n onFocus,\n onKeyDown,\n ...rest\n } = props;\n\n const { triggersSubmenu, blurActive } = useIsMenuTrigger();\n const { setTriggerDisabled } = useMenuContext();\n const { ExpandGroupIcon } = useIcon();\n const { activeIndex, getItemProps, setFocusInside } = useMenuPanelContext();\n const item = useListItem();\n const tree = useFloatingTree();\n const active = item.index === activeIndex;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-menu-item\",\n css: menuItemCss,\n window: targetWindow,\n });\n const handleRef = useForkRef<HTMLDivElement>(ref, item.ref);\n\n useEffect(() => {\n setTriggerDisabled(!!disabled);\n }, [disabled, setTriggerDisabled]);\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"blurActive\")]: blurActive,\n },\n className,\n )}\n role=\"menuitem\"\n aria-disabled={disabled || undefined}\n {...getItemProps({\n tabIndex: disabled ? undefined : active ? 0 : -1,\n onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const element = event.currentTarget;\n onKeyDown?.(event);\n if (\n (event.key === \" \" || event.key === \"Enter\") &&\n !triggersSubmenu &&\n !disabled\n ) {\n event.preventDefault();\n const { view, ...eventInit } = event;\n queueMicrotask(() => {\n element.dispatchEvent(\n new window.MouseEvent(\"click\", eventInit),\n );\n });\n }\n },\n onClick(event: MouseEvent<HTMLDivElement>) {\n if (!disabled) {\n onClick?.(event);\n if (!triggersSubmenu) {\n tree?.events.emit(\"click\");\n }\n }\n },\n onFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n setFocusInside(true);\n },\n ...rest,\n })}\n ref={handleRef}\n >\n {children}\n {triggersSubmenu && (\n <ExpandGroupIcon className={withBaseName(\"expandIcon\")} aria-hidden />\n )}\n </div>\n );\n },\n);\n"],"names":["MenuItem","menuItemCss"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- var css_248z = "/* Styles applied to the root element when variant=\"primary\" */\n.saltPanel-primary.saltPanel {\n --panel-background: var(--salt-container-primary-background);\n}\n\n/* Styles applied to the root element when variant=\"secondary\" */\n.saltPanel-secondary.saltPanel {\n --panel-background: var(--salt-container-secondary-background);\n}\n\n/* Styles applied to the root element when variant=\"tertiary\" */\n.saltPanel-tertiary.saltPanel {\n --panel-background: var(--salt-container-tertiary-background);\n}\n\n/* Styles applied to the root element */\n.saltPanel {\n background: var(--saltPanel-background, var(--panel-background));\n color: var(--saltPanel-color, inherit);\n height: var(--saltPanel-height, 100%);\n overflow: auto;\n padding: var(--saltPanel-padding, var(--salt-spacing-300));\n width: var(--saltPanel-width, 100%);\n border-radius: var(--saltPanel-borderRadius, var(--salt-palette-corner, 0));\n box-sizing: border-box;\n}\n";
1
+ var css_248z = "/* Styles applied to the root element when variant=\"primary\" */\n.saltPanel-primary.saltPanel {\n --panel-background: var(--salt-container-primary-background);\n}\n\n/* Styles applied to the root element when variant=\"secondary\" */\n.saltPanel-secondary.saltPanel {\n --panel-background: var(--salt-container-secondary-background);\n}\n\n/* Styles applied to the root element when variant=\"tertiary\" */\n.saltPanel-tertiary.saltPanel {\n --panel-background: var(--salt-container-tertiary-background);\n}\n\n/* Styles applied to the root element */\n.saltPanel {\n background: var(--saltPanel-background, var(--panel-background));\n color: var(--saltPanel-color, inherit);\n height: var(--saltPanel-height, 100%);\n overflow: auto;\n padding: var(--saltPanel-padding, var(--salt-spacing-300));\n width: var(--saltPanel-width, 100%);\n box-sizing: border-box;\n}\n\n/* Styles applied when elevation=\"raised\" */\n.saltPanel-raised {\n border-radius: var(--saltPanel-borderRadius, var(--salt-palette-corner, 0));\n box-shadow: var(--saltPanel-boxShadow, var(--salt-overlayable-shadow));\n}\n";
2
2
 
3
3
  export { css_248z as default };
4
4
  //# sourceMappingURL=Panel.css.js.map
@@ -11,7 +11,13 @@ import '../viewport/ViewportProvider.js';
11
11
  import css_248z from './Panel.css.js';
12
12
 
13
13
  const withBaseName = makePrefixer("saltPanel");
14
- const Panel = forwardRef(function Panel2({ className, children, variant = "primary", ...restProps }, ref) {
14
+ const Panel = forwardRef(function Panel2({
15
+ elevation = "flat",
16
+ className,
17
+ children,
18
+ variant = "primary",
19
+ ...restProps
20
+ }, ref) {
15
21
  const targetWindow = useWindow();
16
22
  useComponentCssInjection({
17
23
  testId: "salt-panel",
@@ -21,7 +27,12 @@ const Panel = forwardRef(function Panel2({ className, children, variant = "prima
21
27
  return /* @__PURE__ */ jsx(
22
28
  "div",
23
29
  {
24
- className: clsx(withBaseName(), withBaseName(variant), className),
30
+ className: clsx(
31
+ withBaseName(),
32
+ withBaseName(variant),
33
+ elevation && withBaseName(elevation),
34
+ className
35
+ ),
25
36
  ref,
26
37
  ...restProps,
27
38
  children
@@ -1 +1 @@
1
- {"version":3,"file":"Panel.js","sources":["../src/panel/Panel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, type HTMLAttributes } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport panelCss from \"./Panel.css\";\n\n/**\n * Panel component that acts as wrapper around a node\n *\n * @example\n * const PanelExample = () => (\n * <Panel>\n * <p>This is a panel around some text.</p>\n * </Panel>\n * );\n *\n */\n\nexport interface PanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nconst withBaseName = makePrefixer(\"saltPanel\");\n\nexport const Panel = forwardRef<HTMLDivElement, PanelProps>(function Panel(\n { className, children, variant = \"primary\", ...restProps },\n ref,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-panel\",\n css: panelCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(withBaseName(), withBaseName(variant), className)}\n ref={ref}\n {...restProps}\n >\n {children}\n </div>\n );\n});\n"],"names":["Panel","panelCss"],"mappings":";;;;;;;;;;;;AA0BA,MAAM,YAAA,GAAe,aAAa,WAAW,CAAA;AAEtC,MAAM,KAAA,GAAQ,UAAA,CAAuC,SAASA,MAAAA,CACnE,EAAE,SAAA,EAAW,QAAA,EAAU,OAAA,GAAU,SAAA,EAAW,GAAG,SAAA,EAAU,EACzD,GAAA,EACA;AACA,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,YAAA;AAAA,IACR,GAAA,EAAKC,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,IAAA,CAAK,YAAA,IAAgB,YAAA,CAAa,OAAO,GAAG,SAAS,CAAA;AAAA,MAChE,GAAA;AAAA,MACC,GAAG,SAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"Panel.js","sources":["../src/panel/Panel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, type HTMLAttributes } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport panelCss from \"./Panel.css\";\n\n/**\n * Panel component that acts as wrapper around a node\n *\n * @example\n * const PanelExample = () => (\n * <Panel>\n * <p>This is a panel around some text.</p>\n * </Panel>\n * );\n *\n */\n\nexport interface PanelProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Visual elevation.\n */\n elevation?: \"flat\" | \"raised\";\n /**\n * Styling variant; defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\";\n}\n\nconst withBaseName = makePrefixer(\"saltPanel\");\n\nexport const Panel = forwardRef<HTMLDivElement, PanelProps>(function Panel(\n {\n elevation = \"flat\",\n className,\n children,\n variant = \"primary\",\n ...restProps\n },\n ref,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-panel\",\n css: panelCss,\n window: targetWindow,\n });\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n elevation && withBaseName(elevation),\n className,\n )}\n ref={ref}\n {...restProps}\n >\n {children}\n </div>\n );\n});\n"],"names":["Panel","panelCss"],"mappings":";;;;;;;;;;;;AA8BA,MAAM,YAAA,GAAe,aAAa,WAAW,CAAA;AAEtC,MAAM,KAAA,GAAQ,UAAA,CAAuC,SAASA,MAAAA,CACnE;AAAA,EACE,SAAA,GAAY,MAAA;AAAA,EACZ,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,eAAe,SAAA,EAAU;AAC/B,EAAA,wBAAA,CAAyB;AAAA,IACvB,MAAA,EAAQ,YAAA;AAAA,IACR,GAAA,EAAKC,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA;AAAA,QACT,YAAA,EAAa;AAAA,QACb,aAAa,OAAO,CAAA;AAAA,QACpB,SAAA,IAAa,aAAa,SAAS,CAAA;AAAA,QACnC;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACC,GAAG,SAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -47,6 +47,9 @@ function useOverflowSelectionState({
47
47
  commitSelection(pendingSelection.event, pendingSelection.value);
48
48
  }, [commitSelection, menuOpen]);
49
49
  useEffect(() => {
50
+ if (menuOpen) {
51
+ return;
52
+ }
50
53
  const selectedFromOverflow = selectionFromOverflowValueRef.current;
51
54
  if (selectedFromOverflow == null || pendingOverflowSelectionRef.current) {
52
55
  return;
@@ -54,8 +57,13 @@ function useOverflowSelectionState({
54
57
  if (selected === selectedFromOverflow && selected !== previousSelected) {
55
58
  return;
56
59
  }
57
- selectionFromOverflowValueRef.current = null;
58
- }, [previousSelected, selected]);
60
+ const clearStaleSelection = setTimeout(() => {
61
+ if (selectionFromOverflowValueRef.current === selectedFromOverflow) {
62
+ selectionFromOverflowValueRef.current = null;
63
+ }
64
+ });
65
+ return () => clearTimeout(clearStaleSelection);
66
+ }, [menuOpen, previousSelected, selected]);
59
67
  return {
60
68
  selectionFromOverflowValueRef,
61
69
  setSelected