@salt-ds/lab 1.0.0-alpha.28 → 1.0.0-alpha.29

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 (71) hide show
  1. package/css/salt-lab.css +33 -110
  2. package/dist-cjs/color-chooser/ColorChooser.css.js +1 -1
  3. package/dist-cjs/color-chooser/ColorChooser.js +52 -55
  4. package/dist-cjs/color-chooser/ColorChooser.js.map +1 -1
  5. package/dist-cjs/index.js +4 -8
  6. package/dist-cjs/index.js.map +1 -1
  7. package/dist-cjs/overlay/Overlay.css.js +1 -1
  8. package/dist-cjs/overlay/Overlay.js +89 -60
  9. package/dist-cjs/overlay/Overlay.js.map +1 -1
  10. package/dist-cjs/overlay/OverlayContext.js +43 -0
  11. package/dist-cjs/overlay/OverlayContext.js.map +1 -0
  12. package/dist-cjs/overlay/OverlayPanel.js +64 -0
  13. package/dist-cjs/overlay/OverlayPanel.js.map +1 -0
  14. package/dist-cjs/overlay/OverlayPanelBase.js +65 -0
  15. package/dist-cjs/overlay/OverlayPanelBase.js.map +1 -0
  16. package/dist-cjs/overlay/OverlayTrigger.js +40 -0
  17. package/dist-cjs/overlay/OverlayTrigger.js.map +1 -0
  18. package/dist-es/color-chooser/ColorChooser.css.js +1 -1
  19. package/dist-es/color-chooser/ColorChooser.js +53 -56
  20. package/dist-es/color-chooser/ColorChooser.js.map +1 -1
  21. package/dist-es/index.js +2 -4
  22. package/dist-es/index.js.map +1 -1
  23. package/dist-es/overlay/Overlay.css.js +1 -1
  24. package/dist-es/overlay/Overlay.js +91 -62
  25. package/dist-es/overlay/Overlay.js.map +1 -1
  26. package/dist-es/overlay/OverlayContext.js +38 -0
  27. package/dist-es/overlay/OverlayContext.js.map +1 -0
  28. package/dist-es/overlay/OverlayPanel.js +60 -0
  29. package/dist-es/overlay/OverlayPanel.js.map +1 -0
  30. package/dist-es/overlay/OverlayPanelBase.js +57 -0
  31. package/dist-es/overlay/OverlayPanelBase.js.map +1 -0
  32. package/dist-es/overlay/OverlayTrigger.js +36 -0
  33. package/dist-es/overlay/OverlayTrigger.js.map +1 -0
  34. package/dist-types/index.d.ts +0 -1
  35. package/dist-types/overlay/Overlay.d.ts +6 -14
  36. package/dist-types/overlay/OverlayContext.d.ts +26 -0
  37. package/dist-types/overlay/OverlayPanel.d.ts +4 -0
  38. package/dist-types/overlay/OverlayPanelBase.d.ts +2 -0
  39. package/dist-types/overlay/OverlayTrigger.d.ts +5 -0
  40. package/dist-types/overlay/index.d.ts +2 -1
  41. package/package.json +2 -2
  42. package/dist-cjs/file-drop-zone/FileDropZone.css.js +0 -6
  43. package/dist-cjs/file-drop-zone/FileDropZone.css.js.map +0 -1
  44. package/dist-cjs/file-drop-zone/FileDropZone.js +0 -94
  45. package/dist-cjs/file-drop-zone/FileDropZone.js.map +0 -1
  46. package/dist-cjs/file-drop-zone/FileDropZoneIcon.js +0 -25
  47. package/dist-cjs/file-drop-zone/FileDropZoneIcon.js.map +0 -1
  48. package/dist-cjs/file-drop-zone/FileDropZoneTrigger.js +0 -52
  49. package/dist-cjs/file-drop-zone/FileDropZoneTrigger.js.map +0 -1
  50. package/dist-cjs/file-drop-zone/internal/utils.js +0 -30
  51. package/dist-cjs/file-drop-zone/internal/utils.js.map +0 -1
  52. package/dist-cjs/overlay/useOverlay.js +0 -97
  53. package/dist-cjs/overlay/useOverlay.js.map +0 -1
  54. package/dist-es/file-drop-zone/FileDropZone.css.js +0 -4
  55. package/dist-es/file-drop-zone/FileDropZone.css.js.map +0 -1
  56. package/dist-es/file-drop-zone/FileDropZone.js +0 -90
  57. package/dist-es/file-drop-zone/FileDropZone.js.map +0 -1
  58. package/dist-es/file-drop-zone/FileDropZoneIcon.js +0 -21
  59. package/dist-es/file-drop-zone/FileDropZoneIcon.js.map +0 -1
  60. package/dist-es/file-drop-zone/FileDropZoneTrigger.js +0 -48
  61. package/dist-es/file-drop-zone/FileDropZoneTrigger.js.map +0 -1
  62. package/dist-es/file-drop-zone/internal/utils.js +0 -25
  63. package/dist-es/file-drop-zone/internal/utils.js.map +0 -1
  64. package/dist-es/overlay/useOverlay.js +0 -93
  65. package/dist-es/overlay/useOverlay.js.map +0 -1
  66. package/dist-types/file-drop-zone/FileDropZone.d.ts +0 -17
  67. package/dist-types/file-drop-zone/FileDropZoneIcon.d.ts +0 -9
  68. package/dist-types/file-drop-zone/FileDropZoneTrigger.d.ts +0 -22
  69. package/dist-types/file-drop-zone/index.d.ts +0 -3
  70. package/dist-types/file-drop-zone/internal/utils.d.ts +0 -3
  71. package/dist-types/overlay/useOverlay.d.ts +0 -8
@@ -1,71 +1,100 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { makePrefixer, useId, Button } from '@salt-ds/core';
3
- import { CloseIcon } from '@salt-ds/icons';
4
- import { clsx } from 'clsx';
5
- import { forwardRef } from 'react';
6
- import { Portal } from '../portal/Portal.js';
7
- import { useComponentCssInjection } from '@salt-ds/styles';
8
- import { useWindow } from '@salt-ds/window';
9
- import { useWindow as useWindow$1 } from '../window/WindowContext.js';
10
- import '../window/ElectronWindow.js';
11
- import css_248z from './Overlay.css.js';
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { forwardRef, useRef, useMemo } from 'react';
3
+ import { OverlayContext } from './OverlayContext.js';
4
+ import { useId, useControlled, useFloatingUI } from '@salt-ds/core';
5
+ import { offset, flip, shift, limitShift, arrow, useInteractions, useRole, useClick, useDismiss } from '@floating-ui/react';
12
6
 
