@osdk/react-components 0.2.0-beta.19 → 0.2.0-beta.20

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 (316) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/build/browser/action-form/ActionForm.js +5 -1
  3. package/build/browser/action-form/ActionForm.js.map +1 -1
  4. package/build/browser/action-form/BaseForm.js +4 -8
  5. package/build/browser/action-form/BaseForm.js.map +1 -1
  6. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  7. package/build/browser/action-form/fields/DropdownField.js +104 -0
  8. package/build/browser/action-form/fields/DropdownField.js.map +1 -0
  9. package/build/browser/action-form/fields/FormFieldRenderer.js +23 -12
  10. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
  11. package/build/browser/action-form/fields/TextInputField.js +8 -9
  12. package/build/browser/action-form/fields/TextInputField.js.map +1 -1
  13. package/build/browser/base-components/combobox/Combobox.js +25 -3
  14. package/build/browser/base-components/combobox/Combobox.js.map +1 -1
  15. package/build/browser/base-components/combobox/Combobox.module.css +226 -46
  16. package/build/browser/base-components/combobox/Combobox.module.css.js +1 -0
  17. package/build/browser/base-components/select/Select.js +7 -1
  18. package/build/browser/base-components/select/Select.js.map +1 -1
  19. package/build/browser/base-components/select/Select.module.css +132 -35
  20. package/build/browser/base-components/select/Select.module.css.js +2 -0
  21. package/build/browser/base-components/skeleton/SkeletonBar.js +36 -0
  22. package/build/browser/base-components/skeleton/SkeletonBar.js.map +1 -0
  23. package/build/browser/base-components/skeleton/SkeletonBar.module.css +39 -0
  24. package/build/browser/base-components/skeleton/SkeletonBar.module.css.js +7 -0
  25. package/build/browser/filter-list/FilterList.js +42 -5
  26. package/build/browser/filter-list/FilterList.js.map +1 -1
  27. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  28. package/build/browser/filter-list/base/AddFilterPopover.js +45 -0
  29. package/build/browser/filter-list/base/AddFilterPopover.js.map +1 -0
  30. package/build/browser/filter-list/base/AddFilterPopover.module.css +83 -0
  31. package/build/browser/filter-list/base/AddFilterPopover.module.css.js +9 -0
  32. package/build/browser/filter-list/base/inputs/CheckboxListInput.js +16 -27
  33. package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  34. package/build/browser/filter-list/base/inputs/CheckboxListInput.module.css +15 -5
  35. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.js +46 -0
  36. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.js.map +1 -0
  37. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.module.css +32 -0
  38. package/build/browser/filter-list/base/inputs/CheckboxListSkeleton.module.css.js +8 -0
  39. package/build/browser/filter-list/base/inputs/ListogramInput.js +21 -12
  40. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  41. package/build/browser/filter-list/base/inputs/ListogramInput.module.css +13 -1
  42. package/build/browser/filter-list/base/inputs/ListogramSkeleton.js +45 -0
  43. package/build/browser/filter-list/base/inputs/ListogramSkeleton.js.map +1 -0
  44. package/build/browser/filter-list/base/inputs/ListogramSkeleton.module.css +32 -0
  45. package/build/browser/filter-list/base/inputs/ListogramSkeleton.module.css.js +8 -0
  46. package/build/browser/filter-list/base/inputs/MultiSelectInput.js +1 -1
  47. package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  48. package/build/browser/filter-list/base/inputs/RangeInput.js +13 -13
  49. package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
  50. package/build/browser/filter-list/base/inputs/RangeInput.module.css +23 -0
  51. package/build/browser/filter-list/base/inputs/TextTagsInput.js +1 -1
  52. package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
  53. package/build/browser/filter-list/base/inputs/useStaleData.js +29 -0
  54. package/build/browser/filter-list/base/inputs/useStaleData.js.map +1 -0
  55. package/build/browser/filter-list/hooks/useFilterVisibility.js +68 -0
  56. package/build/browser/filter-list/hooks/useFilterVisibility.js.map +1 -0
  57. package/build/browser/object-table/DefaultCellRenderer.js +13 -3
  58. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
  59. package/build/browser/object-table/EditableCell.js +7 -6
  60. package/build/browser/object-table/EditableCell.js.map +1 -1
  61. package/build/browser/object-table/LoadingCell.js +6 -3
  62. package/build/browser/object-table/LoadingCell.js.map +1 -1
  63. package/build/browser/object-table/LoadingRow.js +2 -1
  64. package/build/browser/object-table/LoadingRow.js.map +1 -1
  65. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  66. package/build/browser/object-table/Table.js.map +1 -1
  67. package/build/browser/object-table/TableCell.module.css +1 -0
  68. package/build/browser/object-table/components/AsyncValueCell.js +35 -0
  69. package/build/browser/object-table/components/AsyncValueCell.js.map +1 -0
  70. package/build/browser/object-table/hooks/useColumnDefs.js +3 -1
  71. package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
  72. package/build/browser/object-table/hooks/useFunctionColumnsData.js +270 -0
  73. package/build/browser/object-table/hooks/useFunctionColumnsData.js.map +1 -0
  74. package/build/browser/object-table/hooks/useObjectTableData.js +34 -13
  75. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  76. package/build/browser/object-table/utils/AsyncCellData.js +30 -0
  77. package/build/browser/object-table/utils/AsyncCellData.js.map +1 -0
  78. package/build/browser/object-table/utils/constants.js +1 -0
  79. package/build/browser/object-table/utils/constants.js.map +1 -1
  80. package/build/browser/pdf-viewer/PdfRenderer.js +88 -0
  81. package/build/browser/pdf-viewer/PdfRenderer.js.map +1 -0
  82. package/build/browser/pdf-viewer/PdfViewer.js +197 -0
  83. package/build/browser/pdf-viewer/PdfViewer.js.map +1 -0
  84. package/build/browser/pdf-viewer/PdfViewer.module.css +95 -0
  85. package/build/browser/pdf-viewer/PdfViewer.module.css.js +16 -0
  86. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.js +74 -0
  87. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.js.map +1 -0
  88. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css +65 -0
  89. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css.js +11 -0
  90. package/build/browser/pdf-viewer/PdfViewerSearchBar.js +84 -0
  91. package/build/browser/pdf-viewer/PdfViewerSearchBar.js.map +1 -0
  92. package/build/browser/pdf-viewer/PdfViewerSearchBar.module.css +65 -0
  93. package/build/browser/pdf-viewer/PdfViewerSearchBar.module.css.js +10 -0
  94. package/build/browser/pdf-viewer/PdfViewerSidebar.js +74 -0
  95. package/build/browser/pdf-viewer/PdfViewerSidebar.js.map +1 -0
  96. package/build/browser/pdf-viewer/PdfViewerSidebar.module.css +46 -0
  97. package/build/browser/pdf-viewer/PdfViewerSidebar.module.css.js +11 -0
  98. package/build/browser/pdf-viewer/PdfViewerThumbnail.js +100 -0
  99. package/build/browser/pdf-viewer/PdfViewerThumbnail.js.map +1 -0
  100. package/build/browser/pdf-viewer/PdfViewerThumbnail.module.css +26 -0
  101. package/build/browser/pdf-viewer/PdfViewerThumbnail.module.css.js +8 -0
  102. package/build/browser/pdf-viewer/PdfViewerToolbar.js +167 -0
  103. package/build/browser/pdf-viewer/PdfViewerToolbar.js.map +1 -0
  104. package/build/browser/pdf-viewer/PdfViewerToolbar.module.css +86 -0
  105. package/build/browser/pdf-viewer/PdfViewerToolbar.module.css.js +12 -0
  106. package/build/browser/pdf-viewer/constants.js +43 -0
  107. package/build/browser/pdf-viewer/constants.js.map +1 -0
  108. package/build/browser/pdf-viewer/hooks/usePdfAnnotationPortals.js +54 -0
  109. package/build/browser/pdf-viewer/hooks/usePdfAnnotationPortals.js.map +1 -0
  110. package/build/browser/pdf-viewer/hooks/usePdfDocument.js +67 -0
  111. package/build/browser/pdf-viewer/hooks/usePdfDocument.js.map +1 -0
  112. package/build/browser/pdf-viewer/hooks/usePdfViewer.js +69 -0
  113. package/build/browser/pdf-viewer/hooks/usePdfViewer.js.map +1 -0
  114. package/build/browser/pdf-viewer/hooks/usePdfViewerSearch.js +106 -0
  115. package/build/browser/pdf-viewer/hooks/usePdfViewerSearch.js.map +1 -0
  116. package/build/browser/pdf-viewer/hooks/usePdfViewerSync.js +71 -0
  117. package/build/browser/pdf-viewer/hooks/usePdfViewerSync.js.map +1 -0
  118. package/build/browser/pdf-viewer/types.js +2 -0
  119. package/build/browser/pdf-viewer/types.js.map +1 -0
  120. package/build/browser/public/experimental.js +4 -0
  121. package/build/browser/public/experimental.js.map +1 -1
  122. package/build/browser/styles.css +1008 -87
  123. package/build/cjs/public/experimental.cjs +2311 -895
  124. package/build/cjs/public/experimental.cjs.map +1 -1
  125. package/build/cjs/public/experimental.css +678 -153
  126. package/build/cjs/public/experimental.css.map +1 -1
  127. package/build/cjs/public/experimental.d.cts +114 -13
  128. package/build/esm/action-form/ActionForm.js +5 -1
  129. package/build/esm/action-form/ActionForm.js.map +1 -1
  130. package/build/esm/action-form/BaseForm.js +4 -8
  131. package/build/esm/action-form/BaseForm.js.map +1 -1
  132. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  133. package/build/esm/action-form/fields/DropdownField.js +104 -0
  134. package/build/esm/action-form/fields/DropdownField.js.map +1 -0
  135. package/build/esm/action-form/fields/FormFieldRenderer.js +23 -12
  136. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
  137. package/build/esm/action-form/fields/TextInputField.js +8 -9
  138. package/build/esm/action-form/fields/TextInputField.js.map +1 -1
  139. package/build/esm/base-components/combobox/Combobox.js +25 -3
  140. package/build/esm/base-components/combobox/Combobox.js.map +1 -1
  141. package/build/esm/base-components/combobox/Combobox.module.css +226 -46
  142. package/build/esm/base-components/select/Select.js +7 -1
  143. package/build/esm/base-components/select/Select.js.map +1 -1
  144. package/build/esm/base-components/select/Select.module.css +132 -35
  145. package/build/esm/base-components/skeleton/SkeletonBar.js +36 -0
  146. package/build/esm/base-components/skeleton/SkeletonBar.js.map +1 -0
  147. package/build/esm/base-components/skeleton/SkeletonBar.module.css +39 -0
  148. package/build/esm/filter-list/FilterList.js +42 -5
  149. package/build/esm/filter-list/FilterList.js.map +1 -1
  150. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  151. package/build/esm/filter-list/base/AddFilterPopover.js +45 -0
  152. package/build/esm/filter-list/base/AddFilterPopover.js.map +1 -0
  153. package/build/esm/filter-list/base/AddFilterPopover.module.css +83 -0
  154. package/build/esm/filter-list/base/inputs/CheckboxListInput.js +16 -27
  155. package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  156. package/build/esm/filter-list/base/inputs/CheckboxListInput.module.css +15 -5
  157. package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.js +46 -0
  158. package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.js.map +1 -0
  159. package/build/esm/filter-list/base/inputs/CheckboxListSkeleton.module.css +32 -0
  160. package/build/esm/filter-list/base/inputs/ListogramInput.js +21 -12
  161. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  162. package/build/esm/filter-list/base/inputs/ListogramInput.module.css +13 -1
  163. package/build/esm/filter-list/base/inputs/ListogramSkeleton.js +45 -0
  164. package/build/esm/filter-list/base/inputs/ListogramSkeleton.js.map +1 -0
  165. package/build/esm/filter-list/base/inputs/ListogramSkeleton.module.css +32 -0
  166. package/build/esm/filter-list/base/inputs/MultiSelectInput.js +1 -1
  167. package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
  168. package/build/esm/filter-list/base/inputs/RangeInput.js +13 -13
  169. package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
  170. package/build/esm/filter-list/base/inputs/RangeInput.module.css +23 -0
  171. package/build/esm/filter-list/base/inputs/TextTagsInput.js +1 -1
  172. package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
  173. package/build/esm/filter-list/base/inputs/useStaleData.js +29 -0
  174. package/build/esm/filter-list/base/inputs/useStaleData.js.map +1 -0
  175. package/build/esm/filter-list/hooks/useFilterVisibility.js +68 -0
  176. package/build/esm/filter-list/hooks/useFilterVisibility.js.map +1 -0
  177. package/build/esm/object-table/DefaultCellRenderer.js +13 -3
  178. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
  179. package/build/esm/object-table/EditableCell.js +7 -6
  180. package/build/esm/object-table/EditableCell.js.map +1 -1
  181. package/build/esm/object-table/LoadingCell.js +6 -3
  182. package/build/esm/object-table/LoadingCell.js.map +1 -1
  183. package/build/esm/object-table/LoadingRow.js +2 -1
  184. package/build/esm/object-table/LoadingRow.js.map +1 -1
  185. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  186. package/build/esm/object-table/Table.js.map +1 -1
  187. package/build/esm/object-table/TableCell.module.css +1 -0
  188. package/build/esm/object-table/components/AsyncValueCell.js +35 -0
  189. package/build/esm/object-table/components/AsyncValueCell.js.map +1 -0
  190. package/build/esm/object-table/hooks/useColumnDefs.js +3 -1
  191. package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
  192. package/build/esm/object-table/hooks/useFunctionColumnsData.js +270 -0
  193. package/build/esm/object-table/hooks/useFunctionColumnsData.js.map +1 -0
  194. package/build/esm/object-table/hooks/useObjectTableData.js +34 -13
  195. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  196. package/build/esm/object-table/utils/AsyncCellData.js +30 -0
  197. package/build/esm/object-table/utils/AsyncCellData.js.map +1 -0
  198. package/build/esm/object-table/utils/constants.js +1 -0
  199. package/build/esm/object-table/utils/constants.js.map +1 -1
  200. package/build/esm/pdf-viewer/PdfRenderer.js +88 -0
  201. package/build/esm/pdf-viewer/PdfRenderer.js.map +1 -0
  202. package/build/esm/pdf-viewer/PdfViewer.js +197 -0
  203. package/build/esm/pdf-viewer/PdfViewer.js.map +1 -0
  204. package/build/esm/pdf-viewer/PdfViewer.module.css +95 -0
  205. package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.js +74 -0
  206. package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.js.map +1 -0
  207. package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.module.css +65 -0
  208. package/build/esm/pdf-viewer/PdfViewerSearchBar.js +84 -0
  209. package/build/esm/pdf-viewer/PdfViewerSearchBar.js.map +1 -0
  210. package/build/esm/pdf-viewer/PdfViewerSearchBar.module.css +65 -0
  211. package/build/esm/pdf-viewer/PdfViewerSidebar.js +74 -0
  212. package/build/esm/pdf-viewer/PdfViewerSidebar.js.map +1 -0
  213. package/build/esm/pdf-viewer/PdfViewerSidebar.module.css +46 -0
  214. package/build/esm/pdf-viewer/PdfViewerThumbnail.js +100 -0
  215. package/build/esm/pdf-viewer/PdfViewerThumbnail.js.map +1 -0
  216. package/build/esm/pdf-viewer/PdfViewerThumbnail.module.css +26 -0
  217. package/build/esm/pdf-viewer/PdfViewerToolbar.js +167 -0
  218. package/build/esm/pdf-viewer/PdfViewerToolbar.js.map +1 -0
  219. package/build/esm/pdf-viewer/PdfViewerToolbar.module.css +86 -0
  220. package/build/esm/pdf-viewer/constants.js +43 -0
  221. package/build/esm/pdf-viewer/constants.js.map +1 -0
  222. package/build/esm/pdf-viewer/hooks/usePdfAnnotationPortals.js +54 -0
  223. package/build/esm/pdf-viewer/hooks/usePdfAnnotationPortals.js.map +1 -0
  224. package/build/esm/pdf-viewer/hooks/usePdfDocument.js +67 -0
  225. package/build/esm/pdf-viewer/hooks/usePdfDocument.js.map +1 -0
  226. package/build/esm/pdf-viewer/hooks/usePdfViewer.js +69 -0
  227. package/build/esm/pdf-viewer/hooks/usePdfViewer.js.map +1 -0
  228. package/build/esm/pdf-viewer/hooks/usePdfViewerSearch.js +106 -0
  229. package/build/esm/pdf-viewer/hooks/usePdfViewerSearch.js.map +1 -0
  230. package/build/esm/pdf-viewer/hooks/usePdfViewerSync.js +71 -0
  231. package/build/esm/pdf-viewer/hooks/usePdfViewerSync.js.map +1 -0
  232. package/build/esm/pdf-viewer/types.js +2 -0
  233. package/build/esm/pdf-viewer/types.js.map +1 -0
  234. package/build/esm/public/experimental.js +4 -0
  235. package/build/esm/public/experimental.js.map +1 -1
  236. package/build/types/action-form/FormFieldApi.d.ts +48 -37
  237. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  238. package/build/types/action-form/fields/DropdownField.d.ts +6 -0
  239. package/build/types/action-form/fields/DropdownField.d.ts.map +1 -0
  240. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
  241. package/build/types/action-form/fields/TextInputField.d.ts +3 -1
  242. package/build/types/action-form/fields/TextInputField.d.ts.map +1 -1
  243. package/build/types/base-components/combobox/Combobox.d.ts +9 -1
  244. package/build/types/base-components/combobox/Combobox.d.ts.map +1 -1
  245. package/build/types/base-components/select/Select.d.ts +8 -2
  246. package/build/types/base-components/select/Select.d.ts.map +1 -1
  247. package/build/types/base-components/skeleton/SkeletonBar.d.ts +9 -0
  248. package/build/types/base-components/skeleton/SkeletonBar.d.ts.map +1 -0
  249. package/build/types/filter-list/FilterList.d.ts.map +1 -1
  250. package/build/types/filter-list/FilterListApi.d.ts +24 -6
  251. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  252. package/build/types/filter-list/base/AddFilterPopover.d.ts +12 -0
  253. package/build/types/filter-list/base/AddFilterPopover.d.ts.map +1 -0
  254. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts +2 -1
  255. package/build/types/filter-list/base/inputs/CheckboxListInput.d.ts.map +1 -1
  256. package/build/types/filter-list/base/inputs/CheckboxListSkeleton.d.ts +2 -0
  257. package/build/types/filter-list/base/inputs/CheckboxListSkeleton.d.ts.map +1 -0
  258. package/build/types/filter-list/base/inputs/ListogramInput.d.ts +2 -1
  259. package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
  260. package/build/types/filter-list/base/inputs/ListogramSkeleton.d.ts +2 -0
  261. package/build/types/filter-list/base/inputs/ListogramSkeleton.d.ts.map +1 -0
  262. package/build/types/filter-list/base/inputs/RangeInput.d.ts.map +1 -1
  263. package/build/types/filter-list/base/inputs/useStaleData.d.ts +1 -0
  264. package/build/types/filter-list/base/inputs/useStaleData.d.ts.map +1 -0
  265. package/build/types/filter-list/hooks/useFilterVisibility.d.ts +8 -0
  266. package/build/types/filter-list/hooks/useFilterVisibility.d.ts.map +1 -0
  267. package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
  268. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  269. package/build/types/object-table/LoadingCell.d.ts +1 -0
  270. package/build/types/object-table/LoadingCell.d.ts.map +1 -1
  271. package/build/types/object-table/LoadingRow.d.ts.map +1 -1
  272. package/build/types/object-table/ObjectTableApi.d.ts +51 -15
  273. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  274. package/build/types/object-table/Table.d.ts +1 -0
  275. package/build/types/object-table/Table.d.ts.map +1 -1
  276. package/build/types/object-table/components/AsyncValueCell.d.ts +5 -0
  277. package/build/types/object-table/components/AsyncValueCell.d.ts.map +1 -0
  278. package/build/types/object-table/hooks/useFunctionColumnsData.d.ts +13 -0
  279. package/build/types/object-table/hooks/useFunctionColumnsData.d.ts.map +1 -0
  280. package/build/types/object-table/hooks/useObjectTableData.d.ts +8 -1
  281. package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
  282. package/build/types/object-table/utils/AsyncCellData.d.ts +8 -0
  283. package/build/types/object-table/utils/AsyncCellData.d.ts.map +1 -0
  284. package/build/types/object-table/utils/constants.d.ts +1 -0
  285. package/build/types/object-table/utils/constants.d.ts.map +1 -1
  286. package/build/types/pdf-viewer/PdfRenderer.d.ts +8 -0
  287. package/build/types/pdf-viewer/PdfRenderer.d.ts.map +1 -0
  288. package/build/types/pdf-viewer/PdfViewer.d.ts +4 -0
  289. package/build/types/pdf-viewer/PdfViewer.d.ts.map +1 -0
  290. package/build/types/pdf-viewer/PdfViewerAnnotationLayer.d.ts +10 -0
  291. package/build/types/pdf-viewer/PdfViewerAnnotationLayer.d.ts.map +1 -0
  292. package/build/types/pdf-viewer/PdfViewerSearchBar.d.ts +12 -0
  293. package/build/types/pdf-viewer/PdfViewerSearchBar.d.ts.map +1 -0
  294. package/build/types/pdf-viewer/PdfViewerSidebar.d.ts +10 -0
  295. package/build/types/pdf-viewer/PdfViewerSidebar.d.ts.map +1 -0
  296. package/build/types/pdf-viewer/PdfViewerThumbnail.d.ts +10 -0
  297. package/build/types/pdf-viewer/PdfViewerThumbnail.d.ts.map +1 -0
  298. package/build/types/pdf-viewer/PdfViewerToolbar.d.ts +14 -0
  299. package/build/types/pdf-viewer/PdfViewerToolbar.d.ts.map +1 -0
  300. package/build/types/pdf-viewer/constants.d.ts +17 -0
  301. package/build/types/pdf-viewer/constants.d.ts.map +1 -0
  302. package/build/types/pdf-viewer/hooks/usePdfAnnotationPortals.d.ts +10 -0
  303. package/build/types/pdf-viewer/hooks/usePdfAnnotationPortals.d.ts.map +1 -0
  304. package/build/types/pdf-viewer/hooks/usePdfDocument.d.ts +9 -0
  305. package/build/types/pdf-viewer/hooks/usePdfDocument.d.ts.map +1 -0
  306. package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts +9 -0
  307. package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts.map +1 -0
  308. package/build/types/pdf-viewer/hooks/usePdfViewerSearch.d.ts +15 -0
  309. package/build/types/pdf-viewer/hooks/usePdfViewerSearch.d.ts.map +1 -0
  310. package/build/types/pdf-viewer/hooks/usePdfViewerSync.d.ts +15 -0
  311. package/build/types/pdf-viewer/hooks/usePdfViewerSync.d.ts.map +1 -0
  312. package/build/types/pdf-viewer/types.d.ts +44 -0
  313. package/build/types/pdf-viewer/types.d.ts.map +1 -0
  314. package/build/types/public/experimental.d.ts +4 -1
  315. package/build/types/public/experimental.d.ts.map +1 -1
  316. package/package.json +5 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxListSkeleton.js","names":["React","SkeletonBar","styles","SKELETON_ROWS","textWidth","CHECKBOX_SIZE","CheckboxListSkeleton","createElement","className","container","map","row","index","key","width","height","maxWidth","flexBar"],"sources":["CheckboxListSkeleton.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 React from \"react\";\nimport { SkeletonBar } from \"../../../base-components/skeleton/SkeletonBar.js\";\nimport styles from \"./CheckboxListSkeleton.module.css\";\n\nconst SKELETON_ROWS = [\n { textWidth: \"60%\" },\n { textWidth: \"45%\" },\n { textWidth: \"70%\" },\n];\n\nconst CHECKBOX_SIZE =\n \"calc(var(--osdk-checkbox-icon-size) + var(--osdk-checkbox-padding) * 2)\";\n\nexport function CheckboxListSkeleton(): React.ReactElement {\n return (\n <div className={styles.container}>\n {SKELETON_ROWS.map((row, index) => (\n <div key={index} className={styles.row}>\n <SkeletonBar\n width={CHECKBOX_SIZE}\n height={CHECKBOX_SIZE}\n />\n <SkeletonBar\n height=\"var(--osdk-filter-skeleton-text-height)\"\n maxWidth={row.textWidth}\n className={styles.flexBar}\n />\n <SkeletonBar\n width=\"var(--osdk-filter-skeleton-count-width)\"\n height=\"var(--osdk-filter-skeleton-text-height)\"\n />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,WAAW,QAAQ,kDAAkD;AAC9E,OAAOC,MAAM,MAAM,mCAAmC;AAEtD,MAAMC,aAAa,GAAG,CACpB;EAAEC,SAAS,EAAE;AAAM,CAAC,EACpB;EAAEA,SAAS,EAAE;AAAM,CAAC,EACpB;EAAEA,SAAS,EAAE;AAAM,CAAC,CACrB;AAED,MAAMC,aAAa,GACjB,yEAAyE;AAE3E,OAAO,SAASC,oBAAoBA,CAAA,EAAuB;EACzD,oBACEN,KAAA,CAAAO,aAAA;IAAKC,SAAS,EAAEN,MAAM,CAACO;EAAU,GAC9BN,aAAa,CAACO,GAAG,CAAC,CAACC,GAAG,EAAEC,KAAK,kBAC5BZ,KAAA,CAAAO,aAAA;IAAKM,GAAG,EAAED,KAAM;IAACJ,SAAS,EAAEN,MAAM,CAACS;EAAI,gBACrCX,KAAA,CAAAO,aAAA,CAACN,WAAW;IACVa,KAAK,EAAET,aAAc;IACrBU,MAAM,EAAEV;EAAc,CACvB,CAAC,eACFL,KAAA,CAAAO,aAAA,CAACN,WAAW;IACVc,MAAM,EAAC,yCAAyC;IAChDC,QAAQ,EAAEL,GAAG,CAACP,SAAU;IACxBI,SAAS,EAAEN,MAAM,CAACe;EAAQ,CAC3B,CAAC,eACFjB,KAAA,CAAAO,aAAA,CAACN,WAAW;IACVa,KAAK,EAAC,yCAAyC;IAC/CC,MAAM,EAAC;EAAyC,CACjD,CACE,CACN,CACE,CAAC;AAEV","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ .container {
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: var(--osdk-filter-checkbox-list-gap);
21
+ }
22
+
23
+ .row {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--osdk-filter-checkbox-label-gap);
27
+ padding: var(--osdk-filter-checkbox-row-padding);
28
+ }
29
+
30
+ .flexBar {
31
+ flex: 1;
32
+ }
@@ -0,0 +1,8 @@
1
+ // CSS Module proxy for CheckboxListSkeleton.module.css
2
+ const styles = {
3
+ "container": "CheckboxListSkeleton-module__container___34VQnT36",
4
+ "row": "CheckboxListSkeleton-module__row___j6zYcQ2Q",
5
+ "flexBar": "CheckboxListSkeleton-module__flexBar___6K266kRa"
6
+ };
7
+
8
+ export default styles;
@@ -17,8 +17,11 @@
17
17
  import { Button } from "@base-ui/react/button";
