@osdk/react-components 0.2.0-beta.21 → 0.2.0-beta.22

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 (257) hide show
  1. package/AGENTS.md +14 -97
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +1 -1
  4. package/build/browser/action-form/ActionFormApi.js.map +1 -1
  5. package/build/browser/action-form/BaseForm.js +18 -5
  6. package/build/browser/action-form/BaseForm.js.map +1 -1
  7. package/build/browser/action-form/BaseForm.module.css +38 -0
  8. package/build/browser/action-form/BaseForm.module.css.js +8 -0
  9. package/build/browser/action-form/FormField.js +42 -0
  10. package/build/browser/action-form/FormField.js.map +1 -0
  11. package/build/browser/action-form/FormField.module.css +41 -0
  12. package/build/browser/action-form/FormField.module.css.js +10 -0
  13. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  14. package/build/browser/action-form/FormHeader.js +26 -0
  15. package/build/browser/action-form/FormHeader.js.map +1 -0
  16. package/build/browser/action-form/FormHeader.module.css +26 -0
  17. package/build/browser/action-form/FormHeader.module.css.js +6 -0
  18. package/build/browser/action-form/fields/FormFieldRenderer.js +7 -5
  19. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
  20. package/build/browser/action-form/fields/TextInputField.js +2 -0
  21. package/build/browser/action-form/fields/TextInputField.js.map +1 -1
  22. package/build/browser/action-form/fields/TextInputField.module.css +56 -0
  23. package/build/browser/action-form/fields/TextInputField.module.css.js +6 -0
  24. package/build/browser/base-components/checkbox/Checkbox.js +2 -2
  25. package/build/browser/base-components/checkbox/Checkbox.js.map +1 -1
  26. package/build/browser/base-components/checkbox/Checkbox.module.css +0 -4
  27. package/build/browser/base-components/combobox/Combobox.js +3 -8
  28. package/build/browser/base-components/combobox/Combobox.js.map +1 -1
  29. package/build/browser/base-components/combobox/Combobox.module.css +0 -3
  30. package/build/browser/base-components/draggable-list/DraggableList.js +2 -4
  31. package/build/browser/base-components/draggable-list/DraggableList.js.map +1 -1
  32. package/build/browser/base-components/search-bar/SearchBar.module.css +2 -2
  33. package/build/browser/base-components/select/Select.js +1 -3
  34. package/build/browser/base-components/select/Select.js.map +1 -1
  35. package/build/browser/base-components/select/Select.module.css +0 -2
  36. package/build/browser/base-components/switch/Switch.module.css +0 -1
  37. package/build/browser/filter-list/FilterInput.js +14 -5
  38. package/build/browser/filter-list/FilterInput.js.map +1 -1
  39. package/build/browser/filter-list/FilterList.js +13 -5
  40. package/build/browser/filter-list/FilterList.js.map +1 -1
  41. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  42. package/build/browser/filter-list/base/AddFilterPopover.js +4 -3
  43. package/build/browser/filter-list/base/AddFilterPopover.js.map +1 -1
  44. package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -1
  45. package/build/browser/filter-list/base/ExcludeDropdown.js +61 -0
  46. package/build/browser/filter-list/base/ExcludeDropdown.js.map +1 -0
  47. package/build/browser/filter-list/base/ExcludeDropdown.module.css +94 -0
  48. package/build/browser/filter-list/base/ExcludeDropdown.module.css.js +12 -0
  49. package/build/browser/filter-list/base/FilterIcons.js +0 -39
  50. package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
  51. package/build/browser/filter-list/base/FilterInputExcludeRow.js +55 -0
  52. package/build/browser/filter-list/base/FilterInputExcludeRow.js.map +1 -0
  53. package/build/browser/filter-list/base/FilterListItem.js +72 -23
  54. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  55. package/build/browser/filter-list/base/FilterListItem.module.css +96 -20
  56. package/build/browser/filter-list/base/FilterListItem.module.css.js +7 -2
  57. package/build/browser/filter-list/base/inputs/CheckboxListInput.js +2 -2
  58. package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  59. package/build/browser/filter-list/base/inputs/ContainsTextInput.js +2 -6
  60. package/build/browser/filter-list/base/inputs/ContainsTextInput.js.map +1 -1
  61. package/build/browser/filter-list/base/inputs/ListogramInput.js +2 -2
  62. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  63. package/build/browser/filter-list/base/inputs/RangeInput.js +2 -2
  64. package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
  65. package/build/browser/filter-list/base/inputs/SingleSelectInput.js +1 -3
  66. package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  67. package/build/browser/filter-list/base/inputs/{useStaleData.js → useStableData.js} +5 -5
  68. package/build/browser/filter-list/base/inputs/useStableData.js.map +1 -0
  69. package/build/browser/filter-list/hooks/usePropertyAggregation.js +3 -2
  70. package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  71. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js +15 -5
  72. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js.map +1 -1
  73. package/build/browser/filter-list/inputs/DateRangeFilterInput.js +10 -6
  74. package/build/browser/filter-list/inputs/DateRangeFilterInput.js.map +1 -1
  75. package/build/browser/filter-list/inputs/LinkedPropertyInput.js +41 -18
  76. package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  77. package/build/browser/filter-list/inputs/ListogramFilterInput.js +15 -5
  78. package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  79. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +12 -4
  80. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  81. package/build/browser/filter-list/inputs/NumberRangeFilterInput.js +10 -6
  82. package/build/browser/filter-list/inputs/NumberRangeFilterInput.js.map +1 -1
  83. package/build/browser/filter-list/inputs/PropertyFilterInput.js +36 -10
  84. package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  85. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +12 -4
  86. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  87. package/build/browser/filter-list/inputs/TextTagsFilterInput.js +12 -4
  88. package/build/browser/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
  89. package/build/browser/filter-list/utils/filterValues.js +29 -1
  90. package/build/browser/filter-list/utils/filterValues.js.map +1 -1
  91. package/build/browser/object-table/LoadingCell.module.css +0 -1
  92. package/build/browser/object-table/MultiColumnSortDialog.js +1 -3
  93. package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
  94. package/build/browser/object-table/MultiColumnSortDialog.module.css +0 -1
  95. package/build/browser/object-table/TableCell.module.css +1 -1
  96. package/build/browser/object-table/TableHeader.module.css +2 -2
  97. package/build/browser/object-table/TableHeaderWithPopover.js +2 -4
  98. package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -1
  99. package/build/browser/object-table/TableHeaderWithPopover.module.css +1 -0
  100. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css +0 -1
  101. package/build/browser/public/experimental.js +2 -0
  102. package/build/browser/public/experimental.js.map +1 -1
  103. package/build/browser/styles.css +372 -38
  104. package/build/cjs/public/experimental.cjs +1882 -1068
  105. package/build/cjs/public/experimental.cjs.map +1 -1
  106. package/build/cjs/public/experimental.css +244 -38
  107. package/build/cjs/public/experimental.css.map +1 -1
  108. package/build/cjs/public/experimental.d.cts +420 -11
  109. package/build/esm/action-form/ActionFormApi.js.map +1 -1
  110. package/build/esm/action-form/BaseForm.js +18 -5
  111. package/build/esm/action-form/BaseForm.js.map +1 -1
  112. package/build/esm/action-form/BaseForm.module.css +38 -0
  113. package/build/esm/action-form/FormField.js +42 -0
  114. package/build/esm/action-form/FormField.js.map +1 -0
  115. package/build/esm/action-form/FormField.module.css +41 -0
  116. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  117. package/build/esm/action-form/FormHeader.js +26 -0
  118. package/build/esm/action-form/FormHeader.js.map +1 -0
  119. package/build/esm/action-form/FormHeader.module.css +26 -0
  120. package/build/esm/action-form/fields/FormFieldRenderer.js +7 -5
  121. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
  122. package/build/esm/action-form/fields/TextInputField.js +2 -0
  123. package/build/esm/action-form/fields/TextInputField.js.map +1 -1
  124. package/build/esm/action-form/fields/TextInputField.module.css +56 -0
  125. package/build/esm/base-components/checkbox/Checkbox.js +2 -2
  126. package/build/esm/base-components/checkbox/Checkbox.js.map +1 -1
  127. package/build/esm/base-components/checkbox/Checkbox.module.css +0 -4
  128. package/build/esm/base-components/combobox/Combobox.js +3 -8
  129. package/build/esm/base-components/combobox/Combobox.js.map +1 -1
  130. package/build/esm/base-components/combobox/Combobox.module.css +0 -3
  131. package/build/esm/base-components/draggable-list/DraggableList.js +2 -4
  132. package/build/esm/base-components/draggable-list/DraggableList.js.map +1 -1
  133. package/build/esm/base-components/search-bar/SearchBar.module.css +2 -2
  134. package/build/esm/base-components/select/Select.js +1 -3
  135. package/build/esm/base-components/select/Select.js.map +1 -1
  136. package/build/esm/base-components/select/Select.module.css +0 -2
  137. package/build/esm/base-components/switch/Switch.module.css +0 -1
  138. package/build/esm/filter-list/FilterInput.js +14 -5
  139. package/build/esm/filter-list/FilterInput.js.map +1 -1
  140. package/build/esm/filter-list/FilterList.js +13 -5
  141. package/build/esm/filter-list/FilterList.js.map +1 -1
  142. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  143. package/build/esm/filter-list/base/AddFilterPopover.js +4 -3
  144. package/build/esm/filter-list/base/AddFilterPopover.js.map +1 -1
  145. package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -1
  146. package/build/esm/filter-list/base/ExcludeDropdown.js +61 -0
  147. package/build/esm/filter-list/base/ExcludeDropdown.js.map +1 -0
  148. package/build/esm/filter-list/base/ExcludeDropdown.module.css +94 -0
  149. package/build/esm/filter-list/base/FilterIcons.js +0 -39
  150. package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
  151. package/build/esm/filter-list/base/FilterInputExcludeRow.js +55 -0
  152. package/build/esm/filter-list/base/FilterInputExcludeRow.js.map +1 -0
  153. package/build/esm/filter-list/base/FilterListItem.js +72 -23
  154. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  155. package/build/esm/filter-list/base/FilterListItem.module.css +96 -20
  156. package/build/esm/filter-list/base/inputs/CheckboxListInput.js +2 -2
  157. package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  158. package/build/esm/filter-list/base/inputs/ContainsTextInput.js +2 -6
  159. package/build/esm/filter-list/base/inputs/ContainsTextInput.js.map +1 -1
  160. package/build/esm/filter-list/base/inputs/ListogramInput.js +2 -2
  161. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  162. package/build/esm/filter-list/base/inputs/RangeInput.js +2 -2
  163. package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
  164. package/build/esm/filter-list/base/inputs/SingleSelectInput.js +1 -3
  165. package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  166. package/build/esm/filter-list/base/inputs/{useStaleData.js → useStableData.js} +5 -5
  167. package/build/esm/filter-list/base/inputs/useStableData.js.map +1 -0
  168. package/build/esm/filter-list/hooks/usePropertyAggregation.js +3 -2
  169. package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  170. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js +15 -5
  171. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js.map +1 -1
  172. package/build/esm/filter-list/inputs/DateRangeFilterInput.js +10 -6
  173. package/build/esm/filter-list/inputs/DateRangeFilterInput.js.map +1 -1
  174. package/build/esm/filter-list/inputs/LinkedPropertyInput.js +41 -18
  175. package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  176. package/build/esm/filter-list/inputs/ListogramFilterInput.js +15 -5
  177. package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  178. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +12 -4
  179. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  180. package/build/esm/filter-list/inputs/NumberRangeFilterInput.js +10 -6
  181. package/build/esm/filter-list/inputs/NumberRangeFilterInput.js.map +1 -1
  182. package/build/esm/filter-list/inputs/PropertyFilterInput.js +36 -10
  183. package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  184. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +12 -4
  185. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  186. package/build/esm/filter-list/inputs/TextTagsFilterInput.js +12 -4
  187. package/build/esm/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
  188. package/build/esm/filter-list/utils/filterValues.js +29 -1
  189. package/build/esm/filter-list/utils/filterValues.js.map +1 -1
  190. package/build/esm/object-table/LoadingCell.module.css +0 -1
  191. package/build/esm/object-table/MultiColumnSortDialog.js +1 -3
  192. package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
  193. package/build/esm/object-table/MultiColumnSortDialog.module.css +0 -1
  194. package/build/esm/object-table/TableCell.module.css +1 -1
  195. package/build/esm/object-table/TableHeader.module.css +2 -2
  196. package/build/esm/object-table/TableHeaderWithPopover.js +2 -4
  197. package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -1
  198. package/build/esm/object-table/TableHeaderWithPopover.module.css +1 -0
  199. package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.module.css +0 -1
  200. package/build/esm/public/experimental.js +2 -0
  201. package/build/esm/public/experimental.js.map +1 -1
  202. package/build/types/action-form/ActionFormApi.d.ts +1 -0
  203. package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
  204. package/build/types/action-form/BaseForm.d.ts.map +1 -1
  205. package/build/types/action-form/FormField.d.ts +11 -0
  206. package/build/types/action-form/FormField.d.ts.map +1 -0
  207. package/build/types/action-form/FormFieldApi.d.ts +1 -1
  208. package/build/types/action-form/FormHeader.d.ts +6 -0
  209. package/build/types/action-form/FormHeader.d.ts.map +1 -0
  210. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
  211. package/build/types/action-form/fields/TextInputField.d.ts.map +1 -1
  212. package/build/types/filter-list/FilterInput.d.ts +3 -1
  213. package/build/types/filter-list/FilterInput.d.ts.map +1 -1
  214. package/build/types/filter-list/FilterListApi.d.ts +12 -9
  215. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  216. package/build/types/filter-list/base/AddFilterPopover.d.ts +2 -1
  217. package/build/types/filter-list/base/AddFilterPopover.d.ts.map +1 -1
  218. package/build/types/filter-list/base/BaseFilterListApi.d.ts +2 -0
  219. package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -1
  220. package/build/types/filter-list/base/ExcludeDropdown.d.ts +8 -0
  221. package/build/types/filter-list/base/ExcludeDropdown.d.ts.map +1 -0
  222. package/build/types/filter-list/base/FilterIcons.d.ts +0 -2
  223. package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
  224. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts +12 -0
  225. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts.map +1 -0
  226. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
  227. package/build/types/filter-list/base/inputs/useStableData.d.ts +1 -0
  228. package/build/types/filter-list/base/inputs/useStableData.d.ts.map +1 -0
  229. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +2 -2
  230. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -1
  231. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts +5 -2
  232. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts.map +1 -1
  233. package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts +3 -2
  234. package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts.map +1 -1
  235. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts +2 -1
  236. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
  237. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +5 -2
  238. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -1
  239. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +4 -2
  240. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -1
  241. package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts +3 -2
  242. package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts.map +1 -1
  243. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +3 -1
  244. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -1
  245. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +4 -2
  246. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -1
  247. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts +4 -2
  248. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts.map +1 -1
  249. package/build/types/filter-list/utils/filterValues.d.ts +2 -0
  250. package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
  251. package/build/types/public/experimental.d.ts +4 -0
  252. package/build/types/public/experimental.d.ts.map +1 -1
  253. package/package.json +4 -4
  254. package/build/browser/filter-list/base/inputs/useStaleData.js.map +0 -1
  255. package/build/esm/filter-list/base/inputs/useStaleData.js.map +0 -1
  256. package/build/types/filter-list/base/inputs/useStaleData.d.ts +0 -1
  257. package/build/types/filter-list/base/inputs/useStaleData.d.ts.map +0 -1
