@deephaven/components 1.20.0 → 1.21.1

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 (87) hide show
  1. package/dist/AutoResizeTextarea.d.ts +1 -1
  2. package/dist/AutoResizeTextarea.d.ts.map +1 -1
  3. package/dist/AutoResizeTextarea.js +32 -17
  4. package/dist/AutoResizeTextarea.js.map +1 -1
  5. package/dist/dialogs/ActionButtonDialogTrigger.d.ts +1 -1
  6. package/dist/dialogs/ActionButtonDialogTrigger.d.ts.map +1 -1
  7. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  8. package/dist/spectrum/comboBox/ComboBox.d.ts +1 -1
  9. package/dist/spectrum/index.d.ts +1 -0
  10. package/dist/spectrum/index.d.ts.map +1 -1
  11. package/dist/spectrum/index.js +1 -0
  12. package/dist/spectrum/index.js.map +1 -1
  13. package/dist/spectrum/listView/ListView.d.ts +1 -1
  14. package/dist/spectrum/listView/ListView.d.ts.map +1 -1
  15. package/dist/spectrum/listView/ListView.js.map +1 -1
  16. package/dist/spectrum/multiSelect/MultiSelect.css +326 -0
  17. package/dist/spectrum/multiSelect/MultiSelect.css.map +1 -0
  18. package/dist/spectrum/multiSelect/MultiSelect.d.ts +7 -0
  19. package/dist/spectrum/multiSelect/MultiSelect.d.ts.map +1 -0
  20. package/dist/spectrum/multiSelect/MultiSelect.js +445 -0
  21. package/dist/spectrum/multiSelect/MultiSelect.js.map +1 -0
  22. package/dist/spectrum/multiSelect/MultiSelectListBox.d.ts +29 -0
  23. package/dist/spectrum/multiSelect/MultiSelectListBox.d.ts.map +1 -0
  24. package/dist/spectrum/multiSelect/MultiSelectListBox.js +41 -0
  25. package/dist/spectrum/multiSelect/MultiSelectListBox.js.map +1 -0
  26. package/dist/spectrum/multiSelect/MultiSelectNormalized.d.ts +8 -0
  27. package/dist/spectrum/multiSelect/MultiSelectNormalized.d.ts.map +1 -0
  28. package/dist/spectrum/multiSelect/MultiSelectNormalized.js +37 -0
  29. package/dist/spectrum/multiSelect/MultiSelectNormalized.js.map +1 -0
  30. package/dist/spectrum/multiSelect/MultiSelectProps.d.ts +121 -0
  31. package/dist/spectrum/multiSelect/MultiSelectProps.d.ts.map +1 -0
  32. package/dist/spectrum/multiSelect/MultiSelectProps.js +2 -0
  33. package/dist/spectrum/multiSelect/MultiSelectProps.js.map +1 -0
  34. package/dist/spectrum/multiSelect/MultiSelectTag.d.ts +14 -0
  35. package/dist/spectrum/multiSelect/MultiSelectTag.d.ts.map +1 -0
  36. package/dist/spectrum/multiSelect/MultiSelectTag.js +36 -0
  37. package/dist/spectrum/multiSelect/MultiSelectTag.js.map +1 -0
  38. package/dist/spectrum/multiSelect/index.d.ts +4 -0
  39. package/dist/spectrum/multiSelect/index.d.ts.map +1 -0
  40. package/dist/spectrum/multiSelect/index.js +4 -0
  41. package/dist/spectrum/multiSelect/index.js.map +1 -0
  42. package/dist/spectrum/multiSelect/multiSelectUtils.d.ts +53 -0
  43. package/dist/spectrum/multiSelect/multiSelectUtils.d.ts.map +1 -0
  44. package/dist/spectrum/multiSelect/multiSelectUtils.js +166 -0
  45. package/dist/spectrum/multiSelect/multiSelectUtils.js.map +1 -0
  46. package/dist/spectrum/multiSelect/useMultiSelectFilter.d.ts +27 -0
  47. package/dist/spectrum/multiSelect/useMultiSelectFilter.d.ts.map +1 -0
  48. package/dist/spectrum/multiSelect/useMultiSelectFilter.js +51 -0
  49. package/dist/spectrum/multiSelect/useMultiSelectFilter.js.map +1 -0
  50. package/dist/spectrum/multiSelect/useMultiSelectKeyboard.d.ts +40 -0
  51. package/dist/spectrum/multiSelect/useMultiSelectKeyboard.d.ts.map +1 -0
  52. package/dist/spectrum/multiSelect/useMultiSelectKeyboard.js +200 -0
  53. package/dist/spectrum/multiSelect/useMultiSelectKeyboard.js.map +1 -0
  54. package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.d.ts +11 -0
  55. package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.d.ts.map +1 -0
  56. package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.js +44 -0
  57. package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.js.map +1 -0
  58. package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.d.ts +21 -0
  59. package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.d.ts.map +1 -0
  60. package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.js +83 -0
  61. package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.js.map +1 -0
  62. package/dist/spectrum/multiSelect/useMultiSelectScrollListener.d.ts +17 -0
  63. package/dist/spectrum/multiSelect/useMultiSelectScrollListener.d.ts.map +1 -0
  64. package/dist/spectrum/multiSelect/useMultiSelectScrollListener.js +55 -0
  65. package/dist/spectrum/multiSelect/useMultiSelectScrollListener.js.map +1 -0
  66. package/dist/spectrum/multiSelect/useMultiSelectState.d.ts +26 -0
  67. package/dist/spectrum/multiSelect/useMultiSelectState.d.ts.map +1 -0
  68. package/dist/spectrum/multiSelect/useMultiSelectState.js +67 -0
  69. package/dist/spectrum/multiSelect/useMultiSelectState.js.map +1 -0
  70. package/dist/spectrum/overlays.d.ts +1 -1
  71. package/dist/spectrum/overlays.d.ts.map +1 -1
  72. package/dist/spectrum/overlays.js.map +1 -1
  73. package/dist/spectrum/picker/Picker.d.ts +1 -1
  74. package/dist/spectrum/picker/PickerProps.d.ts +1 -1
  75. package/dist/spectrum/picker/PickerProps.d.ts.map +1 -1
  76. package/dist/spectrum/picker/PickerProps.js.map +1 -1
  77. package/dist/spectrum/picker/usePickerProps.js +1 -1
  78. package/dist/spectrum/picker/usePickerProps.js.map +1 -1
  79. package/dist/spectrum/utils/itemWrapperUtils.d.ts +1 -1
  80. package/dist/spectrum/utils/itemWrapperUtils.d.ts.map +1 -1
  81. package/dist/spectrum/utils/itemWrapperUtils.js +3 -0
  82. package/dist/spectrum/utils/itemWrapperUtils.js.map +1 -1
  83. package/dist/spectrum/utils/themeUtils.d.ts +3 -3
  84. package/dist/spectrum/utils/useStringifiedMultiSelection.d.ts.map +1 -1
  85. package/dist/spectrum/utils/useStringifiedMultiSelection.js +12 -1
  86. package/dist/spectrum/utils/useStringifiedMultiSelection.js.map +1 -1
  87. package/package.json +18 -11
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../src/spectrum/multiSelect/MultiSelect.scss"],"names":[],"mappings":"AAAA;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;EACE;;AAGF;EACE;EACA;;AAEA;EACE;;AAOJ;EACE;;AAGF;EACE;;AAEA;EACE;;AAMN;EACE;;AAKA;EACE;;AAMF;EACE;;AAOA;EACE;;AAMF;EACE;;AAQF;EACE;;AAMF;EACE;;AAQF;EACE;;AAGF;EACE;;AAMN;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAEA;EACE;;AAMN;EACE;;AAIF;EACE;EACA;EACA;;AAQA;EACE;EACA;EAEA;;AAIA;EACE;;AAGF;EACE;;AAEA;EACE;;AAMJ;EACE;;AAGF;EACE;;AAGF;EACE;;AAKJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAOJ;EACE;;AAEA;EACE;;AAMF;EACE;;AAMF;EACE;;AAOA;EACE;;AAMF;EACE;;AAQF;EACE;;AAMF;EACE;;AASF;EACE;;AAGF;EACE;;;AAQV;EACE;EACA;EACA;EACA;EACA;EAGA;EAYA;;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;EAIA;EACA;EAIA;EAIA;EACA;EAIA;EAIA;EAIA,YACE;;AAKF;EACE;EAIA;EAIA;;AAMF;EACE;EAIA;EAIA;EAIA;;;AAKJ;EACE;EACA;EACA;EACA;EAOA;;AAGA;EACE;;;AAQJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAUA;;AAEA;EACE;;AAOF;EACE;EACA;;;AAKJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,YACE;;AAIF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIF;EACE;EAIA;;AAKA;EACE;;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;EACA;EACA;EAIA;EAIA;;;AAOF;EACE;EACA;EACA;EAEA;EACA;;;AAKF;EACE;EACA","file":"MultiSelect.css","sourcesContent":["/* stylelint-disable no-descending-specificity */\n.dh-multi-select-trigger {\n display: flex;\n align-items: stretch;\n border: none;\n border-radius: var(--spectrum-alias-border-radius-regular, 4px);\n background-color: var(--dh-color-input-bg);\n color: var(--dh-color-input-fg);\n cursor: pointer;\n outline: none;\n position: relative;\n min-height: var(\n --spectrum-alias-single-line-height,\n var(--spectrum-global-dimension-size-400, 32px)\n );\n\n // Visual border via ::after: paints on top of all children (including chevron)\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--dh-color-input-border);\n border-radius: var(--spectrum-alias-border-radius-regular, 4px);\n pointer-events: none;\n transition: border-color 130ms ease-in-out;\n }\n\n // Hover state: :not(.is-focused) ensures focus styles take precedence\n &:hover:not(.is-disabled):not(.is-read-only):not(.is-focused) {\n &::after {\n border-color: var(--dh-color-input-hover-border);\n }\n\n .dh-multi-select-chevron {\n color: var(--dh-color-selector-hover-fg);\n background-color: var(--dh-color-selector-hover-bg);\n\n &::before {\n border-left-color: var(--dh-color-input-hover-border);\n }\n }\n }\n\n // Focus state: applied by FocusRing `focusClass`\n &.is-focused {\n &::after {\n border-color: var(--dh-color-input-focus-border);\n }\n\n .dh-multi-select-chevron:not(.is-open) {\n background-color: var(--dh-color-selector-hover-bg);\n\n &::before {\n border-left-color: var(--dh-color-input-focus-border);\n }\n }\n }\n\n // Focus ring: applied by FocusRing `focusRingClass`\n &.focus-ring {\n box-shadow: 0 0 0 1px var(--dh-color-input-focus-border);\n }\n\n // Invalid state: outer border + chevron divider red.\n &.is-invalid {\n &::after {\n border-color: var(\n --spectrum-textfield-border-color-error,\n var(--spectrum-red-900)\n );\n }\n\n .dh-multi-select-chevron::before {\n border-left-color: var(\n --spectrum-textfield-border-color-error,\n var(--spectrum-red-900)\n );\n }\n\n &:hover:not(.is-disabled):not(.is-read-only):not(.is-focused) {\n &::after {\n border-color: var(\n --spectrum-textfield-border-color-error-hover,\n var(--spectrum-red-1000)\n );\n }\n\n .dh-multi-select-chevron::before {\n border-left-color: var(\n --spectrum-textfield-border-color-error-hover,\n var(--spectrum-red-1000)\n );\n }\n }\n\n &:active:not(.is-disabled):not(.is-read-only) {\n &::after {\n border-color: var(\n --spectrum-textfield-border-color-error-down,\n var(--spectrum-red-1100)\n );\n }\n\n .dh-multi-select-chevron::before {\n border-left-color: var(\n --spectrum-textfield-border-color-error-down,\n var(--spectrum-red-1100)\n );\n }\n }\n\n &.is-focused {\n &::after {\n border-color: var(--dh-color-input-focus-border);\n }\n\n .dh-multi-select-chevron::before {\n border-left-color: var(--dh-color-input-focus-border);\n }\n }\n }\n\n // Disabled state\n &.is-disabled {\n background-color: var(--dh-color-input-disabled-bg);\n color: var(--dh-color-input-disabled-fg);\n cursor: default;\n\n &::after {\n border-color: var(--dh-color-input-disabled-border);\n }\n\n .dh-multi-select-chevron {\n color: var(--dh-color-selector-disabled-fg);\n background-color: var(--dh-color-input-disabled-bg);\n\n &::before {\n border-left-color: var(--dh-color-input-disabled-border);\n }\n }\n }\n\n // Read-only state\n &.is-read-only {\n cursor: default;\n }\n\n // Quiet variant: matches Spectrum ComboBox quiet\n &.is-quiet {\n background: none;\n border-radius: 0;\n min-width: calc(\n 2 *\n var(\n --spectrum-dropdown-height,\n var(--spectrum-global-dimension-size-400, 32px)\n )\n );\n\n &::after {\n border: none;\n border-bottom: var(--spectrum-alias-input-border-size, 1px) solid\n var(--dh-color-input-border);\n border-radius: 0;\n }\n\n &:hover:not(.is-disabled):not(.is-read-only):not(.is-focused) {\n &::after {\n border-bottom-color: var(--dh-color-input-hover-border);\n }\n\n .dh-multi-select-chevron {\n background-color: transparent;\n\n &::before {\n border-bottom-color: var(--dh-color-input-hover-border);\n }\n }\n }\n\n &.is-focused {\n &::after {\n border-bottom-color: var(--dh-color-input-focus-border);\n }\n\n .dh-multi-select-chevron:not(.is-open) {\n background-color: transparent;\n }\n\n .dh-multi-select-chevron::before {\n border-bottom-color: var(--dh-color-input-focus-border);\n }\n }\n\n // Quiet focus ring for bottom-only line (not full outline)\n &.focus-ring {\n box-shadow: 0 2px 0 0 var(--dh-color-input-focus-border);\n }\n\n .dh-multi-select-chevron {\n inline-size: auto;\n padding-inline-start: var(--spectrum-global-dimension-size-130, 10px);\n padding-inline-end: 0;\n background-color: transparent;\n border-radius: 0;\n\n // Bottom border continuation instead of left separator\n &::before {\n border-left: none;\n border-bottom: var(--spectrum-alias-input-border-size, 1px) solid\n var(--dh-color-input-border);\n border-radius: 0;\n top: auto;\n bottom: 0;\n left: 0;\n right: 0;\n width: auto;\n height: 0;\n }\n\n &.is-open {\n background-color: var(\n --spectrum-alias-background-color-transparent,\n transparent\n );\n }\n }\n\n &.is-disabled .dh-multi-select-chevron {\n border-radius: 0;\n\n &::before {\n border-bottom-color: var(--dh-color-input-disabled-border);\n }\n }\n\n // Invalid quiet variant: bottom borders red.\n &.is-invalid {\n &::after {\n border-bottom-color: var(\n --spectrum-textfield-border-color-error,\n var(--spectrum-red-900)\n );\n }\n\n .dh-multi-select-chevron::before {\n border-bottom-color: var(\n --spectrum-textfield-border-color-error,\n var(--spectrum-red-900)\n );\n }\n\n &:hover:not(.is-disabled):not(.is-read-only):not(.is-focused) {\n &::after {\n border-bottom-color: var(\n --spectrum-textfield-border-color-error-hover,\n var(--spectrum-red-1000)\n );\n }\n\n .dh-multi-select-chevron::before {\n border-bottom-color: var(\n --spectrum-textfield-border-color-error-hover,\n var(--spectrum-red-1000)\n );\n }\n }\n\n &:active:not(.is-disabled):not(.is-read-only) {\n &::after {\n border-bottom-color: var(\n --spectrum-textfield-border-color-error-down,\n var(--spectrum-red-1100)\n );\n }\n\n .dh-multi-select-chevron::before {\n border-bottom-color: var(\n --spectrum-textfield-border-color-error-down,\n var(--spectrum-red-1100)\n );\n }\n }\n\n // Focus overrides red (specificity boost via &.is-invalid).\n &.is-focused {\n &::after {\n border-bottom-color: var(--dh-color-input-focus-border);\n }\n\n .dh-multi-select-chevron::before {\n border-bottom-color: var(--dh-color-input-focus-border);\n }\n }\n }\n }\n}\n\n// Content area tags + input wrapping flow.\n.dh-multi-select-content {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n flex: 1;\n min-width: 0;\n // Half Spectrum's tag-group gap tokens: container gap is single-spaced, while\n // Spectrum's per-tag margins double up between adjacent items.\n gap: calc(\n var(\n --spectrum-taggroup-tag-gap-y,\n var(--spectrum-global-dimension-size-100)\n ) / 2\n )\n calc(\n var(\n --spectrum-taggroup-tag-gap-x,\n var(--spectrum-global-dimension-size-100)\n ) / 2\n );\n padding: 3px 0 3px 4px;\n}\n\n// Custom tag chip: matches Spectrum .spectrum-Tag exactly.\n.dh-multi-select-tag {\n display: inline-grid;\n grid-template-columns: 1fr auto;\n align-items: center;\n box-sizing: border-box;\n max-inline-size: 100%;\n cursor: default;\n user-select: none;\n block-size: var(\n --spectrum-tag-height,\n var(--spectrum-global-dimension-size-300)\n );\n padding-inline-start: calc(\n var(--spectrum-tag-padding-x, var(--spectrum-global-dimension-size-125)) -\n var(--spectrum-tag-border-size, var(--spectrum-alias-border-size-thin))\n );\n border-style: solid;\n border-width: var(\n --spectrum-tag-border-size,\n var(--spectrum-alias-border-size-thin)\n );\n border-radius: var(\n --spectrum-tag-border-radius,\n var(--spectrum-alias-border-radius-regular)\n );\n color: var(--spectrum-tag-text-color, var(--spectrum-global-color-gray-700));\n background-color: var(\n --spectrum-tag-background-color,\n var(--spectrum-global-color-gray-75)\n );\n border-color: var(\n --spectrum-tag-border-color,\n var(--spectrum-global-color-gray-600)\n );\n font-size: var(\n --spectrum-tag-text-size,\n var(--spectrum-global-dimension-font-size-75)\n );\n transition:\n border-color 0.13s ease-in-out,\n color 0.13s ease-in-out,\n box-shadow 0.13s ease-in-out,\n background-color 0.13s ease-in-out;\n\n &:hover {\n background-color: var(\n --spectrum-tag-background-color-hover,\n var(--spectrum-global-color-gray-75)\n );\n color: var(\n --spectrum-tag-text-color-hover,\n var(--spectrum-global-color-gray-900)\n );\n border-color: var(\n --spectrum-tag-border-color-hover,\n var(--spectrum-global-color-gray-900)\n );\n }\n\n .is-disabled & {\n color: var(\n --spectrum-tag-text-color-disabled,\n var(--spectrum-global-color-gray-500)\n );\n background-color: var(\n --spectrum-tag-background-color-disabled,\n var(--spectrum-global-color-gray-200)\n );\n border-color: var(\n --spectrum-tag-border-color-disabled,\n var(--spectrum-global-color-gray-200)\n );\n pointer-events: none;\n }\n}\n\n// Tag label: matches Spectrum .spectrum-Tag-content\n.dh-multi-select-tag-label {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n line-height: calc(\n var(--spectrum-tag-height, var(--spectrum-global-dimension-size-300)) -\n calc(\n var(--spectrum-tag-border-size, var(--spectrum-alias-border-size-thin)) *\n 2\n )\n );\n margin-inline-end: 0;\n\n // When there's no remove button, add end padding to match Spectrum.\n &:last-child {\n margin-inline-end: var(\n --spectrum-tag-padding-x,\n var(--spectrum-global-dimension-size-125)\n );\n }\n}\n\n// Tag remove button: matches Spectrum .spectrum-Tag-removeButton dimensions\n.dh-multi-select-tag-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: inherit;\n height: calc(\n var(--spectrum-tag-height, var(--spectrum-global-dimension-size-300)) -\n (\n 2 *\n var(\n --spectrum-tag-border-size,\n var(--spectrum-alias-border-size-thin)\n )\n )\n );\n width: var(--spectrum-global-dimension-size-300);\n\n &:hover {\n color: var(\n --spectrum-tag-removable-button-icon-color-hover,\n var(--spectrum-global-color-gray-900)\n );\n }\n\n // Scale down the CrossSmall icon to fit the tag\n svg {\n width: 8px;\n height: 8px;\n }\n}\n\n// Inline filter input: fills remaining space on the last row of tags.\n.dh-multi-select-input {\n border: none;\n outline: none;\n background: transparent;\n color: var(--dh-color-input-fg);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n flex: 1;\n min-width: 40px;\n padding: 2px 0 2px 4px;\n // Match tag height so input aligns with tags on the same row\n height: var(--spectrum-tag-height, var(--spectrum-global-dimension-size-300));\n\n &:disabled {\n color: var(--dh-color-input-disabled-fg);\n cursor: default;\n }\n}\n\n.dh-multi-select-chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--spectrum-global-dimension-size-400, 32px);\n flex-shrink: 0;\n align-self: stretch;\n box-sizing: border-box;\n position: relative;\n padding: var(--spectrum-combobox-fieldbutton-inset, 0);\n background-color: var(--dh-color-selector-bg);\n background-clip: content-box;\n color: var(--dh-color-selector-fg);\n border-radius: 0 calc(var(--spectrum-alias-border-radius-regular, 4px) - 1px)\n calc(var(--spectrum-alias-border-radius-regular, 4px) - 1px) 0;\n transition:\n background-color 130ms ease-in-out,\n color 130ms ease-in-out;\n\n // Left separator line via pseudo-element (matches Spectrum FieldButton pattern)\n &::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 0;\n border-left: 1px solid var(--dh-color-input-border);\n pointer-events: none;\n }\n\n // Active/open state: matches Spectrum FieldButton is-active.\n &.is-open {\n background-color: var(\n --spectrum-fieldbutton-background-color-down,\n var(--spectrum-global-color-gray-200)\n );\n color: var(\n --spectrum-fieldbutton-icon-color-down,\n var(--spectrum-alias-icon-color-down)\n );\n\n &::before {\n border-left-color: var(\n --spectrum-fieldbutton-border-color-down,\n var(--spectrum-alias-border-color-down)\n );\n }\n }\n}\n\n// Validation icon shown left of chevron when validationState=\"invalid\".\n.dh-multi-select-invalid-icon {\n display: flex;\n align-items: center;\n padding-inline-start: var(--spectrum-global-dimension-size-100, 8px);\n padding-inline-end: var(--spectrum-global-dimension-size-100, 8px);\n color: var(--spectrum-semantic-negative-color-icon);\n flex-shrink: 0;\n}\n\n// Mirrors Spectrum ComboBox .no-results rule.\n.dh-multi-select-empty {\n display: block;\n padding-top: var(--spectrum-selectlist-option-padding-height);\n padding-inline-start: var(\n --spectrum-selectlist-option-padding,\n var(--spectrum-global-dimension-static-size-150)\n );\n font-size: var(\n --spectrum-selectlist-option-text-size,\n var(--spectrum-alias-font-size-default)\n );\n font-weight: var(\n --spectrum-selectlist-option-text-font-weight,\n var(--spectrum-global-font-weight-regular)\n );\n}\n\n// Inline loading spinner.\n.dh-multi-select-loading-circle {\n display: flex;\n align-items: center;\n justify-content: center;\n // Inset to align with single-select spinner position.\n padding-inline-end: 8px;\n padding-inline-start: 4px;\n}\n\n// Virtual focus highlight (keyboard nav). Popover lives in a portal,\n// so the selector is unscoped.\n[role='option'][data-dh-focused='true'] {\n background-color: var(--dh-color-item-list-hover-bg);\n border-inline-start-color: var(\n --spectrum-selectlist-option-focus-indicator-color,\n var(--spectrum-alias-border-color-focus)\n );\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { type MultiSelectProps } from './MultiSelectProps';
3
+ import './MultiSelect.scss';
4
+ /** Forwarded-ref wrapper. Trigger is a <div>, matching Picker's DOMRef shape. */
5
+ export declare const MultiSelect: React.ForwardRefExoticComponent<MultiSelectProps & React.RefAttributes<HTMLDivElement>>;
6
+ export default MultiSelect;
7
+ //# sourceMappingURL=MultiSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/spectrum/multiSelect/MultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8C,MAAM,OAAO,CAAC;AAgBnE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAa3D,OAAO,oBAAoB,CAAC;AAkf5B,iFAAiF;AACjF,eAAO,MAAM,WAAW,yFAAqC,CAAC;AAG9D,eAAe,WAAW,CAAC"}
@@ -0,0 +1,445 @@
1
+ var _excluded = ["children", "tooltip", "selectedKeys", "defaultSelectedKeys", "disabledKeys", "onChange", "onSelectionChange", "onOpenChange", "onScroll", "label", "description", "errorMessage", "isRequired", "isDisabled", "isReadOnly", "validationState", "isQuiet", "labelPosition", "labelAlign", "necessityIndicator", "contextualHelp", "inputValue", "defaultInputValue", "onInputChange", "shouldFocusWrap", "loadingState", "menuTrigger", "align", "direction", "shouldFlip", "menuWidth", "allowsCustomValue", "formValue", "validationBehavior", "autoFocus", "name", "id", "isHidden", "onFocus", "onBlur", "onFocusChange", "onKeyDown", "onKeyUp", "onSearchTextChange", "selectedItemLabels", "UNSAFE_className", "aria-label", "aria-labelledby", "aria-describedby", "aria-details"];
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
8
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
9
+ import React, { useCallback, useId, useMemo, useRef } from 'react';
10
+ import { Field } from '@react-spectrum/label';
11
+ import { FocusRing } from '@react-aria/focus';
12
+ import { Popover } from '@react-spectrum/overlays';
13
+ import { useUnwrapDOMRef } from '@react-spectrum/utils';
14
+ import { useOverlayTriggerState } from '@react-stately/overlays';
15
+ import ChevronDownMedium from '@spectrum-icons/ui/ChevronDownMedium';
16
+ import AlertMedium from '@spectrum-icons/ui/AlertMedium';
17
+ import { ProgressCircle } from '@adobe/react-spectrum';
18
+ import cl from 'classnames';
19
+ import { EMPTY_FUNCTION, ensureArray } from '@deephaven/utils';
20
+ import { useMergeRef } from '@deephaven/react-hooks';
21
+ import { normalizeTooltipOptions, wrapItemChildren } from "../utils/index.js";
22
+ import { flattenJsxChildren, flattenEntriesToItems } from "./multiSelectUtils.js";
23
+ import { useMultiSelectState } from "./useMultiSelectState.js";
24
+ import { useMultiSelectFilter } from "./useMultiSelectFilter.js";
25
+ import { useMultiSelectKeyboard } from "./useMultiSelectKeyboard.js";
26
+ import { useMultiSelectLoadingSpinner } from "./useMultiSelectLoadingSpinner.js";
27
+ import { useMultiSelectScrollListener } from "./useMultiSelectScrollListener.js";
28
+ import { MultiSelectTag } from "./MultiSelectTag.js";
29
+ import { MultiSelectListBox } from "./MultiSelectListBox.js";
30
+ import "./MultiSelect.css";
31
+ /**
32
+ * Convert a Spectrum dimension value (e.g. `"size-3000"`) to its CSS variable
33
+ * form. Numbers are converted to px. Already-valid CSS strings pass through.
34
+ */
35
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
36
+ function toCssDimension(value) {
37
+ if (value == null) {
38
+ return undefined;
39
+ }
40
+ if (typeof value === 'number') {
41
+ return "".concat(value, "px");
42
+ }
43
+ if (/^(size|static-size)-/.test(value)) {
44
+ return "var(--spectrum-global-dimension-".concat(value, ")");
45
+ }
46
+ return value;
47
+ }
48
+
49
+ /**
50
+ * Multi-select styled to match Spectrum ComboBox. Renders selected items as
51
+ * tags inside the trigger area alongside a filter input. Accepts the same
52
+ * `Item` / `Section` JSX children as `Picker`.
53
+ */
54
+ function MultiSelectInner(props, forwardedRef) {
55
+ var _ref2, _toCssDimension, _triggerRef$current2;
56
+ var {
57
+ children,
58
+ tooltip = true,
59
+ selectedKeys: propSelectedKeys,
60
+ defaultSelectedKeys,
61
+ disabledKeys: propDisabledKeys,
62
+ onChange: propOnChange,
63
+ onSelectionChange: propOnSelectionChange,
64
+ onOpenChange,
65
+ onScroll = EMPTY_FUNCTION,
66
+ label,
67
+ description,
68
+ errorMessage,
69
+ isRequired = false,
70
+ isDisabled = false,
71
+ isReadOnly = false,
72
+ validationState,
73
+ isQuiet = false,
74
+ labelPosition = 'top',
75
+ labelAlign,
76
+ necessityIndicator,
77
+ contextualHelp,
78
+ inputValue: controlledInputValue,
79
+ defaultInputValue = '',
80
+ onInputChange,
81
+ shouldFocusWrap = false,
82
+ loadingState,
83
+ menuTrigger = 'input',
84
+ align = 'start',
85
+ direction = 'bottom',
86
+ shouldFlip = true,
87
+ menuWidth,
88
+ allowsCustomValue = false,
89
+ formValue = 'key',
90
+ validationBehavior = 'aria',
91
+ autoFocus = false,
92
+ name,
93
+ id,
94
+ isHidden = false,
95
+ onFocus,
96
+ onBlur,
97
+ onFocusChange,
98
+ onKeyDown,
99
+ onKeyUp,
100
+ onSearchTextChange,
101
+ selectedItemLabels,
102
+ UNSAFE_className,
103
+ 'aria-label': ariaLabel,
104
+ 'aria-labelledby': ariaLabelledby,
105
+ 'aria-describedby': ariaDescribedby,
106
+ 'aria-details': ariaDetails
107
+ } = props,
108
+ styleProps = _objectWithoutProperties(props, _excluded);
109
+
110
+ // Spectrum's onOpenChange omits the trigger reason; relay it via ref.
111
+ var lastTriggerReasonRef = useRef(undefined);
112
+ var handleOverlayOpenChange = useCallback(isOpen => {
113
+ onOpenChange === null || onOpenChange === void 0 || onOpenChange(isOpen, lastTriggerReasonRef.current);
114
+ }, [onOpenChange]);
115
+ var overlayState = useOverlayTriggerState({
116
+ onOpenChange: handleOverlayOpenChange
117
+ });
118
+ var openOverlay = useCallback(reason => {
119
+ lastTriggerReasonRef.current = reason;
120
+ overlayState.open();
121
+ }, [overlayState]);
122
+ var closeOverlay = useCallback(() => {
123
+ lastTriggerReasonRef.current = undefined;
124
+ overlayState.close();
125
+ }, [overlayState]);
126
+ var listBoxId = useId();
127
+ var placement = "".concat(direction, " ").concat(align);
128
+ var triggerRef = useRef(null);
129
+ var inputRef = useRef(null);
130
+ var popoverRef = useRef(null);
131
+ var unwrappedPopoverRef = useUnwrapDOMRef(popoverRef);
132
+ var listBoxRef = useRef(null);
133
+ var unwrappedListBoxRef = useUnwrapDOMRef(listBoxRef);
134
+ var isFocusedRef = useRef(false);
135
+ var mergedTriggerRef = useMergeRef(triggerRef, forwardedRef);
136
+
137
+ // Ensures Item/ItemContent wrapping for tooltips/overflow.
138
+ var tooltipOptions = useMemo(() => normalizeTooltipOptions(tooltip), [tooltip]);
139
+ var wrappedChildren = useMemo(() => ensureArray(wrapItemChildren(children, tooltipOptions)), [children, tooltipOptions]);
140
+
141
+ // Flat {key,label} entries for filter/keyboard hooks. ListBox renders JSX directly.
142
+ var allEntries = useMemo(() => flattenJsxChildren(wrappedChildren), [wrappedChildren]);
143
+ var allItems = useMemo(() => flattenEntriesToItems(allEntries), [allEntries]);
144
+ var allKeys = useMemo(() => allItems.map(i => i.key), [allItems]);
145
+
146
+ // Persistent label cache: accumulates labels from items as they appear in
147
+ // children. When server-side search filters items out of the children, the
148
+ // cache ensures tags still display the correct label.
149
+ var labelCacheRef = useRef(new Map());
150
+ var itemLabelMap = useMemo(() => {
151
+ var cache = labelCacheRef.current;
152
+ allItems.forEach(i => cache.set(i.key, i.label));
153
+ return new Map(cache);
154
+ }, [allItems]);
155
+ var getLabelFor = useCallback(key => {
156
+ var _ref, _itemLabelMap$get;
157
+ return (_ref = (_itemLabelMap$get = itemLabelMap.get(key)) !== null && _itemLabelMap$get !== void 0 ? _itemLabelMap$get : selectedItemLabels === null || selectedItemLabels === void 0 ? void 0 : selectedItemLabels.get(key)) !== null && _ref !== void 0 ? _ref : key;
158
+ }, [itemLabelMap, selectedItemLabels]);
159
+ var {
160
+ searchText,
161
+ setSearchText,
162
+ filteredItems,
163
+ filteredJsxChildren
164
+ } = useMultiSelectFilter({
165
+ allEntries,
166
+ wrappedChildren,
167
+ inputValue: controlledInputValue,
168
+ defaultInputValue,
169
+ onInputChange,
170
+ onSearchTextChange
171
+ });
172
+ var emptyMessage = useMemo(() => {
173
+ if (filteredItems.length > 0) {
174
+ return undefined;
175
+ }
176
+ if (loadingState === 'loading') {
177
+ return 'Loading...';
178
+ }
179
+ // loadingMore + empty: defer to ListBox's loader pill instead of "No results".
180
+ if (loadingState === 'loadingMore') {
181
+ return undefined;
182
+ }
183
+ return 'No results';
184
+ }, [filteredItems.length, loadingState]);
185
+ var {
186
+ selectedKeys,
187
+ selectedKeyArray,
188
+ listBoxDisabledKeys,
189
+ toggleKey,
190
+ applyListBoxSelection
191
+ } = useMultiSelectState({
192
+ selectedKeys: propSelectedKeys,
193
+ defaultSelectedKeys,
194
+ disabledKeys: propDisabledKeys,
195
+ onChange: propOnChange,
196
+ onSelectionChange: propOnSelectionChange,
197
+ allKeys
198
+ });
199
+ var {
200
+ handleInputKeyDown
201
+ } = useMultiSelectKeyboard({
202
+ filteredItems,
203
+ allItems,
204
+ shouldFocusWrap,
205
+ overlayState,
206
+ openOverlay,
207
+ closeOverlay,
208
+ isReadOnly,
209
+ isDisabled,
210
+ searchText,
211
+ setSearchText,
212
+ selectedKeys,
213
+ toggleKey,
214
+ allowsCustomValue,
215
+ menuTrigger,
216
+ onKeyDown,
217
+ listBoxContainerRef: unwrappedListBoxRef,
218
+ inputRef
219
+ });
220
+ useMultiSelectScrollListener({
221
+ containerRef: unwrappedListBoxRef,
222
+ isOpen: overlayState.isOpen,
223
+ onScroll
224
+ });
225
+ var shouldShowInlineSpinner = useMultiSelectLoadingSpinner({
226
+ loadingState,
227
+ searchText,
228
+ isOpen: overlayState.isOpen,
229
+ menuTrigger
230
+ });
231
+ var refocusInput = useCallback(() => {
232
+ requestAnimationFrame(() => {
233
+ var _inputRef$current;
234
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.focus();
235
+ });
236
+ }, []);
237
+ var handleTagRemove = useCallback(key => {
238
+ toggleKey(key);
239
+ refocusInput();
240
+ }, [toggleKey, refocusInput]);
241
+ var handleListBoxSelectionChange = useCallback(selection => {
242
+ if (isReadOnly) {
243
+ return;
244
+ }
245
+ applyListBoxSelection(selection, filteredItems);
246
+ refocusInput();
247
+ }, [isReadOnly, applyListBoxSelection, filteredItems, refocusInput]);
248
+ var handleInputFocus = useCallback(e => {
249
+ if (isFocusedRef.current) {
250
+ return;
251
+ }
252
+ isFocusedRef.current = true;
253
+ if (menuTrigger === 'focus' && !overlayState.isOpen && !isDisabled) {
254
+ openOverlay('focus');
255
+ }
256
+ onFocus === null || onFocus === void 0 || onFocus(e);
257
+ onFocusChange === null || onFocusChange === void 0 || onFocusChange(true);
258
+ }, [onFocus, onFocusChange, menuTrigger, overlayState, isDisabled, openOverlay]);
259
+ var handleInputBlur = useCallback(e => {
260
+ var related = e.relatedTarget;
261
+ if (related != null) {
262
+ if (triggerRef.current != null && triggerRef.current.contains(related)) {
263
+ return;
264
+ }
265
+ if (unwrappedPopoverRef.current != null && unwrappedPopoverRef.current.contains(related)) {
266
+ return;
267
+ }
268
+ } else {
269
+ // relatedTarget can be null when clicking non-focusable content.
270
+ // Use rAF to check if focus moved back into the component.
271
+ requestAnimationFrame(() => {
272
+ var active = document.activeElement;
273
+ if (active != null && (triggerRef.current != null && triggerRef.current.contains(active) || unwrappedPopoverRef.current != null && unwrappedPopoverRef.current.contains(active))) {
274
+ return;
275
+ }
276
+ isFocusedRef.current = false;
277
+ if (overlayState.isOpen) {
278
+ closeOverlay();
279
+ }
280
+ onBlur === null || onBlur === void 0 || onBlur(e);
281
+ onFocusChange === null || onFocusChange === void 0 || onFocusChange(false);
282
+ });
283
+ return;
284
+ }
285
+ isFocusedRef.current = false;
286
+ if (overlayState.isOpen) {
287
+ closeOverlay();
288
+ }
289
+ onBlur === null || onBlur === void 0 || onBlur(e);
290
+ onFocusChange === null || onFocusChange === void 0 || onFocusChange(false);
291
+ }, [onBlur, onFocusChange, overlayState, closeOverlay, unwrappedPopoverRef]);
292
+ var handleTriggerAreaClick = useCallback(() => {
293
+ var _inputRef$current2;
294
+ if (isDisabled) {
295
+ return;
296
+ }
297
+ if (!overlayState.isOpen) {
298
+ openOverlay('manual');
299
+ }
300
+ (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 || _inputRef$current2.focus();
301
+ }, [isDisabled, overlayState, openOverlay]);
302
+ var handleChevronClick = useCallback(e => {
303
+ var _inputRef$current3;
304
+ // Stop trigger-area handler from re-opening the popover on close.
305
+ e.stopPropagation();
306
+ if (isDisabled) {
307
+ return;
308
+ }
309
+ if (overlayState.isOpen) {
310
+ closeOverlay();
311
+ } else {
312
+ openOverlay('manual');
313
+ }
314
+ (_inputRef$current3 = inputRef.current) === null || _inputRef$current3 === void 0 || _inputRef$current3.focus();
315
+ }, [isDisabled, overlayState, openOverlay, closeOverlay]);
316
+ return /*#__PURE__*/_jsx(Field
317
+ // eslint-disable-next-line react/jsx-props-no-spreading
318
+ , _objectSpread(_objectSpread({}, styleProps), {}, {
319
+ label: label,
320
+ description: description,
321
+ errorMessage: validationState === 'invalid' ? errorMessage : undefined,
322
+ isRequired: isRequired,
323
+ isDisabled: isDisabled,
324
+ validationState: validationState,
325
+ labelPosition: labelPosition,
326
+ labelAlign: labelAlign,
327
+ necessityIndicator: necessityIndicator,
328
+ contextualHelp: contextualHelp,
329
+ wrapperClassName: cl('dh-multi-select', UNSAFE_className),
330
+ children: /*#__PURE__*/_jsxs("div", {
331
+ style: isHidden ? {
332
+ display: 'none'
333
+ } : undefined,
334
+ children: [/*#__PURE__*/_jsx(FocusRing, {
335
+ within: true,
336
+ focusRingClass: "focus-ring",
337
+ focusClass: "is-focused",
338
+ children: /*#__PURE__*/_jsxs("div", {
339
+ ref: mergedTriggerRef,
340
+ id: id,
341
+ onClick: handleTriggerAreaClick,
342
+ className: cl('dh-multi-select-trigger', {
343
+ 'is-disabled': isDisabled,
344
+ 'is-read-only': isReadOnly,
345
+ 'is-quiet': isQuiet,
346
+ 'is-invalid': validationState === 'invalid'
347
+ }),
348
+ children: [/*#__PURE__*/_jsxs("div", {
349
+ className: "dh-multi-select-content",
350
+ children: [selectedKeyArray.map(key => /*#__PURE__*/_jsx(MultiSelectTag, {
351
+ tagKey: key,
352
+ label: getLabelFor(key),
353
+ isDisabled: isDisabled,
354
+ isReadOnly: isReadOnly,
355
+ onRemove: handleTagRemove
356
+ }, key)), /*#__PURE__*/_jsx("input", {
357
+ ref: inputRef,
358
+ className: "dh-multi-select-input",
359
+ value: searchText,
360
+ onChange: e => setSearchText(e.target.value),
361
+ onFocus: handleInputFocus,
362
+ onBlur: handleInputBlur,
363
+ onKeyDown: handleInputKeyDown,
364
+ onKeyUp: onKeyUp,
365
+ disabled: isDisabled,
366
+ readOnly: isReadOnly
367
+ // eslint-disable-next-line jsx-a11y/no-autofocus
368
+ ,
369
+ autoFocus: autoFocus,
370
+ role: "combobox",
371
+ "aria-haspopup": "listbox",
372
+ "aria-expanded": overlayState.isOpen,
373
+ "aria-controls": overlayState.isOpen ? listBoxId : undefined,
374
+ "aria-autocomplete": "list",
375
+ "aria-label": ariaLabel,
376
+ "aria-labelledby": ariaLabelledby,
377
+ "aria-describedby": ariaDescribedby,
378
+ "aria-details": ariaDetails
379
+ })]
380
+ }), shouldShowInlineSpinner && /*#__PURE__*/_jsx("div", {
381
+ className: "dh-multi-select-loading-circle",
382
+ children: /*#__PURE__*/_jsx(ProgressCircle, {
383
+ "aria-label": "Loading",
384
+ isIndeterminate: true,
385
+ size: "S"
386
+ })
387
+ }), validationState === 'invalid' && !isDisabled && /*#__PURE__*/_jsx("div", {
388
+ className: "dh-multi-select-invalid-icon",
389
+ "aria-hidden": "true",
390
+ children: /*#__PURE__*/_jsx(AlertMedium, {})
391
+ }), /*#__PURE__*/_jsx("div", {
392
+ className: cl('dh-multi-select-chevron', {
393
+ 'is-open': overlayState.isOpen
394
+ }),
395
+ onClick: handleChevronClick
396
+ // Suppress default to keep input focus on chevron click.
397
+ ,
398
+ onPointerDown: e => e.preventDefault(),
399
+ role: "button",
400
+ tabIndex: -1,
401
+ "aria-label": "Toggle dropdown",
402
+ children: /*#__PURE__*/_jsx(ChevronDownMedium, {})
403
+ })]
404
+ })
405
+ }), name != null && /*#__PURE__*/_jsx("input", {
406
+ type: "hidden",
407
+ name: name,
408
+ value: formValue === 'text' ? selectedKeyArray.map(getLabelFor).join(',') : selectedKeyArray.join(','),
409
+ required: validationBehavior === 'native' && isRequired ? true : undefined
410
+ }), overlayState.isOpen && !isDisabled && /*#__PURE__*/_jsx(Popover, {
411
+ ref: popoverRef,
412
+ triggerRef: triggerRef,
413
+ state: overlayState,
414
+ hideArrow: true,
415
+ isNonModal: true,
416
+ placement: placement,
417
+ shouldFlip: shouldFlip,
418
+ shouldCloseOnInteractOutside: target => {
419
+ var _triggerRef$current;
420
+ return ((_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.contains(target)) !== true;
421
+ },
422
+ UNSAFE_style: {
423
+ width: (_ref2 = (_toCssDimension = toCssDimension(menuWidth)) !== null && _toCssDimension !== void 0 ? _toCssDimension : (_triggerRef$current2 = triggerRef.current) === null || _triggerRef$current2 === void 0 ? void 0 : _triggerRef$current2.offsetWidth) !== null && _ref2 !== void 0 ? _ref2 : undefined
424
+ },
425
+ children: /*#__PURE__*/_jsx(MultiSelectListBox, {
426
+ listBoxRef: listBoxRef,
427
+ listBoxId: listBoxId,
428
+ loadingState: loadingState,
429
+ selectedKeys: selectedKeys,
430
+ disabledKeys: listBoxDisabledKeys,
431
+ onSelectionChange: handleListBoxSelectionChange,
432
+ ariaLabel: typeof label === 'string' ? label : 'Options',
433
+ emptyMessage: emptyMessage,
434
+ children: filteredJsxChildren
435
+ })
436
+ })]
437
+ })
438
+ }));
439
+ }
440
+
441
+ /** Forwarded-ref wrapper. Trigger is a <div>, matching Picker's DOMRef shape. */
442
+ export var MultiSelect = /*#__PURE__*/React.forwardRef(MultiSelectInner);
443
+ MultiSelect.displayName = 'MultiSelect';
444
+ export default MultiSelect;
445
+ //# sourceMappingURL=MultiSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiSelect.js","names":["React","useCallback","useId","useMemo","useRef","Field","FocusRing","Popover","useUnwrapDOMRef","useOverlayTriggerState","ChevronDownMedium","AlertMedium","ProgressCircle","cl","EMPTY_FUNCTION","ensureArray","useMergeRef","normalizeTooltipOptions","wrapItemChildren","flattenJsxChildren","flattenEntriesToItems","useMultiSelectState","useMultiSelectFilter","useMultiSelectKeyboard","useMultiSelectLoadingSpinner","useMultiSelectScrollListener","MultiSelectTag","MultiSelectListBox","jsx","_jsx","jsxs","_jsxs","toCssDimension","value","undefined","concat","test","MultiSelectInner","props","forwardedRef","_ref2","_toCssDimension","_triggerRef$current2","children","tooltip","selectedKeys","propSelectedKeys","defaultSelectedKeys","disabledKeys","propDisabledKeys","onChange","propOnChange","onSelectionChange","propOnSelectionChange","onOpenChange","onScroll","label","description","errorMessage","isRequired","isDisabled","isReadOnly","validationState","isQuiet","labelPosition","labelAlign","necessityIndicator","contextualHelp","inputValue","controlledInputValue","defaultInputValue","onInputChange","shouldFocusWrap","loadingState","menuTrigger","align","direction","shouldFlip","menuWidth","allowsCustomValue","formValue","validationBehavior","autoFocus","name","id","isHidden","onFocus","onBlur","onFocusChange","onKeyDown","onKeyUp","onSearchTextChange","selectedItemLabels","UNSAFE_className","ariaLabel","ariaLabelledby","ariaDescribedby","ariaDetails","styleProps","_objectWithoutProperties","_excluded","lastTriggerReasonRef","handleOverlayOpenChange","isOpen","current","overlayState","openOverlay","reason","open","closeOverlay","close","listBoxId","placement","triggerRef","inputRef","popoverRef","unwrappedPopoverRef","listBoxRef","unwrappedListBoxRef","isFocusedRef","mergedTriggerRef","tooltipOptions","wrappedChildren","allEntries","allItems","allKeys","map","i","key","labelCacheRef","Map","itemLabelMap","cache","forEach","set","getLabelFor","_ref","_itemLabelMap$get","get","searchText","setSearchText","filteredItems","filteredJsxChildren","emptyMessage","length","selectedKeyArray","listBoxDisabledKeys","toggleKey","applyListBoxSelection","handleInputKeyDown","listBoxContainerRef","containerRef","shouldShowInlineSpinner","refocusInput","requestAnimationFrame","_inputRef$current","focus","handleTagRemove","handleListBoxSelectionChange","selection","handleInputFocus","e","handleInputBlur","related","relatedTarget","contains","active","document","activeElement","handleTriggerAreaClick","_inputRef$current2","handleChevronClick","_inputRef$current3","stopPropagation","_objectSpread","wrapperClassName","style","display","within","focusRingClass","focusClass","ref","onClick","className","tagKey","onRemove","target","disabled","readOnly","role","isIndeterminate","size","onPointerDown","preventDefault","tabIndex","type","join","required","state","hideArrow","isNonModal","shouldCloseOnInteractOutside","_triggerRef$current","UNSAFE_style","width","offsetWidth","MultiSelect","forwardRef","displayName"],"sources":["../../../src/spectrum/multiSelect/MultiSelect.tsx"],"sourcesContent":["import React, { useCallback, useId, useMemo, useRef } from 'react';\nimport type { DOMRefValue } from '@react-types/shared';\nimport type { Placement } from '@react-types/overlays';\nimport { Field } from '@react-spectrum/label';\nimport { FocusRing } from '@react-aria/focus';\nimport { Popover } from '@react-spectrum/overlays';\nimport { useUnwrapDOMRef } from '@react-spectrum/utils';\nimport { useOverlayTriggerState } from '@react-stately/overlays';\nimport ChevronDownMedium from '@spectrum-icons/ui/ChevronDownMedium';\nimport AlertMedium from '@spectrum-icons/ui/AlertMedium';\nimport { ProgressCircle } from '@adobe/react-spectrum';\nimport cl from 'classnames';\nimport { EMPTY_FUNCTION, ensureArray } from '@deephaven/utils';\nimport { useMergeRef } from '@deephaven/react-hooks';\nimport { normalizeTooltipOptions, wrapItemChildren } from '../utils';\nimport type { MenuTriggerAction } from '../comboBox';\nimport { type MultiSelectProps } from './MultiSelectProps';\nimport {\n flattenJsxChildren,\n flattenEntriesToItems,\n type MultiSelectFlatEntry,\n} from './multiSelectUtils';\nimport { useMultiSelectState } from './useMultiSelectState';\nimport { useMultiSelectFilter } from './useMultiSelectFilter';\nimport { useMultiSelectKeyboard } from './useMultiSelectKeyboard';\nimport { useMultiSelectLoadingSpinner } from './useMultiSelectLoadingSpinner';\nimport { useMultiSelectScrollListener } from './useMultiSelectScrollListener';\nimport { MultiSelectTag } from './MultiSelectTag';\nimport { MultiSelectListBox } from './MultiSelectListBox';\nimport './MultiSelect.scss';\n\n/**\n * Convert a Spectrum dimension value (e.g. `\"size-3000\"`) to its CSS variable\n * form. Numbers are converted to px. Already-valid CSS strings pass through.\n */\nfunction toCssDimension(\n value: string | number | undefined\n): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'number') {\n return `${value}px`;\n }\n if (/^(size|static-size)-/.test(value)) {\n return `var(--spectrum-global-dimension-${value})`;\n }\n return value;\n}\n\n/**\n * Multi-select styled to match Spectrum ComboBox. Renders selected items as\n * tags inside the trigger area alongside a filter input. Accepts the same\n * `Item` / `Section` JSX children as `Picker`.\n */\nfunction MultiSelectInner(\n props: MultiSelectProps,\n forwardedRef: React.Ref<HTMLDivElement>\n): JSX.Element {\n const {\n children,\n tooltip = true,\n selectedKeys: propSelectedKeys,\n defaultSelectedKeys,\n disabledKeys: propDisabledKeys,\n onChange: propOnChange,\n onSelectionChange: propOnSelectionChange,\n onOpenChange,\n onScroll = EMPTY_FUNCTION,\n label,\n description,\n errorMessage,\n isRequired = false,\n isDisabled = false,\n isReadOnly = false,\n validationState,\n isQuiet = false,\n labelPosition = 'top',\n labelAlign,\n necessityIndicator,\n contextualHelp,\n inputValue: controlledInputValue,\n defaultInputValue = '',\n onInputChange,\n shouldFocusWrap = false,\n loadingState,\n menuTrigger = 'input',\n align = 'start',\n direction = 'bottom',\n shouldFlip = true,\n menuWidth,\n allowsCustomValue = false,\n formValue = 'key',\n validationBehavior = 'aria',\n autoFocus = false,\n name,\n id,\n isHidden = false,\n onFocus,\n onBlur,\n onFocusChange,\n onKeyDown,\n onKeyUp,\n onSearchTextChange,\n selectedItemLabels,\n UNSAFE_className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'aria-details': ariaDetails,\n ...styleProps\n } = props;\n\n // Spectrum's onOpenChange omits the trigger reason; relay it via ref.\n const lastTriggerReasonRef = useRef<MenuTriggerAction | undefined>(undefined);\n\n const handleOverlayOpenChange = useCallback(\n (isOpen: boolean) => {\n onOpenChange?.(isOpen, lastTriggerReasonRef.current);\n },\n [onOpenChange]\n );\n\n const overlayState = useOverlayTriggerState({\n onOpenChange: handleOverlayOpenChange,\n });\n\n const openOverlay = useCallback(\n (reason: MenuTriggerAction) => {\n lastTriggerReasonRef.current = reason;\n overlayState.open();\n },\n [overlayState]\n );\n const closeOverlay = useCallback(() => {\n lastTriggerReasonRef.current = undefined;\n overlayState.close();\n }, [overlayState]);\n\n const listBoxId = useId();\n\n const placement = `${direction} ${align}` as Placement;\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const popoverRef = useRef<DOMRefValue<HTMLDivElement>>(null);\n const unwrappedPopoverRef = useUnwrapDOMRef(popoverRef);\n const listBoxRef = useRef<DOMRefValue<HTMLDivElement>>(null);\n const unwrappedListBoxRef = useUnwrapDOMRef(listBoxRef);\n const isFocusedRef = useRef(false);\n const mergedTriggerRef = useMergeRef(triggerRef, forwardedRef);\n\n // Ensures Item/ItemContent wrapping for tooltips/overflow.\n const tooltipOptions = useMemo(\n () => normalizeTooltipOptions(tooltip),\n [tooltip]\n );\n const wrappedChildren = useMemo(\n () => ensureArray(wrapItemChildren(children, tooltipOptions)),\n [children, tooltipOptions]\n );\n\n // Flat {key,label} entries for filter/keyboard hooks. ListBox renders JSX directly.\n const allEntries: MultiSelectFlatEntry[] = useMemo(\n () => flattenJsxChildren(wrappedChildren),\n [wrappedChildren]\n );\n\n const allItems = useMemo(\n () => flattenEntriesToItems(allEntries),\n [allEntries]\n );\n const allKeys = useMemo(() => allItems.map(i => i.key), [allItems]);\n\n // Persistent label cache: accumulates labels from items as they appear in\n // children. When server-side search filters items out of the children, the\n // cache ensures tags still display the correct label.\n const labelCacheRef = useRef<Map<string, string>>(new Map());\n const itemLabelMap = useMemo(() => {\n const cache = labelCacheRef.current;\n allItems.forEach(i => cache.set(i.key, i.label));\n return new Map(cache);\n }, [allItems]);\n\n const getLabelFor = useCallback(\n (key: string): string =>\n itemLabelMap.get(key) ?? selectedItemLabels?.get(key) ?? key,\n [itemLabelMap, selectedItemLabels]\n );\n\n const { searchText, setSearchText, filteredItems, filteredJsxChildren } =\n useMultiSelectFilter({\n allEntries,\n wrappedChildren,\n inputValue: controlledInputValue,\n defaultInputValue,\n onInputChange,\n onSearchTextChange,\n });\n\n const emptyMessage: string | undefined = useMemo(() => {\n if (filteredItems.length > 0) {\n return undefined;\n }\n if (loadingState === 'loading') {\n return 'Loading...';\n }\n // loadingMore + empty: defer to ListBox's loader pill instead of \"No results\".\n if (loadingState === 'loadingMore') {\n return undefined;\n }\n return 'No results';\n }, [filteredItems.length, loadingState]);\n\n const {\n selectedKeys,\n selectedKeyArray,\n listBoxDisabledKeys,\n toggleKey,\n applyListBoxSelection,\n } = useMultiSelectState({\n selectedKeys: propSelectedKeys,\n defaultSelectedKeys,\n disabledKeys: propDisabledKeys,\n onChange: propOnChange,\n onSelectionChange: propOnSelectionChange,\n allKeys,\n });\n\n const { handleInputKeyDown } = useMultiSelectKeyboard({\n filteredItems,\n allItems,\n shouldFocusWrap,\n overlayState,\n openOverlay,\n closeOverlay,\n isReadOnly,\n isDisabled,\n searchText,\n setSearchText,\n selectedKeys,\n toggleKey,\n allowsCustomValue,\n menuTrigger,\n onKeyDown,\n listBoxContainerRef: unwrappedListBoxRef,\n inputRef,\n });\n\n useMultiSelectScrollListener({\n containerRef: unwrappedListBoxRef,\n isOpen: overlayState.isOpen,\n onScroll,\n });\n\n const shouldShowInlineSpinner = useMultiSelectLoadingSpinner({\n loadingState,\n searchText,\n isOpen: overlayState.isOpen,\n menuTrigger,\n });\n\n const refocusInput = useCallback(() => {\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }, []);\n\n const handleTagRemove = useCallback(\n (key: string) => {\n toggleKey(key);\n refocusInput();\n },\n [toggleKey, refocusInput]\n );\n\n const handleListBoxSelectionChange = useCallback(\n (selection: Parameters<typeof applyListBoxSelection>[0]) => {\n if (isReadOnly) {\n return;\n }\n applyListBoxSelection(selection, filteredItems);\n refocusInput();\n },\n [isReadOnly, applyListBoxSelection, filteredItems, refocusInput]\n );\n\n const handleInputFocus = useCallback(\n (e: React.FocusEvent) => {\n if (isFocusedRef.current) {\n return;\n }\n isFocusedRef.current = true;\n if (menuTrigger === 'focus' && !overlayState.isOpen && !isDisabled) {\n openOverlay('focus');\n }\n onFocus?.(e);\n onFocusChange?.(true);\n },\n [onFocus, onFocusChange, menuTrigger, overlayState, isDisabled, openOverlay]\n );\n\n const handleInputBlur = useCallback(\n (e: React.FocusEvent) => {\n const related = e.relatedTarget as HTMLElement | null;\n\n if (related != null) {\n if (\n triggerRef.current != null &&\n triggerRef.current.contains(related)\n ) {\n return;\n }\n if (\n unwrappedPopoverRef.current != null &&\n unwrappedPopoverRef.current.contains(related)\n ) {\n return;\n }\n } else {\n // relatedTarget can be null when clicking non-focusable content.\n // Use rAF to check if focus moved back into the component.\n requestAnimationFrame(() => {\n const active = document.activeElement as HTMLElement | null;\n if (\n active != null &&\n ((triggerRef.current != null &&\n triggerRef.current.contains(active)) ||\n (unwrappedPopoverRef.current != null &&\n unwrappedPopoverRef.current.contains(active)))\n ) {\n return;\n }\n isFocusedRef.current = false;\n if (overlayState.isOpen) {\n closeOverlay();\n }\n onBlur?.(e);\n onFocusChange?.(false);\n });\n return;\n }\n\n isFocusedRef.current = false;\n if (overlayState.isOpen) {\n closeOverlay();\n }\n onBlur?.(e);\n onFocusChange?.(false);\n },\n [onBlur, onFocusChange, overlayState, closeOverlay, unwrappedPopoverRef]\n );\n\n const handleTriggerAreaClick = useCallback(() => {\n if (isDisabled) {\n return;\n }\n if (!overlayState.isOpen) {\n openOverlay('manual');\n }\n inputRef.current?.focus();\n }, [isDisabled, overlayState, openOverlay]);\n\n const handleChevronClick = useCallback(\n (e: React.MouseEvent) => {\n // Stop trigger-area handler from re-opening the popover on close.\n e.stopPropagation();\n if (isDisabled) {\n return;\n }\n if (overlayState.isOpen) {\n closeOverlay();\n } else {\n openOverlay('manual');\n }\n inputRef.current?.focus();\n },\n [isDisabled, overlayState, openOverlay, closeOverlay]\n );\n\n return (\n <Field\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...styleProps}\n label={label}\n description={description}\n errorMessage={validationState === 'invalid' ? errorMessage : undefined}\n isRequired={isRequired}\n isDisabled={isDisabled}\n validationState={validationState}\n labelPosition={labelPosition}\n labelAlign={labelAlign}\n necessityIndicator={necessityIndicator}\n contextualHelp={contextualHelp}\n wrapperClassName={cl('dh-multi-select', UNSAFE_className)}\n >\n <div style={isHidden ? { display: 'none' } : undefined}>\n <FocusRing within focusRingClass=\"focus-ring\" focusClass=\"is-focused\">\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={mergedTriggerRef}\n id={id}\n onClick={handleTriggerAreaClick}\n className={cl('dh-multi-select-trigger', {\n 'is-disabled': isDisabled,\n 'is-read-only': isReadOnly,\n 'is-quiet': isQuiet,\n 'is-invalid': validationState === 'invalid',\n })}\n >\n <div className=\"dh-multi-select-content\">\n {selectedKeyArray.map(key => (\n <MultiSelectTag\n key={key}\n tagKey={key}\n label={getLabelFor(key)}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n onRemove={handleTagRemove}\n />\n ))}\n <input\n ref={inputRef}\n className=\"dh-multi-select-input\"\n value={searchText}\n onChange={e => setSearchText(e.target.value)}\n onFocus={handleInputFocus}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n onKeyUp={onKeyUp}\n disabled={isDisabled}\n readOnly={isReadOnly}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={overlayState.isOpen}\n aria-controls={overlayState.isOpen ? listBoxId : undefined}\n aria-autocomplete=\"list\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n aria-details={ariaDetails}\n />\n </div>\n\n {shouldShowInlineSpinner && (\n <div className=\"dh-multi-select-loading-circle\">\n <ProgressCircle aria-label=\"Loading\" isIndeterminate size=\"S\" />\n </div>\n )}\n\n {validationState === 'invalid' && !isDisabled && (\n <div className=\"dh-multi-select-invalid-icon\" aria-hidden=\"true\">\n <AlertMedium />\n </div>\n )}\n\n <div\n className={cl('dh-multi-select-chevron', {\n 'is-open': overlayState.isOpen,\n })}\n onClick={handleChevronClick}\n // Suppress default to keep input focus on chevron click.\n onPointerDown={e => e.preventDefault()}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Toggle dropdown\"\n >\n <ChevronDownMedium />\n </div>\n </div>\n </FocusRing>\n\n {name != null && (\n <input\n type=\"hidden\"\n name={name}\n value={\n formValue === 'text'\n ? selectedKeyArray.map(getLabelFor).join(',')\n : selectedKeyArray.join(',')\n }\n required={\n validationBehavior === 'native' && isRequired ? true : undefined\n }\n />\n )}\n\n {overlayState.isOpen && !isDisabled && (\n <Popover\n ref={popoverRef}\n triggerRef={triggerRef}\n state={overlayState}\n hideArrow\n isNonModal\n placement={placement}\n shouldFlip={shouldFlip}\n shouldCloseOnInteractOutside={target =>\n triggerRef.current?.contains(target) !== true\n }\n UNSAFE_style={{\n width:\n toCssDimension(menuWidth) ??\n triggerRef.current?.offsetWidth ??\n undefined,\n }}\n >\n <MultiSelectListBox\n listBoxRef={listBoxRef}\n listBoxId={listBoxId}\n loadingState={loadingState}\n selectedKeys={selectedKeys}\n disabledKeys={listBoxDisabledKeys}\n onSelectionChange={handleListBoxSelectionChange}\n ariaLabel={typeof label === 'string' ? label : 'Options'}\n emptyMessage={emptyMessage}\n >\n {filteredJsxChildren}\n </MultiSelectListBox>\n </Popover>\n )}\n </div>\n </Field>\n );\n}\n\n/** Forwarded-ref wrapper. Trigger is a <div>, matching Picker's DOMRef shape. */\nexport const MultiSelect = React.forwardRef(MultiSelectInner);\nMultiSelect.displayName = 'MultiSelect';\n\nexport default MultiSelect;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ import { type ReactElement } from 'react';
2
+ import type { DOMRef, LoadingState, Selection } from '@react-types/shared';
3
+ export interface MultiSelectListBoxProps {
4
+ /** DOMRef forwarded to the inner Spectrum `<ListBox>`. */
5
+ listBoxRef: DOMRef<HTMLDivElement>;
6
+ /** ID applied to the inner Spectrum `<ListBox>`. */
7
+ listBoxId: string;
8
+ /** Spectrum `LoadingState` for the items collection. */
9
+ loadingState: LoadingState | undefined;
10
+ /** JSX children to render inside `<ListBox>`. */
11
+ children: ReactElement[];
12
+ /** Selected keys */
13
+ selectedKeys: Iterable<string>;
14
+ /** Disabled keys for `<ListBox>`. */
15
+ disabledKeys: Iterable<string> | undefined;
16
+ /** Selection change handler from `<ListBox>`. */
17
+ onSelectionChange: (selection: Selection) => void;
18
+ /** ARIA label applied to the `<ListBox>`. */
19
+ ariaLabel: string;
20
+ /** When provided, the ListBox is replaced with this empty-state message. */
21
+ emptyMessage?: string;
22
+ }
23
+ /**
24
+ * Popover content for `MultiSelect`. Renders either an empty-state message (text-only)
25
+ * or the Spectrum `<ListBox>`. Private subcomponent of `MultiSelect`.
26
+ */
27
+ export declare function MultiSelectListBox({ listBoxRef, listBoxId, loadingState, children, selectedKeys, disabledKeys, onSelectionChange, ariaLabel, emptyMessage, }: MultiSelectListBoxProps): JSX.Element;
28
+ export default MultiSelectListBox;
29
+ //# sourceMappingURL=MultiSelectListBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiSelectListBox.d.ts","sourceRoot":"","sources":["../../../src/spectrum/multiSelect/MultiSelectListBox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACnC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,iDAAiD;IACjD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,oBAAoB;IACpB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,qCAAqC;IACrC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC3C,iDAAiD;IACjD,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAClD,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,YAAY,GACb,EAAE,uBAAuB,GAAG,GAAG,CAAC,OAAO,CAoBvC;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { ListBox } from '@adobe/react-spectrum';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * Popover content for `MultiSelect`. Renders either an empty-state message (text-only)
5
+ * or the Spectrum `<ListBox>`. Private subcomponent of `MultiSelect`.
6
+ */
7
+ export function MultiSelectListBox(_ref) {
8
+ var {
9
+ listBoxRef,
10
+ listBoxId,
11
+ loadingState,
12
+ children,
13
+ selectedKeys,
14
+ disabledKeys,
15
+ onSelectionChange,
16
+ ariaLabel,
17
+ emptyMessage
18
+ } = _ref;
19
+ if (emptyMessage != null) {
20
+ return /*#__PURE__*/_jsx("div", {
21
+ className: "dh-multi-select-empty",
22
+ children: emptyMessage
23
+ });
24
+ }
25
+ return /*#__PURE__*/_jsx(ListBox, {
26
+ ref: listBoxRef,
27
+ id: listBoxId,
28
+ selectionMode: "multiple",
29
+ selectedKeys: selectedKeys,
30
+ onSelectionChange: onSelectionChange,
31
+ disabledKeys: disabledKeys,
32
+ "aria-label": ariaLabel,
33
+ isLoading: loadingState === 'loadingMore',
34
+ UNSAFE_style: {
35
+ maxHeight: 'inherit'
36
+ },
37
+ children: children
38
+ });
39
+ }
40
+ export default MultiSelectListBox;
41
+ //# sourceMappingURL=MultiSelectListBox.js.map