18
18
  import classnames from "classnames";
19
19
  import React, { memo, useCallback, useMemo, useState } from "react";
20
+ import { filterValuesBySearch } from "../../utils/filterValues.js";
20
21
  import styles from "./ListogramInput.module.css.js";
22
+ import { ListogramSkeleton } from "./ListogramSkeleton.js";
21
23
  import sharedStyles from "./shared.module.css.js";
24
+ import { useStaleData } from "./useStaleData.js";
22
25
  function ListogramInputInner({
23
26
  values,
24
27
  maxCount,
@@ -30,9 +33,11 @@ function ListogramInputInner({
30
33
  displayMode = "full",
31
34
  className,
32
35
  style,
33
- maxVisibleItems
36
+ maxVisibleItems,
37
+ searchQuery
34
38
  }) {
35
39
  const [isExpanded, setIsExpanded] = useState(false);
40
+ const stableValues = useStaleData(values, isLoading);
36
41
  const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);
37
42
  const toggleValue = useCallback(value => {
38
43
  if (selectedSet.has(value)) {
@@ -41,22 +46,26 @@ function ListogramInputInner({
41
46
  onChange([...selectedValues, value]);
42
47
  }
43
48
  }, [selectedValues, selectedSet, onChange]);
49
+ const filteredValues = useMemo(() => {
50
+ if (searchQuery) {
51
+ return filterValuesBySearch(stableValues, searchQuery, v => v.value);
52
+ }
53
+ return stableValues;
54
+ }, [stableValues, searchQuery]);
44
55
  const displayValues = useMemo(() => {
45
- if (isExpanded || !maxVisibleItems) return values;
46
- return values.slice(0, maxVisibleItems);
47
- }, [values, maxVisibleItems, isExpanded]);
48
- const hasMore = maxVisibleItems != null && values.length > maxVisibleItems;
56
+ if (isExpanded || !maxVisibleItems) return filteredValues;
57
+ return filteredValues.slice(0, maxVisibleItems);
58
+ }, [filteredValues, maxVisibleItems, isExpanded]);
59
+ const hasMore = maxVisibleItems != null && filteredValues.length > maxVisibleItems;
49
60
  return /*#__PURE__*/React.createElement("div", {
50
61
  className: classnames(styles.listogram, className),
51
62
  style: style,
52
- "data-loading": isLoading
53
- }, isLoading && /*#__PURE__*/React.createElement("div", {
54
- className: sharedStyles.loadingMessage
55
- }, "Loading values..."), error && /*#__PURE__*/React.createElement("div", {
63
+ "data-loading": isLoading && filteredValues.length > 0
64
+ }, error && /*#__PURE__*/React.createElement("div", {
56
65
  className: sharedStyles.errorMessage
57
- }, "Error loading values: ", error.message), !isLoading && !error && values.length === 0 && /*#__PURE__*/React.createElement("div", {
66
+ }, "Error loading values: ", error.message), !error && filteredValues.length === 0 && isLoading && /*#__PURE__*/React.createElement(ListogramSkeleton, null), !error && filteredValues.length === 0 && !isLoading && /*#__PURE__*/React.createElement("div", {
58
67
  className: sharedStyles.emptyMessage
59
- }, "No values available"), (values.length > 0 || isLoading) && /*#__PURE__*/React.createElement("div", {
68
+ }, "No values available"), filteredValues.length > 0 && /*#__PURE__*/React.createElement("div", {
60
69
  className: styles.container
61
70
  }, displayValues.map(({
62
71
  value,
@@ -88,7 +97,7 @@ function ListogramInputInner({
88
97
  type: "button",
89
98
  className: styles.row,
90
99
  onClick: () => setIsExpanded(true)
91
- }, "View all (", values.length, ")")));
100
+ }, "View all (", filteredValues.length, ")")));
92
101
  }
93
102
  export const ListogramInput = /*#__PURE__*/memo(ListogramInputInner);
94
103
  //# sourceMappingURL=ListogramInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListogramInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","styles","sharedStyles","ListogramInputInner","values","maxCount","isLoading","error","selectedValues","onChange","colorMap","displayMode","className","style","maxVisibleItems","isExpanded","setIsExpanded","selectedSet","Set","toggleValue","value","has","filter","v","displayValues","slice","hasMore","length","createElement","listogram","loadingMessage","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 styles from \"./ListogramInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\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}\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}: ListogramInputProps): React.ReactElement {\n const [isExpanded, setIsExpanded] = useState(false);\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 displayValues = useMemo(() => {\n if (isExpanded || !maxVisibleItems) return values;\n return values.slice(0, maxVisibleItems);\n }, [values, maxVisibleItems, isExpanded]);\n\n const hasMore = maxVisibleItems != null && values.length > maxVisibleItems;\n\n return (\n <div\n className={classnames(styles.listogram, className)}\n style={style}\n data-loading={isLoading}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading values...\n </div>\n )}\n\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading values: {error.message}\n </div>\n )}\n\n {!isLoading && !error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n No values available\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\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 ({values.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","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":[]}
@@ -17,6 +17,17 @@
17
17
  .listogram {
18
18
  display: flex;
19
19
  flex-direction: column;
20
+ transition: opacity var(--osdk-filter-content-fade-duration);
21
+ }
22
+
23
+ .listogram[data-loading="true"] {
24
+ opacity: 0.5;
25
+ }
26
+
27
+ @media (prefers-reduced-motion: reduce) {
28
+ .listogram {
29
+ transition: none;
30
+ }
20
31
  }
21
32
 
22
33
  .container {
@@ -63,7 +74,8 @@
63
74
  }
64
75
 
65
76
  .bar {
66
- flex: 2;
77
+ width: var(--osdk-filter-listogram-bar-width);
78
+ flex-shrink: 0;
67
79
  height: var(--osdk-filter-listogram-bar-height);
68
80
  background: var(--osdk-filter-listogram-bar-bg);
69
81
  border-radius: var(--osdk-filter-listogram-bar-border-radius);
@@ -0,0 +1,45 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import React from "react";
18
+ import { SkeletonBar } from "../../../base-components/skeleton/SkeletonBar.js";
19
+ import styles from "./ListogramSkeleton.module.css.js";
20
+ const SKELETON_ROWS = [{
21
+ textWidth: "50%"
22
+ }, {
23
+ textWidth: "35%"
24
+ }, {
25
+ textWidth: "60%"
26
+ }];
27
+ export function ListogramSkeleton() {
28
+ return /*#__PURE__*/React.createElement("div", {
29
+ className: styles.container
30
+ }, SKELETON_ROWS.map((row, index) => /*#__PURE__*/React.createElement("div", {
31
+ key: index,
32
+ className: styles.row
33
+ }, /*#__PURE__*/React.createElement(SkeletonBar, {
34
+ height: "var(--osdk-filter-skeleton-text-height)",
35
+ maxWidth: row.textWidth,
36
+ className: styles.flexBar
37
+ }), /*#__PURE__*/React.createElement(SkeletonBar, {
38
+ width: "var(--osdk-filter-listogram-bar-width)",
39
+ height: "var(--osdk-filter-listogram-bar-height)"
40
+ }), /*#__PURE__*/React.createElement(SkeletonBar, {
41
+ width: "var(--osdk-filter-skeleton-count-width)",
42
+ height: "var(--osdk-filter-skeleton-text-height)"
43
+ }))));
44
+ }
45
+ //# sourceMappingURL=ListogramSkeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListogramSkeleton.js","names":["React","SkeletonBar","styles","SKELETON_ROWS","textWidth","ListogramSkeleton","createElement","className","container","map","row","index","key","height","maxWidth","flexBar","width"],"sources":["ListogramSkeleton.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 React from \"react\";\nimport { SkeletonBar } from \"../../../base-components/skeleton/SkeletonBar.js\";\nimport styles from \"./ListogramSkeleton.module.css\";\n\nconst SKELETON_ROWS = [\n { textWidth: \"50%\" },\n { textWidth: \"35%\" },\n { textWidth: \"60%\" },\n];\n\nexport function ListogramSkeleton(): React.ReactElement {\n return (\n <div className={styles.container}>\n {SKELETON_ROWS.map((row, index) => (\n <div key={index} className={styles.row}>\n <SkeletonBar\n height=\"var(--osdk-filter-skeleton-text-height)\"\n maxWidth={row.textWidth}\n className={styles.flexBar}\n />\n <SkeletonBar\n width=\"var(--osdk-filter-listogram-bar-width)\"\n height=\"var(--osdk-filter-listogram-bar-height)\"\n />\n <SkeletonBar\n width=\"var(--osdk-filter-skeleton-count-width)\"\n height=\"var(--osdk-filter-skeleton-text-height)\"\n />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,WAAW,QAAQ,kDAAkD;AAC9E,OAAOC,MAAM,MAAM,gCAAgC;AAEnD,MAAMC,aAAa,GAAG,CACpB;EAAEC,SAAS,EAAE;AAAM,CAAC,EACpB;EAAEA,SAAS,EAAE;AAAM,CAAC,EACpB;EAAEA,SAAS,EAAE;AAAM,CAAC,CACrB;AAED,OAAO,SAASC,iBAAiBA,CAAA,EAAuB;EACtD,oBACEL,KAAA,CAAAM,aAAA;IAAKC,SAAS,EAAEL,MAAM,CAACM;EAAU,GAC9BL,aAAa,CAACM,GAAG,CAAC,CAACC,GAAG,EAAEC,KAAK,kBAC5BX,KAAA,CAAAM,aAAA;IAAKM,GAAG,EAAED,KAAM;IAACJ,SAAS,EAAEL,MAAM,CAACQ;EAAI,gBACrCV,KAAA,CAAAM,aAAA,CAACL,WAAW;IACVY,MAAM,EAAC,yCAAyC;IAChDC,QAAQ,EAAEJ,GAAG,CAACN,SAAU;IACxBG,SAAS,EAAEL,MAAM,CAACa;EAAQ,CAC3B,CAAC,eACFf,KAAA,CAAAM,aAAA,CAACL,WAAW;IACVe,KAAK,EAAC,wCAAwC;IAC9CH,MAAM,EAAC;EAAyC,CACjD,CAAC,eACFb,KAAA,CAAAM,aAAA,CAACL,WAAW;IACVe,KAAK,EAAC,yCAAyC;IAC/CH,MAAM,EAAC;EAAyC,CACjD,CACE,CACN,CACE,CAAC;AAEV","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ .container {
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: var(--osdk-filter-listogram-gap);
21
+ }
22
+
23
+ .row {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: var(--osdk-filter-listogram-row-gap);
27
+ padding: var(--osdk-filter-listogram-row-padding);
28
+ }
29
+
30
+ .flexBar {
31
+ flex: 1;
32
+ }
@@ -0,0 +1,8 @@
1
+ // CSS Module proxy for ListogramSkeleton.module.css
2
+ const styles = {
3
+ "container": "ListogramSkeleton-module__container___OhztnRu9",
4
+ "row": "ListogramSkeleton-module__row___-JgFlzSX",
5
+ "flexBar": "ListogramSkeleton-module__flexBar___ohU5Nawa"
6
+ };
7
+
8
+ export default styles;
@@ -72,7 +72,7 @@ function MultiSelectInputInner({
72
72
  className: sharedStyles.tag
73
73
  }, "+", remainingCount, " more")), /*#__PURE__*/React.createElement("div", {
74
74
  className: styles.inputRow
75
- }, /*#__PURE__*/React.createElement(Combobox.Input, {
75
+ }, /*#__PURE__*/React.createElement(Combobox.SearchInput, {
76
76
  placeholder: selectedValues.length > 0 ? `${selectedValues.length} selected` : placeholder,
77
77
  "aria-label": ariaLabel
78
78
  }), showClearAll && selectedValues.length > 0 && /*#__PURE__*/React.createElement(Combobox.Clear, {
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectInput.js","names":["Button","classnames","React","memo","useCallback","Combobox","styles","sharedStyles","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","maxDisplayedTags","showClearAll","ariaLabel","handleValueChange","newValues","removeValue","value","filter","v","clearAll","displayedTags","slice","remainingCount","length","createElement","multiSelect","errorMessage","message","emptyMessage","Root","multiple","onValueChange","loadingMessage","tagContainer","map","key","tag","type","tagRemove","onClick","inputRow","Input","Clear","clearButton","Portal","Positioner","Popup","Empty","count","Item","itemCount","toLocaleString","MultiSelectInput"],"sources":["MultiSelectInput.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 } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n maxDisplayedTags?: number;\n showClearAll?: boolean;\n ariaLabel?: string;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n maxDisplayedTags = 3,\n showClearAll = true,\n ariaLabel = \"Search values\",\n}: MultiSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const removeValue = useCallback(\n (value: string) => {\n onChange(selectedValues.filter((v) => v !== value));\n },\n [selectedValues, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const displayedTags = selectedValues.slice(0, maxDisplayedTags);\n const remainingCount = selectedValues.length - maxDisplayedTags;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n {isLoading ? \"Loading options...\" : \"No options available\"}\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <Combobox.Root<string, true>\n multiple\n value={selectedValues}\n onValueChange={handleValueChange}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Updating...\n </div>\n )}\n\n {selectedValues.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {displayedTags.map((value) => (\n <span key={value} className={sharedStyles.tag}>\n {value}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={() =>\n removeValue(value)}\n aria-label={`Remove ${value}`}\n >\n ×\n </Button>\n </span>\n ))}\n {remainingCount > 0 && (\n <span className={sharedStyles.tag}>\n +{remainingCount} more\n </span>\n )}\n </div>\n )}\n\n <div className={styles.inputRow}>\n <Combobox.Input\n placeholder={selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n aria-label={ariaLabel}\n />\n {showClearAll && selectedValues.length > 0 && (\n <Combobox.Clear\n className={styles.clearButton}\n onClick={clearAll}\n aria-label=\"Clear all selections\"\n />\n )}\n </div>\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {values.length === 0\n ? <Combobox.Empty>No options available</Combobox.Empty>\n : values.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <span>{value}</span>\n <span className={styles.itemCount}>\n ({count.toLocaleString()})\n </span>\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n )}\n </div>\n );\n}\n\nexport const MultiSelectInput = memo(\n MultiSelectInputInner,\n) as typeof MultiSelectInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MultiSelectInput.js","names":["Button","classnames","React","memo","useCallback","Combobox","styles","sharedStyles","MultiSelectInputInner","values","isLoading","error","selectedValues","onChange","className","style","placeholder","maxDisplayedTags","showClearAll","ariaLabel","handleValueChange","newValues","removeValue","value","filter","v","clearAll","displayedTags","slice","remainingCount","length","createElement","multiSelect","errorMessage","message","emptyMessage","Root","multiple","onValueChange","loadingMessage","tagContainer","map","key","tag","type","tagRemove","onClick","inputRow","SearchInput","Clear","clearButton","Portal","Positioner","Popup","Empty","count","Item","itemCount","toLocaleString","MultiSelectInput"],"sources":["MultiSelectInput.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 } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport styles from \"./MultiSelectInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\ninterface MultiSelectInputProps {\n values: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n selectedValues: string[];\n onChange: (values: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n maxDisplayedTags?: number;\n showClearAll?: boolean;\n ariaLabel?: string;\n}\n\nfunction MultiSelectInputInner({\n values,\n isLoading,\n error,\n selectedValues,\n onChange,\n className,\n style,\n placeholder = \"Select values...\",\n maxDisplayedTags = 3,\n showClearAll = true,\n ariaLabel = \"Search values\",\n}: MultiSelectInputProps): React.ReactElement {\n const handleValueChange = useCallback(\n (newValues: string[] | null) => {\n onChange(newValues ?? []);\n },\n [onChange],\n );\n\n const removeValue = useCallback(\n (value: string) => {\n onChange(selectedValues.filter((v) => v !== value));\n },\n [selectedValues, onChange],\n );\n\n const clearAll = useCallback(() => {\n onChange([]);\n }, [onChange]);\n\n const displayedTags = selectedValues.slice(0, maxDisplayedTags);\n const remainingCount = selectedValues.length - maxDisplayedTags;\n\n return (\n <div\n className={classnames(styles.multiSelect, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading options: {error.message}\n </div>\n )}\n\n {!error && values.length === 0 && (\n <div className={sharedStyles.emptyMessage}>\n {isLoading ? \"Loading options...\" : \"No options available\"}\n </div>\n )}\n\n {(values.length > 0 || isLoading) && (\n <Combobox.Root<string, true>\n multiple\n value={selectedValues}\n onValueChange={handleValueChange}\n >\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Updating...\n </div>\n )}\n\n {selectedValues.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {displayedTags.map((value) => (\n <span key={value} className={sharedStyles.tag}>\n {value}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={() =>\n removeValue(value)}\n aria-label={`Remove ${value}`}\n >\n ×\n </Button>\n </span>\n ))}\n {remainingCount > 0 && (\n <span className={sharedStyles.tag}>\n +{remainingCount} more\n </span>\n )}\n </div>\n )}\n\n <div className={styles.inputRow}>\n <Combobox.SearchInput\n placeholder={selectedValues.length > 0\n ? `${selectedValues.length} selected`\n : placeholder}\n aria-label={ariaLabel}\n />\n {showClearAll && selectedValues.length > 0 && (\n <Combobox.Clear\n className={styles.clearButton}\n onClick={clearAll}\n aria-label=\"Clear all selections\"\n />\n )}\n </div>\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {values.length === 0\n ? <Combobox.Empty>No options available</Combobox.Empty>\n : values.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n <span>{value}</span>\n <span className={styles.itemCount}>\n ({count.toLocaleString()})\n </span>\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n )}\n </div>\n );\n}\n\nexport const MultiSelectInput = memo(\n MultiSelectInputInner,\n) as typeof MultiSelectInputInner;\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 sharedStyles from "./shared.module.css.js";
24
+ import { useStaleData } from "./useStaleData.js";
25
25
  const DEBOUNCE_MS = 300;
26
26
  function RangeInputInner({
27
27
  valueCountPairs,
@@ -66,31 +66,32 @@ function RangeInputInner({
66
66
  debouncedMaxChange.cancel();
67
67
  };
68
68
  }, [debouncedMinChange, debouncedMaxChange]);
69
+ const displayPairs = useStaleData(valueCountPairs, isLoading);
69
70
  const computedRange = useMemo(() => {
70
- if (valueCountPairs.length === 0) return {
71
+ if (displayPairs.length === 0) return {
71
72
  min: undefined,
72
73
  max: undefined
73
74
  };
74
- const min = valueCountPairs.reduce((acc, p) => Math.min(acc, config.toNumber(p.value)), Infinity);
75
- const max = valueCountPairs.reduce((acc, p) => Math.max(acc, config.toNumber(p.value)), -Infinity);
75
+ const min = displayPairs.reduce((acc, p) => Math.min(acc, config.toNumber(p.value)), Infinity);
76
+ const max = displayPairs.reduce((acc, p) => Math.max(acc, config.toNumber(p.value)), -Infinity);
76
77
  return {
77
78
  min: config.fromNumber(min),
78
79
  max: config.fromNumber(max)
79
80
  };
80
- }, [valueCountPairs, config]);
81
+ }, [displayPairs, config]);
81
82
  const dataRange = useMemo(() => ({
82
83
  dataMin: computedRange.min,
83
84
  dataMax: computedRange.max
84
85
  }), [computedRange.min, computedRange.max]);
85
86
  const buckets = useMemo(() => {
86
- if (!showHistogram || valueCountPairs.length === 0 || computedRange.min === undefined || computedRange.max === undefined) {
87
+ if (!showHistogram || displayPairs.length === 0 || computedRange.min === undefined || computedRange.max === undefined) {
87
88
  return [];
88
89
  }
89
- return createHistogramBuckets(valueCountPairs, {
90
+ return createHistogramBuckets(displayPairs, {
90
91
  min: computedRange.min,
91
92
  max: computedRange.max
92
93
  }, config.toNumber, config.fromNumber);
93
- }, [showHistogram, valueCountPairs, computedRange, config]);
94
+ }, [showHistogram, displayPairs, computedRange, config]);
94
95
  const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);
95
96
  const handleMinChange = useCallback(e => {
96
97
  const newValue = e.target.value;
@@ -106,8 +107,9 @@ function RangeInputInner({
106
107
  className: classnames(styles.rangeInput, className),
107
108
  style: style,
108
109
  "data-loading": isLoading
109
- }, showHistogram && buckets.length > 0 && /*#__PURE__*/React.createElement("div", {
110
- className: styles.histogramContainer
110
+ }, showHistogram && /*#__PURE__*/React.createElement("div", {
111
+ className: styles.histogramContainer,
112
+ "data-empty": buckets.length === 0
111
113
  }, buckets.map((bucket, index) => {
112
114
  const height = bucket.count / maxBucketCount * 100;
113
115
  const isInRange = (minValue === undefined || config.toNumber(bucket.max) >= config.toNumber(minValue)) && (maxValue === undefined || config.toNumber(bucket.min) <= config.toNumber(maxValue));
@@ -149,9 +151,7 @@ function RangeInputInner({
149
151
  value: localMax,
150
152
  onChange: handleMaxChange,
151
153
  placeholder: dataRange.dataMax !== undefined && config.formatPlaceholder ? config.formatPlaceholder(dataRange.dataMax) : undefined
152
- }, config.inputProps)))), isLoading && /*#__PURE__*/React.createElement("div", {
153
- className: sharedStyles.loadingMessage
154
- }, "Loading..."));
154
+ }, config.inputProps)))));
155
155
  }