@@ -16,12 +16,13 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
16
16
  */
17
17
 
18
18
  import { Button } from "@base-ui/react/button";
19
+ import { Input } from "@base-ui/react/input";
19
20
  import classnames from "classnames";
20
- import React, { memo, useCallback } from "react";
21
+ import React, { memo, useCallback, useState } from "react";
21
22
  import { ErrorBoundary } from "../../shared/ErrorBoundary.js";
22
- import { supportsExcluding } from "../utils/filterValues.js";
23
+ import { supportsExcluding, supportsSearch } from "../utils/filterValues.js";
23
24
  import { DragHandleIcon } from "./DragHandleIcon.js";
24
- import { ExcludeIcon, IncludeIcon, RemoveIcon } from "./FilterIcons.js";
25
+ import { OverflowMenuIcon, RemoveIcon, SearchIcon } from "./FilterIcons.js";
25
26
  import styles from "./FilterListItem.module.css.js";
26
27
  function FilterListItemInner({
27
28
  definition,
@@ -36,26 +37,52 @@ function FilterListItemInner({
36
37
  className,
37
38
  style
38
39
  }) {
40
+ const [searchState, setSearchState] = useState({
41
+ type: "closed"
42
+ });
43
+ const [excludeRowOpen, setExcludeRowOpen] = useState(false);
39
44
  const handleFilterStateChanged = useCallback(newState => {
40
45
  onFilterStateChanged(filterKey, newState);
41
46
  }, [filterKey, onFilterStateChanged]);
42
- const handleToggleExclude = useCallback(() => {
43
- if (filterState) {
44
- onFilterStateChanged(filterKey, {
45
- ...filterState,
46
- isExcluding: !filterState.isExcluding
47
- });
48
- }
49
- }, [filterKey, filterState, onFilterStateChanged]);
47
+ const handleToggleSearch = useCallback(() => {
48
+ setSearchState(prev => prev.type === "closed" ? {
49
+ type: "open",
50
+ query: ""
51
+ } : {
52
+ type: "closed"
53
+ });
54
+ }, []);
55
+ const handleSearchChange = useCallback(e => {
56
+ setSearchState({
57
+ type: "open",
58
+ query: e.target.value
59
+ });
60
+ }, []);
61
+ const handleSearchClear = useCallback(() => {
62
+ setSearchState({
63
+ type: "open",
64
+ query: ""
65
+ });
66
+ }, []);
50
67
  const handleRemove = useCallback(() => {
51
68
  onFilterRemoved?.(filterKey);
52
69
  }, [filterKey, onFilterRemoved]);
53
- const isExcluding = filterState?.isExcluding ?? false;
54
- const showExcludeToggle = supportsExcluding(filterState);
70
+ const handleToggleExcludeRow = useCallback(() => {
71
+ setExcludeRowOpen(prev => !prev);
72
+ }, []);
73
+ const searchInputRef = useCallback(element => {
74
+ element?.focus({
75
+ preventScroll: true
76
+ });
77
+ }, []);
78
+ const showExcludeDropdown = supportsExcluding(filterState);
79
+ const showSearch = supportsSearch(filterState);
80
+ const searchOpen = searchState.type === "open";
81
+ const searchQuery = searchState.type === "open" ? searchState.query : "";
82
+ const searchQueryForInput = searchState.type === "open" ? searchState.query : undefined;
55
83
  return /*#__PURE__*/React.createElement("div", {
56
84
  className: classnames(styles.filterItem, className),
57
- style: style,
58
- "data-excluding": isExcluding || undefined
85
+ style: style
59
86
  }, /*#__PURE__*/React.createElement("div", {
60
87
  className: styles.itemHeader
61
88
  }, dragHandleAttributes && /*#__PURE__*/React.createElement(Button, _extends({
@@ -63,15 +90,35 @@ function FilterListItemInner({
63
90
  "aria-label": `Reorder ${label}`
64
91
  }, dragHandleAttributes, dragHandleListeners), /*#__PURE__*/React.createElement(DragHandleIcon, null)), /*#__PURE__*/React.createElement("span", {
65
92
  className: styles.itemLabel
66
- }, label), showExcludeToggle && /*#__PURE__*/React.createElement(Button, {
67
- className: styles.excludeToggle,
68
- onClick: handleToggleExclude,
69
- "aria-pressed": isExcluding,
70
- "aria-label": isExcluding ? "Switch to include mode" : "Switch to exclude mode"
71
- }, isExcluding ? /*#__PURE__*/React.createElement(ExcludeIcon, null) : /*#__PURE__*/React.createElement(IncludeIcon, null)), onFilterRemoved && /*#__PURE__*/React.createElement(Button, {
72
- className: styles.removeButton,
93
+ }, label), showSearch && /*#__PURE__*/React.createElement(Button, {
94
+ className: styles.headerActionButton,
95
+ onClick: handleToggleSearch,
96
+ "aria-label": "Search values",
97
+ "aria-pressed": searchOpen
98
+ }, /*#__PURE__*/React.createElement(SearchIcon, null)), onFilterRemoved && /*#__PURE__*/React.createElement(Button, {
99
+ className: styles.headerActionButton,
73
100
  onClick: handleRemove,
74
101
  "aria-label": `Remove ${label} filter`
102
+ }, /*#__PURE__*/React.createElement(RemoveIcon, null)), showExcludeDropdown && /*#__PURE__*/React.createElement(Button, {
103
+ className: styles.headerActionButton,
104
+ onClick: handleToggleExcludeRow,
105
+ "aria-label": "More actions",
106
+ "aria-pressed": excludeRowOpen
107
+ }, /*#__PURE__*/React.createElement(OverflowMenuIcon, null))), searchOpen && /*#__PURE__*/React.createElement("div", {
108
+ className: styles.searchRow
109
+ }, /*#__PURE__*/React.createElement(Input, {
110
+ type: "text",
111
+ className: styles.searchInput,
112
+ value: searchQuery,
113
+ onChange: handleSearchChange,
114
+ placeholder: "Search property values...",
115
+ "aria-label": "Search property values",
116
+ ref: searchInputRef
117
+ }), searchQuery && /*#__PURE__*/React.createElement(Button, {
118
+ type: "button",
119
+ className: styles.searchClearButton,
120
+ onClick: handleSearchClear,
121
+ "aria-label": "Clear search"
75
122
  }, /*#__PURE__*/React.createElement(RemoveIcon, null))), /*#__PURE__*/React.createElement("div", {
76
123
  className: styles.itemContent
77
124
  }, /*#__PURE__*/React.createElement(ErrorBoundary, {
@@ -80,7 +127,9 @@ function FilterListItemInner({
80
127
  definition,
81
128
  filterKey,
82
129
  filterState,
83
- onFilterStateChanged: handleFilterStateChanged
130
+ onFilterStateChanged: handleFilterStateChanged,
131
+ searchQuery: searchQueryForInput,
132
+ excludeRowOpen
84
133
  }))));
85
134
  }
86
135
  export const FilterListItem = /*#__PURE__*/memo(FilterListItemInner);
@@ -1 +1 @@
1
- {"version":3,"file":"FilterListItem.js","names":["Button","classnames","React","memo","useCallback","ErrorBoundary","supportsExcluding","DragHandleIcon","ExcludeIcon","IncludeIcon","RemoveIcon","styles","FilterListItemInner","definition","filterKey","label","filterState","onFilterStateChanged","onFilterRemoved","renderInput","dragHandleAttributes","dragHandleListeners","className","style","handleFilterStateChanged","newState","handleToggleExclude","isExcluding","handleRemove","showExcludeToggle","createElement","filterItem","undefined","itemHeader","_extends","dragHandle","itemLabel","excludeToggle","onClick","removeButton","itemContent","errorMessage","FilterListItem"],"sources":["FilterListItem.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport type {\n DraggableAttributes,\n DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { ErrorBoundary } from \"../../shared/ErrorBoundary.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { supportsExcluding } from \"../utils/filterValues.js\";\nimport type { RenderFilterInput } from \"./BaseFilterListApi.js\";\nimport { DragHandleIcon } from \"./DragHandleIcon.js\";\nimport { ExcludeIcon, IncludeIcon, RemoveIcon } from \"./FilterIcons.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface FilterListItemProps<D> {\n definition: D;\n filterKey: string;\n label: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n onFilterRemoved?: (filterKey: string) => void;\n renderInput: RenderFilterInput<D>;\n dragHandleAttributes?: DraggableAttributes;\n dragHandleListeners?: DraggableSyntheticListeners;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction FilterListItemInner<D>({\n definition,\n filterKey,\n label,\n filterState,\n onFilterStateChanged,\n onFilterRemoved,\n renderInput,\n dragHandleAttributes,\n dragHandleListeners,\n className,\n style,\n}: FilterListItemProps<D>): React.ReactElement {\n const handleFilterStateChanged = useCallback(\n (newState: FilterState) => {\n onFilterStateChanged(filterKey, newState);\n },\n [filterKey, onFilterStateChanged],\n );\n\n const handleToggleExclude = useCallback(\n () => {\n if (filterState) {\n onFilterStateChanged(filterKey, {\n ...filterState,\n isExcluding: !filterState.isExcluding,\n });\n }\n },\n [filterKey, filterState, onFilterStateChanged],\n );\n\n const handleRemove = useCallback(\n () => {\n onFilterRemoved?.(filterKey);\n },\n [filterKey, onFilterRemoved],\n );\n\n const isExcluding = filterState?.isExcluding ?? false;\n const showExcludeToggle = supportsExcluding(filterState);\n\n return (\n <div\n className={classnames(styles.filterItem, className)}\n style={style}\n data-excluding={isExcluding || undefined}\n >\n <div className={styles.itemHeader}>\n {dragHandleAttributes && (\n <Button\n className={styles.dragHandle}\n aria-label={`Reorder ${label}`}\n {...dragHandleAttributes}\n {...dragHandleListeners}\n >\n <DragHandleIcon />\n </Button>\n )}\n <span className={styles.itemLabel}>{label}</span>\n {showExcludeToggle && (\n <Button\n className={styles.excludeToggle}\n onClick={handleToggleExclude}\n aria-pressed={isExcluding}\n aria-label={isExcluding\n ? \"Switch to include mode\"\n : \"Switch to exclude mode\"}\n >\n {isExcluding ? <ExcludeIcon /> : <IncludeIcon />}\n </Button>\n )}\n {onFilterRemoved && (\n <Button\n className={styles.removeButton}\n onClick={handleRemove}\n aria-label={`Remove ${label} filter`}\n >\n <RemoveIcon />\n </Button>\n )}\n </div>\n\n <div className={styles.itemContent}>\n <ErrorBoundary errorMessage=\"Error loading filter\">\n {renderInput({\n definition,\n filterKey,\n filterState,\n onFilterStateChanged: handleFilterStateChanged,\n })}\n </ErrorBoundary>\n </div>\n </div>\n );\n}\n\nexport const FilterListItem = memo(\n FilterListItemInner,\n) as typeof FilterListItemInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FilterListItem.js","names":["Button","Input","classnames","React","memo","useCallback","useState","ErrorBoundary","supportsExcluding","supportsSearch","DragHandleIcon","OverflowMenuIcon","RemoveIcon","SearchIcon","styles","FilterListItemInner","definition","filterKey","label","filterState","onFilterStateChanged","onFilterRemoved","renderInput","dragHandleAttributes","dragHandleListeners","className","style","searchState","setSearchState","type","excludeRowOpen","setExcludeRowOpen","handleFilterStateChanged","newState","handleToggleSearch","prev","query","handleSearchChange","e","target","value","handleSearchClear","handleRemove","handleToggleExcludeRow","searchInputRef","element","focus","preventScroll","showExcludeDropdown","showSearch","searchOpen","searchQuery","searchQueryForInput","undefined","createElement","filterItem","itemHeader","_extends","dragHandle","itemLabel","headerActionButton","onClick","searchRow","searchInput","onChange","placeholder","ref","searchClearButton","itemContent","errorMessage","FilterListItem"],"sources":["FilterListItem.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Input } from \"@base-ui/react/input\";\nimport type {\n DraggableAttributes,\n DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useState } from \"react\";\nimport { ErrorBoundary } from \"../../shared/ErrorBoundary.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { supportsExcluding, supportsSearch } from \"../utils/filterValues.js\";\nimport type { RenderFilterInput } from \"./BaseFilterListApi.js\";\nimport { DragHandleIcon } from \"./DragHandleIcon.js\";\nimport { OverflowMenuIcon, RemoveIcon, SearchIcon } from \"./FilterIcons.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface FilterListItemProps<D> {\n definition: D;\n filterKey: string;\n label: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n onFilterRemoved?: (filterKey: string) => void;\n renderInput: RenderFilterInput<D>;\n dragHandleAttributes?: DraggableAttributes;\n dragHandleListeners?: DraggableSyntheticListeners;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction FilterListItemInner<D>({\n definition,\n filterKey,\n label,\n filterState,\n onFilterStateChanged,\n onFilterRemoved,\n renderInput,\n dragHandleAttributes,\n dragHandleListeners,\n className,\n style,\n}: FilterListItemProps<D>): React.ReactElement {\n const [searchState, setSearchState] = useState<\n { type: \"closed\" } | { type: \"open\"; query: string }\n >({ type: \"closed\" });\n const [excludeRowOpen, setExcludeRowOpen] = useState(false);\n\n const handleFilterStateChanged = useCallback(\n (newState: FilterState) => {\n onFilterStateChanged(filterKey, newState);\n },\n [filterKey, onFilterStateChanged],\n );\n\n const handleToggleSearch = useCallback(() => {\n setSearchState((prev) =>\n prev.type === \"closed\" ? { type: \"open\", query: \"\" } : { type: \"closed\" }\n );\n }, []);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchState({ type: \"open\", query: e.target.value });\n },\n [],\n );\n\n const handleSearchClear = useCallback(() => {\n setSearchState({ type: \"open\", query: \"\" });\n }, []);\n\n const handleRemove = useCallback(() => {\n onFilterRemoved?.(filterKey);\n }, [filterKey, onFilterRemoved]);\n\n const handleToggleExcludeRow = useCallback(() => {\n setExcludeRowOpen((prev) => !prev);\n }, []);\n\n const searchInputRef = useCallback((element: HTMLInputElement | null) => {\n element?.focus({ preventScroll: true });\n }, []);\n\n const showExcludeDropdown = supportsExcluding(filterState);\n const showSearch = supportsSearch(filterState);\n const hasOverflowActions = showExcludeDropdown;\n\n const searchOpen = searchState.type === \"open\";\n const searchQuery = searchState.type === \"open\" ? searchState.query : \"\";\n const searchQueryForInput = searchState.type === \"open\"\n ? searchState.query\n : undefined;\n\n return (\n <div\n className={classnames(styles.filterItem, className)}\n style={style}\n >\n <div className={styles.itemHeader}>\n {dragHandleAttributes && (\n <Button\n className={styles.dragHandle}\n aria-label={`Reorder ${label}`}\n {...dragHandleAttributes}\n {...dragHandleListeners}\n >\n <DragHandleIcon />\n </Button>\n )}\n <span className={styles.itemLabel}>{label}</span>\n {showSearch && (\n <Button\n className={styles.headerActionButton}\n onClick={handleToggleSearch}\n aria-label=\"Search values\"\n aria-pressed={searchOpen}\n >\n <SearchIcon />\n </Button>\n )}\n {onFilterRemoved && (\n <Button\n className={styles.headerActionButton}\n onClick={handleRemove}\n aria-label={`Remove ${label} filter`}\n >\n <RemoveIcon />\n </Button>\n )}\n {hasOverflowActions && (\n <Button\n className={styles.headerActionButton}\n onClick={handleToggleExcludeRow}\n aria-label=\"More actions\"\n aria-pressed={excludeRowOpen}\n >\n <OverflowMenuIcon />\n </Button>\n )}\n </div>\n\n {searchOpen && (\n <div className={styles.searchRow}>\n <Input\n type=\"text\"\n className={styles.searchInput}\n value={searchQuery}\n onChange={handleSearchChange}\n placeholder=\"Search property values...\"\n aria-label=\"Search property values\"\n ref={searchInputRef}\n />\n {searchQuery && (\n <Button\n type=\"button\"\n className={styles.searchClearButton}\n onClick={handleSearchClear}\n aria-label=\"Clear search\"\n >\n <RemoveIcon />\n </Button>\n )}\n </div>\n )}\n\n <div className={styles.itemContent}>\n <ErrorBoundary errorMessage=\"Error loading filter\">\n {renderInput({\n definition,\n filterKey,\n filterState,\n onFilterStateChanged: handleFilterStateChanged,\n searchQuery: searchQueryForInput,\n excludeRowOpen,\n })}\n </ErrorBoundary>\n </div>\n </div>\n );\n}\n\nexport const FilterListItem = memo(\n FilterListItemInner,\n) as typeof FilterListItemInner;\n"],"mappings":"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","ignoreList":[]}
@@ -18,6 +18,8 @@
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  gap: var(--osdk-filter-item-gap);
21
+ border-radius: var(--osdk-filter-item-border-radius);
22
+ padding: var(--osdk-filter-item-padding);
21
23
  }
22
24
 
23
25
  .itemHeader {
@@ -36,6 +38,8 @@
36
38
  .itemContent {
37
39
  display: flex;
38
40
  flex-direction: column;
41
+ min-width: 0;
42
+ overflow: hidden;
39
43
  }
40
44
 
41
45
  .dragHandle {
@@ -66,59 +70,131 @@
66
70
  }
67
71
  }
68
72
 
69
- .excludeToggle {
73
+ .headerActionButton {
70
74
  display: flex;
71
75
  align-items: center;
72
76
  justify-content: center;
73
- padding: var(--osdk-filter-item-exclude-toggle-padding);
74
- margin-left: auto;
77
+ padding: var(--osdk-filter-item-header-action-padding);
78
+ margin-left: calc(var(--osdk-surface-spacing) * 0.5);
75
79
  border: none;
76
80
  background: transparent;
77
81
  cursor: pointer;
78
- border-radius: var(--osdk-filter-item-exclude-toggle-border-radius);
79
- color: var(--osdk-filter-item-exclude-toggle-color);
82
+ border-radius: var(--osdk-filter-item-header-action-border-radius);
83
+ color: var(--osdk-filter-item-header-action-color);
84
+ opacity: 0;
85
+ transition: opacity var(--osdk-filter-header-button-transition),
86
+ background-color var(--osdk-filter-header-button-transition);
80
87
 
81
88
  &:hover {
82
- color: var(--osdk-filter-item-exclude-toggle-color-hover);
83
- background: var(--osdk-filter-item-exclude-toggle-bg-hover);
89
+ color: var(--osdk-typography-color-default-rest);
90
+ background: var(--osdk-filter-item-header-action-bg-hover);
84
91
  }
85
92
 
86
93
  &:focus-visible {
94
+ opacity: 1;
87
95
  outline: var(--osdk-filter-input-focus-outline-width) solid var(--osdk-filter-input-focus-outline-color);
88
96
  outline-offset: var(--osdk-filter-input-focus-outline-offset);
89
97
  }
98
+
99
+ @media (prefers-reduced-motion: reduce) {
100
+ transition: none;
101
+ }
102
+ }
103
+
104
+ .filterItem:hover .headerActionButton {
105
+ opacity: 1;
90
106
  }
91
107
 
92
- .excludeToggle[aria-pressed="true"] {
93
- color: var(--osdk-filter-item-exclude-toggle-color-active);
108
+ .headerActionButton[data-popup-open],
109
+ .headerActionButton[aria-pressed="true"] {
110
+ opacity: 1;
94
111
  }
95
112
 
96
- .removeButton {
113
+ .searchRow {
97
114
  display: flex;
98
115
  align-items: center;
99
- justify-content: center;
100
- padding: var(--osdk-filter-item-exclude-toggle-padding);
101
- margin-left: var(--osdk-surface-spacing);
116
+ background: var(--osdk-filter-input-bg);
117
+ border: var(--osdk-filter-input-border);
118
+ border-radius: var(--osdk-filter-input-border-radius);
119
+ padding: var(--osdk-filter-input-padding);
120
+ gap: var(--osdk-filter-input-gap);
121
+
122
+ &:focus-within {
123
+ outline: var(--osdk-filter-input-focus-outline-width) solid var(--osdk-filter-input-focus-outline-color);
124
+ outline-offset: var(--osdk-filter-input-focus-outline-offset);
125
+ }
126
+ }
127
+
128
+ .searchInput {
129
+ flex: 1;
102
130
  border: none;
103
131
  background: transparent;
132
+ font-family: var(--osdk-filter-input-font-family);
133
+ font-size: var(--osdk-filter-input-font-size);
134
+ color: var(--osdk-filter-input-color);
135
+ outline: none;
136
+
137
+ &::placeholder {
138
+ color: var(--osdk-filter-input-placeholder-color);
139
+ }
140
+ }
141
+
142
+ .searchClearButton {
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ padding: var(--osdk-filter-input-clear-padding);
147
+ border: none;
148
+ background: var(--osdk-filter-input-clear-bg);
149
+ color: var(--osdk-filter-input-icon-color);
104
150
  cursor: pointer;
105
- border-radius: var(--osdk-filter-item-exclude-toggle-border-radius);
106
- color: var(--osdk-filter-item-exclude-toggle-color);
151
+ border-radius: var(--osdk-filter-input-clear-border-radius);
152
+ transition: background-color var(--osdk-filter-input-transition);
107
153
 
108
154
  &:hover {
109
- color: var(--osdk-filter-item-exclude-toggle-color-hover);
110
- background: var(--osdk-filter-item-exclude-toggle-bg-hover);
155
+ background: var(--osdk-filter-input-clear-bg-hover);
156
+ }
157
+
158
+ &:active {
159
+ background: var(--osdk-filter-input-clear-bg-active);
111
160
  }
112
161
 
113
162
  &:focus-visible {
114
163
  outline: var(--osdk-filter-input-focus-outline-width) solid var(--osdk-filter-input-focus-outline-color);
115
164
  outline-offset: var(--osdk-filter-input-focus-outline-offset);
116
165
  }
166
+
167
+ @media (prefers-reduced-motion: reduce) {
168
+ transition: none;
169
+ }
170
+ }
171
+
172
+ .excludeRow {
173
+ display: flex;
174
+ align-items: center;
175
+ opacity: 0;
176
+ height: 0;
177
+ overflow: hidden;
178
+ transition: opacity var(--osdk-filter-header-button-transition),
179
+ height var(--osdk-filter-header-button-transition);
180
+
181
+ @media (prefers-reduced-motion: reduce) {
182
+ transition: none;
183
+ }
184
+ }
185
+
186
+ .filterItem:hover [data-exclude-row],
187
+ .excludeRowVisible {
188
+ opacity: 1;
189
+ height: auto;
190
+ overflow: visible;
117
191
  }
118
192
 
119
- .filterItem[data-excluding] {
120
- border-left: var(--osdk-filter-item-exclude-border-width) solid var(--osdk-filter-item-exclude-border-color);
121
- padding-left: var(--osdk-filter-item-gap);
193
+ .excludeCountLabel {
194
+ font-family: var(--osdk-filter-item-exclude-dropdown-font-family);
195
+ font-size: var(--osdk-filter-item-exclude-dropdown-font-size);
196
+ color: var(--osdk-filter-item-exclude-dropdown-color);
197
+ margin-left: calc(var(--osdk-surface-spacing) * 0.5);
122
198
  }
123
199
 
124
200
  .dragging {
@@ -5,8 +5,13 @@ const styles = {
5
5
  "itemLabel": "FilterListItem-module__itemLabel___cEnbqE59",
6
6
  "itemContent": "FilterListItem-module__itemContent___PfVHHhIy",
7
7
  "dragHandle": "FilterListItem-module__dragHandle___BwFrILWs",
8
- "excludeToggle": "FilterListItem-module__excludeToggle___nWNDvntP",
9
- "removeButton": "FilterListItem-module__removeButton___72cjHbqK",
8
+ "headerActionButton": "FilterListItem-module__headerActionButton___x10Z2Kx0",
9
+ "searchRow": "FilterListItem-module__searchRow___4fUrAgAm",
10
+ "searchInput": "FilterListItem-module__searchInput___v-qwznpk",
11
+ "searchClearButton": "FilterListItem-module__searchClearButton___HXHweIEa",
12
+ "excludeRow": "FilterListItem-module__excludeRow___6hctgE28",
13
+ "excludeRowVisible": "FilterListItem-module__excludeRowVisible___whT6lGyR",
14
+ "excludeCountLabel": "FilterListItem-module__excludeCountLabel___7IQFUJIY",
10
15
  "dragging": "FilterListItem-module__dragging___S5-LGyfS"
11
16
  };
12
17
 
@@ -21,7 +21,7 @@ import { filterValuesBySearch } from "../../utils/filterValues.js";
21
21
  import styles from "./CheckboxListInput.module.css.js";
22
22
  import { CheckboxListSkeleton } from "./CheckboxListSkeleton.js";
23
23
  import sharedStyles from "./shared.module.css.js";
24
- import { useStaleData } from "./useStaleData.js";
24
+ import { useStableData } from "./useStableData.js";
25
25
  function CheckboxListInputInner({
26
26
  values,
27
27
  isLoading,
@@ -33,7 +33,7 @@ function CheckboxListInputInner({
33
33
  className,
34
34
  style
35
35
  }) {
36
- const stableValues = useStaleData(values, isLoading);
36
+ const stableValues = useStableData(values, isLoading);
37
37
  const displayValues = useMemo(() => {
38
38
  const allValues = stableValues.map(item => item.value);
39
39
  if (searchQuery) {
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxListInput.js","names":["classnames","React","memo","useCallback","useMemo","Checkbox","filterValuesBySearch","styles","CheckboxListSkeleton","sharedStyles","useStaleData","CheckboxListInputInner","values","isLoading","error","selectedValues","onChange","colorMap","searchQuery","className","style","stableValues","displayValues","allValues","map","item","value","v","selectedSet","Set","toggleValue","has","filter","createElement","checkboxList","length","errorMessage","message","emptyMessage","isSelected","color","key","checkboxRow","checkboxLabel","checked","onCheckedChange","colorDot","backgroundColor","valueText","CheckboxListInput"],"sources":["CheckboxListInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./CheckboxListInput.module.css\";\nimport { CheckboxListSkeleton } from \"./CheckboxListSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStaleData } from \"./useStaleData.js\";\n\ninterface CheckboxListInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (selectedValues: string[]) => void;\n colorMap?: Record<string, string>;\n searchQuery?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction CheckboxListInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n searchQuery,\n className,\n style,\n}: CheckboxListInputProps): React.ReactElement {\n const stableValues = useStaleData(values, isLoading);\n\n const displayValues = useMemo(\n () => {\n const allValues = stableValues.map((item) => item.value);\n if (searchQuery) {\n return filterValuesBySearch(allValues, searchQuery, (v) => v);\n }\n return allValues;\n },\n [stableValues, searchQuery],\n );\n\n const selectedSet = useMemo(\n () => new Set(selectedValues),\n [selectedValues],\n );\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n return (\n <div\n className={classnames(styles.checkboxList, className)}\n style={style}\n data-loading={isLoading && displayValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && displayValues.length === 0 && isLoading && (\n <CheckboxListSkeleton />\n )}\n {!error && displayValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No values available\n </div>\n )}\n\n {displayValues.map((value) => {\n const isSelected = selectedSet.has(value);\n const color = colorMap?.[value];\n\n return (\n <div\n key={value}\n className={styles.checkboxRow}\n data-selected={isSelected}\n >\n <label className={styles.checkboxLabel}>\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => toggleValue(value)}\n />\n {color && (\n <span\n className={styles.colorDot}\n style={{ backgroundColor: color }}\n />\n )}\n <span className={styles.valueText}>\n {value}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport const CheckboxListInput = memo(\n CheckboxListInputInner,\n) as typeof CheckboxListInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CheckboxListInput.js","names":["classnames","React","memo","useCallback","useMemo","Checkbox","filterValuesBySearch","styles","CheckboxListSkeleton","sharedStyles","useStableData","CheckboxListInputInner","values","isLoading","error","selectedValues","onChange","colorMap","searchQuery","className","style","stableValues","displayValues","allValues","map","item","value","v","selectedSet","Set","toggleValue","has","filter","createElement","checkboxList","length","errorMessage","message","emptyMessage","isSelected","color","key","checkboxRow","checkboxLabel","checked","onCheckedChange","colorDot","backgroundColor","valueText","CheckboxListInput"],"sources":["CheckboxListInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo } from \"react\";\nimport { Checkbox } from \"../../../base-components/checkbox/Checkbox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./CheckboxListInput.module.css\";\nimport { CheckboxListSkeleton } from \"./CheckboxListSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\ninterface CheckboxListInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (selectedValues: string[]) => void;\n colorMap?: Record<string, string>;\n searchQuery?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction CheckboxListInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n searchQuery,\n className,\n style,\n}: CheckboxListInputProps): React.ReactElement {\n const stableValues = useStableData(values, isLoading);\n\n const displayValues = useMemo(\n () => {\n const allValues = stableValues.map((item) => item.value);\n if (searchQuery) {\n return filterValuesBySearch(allValues, searchQuery, (v) => v);\n }\n return allValues;\n },\n [stableValues, searchQuery],\n );\n\n const selectedSet = useMemo(\n () => new Set(selectedValues),\n [selectedValues],\n );\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n return (\n <div\n className={classnames(styles.checkboxList, className)}\n style={style}\n data-loading={isLoading && displayValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && displayValues.length === 0 && isLoading && (\n <CheckboxListSkeleton />\n )}\n {!error && displayValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No values available\n </div>\n )}\n\n {displayValues.map((value) => {\n const isSelected = selectedSet.has(value);\n const color = colorMap?.[value];\n\n return (\n <div\n key={value}\n className={styles.checkboxRow}\n data-selected={isSelected}\n >\n <label className={styles.checkboxLabel}>\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => toggleValue(value)}\n />\n {color && (\n <span\n className={styles.colorDot}\n style={{ backgroundColor: color }}\n />\n )}\n <span className={styles.valueText}>\n {value}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport const CheckboxListInput = memo(\n CheckboxListInputInner,\n) as typeof CheckboxListInputInner;\n"],"mappings":"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","ignoreList":[]}
@@ -63,9 +63,7 @@ function ContainsTextInputInner({
63
63
  className: styles.inputGroup
64
64
  }, renderSearchIcon ? renderSearchIcon() : /*#__PURE__*/React.createElement("span", {
65
65
  className: styles.searchIcon
66
- }, /*#__PURE__*/React.createElement(Search, {
67
- color: "currentColor"
68
- })), /*#__PURE__*/React.createElement(Input, {
66
+ }, /*#__PURE__*/React.createElement(Search, null)), /*#__PURE__*/React.createElement(Input, {
69
67
  type: "text",
70
68
  className: styles.input,
71
69
  value: localValue,
@@ -77,9 +75,7 @@ function ContainsTextInputInner({
77
75
  className: styles.clearButton,
78
76
  onClick: handleClear,
79
77
  "aria-label": "Clear search"
80
- }, renderClearIcon ? renderClearIcon() : /*#__PURE__*/React.createElement(Cross, {
81
- color: "currentColor"
82
- }))));
78
+ }, renderClearIcon ? renderClearIcon() : /*#__PURE__*/React.createElement(Cross, null))));
83
79
  }
84
80
  export const ContainsTextInput = /*#__PURE__*/memo(ContainsTextInputInner);
85
81
  //# sourceMappingURL=ContainsTextInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContainsTextInput.js","names":["Button","Input","Cross","Search","classnames","debounce","React","memo","useCallback","useEffect","useMemo","useRef","useState","styles","ContainsTextInputInner","value","onChange","placeholder","debounceMs","className","style","renderSearchIcon","renderClearIcon","localValue","setLocalValue","onChangeRef","current","debouncedOnChange","newValue","length","undefined","cancel","handleInputChange","e","target","handleClear","createElement","textInput","inputGroup","searchIcon","color","type","input","clearButton","onClick","ContainsTextInput"],"sources":["ContainsTextInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Input } from \"@base-ui/react/input\";\nimport { Cross, Search } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport styles from \"./ContainsTextInput.module.css\";\n\ninterface ContainsTextInputProps {\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n placeholder?: string;\n debounceMs?: number;\n className?: string;\n style?: React.CSSProperties;\n renderSearchIcon?: () => React.ReactNode;\n renderClearIcon?: () => React.ReactNode;\n}\n\nfunction ContainsTextInputInner({\n value,\n onChange,\n placeholder = \"Search...\",\n debounceMs = 300,\n className,\n style,\n renderSearchIcon,\n renderClearIcon,\n}: ContainsTextInputProps): React.ReactElement {\n const [localValue, setLocalValue] = useState(value ?? \"\");\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const debouncedOnChange = useMemo(\n () =>\n debounce((newValue: string) => {\n onChangeRef.current(newValue.length > 0 ? newValue : undefined);\n }, debounceMs),\n [debounceMs],\n );\n\n useEffect(() => {\n return () => {\n debouncedOnChange.cancel();\n };\n }, [debouncedOnChange]);\n\n useEffect(() => {\n setLocalValue(value ?? \"\");\n debouncedOnChange.cancel();\n }, [value, debouncedOnChange]);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalValue(e.target.value);\n debouncedOnChange(e.target.value);\n },\n [debouncedOnChange],\n );\n\n const handleClear = useCallback(() => {\n setLocalValue(\"\");\n debouncedOnChange.cancel();\n onChangeRef.current(undefined);\n }, [debouncedOnChange]);\n\n return (\n <div\n className={classnames(styles.textInput, className)}\n style={style}\n data-has-value={!!localValue}\n >\n <div className={styles.inputGroup}>\n {renderSearchIcon\n ? renderSearchIcon()\n : (\n <span className={styles.searchIcon}>\n <Search color=\"currentColor\" />\n </span>\n )}\n <Input\n type=\"text\"\n className={styles.input}\n value={localValue}\n onChange={handleInputChange}\n placeholder={placeholder}\n aria-label={placeholder}\n />\n {localValue && (\n <Button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear search\"\n >\n {renderClearIcon\n ? renderClearIcon()\n : <Cross color=\"currentColor\" />}\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport const ContainsTextInput: React.NamedExoticComponent<\n ContainsTextInputProps\n> = memo(ContainsTextInputInner);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContainsTextInput.js","names":["Button","Input","Cross","Search","classnames","debounce","React","memo","useCallback","useEffect","useMemo","useRef","useState","styles","ContainsTextInputInner","value","onChange","placeholder","debounceMs","className","style","renderSearchIcon","renderClearIcon","localValue","setLocalValue","onChangeRef","current","debouncedOnChange","newValue","length","undefined","cancel","handleInputChange","e","target","handleClear","createElement","textInput","inputGroup","searchIcon","type","input","clearButton","onClick","ContainsTextInput"],"sources":["ContainsTextInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport { Input } from \"@base-ui/react/input\";\nimport { Cross, Search } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport styles from \"./ContainsTextInput.module.css\";\n\ninterface ContainsTextInputProps {\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n placeholder?: string;\n debounceMs?: number;\n className?: string;\n style?: React.CSSProperties;\n renderSearchIcon?: () => React.ReactNode;\n renderClearIcon?: () => React.ReactNode;\n}\n\nfunction ContainsTextInputInner({\n value,\n onChange,\n placeholder = \"Search...\",\n debounceMs = 300,\n className,\n style,\n renderSearchIcon,\n renderClearIcon,\n}: ContainsTextInputProps): React.ReactElement {\n const [localValue, setLocalValue] = useState(value ?? \"\");\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const debouncedOnChange = useMemo(\n () =>\n debounce((newValue: string) => {\n onChangeRef.current(newValue.length > 0 ? newValue : undefined);\n }, debounceMs),\n [debounceMs],\n );\n\n useEffect(() => {\n return () => {\n debouncedOnChange.cancel();\n };\n }, [debouncedOnChange]);\n\n useEffect(() => {\n setLocalValue(value ?? \"\");\n debouncedOnChange.cancel();\n }, [value, debouncedOnChange]);\n\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalValue(e.target.value);\n debouncedOnChange(e.target.value);\n },\n [debouncedOnChange],\n );\n\n const handleClear = useCallback(() => {\n setLocalValue(\"\");\n debouncedOnChange.cancel();\n onChangeRef.current(undefined);\n }, [debouncedOnChange]);\n\n return (\n <div\n className={classnames(styles.textInput, className)}\n style={style}\n data-has-value={!!localValue}\n >\n <div className={styles.inputGroup}>\n {renderSearchIcon\n ? renderSearchIcon()\n : (\n <span className={styles.searchIcon}>\n <Search />\n </span>\n )}\n <Input\n type=\"text\"\n className={styles.input}\n value={localValue}\n onChange={handleInputChange}\n placeholder={placeholder}\n aria-label={placeholder}\n />\n {localValue && (\n <Button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label=\"Clear search\"\n >\n {renderClearIcon\n ? renderClearIcon()\n : <Cross />}\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport const ContainsTextInput: React.NamedExoticComponent<\n ContainsTextInputProps\n> = memo(ContainsTextInputInner);\n"],"mappings":"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","ignoreList":[]}
@@ -21,7 +21,7 @@ import { filterValuesBySearch } from "../../utils/filterValues.js";
21
21
  import styles from "./ListogramInput.module.css.js";
22
22
  import { ListogramSkeleton } from "./ListogramSkeleton.js";
23
23
  import sharedStyles from "./shared.module.css.js";
24
- import { useStaleData } from "./useStaleData.js";
24
+ import { useStableData } from "./useStableData.js";
25
25
  function ListogramInputInner({
26
26
  values,
27
27
  maxCount,
@@ -37,7 +37,7 @@ function ListogramInputInner({
37
37
  searchQuery
38
38
  }) {
39
39
  const [isExpanded, setIsExpanded] = useState(false);
40
- const stableValues = useStaleData(values, isLoading);
40
+ const stableValues = useStableData(values, isLoading);
41
41
  const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);
42
42
  const toggleValue = useCallback(value => {
43
43
  if (selectedSet.has(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","filterValuesBySearch","styles","ListogramSkeleton","sharedStyles","useStaleData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","className","style","maxVisibleItems","searchQuery","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","key","row","onClick","undefined","label","bar","barFill","toLocaleString","type","ListogramInput"],"sources":["ListogramInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStaleData } from \"./useStaleData.js\";\n\nexport type ListogramDisplayMode = \"full\" | \"count\" | \"minimal\";\n\ninterface ListogramInputProps {\n values: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n colorMap?: Record<string, string>;\n displayMode?: ListogramDisplayMode;\n className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n className,\n style,\n maxVisibleItems,\n searchQuery,\n}: ListogramInputProps): React.ReactElement {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const stableValues = useStaleData(values, isLoading);\n\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n const filteredValues = useMemo(() => {\n if (searchQuery) {\n return filterValuesBySearch(stableValues, searchQuery, (v) => v.value);\n }\n return stableValues;\n }, [stableValues, searchQuery]);\n\n const displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return filteredValues;\n return filteredValues.slice(0, maxVisibleItems);\n }, [filteredValues, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null\n && filteredValues.length > maxVisibleItems;\n\n return (\n <div\n className={classnames(styles.listogram, className)}\n style={style}\n data-loading={isLoading && filteredValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && filteredValues.length === 0 && isLoading && (\n <ListogramSkeleton />\n )}\n {!error && filteredValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No values available\n </div>\n )}\n\n {filteredValues.length > 0 && (\n <div className={styles.container}>\n {displayValues.map(({ value, count }) => {\n const percentage = maxCount > 0 ? (count / maxCount) * 100 : 0;\n const perRowColor = colorMap?.[value];\n\n return (\n <Button\n key={value}\n className={styles.row}\n onClick={() => toggleValue(value)}\n aria-pressed={selectedSet.has(value)}\n style={perRowColor || percentage > 0\n ? {\n \"--osdk-filter-listogram-bar-fill-scale\": percentage / 100,\n ...(perRowColor\n ? {\n \"--osdk-filter-listogram-row-bar-color\": perRowColor,\n }\n : undefined),\n } as React.CSSProperties\n : undefined}\n >\n <span className={styles.label}>{value}</span>\n {displayMode === \"full\" && (\n <span className={styles.bar}>\n <span className={styles.barFill} />\n </span>\n )}\n {displayMode !== \"minimal\" && (\n <span className={styles.count}>\n {count.toLocaleString()}\n </span>\n )}\n </Button>\n );\n })}\n\n {hasMore && !isExpanded && (\n <Button\n type=\"button\"\n className={styles.row}\n onClick={() => setIsExpanded(true)}\n >\n View all ({filteredValues.length})\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ListogramInput = memo(\n ListogramInputInner,\n) as typeof ListogramInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","filterValuesBySearch","styles","ListogramSkeleton","sharedStyles","useStableData","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","className","style","maxVisibleItems","searchQuery","isExpanded","setIsExpanded","stableValues","selectedSet","Set","toggleValue","value","has","filter","v","filteredValues","displayValues","slice","hasMore","length","createElement","listogram","errorMessage","message","emptyMessage","container","map","count","percentage","perRowColor","key","row","onClick","undefined","label","bar","barFill","toLocaleString","type","ListogramInput"],"sources":["ListogramInput.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { filterValuesBySearch } from \"../../utils/filterValues.js\";\nimport styles from \"./ListogramInput.module.css\";\nimport { ListogramSkeleton } from \"./ListogramSkeleton.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport { useStableData } from \"./useStableData.js\";\n\nexport type ListogramDisplayMode = \"full\" | \"count\" | \"minimal\";\n\ninterface ListogramInputProps {\n values: PropertyAggregationValue[];\n maxCount: number;\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n colorMap?: Record<string, string>;\n displayMode?: ListogramDisplayMode;\n className?: string;\n style?: React.CSSProperties;\n maxVisibleItems?: number;\n searchQuery?: string;\n}\n\nfunction ListogramInputInner({\n values,\n maxCount,\n isLoading,\n error,\n selectedValues,\n onChange,\n colorMap,\n displayMode = \"full\",\n className,\n style,\n maxVisibleItems,\n searchQuery,\n}: ListogramInputProps): React.ReactElement {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const stableValues = useStableData(values, isLoading);\n\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const toggleValue = useCallback(\n (value: string) => {\n if (selectedSet.has(value)) {\n onChange(selectedValues.filter((v) => v !== value));\n } else {\n onChange([...selectedValues, value]);\n }\n },\n [selectedValues, selectedSet, onChange],\n );\n\n const filteredValues = useMemo(() => {\n if (searchQuery) {\n return filterValuesBySearch(stableValues, searchQuery, (v) => v.value);\n }\n return stableValues;\n }, [stableValues, searchQuery]);\n\n const displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return filteredValues;\n return filteredValues.slice(0, maxVisibleItems);\n }, [filteredValues, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null\n && filteredValues.length > maxVisibleItems;\n\n return (\n <div\n className={classnames(styles.listogram, className)}\n style={style}\n data-loading={isLoading && filteredValues.length > 0}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!error && filteredValues.length === 0 && isLoading && (\n <ListogramSkeleton />\n )}\n {!error && filteredValues.length === 0 && !isLoading && (\n <div className={sharedStyles.emptyMessage}>\n No values available\n </div>\n )}\n\n {filteredValues.length > 0 && (\n <div className={styles.container}>\n {displayValues.map(({ value, count }) => {\n const percentage = maxCount > 0 ? (count / maxCount) * 100 : 0;\n const perRowColor = colorMap?.[value];\n\n return (\n <Button\n key={value}\n className={styles.row}\n onClick={() => toggleValue(value)}\n aria-pressed={selectedSet.has(value)}\n style={perRowColor || percentage > 0\n ? {\n \"--osdk-filter-listogram-bar-fill-scale\": percentage / 100,\n ...(perRowColor\n ? {\n \"--osdk-filter-listogram-row-bar-color\": perRowColor,\n }\n : undefined),\n } as React.CSSProperties\n : undefined}\n >\n <span className={styles.label}>{value}</span>\n {displayMode === \"full\" && (\n <span className={styles.bar}>\n <span className={styles.barFill} />\n </span>\n )}\n {displayMode !== \"minimal\" && (\n <span className={styles.count}>\n {count.toLocaleString()}\n </span>\n )}\n </Button>\n );\n })}\n\n {hasMore && !isExpanded && (\n <Button\n type=\"button\"\n className={styles.row}\n onClick={() => setIsExpanded(true)}\n >\n View all ({filteredValues.length})\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const ListogramInput = memo(\n ListogramInputInner,\n) as typeof ListogramInputInner;\n"],"mappings":"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","ignoreList":[]}
@@ -21,7 +21,7 @@ import { debounce } from "lodash-es";
21
21
  import React, { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
22
22
  import { createHistogramBuckets, getMaxBucketCount } from "./createHistogramBuckets.js";
23
23
  import styles from "./RangeInput.module.css.js";
24
- import { useStaleData } from "./useStaleData.js";
24
+ import { useStableData } from "./useStableData.js";
25
25
  const DEBOUNCE_MS = 300;
26
26
  function RangeInputInner({
27
27
  valueCountPairs,
@@ -66,7 +66,7 @@ function RangeInputInner({
66
66
  debouncedMaxChange.cancel();
67
67
  };
68
68
  }, [debouncedMinChange, debouncedMaxChange]);
69
- const displayPairs = useStaleData(valueCountPairs, isLoading);
69
+ const displayPairs = useStableData(valueCountPairs, isLoading);
70
70
  const computedRange = useMemo(() => {
71
71
  if (displayPairs.length === 0) return {
72
72
  min: undefined,