@vuu-ui/vuu-utils 2.1.0-alpha.1 → 2.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/node_modules/@dnd-kit/react/hooks.js +3 -3
- package/cjs/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +492 -0
- package/cjs/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
- package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.js +987 -0
- package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.js.map +1 -0
- package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js +130 -0
- package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js.map +1 -0
- package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +183 -0
- package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
- package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +39 -0
- package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js +10 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js +76 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js +52 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js +59 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js +12 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.css.js +6 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.css.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.js +96 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/button/useButton.js +65 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/button/useButton.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js +11 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js +6 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js +160 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js +115 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js +6 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js +86 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js +93 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js +20 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/createContext.js +14 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/createContext.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/debounce.js +22 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/debounce.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js +6 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js +52 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/useId.js +45 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/useId.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js +8 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js +233 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js.map +1 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js +35 -0
- package/cjs/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js.map +1 -0
- package/cjs/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js +22 -0
- package/cjs/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js.map +1 -0
- package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js +16 -0
- package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js.map +1 -0
- package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js +75 -0
- package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js.map +1 -0
- package/cjs/node_modules/@salt-ds/window/dist-es/WindowProvider.js +17 -0
- package/cjs/node_modules/@salt-ds/window/dist-es/WindowProvider.js.map +1 -0
- package/cjs/node_modules/tabbable/dist/index.esm.js +550 -0
- package/cjs/node_modules/tabbable/dist/index.esm.js.map +1 -0
- package/cjs/packages/vuu-utils/src/ThemeProvider.js +2 -2
- package/cjs/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js +23 -0
- package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -0
- package/cjs/packages/vuu-utils/src/index.js +2 -0
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/esm/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +489 -0
- package/esm/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
- package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.js +962 -0
- package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.js.map +1 -0
- package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js +114 -0
- package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js.map +1 -0
- package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +162 -0
- package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
- package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +33 -0
- package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js +8 -0
- package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js +73 -0
- package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js +50 -0
- package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js +56 -0
- package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js +10 -0
- package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/button/Button.css.js +4 -0
- package/esm/node_modules/@salt-ds/core/dist-es/button/Button.css.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/button/Button.js +94 -0
- package/esm/node_modules/@salt-ds/core/dist-es/button/Button.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/button/useButton.js +63 -0
- package/esm/node_modules/@salt-ds/core/dist-es/button/useButton.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js +9 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js +4 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js +151 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js +113 -0
- package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js +4 -0
- package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js +84 -0
- package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js +91 -0
- package/esm/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js +18 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/createContext.js +12 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/createContext.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/debounce.js +20 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/debounce.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js +4 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js +50 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/useId.js +24 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/useId.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js +6 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js +231 -0
- package/esm/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js.map +1 -0
- package/esm/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js +32 -0
- package/esm/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js.map +1 -0
- package/esm/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js +19 -0
- package/esm/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js.map +1 -0
- package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js +14 -0
- package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js.map +1 -0
- package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js +54 -0
- package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js.map +1 -0
- package/esm/node_modules/@salt-ds/window/dist-es/WindowProvider.js +15 -0
- package/esm/node_modules/@salt-ds/window/dist-es/WindowProvider.js.map +1 -0
- package/esm/node_modules/tabbable/dist/index.esm.js +546 -0
- package/esm/node_modules/tabbable/dist/index.esm.js.map +1 -0
- package/esm/packages/vuu-utils/src/ThemeProvider.js +2 -2
- package/esm/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
- package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +2 -2
- package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/EditButtons.js +21 -0
- package/esm/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -0
- package/esm/packages/vuu-utils/src/feature-utils.js +2 -2
- package/esm/packages/vuu-utils/src/feature-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +1 -0
- package/esm/packages/vuu-utils/src/index.js.map +1 -1
- package/package.json +6 -6
- package/types/index.d.ts +1 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var
|
|
5
|
+
var clsx = require('clsx');
|
|
6
6
|
|
|
7
7
|
const DEFAULT_DENSITY = "medium";
|
|
8
8
|
const DEFAULT_THEME = "salt-theme";
|
|
@@ -37,7 +37,7 @@ const useThemeAttributes = (themeAttributes) => {
|
|
|
37
37
|
const createThemedChildren = (children, theme, themeMode, density) => {
|
|
38
38
|
if (React.isValidElement(children)) {
|
|
39
39
|
return React.cloneElement(children, {
|
|
40
|
-
className:
|
|
40
|
+
className: clsx(
|
|
41
41
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
42
42
|
children.props?.className,
|
|
43
43
|
`${theme}-theme`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeProvider.js","sources":["../../../../../../packages/vuu-utils/src/ThemeProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"clsx\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"salt-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `salt-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],"names":["createContext","useContext","isValidElement","cloneElement","jsx"],"mappings":";;;;;;AAUO,MAAM,eAA2B,GAAA;AACjC,MAAM,aAAgB,GAAA;AACtB,MAAM,kBAAgC,GAAA;AAYtC,MAAM,eAAeA,mBAAiC,CAAA;AAAA,EAC3D,OAAS,EAAA,MAAA;AAAA,EACT,KAAO,EAAA,KAAA;AAAA,EACP,SAAW,EAAA;AACb,CAAC;AAID,MAAM,wBAAyC,GAAA;AAAA,EAC7C,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAQa,MAAA,kBAAA,GAAqB,CAChC,eACgC,KAAA;AAChC,EAAM,MAAA,OAAA,GAAUC,iBAAW,YAAY,CAAA;AACvC,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,eAAgB,CAAA,UAAA;AAAA,MAChB,eAAgB,CAAA,YAAA;AAAA,MAChB,eAAgB,CAAA;AAAA,KAClB;AAAA,aACS,OAAS,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,CAAA,EAAG,QAAQ,KAAK,CAAA,MAAA,CAAA;AAAA,MAChB,CAAA,aAAA,EAAgB,QAAQ,OAAO,CAAA,CAAA;AAAA,MAC/B,OAAQ,CAAA;AAAA,KACV;AAAA;AAEF,EAAO,OAAA,wBAAA;AACT;AAEA,MAAM,oBAAuB,GAAA,CAC3B,QACA,EAAA,KAAA,EACA,WACA,OACG,KAAA;AACH,EAAI,IAAAC,oBAAA,CAA4C,QAAQ,CAAG,EAAA;AACzD,IAAA,OAAOC,mBAAa,QAAU,EAAA;AAAA,MAC5B,SAAW,
|
|
1
|
+
{"version":3,"file":"ThemeProvider.js","sources":["../../../../../../packages/vuu-utils/src/ThemeProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"clsx\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"salt-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `salt-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],"names":["createContext","useContext","isValidElement","cloneElement","cx","jsx"],"mappings":";;;;;;AAUO,MAAM,eAA2B,GAAA;AACjC,MAAM,aAAgB,GAAA;AACtB,MAAM,kBAAgC,GAAA;AAYtC,MAAM,eAAeA,mBAAiC,CAAA;AAAA,EAC3D,OAAS,EAAA,MAAA;AAAA,EACT,KAAO,EAAA,KAAA;AAAA,EACP,SAAW,EAAA;AACb,CAAC;AAID,MAAM,wBAAyC,GAAA;AAAA,EAC7C,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAQa,MAAA,kBAAA,GAAqB,CAChC,eACgC,KAAA;AAChC,EAAM,MAAA,OAAA,GAAUC,iBAAW,YAAY,CAAA;AACvC,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,eAAgB,CAAA,UAAA;AAAA,MAChB,eAAgB,CAAA,YAAA;AAAA,MAChB,eAAgB,CAAA;AAAA,KAClB;AAAA,aACS,OAAS,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,CAAA,EAAG,QAAQ,KAAK,CAAA,MAAA,CAAA;AAAA,MAChB,CAAA,aAAA,EAAgB,QAAQ,OAAO,CAAA,CAAA;AAAA,MAC/B,OAAQ,CAAA;AAAA,KACV;AAAA;AAEF,EAAO,OAAA,wBAAA;AACT;AAEA,MAAM,oBAAuB,GAAA,CAC3B,QACA,EAAA,KAAA,EACA,WACA,OACG,KAAA;AACH,EAAI,IAAAC,oBAAA,CAA4C,QAAQ,CAAG,EAAA;AACzD,IAAA,OAAOC,mBAAa,QAAU,EAAA;AAAA,MAC5B,SAAW,EAAAC,IAAA;AAAA;AAAA,QAET,SAAS,KAAO,EAAA,SAAA;AAAA,QAChB,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,QACR,gBAAgB,OAAO,CAAA;AAAA,OACzB;AAAA;AAAA;AAAA,MAGA,WAAa,EAAA;AAAA,KACd,CAAA;AAAA,GACI,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA;AAAA,iDAAA;AAAA,KAEF;AACA,IAAO,OAAA,QAAA;AAAA;AAEX,CAAA;AAUO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,iBAAoB,GAAA,KAAA;AAAA,EACpB,QAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,SAAW,EAAA,aAAA;AAAA,EACX,OAAS,EAAA;AACX,CAA0B,KAAA;AACxB,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,gBAAA;AAAA,IACT,SAAW,EAAA,kBAAA;AAAA,IACX,KAAO,EAAA;AAAA,GACT,GAAIH,iBAAW,YAAY,CAAA;AAC3B,EAAM,MAAA,OAAA,GAAU,eAAe,gBAAoB,IAAA,eAAA;AACnD,EAAM,MAAA,SAAA,GAAY,iBAAiB,kBAAsB,IAAA,kBAAA;AACzD,EAAM,MAAA,KAAA,GAAQ,aAAa,cAAkB,IAAA,aAAA;AAC7C,EAAA,MAAM,iBAAiB,iBACnB,GAAA,oBAAA,CAAqB,UAAU,KAAO,EAAA,SAAA,EAAW,OAAO,CACxD,GAAA,QAAA;AAEJ,EACE,uBAAAI,cAAA,CAAC,YAAa,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,EAAE,SAAW,EAAA,OAAA,EAAS,KAAM,EAAA,EACvD,QACH,EAAA,cAAA,EAAA,CAAA;AAEJ;AAEA,aAAA,CAAc,WAAc,GAAA,eAAA;;;;;;;;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var Button = require('../../../../node_modules/@salt-ds/core/dist-es/button/Button.js');
|
|
6
|
+
|
|
7
|
+
const EditButtons = ({
|
|
8
|
+
editTracker,
|
|
9
|
+
onCancel,
|
|
10
|
+
onSave
|
|
11
|
+
}) => {
|
|
12
|
+
const [editState, setEditState] = React.useState("clean");
|
|
13
|
+
React.useMemo(() => {
|
|
14
|
+
editTracker?.on("editState", setEditState);
|
|
15
|
+
}, [editTracker]);
|
|
16
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button.Button, { disabled: editState === "clean", onClick: onSave, children: "Save" }),
|
|
18
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button.Button, { onClick: onCancel, children: "Cancel" })
|
|
19
|
+
] });
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
exports.EditButtons = EditButtons;
|
|
23
|
+
//# sourceMappingURL=EditButtons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditButtons.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditButtons.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { EditState, EditTracker } from \"./EditTracker\";\nimport { useMemo, useState } from \"react\";\n\nexport interface EditButtonProps {\n editTracker?: EditTracker;\n onCancel: () => void;\n onSave: () => void;\n}\n\nexport const EditButtons = ({\n editTracker,\n onCancel,\n onSave,\n}: EditButtonProps) => {\n const [editState, setEditState] = useState<EditState>(\"clean\");\n\n useMemo(() => {\n editTracker?.on(\"editState\", setEditState);\n }, [editTracker]);\n\n return (\n <>\n <Button disabled={editState === \"clean\"} onClick={onSave}>\n Save\n </Button>\n <Button onClick={onCancel}>Cancel</Button>\n </>\n );\n};\n"],"names":["useState","useMemo","jsxs","Fragment","jsx","Button"],"mappings":";;;;;;AAUO,MAAM,cAAc,CAAC;AAAA,EAC1B,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAoB,OAAO,CAAA;AAE7D,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAa,WAAA,EAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AAAA,GAC3C,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBAEIC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,iBAAO,QAAU,EAAA,SAAA,KAAc,OAAS,EAAA,OAAA,EAAS,QAAQ,QAE1D,EAAA,MAAA,EAAA,CAAA;AAAA,oBACCD,cAAA,CAAAC,aAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAU,QAAM,EAAA,QAAA,EAAA;AAAA,GACnC,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -12,6 +12,7 @@ var commonTypes = require('./common-types.js');
|
|
|
12
12
|
var componentRegistry = require('./component-registry.js');
|
|
13
13
|
var cookieUtils = require('./cookie-utils.js');
|
|
14
14
|
var cssUtils = require('./css-utils.js');
|
|
15
|
+
var EditButtons = require('./data-editing/EditButtons.js');
|
|
15
16
|
var DataEditingProvider = require('./data-editing/DataEditingProvider.js');
|
|
16
17
|
var EditTracker = require('./data-editing/EditTracker.js');
|
|
17
18
|
var useEditableTable = require('./data-editing/useEditableTable.js');
|
|
@@ -201,6 +202,7 @@ exports.registerConfigurationEditor = componentRegistry.registerConfigurationEdi
|
|
|
201
202
|
exports.getCookieValue = cookieUtils.getCookieValue;
|
|
202
203
|
exports.setCookieValue = cookieUtils.setCookieValue;
|
|
203
204
|
exports.importCSS = cssUtils.importCSS;
|
|
205
|
+
exports.EditButtons = EditButtons.EditButtons;
|
|
204
206
|
exports.DataEditingProvider = DataEditingProvider.DataEditingProvider;
|
|
205
207
|
exports.useEditTracker = DataEditingProvider.useEditTracker;
|
|
206
208
|
exports.EditTracker = EditTracker.EditTracker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { createCoords, round, max, min, rectToClientRect } from '../../utils/dist/floating-ui.utils.js';
|
|
2
|
+
import { getDocumentElement, isElement, isHTMLElement, isTopLayer, getNodeName, isOverflowElement, getNodeScroll, getWindow, getParentNode, isLastTraversableNode, isTableElement, isContainingBlock, getContainingBlock, getComputedStyle, getFrameElement, getOverflowAncestors, isWebKit } from '../../utils/dist/floating-ui.utils.dom.js';
|
|
3
|
+
|
|
4
|
+
function getCssDimensions(element) {
|
|
5
|
+
const css = getComputedStyle(element);
|
|
6
|
+
// In testing environments, the `width` and `height` properties are empty
|
|
7
|
+
// strings for SVG elements, returning NaN. Fallback to `0` in this case.
|
|
8
|
+
let width = parseFloat(css.width) || 0;
|
|
9
|
+
let height = parseFloat(css.height) || 0;
|
|
10
|
+
const hasOffset = isHTMLElement(element);
|
|
11
|
+
const offsetWidth = hasOffset ? element.offsetWidth : width;
|
|
12
|
+
const offsetHeight = hasOffset ? element.offsetHeight : height;
|
|
13
|
+
const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
|
|
14
|
+
if (shouldFallback) {
|
|
15
|
+
width = offsetWidth;
|
|
16
|
+
height = offsetHeight;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
width,
|
|
20
|
+
height,
|
|
21
|
+
$: shouldFallback
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function unwrapElement(element) {
|
|
26
|
+
return !isElement(element) ? element.contextElement : element;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getScale(element) {
|
|
30
|
+
const domElement = unwrapElement(element);
|
|
31
|
+
if (!isHTMLElement(domElement)) {
|
|
32
|
+
return createCoords(1);
|
|
33
|
+
}
|
|
34
|
+
const rect = domElement.getBoundingClientRect();
|
|
35
|
+
const {
|
|
36
|
+
width,
|
|
37
|
+
height,
|
|
38
|
+
$
|
|
39
|
+
} = getCssDimensions(domElement);
|
|
40
|
+
let x = ($ ? round(rect.width) : rect.width) / width;
|
|
41
|
+
let y = ($ ? round(rect.height) : rect.height) / height;
|
|
42
|
+
|
|
43
|
+
// 0, NaN, or Infinity should always fallback to 1.
|
|
44
|
+
|
|
45
|
+
if (!x || !Number.isFinite(x)) {
|
|
46
|
+
x = 1;
|
|
47
|
+
}
|
|
48
|
+
if (!y || !Number.isFinite(y)) {
|
|
49
|
+
y = 1;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
x,
|
|
53
|
+
y
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const noOffsets = /*#__PURE__*/createCoords(0);
|
|
58
|
+
function getVisualOffsets(element) {
|
|
59
|
+
const win = getWindow(element);
|
|
60
|
+
if (!isWebKit() || !win.visualViewport) {
|
|
61
|
+
return noOffsets;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
x: win.visualViewport.offsetLeft,
|
|
65
|
+
y: win.visualViewport.offsetTop
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {
|
|
69
|
+
if (isFixed === void 0) {
|
|
70
|
+
isFixed = false;
|
|
71
|
+
}
|
|
72
|
+
if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return isFixed;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {
|
|
79
|
+
if (includeScale === void 0) {
|
|
80
|
+
includeScale = false;
|
|
81
|
+
}
|
|
82
|
+
if (isFixedStrategy === void 0) {
|
|
83
|
+
isFixedStrategy = false;
|
|
84
|
+
}
|
|
85
|
+
const clientRect = element.getBoundingClientRect();
|
|
86
|
+
const domElement = unwrapElement(element);
|
|
87
|
+
let scale = createCoords(1);
|
|
88
|
+
if (includeScale) {
|
|
89
|
+
if (offsetParent) {
|
|
90
|
+
if (isElement(offsetParent)) {
|
|
91
|
+
scale = getScale(offsetParent);
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
scale = getScale(element);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
|
|
98
|
+
let x = (clientRect.left + visualOffsets.x) / scale.x;
|
|
99
|
+
let y = (clientRect.top + visualOffsets.y) / scale.y;
|
|
100
|
+
let width = clientRect.width / scale.x;
|
|
101
|
+
let height = clientRect.height / scale.y;
|
|
102
|
+
if (domElement) {
|
|
103
|
+
const win = getWindow(domElement);
|
|
104
|
+
const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
|
|
105
|
+
let currentWin = win;
|
|
106
|
+
let currentIFrame = getFrameElement(currentWin);
|
|
107
|
+
while (currentIFrame && offsetParent && offsetWin !== currentWin) {
|
|
108
|
+
const iframeScale = getScale(currentIFrame);
|
|
109
|
+
const iframeRect = currentIFrame.getBoundingClientRect();
|
|
110
|
+
const css = getComputedStyle(currentIFrame);
|
|
111
|
+
const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;
|
|
112
|
+
const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;
|
|
113
|
+
x *= iframeScale.x;
|
|
114
|
+
y *= iframeScale.y;
|
|
115
|
+
width *= iframeScale.x;
|
|
116
|
+
height *= iframeScale.y;
|
|
117
|
+
x += left;
|
|
118
|
+
y += top;
|
|
119
|
+
currentWin = getWindow(currentIFrame);
|
|
120
|
+
currentIFrame = getFrameElement(currentWin);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return rectToClientRect({
|
|
124
|
+
width,
|
|
125
|
+
height,
|
|
126
|
+
x,
|
|
127
|
+
y
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// If <html> has a CSS width greater than the viewport, then this will be
|
|
132
|
+
// incorrect for RTL.
|
|
133
|
+
function getWindowScrollBarX(element, rect) {
|
|
134
|
+
const leftScroll = getNodeScroll(element).scrollLeft;
|
|
135
|
+
if (!rect) {
|
|
136
|
+
return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;
|
|
137
|
+
}
|
|
138
|
+
return rect.left + leftScroll;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {
|
|
142
|
+
if (ignoreScrollbarX === void 0) {
|
|
143
|
+
ignoreScrollbarX = false;
|
|
144
|
+
}
|
|
145
|
+
const htmlRect = documentElement.getBoundingClientRect();
|
|
146
|
+
const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :
|
|
147
|
+
// RTL <body> scrollbar.
|
|
148
|
+
getWindowScrollBarX(documentElement, htmlRect));
|
|
149
|
+
const y = htmlRect.top + scroll.scrollTop;
|
|
150
|
+
return {
|
|
151
|
+
x,
|
|
152
|
+
y
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
|
|
157
|
+
let {
|
|
158
|
+
elements,
|
|
159
|
+
rect,
|
|
160
|
+
offsetParent,
|
|
161
|
+
strategy
|
|
162
|
+
} = _ref;
|
|
163
|
+
const isFixed = strategy === 'fixed';
|
|
164
|
+
const documentElement = getDocumentElement(offsetParent);
|
|
165
|
+
const topLayer = elements ? isTopLayer(elements.floating) : false;
|
|
166
|
+
if (offsetParent === documentElement || topLayer && isFixed) {
|
|
167
|
+
return rect;
|
|
168
|
+
}
|
|
169
|
+
let scroll = {
|
|
170
|
+
scrollLeft: 0,
|
|
171
|
+
scrollTop: 0
|
|
172
|
+
};
|
|
173
|
+
let scale = createCoords(1);
|
|
174
|
+
const offsets = createCoords(0);
|
|
175
|
+
const isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
176
|
+
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
177
|
+
if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {
|
|
178
|
+
scroll = getNodeScroll(offsetParent);
|
|
179
|
+
}
|
|
180
|
+
if (isHTMLElement(offsetParent)) {
|
|
181
|
+
const offsetRect = getBoundingClientRect(offsetParent);
|
|
182
|
+
scale = getScale(offsetParent);
|
|
183
|
+
offsets.x = offsetRect.x + offsetParent.clientLeft;
|
|
184
|
+
offsets.y = offsetRect.y + offsetParent.clientTop;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);
|
|
188
|
+
return {
|
|
189
|
+
width: rect.width * scale.x,
|
|
190
|
+
height: rect.height * scale.y,
|
|
191
|
+
x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,
|
|
192
|
+
y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function getClientRects(element) {
|
|
197
|
+
return Array.from(element.getClientRects());
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Gets the entire size of the scrollable document area, even extending outside
|
|
201
|
+
// of the `<html>` and `<body>` rect bounds if horizontally scrollable.
|
|
202
|
+
function getDocumentRect(element) {
|
|
203
|
+
const html = getDocumentElement(element);
|
|
204
|
+
const scroll = getNodeScroll(element);
|
|
205
|
+
const body = element.ownerDocument.body;
|
|
206
|
+
const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);
|
|
207
|
+
const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);
|
|
208
|
+
let x = -scroll.scrollLeft + getWindowScrollBarX(element);
|
|
209
|
+
const y = -scroll.scrollTop;
|
|
210
|
+
if (getComputedStyle(body).direction === 'rtl') {
|
|
211
|
+
x += max(html.clientWidth, body.clientWidth) - width;
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
width,
|
|
215
|
+
height,
|
|
216
|
+
x,
|
|
217
|
+
y
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function getViewportRect(element, strategy) {
|
|
222
|
+
const win = getWindow(element);
|
|
223
|
+
const html = getDocumentElement(element);
|
|
224
|
+
const visualViewport = win.visualViewport;
|
|
225
|
+
let width = html.clientWidth;
|
|
226
|
+
let height = html.clientHeight;
|
|
227
|
+
let x = 0;
|
|
228
|
+
let y = 0;
|
|
229
|
+
if (visualViewport) {
|
|
230
|
+
width = visualViewport.width;
|
|
231
|
+
height = visualViewport.height;
|
|
232
|
+
const visualViewportBased = isWebKit();
|
|
233
|
+
if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {
|
|
234
|
+
x = visualViewport.offsetLeft;
|
|
235
|
+
y = visualViewport.offsetTop;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
width,
|
|
240
|
+
height,
|
|
241
|
+
x,
|
|
242
|
+
y
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);
|
|
247
|
+
// Returns the inner client rect, subtracting scrollbars if present.
|
|
248
|
+
function getInnerBoundingClientRect(element, strategy) {
|
|
249
|
+
const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');
|
|
250
|
+
const top = clientRect.top + element.clientTop;
|
|
251
|
+
const left = clientRect.left + element.clientLeft;
|
|
252
|
+
const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);
|
|
253
|
+
const width = element.clientWidth * scale.x;
|
|
254
|
+
const height = element.clientHeight * scale.y;
|
|
255
|
+
const x = left * scale.x;
|
|
256
|
+
const y = top * scale.y;
|
|
257
|
+
return {
|
|
258
|
+
width,
|
|
259
|
+
height,
|
|
260
|
+
x,
|
|
261
|
+
y
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {
|
|
265
|
+
let rect;
|
|
266
|
+
if (clippingAncestor === 'viewport') {
|
|
267
|
+
rect = getViewportRect(element, strategy);
|
|
268
|
+
} else if (clippingAncestor === 'document') {
|
|
269
|
+
rect = getDocumentRect(getDocumentElement(element));
|
|
270
|
+
} else if (isElement(clippingAncestor)) {
|
|
271
|
+
rect = getInnerBoundingClientRect(clippingAncestor, strategy);
|
|
272
|
+
} else {
|
|
273
|
+
const visualOffsets = getVisualOffsets(element);
|
|
274
|
+
rect = {
|
|
275
|
+
x: clippingAncestor.x - visualOffsets.x,
|
|
276
|
+
y: clippingAncestor.y - visualOffsets.y,
|
|
277
|
+
width: clippingAncestor.width,
|
|
278
|
+
height: clippingAncestor.height
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
return rectToClientRect(rect);
|
|
282
|
+
}
|
|
283
|
+
function hasFixedPositionAncestor(element, stopNode) {
|
|
284
|
+
const parentNode = getParentNode(element);
|
|
285
|
+
if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// A "clipping ancestor" is an `overflow` element with the characteristic of
|
|
292
|
+
// clipping (or hiding) child elements. This returns all clipping ancestors
|
|
293
|
+
// of the given element up the tree.
|
|
294
|
+
function getClippingElementAncestors(element, cache) {
|
|
295
|
+
const cachedResult = cache.get(element);
|
|
296
|
+
if (cachedResult) {
|
|
297
|
+
return cachedResult;
|
|
298
|
+
}
|
|
299
|
+
let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');
|
|
300
|
+
let currentContainingBlockComputedStyle = null;
|
|
301
|
+
const elementIsFixed = getComputedStyle(element).position === 'fixed';
|
|
302
|
+
let currentNode = elementIsFixed ? getParentNode(element) : element;
|
|
303
|
+
|
|
304
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
|
|
305
|
+
while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {
|
|
306
|
+
const computedStyle = getComputedStyle(currentNode);
|
|
307
|
+
const currentNodeIsContaining = isContainingBlock(currentNode);
|
|
308
|
+
if (!currentNodeIsContaining && computedStyle.position === 'fixed') {
|
|
309
|
+
currentContainingBlockComputedStyle = null;
|
|
310
|
+
}
|
|
311
|
+
const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);
|
|
312
|
+
if (shouldDropCurrentNode) {
|
|
313
|
+
// Drop non-containing blocks.
|
|
314
|
+
result = result.filter(ancestor => ancestor !== currentNode);
|
|
315
|
+
} else {
|
|
316
|
+
// Record last containing block for next iteration.
|
|
317
|
+
currentContainingBlockComputedStyle = computedStyle;
|
|
318
|
+
}
|
|
319
|
+
currentNode = getParentNode(currentNode);
|
|
320
|
+
}
|
|
321
|
+
cache.set(element, result);
|
|
322
|
+
return result;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Gets the maximum area that the element is visible in due to any number of
|
|
326
|
+
// clipping ancestors.
|
|
327
|
+
function getClippingRect(_ref) {
|
|
328
|
+
let {
|
|
329
|
+
element,
|
|
330
|
+
boundary,
|
|
331
|
+
rootBoundary,
|
|
332
|
+
strategy
|
|
333
|
+
} = _ref;
|
|
334
|
+
const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);
|
|
335
|
+
const clippingAncestors = [...elementClippingAncestors, rootBoundary];
|
|
336
|
+
const firstClippingAncestor = clippingAncestors[0];
|
|
337
|
+
const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {
|
|
338
|
+
const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);
|
|
339
|
+
accRect.top = max(rect.top, accRect.top);
|
|
340
|
+
accRect.right = min(rect.right, accRect.right);
|
|
341
|
+
accRect.bottom = min(rect.bottom, accRect.bottom);
|
|
342
|
+
accRect.left = max(rect.left, accRect.left);
|
|
343
|
+
return accRect;
|
|
344
|
+
}, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));
|
|
345
|
+
return {
|
|
346
|
+
width: clippingRect.right - clippingRect.left,
|
|
347
|
+
height: clippingRect.bottom - clippingRect.top,
|
|
348
|
+
x: clippingRect.left,
|
|
349
|
+
y: clippingRect.top
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function getDimensions(element) {
|
|
354
|
+
const {
|
|
355
|
+
width,
|
|
356
|
+
height
|
|
357
|
+
} = getCssDimensions(element);
|
|
358
|
+
return {
|
|
359
|
+
width,
|
|
360
|
+
height
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function getRectRelativeToOffsetParent(element, offsetParent, strategy) {
|
|
365
|
+
const isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
366
|
+
const documentElement = getDocumentElement(offsetParent);
|
|
367
|
+
const isFixed = strategy === 'fixed';
|
|
368
|
+
const rect = getBoundingClientRect(element, true, isFixed, offsetParent);
|
|
369
|
+
let scroll = {
|
|
370
|
+
scrollLeft: 0,
|
|
371
|
+
scrollTop: 0
|
|
372
|
+
};
|
|
373
|
+
const offsets = createCoords(0);
|
|
374
|
+
|
|
375
|
+
// If the <body> scrollbar appears on the left (e.g. RTL systems). Use
|
|
376
|
+
// Firefox with layout.scrollbar.side = 3 in about:config to test this.
|
|
377
|
+
function setLeftRTLScrollbarOffset() {
|
|
378
|
+
offsets.x = getWindowScrollBarX(documentElement);
|
|
379
|
+
}
|
|
380
|
+
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
381
|
+
if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {
|
|
382
|
+
scroll = getNodeScroll(offsetParent);
|
|
383
|
+
}
|
|
384
|
+
if (isOffsetParentAnElement) {
|
|
385
|
+
const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);
|
|
386
|
+
offsets.x = offsetRect.x + offsetParent.clientLeft;
|
|
387
|
+
offsets.y = offsetRect.y + offsetParent.clientTop;
|
|
388
|
+
} else if (documentElement) {
|
|
389
|
+
setLeftRTLScrollbarOffset();
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
if (isFixed && !isOffsetParentAnElement && documentElement) {
|
|
393
|
+
setLeftRTLScrollbarOffset();
|
|
394
|
+
}
|
|
395
|
+
const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
|
|
396
|
+
const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;
|
|
397
|
+
const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;
|
|
398
|
+
return {
|
|
399
|
+
x,
|
|
400
|
+
y,
|
|
401
|
+
width: rect.width,
|
|
402
|
+
height: rect.height
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function isStaticPositioned(element) {
|
|
407
|
+
return getComputedStyle(element).position === 'static';
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
function getTrueOffsetParent(element, polyfill) {
|
|
411
|
+
if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
if (polyfill) {
|
|
415
|
+
return polyfill(element);
|
|
416
|
+
}
|
|
417
|
+
let rawOffsetParent = element.offsetParent;
|
|
418
|
+
|
|
419
|
+
// Firefox returns the <html> element as the offsetParent if it's non-static,
|
|
420
|
+
// while Chrome and Safari return the <body> element. The <body> element must
|
|
421
|
+
// be used to perform the correct calculations even if the <html> element is
|
|
422
|
+
// non-static.
|
|
423
|
+
if (getDocumentElement(element) === rawOffsetParent) {
|
|
424
|
+
rawOffsetParent = rawOffsetParent.ownerDocument.body;
|
|
425
|
+
}
|
|
426
|
+
return rawOffsetParent;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Gets the closest ancestor positioned element. Handles some edge cases,
|
|
430
|
+
// such as table ancestors and cross browser bugs.
|
|
431
|
+
function getOffsetParent(element, polyfill) {
|
|
432
|
+
const win = getWindow(element);
|
|
433
|
+
if (isTopLayer(element)) {
|
|
434
|
+
return win;
|
|
435
|
+
}
|
|
436
|
+
if (!isHTMLElement(element)) {
|
|
437
|
+
let svgOffsetParent = getParentNode(element);
|
|
438
|
+
while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {
|
|
439
|
+
if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {
|
|
440
|
+
return svgOffsetParent;
|
|
441
|
+
}
|
|
442
|
+
svgOffsetParent = getParentNode(svgOffsetParent);
|
|
443
|
+
}
|
|
444
|
+
return win;
|
|
445
|
+
}
|
|
446
|
+
let offsetParent = getTrueOffsetParent(element, polyfill);
|
|
447
|
+
while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {
|
|
448
|
+
offsetParent = getTrueOffsetParent(offsetParent, polyfill);
|
|
449
|
+
}
|
|
450
|
+
if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {
|
|
451
|
+
return win;
|
|
452
|
+
}
|
|
453
|
+
return offsetParent || getContainingBlock(element) || win;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
const getElementRects = async function (data) {
|
|
457
|
+
const getOffsetParentFn = this.getOffsetParent || getOffsetParent;
|
|
458
|
+
const getDimensionsFn = this.getDimensions;
|
|
459
|
+
const floatingDimensions = await getDimensionsFn(data.floating);
|
|
460
|
+
return {
|
|
461
|
+
reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),
|
|
462
|
+
floating: {
|
|
463
|
+
x: 0,
|
|
464
|
+
y: 0,
|
|
465
|
+
width: floatingDimensions.width,
|
|
466
|
+
height: floatingDimensions.height
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
function isRTL(element) {
|
|
472
|
+
return getComputedStyle(element).direction === 'rtl';
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
const platform = {
|
|
476
|
+
convertOffsetParentRelativeRectToViewportRelativeRect,
|
|
477
|
+
getDocumentElement,
|
|
478
|
+
getClippingRect,
|
|
479
|
+
getOffsetParent,
|
|
480
|
+
getElementRects,
|
|
481
|
+
getClientRects,
|
|
482
|
+
getDimensions,
|
|
483
|
+
getScale,
|
|
484
|
+
isElement,
|
|
485
|
+
isRTL
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
export { getOverflowAncestors, platform };
|
|
489
|
+
//# sourceMappingURL=floating-ui.dom.js.map
|