156
156
  export const RangeInput = /*#__PURE__*/memo(RangeInputInner);
157
157
  //# sourceMappingURL=RangeInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RangeInput.js","names":["Input","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createHistogramBuckets","getMaxBucketCount","styles","sharedStyles","DEBOUNCE_MS","RangeInputInner","valueCountPairs","isLoading","minValue","maxValue","onChange","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","computedRange","length","min","undefined","max","reduce","acc","p","Math","toNumber","value","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","count","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","loadingMessage","RangeInput"],"sources":["RangeInput.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 { Input } from \"@base-ui/react/input\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport sharedStyles from \"./shared.module.css\";\n\nconst DEBOUNCE_MS = 300;\n\nexport interface RangeInputConfig<T> {\n inputType: \"number\" | \"date\";\n formatValue: (value: T | undefined) => string;\n parseValue: (value: string) => T | undefined;\n toNumber: (value: T) => number;\n fromNumber: (value: number) => T;\n minLabel: string;\n maxLabel: string;\n formatTooltip: (min: T, max: T, count: number) => string;\n formatPlaceholder?: (value: T) => string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport interface RangeInputProps<T> {\n valueCountPairs: Array<{ value: T; count: number }>;\n isLoading: boolean;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<T>({\n valueCountPairs,\n isLoading,\n minValue,\n maxValue,\n onChange,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<T>): React.ReactElement {\n const minInputId = useId();\n const maxInputId = useId();\n\n const [localMin, setLocalMin] = useState<string>(\n config.formatValue(minValue),\n );\n const [localMax, setLocalMax] = useState<string>(\n config.formatValue(maxValue),\n );\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const minValueRef = useRef(minValue);\n minValueRef.current = minValue;\n const maxValueRef = useRef(maxValue);\n maxValueRef.current = maxValue;\n\n const debouncedMinChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(parsed, maxValueRef.current);\n }, DEBOUNCE_MS),\n [config],\n );\n\n const debouncedMaxChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(minValueRef.current, parsed);\n }, DEBOUNCE_MS),\n [config],\n );\n\n useEffect(() => {\n setLocalMin(config.formatValue(minValue));\n debouncedMinChange.cancel();\n }, [minValue, config, debouncedMinChange]);\n\n useEffect(() => {\n setLocalMax(config.formatValue(maxValue));\n debouncedMaxChange.cancel();\n }, [maxValue, config, debouncedMaxChange]);\n\n useEffect(() => {\n return () => {\n debouncedMinChange.cancel();\n debouncedMaxChange.cancel();\n };\n }, [debouncedMinChange, debouncedMaxChange]);\n\n const computedRange = useMemo(() => {\n if (valueCountPairs.length === 0) return { min: undefined, max: undefined };\n const min = valueCountPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = valueCountPairs.reduce(\n (acc, p) => Math.max(acc, config.toNumber(p.value)),\n -Infinity,\n );\n return {\n min: config.fromNumber(min),\n max: config.fromNumber(max),\n };\n }, [valueCountPairs, config]);\n\n const dataRange = useMemo(() => ({\n dataMin: computedRange.min,\n dataMax: computedRange.max,\n }), [computedRange.min, computedRange.max]);\n\n const buckets = useMemo<Array<HistogramBucket<T>>>(() => {\n if (\n !showHistogram\n || valueCountPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n valueCountPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, valueCountPairs, computedRange, config]);\n\n const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);\n\n const handleMinChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMin(newValue);\n debouncedMinChange(newValue);\n },\n [debouncedMinChange],\n );\n\n const handleMaxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMax(newValue);\n debouncedMaxChange(newValue);\n },\n [debouncedMaxChange],\n );\n\n return (\n <div\n className={classnames(styles.rangeInput, className)}\n style={style}\n data-loading={isLoading}\n >\n {showHistogram && buckets.length > 0 && (\n <div className={styles.histogramContainer}>\n {buckets.map((bucket, index) => {\n const height = (bucket.count / maxBucketCount) * 100;\n const isInRange = (minValue === undefined\n || config.toNumber(bucket.max) >= config.toNumber(minValue))\n && (maxValue === undefined\n || config.toNumber(bucket.min) <= config.toNumber(maxValue));\n\n return (\n <div\n key={index}\n className={styles.histogramBar}\n data-in-range={isInRange}\n style={{ height: `${Math.max(height, 2)}%` }}\n title={config.formatTooltip(\n bucket.min,\n bucket.max,\n bucket.count,\n )}\n />\n );\n })}\n </div>\n )}\n\n <div className={styles.rangeInputs}>\n <div className={styles.inputWrapper}>\n <label htmlFor={minInputId} className={styles.inputLabel}>\n {config.minLabel}\n </label>\n <Input\n id={minInputId}\n type={config.inputType}\n className={styles.input}\n value={localMin}\n onChange={handleMinChange}\n placeholder={dataRange.dataMin !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMin)\n : undefined}\n {...config.inputProps}\n />\n </div>\n\n <span className={styles.separator} aria-hidden=\"true\">\n –\n </span>\n\n <div className={styles.inputWrapper}>\n <label htmlFor={maxInputId} className={styles.inputLabel}>\n {config.maxLabel}\n </label>\n <Input\n id={maxInputId}\n type={config.inputType}\n className={styles.input}\n value={localMax}\n onChange={handleMaxChange}\n placeholder={dataRange.dataMax !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMax)\n : undefined}\n {...config.inputProps}\n />\n </div>\n </div>\n\n {isLoading && (\n <div className={sharedStyles.loadingMessage}>\n Loading...\n </div>\n )}\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"RangeInput.js","names":["Input","classnames","debounce","React","memo","useCallback","useEffect","useId","useMemo","useRef","useState","createHistogramBuckets","getMaxBucketCount","styles","useStaleData","DEBOUNCE_MS","RangeInputInner","valueCountPairs","isLoading","minValue","maxValue","onChange","showHistogram","className","style","config","minInputId","maxInputId","localMin","setLocalMin","formatValue","localMax","setLocalMax","onChangeRef","current","minValueRef","maxValueRef","debouncedMinChange","newValue","parsed","parseValue","debouncedMaxChange","cancel","displayPairs","computedRange","length","min","undefined","max","reduce","acc","p","Math","toNumber","value","Infinity","fromNumber","dataRange","dataMin","dataMax","buckets","maxBucketCount","handleMinChange","e","target","handleMaxChange","createElement","rangeInput","histogramContainer","map","bucket","index","height","count","isInRange","key","histogramBar","title","formatTooltip","rangeInputs","inputWrapper","htmlFor","inputLabel","minLabel","_extends","id","type","inputType","input","placeholder","formatPlaceholder","inputProps","separator","maxLabel","RangeInput"],"sources":["RangeInput.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 { Input } from \"@base-ui/react/input\";\nimport classnames from \"classnames\";\nimport { debounce } from \"lodash-es\";\nimport React, {\n memo,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createHistogramBuckets,\n getMaxBucketCount,\n type HistogramBucket,\n} from \"./createHistogramBuckets.js\";\nimport styles from \"./RangeInput.module.css\";\nimport { useStaleData } from \"./useStaleData.js\";\n\nconst DEBOUNCE_MS = 300;\n\nexport interface RangeInputConfig<T> {\n inputType: \"number\" | \"date\";\n formatValue: (value: T | undefined) => string;\n parseValue: (value: string) => T | undefined;\n toNumber: (value: T) => number;\n fromNumber: (value: number) => T;\n minLabel: string;\n maxLabel: string;\n formatTooltip: (min: T, max: T, count: number) => string;\n formatPlaceholder?: (value: T) => string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport interface RangeInputProps<T> {\n valueCountPairs: Array<{ value: T; count: number }>;\n isLoading: boolean;\n minValue: T | undefined;\n maxValue: T | undefined;\n onChange: (min: T | undefined, max: T | undefined) => void;\n showHistogram?: boolean;\n className?: string;\n style?: React.CSSProperties;\n config: RangeInputConfig<T>;\n}\n\nfunction RangeInputInner<T>({\n valueCountPairs,\n isLoading,\n minValue,\n maxValue,\n onChange,\n showHistogram = true,\n className,\n style,\n config,\n}: RangeInputProps<T>): React.ReactElement {\n const minInputId = useId();\n const maxInputId = useId();\n\n const [localMin, setLocalMin] = useState<string>(\n config.formatValue(minValue),\n );\n const [localMax, setLocalMax] = useState<string>(\n config.formatValue(maxValue),\n );\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const minValueRef = useRef(minValue);\n minValueRef.current = minValue;\n const maxValueRef = useRef(maxValue);\n maxValueRef.current = maxValue;\n\n const debouncedMinChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(parsed, maxValueRef.current);\n }, DEBOUNCE_MS),\n [config],\n );\n\n const debouncedMaxChange = useMemo(\n () =>\n debounce((newValue: string) => {\n const parsed = config.parseValue(newValue);\n onChangeRef.current(minValueRef.current, parsed);\n }, DEBOUNCE_MS),\n [config],\n );\n\n useEffect(() => {\n setLocalMin(config.formatValue(minValue));\n debouncedMinChange.cancel();\n }, [minValue, config, debouncedMinChange]);\n\n useEffect(() => {\n setLocalMax(config.formatValue(maxValue));\n debouncedMaxChange.cancel();\n }, [maxValue, config, debouncedMaxChange]);\n\n useEffect(() => {\n return () => {\n debouncedMinChange.cancel();\n debouncedMaxChange.cancel();\n };\n }, [debouncedMinChange, debouncedMaxChange]);\n\n const displayPairs = useStaleData(valueCountPairs, isLoading);\n\n const computedRange = useMemo(() => {\n if (displayPairs.length === 0) return { min: undefined, max: undefined };\n const min = displayPairs.reduce(\n (acc, p) => Math.min(acc, config.toNumber(p.value)),\n Infinity,\n );\n const max = displayPairs.reduce(\n (acc, p) => Math.max(acc, config.toNumber(p.value)),\n -Infinity,\n );\n return {\n min: config.fromNumber(min),\n max: config.fromNumber(max),\n };\n }, [displayPairs, config]);\n\n const dataRange = useMemo(() => ({\n dataMin: computedRange.min,\n dataMax: computedRange.max,\n }), [computedRange.min, computedRange.max]);\n\n const buckets = useMemo<Array<HistogramBucket<T>>>(() => {\n if (\n !showHistogram\n || displayPairs.length === 0\n || computedRange.min === undefined\n || computedRange.max === undefined\n ) {\n return [];\n }\n\n return createHistogramBuckets(\n displayPairs,\n { min: computedRange.min, max: computedRange.max },\n config.toNumber,\n config.fromNumber,\n );\n }, [showHistogram, displayPairs, computedRange, config]);\n\n const maxBucketCount = useMemo(() => getMaxBucketCount(buckets), [buckets]);\n\n const handleMinChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMin(newValue);\n debouncedMinChange(newValue);\n },\n [debouncedMinChange],\n );\n\n const handleMaxChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalMax(newValue);\n debouncedMaxChange(newValue);\n },\n [debouncedMaxChange],\n );\n\n return (\n <div\n className={classnames(styles.rangeInput, className)}\n style={style}\n data-loading={isLoading}\n >\n {showHistogram && (\n <div\n className={styles.histogramContainer}\n data-empty={buckets.length === 0}\n >\n {buckets.map((bucket, index) => {\n const height = (bucket.count / maxBucketCount) * 100;\n const isInRange = (minValue === undefined\n || config.toNumber(bucket.max) >= config.toNumber(minValue))\n && (maxValue === undefined\n || config.toNumber(bucket.min) <= config.toNumber(maxValue));\n\n return (\n <div\n key={index}\n className={styles.histogramBar}\n data-in-range={isInRange}\n style={{ height: `${Math.max(height, 2)}%` }}\n title={config.formatTooltip(\n bucket.min,\n bucket.max,\n bucket.count,\n )}\n />\n );\n })}\n </div>\n )}\n\n <div className={styles.rangeInputs}>\n <div className={styles.inputWrapper}>\n <label htmlFor={minInputId} className={styles.inputLabel}>\n {config.minLabel}\n </label>\n <Input\n id={minInputId}\n type={config.inputType}\n className={styles.input}\n value={localMin}\n onChange={handleMinChange}\n placeholder={dataRange.dataMin !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMin)\n : undefined}\n {...config.inputProps}\n />\n </div>\n\n <span className={styles.separator} aria-hidden=\"true\">\n –\n </span>\n\n <div className={styles.inputWrapper}>\n <label htmlFor={maxInputId} className={styles.inputLabel}>\n {config.maxLabel}\n </label>\n <Input\n id={maxInputId}\n type={config.inputType}\n className={styles.input}\n value={localMax}\n onChange={handleMaxChange}\n placeholder={dataRange.dataMax !== undefined\n && config.formatPlaceholder\n ? config.formatPlaceholder(dataRange.dataMax)\n : undefined}\n {...config.inputProps}\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport const RangeInput = memo(RangeInputInner) as typeof RangeInputInner;\n"],"mappings":"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","ignoreList":[]}
