@salt-ds/core 1.4.0 → 1.6.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 (197) hide show
  1. package/dist-cjs/packages/core/src/aria-announcer/useAriaAnnouncer.js +1 -0
  2. package/dist-cjs/packages/core/src/aria-announcer/useAriaAnnouncer.js.map +1 -1
  3. package/dist-cjs/packages/core/src/avatar/Avatar.css.js +1 -1
  4. package/dist-cjs/packages/core/src/avatar/Avatar.js +11 -3
  5. package/dist-cjs/packages/core/src/avatar/Avatar.js.map +1 -1
  6. package/dist-cjs/packages/core/src/avatar/useAvatarImage.js +39 -0
  7. package/dist-cjs/packages/core/src/avatar/useAvatarImage.js.map +1 -0
  8. package/dist-cjs/packages/core/src/card/Card.css.js +1 -1
  9. package/dist-cjs/packages/core/src/card/Card.js +1 -1
  10. package/dist-cjs/packages/core/src/card/Card.js.map +1 -1
  11. package/dist-cjs/packages/core/src/card/InteractableCard.css.js +9 -0
  12. package/dist-cjs/packages/core/src/card/InteractableCard.css.js.map +1 -0
  13. package/dist-cjs/packages/core/src/card/InteractableCard.js +57 -0
  14. package/dist-cjs/packages/core/src/card/InteractableCard.js.map +1 -0
  15. package/dist-cjs/packages/core/src/card/useInteractableCard.js +63 -0
  16. package/dist-cjs/packages/core/src/card/useInteractableCard.js.map +1 -0
  17. package/dist-cjs/packages/core/src/checkbox/Checkbox.css.js +9 -0
  18. package/dist-cjs/packages/core/src/checkbox/Checkbox.css.js.map +1 -0
  19. package/dist-cjs/packages/core/src/checkbox/Checkbox.js +95 -0
  20. package/dist-cjs/packages/core/src/checkbox/Checkbox.js.map +1 -0
  21. package/dist-cjs/packages/core/src/checkbox/CheckboxGroup.css.js +9 -0
  22. package/dist-cjs/packages/core/src/checkbox/CheckboxGroup.css.js.map +1 -0
  23. package/dist-cjs/packages/core/src/checkbox/CheckboxGroup.js +62 -0
  24. package/dist-cjs/packages/core/src/checkbox/CheckboxGroup.js.map +1 -0
  25. package/dist-cjs/packages/core/src/checkbox/CheckboxIcon.css.js +9 -0
  26. package/dist-cjs/packages/core/src/checkbox/CheckboxIcon.css.js.map +1 -0
  27. package/dist-cjs/packages/core/src/checkbox/CheckboxIcon.js +48 -0
  28. package/dist-cjs/packages/core/src/checkbox/CheckboxIcon.js.map +1 -0
  29. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxCheckedIcon.js +33 -0
  30. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxCheckedIcon.js.map +1 -0
  31. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxCheckedIconHD.js +32 -0
  32. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxCheckedIconHD.js.map +1 -0
  33. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxIndeterminateIcon.js +37 -0
  34. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxIndeterminateIcon.js.map +1 -0
  35. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxUncheckedIcon.js +26 -0
  36. package/dist-cjs/packages/core/src/checkbox/assets/CheckboxUncheckedIcon.js.map +1 -0
  37. package/dist-cjs/packages/core/src/checkbox/internal/CheckboxGroupContext.js +13 -0
  38. package/dist-cjs/packages/core/src/checkbox/internal/CheckboxGroupContext.js.map +1 -0
  39. package/dist-cjs/packages/core/src/checkbox/internal/useCheckboxGroup.js +13 -0
  40. package/dist-cjs/packages/core/src/checkbox/internal/useCheckboxGroup.js.map +1 -0
  41. package/dist-cjs/packages/core/src/flex-item/FlexItem.js +1 -1
  42. package/dist-cjs/packages/core/src/index.js +20 -0
  43. package/dist-cjs/packages/core/src/index.js.map +1 -1
  44. package/dist-cjs/packages/core/src/link/Link.css.js +1 -1
  45. package/dist-cjs/packages/core/src/link/Link.js +1 -1
  46. package/dist-cjs/packages/core/src/link/Link.js.map +1 -1
  47. package/dist-cjs/packages/core/src/panel/Panel.css.js +1 -1
  48. package/dist-cjs/packages/core/src/radio-button/RadioButton.css.js +9 -0
  49. package/dist-cjs/packages/core/src/radio-button/RadioButton.css.js.map +1 -0
  50. package/dist-cjs/packages/core/src/radio-button/RadioButton.js +86 -0
  51. package/dist-cjs/packages/core/src/radio-button/RadioButton.js.map +1 -0
  52. package/dist-cjs/packages/core/src/radio-button/RadioButtonGroup.css.js +9 -0
  53. package/dist-cjs/packages/core/src/radio-button/RadioButtonGroup.css.js.map +1 -0
  54. package/dist-cjs/packages/core/src/radio-button/RadioButtonGroup.js +61 -0
  55. package/dist-cjs/packages/core/src/radio-button/RadioButtonGroup.js.map +1 -0
  56. package/dist-cjs/packages/core/src/radio-button/RadioButtonIcon.css.js +9 -0
  57. package/dist-cjs/packages/core/src/radio-button/RadioButtonIcon.css.js.map +1 -0
  58. package/dist-cjs/packages/core/src/radio-button/RadioButtonIcon.js +48 -0
  59. package/dist-cjs/packages/core/src/radio-button/RadioButtonIcon.js.map +1 -0
  60. package/dist-cjs/packages/core/src/radio-button/internal/RadioGroupContext.js +19 -0
  61. package/dist-cjs/packages/core/src/radio-button/internal/RadioGroupContext.js.map +1 -0
  62. package/dist-cjs/packages/core/src/radio-button/internal/useRadioGroup.js +13 -0
  63. package/dist-cjs/packages/core/src/radio-button/internal/useRadioGroup.js.map +1 -0
  64. package/dist-cjs/packages/core/src/spinner/svgSpinners/SpinnerSVG.js +1 -0
  65. package/dist-cjs/packages/core/src/spinner/svgSpinners/SpinnerSVG.js.map +1 -1
  66. package/dist-cjs/packages/core/src/text/Text.css.js +1 -1
  67. package/dist-cjs/packages/core/src/tooltip/Tooltip.css.js +1 -1
  68. package/dist-cjs/packages/core/src/tooltip/Tooltip.js +40 -24
  69. package/dist-cjs/packages/core/src/tooltip/Tooltip.js.map +1 -1
  70. package/dist-cjs/packages/core/src/tooltip/useAriaAnnounce.js +1 -0
  71. package/dist-cjs/packages/core/src/tooltip/useAriaAnnounce.js.map +1 -1
  72. package/dist-cjs/packages/core/src/tooltip/useTooltip.js +7 -4
  73. package/dist-cjs/packages/core/src/tooltip/useTooltip.js.map +1 -1
  74. package/dist-cjs/packages/core/src/utils/capitalize.js +10 -0
  75. package/dist-cjs/packages/core/src/utils/capitalize.js.map +1 -0
  76. package/dist-cjs/packages/core/src/utils/mergeProps.js +25 -0
  77. package/dist-cjs/packages/core/src/utils/mergeProps.js.map +1 -0
  78. package/dist-cjs/packages/core/src/utils/useFloatingUI.js.map +1 -1
  79. package/dist-cjs/packages/core/src/viewport/ViewportProvider.js +1 -0
  80. package/dist-cjs/packages/core/src/viewport/ViewportProvider.js.map +1 -1
  81. package/dist-es/packages/core/src/aria-announcer/useAriaAnnouncer.js +1 -0
  82. package/dist-es/packages/core/src/aria-announcer/useAriaAnnouncer.js.map +1 -1
  83. package/dist-es/packages/core/src/avatar/Avatar.css.js +1 -1
  84. package/dist-es/packages/core/src/avatar/Avatar.js +11 -3
  85. package/dist-es/packages/core/src/avatar/Avatar.js.map +1 -1
  86. package/dist-es/packages/core/src/avatar/useAvatarImage.js +35 -0
  87. package/dist-es/packages/core/src/avatar/useAvatarImage.js.map +1 -0
  88. package/dist-es/packages/core/src/card/Card.css.js +1 -1
  89. package/dist-es/packages/core/src/card/Card.js +1 -1
  90. package/dist-es/packages/core/src/card/Card.js.map +1 -1
  91. package/dist-es/packages/core/src/card/InteractableCard.css.js +7 -0
  92. package/dist-es/packages/core/src/card/InteractableCard.css.js.map +1 -0
  93. package/dist-es/packages/core/src/card/InteractableCard.js +53 -0
  94. package/dist-es/packages/core/src/card/InteractableCard.js.map +1 -0
  95. package/dist-es/packages/core/src/card/useInteractableCard.js +59 -0
  96. package/dist-es/packages/core/src/card/useInteractableCard.js.map +1 -0
  97. package/dist-es/packages/core/src/checkbox/Checkbox.css.js +7 -0
  98. package/dist-es/packages/core/src/checkbox/Checkbox.css.js.map +1 -0
  99. package/dist-es/packages/core/src/checkbox/Checkbox.js +91 -0
  100. package/dist-es/packages/core/src/checkbox/Checkbox.js.map +1 -0
  101. package/dist-es/packages/core/src/checkbox/CheckboxGroup.css.js +7 -0
  102. package/dist-es/packages/core/src/checkbox/CheckboxGroup.css.js.map +1 -0
  103. package/dist-es/packages/core/src/checkbox/CheckboxGroup.js +58 -0
  104. package/dist-es/packages/core/src/checkbox/CheckboxGroup.js.map +1 -0
  105. package/dist-es/packages/core/src/checkbox/CheckboxIcon.css.js +7 -0
  106. package/dist-es/packages/core/src/checkbox/CheckboxIcon.css.js.map +1 -0
  107. package/dist-es/packages/core/src/checkbox/CheckboxIcon.js +44 -0
  108. package/dist-es/packages/core/src/checkbox/CheckboxIcon.js.map +1 -0
  109. package/dist-es/packages/core/src/checkbox/assets/CheckboxCheckedIcon.js +29 -0
  110. package/dist-es/packages/core/src/checkbox/assets/CheckboxCheckedIcon.js.map +1 -0
  111. package/dist-es/packages/core/src/checkbox/assets/CheckboxCheckedIconHD.js +28 -0
  112. package/dist-es/packages/core/src/checkbox/assets/CheckboxCheckedIconHD.js.map +1 -0
  113. package/dist-es/packages/core/src/checkbox/assets/CheckboxIndeterminateIcon.js +33 -0
  114. package/dist-es/packages/core/src/checkbox/assets/CheckboxIndeterminateIcon.js.map +1 -0
  115. package/dist-es/packages/core/src/checkbox/assets/CheckboxUncheckedIcon.js +22 -0
  116. package/dist-es/packages/core/src/checkbox/assets/CheckboxUncheckedIcon.js.map +1 -0
  117. package/dist-es/packages/core/src/checkbox/internal/CheckboxGroupContext.js +9 -0
  118. package/dist-es/packages/core/src/checkbox/internal/CheckboxGroupContext.js.map +1 -0
  119. package/dist-es/packages/core/src/checkbox/internal/useCheckboxGroup.js +9 -0
  120. package/dist-es/packages/core/src/checkbox/internal/useCheckboxGroup.js.map +1 -0
  121. package/dist-es/packages/core/src/flex-item/FlexItem.js +1 -1
  122. package/dist-es/packages/core/src/index.js +10 -0
  123. package/dist-es/packages/core/src/index.js.map +1 -1
  124. package/dist-es/packages/core/src/link/Link.css.js +1 -1
  125. package/dist-es/packages/core/src/link/Link.js +1 -1
  126. package/dist-es/packages/core/src/link/Link.js.map +1 -1
  127. package/dist-es/packages/core/src/panel/Panel.css.js +1 -1
  128. package/dist-es/packages/core/src/radio-button/RadioButton.css.js +7 -0
  129. package/dist-es/packages/core/src/radio-button/RadioButton.css.js.map +1 -0
  130. package/dist-es/packages/core/src/radio-button/RadioButton.js +82 -0
  131. package/dist-es/packages/core/src/radio-button/RadioButton.js.map +1 -0
  132. package/dist-es/packages/core/src/radio-button/RadioButtonGroup.css.js +7 -0
  133. package/dist-es/packages/core/src/radio-button/RadioButtonGroup.css.js.map +1 -0
  134. package/dist-es/packages/core/src/radio-button/RadioButtonGroup.js +57 -0
  135. package/dist-es/packages/core/src/radio-button/RadioButtonGroup.js.map +1 -0
  136. package/dist-es/packages/core/src/radio-button/RadioButtonIcon.css.js +7 -0
  137. package/dist-es/packages/core/src/radio-button/RadioButtonIcon.css.js.map +1 -0
  138. package/dist-es/packages/core/src/radio-button/RadioButtonIcon.js +44 -0
  139. package/dist-es/packages/core/src/radio-button/RadioButtonIcon.js.map +1 -0
  140. package/dist-es/packages/core/src/radio-button/internal/RadioGroupContext.js +15 -0
  141. package/dist-es/packages/core/src/radio-button/internal/RadioGroupContext.js.map +1 -0
  142. package/dist-es/packages/core/src/radio-button/internal/useRadioGroup.js +9 -0
  143. package/dist-es/packages/core/src/radio-button/internal/useRadioGroup.js.map +1 -0
  144. package/dist-es/packages/core/src/spinner/svgSpinners/SpinnerSVG.js +1 -0
  145. package/dist-es/packages/core/src/spinner/svgSpinners/SpinnerSVG.js.map +1 -1
  146. package/dist-es/packages/core/src/text/Text.css.js +1 -1
  147. package/dist-es/packages/core/src/tooltip/Tooltip.css.js +1 -1
  148. package/dist-es/packages/core/src/tooltip/Tooltip.js +40 -24
  149. package/dist-es/packages/core/src/tooltip/Tooltip.js.map +1 -1
  150. package/dist-es/packages/core/src/tooltip/useAriaAnnounce.js +1 -0
  151. package/dist-es/packages/core/src/tooltip/useAriaAnnounce.js.map +1 -1
  152. package/dist-es/packages/core/src/tooltip/useTooltip.js +7 -4
  153. package/dist-es/packages/core/src/tooltip/useTooltip.js.map +1 -1
  154. package/dist-es/packages/core/src/utils/capitalize.js +6 -0
  155. package/dist-es/packages/core/src/utils/capitalize.js.map +1 -0
  156. package/dist-es/packages/core/src/utils/mergeProps.js +21 -0
  157. package/dist-es/packages/core/src/utils/mergeProps.js.map +1 -0
  158. package/dist-es/packages/core/src/utils/useFloatingUI.js.map +1 -1
  159. package/dist-es/packages/core/src/viewport/ViewportProvider.js +1 -0
  160. package/dist-es/packages/core/src/viewport/ViewportProvider.js.map +1 -1
  161. package/dist-types/avatar/index.d.ts +1 -0
  162. package/dist-types/avatar/useAvatarImage.d.ts +2 -0
  163. package/dist-types/card/Card.d.ts +4 -4
  164. package/dist-types/card/InteractableCard.d.ts +14 -0
  165. package/dist-types/card/index.d.ts +1 -0
  166. package/dist-types/card/useInteractableCard.d.ts +21 -0
  167. package/dist-types/checkbox/Checkbox.d.ts +56 -0
  168. package/dist-types/checkbox/CheckboxGroup.d.ts +30 -0
  169. package/dist-types/checkbox/CheckboxIcon.d.ts +10 -0
  170. package/dist-types/checkbox/assets/CheckboxCheckedIcon.d.ts +4 -0
  171. package/dist-types/checkbox/assets/CheckboxCheckedIconHD.d.ts +4 -0
  172. package/dist-types/checkbox/assets/CheckboxIndeterminateIcon.d.ts +4 -0
  173. package/dist-types/checkbox/assets/CheckboxUncheckedIcon.d.ts +4 -0
  174. package/dist-types/checkbox/assets/index.d.ts +4 -0
  175. package/dist-types/checkbox/index.d.ts +3 -0
  176. package/dist-types/checkbox/internal/CheckboxGroupContext.d.ts +9 -0
  177. package/dist-types/checkbox/internal/useCheckboxGroup.d.ts +2 -0
  178. package/dist-types/index.d.ts +2 -0
  179. package/dist-types/link/Link.d.ts +1 -1
  180. package/dist-types/radio-button/RadioButton.d.ts +45 -0
  181. package/dist-types/radio-button/RadioButtonGroup.d.ts +29 -0
  182. package/dist-types/radio-button/RadioButtonIcon.d.ts +11 -0
  183. package/dist-types/radio-button/index.d.ts +3 -0
  184. package/dist-types/radio-button/internal/RadioGroupContext.d.ts +7 -0
  185. package/dist-types/radio-button/internal/useRadioGroup.d.ts +1 -0
  186. package/dist-types/tooltip/Tooltip.d.ts +10 -10
  187. package/dist-types/tooltip/useTooltip.d.ts +23 -3
  188. package/dist-types/utils/capitalize.d.ts +1 -0
  189. package/dist-types/utils/index.d.ts +2 -0
  190. package/dist-types/utils/mergeProps.d.ts +12 -0
  191. package/dist-types/utils/useFloatingUI.d.ts +3 -3
  192. package/package.json +3 -3
  193. package/dist-cjs/packages/core/src/avatar/internal/useLoaded.js +0 -30
  194. package/dist-cjs/packages/core/src/avatar/internal/useLoaded.js.map +0 -1
  195. package/dist-es/packages/core/src/avatar/internal/useLoaded.js +0 -26
  196. package/dist-es/packages/core/src/avatar/internal/useLoaded.js.map +0 -1
  197. package/dist-types/avatar/internal/useLoaded.d.ts +0 -2
