@elliemae/ds-data-table 3.60.0-next.2 → 3.60.0-next.21

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 (45) hide show
  1. package/dist/cjs/addons/Filters/Components/CurrencyRangeFilter/index.js +1 -0
  2. package/dist/cjs/addons/Filters/Components/CurrencyRangeFilter/index.js.map +2 -2
  3. package/dist/cjs/addons/Filters/Components/DateRangeFilter/index.js +2 -0
  4. package/dist/cjs/addons/Filters/Components/DateRangeFilter/index.js.map +2 -2
  5. package/dist/cjs/addons/Filters/Components/DateSwitcherFilter/index.js +2 -0
  6. package/dist/cjs/addons/Filters/Components/DateSwitcherFilter/index.js.map +2 -2
  7. package/dist/cjs/addons/Filters/Components/FreeTextSearchFilter/index.js +1 -0
  8. package/dist/cjs/addons/Filters/Components/FreeTextSearchFilter/index.js.map +2 -2
  9. package/dist/cjs/addons/Filters/Components/NumberRangeFilter/index.js +1 -0
  10. package/dist/cjs/addons/Filters/Components/NumberRangeFilter/index.js.map +2 -2
  11. package/dist/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +1 -0
  12. package/dist/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js.map +2 -2
  13. package/dist/cjs/addons/Filters/Components/SingleDateFilter/index.js +2 -0
  14. package/dist/cjs/addons/Filters/Components/SingleDateFilter/index.js.map +2 -2
  15. package/dist/cjs/exported-related/FilterPopover/index.js +45 -33
  16. package/dist/cjs/exported-related/FilterPopover/index.js.map +2 -2
  17. package/dist/cjs/exported-related/FilterPopover/types.js.map +1 -1
  18. package/dist/cjs/exported-related/FilterPopover/useTrackFocusableElements.js +59 -0
  19. package/dist/cjs/exported-related/FilterPopover/useTrackFocusableElements.js.map +7 -0
  20. package/dist/cjs/parts/FilterBar/DeprecatedDropdown.js +2 -2
  21. package/dist/cjs/parts/FilterBar/DeprecatedDropdown.js.map +2 -2
  22. package/dist/esm/addons/Filters/Components/CurrencyRangeFilter/index.js +1 -0
  23. package/dist/esm/addons/Filters/Components/CurrencyRangeFilter/index.js.map +2 -2
  24. package/dist/esm/addons/Filters/Components/DateRangeFilter/index.js +2 -0
  25. package/dist/esm/addons/Filters/Components/DateRangeFilter/index.js.map +2 -2
  26. package/dist/esm/addons/Filters/Components/DateSwitcherFilter/index.js +2 -0
  27. package/dist/esm/addons/Filters/Components/DateSwitcherFilter/index.js.map +2 -2
  28. package/dist/esm/addons/Filters/Components/FreeTextSearchFilter/index.js +1 -0
  29. package/dist/esm/addons/Filters/Components/FreeTextSearchFilter/index.js.map +2 -2
  30. package/dist/esm/addons/Filters/Components/NumberRangeFilter/index.js +1 -0
  31. package/dist/esm/addons/Filters/Components/NumberRangeFilter/index.js.map +2 -2
  32. package/dist/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +1 -0
  33. package/dist/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js.map +2 -2
  34. package/dist/esm/addons/Filters/Components/SingleDateFilter/index.js +2 -0
  35. package/dist/esm/addons/Filters/Components/SingleDateFilter/index.js.map +2 -2
  36. package/dist/esm/exported-related/FilterPopover/index.js +38 -26
  37. package/dist/esm/exported-related/FilterPopover/index.js.map +2 -2
  38. package/dist/esm/exported-related/FilterPopover/useTrackFocusableElements.js +29 -0
  39. package/dist/esm/exported-related/FilterPopover/useTrackFocusableElements.js.map +7 -0
  40. package/dist/esm/parts/FilterBar/DeprecatedDropdown.js +1 -1
  41. package/dist/esm/parts/FilterBar/DeprecatedDropdown.js.map +1 -1
  42. package/dist/types/exported-related/FilterPopover/types.d.ts +1 -0
  43. package/dist/types/exported-related/FilterPopover/useTrackFocusableElements.d.ts +17 -0
  44. package/dist/types/tests/playwright/DSDataTable.ControlledFilterTestRenderer.d.ts +2 -0
  45. package/package.json +50 -52
@@ -1,14 +1,16 @@
1
1
  import * as React from "react";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { DSButtonV2 } from "@elliemae/ds-button-v2";
4
+ import { useFocusTrap } from "@elliemae/ds-hooks-focus-trap";
4
5
  import { DSPopperJS } from "@elliemae/ds-popperjs";
5
6
  import { mergeRefs, styled } from "@elliemae/ds-system";
6
7
  import { useCallback, useEffect, useRef, useState } from "react";
7
- import { DSDataTableName, DSDataTableSlots } from "../../constants/index.js";
8
8
  import { DATA_TESTID } from "../../configs/constants.js";
9
- import { useInternalStore, usePropsStore } from "../../configs/useStore/createInternalAndPropsContext.js";
9
+ import { usePropsStore } from "../../configs/useStore/createInternalAndPropsContext.js";
10
+ import { DSDataTableName, DSDataTableSlots } from "../../constants/index.js";
10
11
  import { useGetFilterHandlers } from "./useGetFilterHandlers.js";
11
12
  import { useGetFilterVisibility } from "./useGetFilterVisibility.js";