@@ -18,6 +18,12 @@
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  gap: var(--osdk-filter-range-gap);
21
+ min-width: 0;
22
+ transition: opacity var(--osdk-filter-content-fade-duration);
23
+ }
24
+
25
+ .rangeInput[data-loading="true"] {
26
+ opacity: 0.5;
21
27
  }
22
28
 
23
29
  .histogramContainer {
@@ -25,6 +31,13 @@
25
31
  align-items: flex-end;
26
32
  height: var(--osdk-filter-range-histogram-height);
27
33
  gap: var(--osdk-filter-range-histogram-bar-gap);
34
+ overflow: hidden;
35
+ opacity: 0;
36
+ transition: opacity var(--osdk-filter-content-fade-duration);
37
+ }
38
+
39
+ .histogramContainer:not([data-empty="true"]) {
40
+ opacity: 1;
28
41
  }
29
42
 
30
43
  .histogramBar {
@@ -42,6 +55,7 @@
42
55
  display: flex;
43
56
  align-items: flex-end;
44
57
  gap: var(--osdk-filter-range-inputs-gap);
58
+ min-width: 0;
45
59
  }
46
60
 
47
61
  .inputWrapper {
@@ -49,6 +63,7 @@
49
63
  display: flex;
50
64
  flex-direction: column;
51
65
  gap: var(--osdk-filter-range-input-wrapper-gap);
66
+ min-width: 0;
52
67
  }