@@ -2,7 +2,7 @@ import { jsx } from 'react/jsx-runtime';
2
2
  import { UserSolidIcon } from '@salt-ds/icons';
3
3
  import { clsx } from 'clsx';
4
4
  import { forwardRef } from 'react';
5
- import { useLoaded } from './internal/useLoaded.js';
5
+ import { useAvatarImage } from './useAvatarImage.js';
6
6
  import { makePrefixer } from '../utils/makePrefixer.js';
7
7
  import '../utils/useFloatingUI.js';
8
8
  import '../utils/useId.js';
@@ -21,7 +21,9 @@ const Avatar = forwardRef(function Avatar2({
21
21
  src,
22
22
  size = DEFAULT_AVATAR_SIZE,
23
23
  style: styleProp,
24
- fallbackIcon = /* @__PURE__ */ jsx(UserSolidIcon, {}),
24
+ fallbackIcon = /* @__PURE__ */ jsx(UserSolidIcon, {
25
+ "aria-label": "User Avatar"
26
+ }),
25
27
  ...rest
26
28
  }, ref) {
27
29
  let children;
@@ -29,7 +31,8 @@ const Avatar = forwardRef(function Avatar2({
29
31
  ...styleProp,
30
32
  "--saltAvatar-size-multiplier": `${size}`
31
33
  };
32
- const hasImgNotFailing = useLoaded({ src }) !== "error" && src;
34
+ const status = useAvatarImage({ src });
35
+ const hasImgNotFailing = status === "loaded";
33
36
  if (hasImgNotFailing) {
34
37
  children = /* @__PURE__ */ jsx("img", {
35
38
  alt: name,
@@ -39,6 +42,10 @@ const Avatar = forwardRef(function Avatar2({
39
42
  children = childrenProp;
40
43
  }
41
44
  const avatarInitials = nameToInitials(name);
45
+ const initialsProps = avatarInitials ? {
46
+ role: "img",
47
+ "aria-label": name
48
+ } : {};
42
49
  return /* @__PURE__ */ jsx("div", {
43
50
  ref,
44
51
  style,
@@ -47,6 +54,7 @@ const Avatar = forwardRef(function Avatar2({
47
54
  { [withBaseName("withImage")]: hasImgNotFailing },
48
55
  className
49
56
  ),
57
+ ...initialsProps,
50
58
  ...rest,
51
59
  children: children || avatarInitials || fallbackIcon
52
60
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.js","sources":["../src/avatar/Avatar.tsx"],"sourcesContent":["import { UserSolidIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, HTMLAttributes, ReactNode } from \"react\";\nimport { useLoaded } from \"./internal/useLoaded\";\nimport { makePrefixer } from \"../utils\";\n\nimport \"./Avatar.css\";\n\nexport type NameToInitials = (name?: string) => string;\n\nexport interface AvatarProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The name that Avatar represents.\n */\n name?: string;\n /**\n * Defines the function that gets initials. Default is capital first letter of each separate word in name.\n * If a function is not passed or returns undefined, Avatar will default to Icon.\n */\n nameToInitials?: NameToInitials;\n /**\n * Image src of Avatar.\n */\n src?: string;\n /**\n * Multiplier for the base avatar.\n */\n size?: number;\n /**\n * Icon to be used as a default item. Defaults to `UserIcon`\n */\n fallbackIcon?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltAvatar\");\nconst DEFAULT_AVATAR_SIZE = 2; // medium\n\nconst defaultNameToInitials = (name?: string) =>\n name\n ?.split(\" \")\n .slice(0, 2)\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase();\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(\n {\n className,\n children: childrenProp,\n name,\n nameToInitials = defaultNameToInitials,\n src,\n size = DEFAULT_AVATAR_SIZE,\n style: styleProp,\n fallbackIcon = <UserSolidIcon />,\n ...rest\n },\n ref\n) {\n let children;\n\n const style = {\n ...styleProp,\n \"--saltAvatar-size-multiplier\": `${size}`,\n };\n\n const hasImgNotFailing = useLoaded({ src }) !== \"error\" && src;\n\n if (hasImgNotFailing) {\n children = <img alt={name} src={src} />;\n } else if (childrenProp != null) {\n children = childrenProp;\n }\n\n const avatarInitials = nameToInitials(name);\n return (\n <div\n ref={ref}\n style={style}\n className={clsx(\n withBaseName(),\n { [withBaseName(\"withImage\")]: hasImgNotFailing },\n className\n )}\n {...rest}\n >\n {children || avatarInitials || fallbackIcon}\n </div>\n );\n});\n"],"names":["Avatar"],"mappings":";;;;;;;;;;;;AAkCA,MAAM,YAAA,GAAe,aAAa,YAAY,CAAA,CAAA;AAC9C,MAAM,mBAAsB,GAAA,CAAA,CAAA;AAE5B,MAAM,qBAAwB,GAAA,CAAC,IAC7B,KAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CACI,MAAM,GACP,CAAA,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CACb,KAAK,EACL,CAAA,CAAA,WAAA,EAAA,CAAA;AAEQ,MAAA,MAAA,GAAS,UAAwC,CAAA,SAASA,OACrE,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,IAAA;AAAA,EACA,cAAiB,GAAA,qBAAA;AAAA,EACjB,GAAA;AAAA,EACA,IAAO,GAAA,mBAAA;AAAA,EACP,KAAO,EAAA,SAAA;AAAA,EACP,YAAA,uBAAgB,aAAc,EAAA,EAAA,CAAA;AAAA,EAC3B,GAAA,IAAA;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAI,IAAA,QAAA,CAAA;AAEJ,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,GAAG,SAAA;AAAA,IACH,gCAAgC,CAAG,EAAA,IAAA,CAAA,CAAA;AAAA,GACrC,CAAA;AAEA,EAAA,MAAM,mBAAmB,SAAU,CAAA,EAAE,GAAI,EAAC,MAAM,OAAW,IAAA,GAAA,CAAA;AAE3D,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAA,QAAA,mBAAY,GAAA,CAAA,KAAA,EAAA;AAAA,MAAI,GAAK,EAAA,IAAA;AAAA,MAAM,GAAA;AAAA,KAAU,CAAA,CAAA;AAAA,GACvC,MAAA,IAAW,gBAAgB,IAAM,EAAA;AAC/B,IAAW,QAAA,GAAA,YAAA,CAAA;AAAA,GACb;AAEA,EAAM,MAAA,cAAA,GAAiB,eAAe,IAAI,CAAA,CAAA;AAC1C,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb,EAAE,CAAC,YAAa,CAAA,WAAW,IAAI,gBAAiB,EAAA;AAAA,MAChD,SAAA;AAAA,KACF;AAAA,IACC,GAAG,IAAA;AAAA,IAEH,sBAAY,cAAkB,IAAA,YAAA;AAAA,GACjC,CAAA,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"Avatar.js","sources":["../src/avatar/Avatar.tsx"],"sourcesContent":["import { UserSolidIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, HTMLAttributes, ReactNode } from \"react\";\nimport { useAvatarImage } from \"./useAvatarImage\";\nimport { makePrefixer } from \"../utils\";\n\nimport \"./Avatar.css\";\n\nexport type NameToInitials = (name?: string) => string;\n\nexport interface AvatarProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The name that Avatar represents.\n */\n name?: string;\n /**\n * Defines the function that gets initials. Default is capital first letter of each separate word in name.\n * If a function is not passed or returns undefined, Avatar will default to Icon.\n */\n nameToInitials?: NameToInitials;\n /**\n * Image src of Avatar.\n */\n src?: string;\n /**\n * Multiplier for the base avatar.\n */\n size?: number;\n /**\n * Icon to be used as a default item. Defaults to `UserIcon`\n */\n fallbackIcon?: ReactNode;\n}\n\nconst withBaseName = makePrefixer(\"saltAvatar\");\nconst DEFAULT_AVATAR_SIZE = 2; // medium\n\nconst defaultNameToInitials = (name?: string) =>\n name\n ?.split(\" \")\n .slice(0, 2)\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase();\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(function Avatar(\n {\n className,\n children: childrenProp,\n name,\n nameToInitials = defaultNameToInitials,\n src,\n size = DEFAULT_AVATAR_SIZE,\n style: styleProp,\n fallbackIcon = <UserSolidIcon aria-label=\"User Avatar\" />,\n ...rest\n },\n ref\n) {\n let children;\n\n const style = {\n ...styleProp,\n \"--saltAvatar-size-multiplier\": `${size}`,\n };\n\n const status = useAvatarImage({ src });\n const hasImgNotFailing = status === \"loaded\";\n if (hasImgNotFailing) {\n children = <img alt={name} src={src} />;\n } else if (childrenProp != null) {\n children = childrenProp;\n }\n\n const avatarInitials = nameToInitials(name);\n\n const initialsProps = avatarInitials\n ? {\n role: \"img\",\n \"aria-label\": name,\n }\n : {};\n\n return (\n <div\n ref={ref}\n style={style}\n className={clsx(\n withBaseName(),\n { [withBaseName(\"withImage\")]: hasImgNotFailing },\n className\n )}\n {...initialsProps}\n {...rest}\n >\n {children || avatarInitials || fallbackIcon}\n </div>\n );\n});\n"],"names":["Avatar"],"mappings":";;;;;;;;;;;;AAkCA,MAAM,YAAA,GAAe,aAAa,YAAY,CAAA,CAAA;AAC9C,MAAM,mBAAsB,GAAA,CAAA,CAAA;AAE5B,MAAM,qBAAwB,GAAA,CAAC,IAC7B,KAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CACI,MAAM,GACP,CAAA,CAAA,KAAA,CAAM,CAAG,EAAA,CAAA,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAE,CAAA,CAAA,CAAA,CAAA,CACb,KAAK,EACL,CAAA,CAAA,WAAA,EAAA,CAAA;AAEQ,MAAA,MAAA,GAAS,UAAwC,CAAA,SAASA,OACrE,CAAA;AAAA,EACE,SAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,IAAA;AAAA,EACA,cAAiB,GAAA,qBAAA;AAAA,EACjB,GAAA;AAAA,EACA,IAAO,GAAA,mBAAA;AAAA,EACP,KAAO,EAAA,SAAA;AAAA,EACP,+BAAgB,GAAA,CAAA,aAAA,EAAA;AAAA,IAAc,YAAW,EAAA,aAAA;AAAA,GAAc,CAAA;AAAA,EACpD,GAAA,IAAA;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAI,IAAA,QAAA,CAAA;AAEJ,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,GAAG,SAAA;AAAA,IACH,gCAAgC,CAAG,EAAA,IAAA,CAAA,CAAA;AAAA,GACrC,CAAA;AAEA,EAAA,MAAM,MAAS,GAAA,cAAA,CAAe,EAAE,GAAA,EAAK,CAAA,CAAA;AACrC,EAAA,MAAM,mBAAmB,MAAW,KAAA,QAAA,CAAA;AACpC,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAA,QAAA,mBAAY,GAAA,CAAA,KAAA,EAAA;AAAA,MAAI,GAAK,EAAA,IAAA;AAAA,MAAM,GAAA;AAAA,KAAU,CAAA,CAAA;AAAA,GACvC,MAAA,IAAW,gBAAgB,IAAM,EAAA;AAC/B,IAAW,QAAA,GAAA,YAAA,CAAA;AAAA,GACb;AAEA,EAAM,MAAA,cAAA,GAAiB,eAAe,IAAI,CAAA,CAAA;AAE1C,EAAA,MAAM,gBAAgB,cAClB,GAAA;AAAA,IACE,IAAM,EAAA,KAAA;AAAA,IACN,YAAc,EAAA,IAAA;AAAA,MAEhB,EAAC,CAAA;AAEL,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb,EAAE,CAAC,YAAa,CAAA,WAAW,IAAI,gBAAiB,EAAA;AAAA,MAChD,SAAA;AAAA,KACF;AAAA,IACC,GAAG,aAAA;AAAA,IACH,GAAG,IAAA;AAAA,IAEH,sBAAY,cAAkB,IAAA,YAAA;AAAA,GACjC,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,35 @@
1
+ import { useState, useEffect } from 'react';
2
+ import '../utils/useFloatingUI.js';
3
+ import '../utils/useId.js';
4
+ import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect.js';
5
+ import '../salt-provider/SaltProvider.js';
6
+ import '../viewport/ViewportProvider.js';
7
+ import 'clsx';
8
+
9
+ function useAvatarImage({ src }) {
10
+ const [status, setStatus] = useState("loading");
11
+ useEffect(() => {
12
+ setStatus(src ? "loading" : "pending");
13
+ }, [src]);
14
+ useIsomorphicLayoutEffect(() => {
15
+ if (!src) {
16
+ return;
17
+ }
18
+ let active = true;
19
+ const image = new Image();
20
+ image.src = src;
21
+ const onLoad = () => active && setStatus("loaded");
22
+ const onError = () => active && setStatus("error");
23
+ image.addEventListener("load", onLoad, { once: true });
24
+ image.addEventListener("error", onError, { once: true });
25
+ return () => {
26
+ image.removeEventListener("load", onLoad);
27
+ image.removeEventListener("load", onError);
28
+ active = false;
29
+ };
30
+ }, [src]);
31
+ return status;
32
+ }
33
+
34
+ export { useAvatarImage };
35
+ //# sourceMappingURL=useAvatarImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAvatarImage.js","sources":["../src/avatar/useAvatarImage.ts"],"sourcesContent":["import { ImgHTMLAttributes, useEffect, useState } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils\";\n\nexport function useAvatarImage({ src }: ImgHTMLAttributes<HTMLImageElement>) {\n const [status, setStatus] = useState<\n \"pending\" | \"loading\" | \"loaded\" | \"error\"\n >(\"loading\");\n\n useEffect(() => {\n setStatus(src ? \"loading\" : \"pending\");\n }, [src]);\n\n useIsomorphicLayoutEffect(() => {\n if (!src) {\n return;\n }\n\n let active = true;\n const image = new Image();\n image.src = src;\n const onLoad = () => active && setStatus(\"loaded\");\n const onError = () => active && setStatus(\"error\");\n\n image.addEventListener(\"load\", onLoad, { once: true });\n image.addEventListener(\"error\", onError, { once: true });\n\n return () => {\n image.removeEventListener(\"load\", onLoad);\n image.removeEventListener(\"load\", onError);\n active = false;\n };\n }, [src]);\n\n return status;\n}\n"],"names":[],"mappings":";;;;;;;;AAGgB,SAAA,cAAA,CAAe,EAAE,GAAA,EAA4C,EAAA;AAC3E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAE1B,SAAS,CAAA,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAU,SAAA,CAAA,GAAA,GAAM,YAAY,SAAS,CAAA,CAAA;AAAA,GACvC,EAAG,CAAC,GAAG,CAAC,CAAA,CAAA;AAER,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,MAAS,GAAA,IAAA,CAAA;AACb,IAAM,MAAA,KAAA,GAAQ,IAAI,KAAM,EAAA,CAAA;AACxB,IAAA,KAAA,CAAM,GAAM,GAAA,GAAA,CAAA;AACZ,IAAA,MAAM,MAAS,GAAA,MAAM,MAAU,IAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AACjD,IAAA,MAAM,OAAU,GAAA,MAAM,MAAU,IAAA,SAAA,CAAU,OAAO,CAAA,CAAA;AAEjD,IAAA,KAAA,CAAM,iBAAiB,MAAQ,EAAA,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAM,CAAA,CAAA;AACrD,IAAA,KAAA,CAAM,iBAAiB,OAAS,EAAA,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA,CAAA;AAEvD,IAAA,OAAO,MAAM;AACX,MAAM,KAAA,CAAA,mBAAA,CAAoB,QAAQ,MAAM,CAAA,CAAA;AACxC,MAAM,KAAA,CAAA,mBAAA,CAAoB,QAAQ,OAAO,CAAA,CAAA;AACzC,MAAS,MAAA,GAAA,KAAA,CAAA;AAAA,KACX,CAAA;AAAA,GACF,EAAG,CAAC,GAAG,CAAC,CAAA,CAAA;AAER,EAAO,OAAA,MAAA,CAAA;AACT;;;;"}
@@ -1,6 +1,6 @@
1
1
  import styleInject from '../../../../node_modules/style-inject/dist/style-inject.es.js';
2
2
 
3
- var css_248z = "/* Styles applied to the root element */\n.saltCard {\n --card-borderColor: var(--salt-container-primary-borderColor);\n --card-shadow: var(--salt-overlayable-shadow);\n\n background: var(--saltCard-background, var(--salt-container-primary-background));\n border-width: var(--saltCard-borderWidth, var(--salt-size-border));\n border-style: var(--saltCard-borderStyle, var(--salt-container-borderStyle));\n border-color: var(--saltCard-borderColor, var(--card-borderColor));\n border-radius: var(--saltCard-borderRadius, 0);\n box-shadow: var(--saltCard-boxShadow, var(--card-shadow));\n overflow: hidden;\n transition: box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1); /* TODO: this should possibly be moved to animation.css? */\n}\n\n/* Styles applied to Card content */\n.saltCard-content {\n color: var(--saltCard-color, var(--salt-text-primary-foreground));\n min-height: var(--salt-text-minHeight);\n padding: var(--saltCard-padding, calc(var(--salt-size-unit) * 3));\n}\n\n/* Styles applied if `interactable={true}` */\n.saltCard-interactable {\n display: block;\n transition: none;\n}\n\n/* Styles applied on hover if `interactable={true}` */\na:focus .saltCard-interactable,\n.saltCard-interactable:hover {\n --card-borderColor: var(--salt-selectable-borderColor-hover);\n --card-shadow: var(--salt-overlayable-shadow-hover);\n\n cursor: var(--saltCard-cursor-hover, var(--salt-selectable-cursor-hover));\n position: relative;\n}\n\n/* Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n --card-borderColor: var(--salt-selectable-borderColor-selected);\n --card-shadow: var(--salt-overlayable-shadow-hover);\n\n outline: var(--salt-focused-outline);\n outline-offset: var(--salt-focused-outlineOffset);\n}\n\n/* Styles applied on hover if `interactable={true}` and `disabled={true}` */\na:focus .saltCard-interactable.saltCard-disabled,\n.saltCard-interactable.saltCard-disabled:hover,\n.saltCard-interactable.saltCard-disabled:active {\n --card-shadow: var(--salt-overlayable-shadow);\n}\n\n/* Styles applied if `disabled={true}` */\n.saltCard-disabled,\n.saltCard-disabled.saltCard-interactable,\na:focus .saltCard-interactable.saltCard-disabled {\n --card-borderColor: var(--salt-container-primary-borderColor-disabled);\n\n color: var(--saltCard-color-disabled, var(--salt-text-primary-foreground-disabled));\n cursor: var(--saltCard-cursor-disabled, var(--salt-selectable-cursor-disabled));\n outline: none;\n}\n\n/* Styles applied to nested divs if `disabled={true}` */\n.saltCard-disabled div {\n pointer-events: none;\n}\n";
3
+ var css_248z = "/* Styles applied to the root element */\n.saltCard {\n background: var(--saltCard-background, var(--salt-container-primary-background));\n box-shadow: var(--saltCard-boxShadow, var(--salt-overlayable-shadow));\n color: var(--saltCard-color, var(--salt-text-primary-foreground));\n height: var(--saltCard-height, auto);\n min-height: var(--saltCard-minHeight, 100%);\n overflow: hidden;\n}\n\n/* Styles applied to Card content */\n.saltCard-content {\n height: 100%;\n padding: var(--saltCard-padding, var(--salt-size-container-spacing));\n}\n\n/*\n * **Deprecated:** The following styles are deprecated\n * Use Interactable Card component instead \n * for interactable styling \n */\n\n/* **Deprecated:** Styles applied if `interactable={true}` */\n.saltCard-interactable {\n display: block;\n transition: none;\n}\n\n/* **Deprecated:** Styles applied on hover if `interactable={true}` */\na:focus .saltCard-interactable,\n.saltCard-interactable:hover {\n box-shadow: var(--saltCard-boxShadow-hover, var(--salt-overlayable-shadow-hover));\n cursor: var(--saltCard-cursor-hover, var(--salt-selectable-cursor-hover));\n position: relative;\n}\n\n/* **Deprecated:** Styles applied on active state if `interactable={true}` */\n.saltCard-interactable:active {\n box-shadow: var(--saltCard-boxShadow-active, var(--salt-overlayable-shadow-hover));\n outline: var(--salt-focused-outline);\n outline-offset: var(--salt-focused-outlineOffset);\n}\n\n/* **Deprecated:** Styles applied on hover if `interactable={true}` and `disabled={true}` */\na:focus .saltCard-interactable.saltCard-disabled,\n.saltCard-interactable.saltCard-disabled:hover,\n.saltCard-interactable.saltCard-disabled:active {\n box-shadow: var(--saltCard-boxShadow-disabled, var(--salt-overlayable-shadow));\n}\n\n/* **Deprecated:** Styles applied if `disabled={true}` */\n.saltCard-disabled,\n.saltCard-disabled.saltCard-interactable,\na:focus .saltCard-interactable.saltCard-disabled {\n color: var(--saltCard-color-disabled, var(--salt-text-primary-foreground-disabled));\n cursor: var(--saltCard-cursor-disabled, var(--salt-selectable-cursor-disabled));\n outline: none;\n}\n\n/* **Deprecated:** Styles applied to nested divs if `disabled={true}` */\n.saltCard-disabled div {\n pointer-events: none;\n}\n";
4
4
  styleInject(css_248z);
5
5
 
6
6
  export { css_248z as default };
@@ -10,7 +10,7 @@ import './Card.css.js';
10
10
 
11
11
  const withBaseName = makePrefixer("saltCard");
12
12
  const Card = forwardRef(function Card2(props, ref) {
13
- const { className, disabled, interactable, children, ...rest } = props;
13
+ const { className, children, disabled, interactable, ...rest } = props;
14
14
  return /* @__PURE__ */ jsx("div", {
15
15
  className: clsx(
16
16
  withBaseName(),
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sources":["../src/card/Card.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport \"./Card.css\";\n\nconst withBaseName = makePrefixer(\"saltCard\");\n\nexport interface CardProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true`, interactive styles will be applied to `Card`. These styles give prominence to certain content\n * on the page.\n */\n interactable?: boolean;\n}\n\n/**\n * Card component is a sheet if material that serves as an entry point to more detailed information.\n * Cards display content composed of different elements whose size or supported actions vary.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n props,\n ref\n) {\n const { className, disabled, interactable, children, ...rest } = props;\n\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"interactable\")]: interactable,\n },\n className\n )}\n ref={ref}\n {...rest}\n >\n <div className={withBaseName(\"content\")}>{children}</div>\n </div>\n );\n});\n"],"names":["Card"],"mappings":";;;;;;;;;;AAKA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA,CAAA;AAkBrC,MAAM,IAAO,GAAA,UAAA,CAAsC,SAASA,KAAAA,CACjE,OACA,GACA,EAAA;AACA,EAAA,MAAM,EAAE,SAAW,EAAA,QAAA,EAAU,YAAc,EAAA,QAAA,EAAA,GAAa,MAAS,GAAA,KAAA,CAAA;AAEjE,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IACC,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb;AAAA,QACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,QAC5B,CAAC,YAAa,CAAA,cAAc,CAAI,GAAA,YAAA;AAAA,OAClC;AAAA,MACA,SAAA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACC,GAAG,IAAA;AAAA,IAEJ,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,MAAI,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,MAAI,QAAA;AAAA,KAAS,CAAA;AAAA,GACrD,CAAA,CAAA;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"Card.js","sources":["../src/card/Card.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { makePrefixer } from \"../utils\";\nimport \"./Card.css\";\n\nconst withBaseName = makePrefixer(\"saltCard\");\nexport interface CardProps extends ComponentPropsWithoutRef<\"div\"> {\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n /**\n * **Deprecated:** Use the InteractableCard component instead\n *\n * If `true`, interactive styles will be applied to `Card`. These styles give prominence to certain content\n * on the page.\n */\n interactable?: boolean;\n}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n props,\n ref\n) {\n const { className, children, disabled, interactable, ...rest } = props;\n return (\n <div\n className={clsx(\n withBaseName(),\n {\n /* **Deprecated:** InteractableCard should be used instead for these features */\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"interactable\")]: interactable,\n },\n className\n )}\n ref={ref}\n {...rest}\n >\n <div className={withBaseName(\"content\")}>{children}</div>\n </div>\n );\n});\n"],"names":["Card"],"mappings":";;;;;;;;;;AAKA,MAAM,YAAA,GAAe,aAAa,UAAU,CAAA,CAAA;AAiBrC,MAAM,IAAO,GAAA,UAAA,CAAsC,SAASA,KAAAA,CACjE,OACA,GACA,EAAA;AACA,EAAA,MAAM,EAAE,SAAW,EAAA,QAAA,EAAU,QAAU,EAAA,YAAA,EAAA,GAAiB,MAAS,GAAA,KAAA,CAAA;AACjE,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IACC,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb;AAAA,QAEE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,QAC5B,CAAC,YAAa,CAAA,cAAc,CAAI,GAAA,YAAA;AAAA,OAClC;AAAA,MACA,SAAA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACC,GAAG,IAAA;AAAA,IAEJ,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA;AAAA,MAAI,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,MAAI,QAAA;AAAA,KAAS,CAAA;AAAA,GACrD,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,7 @@
1
+ import styleInject from '../../../../node_modules/style-inject/dist/style-inject.es.js';
2
+
3
+ var css_248z = "/* Styles applied to InteractableCard */\n.saltInteractableCard {\n border-width: var(--saltCard-borderWidth, var(--card-borderWidth));\n border-style: var(--saltCard-borderStyle, var(--salt-container-borderStyle));\n border-color: var(--saltCard-borderColor, var(--salt-accent-borderColor));\n border-radius: var(--saltCard-borderRadius, 0);\n display: block;\n transition: box-shadow var(--salt-duration-instant) cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Styles applied to InteractableCard if `accentPlacement=\"bottom\"` (default) */\n.saltInteractableCard-accentBottom {\n --card-borderWidth: 0 0 var(--salt-size-accent) 0;\n}\n\n/* Styles applied to InteractableCard if `accentPlacement=\"left\"` */\n.saltInteractableCard-accentLeft {\n --card-borderWidth: 0 0 0 var(--salt-size-accent);\n}\n\n/* Styles applied to InteractableCard if `accentPlacement=\"top\"` */\n.saltInteractableCard-accentTop {\n --card-borderWidth: var(--salt-size-accent) 0 0 0;\n}\n\n/* Styles applied to InteractableCard if `accentPlacement=\"right\"` */\n.saltInteractableCard-accentRight {\n --card-borderWidth: 0 var(--salt-size-accent) 0 0;\n}\n\n/* Styles applied to InteractableCard on focus */\na:focus-visible .saltInteractableCard,\n.saltInteractableCard:focus-visible {\n cursor: var(--saltCard-interactable-cursor-focus, var(--salt-selectable-cursor-hover));\n box-shadow: var(--saltCard-interactable-shadow-focus, var(--salt-overlayable-shadow-hover));\n color: var(--saltCard-color-focus, var(--salt-text-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 active state to InteractableCard */\n.saltInteractableCard:active {\n cursor: var(--saltCard-interactable-cursor-active, var(--salt-selectable-cursor-active));\n box-shadow: var(--saltCard-interactable-shadow-active, var(--salt-overlayable-shadow-hover));\n}\n\n/* Styles applied on hover state to InteractableCard */\n.saltInteractableCard:hover {\n cursor: var(--saltCard-interactable-cursor-hover, var(--salt-selectable-cursor-hover));\n box-shadow: var(--saltCard-interactable-shadow-hover, var(--salt-overlayable-shadow-hover));\n}\n\n/* Styles applied to InteractableCard if `disabled={true}` */\n.saltInteractableCard-disabled,\n.saltInteractableCard-disabled:focus,\n.saltInteractableCard-disabled:hover,\n.saltInteractableCard-disabled:active {\n border-color: var(--saltCard-borderColor-disabled, var(--salt-accent-borderColor-disabled));\n box-shadow: var(--saltCard-interactable-shadow, var(--salt-overlayable-shadow));\n background: var(--saltCard-background-disabled, var(--salt-container-primary-background-disabled));\n color: var(--saltCard-color-disabled, var(--salt-text-primary-foreground-disabled));\n cursor: var(--saltCard-interactable-cursor-disabled, var(--salt-selectable-cursor-disabled));\n outline: none;\n}\n\n/* Styles applied to nested divs in InteractableCard if `disabled={true}` */\n.saltInteractableCard-disabled div {\n pointer-events: none;\n}\n\n/* Class that can be used for anchor tags wrapping InteractableCard */\n.saltInteractableCard-link {\n color: var(--saltCard-link-color, var(--salt-text-primary-foreground));\n inset: var(--salt-focused-outlineInset);\n outline-color: var(--salt-focused-outlineColor);\n outline-offset: var(--salt-focused-outlineOffset);\n outline-style: var(--salt-focused-outlineStyle);\n outline-width: var(--salt-focused-outlineWidth);\n}\n";
4
+ styleInject(css_248z);
5
+
6
+ export { css_248z as default };
7
+ //# sourceMappingURL=InteractableCard.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractableCard.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,53 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { clsx } from 'clsx';
3
+ import { forwardRef } from 'react';
4
+ import { Card } from './Card.js';
5
+ import { capitalize } from '../utils/capitalize.js';
6
+ import { makePrefixer } from '../utils/makePrefixer.js';
7
+ import '../utils/useFloatingUI.js';
8
+ import '../utils/useId.js';
9
+ import '../salt-provider/SaltProvider.js';
10
+ import '../viewport/ViewportProvider.js';
11
+ import { useInteractableCard } from './useInteractableCard.js';
12
+ import './InteractableCard.css.js';
13
+
14
+ const withBaseName = makePrefixer("saltInteractableCard");
15
+ const InteractableCard = forwardRef(function InteractableCard2(props, ref) {
16
+ const {
17
+ accentPlacement = "bottom",
18
+ children,
19
+ className,
20
+ disabled,
21
+ onBlur,
22
+ onClick,
23
+ onKeyUp,
24
+ onKeyDown,
25
+ ...rest
26
+ } = props;
27
+ const { active, cardProps } = useInteractableCard({
28
+ disabled,
29
+ onKeyUp,
30
+ onKeyDown,
31
+ onBlur,
32
+ onClick
33
+ });
34
+ const { tabIndex, ...restCardProps } = cardProps;
35
+ return /* @__PURE__ */ jsx(Card, {
36
+ ...restCardProps,
37
+ className: clsx(
38
+ withBaseName(),
39
+ withBaseName(`accent${capitalize(accentPlacement)}`),
40
+ {
41
+ [withBaseName("disabled")]: disabled,
42
+ [withBaseName("active")]: active
43
+ },
44
+ className
45
+ ),
46
+ ...rest,
47
+ ref,
48
+ children
49
+ });
50
+ });
51
+
52
+ export { InteractableCard };
53
+ //# sourceMappingURL=InteractableCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractableCard.js","sources":["../src/card/InteractableCard.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\nimport { Card, CardProps } from \"./Card\";\nimport { capitalize, makePrefixer } from \"../utils\";\nimport { useInteractableCard } from \"./useInteractableCard\";\n\nimport \"./InteractableCard.css\";\n\nconst withBaseName = makePrefixer(\"saltInteractableCard\");\n\n// TODO: Remove omissions when Card props deprecated\nexport interface InteractableCardProps\n extends Omit<CardProps, \"disabled\" | \"interactable\"> {\n /**\n * Accent border position: defaults to \"bottom\"\n */\n accentPlacement?: \"bottom\" | \"top\" | \"left\" | \"right\";\n /**\n * If `true`, the card will be disabled.\n */\n disabled?: boolean;\n}\n\nexport const InteractableCard = forwardRef<\n HTMLDivElement,\n InteractableCardProps\n>(function InteractableCard(props, ref) {\n const {\n accentPlacement = \"bottom\",\n children,\n className,\n disabled,\n onBlur,\n onClick,\n onKeyUp,\n onKeyDown,\n ...rest\n } = props;\n\n const { active, cardProps } = useInteractableCard({\n disabled,\n onKeyUp,\n onKeyDown,\n onBlur,\n onClick,\n });\n // for now, we do not want to spread tab index here as users may be wrapping in a link\n const { tabIndex, ...restCardProps } = cardProps;\n\n return (\n <Card\n {...restCardProps}\n className={clsx(\n withBaseName(),\n withBaseName(`accent${capitalize(accentPlacement)}`),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"active\")]: active,\n },\n className\n )}\n {...rest}\n ref={ref}\n >\n {children}\n </Card>\n );\n});\n"],"names":["InteractableCard"],"mappings":";;;;;;;;;;;;;AAQA,MAAM,YAAA,GAAe,aAAa,sBAAsB,CAAA,CAAA;AAejD,MAAM,gBAAmB,GAAA,UAAA,CAG9B,SAASA,iBAAAA,CAAiB,OAAO,GAAK,EAAA;AACtC,EAAM,MAAA;AAAA,IACJ,eAAkB,GAAA,QAAA;AAAA,IAClB,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACG,GAAA,IAAA;AAAA,GACD,GAAA,KAAA,CAAA;AAEJ,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAU,EAAA,GAAI,mBAAoB,CAAA;AAAA,IAChD,QAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA,EAAE,QAAa,EAAA,GAAA,aAAA,EAAkB,GAAA,SAAA,CAAA;AAEvC,EAAA,uBACG,GAAA,CAAA,IAAA,EAAA;AAAA,IACE,GAAG,aAAA;AAAA,IACJ,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb,YAAa,CAAA,CAAA,MAAA,EAAS,UAAW,CAAA,eAAe,CAAG,CAAA,CAAA,CAAA;AAAA,MACnD;AAAA,QACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,QAC5B,CAAC,YAAa,CAAA,QAAQ,CAAI,GAAA,MAAA;AAAA,OAC5B;AAAA,MACA,SAAA;AAAA,KACF;AAAA,IACC,GAAG,IAAA;AAAA,IACJ,GAAA;AAAA,IAEC,QAAA;AAAA,GACH,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,59 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ const useInteractableCard = ({
4
+ disabled,
5
+ onKeyUp,
6
+ onKeyDown,
7
+ onClick,
8
+ onBlur
9
+ }) => {
10
+ const [keyIsDown, setkeyIsDown] = useState("");
11
+ const [active, setActive] = useState(false);
12
+ const enter = "Enter";
13
+ useEffect(() => {
14
+ const t = setTimeout(() => {
15
+ if (keyIsDown !== enter) {
16
+ setActive(false);
17
+ }
18
+ }, 0);
19
+ return () => {
20
+ clearTimeout(t);
21
+ };
22
+ }, [active, keyIsDown]);
23
+ const handleKeyUp = (event) => {
24
+ setkeyIsDown("");
25
+ setActive(false);
26
+ onKeyUp == null ? void 0 : onKeyUp(event);
27
+ };
28
+ const handleClick = (event) => {
29
+ setActive(true);
30
+ onClick == null ? void 0 : onClick(event);
31
+ };
32
+ const handleBlur = (event) => {
33
+ setActive(false);
34
+ onBlur == null ? void 0 : onBlur(event);
35
+ };
36
+ const handleKeyDown = (event) => {
37
+ if (event.key === enter) {
38
+ setkeyIsDown(event.key);
39
+ setActive(true);
40
+ }
41
+ onKeyDown == null ? void 0 : onKeyDown(event);
42
+ };
43
+ const cardProps = {
44
+ "aria-disabled": disabled ? true : void 0,
45
+ disabled,
46
+ tabIndex: disabled ? -1 : 0,
47
+ onBlur: handleBlur,
48
+ onClick: !disabled ? handleClick : void 0,
49
+ onKeyDown: handleKeyDown,
50
+ onKeyUp: handleKeyUp
51
+ };
52
+ return {
53
+ active,
54
+ cardProps
55
+ };
56
+ };
57
+
58
+ export { useInteractableCard };
59
+ //# sourceMappingURL=useInteractableCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInteractableCard.js","sources":["../src/card/useInteractableCard.ts"],"sourcesContent":["import {\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n useEffect,\n useState,\n} from \"react\";\n\nexport interface CardHookProps<T extends Element> {\n disabled?: boolean;\n onKeyUp?: (event: KeyboardEvent<T>) => void;\n onKeyDown?: (event: KeyboardEvent<T>) => void;\n onClick?: (event: MouseEvent<T>) => void;\n onBlur?: (event: FocusEvent<T>) => void;\n}\n\nexport interface CardHookResult<T extends Element> {\n active: boolean;\n cardProps: {\n \"aria-disabled\"?: boolean;\n disabled?: boolean;\n tabIndex: number;\n onBlur: (event: FocusEvent<T>) => void;\n onClick?: (event: MouseEvent<T>) => void;\n onKeyDown: (event: KeyboardEvent<T>) => void;\n onKeyUp: (event: KeyboardEvent<T>) => void;\n };\n}\n\nexport const useInteractableCard = <T extends Element>({\n disabled,\n onKeyUp,\n onKeyDown,\n onClick,\n onBlur,\n}: CardHookProps<T>): CardHookResult<T> => {\n const [keyIsDown, setkeyIsDown] = useState(\"\");\n const [active, setActive] = useState(false);\n\n const enter = \"Enter\";\n\n useEffect(() => {\n const t = setTimeout(() => {\n // This key state check is to stop continual visual state change when using Enter Key, which the browser treats as both key and click events on a Button-like component\n // This key state check also fixes Firefox Button where Space key is pressed but button fails to be in active state\n if (keyIsDown !== enter) {\n setActive(false);\n }\n }, 0);\n\n return () => {\n clearTimeout(t);\n };\n }, [active, keyIsDown]);\n\n const handleKeyUp = (event: KeyboardEvent<T>) => {\n setkeyIsDown(\"\");\n setActive(false);\n onKeyUp?.(event);\n };\n\n const handleClick = (event: MouseEvent<T>) => {\n setActive(true);\n onClick?.(event);\n };\n\n const handleBlur = (event: FocusEvent<T>) => {\n setActive(false);\n onBlur?.(event);\n };\n\n const handleKeyDown = (event: KeyboardEvent<T>) => {\n if (event.key === enter) {\n setkeyIsDown(event.key);\n setActive(true);\n }\n\n onKeyDown?.(event);\n };\n\n const cardProps = {\n \"aria-disabled\": disabled ? true : undefined,\n disabled: disabled,\n tabIndex: disabled ? -1 : 0,\n onBlur: handleBlur,\n onClick: !disabled ? handleClick : undefined,\n onKeyDown: handleKeyDown,\n onKeyUp: handleKeyUp,\n };\n\n return {\n active,\n cardProps,\n };\n};\n"],"names":[],"mappings":";;AA6BO,MAAM,sBAAsB,CAAoB;AAAA,EACrD,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AACF,CAA2C,KAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,EAAE,CAAA,CAAA;AAC7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAE1C,EAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AAEd,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,CAAA,GAAI,WAAW,MAAM;AAGzB,MAAA,IAAI,cAAc,KAAO,EAAA;AACvB,QAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,OACjB;AAAA,OACC,CAAC,CAAA,CAAA;AAEJ,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAAA,KAChB,CAAA;AAAA,GACC,EAAA,CAAC,MAAQ,EAAA,SAAS,CAAC,CAAA,CAAA;AAEtB,EAAM,MAAA,WAAA,GAAc,CAAC,KAA4B,KAAA;AAC/C,IAAA,YAAA,CAAa,EAAE,CAAA,CAAA;AACf,IAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AACf,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyB,KAAA;AAC5C,IAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AACd,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAyB,KAAA;AAC3C,IAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AACf,IAAS,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACX,CAAA;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,KAA4B,KAAA;AACjD,IAAI,IAAA,KAAA,CAAM,QAAQ,KAAO,EAAA;AACvB,MAAA,YAAA,CAAa,MAAM,GAAG,CAAA,CAAA;AACtB,MAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AAAA,KAChB;AAEA,IAAY,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACd,CAAA;AAEA,EAAA,MAAM,SAAY,GAAA;AAAA,IAChB,eAAA,EAAiB,WAAW,IAAO,GAAA,KAAA,CAAA;AAAA,IACnC,QAAA;AAAA,IACA,QAAA,EAAU,WAAW,CAAK,CAAA,GAAA,CAAA;AAAA,IAC1B,MAAQ,EAAA,UAAA;AAAA,IACR,OAAA,EAAS,CAAC,QAAA,GAAW,WAAc,GAAA,KAAA,CAAA;AAAA,IACnC,SAAW,EAAA,aAAA;AAAA,IACX,OAAS,EAAA,WAAA;AAAA,GACX,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,SAAA;AAAA,GACF,CAAA;AACF;;;;"}
@@ -0,0 +1,7 @@
1
+ import styleInject from '../../../../node_modules/style-inject/dist/style-inject.es.js';
2
+
3
+ var css_248z = "/* Styles applied to root component */\n\n.saltCheckbox {\n cursor: var(--salt-selectable-cursor-hover);\n background: var(--saltCheckbox-background, none);\n display: flex;\n gap: var(--saltCheckbox-gap, var(--salt-size-adornmentGap));\n position: relative;\n width: fit-content;\n}\n\n/* Styles applied to root component if `disabled={true}` */\n.saltCheckbox-disabled {\n pointer-events: visible;\n color: var(--salt-text-primary-foreground-disabled);\n cursor: var(--salt-selectable-cursor-disabled);\n}\n\n/* Styles applied to the icon component if focused */\n.saltCheckbox-input:focus-visible + .saltCheckboxIcon {\n outline-offset: var(--salt-focused-outlineOffset);\n outline: var(--salt-focused-outline);\n}\n\n/* Styles applied to input element */\n.saltCheckbox-input {\n cursor: inherit;\n left: 0;\n margin: 0;\n opacity: 0;\n padding: 0;\n position: absolute;\n top: 0;\n z-index: var(--salt-zIndex-default);\n}\n";
4
+ styleInject(css_248z);
5
+
6
+ export { css_248z as default };
7
+ //# sourceMappingURL=Checkbox.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,91 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { clsx } from 'clsx';
3
+ import { forwardRef } from 'react';
4
+ import { makePrefixer } from '../utils/makePrefixer.js';
5
+ import { useControlled } from '../utils/useControlled.js';
6
+ import '../utils/useFloatingUI.js';
7
+ import '../utils/useId.js';
8
+ import '../salt-provider/SaltProvider.js';
9
+ import '../viewport/ViewportProvider.js';
10
+ import { CheckboxIcon } from './CheckboxIcon.js';
11
+ import './Checkbox.css.js';
12
+ import { useCheckboxGroup } from './internal/useCheckboxGroup.js';
13
+
14
+ const withBaseName = makePrefixer("saltCheckbox");
15
+ const Checkbox = forwardRef(
16
+ function Checkbox2({
17
+ checked: checkedProp,
18
+ className,
19
+ defaultChecked,
20
+ disabled,
21
+ error,
22
+ indeterminate,
23
+ inputProps,
24
+ label,
25
+ name,
26
+ onBlur,
27
+ onChange,
28
+ onFocus,
29
+ value,
30
+ ...rest
31
+ }, ref) {
32
+ var _a;
33
+ const checkboxGroup = useCheckboxGroup();
34
+ const handleChange = (event) => {
35
+ var _a2;
36
+ if (event.nativeEvent.defaultPrevented) {
37
+ return;
38
+ }
39
+ const value2 = event.target.checked;
40
+ setChecked(value2);
41
+ onChange == null ? void 0 : onChange(event);
42
+ (_a2 = checkboxGroup.onChange) == null ? void 0 : _a2.call(checkboxGroup, event);
43
+ };
44
+ const checkboxGroupChecked = checkedProp == null && value != null ? (_a = checkboxGroup.checkedValues) == null ? void 0 : _a.includes(value) : checkedProp;
45
+ const [checked, setChecked] = useControlled({
46
+ controlled: checkboxGroupChecked,
47
+ default: Boolean(defaultChecked),
48
+ name: "Checkbox",
49
+ state: "checked"
50
+ });
51
+ return /* @__PURE__ */ jsxs("label", {
52
+ className: clsx(
53
+ withBaseName(),
54
+ {
55
+ [withBaseName("disabled")]: disabled,
56
+ [withBaseName("error")]: error
57
+ },
58
+ className
59
+ ),
60
+ ref,
61
+ ...rest,
62
+ children: [
63
+ /* @__PURE__ */ jsx("input", {
64
+ "aria-checked": indeterminate ? "mixed" : void 0,
65
+ name,
66
+ value,
67
+ ...inputProps,
68
+ checked,
69
+ className: withBaseName("input"),
70
+ "data-indeterminate": indeterminate,
71
+ defaultChecked,
72
+ disabled,
73
+ onBlur,
74
+ onChange: handleChange,
75
+ onFocus,
76
+ type: "checkbox"
77
+ }),
78
+ /* @__PURE__ */ jsx(CheckboxIcon, {
79
+ checked,
80
+ disabled,
81
+ error,
82
+ indeterminate
83
+ }),
84
+ label
85
+ ]
86
+ });
87
+ }
88
+ );
89
+
90
+ export { Checkbox };
91
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sources":["../src/checkbox/Checkbox.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n ChangeEventHandler,\n FocusEventHandler,\n forwardRef,\n InputHTMLAttributes,\n ReactNode,\n} from \"react\";\nimport { makePrefixer, useControlled } from \"../utils\";\nimport { CheckboxIcon } from \"./CheckboxIcon\";\n\nimport \"./Checkbox.css\";\nimport { useCheckboxGroup } from \"./internal/useCheckboxGroup\";\n\nconst withBaseName = makePrefixer(\"saltCheckbox\");\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLLabelElement>,\n \"onChange\" | \"onBlur\" | \"onFocus\"\n > {\n /**\n * If `true`, the checkbox will be checked.\n */\n checked?: boolean;\n /**\n * Whether the checkbox component is checked by default\n * This will be disregarded if checked is already set.\n */\n defaultChecked?: boolean;\n /**\n * If `true`, the checkbox will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true`, the checkbox will be in the error state.\n */\n error?: boolean;\n /**\n * If true, the checkbox appears indeterminate. This does not set the native\n * input element to indeterminate due to the inconsistent behaviour across browsers\n * However, a data-indeterminate attribute is set on the input.\n */\n indeterminate?: boolean;\n /**\n * Properties applied to the input element.\n */\n inputProps?: Partial<InputHTMLAttributes<HTMLInputElement>>;\n /**\n * The label to be shown next to the checkbox.\n */\n label?: ReactNode;\n /**\n * The name applied to the input.\n */\n name?: string;\n /**\n * Callback when checkbox loses focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Callback when checked state is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Callback when checkbox gains focus.\n */\n onFocus?: FocusEventHandler<HTMLInputElement>;\n /**\n * The value of the checkbox.\n */\n value?: string;\n}\n\nexport const Checkbox = forwardRef<HTMLLabelElement, CheckboxProps>(\n function Checkbox(\n {\n checked: checkedProp,\n className,\n defaultChecked,\n disabled,\n error,\n indeterminate,\n inputProps,\n label,\n name,\n onBlur,\n onChange,\n onFocus,\n value,\n ...rest\n },\n ref\n ) {\n const checkboxGroup = useCheckboxGroup();\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n // Workaround for https://github.com/facebook/react/issues/9023\n if (event.nativeEvent.defaultPrevented) {\n return;\n }\n\n const value = event.target.checked;\n setChecked(value);\n onChange?.(event);\n checkboxGroup.onChange?.(event);\n };\n\n const checkboxGroupChecked =\n checkedProp == null && value != null\n ? checkboxGroup.checkedValues?.includes(value)\n : checkedProp;\n\n const [checked, setChecked] = useControlled({\n controlled: checkboxGroupChecked,\n default: Boolean(defaultChecked),\n name: \"Checkbox\",\n state: \"checked\",\n });\n\n return (\n <label\n className={clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"error\")]: error,\n },\n className\n )}\n ref={ref}\n {...rest}\n >\n <input\n // aria-checked only needed when indeterminate since native indeterminate behaviour is not used\n aria-checked={indeterminate ? \"mixed\" : undefined}\n name={name}\n value={value}\n {...inputProps}\n checked={checked}\n className={withBaseName(\"input\")}\n data-indeterminate={indeterminate}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onBlur={onBlur}\n onChange={handleChange}\n onFocus={onFocus}\n type=\"checkbox\"\n />\n <CheckboxIcon\n checked={checked}\n disabled={disabled}\n error={error}\n indeterminate={indeterminate}\n />\n {label}\n </label>\n );\n }\n);\n"],"names":["Checkbox","_a","value"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA,CAAA;AA4DzC,MAAM,QAAW,GAAA,UAAA;AAAA,EACtB,SAASA,SACP,CAAA;AAAA,IACE,OAAS,EAAA,WAAA;AAAA,IACT,SAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACG,GAAA,IAAA;AAAA,KAEL,GACA,EAAA;AA7FJ,IAAA,IAAA,EAAA,CAAA;AA8FI,IAAA,MAAM,gBAAgB,gBAAiB,EAAA,CAAA;AAEvC,IAAM,MAAA,YAAA,GAAqD,CAAC,KAAU,KAAA;AAhG1E,MAAAC,IAAAA,GAAAA,CAAAA;AAkGM,MAAI,IAAA,KAAA,CAAM,YAAY,gBAAkB,EAAA;AACtC,QAAA,OAAA;AAAA,OACF;AAEA,MAAMC,MAAAA,MAAAA,GAAQ,MAAM,MAAO,CAAA,OAAA,CAAA;AAC3B,MAAA,UAAA,CAAWA,MAAK,CAAA,CAAA;AAChB,MAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA,CAAA;AACX,MAAA,CAAAD,GAAA,GAAA,aAAA,CAAc,QAAd,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAA,IAAyB,CAAA,aAAA,EAAA,KAAA,CAAA,CAAA;AAAA,KAC3B,CAAA;AAEA,IAAM,MAAA,oBAAA,GACJ,eAAe,IAAQ,IAAA,KAAA,IAAS,QAC5B,EAAc,GAAA,aAAA,CAAA,aAAA,KAAd,IAA6B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,CAAS,KACtC,CAAA,GAAA,WAAA,CAAA;AAEN,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,aAAc,CAAA;AAAA,MAC1C,UAAY,EAAA,oBAAA;AAAA,MACZ,OAAA,EAAS,QAAQ,cAAc,CAAA;AAAA,MAC/B,IAAM,EAAA,UAAA;AAAA,MACN,KAAO,EAAA,SAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAA,uBACG,IAAA,CAAA,OAAA,EAAA;AAAA,MACC,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb;AAAA,UACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,UAC5B,CAAC,YAAa,CAAA,OAAO,CAAI,GAAA,KAAA;AAAA,SAC3B;AAAA,QACA,SAAA;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,OAAA,EAAA;AAAA,UAEC,cAAA,EAAc,gBAAgB,OAAU,GAAA,KAAA,CAAA;AAAA,UACxC,IAAA;AAAA,UACA,KAAA;AAAA,UACC,GAAG,UAAA;AAAA,UACJ,OAAA;AAAA,UACA,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,UAC/B,oBAAoB,EAAA,aAAA;AAAA,UACpB,cAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAU,EAAA,YAAA;AAAA,UACV,OAAA;AAAA,UACA,IAAK,EAAA,UAAA;AAAA,SACP,CAAA;AAAA,wBACC,GAAA,CAAA,YAAA,EAAA;AAAA,UACC,OAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,aAAA;AAAA,SACF,CAAA;AAAA,QACC,KAAA;AAAA,OAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -0,0 +1,7 @@
1
+ import styleInject from '../../../../node_modules/style-inject/dist/style-inject.es.js';
2
+
3
+ var css_248z = "/* Styles applied to root component */\n.saltCheckboxGroup {\n border: none;\n margin: 0;\n padding: 0;\n}\n\n/* Styles applied to root component if `direction={\"horizontal\"}` */\n.saltCheckboxGroup-horizontal {\n display: flex;\n gap: var(--salt-size-adornmentGap);\n flex-direction: row;\n flex-wrap: wrap;\n}\n\n/* Styles applied to root component if `direction={\"vertical\"}` */\n.saltCheckboxGroup-vertical {\n display: flex;\n gap: var(--salt-size-unit);\n flex-direction: column;\n}\n\n.saltCheckboxGroup-noWrap {\n flex-wrap: nowrap;\n}\n\n.saltCheckboxGroup-noWrap .saltCheckbox {\n white-space: break-spaces;\n}\n";
4
+ styleInject(css_248z);
5
+
6
+ export { css_248z as default };
7
+ //# sourceMappingURL=CheckboxGroup.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxGroup.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,58 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { clsx } from 'clsx';
3
+ import { forwardRef } from 'react';
4
+ import { makePrefixer } from '../utils/makePrefixer.js';
5
+ import { useControlled } from '../utils/useControlled.js';
6
+ import '../utils/useFloatingUI.js';
7
+ import '../utils/useId.js';
8
+ import '../salt-provider/SaltProvider.js';
9
+ import '../viewport/ViewportProvider.js';
10
+ import { CheckboxGroupContext } from './internal/CheckboxGroupContext.js';
11
+ import './CheckboxGroup.css.js';
12
+
13
+ const withBaseName = makePrefixer("saltCheckboxGroup");
14
+ const CheckboxGroup = forwardRef(function CheckboxGroup2({
15
+ checkedValues: checkedValuesProp,
16
+ defaultCheckedValues = [],
17
+ children,
18
+ className,
19
+ direction = "vertical",
20
+ name,
21
+ onChange,
22
+ wrap,
23
+ ...other
24
+ }, ref) {
25
+ const [checkedValues, setCheckedValues] = useControlled({
26
+ controlled: checkedValuesProp,
27
+ default: defaultCheckedValues,
28
+ name: "CheckboxGroup",
29
+ state: "checkedValues"
30
+ });
31
+ const handleChange = (event) => {
32
+ setCheckedValues((oldValues = []) => {
33
+ const name2 = event.target.value;
34
+ const isSelected = oldValues.includes(name2);
35
+ return isSelected ? oldValues.filter((value) => value !== name2) : oldValues.concat(name2);
36
+ });
37
+ onChange == null ? void 0 : onChange(event);
38
+ };
39
+ return /* @__PURE__ */ jsx("fieldset", {
40
+ className: clsx(
41
+ withBaseName(),
42
+ withBaseName(direction),
43
+ {
44
+ [withBaseName("noWrap")]: !wrap
45
+ },
46
+ className
47
+ ),
48
+ ref,
49
+ ...other,
50
+ children: /* @__PURE__ */ jsx(CheckboxGroupContext.Provider, {
51
+ value: { name, onChange: handleChange, checkedValues },
52
+ children
53
+ })
54
+ });
55
+ });
56
+
57
+ export { CheckboxGroup };
58
+ //# sourceMappingURL=CheckboxGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxGroup.js","sources":["../src/checkbox/CheckboxGroup.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n ChangeEvent,\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n forwardRef,\n} from \"react\";\nimport { makePrefixer, useControlled } from \"../utils\";\nimport { CheckboxGroupContext } from \"./internal/CheckboxGroupContext\";\n\nimport \"./CheckboxGroup.css\";\n\nexport interface CheckboxGroupProps\n extends Omit<ComponentPropsWithoutRef<\"fieldset\">, \"onChange\"> {\n /**\n * The current checked options.\n */\n checkedValues?: string[];\n /**\n * The default selected options for un-controlled component.\n */\n defaultCheckedValues?: string[];\n /**\n * Display group of elements in a compact row.\n */\n direction?: \"horizontal\" | \"vertical\";\n /**\n * The name used to reference the value of the control.\n */\n name?: string;\n /**\n * Callback fired when a checkbox is clicked.\n * `event.target.value` returns the value of the checkbox that was clicked.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Only for horizontal direction. When `true` the text in radio button label will wrap to fit within the container. Otherwise, the checkboxes will wrap onto the next line.\n */\n wrap?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltCheckboxGroup\");\n\nexport const CheckboxGroup = forwardRef<\n HTMLFieldSetElement,\n CheckboxGroupProps\n>(function CheckboxGroup(\n {\n checkedValues: checkedValuesProp,\n defaultCheckedValues = [],\n children,\n className,\n direction = \"vertical\",\n name,\n onChange,\n wrap,\n ...other\n },\n ref\n) {\n const [checkedValues, setCheckedValues] = useControlled({\n controlled: checkedValuesProp,\n default: defaultCheckedValues,\n name: \"CheckboxGroup\",\n state: \"checkedValues\",\n });\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setCheckedValues((oldValues: string[] = []) => {\n const name = event.target.value;\n const isSelected = oldValues.includes(name);\n\n return isSelected\n ? oldValues.filter((value) => value !== name)\n : oldValues.concat(name);\n });\n\n onChange?.(event);\n };\n\n return (\n <fieldset\n className={clsx(\n withBaseName(),\n withBaseName(direction),\n {\n [withBaseName(\"noWrap\")]: !wrap,\n },\n className\n )}\n ref={ref}\n {...other}\n >\n <CheckboxGroupContext.Provider\n value={{ name, onChange: handleChange, checkedValues }}\n >\n {children}\n </CheckboxGroupContext.Provider>\n </fieldset>\n );\n});\n"],"names":["CheckboxGroup","name"],"mappings":";;;;;;;;;;;;AAyCA,MAAM,YAAA,GAAe,aAAa,mBAAmB,CAAA,CAAA;AAExC,MAAA,aAAA,GAAgB,UAG3B,CAAA,SAASA,cACT,CAAA;AAAA,EACE,aAAe,EAAA,iBAAA;AAAA,EACf,uBAAuB,EAAC;AAAA,EACxB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAY,GAAA,UAAA;AAAA,EACZ,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACG,GAAA,KAAA;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,aAAc,CAAA;AAAA,IACtD,UAAY,EAAA,iBAAA;AAAA,IACZ,OAAS,EAAA,oBAAA;AAAA,IACT,IAAM,EAAA,eAAA;AAAA,IACN,KAAO,EAAA,eAAA;AAAA,GACR,CAAA,CAAA;AAED,EAAM,MAAA,YAAA,GAAe,CAAC,KAAyC,KAAA;AAC7D,IAAiB,gBAAA,CAAA,CAAC,SAAsB,GAAA,EAAO,KAAA;AAC7C,MAAMC,MAAAA,KAAAA,GAAO,MAAM,MAAO,CAAA,KAAA,CAAA;AAC1B,MAAM,MAAA,UAAA,GAAa,SAAU,CAAA,QAAA,CAASA,KAAI,CAAA,CAAA;AAE1C,MAAO,OAAA,UAAA,GACH,SAAU,CAAA,MAAA,CAAO,CAAC,KAAA,KAAU,UAAUA,KAAI,CAAA,GAC1C,SAAU,CAAA,MAAA,CAAOA,KAAI,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAED,IAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACb,CAAA;AAEA,EAAA,uBACG,GAAA,CAAA,UAAA,EAAA;AAAA,IACC,SAAW,EAAA,IAAA;AAAA,MACT,YAAa,EAAA;AAAA,MACb,aAAa,SAAS,CAAA;AAAA,MACtB;AAAA,QACE,CAAC,YAAA,CAAa,QAAQ,CAAA,GAAI,CAAC,IAAA;AAAA,OAC7B;AAAA,MACA,SAAA;AAAA,KACF;AAAA,IACA,GAAA;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA,CAAC,qBAAqB,QAArB,EAAA;AAAA,MACC,KAAO,EAAA,EAAE,IAAM,EAAA,QAAA,EAAU,cAAc,aAAc,EAAA;AAAA,MAEpD,QAAA;AAAA,KACH,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,7 @@
1
+ import styleInject from '../../../../node_modules/style-inject/dist/style-inject.es.js';
2
+
3
+ var css_248z = "/* Styles applied to root component */\n\n.saltCheckboxIcon {\n --checkbox-density-bar-y: 6px;\n --checkbox-density-bar-height: 2px;\n\n --checkbox-borderWidth: var(--salt-size-border);\n --checkbox-size: var(--salt-size-selectable);\n --checkbox-box-offset: calc(var(--checkbox-borderWidth) / 2);\n /* 14px is used to match the svg's viewbox */\n --checkbox-box-size: calc(100% - var(--checkbox-borderWidth));\n --checkbox-icon-tick-fill: var(--saltCheckbox-icon-tick-color, var(--salt-selectable-primary-foreground-selected));\n\n fill: var(--saltCheckbox-icon-fill, var(--salt-selectable-background));\n height: var(--saltCheckbox-icon-size, var(--checkbox-size));\n min-height: var(--saltCheckbox-icon-size, var(--checkbox-size));\n stroke: var(--saltCheckbox-icon-stroke, var(--salt-selectable-foreground));\n stroke-width: var(--saltCheckbox-icon-strokeWidth, var(--checkbox-borderWidth));\n width: var(--saltCheckbox-icon-size, var(--checkbox-size));\n min-width: var(--saltCheckbox-icon-size, var(--checkbox-size));\n background: var(--salt-container-primary-background);\n}\n\n/* Styles applied to root component on hover */\n.saltCheckbox:hover .saltCheckboxIcon {\n stroke: var(--saltCheckbox-icon-stroke, var(--salt-selectable-foreground-hover));\n background: var(--salt-selectable-background-hover);\n}\n\n/* Styles applied if `disabled={true}` */\n.saltCheckbox-disabled:hover .saltCheckboxIcon,\n.saltCheckboxIcon-disabled {\n stroke: var(--saltCheckbox-icon-stroke-disabled, var(--salt-selectable-foreground-disabled));\n background: var(--salt-selectable-background);\n}\n\n/* Styles applied if `error={true}` */\n.saltCheckbox-error .saltCheckboxIcon,\n.saltCheckbox-error:hover .saltCheckboxIcon {\n stroke: var(--saltCheckbox-icon-stroke-error, var(--salt-status-error-foreground));\n}\n\n/* Styles applied if `error={true}` on hover */\n.saltCheckbox-error:hover .saltCheckboxIcon {\n background: var(--salt-status-error-background);\n}\n\n/* Styles applied if `error={true}` and `disabled={true}` */\n.saltCheckbox-error.saltCheckbox-disabled .saltCheckboxIcon,\n.saltCheckbox-error.saltCheckbox-disabled:hover .saltCheckboxIcon {\n stroke: var(--saltCheckbox-icon-stroke-error, var(--salt-status-error-foreground-disabled));\n background: var(--salt-selectable-background);\n}\n\n/* Styles applied if `checked={true}` */\n.saltCheckboxIcon-checked {\n fill: var(--saltCheckbox-icon-fill-checked, var(--salt-selectable-foreground-selected));\n --checkbox-borderWidth: var(--saltCheckbox-icon-borderWidth-checked, 0px);\n}\n\n/* Styles applied if `checked={true}` and `disabled={true}` */\n.saltCheckboxIcon-checked.saltCheckboxIcon-disabled {\n fill: var(--saltCheckbox-icon-fill-disabled, var(--salt-selectable-foreground-selectedDisabled));\n}\n\n/* Styles applied if `checked={true}` and `error={true}` */\n.saltCheckboxIcon-checked.saltCheckboxIcon-error {\n fill: var(--saltCheckbox-icon-stroke-error, var(--salt-status-error-foreground));\n}\n\n/* Styles applied if `checked={true}`,`error={true}` and `disabled={true}` */\n.saltCheckboxIcon-checked.saltCheckboxIcon-error.saltCheckboxIcon-disabled {\n fill: var(--saltCheckbox-icon-fill-disabled, var(--salt-status-error-foreground-disabled));\n}\n\n/* Styles applied to box */\n.saltCheckboxIcon-box {\n stroke-width: var(--checkbox-borderWidth);\n width: var(--checkbox-box-size);\n height: var(--checkbox-box-size);\n x: var(--checkbox-box-offset);\n y: var(--checkbox-box-offset);\n}\n\n/* Styles applied to icon if `indeterminate={true}` */\n.saltCheckboxIcon-indeterminate {\n stroke: var(--saltCheckbox-icon-stroke, var(--salt-selectable-foreground-selected));\n --checkbox-icon-tick-fill: var(--saltCheckbox-icon-indeterminate-bar-color, var(--salt-selectable-foreground-selected));\n}\n\n/* Styles applied to icon if `indeterminate={true}` on hover */\n.saltCheckbox:hover .saltCheckboxIcon-indeterminate {\n --checkbox-icon-tick-fill: var(--saltCheckbox-icon-stroke, var(--salt-selectable-foreground-hover));\n}\n\n/* Styles applied if `indeterminate={true}` and `disabled={true}` */\n.saltCheckboxIcon-disabled.saltCheckboxIcon-indeterminate {\n stroke: var(--saltCheckbox-icon-stroke-disabled, var(--salt-selectable-foreground-disabled));\n --checkbox-icon-tick-fill: var(--saltCheckbox-icon-indeterminate-bar-color-disabled, var(--salt-selectable-foreground-selectedDisabled));\n}\n\n/* Styles applied if `indeterminate={true}` and `error={true}` */\n.saltCheckboxIcon-error.saltCheckboxIcon-indeterminate,\n.saltCheckbox:hover .saltCheckboxIcon-error.saltCheckboxIcon-indeterminate {\n --checkbox-icon-tick-fill: var(--saltCheckbox-icon-stroke-error, var(--salt-status-error-foreground));\n}\n\n/* Styles applied if `indeterminate={true}`,`disabled={true}` and `error={true}` */\n.saltCheckboxIcon-error.saltCheckboxIcon-disabled.saltCheckboxIcon-indeterminate {\n --checkbox-icon-tick-fill: var(--saltCheckbox-icon-stroke-error, var(--salt-status-error-foreground-disabled));\n}\n\n/* Styles applied to tick */\n.saltCheckboxIcon-tick {\n fill: var(--saltCheckbox-icon-tick-fill, var(--checkbox-icon-tick-fill));\n stroke-width: 0;\n}\n\n/* Styles applied to tick if `indeterminate={true}` */\n.saltCheckboxIcon-indeterminate .saltCheckboxIcon-tick {\n height: var(--saltCheckbox-icon-indeterminate-bar-height, var(--checkbox-density-bar-height));\n y: var(--saltCheckbox-icon-indeterminate-bar-y, var(--checkbox-density-bar-y));\n}\n";
4
+ styleInject(css_248z);
5
+
6
+ export { css_248z as default };
7
+ //# sourceMappingURL=CheckboxIcon.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxIcon.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,44 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { clsx } from 'clsx';
3
+ import 'react';
4
+ import { makePrefixer } from '../utils/makePrefixer.js';
5
+ import '../utils/useFloatingUI.js';
6
+ import '../utils/useId.js';
7
+ import { useDensity } from '../salt-provider/SaltProvider.js';
8
+ import '../viewport/ViewportProvider.js';
9
+ import { CheckboxUncheckedIcon } from './assets/CheckboxUncheckedIcon.js';
10
+ import { CheckboxCheckedIcon } from './assets/CheckboxCheckedIcon.js';
11
+ import { CheckboxCheckedIconHD } from './assets/CheckboxCheckedIconHD.js';
12
+ import { CheckboxIndeterminateIcon } from './assets/CheckboxIndeterminateIcon.js';
13
+ import './CheckboxIcon.css.js';
14
+
15
+ const withBaseName = makePrefixer("saltCheckboxIcon");
16
+ const CheckboxIcon = ({
17
+ checked = false,
18
+ className: classNameProp,
19
+ disabled,
20
+ error,
21
+ indeterminate
22
+ }) => {
23
+ const className = clsx(
24
+ withBaseName(),
25
+ {
26
+ [withBaseName("disabled")]: disabled,
27
+ [withBaseName("error")]: error
28
+ },
29
+ classNameProp
30
+ );
31
+ const density = useDensity();
32
+ return indeterminate ? /* @__PURE__ */ jsx(CheckboxIndeterminateIcon, {
33
+ className: clsx(className, withBaseName("indeterminate"))
34
+ }) : checked ? density === "high" ? /* @__PURE__ */ jsx(CheckboxCheckedIconHD, {
35
+ className: clsx(className, withBaseName("checked"))
36
+ }) : /* @__PURE__ */ jsx(CheckboxCheckedIcon, {
37
+ className: clsx(className, withBaseName("checked"))
38
+ }) : /* @__PURE__ */ jsx(CheckboxUncheckedIcon, {
39
+ className
40
+ });
41
+ };
42
+
43
+ export { CheckboxIcon };
44
+ //# sourceMappingURL=CheckboxIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxIcon.js","sources":["../src/checkbox/CheckboxIcon.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { makePrefixer } from \"../utils\";\nimport {\n CheckboxCheckedIcon,\n CheckboxCheckedIconHD,\n CheckboxIndeterminateIcon,\n CheckboxUncheckedIcon,\n} from \"./assets\";\n\nimport \"./CheckboxIcon.css\";\nimport { useDensity } from \"../salt-provider\";\n\nexport interface CheckboxIconProps {\n checked?: boolean;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n indeterminate?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltCheckboxIcon\");\n\nexport const CheckboxIcon = ({\n checked = false,\n className: classNameProp,\n disabled,\n error,\n indeterminate,\n}: CheckboxIconProps): JSX.Element => {\n const className = clsx(\n withBaseName(),\n {\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"error\")]: error,\n },\n classNameProp\n );\n\n // A different CheckboxCheckedIcon is rendered if the density is set to high\n const density = useDensity();\n\n return indeterminate ? (\n <CheckboxIndeterminateIcon\n className={clsx(className, withBaseName(\"indeterminate\"))}\n />\n ) : checked ? (\n density === \"high\" ? (\n <CheckboxCheckedIconHD\n className={clsx(className, withBaseName(\"checked\"))}\n />\n ) : (\n <CheckboxCheckedIcon\n className={clsx(className, withBaseName(\"checked\"))}\n />\n )\n ) : (\n <CheckboxUncheckedIcon className={className} />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAoBA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA,CAAA;AAE7C,MAAM,eAAe,CAAC;AAAA,EAC3B,OAAU,GAAA,KAAA;AAAA,EACV,SAAW,EAAA,aAAA;AAAA,EACX,QAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AACF,CAAsC,KAAA;AACpC,EAAA,MAAM,SAAY,GAAA,IAAA;AAAA,IAChB,YAAa,EAAA;AAAA,IACb;AAAA,MACE,CAAC,YAAa,CAAA,UAAU,CAAI,GAAA,QAAA;AAAA,MAC5B,CAAC,YAAa,CAAA,OAAO,CAAI,GAAA,KAAA;AAAA,KAC3B;AAAA,IACA,aAAA;AAAA,GACF,CAAA;AAGA,EAAA,MAAM,UAAU,UAAW,EAAA,CAAA;AAE3B,EAAA,OAAO,gCACJ,GAAA,CAAA,yBAAA,EAAA;AAAA,IACC,SAAW,EAAA,IAAA,CAAK,SAAW,EAAA,YAAA,CAAa,eAAe,CAAC,CAAA;AAAA,GAC1D,CACE,GAAA,OAAA,GACF,OAAY,KAAA,MAAA,mBACT,GAAA,CAAA,qBAAA,EAAA;AAAA,IACC,SAAW,EAAA,IAAA,CAAK,SAAW,EAAA,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,GACpD,oBAEC,GAAA,CAAA,mBAAA,EAAA;AAAA,IACC,SAAW,EAAA,IAAA,CAAK,SAAW,EAAA,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,GACpD,oBAGD,GAAA,CAAA,qBAAA,EAAA;AAAA,IAAsB,SAAA;AAAA,GAAsB,CAAA,CAAA;AAEjD;;;;"}
@@ -0,0 +1,29 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+
3
+ function CheckboxCheckedIcon({
4
+ className
5
+ }) {
6
+ return /* @__PURE__ */ jsx("svg", {
7
+ "aria-hidden": "true",
8
+ className,
9
+ focusable: "false",
10
+ shapeRendering: "geometricPrecision",
11
+ viewBox: "0 0 14 14",
12
+ children: /* @__PURE__ */ jsxs("g", {
13
+ fillRule: "evenodd",
14
+ children: [
15
+ /* @__PURE__ */ jsx("rect", {
16
+ className: `saltCheckboxIcon-box`
17
+ }),
18
+ /* @__PURE__ */ jsx("polygon", {
19
+ className: `saltCheckboxIcon-tick`,
20
+ fillRule: "nonzero",
21
+ points: "12 4.22226066 10.6259221 3 5.58277771 8.37894955 3.3179086 6.13993399 2 7.40754746 5.63993779 11"
22
+ })
23
+ ]
24
+ })
25
+ });
26
+ }
27
+
28
+ export { CheckboxCheckedIcon };
29
+ //# sourceMappingURL=CheckboxCheckedIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxCheckedIcon.js","sources":["../src/checkbox/assets/CheckboxCheckedIcon.tsx"],"sourcesContent":["export function CheckboxCheckedIcon({\n className,\n}: {\n className: string;\n}): JSX.Element {\n return (\n <svg\n aria-hidden=\"true\"\n className={className}\n focusable=\"false\"\n shapeRendering=\"geometricPrecision\"\n viewBox=\"0 0 14 14\"\n >\n <g fillRule=\"evenodd\">\n <rect className={`saltCheckboxIcon-box`} />\n <polygon\n className={`saltCheckboxIcon-tick`}\n fillRule=\"nonzero\"\n points=\"12 4.22226066 10.6259221 3 5.58277771 8.37894955 3.3179086 6.13993399 2 7.40754746 5.63993779 11\"\n />\n </g>\n </svg>\n );\n}\n"],"names":[],"mappings":";;AAAO,SAAS,mBAAoB,CAAA;AAAA,EAClC,SAAA;AACF,CAEgB,EAAA;AACd,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA;AAAA,IACC,aAAY,EAAA,MAAA;AAAA,IACZ,SAAA;AAAA,IACA,SAAU,EAAA,OAAA;AAAA,IACV,cAAe,EAAA,oBAAA;AAAA,IACf,OAAQ,EAAA,WAAA;AAAA,IAER,QAAC,kBAAA,IAAA,CAAA,GAAA,EAAA;AAAA,MAAE,QAAS,EAAA,SAAA;AAAA,MACV,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,MAAA,EAAA;AAAA,UAAK,SAAW,EAAA,CAAA,oBAAA,CAAA;AAAA,SAAwB,CAAA;AAAA,wBACxC,GAAA,CAAA,SAAA,EAAA;AAAA,UACC,SAAW,EAAA,CAAA,qBAAA,CAAA;AAAA,UACX,QAAS,EAAA,SAAA;AAAA,UACT,MAAO,EAAA,kGAAA;AAAA,SACT,CAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ;;;;"}