13
- const withBaseName = makePrefixer("saltOverlay");
14
7
  const Overlay = forwardRef(
15
- ({
16
- adaExceptions: { showClose } = {
17
- showClose: true
18
- },
19
- arrowProps,
20
- children,
21
- className,
22
- open,
23
- onOpenChange,
24
- variant = "primary",
25
- ...rest
26
- }, ref) => {
27
- const targetWindow = useWindow();
28
- useComponentCssInjection({
29
- testId: "salt-overlay",
30
- css: css_248z,
31
- window: targetWindow
8
+ function Overlay2(props, ref) {
9
+ const {
10
+ children,
11
+ open,
12
+ onOpenChange,
13
+ placement: placementProp = "top",
14
+ id: idProp,
15
+ onClose,
16
+ ...rest
17
+ } = props;
18
+ const id = useId(idProp);
19
+ const arrowRef = useRef(null);
20
+ const [openState, setOpenState] = useControlled({
21
+ controlled: open,
22
+ default: false,
23
+ name: "Overlay",
24
+ state: "open"
32
25
  });
33
- const id = useId();
34
- const Window = useWindow$1();
35
- const handleCloseButton = () => {
36
- onOpenChange == null ? void 0 : onOpenChange(false);
26
+ const {
27
+ x,
28
+ y,
29
+ strategy,
30
+ context,
31
+ elements,
32
+ floating,
33
+ reference,
34
+ middlewareData: { arrow: { x: arrowX, y: arrowY } = {} },
35
+ placement
36
+ } = useFloatingUI({
37
+ open: openState,
38
+ onOpenChange: setOpenState,
39
+ placement: placementProp,
40
+ middleware: [
41
+ offset(11),
42
+ flip(),
43
+ shift({ limiter: limitShift() }),
44
+ arrow({ element: arrowRef })
45
+ ]
46
+ });
47
+ const { getReferenceProps, getFloatingProps } = useInteractions([
48
+ useRole(context, { role: "dialog" }),
49
+ useClick(context),
50
+ useDismiss(context)
51
+ ]);
52
+ const floatingStyles = useMemo(() => {
53
+ var _a, _b;
54
+ return {
55
+ top: y != null ? y : 0,
56
+ left: x != null ? x : 0,
57
+ position: strategy,
58
+ width: (_a = elements.floating) == null ? void 0 : _a.offsetWidth,
59
+ height: (_b = elements.floating) == null ? void 0 : _b.offsetHeight
60
+ };
61
+ }, [elements.floating, strategy, x, y]);
62
+ const setOpen = (event, newOpen) => {
63
+ setOpenState(newOpen);
64
+ onOpenChange == null ? void 0 : onOpenChange(event, newOpen);
65
+ };
66
+ const arrowProps = {
67
+ ref: arrowRef,
68
+ context,
69
+ style: {
70
+ position: strategy,
71
+ left: arrowX != null ? arrowX : 0,
72
+ top: arrowY != null ? arrowY : 0
73
+ }
74
+ };
75
+ const handleCloseButton = (event) => {
76
+ setOpen(event, false);
77
+ onClose == null ? void 0 : onClose(event);
37
78
  };
38
- if (!open) {
39
- return null;
40
- }
41
- return /* @__PURE__ */ jsx(Portal, {
42
- children: /* @__PURE__ */ jsx(Window, {
43
- className: clsx(withBaseName(), className, {
44
- [withBaseName(variant)]: variant === "secondary"
45
- }),
46
- id,
79
+ return /* @__PURE__ */ jsx(OverlayContext.Provider, {
80
+ value: {
81
+ id: id != null ? id : "",
82
+ openState,
83
+ setOpen,
84
+ floatingStyles,
85
+ placement,
86
+ context,
87
+ arrowProps,
88
+ floating,
89
+ reference,
90
+ handleCloseButton,
91
+ getFloatingProps,
92
+ getReferenceProps
93
+ },
94
+ children: /* @__PURE__ */ jsx("div", {
47
95
  ref,
48
96
  ...rest,
49
- children: /* @__PURE__ */ jsxs("div", {
50
- className: clsx(withBaseName("content")),
51
- "data-testid": "overlay-content",
52
- children: [
53
- showClose && /* @__PURE__ */ jsx(Button, {
54
- onClick: handleCloseButton,
55
- className: withBaseName("close"),
56
- variant: "secondary",
57
- children: /* @__PURE__ */ jsx(CloseIcon, {
58
- "accessible-text": "close overlay",
59
- className: withBaseName("closeIcon")
60
- })
61
- }),
62
- children,
63
- /* @__PURE__ */ jsx("div", {
64
- className: withBaseName("arrow"),
65
- ...arrowProps
66
- })
67
- ]
68
- })
97
+ children
69
98
  })
70
99
  });
71
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Overlay.js","sources":["../src/overlay/Overlay.tsx"],"sourcesContent":["import { Button, makePrefixer, UseFloatingUIProps, useId } from \"@salt-ds/core\";\nimport { CloseIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport { ComponentProps, ComponentPropsWithoutRef, forwardRef } from \"react\";\nimport { Portal } from \"../portal\";\n\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport { useWindow as usePortalWindow } from \"../window\";\n\nimport overlayCSS from \"./Overlay.css\";\n\ninterface ADAExceptions {\n showClose?: boolean;\n}\n\nexport interface OverlayProps\n extends ComponentPropsWithoutRef<\"div\">,\n Partial<Pick<UseFloatingUIProps, \"onOpenChange\" | \"open\">> {\n /**\n * object that houses ada related props.\n * adaExceptions.showClose defaults to true. It can be removed at the risk of ADA compliance\n */\n adaExceptions?: ADAExceptions;\n arrowProps?: ComponentProps<\"div\">;\n variant?: \"primary\" | \"secondary\";\n}\n\nconst withBaseName = makePrefixer(\"saltOverlay\");\n\nexport const Overlay = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n adaExceptions: { showClose } = {\n showClose: true,\n },\n arrowProps,\n children,\n className,\n open,\n onOpenChange,\n variant = \"primary\",\n ...rest\n },\n ref\n ) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-overlay\",\n css: overlayCSS,\n window: targetWindow,\n });\n\n // Will need to figure out a better way to assign popper id's for the electron windows\n const id = useId();\n const Window = usePortalWindow();\n\n const handleCloseButton = () => {\n onOpenChange?.(false);\n };\n\n if (!open) {\n return null;\n }\n\n return (\n <Portal>\n <Window\n className={clsx(withBaseName(), className, {\n [withBaseName(variant)]: variant === \"secondary\",\n })}\n id={id}\n ref={ref}\n {...rest}\n >\n <div\n className={clsx(withBaseName(\"content\"))}\n data-testid=\"overlay-content\"\n >\n {showClose && (\n <Button\n onClick={handleCloseButton}\n className={withBaseName(\"close\")}\n variant=\"secondary\"\n >\n <CloseIcon\n accessible-text=\"close overlay\"\n className={withBaseName(\"closeIcon\")}\n />\n </Button>\n )}\n {children}\n <div className={withBaseName(\"arrow\")} {...arrowProps} />\n </div>\n </Window>\n </Portal>\n );\n }\n);\n"],"names":["overlayCSS","usePortalWindow"],"mappings":";;;;;;;;;;;;AA6BA,MAAM,YAAA,GAAe,aAAa,aAAa,CAAA,CAAA;AAExC,MAAM,OAAU,GAAA,UAAA;AAAA,EACrB,CACE;AAAA,IACE,aAAA,EAAe,EAAE,SAAA,EAAc,GAAA;AAAA,MAC7B,SAAW,EAAA,IAAA;AAAA,KACb;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAU,GAAA,SAAA;AAAA,IACP,GAAA,IAAA;AAAA,KAEL,GACG,KAAA;AACH,IAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,cAAA;AAAA,MACR,GAAK,EAAAA,QAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAGD,IAAA,MAAM,KAAK,KAAM,EAAA,CAAA;AACjB,IAAA,MAAM,SAASC,WAAgB,EAAA,CAAA;AAE/B,IAAA,MAAM,oBAAoB,MAAM;AAC9B,MAAe,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACjB,CAAA;AAEA,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,uBACG,GAAA,CAAA,MAAA,EAAA;AAAA,MACC,QAAC,kBAAA,GAAA,CAAA,MAAA,EAAA;AAAA,QACC,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAW,EAAA;AAAA,UACzC,CAAC,YAAA,CAAa,OAAO,CAAA,GAAI,OAAY,KAAA,WAAA;AAAA,SACtC,CAAA;AAAA,QACD,EAAA;AAAA,QACA,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEJ,QAAC,kBAAA,IAAA,CAAA,KAAA,EAAA;AAAA,UACC,SAAW,EAAA,IAAA,CAAK,YAAa,CAAA,SAAS,CAAC,CAAA;AAAA,UACvC,aAAY,EAAA,iBAAA;AAAA,UAEX,QAAA,EAAA;AAAA,YAAA,SAAA,oBACE,GAAA,CAAA,MAAA,EAAA;AAAA,cACC,OAAS,EAAA,iBAAA;AAAA,cACT,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAC/B,OAAQ,EAAA,WAAA;AAAA,cAER,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA;AAAA,gBACC,iBAAgB,EAAA,eAAA;AAAA,gBAChB,SAAA,EAAW,aAAa,WAAW,CAAA;AAAA,eACrC,CAAA;AAAA,aACF,CAAA;AAAA,YAED,QAAA;AAAA,4BACA,GAAA,CAAA,KAAA,EAAA;AAAA,cAAI,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAAI,GAAG,UAAA;AAAA,aAAY,CAAA;AAAA,WAAA;AAAA,SACzD,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"Overlay.js","sources":["../src/overlay/Overlay.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef,\n forwardRef,\n SyntheticEvent,\n useMemo,\n useRef,\n} from \"react\";\nimport { OverlayContext } from \"./OverlayContext\";\nimport { useControlled, useFloatingUI, useId } from \"@salt-ds/core\";\nimport {\n flip,\n offset,\n shift,\n limitShift,\n arrow,\n useClick,\n useDismiss,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\n\nexport interface OverlayProps extends ComponentPropsWithoutRef<\"div\"> {\n open?: boolean;\n onOpenChange?: (event: SyntheticEvent, newOpen: boolean) => void;\n /*\n * Set the placement of the Overlay component relative to the trigger element. Defaults to `top`.\n */\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /*\n * Use in controlled version to close Overlay.\n */\n onClose?: (event: SyntheticEvent) => void;\n}\n\nexport const Overlay = forwardRef<HTMLDivElement, OverlayProps>(\n function Overlay(props, ref) {\n const {\n children,\n open,\n onOpenChange,\n placement: placementProp = \"top\",\n id: idProp,\n onClose,\n ...rest\n } = props;\n\n const id = useId(idProp);\n const arrowRef = useRef<SVGSVGElement | null>(null);\n\n const [openState, setOpenState] = useControlled({\n controlled: open,\n default: false,\n name: \"Overlay\",\n state: \"open\",\n });\n\n const {\n x,\n y,\n strategy,\n context,\n elements,\n floating,\n reference,\n middlewareData: { arrow: { x: arrowX, y: arrowY } = {} },\n placement,\n } = useFloatingUI({\n open: openState,\n onOpenChange: setOpenState,\n placement: placementProp,\n middleware: [\n offset(11),\n flip(),\n shift({ limiter: limitShift() }),\n arrow({ element: arrowRef }),\n ],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useRole(context, { role: \"dialog\" }),\n useClick(context),\n useDismiss(context),\n ]);\n\n const floatingStyles = useMemo(() => {\n return {\n top: y ?? 0,\n left: x ?? 0,\n position: strategy,\n width: elements.floating?.offsetWidth,\n height: elements.floating?.offsetHeight,\n };\n }, [elements.floating, strategy, x, y]);\n\n const setOpen = (event: SyntheticEvent, newOpen: boolean) => {\n setOpenState(newOpen);\n onOpenChange?.(event, newOpen);\n };\n\n const arrowProps = {\n ref: arrowRef,\n context,\n style: {\n position: strategy,\n left: arrowX ?? 0,\n top: arrowY ?? 0,\n },\n };\n\n const handleCloseButton = (event: SyntheticEvent) => {\n setOpen(event, false);\n onClose?.(event);\n };\n\n return (\n <OverlayContext.Provider\n value={{\n id: id ?? \"\",\n openState,\n setOpen,\n floatingStyles,\n placement,\n context,\n arrowProps,\n floating,\n reference,\n handleCloseButton,\n getFloatingProps,\n getReferenceProps,\n }}\n >\n <div ref={ref} {...rest}>\n {children}\n </div>\n </OverlayContext.Provider>\n );\n }\n);\n"],"names":["Overlay"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { createContext } from '@salt-ds/core';
2
+ import { useContext } from 'react';
3
+
4
+ const OverlayContext = createContext(
5
+ "OverlayContext",
6
+ {
7
+ id: "",
8
+ openState: false,
9
+ setOpen() {
10
+ return void 0;
11
+ },
12
+ floatingStyles: {
13
+ top: 0,
14
+ left: 0,
15
+ position: ""
16
+ },
17
+ placement: "",
18
+ context: {},
19
+ arrowProps: {},
20
+ handleCloseButton() {
21
+ return void 0;
22
+ },
23
+ reference: {},
24
+ floating: {},
25
+ getFloatingProps() {
26
+ return {};
27
+ },
28
+ getReferenceProps() {
29
+ return {};
30
+ }
31
+ }
32
+ );
33
+ function useOverlayContext() {
34
+ return useContext(OverlayContext);
35
+ }
36
+
37
+ export { OverlayContext, useOverlayContext };
38
+ //# sourceMappingURL=OverlayContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverlayContext.js","sources":["../src/overlay/OverlayContext.ts"],"sourcesContent":["import {\n FloatingArrowProps,\n FloatingContext,\n Placement,\n ReferenceType,\n Strategy,\n} from \"@floating-ui/react\";\nimport { createContext, useFloatingUI } from \"@salt-ds/core\";\nimport { SyntheticEvent, useContext } from \"react\";\n\ntype FloatingReturn = ReturnType<typeof useFloatingUI>;\ntype FloatingStyleProps = {\n top: number;\n left: number;\n position: Strategy;\n width?: number;\n height?: number;\n};\n\nexport interface OverlayContextValue {\n id: string;\n openState: boolean;\n setOpen: (event: SyntheticEvent, newOpen: boolean) => void;\n floatingStyles: FloatingStyleProps;\n placement: Placement;\n arrowProps: FloatingArrowProps;\n context: FloatingContext;\n reference?: (node: ReferenceType | null) => void;\n floating?: (node: HTMLElement | null) => void;\n handleCloseButton: (event: SyntheticEvent) => void;\n getFloatingProps: (\n userProps?: React.HTMLProps<HTMLElement> | undefined\n ) => Record<string, unknown>;\n getReferenceProps: (\n userProps?: React.HTMLProps<Element> | undefined\n ) => Record<string, unknown>;\n}\n\nexport const OverlayContext = createContext<OverlayContextValue>(\n \"OverlayContext\",\n {\n id: \"\",\n openState: false,\n setOpen() {\n return undefined;\n },\n floatingStyles: {\n top: 0,\n left: 0,\n position: \"\" as Strategy,\n },\n placement: \"\" as Placement,\n context: {} as FloatingContext,\n arrowProps: {} as FloatingArrowProps,\n handleCloseButton() {\n return undefined;\n },\n reference: {} as FloatingReturn[\"reference\"],\n floating: {} as FloatingReturn[\"floating\"],\n getFloatingProps() {\n return {} as Record<string, unknown>;\n },\n getReferenceProps() {\n return {} as Record<string, unknown>;\n },\n }\n);\n\nexport function useOverlayContext() {\n return useContext(OverlayContext);\n}\n"],"names":[],"mappings":";;;AAsCO,MAAM,cAAiB,GAAA,aAAA;AAAA,EAC5B,gBAAA;AAAA,EACA;AAAA,IACE,EAAI,EAAA,EAAA;AAAA,IACJ,SAAW,EAAA,KAAA;AAAA,IACX,OAAU,GAAA;AACR,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,GAAK,EAAA,CAAA;AAAA,MACL,IAAM,EAAA,CAAA;AAAA,MACN,QAAU,EAAA,EAAA;AAAA,KACZ;AAAA,IACA,SAAW,EAAA,EAAA;AAAA,IACX,SAAS,EAAC;AAAA,IACV,YAAY,EAAC;AAAA,IACb,iBAAoB,GAAA;AAClB,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACT;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,UAAU,EAAC;AAAA,IACX,gBAAmB,GAAA;AACjB,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAAA,IACA,iBAAoB,GAAA;AAClB,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAAA,GACF;AACF,EAAA;AAEO,SAAS,iBAAoB,GAAA;AAClC,EAAA,OAAO,WAAW,cAAc,CAAA,CAAA;AAClC;;;;"}
@@ -0,0 +1,60 @@
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { forwardRef } from 'react';
3
+ import { makePrefixer, useFloatingComponent, useForkRef } from '@salt-ds/core';
4
+ import { clsx } from 'clsx';
5
+ import { useOverlayContext } from './OverlayContext.js';
6
+ import { FloatingOverlay } from '@floating-ui/react';
7
+ import { OverlayPanelBase } from './OverlayPanelBase.js';
8
+
9
+ const withBaseName = makePrefixer("saltOverlayPanel");
10
+ const OverlayPanel = forwardRef(
11
+ function OverlayPanel2(props, ref) {
12
+ const { className, ...rest } = props;
13
+ const { Component: FloatingComponent } = useFloatingComponent();
14
+ const {
15
+ id,
16
+ openState,
17
+ floatingStyles,
18
+ placement,
19
+ context,
20
+ getFloatingProps,
21
+ floating
22
+ } = useOverlayContext();
23
+ const handleRef = useForkRef(floating, ref);
24
+ const { top, left, width, height, position } = floatingStyles;
25
+ const getOverlayProps = () => {
26
+ return getFloatingProps({
27
+ "data-placement": placement,
28
+ ref: floating,
29
+ id: `${id}-panel`
30
+ });
31
+ };
32
+ if (!openState)
33
+ return /* @__PURE__ */ jsx(Fragment, {});
34
+ return /* @__PURE__ */ jsx(FloatingOverlay, {
35
+ children: /* @__PURE__ */ jsx(FloatingComponent, {
36
+ open: openState,
37
+ className: clsx(withBaseName(), className),
38
+ "aria-modal": "true",
39
+ "aria-labelledby": `${id}-header`,
40
+ "aria-describedby": `${id}-content`,
41
+ ...getOverlayProps(),
42
+ ref: handleRef,
43
+ width,
44
+ height,
45
+ top,
46
+ left,
47
+ position,
48
+ focusManagerProps: {
49
+ context
50
+ },
51
+ children: /* @__PURE__ */ jsx(OverlayPanelBase, {
52
+ ...rest
53
+ })
54
+ })
55
+ });
56
+ }
57
+ );
58
+
59
+ export { OverlayPanel };
60
+ //# sourceMappingURL=OverlayPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverlayPanel.js","sources":["../src/overlay/OverlayPanel.tsx"],"sourcesContent":["import {\n ComponentPropsWithoutRef,\n ForwardedRef,\n forwardRef,\n HTMLProps,\n} from \"react\";\nimport { makePrefixer, useFloatingComponent, useForkRef } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { useOverlayContext } from \"./OverlayContext\";\nimport { FloatingOverlay } from \"@floating-ui/react\";\nimport { OverlayPanelBase } from \"./OverlayPanelBase\";\n\nconst withBaseName = makePrefixer(\"saltOverlayPanel\");\n\nexport interface OverlayPanelProps extends ComponentPropsWithoutRef<\"div\"> {}\n\nexport const OverlayPanel = forwardRef<HTMLDivElement, OverlayPanelProps>(\n function OverlayPanel(props, ref: ForwardedRef<HTMLDivElement>) {\n const { className, ...rest } = props;\n\n const { Component: FloatingComponent } = useFloatingComponent();\n\n const {\n id,\n openState,\n floatingStyles,\n placement,\n context,\n getFloatingProps,\n floating,\n } = useOverlayContext();\n\n const handleRef = useForkRef<HTMLDivElement>(floating, ref);\n\n const { top, left, width, height, position } = floatingStyles;\n\n const getOverlayProps = (): HTMLProps<HTMLDivElement> => {\n return getFloatingProps({\n // @ts-ignore data-placement does not exist\n \"data-placement\": placement,\n ref: floating,\n id: `${id}-panel`,\n });\n };\n\n if (!openState) return <></>;\n\n return (\n <FloatingOverlay>\n <FloatingComponent\n open={openState}\n className={clsx(withBaseName(), className)}\n aria-modal=\"true\"\n aria-labelledby={`${id}-header`}\n aria-describedby={`${id}-content`}\n {...getOverlayProps()}\n ref={handleRef}\n width={width}\n height={height}\n top={top}\n left={left}\n position={position}\n focusManagerProps={{\n context: context,\n }}\n >\n <OverlayPanelBase {...rest} />\n </FloatingComponent>\n </FloatingOverlay>\n );\n }\n);\n"],"names":["OverlayPanel"],"mappings":";;;;;;;;AAYA,MAAM,YAAA,GAAe,aAAa,kBAAkB,CAAA,CAAA;AAI7C,MAAM,YAAe,GAAA,UAAA;AAAA,EAC1B,SAASA,aAAa,CAAA,KAAA,EAAO,GAAmC,EAAA;AAC9D,IAAM,MAAA,EAAE,SAAc,EAAA,GAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAE/B,IAAA,MAAM,EAAE,SAAA,EAAW,iBAAkB,EAAA,GAAI,oBAAqB,EAAA,CAAA;AAE9D,IAAM,MAAA;AAAA,MACJ,EAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,QAAA;AAAA,QACE,iBAAkB,EAAA,CAAA;AAEtB,IAAM,MAAA,SAAA,GAAY,UAA2B,CAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AAE1D,IAAA,MAAM,EAAE,GAAK,EAAA,IAAA,EAAM,KAAO,EAAA,MAAA,EAAQ,UAAa,GAAA,cAAA,CAAA;AAE/C,IAAA,MAAM,kBAAkB,MAAiC;AACvD,MAAA,OAAO,gBAAiB,CAAA;AAAA,QAEtB,gBAAkB,EAAA,SAAA;AAAA,QAClB,GAAK,EAAA,QAAA;AAAA,QACL,IAAI,CAAG,EAAA,EAAA,CAAA,MAAA,CAAA;AAAA,OACR,CAAA,CAAA;AAAA,KACH,CAAA;AAEA,IAAA,IAAI,CAAC,SAAA;AAAW,MAAA,uBAAS,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA,CAAA;AAEzB,IAAA,uBACG,GAAA,CAAA,eAAA,EAAA;AAAA,MACC,QAAC,kBAAA,GAAA,CAAA,iBAAA,EAAA;AAAA,QACC,IAAM,EAAA,SAAA;AAAA,QACN,SAAW,EAAA,IAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,YAAW,EAAA,MAAA;AAAA,QACX,mBAAiB,CAAG,EAAA,EAAA,CAAA,OAAA,CAAA;AAAA,QACpB,oBAAkB,CAAG,EAAA,EAAA,CAAA,QAAA,CAAA;AAAA,QACpB,GAAG,eAAgB,EAAA;AAAA,QACpB,GAAK,EAAA,SAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,iBAAmB,EAAA;AAAA,UACjB,OAAA;AAAA,SACF;AAAA,QAEA,QAAC,kBAAA,GAAA,CAAA,gBAAA,EAAA;AAAA,UAAkB,GAAG,IAAA;AAAA,SAAM,CAAA;AAAA,OAC9B,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -0,0 +1,57 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { FloatingArrow } from '@floating-ui/react';
3
+ import css_248z from './Overlay.css.js';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import { useComponentCssInjection } from '@salt-ds/styles';
6
+ import { makePrefixer, Button } from '@salt-ds/core';
7
+ import { CloseIcon } from '@salt-ds/icons';
8
+ import { useOverlayContext } from './OverlayContext.js';
9
+ import clsx from 'clsx';
10
+
11
+ const withBaseName = makePrefixer("saltOverlayPanelBase");
12
+ const OverlayPanelBase = (props) => {
13
+ const targetWindow = useWindow();
14
+ useComponentCssInjection({
15
+ testId: "salt-overlay",
16
+ css: css_248z,
17
+ window: targetWindow
18
+ });
19
+ const { arrowProps, handleCloseButton } = useOverlayContext();
20
+ const { children, className, ...rest } = props;
21
+ return /* @__PURE__ */ jsxs(Fragment, {
22
+ children: [
23
+ /* @__PURE__ */ jsxs("div", {
24
+ className: clsx(withBaseName("container"), className),
25
+ ...rest,
26
+ children: [
27
+ /* @__PURE__ */ jsx(Button, {
28
+ onClick: handleCloseButton,
29
+ variant: "secondary",
30
+ className: withBaseName("closeButton"),
31
+ "aria-label": "Close Overlay",
32
+ children: /* @__PURE__ */ jsx(CloseIcon, {
33
+ "aria-hidden": true
34
+ })
35
+ }),
36
+ /* @__PURE__ */ jsx("div", {
37
+ className: withBaseName("content"),
38
+ children
39
+ })
40
+ ]
41
+ }),
42
+ /* @__PURE__ */ jsx(FloatingArrow, {
43
+ ...arrowProps,
44
+ strokeWidth: 1,
45
+ fill: "var(--overlay-background)",
46
+ stroke: "var(--overlay-borderColor)",
47
+ style: {
48
+ height: "calc(var(--salt-size-adornment) + 6px)",
49
+ width: "calc(var(--salt-size-adornment) + 8px)"
50
+ }
51
+ })
52
+ ]
53
+ });
54
+ };
55
+
56
+ export { OverlayPanelBase };
57
+ //# sourceMappingURL=OverlayPanelBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverlayPanelBase.js","sources":["../src/overlay/OverlayPanelBase.tsx"],"sourcesContent":["import { FloatingArrow } from \"@floating-ui/react\";\n\nimport overlayCss from \"./Overlay.css\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { Button, makePrefixer } from \"@salt-ds/core\";\nimport { CloseIcon } from \"@salt-ds/icons\";\nimport { ComponentPropsWithoutRef } from \"react\";\nimport { useOverlayContext } from \"./OverlayContext\";\nimport clsx from \"clsx\";\n\nconst withBaseName = makePrefixer(\"saltOverlayPanelBase\");\n\n// OverlayPanelBase component needed for CSS style injection\nexport const OverlayPanelBase = (props: ComponentPropsWithoutRef<\"div\">) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-overlay\",\n css: overlayCss,\n window: targetWindow,\n });\n\n const { arrowProps, handleCloseButton } = useOverlayContext();\n const { children, className, ...rest } = props;\n\n return (\n <>\n <div className={clsx(withBaseName(\"container\"), className)} {...rest}>\n <Button\n onClick={handleCloseButton}\n variant=\"secondary\"\n className={withBaseName(\"closeButton\")}\n aria-label=\"Close Overlay\"\n >\n <CloseIcon aria-hidden />\n </Button>\n <div className={withBaseName(\"content\")}>{children}</div>\n </div>\n\n <FloatingArrow\n {...arrowProps}\n strokeWidth={1}\n fill=\"var(--overlay-background)\"\n stroke=\"var(--overlay-borderColor)\"\n style={{\n height: \"calc(var(--salt-size-adornment) + 6px)\", // FIXME: +6px to account for Floating UI's FloatingArrow positioning calculation\n width: \"calc(var(--salt-size-adornment) + 8px)\", // FIXME: +8px to account for Floating UI's FloatingArrow positioning calculation\n }}\n />\n </>\n );\n};\n"],"names":["overlayCss"],"mappings":";;;;;;;;;;AAWA,MAAM,YAAA,GAAe,aAAa,sBAAsB,CAAA,CAAA;AAG3C,MAAA,gBAAA,GAAmB,CAAC,KAA2C,KAAA;AAC1E,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,cAAA;AAAA,IACR,GAAK,EAAAA,QAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAkB,EAAA,GAAI,iBAAkB,EAAA,CAAA;AAC5D,EAAA,MAAM,EAAE,QAAA,EAAU,SAAc,EAAA,GAAA,IAAA,EAAS,GAAA,KAAA,CAAA;AAEzC,EACE,uBAAA,IAAA,CAAA,QAAA,EAAA;AAAA,IACE,QAAA,EAAA;AAAA,sBAAC,IAAA,CAAA,KAAA,EAAA;AAAA,QAAI,SAAW,EAAA,IAAA,CAAK,YAAa,CAAA,WAAW,GAAG,SAAS,CAAA;AAAA,QAAI,GAAG,IAAA;AAAA,QAC9D,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,MAAA,EAAA;AAAA,YACC,OAAS,EAAA,iBAAA;AAAA,YACT,OAAQ,EAAA,WAAA;AAAA,YACR,SAAA,EAAW,aAAa,aAAa,CAAA;AAAA,YACrC,YAAW,EAAA,eAAA;AAAA,YAEX,QAAC,kBAAA,GAAA,CAAA,SAAA,EAAA;AAAA,cAAU,aAAW,EAAA,IAAA;AAAA,aAAC,CAAA;AAAA,WACzB,CAAA;AAAA,0BACC,GAAA,CAAA,KAAA,EAAA;AAAA,YAAI,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,YAAI,QAAA;AAAA,WAAS,CAAA;AAAA,SAAA;AAAA,OACrD,CAAA;AAAA,sBAEC,GAAA,CAAA,aAAA,EAAA;AAAA,QACE,GAAG,UAAA;AAAA,QACJ,WAAa,EAAA,CAAA;AAAA,QACb,IAAK,EAAA,2BAAA;AAAA,QACL,MAAO,EAAA,4BAAA;AAAA,QACP,KAAO,EAAA;AAAA,UACL,MAAQ,EAAA,wCAAA;AAAA,UACR,KAAO,EAAA,wCAAA;AAAA,SACT;AAAA,OACF,CAAA;AAAA,KAAA;AAAA,GACF,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,36 @@
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { isValidElement, cloneElement } from 'react';
3
+ import { useForkRef, mergeProps } from '@salt-ds/core';
4
+ import { useOverlayContext } from './OverlayContext.js';
5
+
6
+ function OverlayTrigger(props) {
7
+ const { children } = props;
8
+ const { setOpen, reference, getReferenceProps, id } = useOverlayContext();
9
+ const triggerRef = useForkRef(
10
+ isValidElement(children) ? children.ref : null,
11
+ reference
12
+ );
13
+ if (!children || !isValidElement(children)) {
14
+ return /* @__PURE__ */ jsx(Fragment, {
15
+ children
16
+ });
17
+ }
18
+ const handleClick = (event) => {
19
+ setOpen(event, true);
20
+ };
21
+ const getTriggerProps = () => getReferenceProps({
22
+ ref: reference,
23
+ onClick: handleClick,
24
+ id: `${id}-trigger`,
25
+ "aria-controls": `${id}-panel`
26
+ });
27
+ return /* @__PURE__ */ jsx(Fragment, {
28
+ children: cloneElement(children, {
29
+ ...mergeProps(getTriggerProps(), children.props),
30
+ ref: triggerRef
31
+ })
32
+ });
33
+ }
34
+
35
+ export { OverlayTrigger };
36
+ //# sourceMappingURL=OverlayTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OverlayTrigger.js","sources":["../src/overlay/OverlayTrigger.tsx"],"sourcesContent":["import { cloneElement, isValidElement, ReactNode, MouseEvent } from \"react\";\nimport { mergeProps, useForkRef } from \"@salt-ds/core\";\nimport { useOverlayContext } from \"./OverlayContext\";\n\nexport interface OverlayTriggerProps {\n children?: ReactNode;\n}\n\nexport function OverlayTrigger(props: OverlayTriggerProps) {\n const { children } = props;\n\n const { setOpen, reference, getReferenceProps, id } = useOverlayContext();\n\n const triggerRef = useForkRef(\n // @ts-ignore error TS2339 missing property ref\n isValidElement(children) ? children.ref : null,\n reference\n );\n\n if (!children || !isValidElement(children)) {\n return <>{children}</>;\n }\n const handleClick = (event: MouseEvent) => {\n setOpen(event, true);\n };\n\n const getTriggerProps = () =>\n getReferenceProps({\n ref: reference,\n onClick: handleClick,\n id: `${id}-trigger`,\n \"aria-controls\": `${id}-panel`,\n });\n\n return (\n <>\n {cloneElement(children, {\n ...mergeProps(getTriggerProps(), children.props),\n ref: triggerRef,\n })}\n </>\n );\n}\n"],"names":[],"mappings":";;;;;AAQO,SAAS,eAAe,KAA4B,EAAA;AACzD,EAAM,MAAA,EAAE,UAAa,GAAA,KAAA,CAAA;AAErB,EAAA,MAAM,EAAE,OAAS,EAAA,SAAA,EAAW,iBAAmB,EAAA,EAAA,KAAO,iBAAkB,EAAA,CAAA;AAExE,EAAA,MAAM,UAAa,GAAA,UAAA;AAAA,IAEjB,cAAe,CAAA,QAAQ,CAAI,GAAA,QAAA,CAAS,GAAM,GAAA,IAAA;AAAA,IAC1C,SAAA;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,cAAA,CAAe,QAAQ,CAAG,EAAA;AAC1C,IAAO,uBAAA,GAAA,CAAA,QAAA,EAAA;AAAA,MAAG,QAAA;AAAA,KAAS,CAAA,CAAA;AAAA,GACrB;AACA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAsB,KAAA;AACzC,IAAA,OAAA,CAAQ,OAAO,IAAI,CAAA,CAAA;AAAA,GACrB,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,MACtB,iBAAkB,CAAA;AAAA,IAChB,GAAK,EAAA,SAAA;AAAA,IACL,OAAS,EAAA,WAAA;AAAA,IACT,IAAI,CAAG,EAAA,EAAA,CAAA,QAAA,CAAA;AAAA,IACP,iBAAiB,CAAG,EAAA,EAAA,CAAA,MAAA,CAAA;AAAA,GACrB,CAAA,CAAA;AAEH,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA;AAAA,IACG,uBAAa,QAAU,EAAA;AAAA,MACtB,GAAG,UAAA,CAAW,eAAgB,EAAA,EAAG,SAAS,KAAK,CAAA;AAAA,MAC/C,GAAK,EAAA,UAAA;AAAA,KACN,CAAA;AAAA,GACH,CAAA,CAAA;AAEJ;;;;"}
@@ -20,7 +20,6 @@ export * from "./drawer";
20
20
  export * from "./dropdown";
21
21
  export * from "./dropdown-next";
22
22
  export * from "./editable-label";
23
- export * from "./file-drop-zone";
24
23
  export { FormFieldLegacy as FormField, type FormFieldLegacyProps as FormFieldProps, FormLabel, } from "./form-field-legacy";
25
24
  export * from "./form-field-context-legacy";
26
25
  export * from "./form-group";
@@ -1,16 +1,8 @@
1
- import { UseFloatingUIProps } from "@salt-ds/core";
2
- import { ComponentProps, ComponentPropsWithoutRef } from "react";
3
- interface ADAExceptions {
4
- showClose?: boolean;
5
- }
6
- export interface OverlayProps extends ComponentPropsWithoutRef<"div">, Partial<Pick<UseFloatingUIProps, "onOpenChange" | "open">> {
7
- /**
8
- * object that houses ada related props.
9
- * adaExceptions.showClose defaults to true. It can be removed at the risk of ADA compliance
10
- */
11
- adaExceptions?: ADAExceptions;
12
- arrowProps?: ComponentProps<"div">;
13
- variant?: "primary" | "secondary";
1
+ import { ComponentPropsWithoutRef, SyntheticEvent } from "react";
2
+ export interface OverlayProps extends ComponentPropsWithoutRef<"div"> {
3
+ open?: boolean;
4
+ onOpenChange?: (event: SyntheticEvent, newOpen: boolean) => void;
5
+ placement?: "top" | "bottom" | "left" | "right";
6
+ onClose?: (event: SyntheticEvent) => void;
14
7
  }
15
8
  export declare const Overlay: import("react").ForwardRefExoticComponent<OverlayProps & import("react").RefAttributes<HTMLDivElement>>;
16
- export {};
@@ -0,0 +1,26 @@
1
+ import { FloatingArrowProps, FloatingContext, Placement, ReferenceType, Strategy } from "@floating-ui/react";
2
+ import { SyntheticEvent } from "react";
3
+ declare type FloatingStyleProps = {
4
+ top: number;
5
+ left: number;
6
+ position: Strategy;
7
+ width?: number;
8
+ height?: number;
9
+ };
10
+ export interface OverlayContextValue {
11
+ id: string;
12
+ openState: boolean;
13
+ setOpen: (event: SyntheticEvent, newOpen: boolean) => void;
14
+ floatingStyles: FloatingStyleProps;
15
+ placement: Placement;
16
+ arrowProps: FloatingArrowProps;
17
+ context: FloatingContext;
18
+ reference?: (node: ReferenceType | null) => void;
19
+ floating?: (node: HTMLElement | null) => void;
20
+ handleCloseButton: (event: SyntheticEvent) => void;
21
+ getFloatingProps: (userProps?: React.HTMLProps<HTMLElement> | undefined) => Record<string, unknown>;
22
+ getReferenceProps: (userProps?: React.HTMLProps<Element> | undefined) => Record<string, unknown>;
23
+ }
24
+ export declare const OverlayContext: import("react").Context<OverlayContextValue>;
25
+ export declare function useOverlayContext(): OverlayContextValue;
26
+ export {};
@@ -0,0 +1,4 @@
1
+ import { ComponentPropsWithoutRef } from "react";
2
+ export interface OverlayPanelProps extends ComponentPropsWithoutRef<"div"> {
3
+ }
4
+ export declare const OverlayPanel: import("react").ForwardRefExoticComponent<OverlayPanelProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,2 @@
1
+ import { ComponentPropsWithoutRef } from "react";
2
+ export declare const OverlayPanelBase: (props: ComponentPropsWithoutRef<"div">) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from "react";
2
+ export interface OverlayTriggerProps {
3
+ children?: ReactNode;
4
+ }
5
+ export declare function OverlayTrigger(props: OverlayTriggerProps): JSX.Element;
@@ -1,2 +1,3 @@
1
1
  export * from "./Overlay";
2
- export * from "./useOverlay";
2
+ export * from "./OverlayTrigger";
3
+ export * from "./OverlayPanel";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salt-ds/lab",
3
- "version": "1.0.0-alpha.28",
3
+ "version": "1.0.0-alpha.29",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "react-window": "^1.8.6",
27
27
  "rifm": "^0.12.0",
28
28
  "tinycolor2": "^1.4.2",
29
- "@salt-ds/core": "^1.15.0",
29
+ "@salt-ds/core": "^1.16.0",
30
30
  "@salt-ds/window": "^0.1.1",
31
31
  "@salt-ds/styles": "^0.2.1",
32
32
  "@salt-ds/icons": "^1.9.1"
@@ -1,6 +0,0 @@
1
- 'use strict';
2
-
3
- var css_248z = ".saltFileDropZone {\n color: var(--saltFileDropZone-text-color, var(--salt-text-primary-foreground));\n display: inline-flex;\n background: var(--saltFileDropZone-background, var(--salt-container-primary-background));\n text-align: center;\n align-items: center;\n justify-content: center;\n border: var(--saltFileDropZone-border, var(--salt-size-border-strong) var(--salt-target-borderStyle) var(--salt-container-primary-borderColor));\n flex-direction: column;\n padding: var(--salt-spacing-200);\n gap: var(--salt-spacing-200);\n width: 100%;\n font-size: var(--saltFileDropZone-fontSize, var(--salt-text-fontSize));\n font-family: var(--saltFileDropZone-fontFamily, var(--salt-text-fontFamily));\n line-height: var(--saltFileDropZone-lineHeight, var(--salt-text-lineHeight));\n}\n\n.saltFileDropZone-active {\n background: var(--salt-target-background-hover);\n border: var(--salt-size-border-strong) var(--salt-target-borderStyle-hover) var(--salt-target-borderColor-hover);\n}\n\n/* Styles applied if `status=\"error\" */\n.saltFileDropZone-error {\n border: var(--salt-size-border-strong) var(--salt-target-borderStyle) var(--salt-status-error-borderColor);\n}\n\n/* Styles applied if `status=\"success\" */\n.saltFileDropZone-success {\n border: var(--salt-size-border-strong) var(--salt-target-borderStyle) var(--salt-status-success-borderColor);\n}\n\n.saltFileDropZone .input-hidden {\n display: none;\n}\n\n/* Styles applied if `disabled={true}` */\n.saltFileDropZone-disabled {\n background: var(--salt-container-primary-background-disabled);\n border: var(--salt-size-border-strong) var(--salt-target-borderStyle) var(--salt-container-primary-borderColor-disabled);\n cursor: var(--salt-target-cursor-disabled);\n color: var(--salt-content-primary-foreground-disabled);\n}\n";
4
-
5
- module.exports = css_248z;
6
- //# sourceMappingURL=FileDropZone.css.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileDropZone.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,94 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var jsxRuntime = require('react/jsx-runtime');
6
- var core = require('@salt-ds/core');
7
- var clsx = require('clsx');
8
- var React = require('react');
9
- var utils = require('./internal/utils.js');
10
- var window = require('@salt-ds/window');
11
- var styles = require('@salt-ds/styles');
12
- var FileDropZone$1 = require('./FileDropZone.css.js');
13
-
14
- const withBaseName = core.makePrefixer("saltFileDropZone");
15
- const FileDropZone = React.forwardRef(
16
- function FileDropZone2({
17
- status,
18
- className,
19
- children,
20
- disabled,
21
- onDragOver,
22
- onDragLeave,
23
- onDrop,
24
- ...restProps
25
- }, ref) {
26
- const targetWindow = window.useWindow();
27
- styles.useComponentCssInjection({
28
- testId: "salt-file-drop-zone",
29
- css: FileDropZone$1,
30
- window: targetWindow
31
- });
32
- const [isActive, setActive] = React.useState(false);
33
- const regionRef = React.useRef(null);
34
- const handleRef = core.useForkRef(ref, regionRef);
35
- const handleDragOver = (event) => {
36
- event.preventDefault();
37
- event.stopPropagation();
38
- if (disabled) {
39
- if (event.dataTransfer) {
40
- event.dataTransfer.dropEffect = "none";
41
- }
42
- return;
43
- }
44
- if (event.dataTransfer) {
45
- event.dataTransfer.dropEffect = "copy";
46
- }
47
- if (!isActive && utils.containsFiles(event)) {
48
- setActive(true);
49
- }
50
- onDragOver == null ? void 0 : onDragOver(event);
51
- };
52
- const handleDragLeave = (event) => {
53
- if (disabled) {
54
- return;
55
- }
56
- const region = regionRef == null ? void 0 : regionRef.current;
57
- const eventTarget = event.relatedTarget;
58
- if (eventTarget !== region && !(region == null ? void 0 : region.contains(eventTarget))) {
59
- setActive(false);
60
- }
61
- onDragLeave == null ? void 0 : onDragLeave(event);
62
- };
63
- const handleDrop = (event) => {
64
- if (disabled) {
65
- return;
66
- }
67
- event.preventDefault();
68
- const files = utils.extractFiles(event);
69
- setActive(false);
70
- onDrop == null ? void 0 : onDrop(event, files);
71
- };
72
- return /* @__PURE__ */ jsxRuntime.jsx("div", {
73
- className: clsx.clsx(
74
- withBaseName(),
75
- {
76
- [withBaseName(status)]: status,
77
- [withBaseName("active")]: isActive,
78
- [withBaseName("disabled")]: disabled
79
- },
80
- className
81
- ),
82
- "aria-disabled": disabled,
83
- onDragLeave: handleDragLeave,
84
- onDragOver: handleDragOver,
85
- onDrop: handleDrop,
86
- ref: handleRef,
87
- ...restProps,
88
- children
89
- });
90
- }
91
- );
92
-
93
- exports.FileDropZone = FileDropZone;
94
- //# sourceMappingURL=FileDropZone.js.map