53
68
 
54
69
  .inputLabel {
@@ -65,6 +80,7 @@
65
80
  border-radius: var(--osdk-filter-input-border-radius);
66
81
  background: var(--osdk-filter-input-bg);
67
82
  color: var(--osdk-filter-input-color);
83
+ min-width: 0;
68
84
 
69
85
  &:focus {
70
86
  border-color: var(--osdk-filter-input-focus-border);
@@ -81,3 +97,10 @@
81
97
  padding-bottom: calc(var(--osdk-filter-range-inputs-gap) * 0.75);
82
98
  color: var(--osdk-filter-range-separator-color);
83
99
  }
100
+
101
+ @media (prefers-reduced-motion: reduce) {
102
+ .histogramContainer,
103
+ .rangeInput {
104
+ transition: none;
105
+ }
106
+ }
@@ -113,7 +113,7 @@ function TextTagsInputInner({
113
113
  key: tag,
114
114
  tag: tag,
115
115
  onRemove: removeTag
116
- }))), /*#__PURE__*/React.createElement(Combobox.Input, {
116
+ }))), /*#__PURE__*/React.createElement(Combobox.SearchInput, {
117
117
  className: styles.input,
118
118
  placeholder: tags.length > 0 ? "" : placeholder,
119
119
  onKeyDown: handleKeyDown,