13
+ import { useTrackFocusableElements } from "./useTrackFocusableElements.js";
12
14
  const FilterButton = styled("span", { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_BUTTON })`
13
15
  display: inline-grid;
14
16
  ${(props) => props.hide ? "opacity: 0; display: none; width: 0;" : ""}
@@ -20,18 +22,8 @@ const StyledPoppoverJS = styled(DSPopperJS, {
20
22
  name: DSDataTableName,
21
23
  slot: DSDataTableSlots.FILTER_POPOVER
22
24
  })``;
23
- const ButtonTrap = ({ cb }) => /* @__PURE__ */ jsx(
24
- "span",
25
- {
26
- tabIndex: 0,
27
- onFocus: (e) => {
28
- e.stopPropagation();
29
- cb();
30
- }
31
- }
32
- );
33
25
  const FilterPopover = (props) => {
34
- const { column, customStyles, reduxHeader, menuContent, columnId, ariaLabel, triggerIcon, innerRef } = props;
26
+ const { column, customStyles, reduxHeader, menuContent, ariaLabel, triggerIcon, innerRef, columnReference } = props;
35
27
  const filters = usePropsStore((state) => state.filters);
36
28
  const getOwnerProps = usePropsStore((store) => store.get);
37
29
  const getOwnerPropsArguments = useCallback(
@@ -40,18 +32,40 @@ const FilterPopover = (props) => {
40
32
  }),
41
33
  [column.id]
42
34
  );
43
- const patchHeader = useInternalStore((state) => state.patchHeader);
44
35
  const { isIconVisible, isMenuOpen } = useGetFilterVisibility(reduxHeader);
45
36
  const [buttonReference, setButtonReference] = useState(null);
46
37
  const [isButtonFocused, setIsButtonFocused] = useState(false);
47
38
  const { handleTriggerClick, handleClickOutsideMenu, handleMenuOnKeyDown, handleTriggerOnFocus, handleTriggerOnBlur } = useGetFilterHandlers(props, isMenuOpen, buttonReference, setIsButtonFocused);
48
- const buttonTrapCallback = useCallback(() => {
49
- patchHeader(columnId, { hideFilterMenu: true, hideFilterButton: false });
50
- buttonReference?.focus();
51
- }, [columnId, patchHeader, buttonReference]);
52
39
  const actionRef = useRef({
53
40
  update: null
54
41
  });
42
+ const popoverContentRef = useRef(null);
43
+ const { firstElementRef, lastElementRef } = useTrackFocusableElements({
44
+ containerRef: popoverContentRef,
45
+ dependencies: [isMenuOpen, menuContent]
46
+ });
47
+ const focusedDayRef = useRef(null);
48
+ const handleOnKeyDown = useFocusTrap({
49
+ firstElementRef,
50
+ lastElementRef,
51
+ onKeyDown: (e) => {
52
+ const target = e.target;
53
+ const dayWrapper = target.closest(".focusedDay");
54
+ if (dayWrapper) {
55
+ if (focusedDayRef.current && focusedDayRef.current !== dayWrapper) {
56
+ focusedDayRef.current.classList.remove("focusedDay");
57
+ }
58
+ focusedDayRef.current = dayWrapper;
59
+ lastElementRef.current = target;
60
+ }
61
+ if (e.key === "Tab" && focusedDayRef.current) {
62
+ setTimeout(() => {
63
+ focusedDayRef.current?.classList.remove("focusedDay");
64
+ focusedDayRef.current = null;
65
+ }, 0);
66
+ }
67
+ }
68
+ });
55
69
  useEffect(() => {
56
70
  void actionRef.current.update?.();
57
71
  }, [filters]);
@@ -85,16 +99,16 @@ const FilterPopover = (props) => {
85
99
  )
86
100
  }
87
101
  ),
88
- buttonReference && /* @__PURE__ */ jsx(
102
+ (columnReference || buttonReference) && /* @__PURE__ */ jsx(
89
103
  StyledPoppoverJS,
90
104
  {
91
105
  actionRef,
92
- referenceElement: buttonReference,
106
+ referenceElement: columnReference || buttonReference,
93
107
  showPopover: isMenuOpen,
94
108
  closeContextMenu: handleClickOutsideMenu,
95
109
  "data-testid": DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT,
96
110
  startPlacementPreference: "bottom-end",
97
- customOffset: [5, 4],
111
+ customOffset: columnReference ? [0, 1] : [5, 4],
98
112
  withoutArrow: true,
99
113
  withoutAnimation: true,
100
114
  extraPopperStyles: {
@@ -104,11 +118,9 @@ const FilterPopover = (props) => {
104
118
  placementOrderPreference: ["bottom-end", "top-end"],
105
119
  getOwnerProps,
106
120
  getOwnerPropsArguments,
107
- children: /* @__PURE__ */ jsxs(PopperContent, { getOwnerProps, children: [
108
- /* @__PURE__ */ jsx(ButtonTrap, { cb: buttonTrapCallback }),
109
- menuContent,
110
- /* @__PURE__ */ jsx(ButtonTrap, { cb: buttonTrapCallback })
111
- ] })
121
+ role: "dialog",
122
+ "aria-label": `Filter by ${column.Header}`,
123
+ children: /* @__PURE__ */ jsx(PopperContent, { getOwnerProps, innerRef: popoverContentRef, onKeyDown: handleOnKeyDown, children: menuContent })
112
124
  }
113
125
  )
114
126
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/exported-related/FilterPopover/index.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable import/no-cycle */\n/* eslint-disable no-void */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport type { DSPopperJST } from '@elliemae/ds-popperjs';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { mergeRefs, styled } from '@elliemae/ds-system';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { DSDataTableName, DSDataTableSlots } from '../../constants/index.js';\nimport { DATA_TESTID } from '../../configs/constants.js';\nimport { useInternalStore, usePropsStore } from '../../configs/useStore/createInternalAndPropsContext.js';\nimport type { FilterPopoverProps } from './types.js';\nimport { useGetFilterHandlers } from './useGetFilterHandlers.js';\nimport { useGetFilterVisibility } from './useGetFilterVisibility.js';\n\nconst FilterButton = styled('span', { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_BUTTON })<{\n hide: boolean;\n}>`\n display: inline-grid;\n ${(props) => (props.hide ? 'opacity: 0; display: none; width: 0;' : '')}\n`;\n\nconst PopperContent = styled('div', { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_CONTENT })`\n background-color: #fff;\n`;\n\nconst StyledPoppoverJS = styled(DSPopperJS, {\n name: DSDataTableName,\n slot: DSDataTableSlots.FILTER_POPOVER,\n})``;\n\nconst ButtonTrap = ({ cb }: { cb: () => void }) => (\n <span\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n onFocus={(e: React.FocusEvent) => {\n e.stopPropagation();\n cb();\n }}\n />\n);\n\nexport const FilterPopover: React.ComponentType<FilterPopoverProps> = (props: FilterPopoverProps) => {\n const { column, customStyles, reduxHeader, menuContent, columnId, ariaLabel, triggerIcon, innerRef } = props;\n\n const filters = usePropsStore((state) => state.filters);\n const getOwnerProps = usePropsStore((store) => store.get);\n\n const getOwnerPropsArguments = useCallback(\n () => ({\n columnId: column.id,\n }),\n [column.id],\n );\n\n const patchHeader = useInternalStore((state) => state.patchHeader);\n\n const { isIconVisible, isMenuOpen } = useGetFilterVisibility(reduxHeader);\n\n const [buttonReference, setButtonReference] = useState<HTMLButtonElement | null>(null);\n\n const [isButtonFocused, setIsButtonFocused] = useState(false);\n\n const { handleTriggerClick, handleClickOutsideMenu, handleMenuOnKeyDown, handleTriggerOnFocus, handleTriggerOnBlur } =\n useGetFilterHandlers(props, isMenuOpen, buttonReference, setIsButtonFocused);\n\n const buttonTrapCallback = useCallback(() => {\n patchHeader(columnId, { hideFilterMenu: true, hideFilterButton: false });\n buttonReference?.focus();\n }, [columnId, patchHeader, buttonReference]);\n\n const actionRef: Required<DSPopperJST.Props>['actionRef'] = useRef({\n update: null,\n });\n\n useEffect(() => {\n // When the filters change, we need to update the popper position,\n // because the filter bar might push the datatable up or down, causing the popper to be misaligned\n void actionRef.current.update?.();\n }, [filters]);\n\n return (\n <div\n // This is here to prevent propagation, and not trigger the sort functionality\n onClick={(e) => e.stopPropagation()}\n onKeyDown={handleMenuOnKeyDown}\n >\n <FilterButton\n hide={!isIconVisible}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BUTTON}\n getOwnerProps={getOwnerProps}\n >\n <DSButtonV2\n buttonType=\"icon\"\n size=\"s\"\n onClick={handleTriggerClick}\n onFocus={handleTriggerOnFocus}\n onBlur={handleTriggerOnBlur}\n innerRef={mergeRefs(isIconVisible && setButtonReference, innerRef)}\n tabIndex={reduxHeader?.withTabStops ? 0 : -1}\n aria-label={ariaLabel}\n aria-hidden={!isButtonFocused}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BUTTON_ELEMENT}\n >\n {triggerIcon}\n </DSButtonV2>\n </FilterButton>\n {buttonReference && (\n <StyledPoppoverJS\n actionRef={actionRef}\n referenceElement={buttonReference}\n showPopover={isMenuOpen}\n closeContextMenu={handleClickOutsideMenu}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT}\n startPlacementPreference=\"bottom-end\"\n customOffset={[5, 4]}\n withoutArrow\n withoutAnimation\n extraPopperStyles={{\n ...customStyles,\n minWidth: column.ref?.current?.offsetWidth ?? '0px',\n }}\n placementOrderPreference={['bottom-end', 'top-end']}\n getOwnerProps={getOwnerProps}\n getOwnerPropsArguments={getOwnerPropsArguments}\n >\n <PopperContent getOwnerProps={getOwnerProps}>\n <ButtonTrap cb={buttonTrapCallback} />\n {menuContent}\n <ButtonTrap cb={buttonTrapCallback} />\n </PopperContent>\n </StyledPoppoverJS>\n )}\n </div>\n );\n};\n"],
5
- "mappings": "AAAA,YAAY,WAAW;ACgCrB,cA8FQ,YA9FR;AA7BF,SAAS,kBAAkB;AAE3B,SAAS,kBAAkB;AAC3B,SAAS,WAAW,cAAc;AAClC,SAAgB,aAAa,WAAW,QAAQ,gBAAgB;AAChE,SAAS,iBAAiB,wBAAwB;AAClD,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB,qBAAqB;AAEhD,SAAS,4BAA4B;AACrC,SAAS,8BAA8B;AAEvC,MAAM,eAAe,OAAO,QAAQ,EAAE,MAAM,iBAAiB,MAAM,iBAAiB,sBAAsB,CAAC;AAAA;AAAA,IAIvG,CAAC,UAAW,MAAM,OAAO,yCAAyC,EAAG;AAAA;AAGzE,MAAM,gBAAgB,OAAO,OAAO,EAAE,MAAM,iBAAiB,MAAM,iBAAiB,uBAAuB,CAAC;AAAA;AAAA;AAI5G,MAAM,mBAAmB,OAAO,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM,iBAAiB;AACzB,CAAC;AAED,MAAM,aAAa,CAAC,EAAE,GAAG,MACvB;AAAA,EAAC;AAAA;AAAA,IAEC,UAAU;AAAA,IACV,SAAS,CAAC,MAAwB;AAChC,QAAE,gBAAgB;AAClB,SAAG;AAAA,IACL;AAAA;AACF;AAGK,MAAM,gBAAyD,CAAC,UAA8B;AACnG,QAAM,EAAE,QAAQ,cAAc,aAAa,aAAa,UAAU,WAAW,aAAa,SAAS,IAAI;AAEvG,QAAM,UAAU,cAAc,CAAC,UAAU,MAAM,OAAO;AACtD,QAAM,gBAAgB,cAAc,CAAC,UAAU,MAAM,GAAG;AAExD,QAAM,yBAAyB;AAAA,IAC7B,OAAO;AAAA,MACL,UAAU,OAAO;AAAA,IACnB;AAAA,IACA,CAAC,OAAO,EAAE;AAAA,EACZ;AAEA,QAAM,cAAc,iBAAiB,CAAC,UAAU,MAAM,WAAW;AAEjE,QAAM,EAAE,eAAe,WAAW,IAAI,uBAAuB,WAAW;AAExE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAmC,IAAI;AAErF,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAE5D,QAAM,EAAE,oBAAoB,wBAAwB,qBAAqB,sBAAsB,oBAAoB,IACjH,qBAAqB,OAAO,YAAY,iBAAiB,kBAAkB;AAE7E,QAAM,qBAAqB,YAAY,MAAM;AAC3C,gBAAY,UAAU,EAAE,gBAAgB,MAAM,kBAAkB,MAAM,CAAC;AACvE,qBAAiB,MAAM;AAAA,EACzB,GAAG,CAAC,UAAU,aAAa,eAAe,CAAC;AAE3C,QAAM,YAAsD,OAAO;AAAA,IACjE,QAAQ;AAAA,EACV,CAAC;AAED,YAAU,MAAM;AAGd,SAAK,UAAU,QAAQ,SAAS;AAAA,EAClC,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAClC,WAAW;AAAA,MAEX;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,CAAC;AAAA,YACP,eAAa,YAAY;AAAA,YACzB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,YAAW;AAAA,gBACX,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU,UAAU,iBAAiB,oBAAoB,QAAQ;AAAA,gBACjE,UAAU,aAAa,eAAe,IAAI;AAAA,gBAC1C,cAAY;AAAA,gBACZ,eAAa,CAAC;AAAA,gBACd,eAAa,YAAY;AAAA,gBAExB;AAAA;AAAA,YACH;AAAA;AAAA,QACF;AAAA,QACC,mBACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,kBAAkB;AAAA,YAClB,aAAa;AAAA,YACb,kBAAkB;AAAA,YAClB,eAAa,YAAY;AAAA,YACzB,0BAAyB;AAAA,YACzB,cAAc,CAAC,GAAG,CAAC;AAAA,YACnB,cAAY;AAAA,YACZ,kBAAgB;AAAA,YAChB,mBAAmB;AAAA,cACjB,GAAG;AAAA,cACH,UAAU,OAAO,KAAK,SAAS,eAAe;AAAA,YAChD;AAAA,YACA,0BAA0B,CAAC,cAAc,SAAS;AAAA,YAClD;AAAA,YACA;AAAA,YAEA,+BAAC,iBAAc,eACb;AAAA,kCAAC,cAAW,IAAI,oBAAoB;AAAA,cACnC;AAAA,cACD,oBAAC,cAAW,IAAI,oBAAoB;AAAA,eACtC;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;",
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable import/no-cycle */\n/* eslint-disable no-void */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport { useFocusTrap } from '@elliemae/ds-hooks-focus-trap';\nimport type { DSPopperJST } from '@elliemae/ds-popperjs';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { mergeRefs, styled } from '@elliemae/ds-system';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { DATA_TESTID } from '../../configs/constants.js';\nimport { usePropsStore } from '../../configs/useStore/createInternalAndPropsContext.js';\nimport { DSDataTableName, DSDataTableSlots } from '../../constants/index.js';\nimport type { FilterPopoverProps } from './types.js';\nimport { useGetFilterHandlers } from './useGetFilterHandlers.js';\nimport { useGetFilterVisibility } from './useGetFilterVisibility.js';\nimport { useTrackFocusableElements } from './useTrackFocusableElements.js';\n\nconst FilterButton = styled('span', { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_BUTTON })<{\n hide: boolean;\n}>`\n display: inline-grid;\n ${(props) => (props.hide ? 'opacity: 0; display: none; width: 0;' : '')}\n`;\n\nconst PopperContent = styled('div', { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_CONTENT })`\n background-color: #fff;\n`;\n\nconst StyledPoppoverJS = styled(DSPopperJS, {\n name: DSDataTableName,\n slot: DSDataTableSlots.FILTER_POPOVER,\n})``;\n\nexport const FilterPopover: React.ComponentType<FilterPopoverProps> = (props: FilterPopoverProps) => {\n const { column, customStyles, reduxHeader, menuContent, ariaLabel, triggerIcon, innerRef, columnReference } = props;\n\n const filters = usePropsStore((state) => state.filters);\n const getOwnerProps = usePropsStore((store) => store.get);\n\n const getOwnerPropsArguments = useCallback(\n () => ({\n columnId: column.id,\n }),\n [column.id],\n );\n\n const { isIconVisible, isMenuOpen } = useGetFilterVisibility(reduxHeader);\n\n const [buttonReference, setButtonReference] = useState<HTMLButtonElement | null>(null);\n\n const [isButtonFocused, setIsButtonFocused] = useState(false);\n\n const { handleTriggerClick, handleClickOutsideMenu, handleMenuOnKeyDown, handleTriggerOnFocus, handleTriggerOnBlur } =\n useGetFilterHandlers(props, isMenuOpen, buttonReference, setIsButtonFocused);\n\n const actionRef: Required<DSPopperJST.Props>['actionRef'] = useRef({\n update: null,\n });\n const popoverContentRef = useRef<HTMLDivElement>(null);\n const { firstElementRef, lastElementRef } = useTrackFocusableElements({\n containerRef: popoverContentRef,\n dependencies: [isMenuOpen, menuContent],\n });\n\n const focusedDayRef = useRef<HTMLElement | null>(null);\n const handleOnKeyDown = useFocusTrap({\n firstElementRef,\n lastElementRef,\n onKeyDown: (e) => {\n const target = e.target as HTMLElement;\n // Special handling for DateRangePicker calendar: days use a roving tabindex pattern.\n // Track the focused day to update the lastElementRef and clear visual focus on Tab loop.\n const dayWrapper = target.closest('.focusedDay') as HTMLElement;\n if (dayWrapper) {\n // Remove visual focus from the previously focused day\n if (focusedDayRef.current && focusedDayRef.current !== dayWrapper) {\n focusedDayRef.current.classList.remove('focusedDay');\n }\n\n focusedDayRef.current = dayWrapper;\n // Update trap boundary to the focused day's button\n lastElementRef.current = target;\n }\n // Clear visual focus when Tab navigates away from the calendar\n if (e.key === 'Tab' && focusedDayRef.current) {\n setTimeout(() => {\n focusedDayRef.current?.classList.remove('focusedDay');\n focusedDayRef.current = null;\n }, 0);\n }\n },\n });\n\n useEffect(() => {\n // When the filters change, we need to update the popper position,\n // because the filter bar might push the datatable up or down, causing the popper to be misaligned\n void actionRef.current.update?.();\n }, [filters]);\n\n return (\n <div\n // This is here to prevent propagation, and not trigger the sort functionality\n onClick={(e) => e.stopPropagation()}\n onKeyDown={handleMenuOnKeyDown}\n >\n <FilterButton\n hide={!isIconVisible}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BUTTON}\n getOwnerProps={getOwnerProps}\n >\n <DSButtonV2\n buttonType=\"icon\"\n size=\"s\"\n onClick={handleTriggerClick}\n onFocus={handleTriggerOnFocus}\n onBlur={handleTriggerOnBlur}\n innerRef={mergeRefs(isIconVisible && setButtonReference, innerRef)}\n tabIndex={reduxHeader?.withTabStops ? 0 : -1}\n aria-label={ariaLabel}\n aria-hidden={!isButtonFocused}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BUTTON_ELEMENT}\n >\n {triggerIcon}\n </DSButtonV2>\n </FilterButton>\n {(columnReference || buttonReference) && (\n <StyledPoppoverJS\n actionRef={actionRef}\n referenceElement={columnReference || buttonReference}\n showPopover={isMenuOpen}\n closeContextMenu={handleClickOutsideMenu}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT}\n startPlacementPreference=\"bottom-end\"\n customOffset={columnReference ? [0, 1] : [5, 4]}\n withoutArrow\n withoutAnimation\n extraPopperStyles={{\n ...customStyles,\n minWidth: column.ref?.current?.offsetWidth ?? '0px',\n }}\n placementOrderPreference={['bottom-end', 'top-end']}\n getOwnerProps={getOwnerProps}\n getOwnerPropsArguments={getOwnerPropsArguments}\n role=\"dialog\"\n aria-label={`Filter by ${column.Header as string}`}\n >\n <PopperContent getOwnerProps={getOwnerProps} innerRef={popoverContentRef} onKeyDown={handleOnKeyDown}>\n {menuContent}\n </PopperContent>\n </StyledPoppoverJS>\n )}\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import { useEffect, useRef } from "react";
3
+ const DEFAULT_FOCUSABLE_SELECTOR = 'button:not([disabled]):not([tabindex="-1"]), [href], input:not([disabled]):not([tabindex="-1"]), select:not([disabled]), button[data-isfocused="true"],textarea:not([disabled]), [tabindex]:not([tabindex="-1"]):not([disabled])';
4
+ const useTrackFocusableElements = ({
5
+ containerRef,
6
+ selector = DEFAULT_FOCUSABLE_SELECTOR,
7
+ dependencies = []
8
+ }) => {
9
+ const firstElementRef = useRef(null);
10
+ const lastElementRef = useRef(null);
11
+ useEffect(() => {
12
+ const container = containerRef && "current" in containerRef ? containerRef.current : containerRef;
13
+ if (!container) return;
14
+ const elements = container.querySelectorAll(selector);
15
+ if (elements.length > 0) {
16
+ const [firstElement] = elements;
17
+ firstElementRef.current = firstElement;
18
+ lastElementRef.current = elements[elements.length - 1];
19
+ } else {
20
+ firstElementRef.current = null;
21
+ lastElementRef.current = null;
22
+ }
23
+ }, [containerRef, selector, ...dependencies]);
24
+ return { firstElementRef, lastElementRef };
25
+ };
26
+ export {
27
+ useTrackFocusableElements
28
+ };
29
+ //# sourceMappingURL=useTrackFocusableElements.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/exported-related/FilterPopover/useTrackFocusableElements.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useEffect, useRef } from 'react';\n\n/**\n * Tracks the first and last focusable elements in a container.\n * Used by the FilterPopover focus trap.\n */\ninterface UseTrackFocusableElementsConfig {\n /** Container element (HTMLElement or RefObject) */\n containerRef: React.RefObject<HTMLElement> | HTMLElement | null;\n\n /** CSS selector for focusable elements */\n selector?: string;\n\n /** Dependencies to trigger re-scan */\n dependencies?: React.DependencyList;\n}\n\nconst DEFAULT_FOCUSABLE_SELECTOR =\n 'button:not([disabled]):not([tabindex=\"-1\"]), ' +\n '[href], ' +\n 'input:not([disabled]):not([tabindex=\"-1\"]), ' +\n 'select:not([disabled]), ' +\n 'button[data-isfocused=\"true\"],' +\n 'textarea:not([disabled]), ' +\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])';\n\nexport const useTrackFocusableElements = ({\n containerRef,\n selector = DEFAULT_FOCUSABLE_SELECTOR,\n dependencies = [],\n}: UseTrackFocusableElementsConfig) => {\n const firstElementRef = useRef<HTMLElement | null>(null);\n const lastElementRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n const container = containerRef && 'current' in containerRef ? containerRef.current : containerRef;\n\n if (!container) return;\n\n const elements = container.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length > 0) {\n const [firstElement] = elements;\n firstElementRef.current = firstElement;\n lastElementRef.current = elements[elements.length - 1];\n } else {\n firstElementRef.current = null;\n lastElementRef.current = null;\n }\n // Spread operator is intentionally used to allow consumers to pass dynamic dependencies.\n // ESLint cannot statically verify spread elements, but this pattern enables flexible hook composition.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef, selector, ...dependencies]);\n\n return { firstElementRef, lastElementRef };\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,WAAW,cAAc;AAiBlC,MAAM,6BACJ;AAQK,MAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA,WAAW;AAAA,EACX,eAAe,CAAC;AAClB,MAAuC;AACrC,QAAM,kBAAkB,OAA2B,IAAI;AACvD,QAAM,iBAAiB,OAA2B,IAAI;AAEtD,YAAU,MAAM;AACd,UAAM,YAAY,gBAAgB,aAAa,eAAe,aAAa,UAAU;AAErF,QAAI,CAAC,UAAW;AAEhB,UAAM,WAAW,UAAU,iBAA8B,QAAQ;AAEjE,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,CAAC,YAAY,IAAI;AACvB,sBAAgB,UAAU;AAC1B,qBAAe,UAAU,SAAS,SAAS,SAAS,CAAC;AAAA,IACvD,OAAO;AACL,sBAAgB,UAAU;AAC1B,qBAAe,UAAU;AAAA,IAC3B;AAAA,EAIF,GAAG,CAAC,cAAc,UAAU,GAAG,YAAY,CAAC;AAE5C,SAAO,EAAE,iBAAiB,eAAe;AAC3C;",
6
+ "names": []
7
+ }
@@ -2,7 +2,7 @@ import * as React from "react";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { DSButtonV2 } from "@elliemae/ds-button-v2";
4
4
  import { MoreOptionsVert } from "@elliemae/ds-icons";
5
- import { DSDropdownMenu } from "@elliemae/ds-dropdownmenu";
5
+ import { DSDropdownMenu } from "@elliemae/ds-legacy-dropdownmenu";
6
6
  import { DATA_TESTID } from "../../configs/index.js";
7
7
  const DeprecatedDropdown = ({
8
8
  finalIsOpen,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/FilterBar/DeprecatedDropdown.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck This is using the deprecated dropdown menu\nimport React from 'react';\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport { MoreOptionsVert } from '@elliemae/ds-icons';\nimport { DSDropdownMenu } from '@elliemae/ds-dropdownmenu';\nimport { DATA_TESTID } from '../../configs/index.js';\nimport type { DSDataTableT } from '../../react-desc-prop-types.js';\n\ninterface DeprecatedDropdownProps {\n finalIsOpen: boolean;\n onFilterBarClose: () => void;\n onFilterBarOnClickOutside: () => void;\n removeAllFilters: () => void;\n filterBarProps: DSDataTableT.Props['filterBarProps'];\n dropdownMenuRef: React.MutableRefObject<HTMLButtonElement | null>;\n onTriggerClick: () => void;\n}\n\nexport const DeprecatedDropdown: React.ComponentType<DeprecatedDropdownProps> = ({\n finalIsOpen,\n onFilterBarClose,\n onFilterBarOnClickOutside,\n removeAllFilters,\n filterBarProps,\n dropdownMenuRef,\n onTriggerClick,\n}) => (\n <DSDropdownMenu\n preventOverflow=\"scrollParent\"\n isOpen={finalIsOpen}\n onClose={onFilterBarClose}\n onClickOutsideMenu={onFilterBarOnClickOutside}\n options={[\n {\n id: '__internal__option__clear__filters',\n label: 'Clear Filters',\n onClick: removeAllFilters,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) removeAllFilters();\n },\n },\n ...(filterBarProps?.extraOptions || []).map((option) => ({\n ...option,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) option?.onClick?.(e);\n },\n })),\n ]}\n triggerComponent={\n <DSButtonV2\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON}\n buttonType=\"icon\"\n innerRef={dropdownMenuRef}\n onClick={onTriggerClick}\n aria-label=\"Filter bar addon\"\n style={{ marginLeft: 'auto' }}\n >\n <MoreOptionsVert />\n </DSButtonV2>\n }\n />\n);\n"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck This is using the deprecated dropdown menu\nimport React from 'react';\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport { MoreOptionsVert } from '@elliemae/ds-icons';\nimport { DSDropdownMenu } from '@elliemae/ds-legacy-dropdownmenu';\nimport { DATA_TESTID } from '../../configs/index.js';\nimport type { DSDataTableT } from '../../react-desc-prop-types.js';\n\ninterface DeprecatedDropdownProps {\n finalIsOpen: boolean;\n onFilterBarClose: () => void;\n onFilterBarOnClickOutside: () => void;\n removeAllFilters: () => void;\n filterBarProps: DSDataTableT.Props['filterBarProps'];\n dropdownMenuRef: React.MutableRefObject<HTMLButtonElement | null>;\n onTriggerClick: () => void;\n}\n\nexport const DeprecatedDropdown: React.ComponentType<DeprecatedDropdownProps> = ({\n finalIsOpen,\n onFilterBarClose,\n onFilterBarOnClickOutside,\n removeAllFilters,\n filterBarProps,\n dropdownMenuRef,\n onTriggerClick,\n}) => (\n <DSDropdownMenu\n preventOverflow=\"scrollParent\"\n isOpen={finalIsOpen}\n onClose={onFilterBarClose}\n onClickOutsideMenu={onFilterBarOnClickOutside}\n options={[\n {\n id: '__internal__option__clear__filters',\n label: 'Clear Filters',\n onClick: removeAllFilters,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) removeAllFilters();\n },\n },\n ...(filterBarProps?.extraOptions || []).map((option) => ({\n ...option,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) option?.onClick?.(e);\n },\n })),\n ]}\n triggerComponent={\n <DSButtonV2\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON}\n buttonType=\"icon\"\n innerRef={dropdownMenuRef}\n onClick={onTriggerClick}\n aria-label=\"Filter bar addon\"\n style={{ marginLeft: 'auto' }}\n >\n <MoreOptionsVert />\n </DSButtonV2>\n }\n />\n);\n"],
5
5
  "mappings": "AAAA,YAAY,WAAW;AC0Df;AAvDR,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAarB,MAAM,qBAAmE,CAAC;AAAA,EAC/E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,iBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,CAAC,MAA2B;AACrC,cAAI,CAAC,SAAS,OAAO,EAAE,SAAS,EAAE,IAAI,EAAG,kBAAiB;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,IAAI,gBAAgB,gBAAgB,CAAC,GAAG,IAAI,CAAC,YAAY;AAAA,QACvD,GAAG;AAAA,QACH,WAAW,CAAC,MAA2B;AACrC,cAAI,CAAC,SAAS,OAAO,EAAE,SAAS,EAAE,IAAI,EAAG,SAAQ,UAAU,CAAC;AAAA,QAC9D;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,kBACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAa,YAAY;AAAA,QACzB,YAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,cAAW;AAAA,QACX,OAAO,EAAE,YAAY,OAAO;AAAA,QAE5B,8BAAC,mBAAgB;AAAA;AAAA,IACnB;AAAA;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,7 @@ import type { DSDataTableT } from '../../react-desc-prop-types.js';
3
3
  export interface FilterPopoverProps {
4
4
  column: DSDataTableT.InternalColumn;
5
5
  columnId: string;
6
+ columnReference?: HTMLElement | null;
6
7
  triggerIcon: JSX.Element;
7
8
  menuContent: JSX.Element;
8
9
  onTriggerClick?: (id: string, e: React.MouseEvent | React.KeyboardEvent) => void;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tracks the first and last focusable elements in a container.
3
+ * Used by the FilterPopover focus trap.
4
+ */
5
+ interface UseTrackFocusableElementsConfig {
6
+ /** Container element (HTMLElement or RefObject) */
7
+ containerRef: React.RefObject<HTMLElement> | HTMLElement | null;
8
+ /** CSS selector for focusable elements */
9
+ selector?: string;
10
+ /** Dependencies to trigger re-scan */
11
+ dependencies?: React.DependencyList;
12
+ }
13
+ export declare const useTrackFocusableElements: ({ containerRef, selector, dependencies, }: UseTrackFocusableElementsConfig) => {
14
+ firstElementRef: import("react").MutableRefObject<HTMLElement | null>;
15
+ lastElementRef: import("react").MutableRefObject<HTMLElement | null>;
16
+ };
17
+ export {};
@@ -0,0 +1,2 @@
1
+ export const ControlledFilterTestRenderer: React.FunctionComponent<React.JSX.IntrinsicAttributes>;
2
+ import React from 'react';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elliemae/ds-data-table",
3
- "version": "3.60.0-next.2",
3
+ "version": "3.60.0-next.21",
4
4
  "license": "MIT",
5
5
  "description": "ICE MT - Dimsum - Data Table",
6
6
  "files": [
@@ -35,64 +35,62 @@
35
35
  "reportFile": "tests.xml",
36
36
  "indent": 4
37
37
  },
38
- "scripts": {
39
- "dev": "cross-env NODE_ENV=development node ../../../scripts/build/build.mjs --watch",
40
- "test": "playwright test -c ./playwright.config.mjs && pui-cli test --passWithNoTests --coverage=\"false\"",
41
- "lint": "node ../../../scripts/lint.mjs --fix",
42
- "lint:strict": "node ../../../scripts/lint-strict.mjs",
43
- "dts": "node ../../../scripts/dts.mjs",
44
- "build": "cross-env NODE_ENV=production node ../../../scripts/build/build.mjs",
45
- "checkDeps": "npm exec ../../util/ds-codemods -- check-missing-packages --projectFolderPath=\"./\" --ignorePackagesGlobPattern=\"\" --ignoreFilesGlobPattern=\"**/test-ables/*,**/tests/*\""
46
- },
47
38
  "dependencies": {
48
- "@elliemae/ds-button-v2": "3.60.0-next.2",
49
- "@elliemae/ds-circular-progress-indicator": "3.60.0-next.2",
50
- "@elliemae/ds-drag-and-drop": "3.60.0-next.2",
51
- "@elliemae/ds-dropdownmenu": "3.60.0-next.2",
52
- "@elliemae/ds-dropdownmenu-v2": "3.60.0-next.2",
53
- "@elliemae/ds-form-checkbox": "3.60.0-next.2",
54
- "@elliemae/ds-form-combobox": "3.60.0-next.2",
55
- "@elliemae/ds-form-date-range-picker": "3.60.0-next.2",
56
- "@elliemae/ds-form-date-time-picker": "3.60.0-next.2",
57
- "@elliemae/ds-form-helpers-mask-hooks": "3.60.0-next.2",
58
- "@elliemae/ds-form-input-text": "3.60.0-next.2",
59
- "@elliemae/ds-form-layout-blocks": "3.60.0-next.2",
60
- "@elliemae/ds-form-radio": "3.60.0-next.2",
61
- "@elliemae/ds-grid": "3.60.0-next.2",
62
- "@elliemae/ds-icons": "3.60.0-next.2",
63
- "@elliemae/ds-menu-button": "3.60.0-next.2",
64
- "@elliemae/ds-pagination": "3.60.0-next.2",
65
- "@elliemae/ds-pills-v2": "3.60.0-next.2",
66
- "@elliemae/ds-popperjs": "3.60.0-next.2",
67
- "@elliemae/ds-props-helpers": "3.60.0-next.2",
68
- "@elliemae/ds-skeleton": "3.60.0-next.2",
69
- "@elliemae/ds-system": "3.60.0-next.2",
70
- "@elliemae/ds-truncated-tooltip-text": "3.60.0-next.2",
71
- "@elliemae/ds-typescript-helpers": "3.60.0-next.2",
72
- "@elliemae/ds-zustand-helpers": "3.60.0-next.2",
73
- "react-virtual": "catalog:",
74
- "uid": "catalog:",
75
- "use-onclickoutside": "catalog:"
39
+ "@elliemae/ds-legacy-dropdownmenu": "1.0.16",
40
+ "react-virtual": "~2.10.4",
41
+ "uid": "^2.0.2",
42
+ "use-onclickoutside": "0.4.1",
43
+ "@elliemae/ds-button-v2": "3.60.0-next.21",
44
+ "@elliemae/ds-circular-progress-indicator": "3.60.0-next.21",
45
+ "@elliemae/ds-drag-and-drop": "3.60.0-next.21",
46
+ "@elliemae/ds-dropdownmenu-v2": "3.60.0-next.21",
47
+ "@elliemae/ds-form-checkbox": "3.60.0-next.21",
48
+ "@elliemae/ds-form-combobox": "3.60.0-next.21",
49
+ "@elliemae/ds-form-date-range-picker": "3.60.0-next.21",
50
+ "@elliemae/ds-form-date-time-picker": "3.60.0-next.21",
51
+ "@elliemae/ds-form-helpers-mask-hooks": "3.60.0-next.21",
52
+ "@elliemae/ds-form-input-text": "3.60.0-next.21",
53
+ "@elliemae/ds-form-layout-blocks": "3.60.0-next.21",
54
+ "@elliemae/ds-form-radio": "3.60.0-next.21",
55
+ "@elliemae/ds-grid": "3.60.0-next.21",
56
+ "@elliemae/ds-menu-button": "3.60.0-next.21",
57
+ "@elliemae/ds-pagination": "3.60.0-next.21",
58
+ "@elliemae/ds-icons": "3.60.0-next.21",
59
+ "@elliemae/ds-pills-v2": "3.60.0-next.21",
60
+ "@elliemae/ds-popperjs": "3.60.0-next.21",
61
+ "@elliemae/ds-props-helpers": "3.60.0-next.21",
62
+ "@elliemae/ds-skeleton": "3.60.0-next.21",
63
+ "@elliemae/ds-system": "3.60.0-next.21",
64
+ "@elliemae/ds-truncated-tooltip-text": "3.60.0-next.21",
65
+ "@elliemae/ds-typescript-helpers": "3.60.0-next.21",
66
+ "@elliemae/ds-zustand-helpers": "3.60.0-next.21"
76
67
  },
77
68
  "devDependencies": {
78
- "@elliemae/ds-monorepo-devops": "3.60.0-next.2",
79
- "@elliemae/ds-test-utils": "3.60.0-next.2",
80
- "@elliemae/ds-toolbar-v2": "3.60.0-next.2",
81
- "@elliemae/pui-cli": "catalog:",
82
- "jest": "catalog:",
83
- "styled-components": "catalog:",
84
- "styled-system": "catalog:"
69
+ "jest": "^30.0.0",
70
+ "styled-components": "~5.3.9",
71
+ "styled-system": "^5.1.5",
72
+ "@elliemae/ds-monorepo-devops": "3.60.0-next.21",
73
+ "@elliemae/ds-test-utils": "3.60.0-next.21",
74
+ "@elliemae/ds-toolbar-v2": "3.60.0-next.21"
85
75
  },
86
76
  "peerDependencies": {
87
- "lodash-es": "catalog:",
88
- "react": "catalog:",
89
- "react-dom": "catalog:",
90
- "styled-components": "catalog:",
91
- "styled-system": "catalog:"
77
+ "lodash-es": "^4.17.21",
78
+ "react": "^18.3.1",
79
+ "react-dom": "^18.3.1",
80
+ "styled-components": "~5.3.9",
81
+ "styled-system": "^5.1.5"
92
82
  },
93
83
  "publishConfig": {
94
84
  "access": "public",
95
85
  "typeSafety": false
96
86
  },
97
- "gitHead": "a9ff7492ac8a5acc283cb1f59cb8c153823b24ec"
98
- }
87
+ "scripts": {
88
+ "dev": "cross-env NODE_ENV=development node ../../../scripts/build/build.mjs --watch",
89
+ "test": "playwright test -c ./playwright.config.mjs && ds-monorepo-devops test --passWithNoTests --coverage=\"false\"",
90
+ "lint": "node ../../../scripts/lint.mjs --fix",
91
+ "lint:strict": "node ../../../scripts/lint-strict.mjs",
92
+ "dts": "node ../../../scripts/dts.mjs",
93
+ "build": "cross-env NODE_ENV=production node ../../../scripts/build/build.mjs",
94
+ "checkDeps": "npx -yes ../../util/ds-codemods check-missing-packages --projectFolderPath=\"./\" --ignorePackagesGlobPattern=\"\" --ignoreFilesGlobPattern=\"**/test-ables/*,**/tests/*\""
95
+ }
96
+ }