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

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 (510) hide show
  1. package/AGENTS.md +14 -97
  2. package/CHANGELOG.md +35 -0
  3. package/README.md +23 -7
  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/DateCalendar.js +70 -0
  19. package/build/browser/action-form/fields/DateCalendar.js.map +1 -0
  20. package/build/browser/action-form/fields/DateCalendar.module.css +136 -0
  21. package/build/browser/action-form/fields/DateCalendar.module.css.js +22 -0
  22. package/build/browser/action-form/fields/DatetimePickerField.js +98 -0
  23. package/build/browser/action-form/fields/DatetimePickerField.js.map +1 -0
  24. package/build/browser/action-form/fields/DatetimePickerField.module.css +66 -0
  25. package/build/browser/action-form/fields/DatetimePickerField.module.css.js +10 -0
  26. package/build/browser/action-form/fields/FormFieldRenderer.js +17 -6
  27. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
  28. package/build/browser/action-form/fields/LazyDateCalendar.js +27 -0
  29. package/build/browser/action-form/fields/LazyDateCalendar.js.map +1 -0
  30. package/build/browser/action-form/fields/TextInputField.js +2 -0
  31. package/build/browser/action-form/fields/TextInputField.js.map +1 -1
  32. package/build/browser/action-form/fields/TextInputField.module.css +56 -0
  33. package/build/browser/action-form/fields/TextInputField.module.css.js +6 -0
  34. package/build/browser/base-components/checkbox/Checkbox.js +2 -2
  35. package/build/browser/base-components/checkbox/Checkbox.js.map +1 -1
  36. package/build/browser/base-components/checkbox/Checkbox.module.css +0 -4
  37. package/build/browser/base-components/combobox/Combobox.js +3 -8
  38. package/build/browser/base-components/combobox/Combobox.js.map +1 -1
  39. package/build/browser/base-components/combobox/Combobox.module.css +0 -3
  40. package/build/browser/base-components/draggable-list/DraggableList.js +2 -4
  41. package/build/browser/base-components/draggable-list/DraggableList.js.map +1 -1
  42. package/build/browser/base-components/search-bar/SearchBar.module.css +2 -2
  43. package/build/browser/base-components/select/Select.js +1 -3
  44. package/build/browser/base-components/select/Select.js.map +1 -1
  45. package/build/browser/base-components/select/Select.module.css +0 -2
  46. package/build/browser/base-components/switch/Switch.module.css +0 -1
  47. package/build/browser/filter-list/FilterInput.js +14 -5
  48. package/build/browser/filter-list/FilterInput.js.map +1 -1
  49. package/build/browser/filter-list/FilterList.js +22 -10
  50. package/build/browser/filter-list/FilterList.js.map +1 -1
  51. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  52. package/build/browser/filter-list/base/AddFilterPopover.js +4 -3
  53. package/build/browser/filter-list/base/AddFilterPopover.js.map +1 -1
  54. package/build/browser/filter-list/base/BaseFilterList.js +3 -1
  55. package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
  56. package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -1
  57. package/build/browser/filter-list/base/ExcludeDropdown.js +61 -0
  58. package/build/browser/filter-list/base/ExcludeDropdown.js.map +1 -0
  59. package/build/browser/filter-list/base/ExcludeDropdown.module.css +94 -0
  60. package/build/browser/filter-list/base/ExcludeDropdown.module.css.js +12 -0
  61. package/build/browser/filter-list/base/FilterIcons.js +0 -39
  62. package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
  63. package/build/browser/filter-list/base/FilterInputExcludeRow.js +55 -0
  64. package/build/browser/filter-list/base/FilterInputExcludeRow.js.map +1 -0
  65. package/build/browser/filter-list/base/FilterListHeader.js +3 -2
  66. package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
  67. package/build/browser/filter-list/base/FilterListItem.js +72 -23
  68. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  69. package/build/browser/filter-list/base/FilterListItem.module.css +96 -20
  70. package/build/browser/filter-list/base/FilterListItem.module.css.js +7 -2
  71. package/build/browser/filter-list/base/inputs/CheckboxListInput.js +2 -2
  72. package/build/browser/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  73. package/build/browser/filter-list/base/inputs/ContainsTextInput.js +2 -6
  74. package/build/browser/filter-list/base/inputs/ContainsTextInput.js.map +1 -1
  75. package/build/browser/filter-list/base/inputs/DateRangeInput.js +1 -1
  76. package/build/browser/filter-list/base/inputs/DateRangeInput.js.map +1 -1
  77. package/build/browser/filter-list/base/inputs/ListogramInput.js +2 -2
  78. package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
  79. package/build/browser/filter-list/base/inputs/MultiDateInput.js +1 -1
  80. package/build/browser/filter-list/base/inputs/MultiDateInput.js.map +1 -1
  81. package/build/browser/filter-list/base/inputs/RangeInput.js +2 -2
  82. package/build/browser/filter-list/base/inputs/RangeInput.js.map +1 -1
  83. package/build/browser/filter-list/base/inputs/SingleDateInput.js +1 -1
  84. package/build/browser/filter-list/base/inputs/SingleDateInput.js.map +1 -1
  85. package/build/browser/filter-list/base/inputs/SingleSelectInput.js +1 -3
  86. package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  87. package/build/browser/filter-list/base/inputs/TimelineInput.js +1 -1
  88. package/build/browser/filter-list/base/inputs/TimelineInput.js.map +1 -1
  89. package/build/browser/filter-list/base/inputs/index.js +1 -1
  90. package/build/browser/filter-list/base/inputs/index.js.map +1 -1
  91. package/build/{esm/filter-list/base/inputs/useStaleData.js → browser/filter-list/base/inputs/useStableData.js} +5 -5
  92. package/build/browser/filter-list/base/inputs/useStableData.js.map +1 -0
  93. package/build/browser/filter-list/hooks/useFilterListState.js +3 -0
  94. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  95. package/build/browser/filter-list/hooks/useFilterVisibility.js +7 -1
  96. package/build/browser/filter-list/hooks/useFilterVisibility.js.map +1 -1
  97. package/build/browser/filter-list/hooks/usePropertyAggregation.js +3 -2
  98. package/build/browser/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  99. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js +15 -5
  100. package/build/browser/filter-list/inputs/CheckboxListFilterInput.js.map +1 -1
  101. package/build/browser/filter-list/inputs/DateRangeFilterInput.js +10 -6
  102. package/build/browser/filter-list/inputs/DateRangeFilterInput.js.map +1 -1
  103. package/build/browser/filter-list/inputs/LinkedPropertyInput.js +41 -18
  104. package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  105. package/build/browser/filter-list/inputs/ListogramFilterInput.js +15 -5
  106. package/build/browser/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  107. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js +12 -4
  108. package/build/browser/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  109. package/build/browser/filter-list/inputs/NumberRangeFilterInput.js +10 -6
  110. package/build/browser/filter-list/inputs/NumberRangeFilterInput.js.map +1 -1
  111. package/build/browser/filter-list/inputs/PropertyFilterInput.js +36 -10
  112. package/build/browser/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  113. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js +12 -4
  114. package/build/browser/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  115. package/build/browser/filter-list/inputs/TextTagsFilterInput.js +12 -4
  116. package/build/browser/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
  117. package/build/browser/filter-list/utils/filterStateToWhereClause.js +1 -1
  118. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  119. package/build/browser/filter-list/utils/filterValues.js +29 -1
  120. package/build/browser/filter-list/utils/filterValues.js.map +1 -1
  121. package/build/browser/object-table/LoadingCell.js +2 -1
  122. package/build/browser/object-table/LoadingCell.js.map +1 -1
  123. package/build/browser/object-table/LoadingCell.module.css +3 -21
  124. package/build/browser/object-table/LoadingCell.module.css.js +1 -2
  125. package/build/browser/object-table/LoadingStateTable.js +2 -1
  126. package/build/browser/object-table/LoadingStateTable.js.map +1 -1
  127. package/build/browser/object-table/MultiColumnSortDialog.js +1 -3
  128. package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
  129. package/build/browser/object-table/MultiColumnSortDialog.module.css +0 -1
  130. package/build/browser/object-table/TableCell.module.css +1 -1
  131. package/build/browser/object-table/TableHeader.module.css +2 -2
  132. package/build/browser/object-table/TableHeaderWithPopover.js +2 -4
  133. package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -1
  134. package/build/browser/object-table/TableHeaderWithPopover.module.css +1 -0
  135. package/build/browser/pdf-viewer/PdfRenderer.js +1 -1
  136. package/build/browser/pdf-viewer/PdfRenderer.js.map +1 -1
  137. package/build/browser/pdf-viewer/PdfViewer.js +59 -118
  138. package/build/browser/pdf-viewer/PdfViewer.js.map +1 -1
  139. package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.js.map +1 -0
  140. package/build/{esm/pdf-viewer → browser/pdf-viewer/components}/PdfViewerAnnotationLayer.module.css +0 -1
  141. package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.module.css.js +11 -0
  142. package/build/browser/pdf-viewer/components/PdfViewerContent.js +113 -0
  143. package/build/browser/pdf-viewer/components/PdfViewerContent.js.map +1 -0
  144. package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.js +98 -0
  145. package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.js.map +1 -0
  146. package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.module.css +89 -0
  147. package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.module.css.js +15 -0
  148. package/build/browser/pdf-viewer/components/PdfViewerSearchBar.js.map +1 -0
  149. package/build/browser/pdf-viewer/components/PdfViewerSearchBar.module.css.js +10 -0
  150. package/build/browser/pdf-viewer/{PdfViewerSidebar.js → components/PdfViewerSidebar.js} +9 -5
  151. package/build/browser/pdf-viewer/components/PdfViewerSidebar.js.map +1 -0
  152. package/build/{esm/pdf-viewer → browser/pdf-viewer/components}/PdfViewerSidebar.module.css +0 -9
  153. package/build/browser/pdf-viewer/{PdfViewerSidebar.module.css.js → components/PdfViewerSidebar.module.css.js} +5 -6
  154. package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.js +54 -0
  155. package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.js.map +1 -0
  156. package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.module.css +70 -0
  157. package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.module.css.js +8 -0
  158. package/build/browser/pdf-viewer/{PdfViewerThumbnail.js → components/PdfViewerThumbnail.js} +1 -1
  159. package/build/browser/pdf-viewer/components/PdfViewerThumbnail.js.map +1 -0
  160. package/build/browser/pdf-viewer/{PdfViewerThumbnail.module.css.js → components/PdfViewerThumbnail.module.css.js} +3 -3
  161. package/build/browser/pdf-viewer/{PdfViewerToolbar.js → components/PdfViewerToolbar.js} +39 -12
  162. package/build/browser/pdf-viewer/components/PdfViewerToolbar.js.map +1 -0
  163. package/build/browser/pdf-viewer/{PdfViewerToolbar.module.css → components/PdfViewerToolbar.module.css} +2 -2
  164. package/build/browser/pdf-viewer/components/PdfViewerToolbar.module.css.js +12 -0
  165. package/build/browser/pdf-viewer/constants.js +7 -5
  166. package/build/browser/pdf-viewer/constants.js.map +1 -1
  167. package/build/browser/pdf-viewer/hooks/usePdfDocument.js +2 -3
  168. package/build/browser/pdf-viewer/hooks/usePdfDocument.js.map +1 -1
  169. package/build/browser/pdf-viewer/hooks/usePdfOutline.js +268 -0
  170. package/build/browser/pdf-viewer/hooks/usePdfOutline.js.map +1 -0
  171. package/build/browser/pdf-viewer/hooks/usePdfViewer.js +12 -1
  172. package/build/browser/pdf-viewer/hooks/usePdfViewer.js.map +1 -1
  173. package/build/browser/pdf-viewer/hooks/usePdfViewerCore.js +80 -0
  174. package/build/browser/pdf-viewer/hooks/usePdfViewerCore.js.map +1 -0
  175. package/build/browser/pdf-viewer/hooks/usePdfViewerState.js +135 -0
  176. package/build/browser/pdf-viewer/hooks/usePdfViewerState.js.map +1 -0
  177. package/build/browser/pdf-viewer/types.js.map +1 -1
  178. package/build/browser/public/experimental.js +23 -2
  179. package/build/browser/public/experimental.js.map +1 -1
  180. package/build/browser/public/primitives.js +20 -0
  181. package/build/browser/public/primitives.js.map +1 -0
  182. package/build/browser/{filter-list/base/inputs → shared}/dateUtils.js +38 -2
  183. package/build/browser/shared/dateUtils.js.map +1 -0
  184. package/build/browser/styles.css +817 -136
  185. package/build/cjs/DateCalendar-QWGFKD6J.css +113 -0
  186. package/build/cjs/DateCalendar-QWGFKD6J.css.map +1 -0
  187. package/build/cjs/DateCalendar-R44GMN3O.cjs +67 -0
  188. package/build/cjs/DateCalendar-R44GMN3O.cjs.map +1 -0
  189. package/build/cjs/chunk-GT6IV6LV.cjs +163 -0
  190. package/build/cjs/chunk-GT6IV6LV.cjs.map +1 -0
  191. package/build/cjs/chunk-HMQTYQEX.cjs +9 -0
  192. package/build/cjs/chunk-HMQTYQEX.cjs.map +1 -0
  193. package/build/cjs/chunk-UZ2E5NRX.cjs +8 -0
  194. package/build/cjs/chunk-UZ2E5NRX.cjs.map +1 -0
  195. package/build/cjs/index.cjs +2 -0
  196. package/build/cjs/public/experimental.cjs +3227 -1848
  197. package/build/cjs/public/experimental.cjs.map +1 -1
  198. package/build/cjs/public/experimental.css +650 -172
  199. package/build/cjs/public/experimental.css.map +1 -1
  200. package/build/cjs/public/experimental.d.cts +685 -17
  201. package/build/cjs/public/primitives.cjs +25 -0
  202. package/build/cjs/public/primitives.cjs.map +1 -0
  203. package/build/cjs/public/primitives.css +154 -0
  204. package/build/cjs/public/primitives.css.map +1 -0
  205. package/build/cjs/public/primitives.d.cts +49 -0
  206. package/build/esm/action-form/ActionFormApi.js.map +1 -1
  207. package/build/esm/action-form/BaseForm.js +18 -5
  208. package/build/esm/action-form/BaseForm.js.map +1 -1
  209. package/build/esm/action-form/BaseForm.module.css +38 -0
  210. package/build/esm/action-form/FormField.js +42 -0
  211. package/build/esm/action-form/FormField.js.map +1 -0
  212. package/build/esm/action-form/FormField.module.css +41 -0
  213. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  214. package/build/esm/action-form/FormHeader.js +26 -0
  215. package/build/esm/action-form/FormHeader.js.map +1 -0
  216. package/build/esm/action-form/FormHeader.module.css +26 -0
  217. package/build/esm/action-form/fields/DateCalendar.js +70 -0
  218. package/build/esm/action-form/fields/DateCalendar.js.map +1 -0
  219. package/build/esm/action-form/fields/DateCalendar.module.css +136 -0
  220. package/build/esm/action-form/fields/DatetimePickerField.js +98 -0
  221. package/build/esm/action-form/fields/DatetimePickerField.js.map +1 -0
  222. package/build/esm/action-form/fields/DatetimePickerField.module.css +66 -0
  223. package/build/esm/action-form/fields/FormFieldRenderer.js +17 -6
  224. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
  225. package/build/esm/action-form/fields/LazyDateCalendar.js +27 -0
  226. package/build/esm/action-form/fields/LazyDateCalendar.js.map +1 -0
  227. package/build/esm/action-form/fields/TextInputField.js +2 -0
  228. package/build/esm/action-form/fields/TextInputField.js.map +1 -1
  229. package/build/esm/action-form/fields/TextInputField.module.css +56 -0
  230. package/build/esm/base-components/checkbox/Checkbox.js +2 -2
  231. package/build/esm/base-components/checkbox/Checkbox.js.map +1 -1
  232. package/build/esm/base-components/checkbox/Checkbox.module.css +0 -4
  233. package/build/esm/base-components/combobox/Combobox.js +3 -8
  234. package/build/esm/base-components/combobox/Combobox.js.map +1 -1
  235. package/build/esm/base-components/combobox/Combobox.module.css +0 -3
  236. package/build/esm/base-components/draggable-list/DraggableList.js +2 -4
  237. package/build/esm/base-components/draggable-list/DraggableList.js.map +1 -1
  238. package/build/esm/base-components/search-bar/SearchBar.module.css +2 -2
  239. package/build/esm/base-components/select/Select.js +1 -3
  240. package/build/esm/base-components/select/Select.js.map +1 -1
  241. package/build/esm/base-components/select/Select.module.css +0 -2
  242. package/build/esm/base-components/switch/Switch.module.css +0 -1
  243. package/build/esm/filter-list/FilterInput.js +14 -5
  244. package/build/esm/filter-list/FilterInput.js.map +1 -1
  245. package/build/esm/filter-list/FilterList.js +22 -10
  246. package/build/esm/filter-list/FilterList.js.map +1 -1
  247. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  248. package/build/esm/filter-list/base/AddFilterPopover.js +4 -3
  249. package/build/esm/filter-list/base/AddFilterPopover.js.map +1 -1
  250. package/build/esm/filter-list/base/BaseFilterList.js +3 -1
  251. package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
  252. package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -1
  253. package/build/esm/filter-list/base/ExcludeDropdown.js +61 -0
  254. package/build/esm/filter-list/base/ExcludeDropdown.js.map +1 -0
  255. package/build/esm/filter-list/base/ExcludeDropdown.module.css +94 -0
  256. package/build/esm/filter-list/base/FilterIcons.js +0 -39
  257. package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
  258. package/build/esm/filter-list/base/FilterInputExcludeRow.js +55 -0
  259. package/build/esm/filter-list/base/FilterInputExcludeRow.js.map +1 -0
  260. package/build/esm/filter-list/base/FilterListHeader.js +3 -2
  261. package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
  262. package/build/esm/filter-list/base/FilterListItem.js +72 -23
  263. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  264. package/build/esm/filter-list/base/FilterListItem.module.css +96 -20
  265. package/build/esm/filter-list/base/inputs/CheckboxListInput.js +2 -2
  266. package/build/esm/filter-list/base/inputs/CheckboxListInput.js.map +1 -1
  267. package/build/esm/filter-list/base/inputs/ContainsTextInput.js +2 -6
  268. package/build/esm/filter-list/base/inputs/ContainsTextInput.js.map +1 -1
  269. package/build/esm/filter-list/base/inputs/DateRangeInput.js +1 -1
  270. package/build/esm/filter-list/base/inputs/DateRangeInput.js.map +1 -1
  271. package/build/esm/filter-list/base/inputs/ListogramInput.js +2 -2
  272. package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
  273. package/build/esm/filter-list/base/inputs/MultiDateInput.js +1 -1
  274. package/build/esm/filter-list/base/inputs/MultiDateInput.js.map +1 -1
  275. package/build/esm/filter-list/base/inputs/RangeInput.js +2 -2
  276. package/build/esm/filter-list/base/inputs/RangeInput.js.map +1 -1
  277. package/build/esm/filter-list/base/inputs/SingleDateInput.js +1 -1
  278. package/build/esm/filter-list/base/inputs/SingleDateInput.js.map +1 -1
  279. package/build/esm/filter-list/base/inputs/SingleSelectInput.js +1 -3
  280. package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
  281. package/build/esm/filter-list/base/inputs/TimelineInput.js +1 -1
  282. package/build/esm/filter-list/base/inputs/TimelineInput.js.map +1 -1
  283. package/build/esm/filter-list/base/inputs/index.js +1 -1
  284. package/build/esm/filter-list/base/inputs/index.js.map +1 -1
  285. package/build/{browser/filter-list/base/inputs/useStaleData.js → esm/filter-list/base/inputs/useStableData.js} +5 -5
  286. package/build/esm/filter-list/base/inputs/useStableData.js.map +1 -0
  287. package/build/esm/filter-list/hooks/useFilterListState.js +3 -0
  288. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  289. package/build/esm/filter-list/hooks/useFilterVisibility.js +7 -1
  290. package/build/esm/filter-list/hooks/useFilterVisibility.js.map +1 -1
  291. package/build/esm/filter-list/hooks/usePropertyAggregation.js +3 -2
  292. package/build/esm/filter-list/hooks/usePropertyAggregation.js.map +1 -1
  293. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js +15 -5
  294. package/build/esm/filter-list/inputs/CheckboxListFilterInput.js.map +1 -1
  295. package/build/esm/filter-list/inputs/DateRangeFilterInput.js +10 -6
  296. package/build/esm/filter-list/inputs/DateRangeFilterInput.js.map +1 -1
  297. package/build/esm/filter-list/inputs/LinkedPropertyInput.js +41 -18
  298. package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  299. package/build/esm/filter-list/inputs/ListogramFilterInput.js +15 -5
  300. package/build/esm/filter-list/inputs/ListogramFilterInput.js.map +1 -1
  301. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js +12 -4
  302. package/build/esm/filter-list/inputs/MultiSelectFilterInput.js.map +1 -1
  303. package/build/esm/filter-list/inputs/NumberRangeFilterInput.js +10 -6
  304. package/build/esm/filter-list/inputs/NumberRangeFilterInput.js.map +1 -1
  305. package/build/esm/filter-list/inputs/PropertyFilterInput.js +36 -10
  306. package/build/esm/filter-list/inputs/PropertyFilterInput.js.map +1 -1
  307. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js +12 -4
  308. package/build/esm/filter-list/inputs/SingleSelectFilterInput.js.map +1 -1
  309. package/build/esm/filter-list/inputs/TextTagsFilterInput.js +12 -4
  310. package/build/esm/filter-list/inputs/TextTagsFilterInput.js.map +1 -1
  311. package/build/esm/filter-list/utils/filterStateToWhereClause.js +1 -1
  312. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  313. package/build/esm/filter-list/utils/filterValues.js +29 -1
  314. package/build/esm/filter-list/utils/filterValues.js.map +1 -1
  315. package/build/esm/object-table/LoadingCell.js +2 -1
  316. package/build/esm/object-table/LoadingCell.js.map +1 -1
  317. package/build/esm/object-table/LoadingCell.module.css +3 -21
  318. package/build/esm/object-table/LoadingStateTable.js +2 -1
  319. package/build/esm/object-table/LoadingStateTable.js.map +1 -1
  320. package/build/esm/object-table/MultiColumnSortDialog.js +1 -3
  321. package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
  322. package/build/esm/object-table/MultiColumnSortDialog.module.css +0 -1
  323. package/build/esm/object-table/TableCell.module.css +1 -1
  324. package/build/esm/object-table/TableHeader.module.css +2 -2
  325. package/build/esm/object-table/TableHeaderWithPopover.js +2 -4
  326. package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -1
  327. package/build/esm/object-table/TableHeaderWithPopover.module.css +1 -0
  328. package/build/esm/pdf-viewer/PdfRenderer.js +1 -1
  329. package/build/esm/pdf-viewer/PdfRenderer.js.map +1 -1
  330. package/build/esm/pdf-viewer/PdfViewer.js +59 -118
  331. package/build/esm/pdf-viewer/PdfViewer.js.map +1 -1
  332. package/build/esm/pdf-viewer/components/PdfViewerAnnotationLayer.js.map +1 -0
  333. package/build/{browser/pdf-viewer → esm/pdf-viewer/components}/PdfViewerAnnotationLayer.module.css +0 -1
  334. package/build/esm/pdf-viewer/components/PdfViewerContent.js +113 -0
  335. package/build/esm/pdf-viewer/components/PdfViewerContent.js.map +1 -0
  336. package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.js +98 -0
  337. package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.js.map +1 -0
  338. package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.module.css +89 -0
  339. package/build/esm/pdf-viewer/components/PdfViewerSearchBar.js.map +1 -0
  340. package/build/esm/pdf-viewer/{PdfViewerSidebar.js → components/PdfViewerSidebar.js} +9 -5
  341. package/build/esm/pdf-viewer/components/PdfViewerSidebar.js.map +1 -0
  342. package/build/{browser/pdf-viewer → esm/pdf-viewer/components}/PdfViewerSidebar.module.css +0 -9
  343. package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.js +54 -0
  344. package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.js.map +1 -0
  345. package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.module.css +70 -0
  346. package/build/esm/pdf-viewer/{PdfViewerThumbnail.js → components/PdfViewerThumbnail.js} +1 -1
  347. package/build/esm/pdf-viewer/components/PdfViewerThumbnail.js.map +1 -0
  348. package/build/esm/pdf-viewer/{PdfViewerToolbar.js → components/PdfViewerToolbar.js} +39 -12
  349. package/build/esm/pdf-viewer/components/PdfViewerToolbar.js.map +1 -0
  350. package/build/esm/pdf-viewer/{PdfViewerToolbar.module.css → components/PdfViewerToolbar.module.css} +2 -2
  351. package/build/esm/pdf-viewer/constants.js +7 -5
  352. package/build/esm/pdf-viewer/constants.js.map +1 -1
  353. package/build/esm/pdf-viewer/hooks/usePdfDocument.js +2 -3
  354. package/build/esm/pdf-viewer/hooks/usePdfDocument.js.map +1 -1
  355. package/build/esm/pdf-viewer/hooks/usePdfOutline.js +268 -0
  356. package/build/esm/pdf-viewer/hooks/usePdfOutline.js.map +1 -0
  357. package/build/esm/pdf-viewer/hooks/usePdfViewer.js +12 -1
  358. package/build/esm/pdf-viewer/hooks/usePdfViewer.js.map +1 -1
  359. package/build/esm/pdf-viewer/hooks/usePdfViewerCore.js +80 -0
  360. package/build/esm/pdf-viewer/hooks/usePdfViewerCore.js.map +1 -0
  361. package/build/esm/pdf-viewer/hooks/usePdfViewerState.js +135 -0
  362. package/build/esm/pdf-viewer/hooks/usePdfViewerState.js.map +1 -0
  363. package/build/esm/pdf-viewer/types.js.map +1 -1
  364. package/build/esm/public/experimental.js +23 -2
  365. package/build/esm/public/experimental.js.map +1 -1
  366. package/build/esm/public/primitives.js +20 -0
  367. package/build/esm/public/primitives.js.map +1 -0
  368. package/build/esm/{filter-list/base/inputs → shared}/dateUtils.js +38 -2
  369. package/build/esm/shared/dateUtils.js.map +1 -0
  370. package/build/types/action-form/ActionFormApi.d.ts +1 -0
  371. package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
  372. package/build/types/action-form/BaseForm.d.ts.map +1 -1
  373. package/build/types/action-form/FormField.d.ts +11 -0
  374. package/build/types/action-form/FormField.d.ts.map +1 -0
  375. package/build/types/action-form/FormFieldApi.d.ts +22 -8
  376. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  377. package/build/types/action-form/FormHeader.d.ts +6 -0
  378. package/build/types/action-form/FormHeader.d.ts.map +1 -0
  379. package/build/types/action-form/fields/DateCalendar.d.ts +9 -0
  380. package/build/types/action-form/fields/DateCalendar.d.ts.map +1 -0
  381. package/build/types/action-form/fields/DatetimePickerField.d.ts +3 -0
  382. package/build/types/action-form/fields/DatetimePickerField.d.ts.map +1 -0
  383. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
  384. package/build/types/action-form/fields/LazyDateCalendar.d.ts +3 -0
  385. package/build/types/action-form/fields/LazyDateCalendar.d.ts.map +1 -0
  386. package/build/types/action-form/fields/TextInputField.d.ts.map +1 -1
  387. package/build/types/filter-list/FilterInput.d.ts +3 -1
  388. package/build/types/filter-list/FilterInput.d.ts.map +1 -1
  389. package/build/types/filter-list/FilterListApi.d.ts +14 -10
  390. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  391. package/build/types/filter-list/base/AddFilterPopover.d.ts +2 -1
  392. package/build/types/filter-list/base/AddFilterPopover.d.ts.map +1 -1
  393. package/build/types/filter-list/base/BaseFilterListApi.d.ts +4 -1
  394. package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -1
  395. package/build/types/filter-list/base/ExcludeDropdown.d.ts +8 -0
  396. package/build/types/filter-list/base/ExcludeDropdown.d.ts.map +1 -0
  397. package/build/types/filter-list/base/FilterIcons.d.ts +0 -2
  398. package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
  399. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts +12 -0
  400. package/build/types/filter-list/base/FilterInputExcludeRow.d.ts.map +1 -0
  401. package/build/types/filter-list/base/FilterListHeader.d.ts +3 -2
  402. package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
  403. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
  404. package/build/types/filter-list/base/inputs/DateRangeInput.d.ts.map +1 -1
  405. package/build/types/filter-list/base/inputs/SingleDateInput.d.ts.map +1 -1
  406. package/build/types/filter-list/base/inputs/index.d.ts +1 -1
  407. package/build/types/filter-list/base/inputs/index.d.ts.map +1 -1
  408. package/build/types/filter-list/base/inputs/useStableData.d.ts +1 -0
  409. package/build/types/filter-list/base/inputs/useStableData.d.ts.map +1 -0
  410. package/build/types/filter-list/hooks/useFilterVisibility.d.ts +2 -0
  411. package/build/types/filter-list/hooks/useFilterVisibility.d.ts.map +1 -1
  412. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts +2 -2
  413. package/build/types/filter-list/hooks/usePropertyAggregation.d.ts.map +1 -1
  414. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts +5 -2
  415. package/build/types/filter-list/inputs/CheckboxListFilterInput.d.ts.map +1 -1
  416. package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts +3 -2
  417. package/build/types/filter-list/inputs/DateRangeFilterInput.d.ts.map +1 -1
  418. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts +2 -1
  419. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
  420. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts +5 -2
  421. package/build/types/filter-list/inputs/ListogramFilterInput.d.ts.map +1 -1
  422. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts +4 -2
  423. package/build/types/filter-list/inputs/MultiSelectFilterInput.d.ts.map +1 -1
  424. package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts +3 -2
  425. package/build/types/filter-list/inputs/NumberRangeFilterInput.d.ts.map +1 -1
  426. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts +3 -1
  427. package/build/types/filter-list/inputs/PropertyFilterInput.d.ts.map +1 -1
  428. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts +4 -2
  429. package/build/types/filter-list/inputs/SingleSelectFilterInput.d.ts.map +1 -1
  430. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts +4 -2
  431. package/build/types/filter-list/inputs/TextTagsFilterInput.d.ts.map +1 -1
  432. package/build/types/filter-list/utils/filterValues.d.ts +2 -0
  433. package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
  434. package/build/types/object-table/LoadingCell.d.ts.map +1 -1
  435. package/build/types/object-table/LoadingStateTable.d.ts.map +1 -1
  436. package/build/types/pdf-viewer/PdfRenderer.d.ts +2 -2
  437. package/build/types/pdf-viewer/PdfRenderer.d.ts.map +1 -1
  438. package/build/types/pdf-viewer/PdfViewer.d.ts +1 -1
  439. package/build/types/pdf-viewer/PdfViewer.d.ts.map +1 -1
  440. package/build/types/pdf-viewer/{PdfViewerAnnotationLayer.d.ts → components/PdfViewerAnnotationLayer.d.ts} +2 -3
  441. package/build/types/pdf-viewer/components/PdfViewerAnnotationLayer.d.ts.map +1 -0
  442. package/build/types/pdf-viewer/components/PdfViewerContent.d.ts +22 -0
  443. package/build/types/pdf-viewer/components/PdfViewerContent.d.ts.map +1 -0
  444. package/build/types/pdf-viewer/components/PdfViewerOutlineSidebar.d.ts +11 -0
  445. package/build/types/pdf-viewer/components/PdfViewerOutlineSidebar.d.ts.map +1 -0
  446. package/build/types/pdf-viewer/{PdfViewerSearchBar.d.ts → components/PdfViewerSearchBar.d.ts} +1 -2
  447. package/build/types/pdf-viewer/components/PdfViewerSearchBar.d.ts.map +1 -0
  448. package/build/types/pdf-viewer/components/PdfViewerSidebar.d.ts +12 -0
  449. package/build/types/pdf-viewer/components/PdfViewerSidebar.d.ts.map +1 -0
  450. package/build/types/pdf-viewer/components/PdfViewerSidebarHeader.d.ts +7 -0
  451. package/build/types/pdf-viewer/components/PdfViewerSidebarHeader.d.ts.map +1 -0
  452. package/build/types/pdf-viewer/{PdfViewerThumbnail.d.ts.map → components/PdfViewerThumbnail.d.ts.map} +1 -1
  453. package/build/types/pdf-viewer/{PdfViewerToolbar.d.ts → components/PdfViewerToolbar.d.ts} +5 -3
  454. package/build/types/pdf-viewer/components/PdfViewerToolbar.d.ts.map +1 -0
  455. package/build/types/pdf-viewer/constants.d.ts +5 -0
  456. package/build/types/pdf-viewer/constants.d.ts.map +1 -1
  457. package/build/types/pdf-viewer/hooks/usePdfDocument.d.ts.map +1 -1
  458. package/build/types/pdf-viewer/hooks/usePdfOutline.d.ts +3 -0
  459. package/build/types/pdf-viewer/hooks/usePdfOutline.d.ts.map +1 -0
  460. package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts +1 -1
  461. package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts.map +1 -1
  462. package/build/types/pdf-viewer/hooks/usePdfViewerCore.d.ts +43 -0
  463. package/build/types/pdf-viewer/hooks/usePdfViewerCore.d.ts.map +1 -0
  464. package/build/types/pdf-viewer/hooks/usePdfViewerState.d.ts +39 -0
  465. package/build/types/pdf-viewer/hooks/usePdfViewerState.d.ts.map +1 -0
  466. package/build/types/pdf-viewer/types.d.ts +42 -0
  467. package/build/types/pdf-viewer/types.d.ts.map +1 -1
  468. package/build/types/public/experimental.d.ts +21 -2
  469. package/build/types/public/experimental.d.ts.map +1 -1
  470. package/build/types/public/primitives.d.ts +3 -0
  471. package/build/types/public/primitives.d.ts.map +1 -0
  472. package/build/types/shared/dateUtils.d.ts +31 -0
  473. package/build/types/shared/dateUtils.d.ts.map +1 -0
  474. package/package.json +14 -4
  475. package/primitives.d.ts +17 -0
  476. package/build/browser/filter-list/base/inputs/dateUtils.js.map +0 -1
  477. package/build/browser/filter-list/base/inputs/useStaleData.js.map +0 -1
  478. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.js.map +0 -1
  479. package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css.js +0 -11
  480. package/build/browser/pdf-viewer/PdfViewerSearchBar.js.map +0 -1
  481. package/build/browser/pdf-viewer/PdfViewerSearchBar.module.css.js +0 -10
  482. package/build/browser/pdf-viewer/PdfViewerSidebar.js.map +0 -1
  483. package/build/browser/pdf-viewer/PdfViewerThumbnail.js.map +0 -1
  484. package/build/browser/pdf-viewer/PdfViewerToolbar.js.map +0 -1
  485. package/build/browser/pdf-viewer/PdfViewerToolbar.module.css.js +0 -12
  486. package/build/esm/filter-list/base/inputs/dateUtils.js.map +0 -1
  487. package/build/esm/filter-list/base/inputs/useStaleData.js.map +0 -1
  488. package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.js.map +0 -1
  489. package/build/esm/pdf-viewer/PdfViewerSearchBar.js.map +0 -1
  490. package/build/esm/pdf-viewer/PdfViewerSidebar.js.map +0 -1
  491. package/build/esm/pdf-viewer/PdfViewerThumbnail.js.map +0 -1
  492. package/build/esm/pdf-viewer/PdfViewerToolbar.js.map +0 -1
  493. package/build/types/filter-list/base/inputs/dateUtils.d.ts +0 -17
  494. package/build/types/filter-list/base/inputs/dateUtils.d.ts.map +0 -1
  495. package/build/types/filter-list/base/inputs/useStaleData.d.ts +0 -1
  496. package/build/types/filter-list/base/inputs/useStaleData.d.ts.map +0 -1
  497. package/build/types/pdf-viewer/PdfViewerAnnotationLayer.d.ts.map +0 -1
  498. package/build/types/pdf-viewer/PdfViewerSearchBar.d.ts.map +0 -1
  499. package/build/types/pdf-viewer/PdfViewerSidebar.d.ts +0 -10
  500. package/build/types/pdf-viewer/PdfViewerSidebar.d.ts.map +0 -1
  501. package/build/types/pdf-viewer/PdfViewerToolbar.d.ts.map +0 -1
  502. /package/build/browser/pdf-viewer/{PdfViewerAnnotationLayer.js → components/PdfViewerAnnotationLayer.js} +0 -0
  503. /package/build/browser/pdf-viewer/{PdfViewerSearchBar.js → components/PdfViewerSearchBar.js} +0 -0
  504. /package/build/browser/pdf-viewer/{PdfViewerSearchBar.module.css → components/PdfViewerSearchBar.module.css} +0 -0
  505. /package/build/browser/pdf-viewer/{PdfViewerThumbnail.module.css → components/PdfViewerThumbnail.module.css} +0 -0
  506. /package/build/esm/pdf-viewer/{PdfViewerAnnotationLayer.js → components/PdfViewerAnnotationLayer.js} +0 -0
  507. /package/build/esm/pdf-viewer/{PdfViewerSearchBar.js → components/PdfViewerSearchBar.js} +0 -0
  508. /package/build/esm/pdf-viewer/{PdfViewerSearchBar.module.css → components/PdfViewerSearchBar.module.css} +0 -0
  509. /package/build/esm/pdf-viewer/{PdfViewerThumbnail.module.css → components/PdfViewerThumbnail.module.css} +0 -0
  510. /package/build/types/pdf-viewer/{PdfViewerThumbnail.d.ts → components/PdfViewerThumbnail.d.ts} +0 -0
@@ -24,7 +24,7 @@ async function fetchMediaContents(media) {
24
24
  const result = await media.fetchContents();
25
25
  return result.arrayBuffer();
26
26
  }
27
- export function PdfRenderer({
27
+ export function PdfViewer({
28
28
  media,
29
29
  className,
30
30
  ...pdfViewerProps
@@ -1 +1 @@
1
- {"version":3,"file":"PdfRenderer.js","names":["Error","ErrorIcon","Spin","classnames","React","useEffect","useState","BasePdfViewer","styles","fetchMediaContents","media","result","fetchContents","arrayBuffer","PdfRenderer","className","pdfViewerProps","src","setSrc","undefined","loading","setLoading","error","setError","cancelled","then","buffer","catch","err","String","rootClassName","pdfViewer","createElement","loadingContainer","spinnerIcon","errorContainer","errorIcon","message","_extends"],"sources":["PdfRenderer.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 { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport type { Media } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { useEffect, useState } from \"react\";\nimport { BasePdfViewer } from \"./PdfViewer.js\";\nimport styles from \"./PdfViewer.module.css\";\nimport type { PdfViewerProps } from \"./types.js\";\n\nasync function fetchMediaContents(media: Media): Promise<ArrayBuffer> {\n const result = await media.fetchContents();\n return result.arrayBuffer();\n}\n\nexport interface PdfRendererProps extends Omit<PdfViewerProps, \"src\"> {\n /** The Media object to fetch PDF contents from */\n media: Media;\n}\n\nexport function PdfRenderer({\n media,\n className,\n ...pdfViewerProps\n}: PdfRendererProps): React.ReactElement {\n const [src, setSrc] = useState<ArrayBuffer | undefined>(undefined);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n // This is required until we either support React 19+ or a data fetching hook\n useEffect(function fetchMediaSource() {\n let cancelled = false;\n setLoading(true);\n setError(undefined);\n setSrc(undefined);\n\n fetchMediaContents(media)\n .then((buffer) => {\n if (!cancelled) {\n setSrc(buffer);\n setLoading(false);\n }\n })\n .catch((err: unknown) => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [media]);\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {error.message}\n </div>\n </div>\n );\n }\n\n if (src == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return <BasePdfViewer src={src} className={className} {...pdfViewerProps} />;\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,IAAIC,SAAS,EAAEC,IAAI,QAAQ,oBAAoB;AAE7D,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,aAAa,QAAQ,gBAAgB;AAC9C,OAAOC,MAAM,MAAM,wBAAwB;AAG3C,eAAeC,kBAAkBA,CAACC,KAAY,EAAwB;EACpE,MAAMC,MAAM,GAAG,MAAMD,KAAK,CAACE,aAAa,CAAC,CAAC;EAC1C,OAAOD,MAAM,CAACE,WAAW,CAAC,CAAC;AAC7B;AAOA,OAAO,SAASC,WAAWA,CAAC;EAC1BJ,KAAK;EACLK,SAAS;EACT,GAAGC;AACa,CAAC,EAAsB;EACvC,MAAM,CAACC,GAAG,EAAEC,MAAM,CAAC,GAAGZ,QAAQ,CAA0Ba,SAAS,CAAC;EAClE,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGf,QAAQ,CAAC,IAAI,CAAC;EAC5C,MAAM,CAACgB,KAAK,EAAEC,QAAQ,CAAC,GAAGjB,QAAQ,CAAoBa,SAAS,CAAC;;EAEhE;EACAd,SAAS,CAAC,YAA4B;IACpC,IAAImB,SAAS,GAAG,KAAK;IACrBH,UAAU,CAAC,IAAI,CAAC;IAChBE,QAAQ,CAACJ,SAAS,CAAC;IACnBD,MAAM,CAACC,SAAS,CAAC;IAEjBV,kBAAkB,CAACC,KAAK,CAAC,CACtBe,IAAI,CAAEC,MAAM,IAAK;MAChB,IAAI,CAACF,SAAS,EAAE;QACdN,MAAM,CAACQ,MAAM,CAAC;QACdL,UAAU,CAAC,KAAK,CAAC;MACnB;IACF,CAAC,CAAC,CACDM,KAAK,CAAEC,GAAY,IAAK;MACvB,IAAI,CAACJ,SAAS,EAAE;QACdD,QAAQ,CAACK,GAAG,YAAY5B,KAAK,GAAG4B,GAAG,GAAG,IAAI5B,KAAK,CAAC6B,MAAM,CAACD,GAAG,CAAC,CAAC,CAAC;QAC7DP,UAAU,CAAC,KAAK,CAAC;MACnB;IACF,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXG,SAAS,GAAG,IAAI;IAClB,CAAC;EACH,CAAC,EAAE,CAACd,KAAK,CAAC,CAAC;EAEX,MAAMoB,aAAa,GAAG3B,UAAU,CAACK,MAAM,CAACuB,SAAS,EAAEhB,SAAS,CAAC;EAE7D,IAAIK,OAAO,EAAE;IACX,oBACEhB,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEe;IAAc,gBAC5B1B,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEP,MAAM,CAACyB;IAAiB,gBACtC7B,KAAA,CAAA4B,aAAA,CAAC9B,IAAI;MAACa,SAAS,EAAEP,MAAM,CAAC0B;IAAY,CAAE,CAAC,iBAEpC,CACF,CAAC;EAEV;EAEA,IAAIZ,KAAK,IAAI,IAAI,EAAE;IACjB,oBACElB,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEe;IAAc,gBAC5B1B,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEP,MAAM,CAAC2B;IAAe,gBACpC/B,KAAA,CAAA4B,aAAA,CAAC/B,SAAS;MAACc,SAAS,EAAEP,MAAM,CAAC4B;IAAU,CAAE,CAAC,wBACtB,EAACd,KAAK,CAACe,OACxB,CACF,CAAC;EAEV;EAEA,IAAIpB,GAAG,IAAI,IAAI,EAAE;IACf,oBACEb,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEe;IAAc,gBAC5B1B,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEP,MAAM,CAACyB;IAAiB,GAAC,aAAgB,CACtD,CAAC;EAEV;EAEA,oBAAO7B,KAAA,CAAA4B,aAAA,CAACzB,aAAa,EAAA+B,QAAA;IAACrB,GAAG,EAAEA,GAAI;IAACF,SAAS,EAAEA;EAAU,GAAKC,cAAc,CAAG,CAAC;AAC9E","ignoreList":[]}
1
+ {"version":3,"file":"PdfRenderer.js","names":["Error","ErrorIcon","Spin","classnames","React","useEffect","useState","BasePdfViewer","styles","fetchMediaContents","media","result","fetchContents","arrayBuffer","PdfViewer","className","pdfViewerProps","src","setSrc","undefined","loading","setLoading","error","setError","cancelled","then","buffer","catch","err","String","rootClassName","pdfViewer","createElement","loadingContainer","spinnerIcon","errorContainer","errorIcon","message","_extends"],"sources":["PdfRenderer.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 { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport type { Media } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { useEffect, useState } from \"react\";\nimport { BasePdfViewer } from \"./PdfViewer.js\";\nimport styles from \"./PdfViewer.module.css\";\nimport type { PdfViewerProps } from \"./types.js\";\n\nasync function fetchMediaContents(media: Media): Promise<ArrayBuffer> {\n const result = await media.fetchContents();\n return result.arrayBuffer();\n}\n\nexport interface PdfViewerMediaProps extends Omit<PdfViewerProps, \"src\"> {\n /** The Media object to fetch PDF contents from */\n media: Media;\n}\n\nexport function PdfViewer({\n media,\n className,\n ...pdfViewerProps\n}: PdfViewerMediaProps): React.ReactElement {\n const [src, setSrc] = useState<ArrayBuffer | undefined>(undefined);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n // This is required until we either support React 19+ or a data fetching hook\n useEffect(function fetchMediaSource() {\n let cancelled = false;\n setLoading(true);\n setError(undefined);\n setSrc(undefined);\n\n fetchMediaContents(media)\n .then((buffer) => {\n if (!cancelled) {\n setSrc(buffer);\n setLoading(false);\n }\n })\n .catch((err: unknown) => {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [media]);\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {error.message}\n </div>\n </div>\n );\n }\n\n if (src == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return (\n <BasePdfViewer\n src={src}\n className={className}\n {...pdfViewerProps}\n />\n );\n}\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,IAAIC,SAAS,EAAEC,IAAI,QAAQ,oBAAoB;AAE7D,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,aAAa,QAAQ,gBAAgB;AAC9C,OAAOC,MAAM,MAAM,wBAAwB;AAG3C,eAAeC,kBAAkBA,CAACC,KAAY,EAAwB;EACpE,MAAMC,MAAM,GAAG,MAAMD,KAAK,CAACE,aAAa,CAAC,CAAC;EAC1C,OAAOD,MAAM,CAACE,WAAW,CAAC,CAAC;AAC7B;AAOA,OAAO,SAASC,SAASA,CAAC;EACxBJ,KAAK;EACLK,SAAS;EACT,GAAGC;AACgB,CAAC,EAAsB;EAC1C,MAAM,CAACC,GAAG,EAAEC,MAAM,CAAC,GAAGZ,QAAQ,CAA0Ba,SAAS,CAAC;EAClE,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGf,QAAQ,CAAC,IAAI,CAAC;EAC5C,MAAM,CAACgB,KAAK,EAAEC,QAAQ,CAAC,GAAGjB,QAAQ,CAAoBa,SAAS,CAAC;;EAEhE;EACAd,SAAS,CAAC,YAA4B;IACpC,IAAImB,SAAS,GAAG,KAAK;IACrBH,UAAU,CAAC,IAAI,CAAC;IAChBE,QAAQ,CAACJ,SAAS,CAAC;IACnBD,MAAM,CAACC,SAAS,CAAC;IAEjBV,kBAAkB,CAACC,KAAK,CAAC,CACtBe,IAAI,CAAEC,MAAM,IAAK;MAChB,IAAI,CAACF,SAAS,EAAE;QACdN,MAAM,CAACQ,MAAM,CAAC;QACdL,UAAU,CAAC,KAAK,CAAC;MACnB;IACF,CAAC,CAAC,CACDM,KAAK,CAAEC,GAAY,IAAK;MACvB,IAAI,CAACJ,SAAS,EAAE;QACdD,QAAQ,CAACK,GAAG,YAAY5B,KAAK,GAAG4B,GAAG,GAAG,IAAI5B,KAAK,CAAC6B,MAAM,CAACD,GAAG,CAAC,CAAC,CAAC;QAC7DP,UAAU,CAAC,KAAK,CAAC;MACnB;IACF,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXG,SAAS,GAAG,IAAI;IAClB,CAAC;EACH,CAAC,EAAE,CAACd,KAAK,CAAC,CAAC;EAEX,MAAMoB,aAAa,GAAG3B,UAAU,CAACK,MAAM,CAACuB,SAAS,EAAEhB,SAAS,CAAC;EAE7D,IAAIK,OAAO,EAAE;IACX,oBACEhB,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEe;IAAc,gBAC5B1B,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEP,MAAM,CAACyB;IAAiB,gBACtC7B,KAAA,CAAA4B,aAAA,CAAC9B,IAAI;MAACa,SAAS,EAAEP,MAAM,CAAC0B;IAAY,CAAE,CAAC,iBAEpC,CACF,CAAC;EAEV;EAEA,IAAIZ,KAAK,IAAI,IAAI,EAAE;IACjB,oBACElB,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEe;IAAc,gBAC5B1B,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEP,MAAM,CAAC2B;IAAe,gBACpC/B,KAAA,CAAA4B,aAAA,CAAC/B,SAAS;MAACc,SAAS,EAAEP,MAAM,CAAC4B;IAAU,CAAE,CAAC,wBACtB,EAACd,KAAK,CAACe,OACxB,CACF,CAAC;EAEV;EAEA,IAAIpB,GAAG,IAAI,IAAI,EAAE;IACf,oBACEb,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEe;IAAc,gBAC5B1B,KAAA,CAAA4B,aAAA;MAAKjB,SAAS,EAAEP,MAAM,CAACyB;IAAiB,GAAC,aAAgB,CACtD,CAAC;EAEV;EAEA,oBACE7B,KAAA,CAAA4B,aAAA,CAACzB,aAAa,EAAA+B,QAAA;IACZrB,GAAG,EAAEA,GAAI;IACTF,SAAS,EAAEA;EAAU,GACjBC,cAAc,CACnB,CAAC;AAEN","ignoreList":[]}
@@ -17,110 +17,39 @@
17
17
  import { Error as ErrorIcon, Spin } from "@blueprintjs/icons";
18
18
  import classnames from "classnames";
19
19
  import "pdfjs-dist/web/pdf_viewer.css";
20
- import React, { useCallback, useEffect, useRef, useState } from "react";
20
+ import React from "react";
21
21
  import { createPortal } from "react-dom";
22
+ import { PdfViewerAnnotationLayer } from "./components/PdfViewerAnnotationLayer.js";
23
+ import { PdfViewerOutlineSidebar } from "./components/PdfViewerOutlineSidebar.js";
24
+ import { PdfViewerSearchBar } from "./components/PdfViewerSearchBar.js";
25
+ import { PdfViewerSidebar } from "./components/PdfViewerSidebar.js";
26
+ import { PdfViewerToolbar } from "./components/PdfViewerToolbar.js";
22
27
  import { EMPTY_ANNOTATION_ARRAY, EMPTY_ANNOTATIONS } from "./constants.js";
23
- import { usePdfAnnotationPortals } from "./hooks/usePdfAnnotationPortals.js";
24
- import { usePdfDocument } from "./hooks/usePdfDocument.js";
25
- import { usePdfViewer } from "./hooks/usePdfViewer.js";
26
- import { usePdfViewerSearch } from "./hooks/usePdfViewerSearch.js";
27
- import { usePdfViewerSync } from "./hooks/usePdfViewerSync.js";
28
+ import { usePdfViewerState } from "./hooks/usePdfViewerState.js";
28
29
  import styles from "./PdfViewer.module.css.js";
29
- import { PdfViewerAnnotationLayer } from "./PdfViewerAnnotationLayer.js";
30
- import { PdfViewerSearchBar } from "./PdfViewerSearchBar.js";
31
- import { PdfViewerSidebar } from "./PdfViewerSidebar.js";
32
- import { PdfViewerToolbar } from "./PdfViewerToolbar.js";
33
30
  export function BasePdfViewer({
34
31
  src,
35
32
  annotations = EMPTY_ANNOTATIONS,
36
33
  onAnnotationClick,
34
+ onDownload,
37
35
  initialPage = 1,
38
36
  initialScale = 1.0,
39
37
  initialSidebarOpen = false,
38
+ enableDownload = false,
39
+ sidebarMode: sidebarModeProp = "thumbnails",
40
+ outlineIcons,
40
41
  className
41
42
  }) {
42
- const {
43
- document,
44
- numPages,
45
- loading,
46
- error
47
- } = usePdfDocument(src);
48
- const [scale, setScale] = useState(initialScale);
49
- const [sidebarOpen, setSidebarOpen] = useState(initialSidebarOpen);
50
- const [currentPage, setCurrentPage] = useState(initialPage);
51
- const containerRef = useRef(null);
52
- const viewerRef = useRef(null);
53
- const {
54
- pdfViewerRef,
55
- eventBusRef,
56
- findControllerRef
57
- } = usePdfViewer(containerRef, viewerRef, document, initialScale);
58
- const search = usePdfViewerSearch(eventBusRef, findControllerRef, document);
59
- const handleScaleChange = useCallback(newScale => {
60
- setScale(newScale);
61
- }, []);
62
- const handlePageChange = useCallback(page => {
63
- setCurrentPage(page);
64
- }, []);
65
- const {
66
- scrollToPage
67
- } = usePdfViewerSync({
68
- pdfViewerRef,
69
- eventBusRef,
70
- document,
71
- scale,
72
- onScaleChange: handleScaleChange,
73
- onPageChange: handlePageChange
43
+ const viewer = usePdfViewerState({
44
+ src,
45
+ initialPage,
46
+ initialScale,
47
+ initialSidebarOpen,
48
+ sidebarMode: sidebarModeProp,
49
+ onDownload
74
50
  });
75
- const portalTargets = usePdfAnnotationPortals(pdfViewerRef, eventBusRef, document);
76
-
77
- // Set initial page after viewer is ready
78
- useEffect(function () {
79
- if (pdfViewerRef.current != null && initialPage > 1) {
80
- pdfViewerRef.current.currentPageNumber = initialPage;
81
- }
82
- }, [pdfViewerRef, initialPage]);
83
-
84
- // Ctrl+F handler
85
- useEffect(function () {
86
- const handleKeyDown = e => {
87
- if ((e.ctrlKey || e.metaKey) && e.key === "f") {
88
- e.preventDefault();
89
- search.openSearch();
90
- }
91
- };
92
- window.addEventListener("keydown", handleKeyDown);
93
- return () => {
94
- window.removeEventListener("keydown", handleKeyDown);
95
- };
96
- }, [search.openSearch]);
97
- const handleDownload = useCallback(() => {
98
- if (document == null) {
99
- return;
100
- }
101
- void document.getData().then(data => {
102
- const blob = new Blob([data.buffer], {
103
- type: "application/pdf"
104
- });
105
- const url = URL.createObjectURL(blob);
106
- // Extract filename from URL by taking the last path segment and stripping query params
107
- const filename = typeof src === "string" ? src.split("/").pop()?.split("?")[0] || "document.pdf" : "document.pdf";
108
- const a = globalThis.document.createElement("a");
109
- a.href = url;
110
- a.download = filename;
111
- a.click();
112
- URL.revokeObjectURL(url);
113
- });
114
- }, [document, src]);
115
- const handleSidebarToggle = useCallback(() => {
116
- setSidebarOpen(prev => !prev);
117
- }, []);
118
- const handleToolbarPageChange = useCallback(page => {
119
- setCurrentPage(page);
120
- scrollToPage(page);
121
- }, [scrollToPage]);
122
51
  const rootClassName = classnames(styles.pdfViewer, className);
123
- if (loading) {
52
+ if (viewer.loading) {
124
53
  return /*#__PURE__*/React.createElement("div", {
125
54
  className: rootClassName
126
55
  }, /*#__PURE__*/React.createElement("div", {
@@ -129,16 +58,16 @@ export function BasePdfViewer({
129
58
  className: styles.spinnerIcon
130
59
  }), "Loading\u2026"));
131
60
  }
132
- if (error != null) {
61
+ if (viewer.error != null) {
133
62
  return /*#__PURE__*/React.createElement("div", {
134
63
  className: rootClassName
135
64
  }, /*#__PURE__*/React.createElement("div", {
136
65
  className: styles.errorContainer
137
66
  }, /*#__PURE__*/React.createElement(ErrorIcon, {
138
67
  className: styles.errorIcon
139
- }), "Failed to load PDF: ", error.message));
68
+ }), "Failed to load PDF: ", viewer.error.message));
140
69
  }
141
- if (document == null) {
70
+ if (viewer.document == null) {
142
71
  return /*#__PURE__*/React.createElement("div", {
143
72
  className: rootClassName
144
73
  }, /*#__PURE__*/React.createElement("div", {
@@ -148,39 +77,51 @@ export function BasePdfViewer({
148
77
  return /*#__PURE__*/React.createElement("div", {
149
78
  className: rootClassName
150
79
  }, /*#__PURE__*/React.createElement(PdfViewerToolbar, {
151
- currentPage: currentPage,
152
- numPages: numPages,
153
- scale: scale,
154
- sidebarOpen: sidebarOpen,
155
- onPageChange: handleToolbarPageChange,
156
- onScaleChange: setScale,
157
- onSearchOpen: search.openSearch,
158
- onSidebarToggle: handleSidebarToggle,
159
- onDownload: handleDownload
160
- }), search.isSearchOpen && /*#__PURE__*/React.createElement(PdfViewerSearchBar, {
161
- query: search.query,
162
- totalMatches: search.totalMatches,
163
- currentMatchIndex: search.currentMatchIndex,
164
- onQueryChange: search.setQuery,
165
- onNext: search.nextMatch,
166
- onPrev: search.prevMatch,
167
- onClose: search.closeSearch
80
+ currentPage: viewer.currentPage,
81
+ numPages: viewer.numPages,
82
+ scale: viewer.scale,
83
+ sidebarOpen: viewer.sidebarOpen,
84
+ onPageChange: viewer.scrollToPage,
85
+ onScaleChange: viewer.setScale,
86
+ onSearchOpen: viewer.search.openSearch,
87
+ onSidebarToggle: viewer.toggleSidebar,
88
+ onDownload: viewer.download,
89
+ enableDownload: enableDownload,
90
+ onRotateLeft: viewer.rotateLeft,
91
+ onRotateRight: viewer.rotateRight
92
+ }), viewer.search.isSearchOpen && /*#__PURE__*/React.createElement(PdfViewerSearchBar, {
93
+ query: viewer.search.query,
94
+ totalMatches: viewer.search.totalMatches,
95
+ currentMatchIndex: viewer.search.currentMatchIndex,
96
+ onQueryChange: viewer.search.setQuery,
97
+ onNext: viewer.search.nextMatch,
98
+ onPrev: viewer.search.prevMatch,
99
+ onClose: viewer.search.closeSearch
168
100
  }), /*#__PURE__*/React.createElement("div", {
169
101
  className: styles.contentArea
170
- }, sidebarOpen && /*#__PURE__*/React.createElement(PdfViewerSidebar, {
171
- document: document,
172
- numPages: numPages,
173
- currentPage: currentPage,
174
- onPageClick: handleToolbarPageChange
102
+ }, viewer.sidebarOpen && viewer.sidebarMode === "thumbnails" && /*#__PURE__*/React.createElement(PdfViewerSidebar, {
103
+ document: viewer.document,
104
+ numPages: viewer.numPages,
105
+ currentPage: viewer.currentPage,
106
+ onPageClick: viewer.scrollToPage,
107
+ sidebarMode: viewer.sidebarMode,
108
+ onSidebarModeChange: viewer.setSidebarMode
109
+ }), viewer.sidebarOpen && viewer.sidebarMode === "outline" && /*#__PURE__*/React.createElement(PdfViewerOutlineSidebar, {
110
+ outlineItems: viewer.outlineItems,
111
+ currentPage: viewer.currentPage,
112
+ onItemClick: viewer.scrollToPage,
113
+ sidebarMode: viewer.sidebarMode,
114
+ onSidebarModeChange: viewer.setSidebarMode,
115
+ outlineIcons: outlineIcons
175
116
  }), /*#__PURE__*/React.createElement("div", {
176
117
  className: styles.scrollContainerWrapper
177
118
  }, /*#__PURE__*/React.createElement("div", {
178
- ref: containerRef,
119
+ ref: viewer.containerRef,
179
120
  className: styles.scrollContainer
180
121
  }, /*#__PURE__*/React.createElement("div", {
181
- ref: viewerRef,
122
+ ref: viewer.viewerRef,
182
123
  className: "pdfViewer"
183
- }), portalTargets.map(target => {
124
+ }), viewer.portalTargets.map(target => {
184
125
  const pageAnnotations = annotations[target.pageNumber] ?? EMPTY_ANNOTATION_ARRAY;
185
126
  if (pageAnnotations.length === 0) {
186
127
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"PdfViewer.js","names":["Error","ErrorIcon","Spin","classnames","React","useCallback","useEffect","useRef","useState","createPortal","EMPTY_ANNOTATION_ARRAY","EMPTY_ANNOTATIONS","usePdfAnnotationPortals","usePdfDocument","usePdfViewer","usePdfViewerSearch","usePdfViewerSync","styles","PdfViewerAnnotationLayer","PdfViewerSearchBar","PdfViewerSidebar","PdfViewerToolbar","BasePdfViewer","src","annotations","onAnnotationClick","initialPage","initialScale","initialSidebarOpen","className","document","numPages","loading","error","scale","setScale","sidebarOpen","setSidebarOpen","currentPage","setCurrentPage","containerRef","viewerRef","pdfViewerRef","eventBusRef","findControllerRef","search","handleScaleChange","newScale","handlePageChange","page","scrollToPage","onScaleChange","onPageChange","portalTargets","current","currentPageNumber","handleKeyDown","e","ctrlKey","metaKey","key","preventDefault","openSearch","window","addEventListener","removeEventListener","handleDownload","getData","then","data","blob","Blob","buffer","type","url","URL","createObjectURL","filename","split","pop","a","globalThis","createElement","href","download","click","revokeObjectURL","handleSidebarToggle","prev","handleToolbarPageChange","rootClassName","pdfViewer","loadingContainer","spinnerIcon","errorContainer","errorIcon","message","onSearchOpen","onSidebarToggle","onDownload","isSearchOpen","query","totalMatches","currentMatchIndex","onQueryChange","setQuery","onNext","nextMatch","onPrev","prevMatch","onClose","closeSearch","contentArea","onPageClick","scrollContainerWrapper","ref","scrollContainer","map","target","pageAnnotations","pageNumber","length","pageHeight","container"],"sources":["PdfViewer.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 { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { EMPTY_ANNOTATION_ARRAY, EMPTY_ANNOTATIONS } from \"./constants.js\";\nimport { usePdfAnnotationPortals } from \"./hooks/usePdfAnnotationPortals.js\";\nimport { usePdfDocument } from \"./hooks/usePdfDocument.js\";\nimport { usePdfViewer } from \"./hooks/usePdfViewer.js\";\nimport { usePdfViewerSearch } from \"./hooks/usePdfViewerSearch.js\";\nimport { usePdfViewerSync } from \"./hooks/usePdfViewerSync.js\";\nimport styles from \"./PdfViewer.module.css\";\nimport { PdfViewerAnnotationLayer } from \"./PdfViewerAnnotationLayer.js\";\nimport { PdfViewerSearchBar } from \"./PdfViewerSearchBar.js\";\nimport { PdfViewerSidebar } from \"./PdfViewerSidebar.js\";\nimport { PdfViewerToolbar } from \"./PdfViewerToolbar.js\";\nimport type { PdfViewerProps } from \"./types.js\";\n\nexport function BasePdfViewer({\n src,\n annotations = EMPTY_ANNOTATIONS,\n onAnnotationClick,\n initialPage = 1,\n initialScale = 1.0,\n initialSidebarOpen = false,\n className,\n}: PdfViewerProps): React.ReactElement {\n const { document, numPages, loading, error } = usePdfDocument(src);\n const [scale, setScale] = useState(initialScale);\n const [sidebarOpen, setSidebarOpen] = useState(initialSidebarOpen);\n const [currentPage, setCurrentPage] = useState(initialPage);\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<HTMLDivElement>(null);\n\n const { pdfViewerRef, eventBusRef, findControllerRef } = usePdfViewer(\n containerRef,\n viewerRef,\n document,\n initialScale,\n );\n\n const search = usePdfViewerSearch(eventBusRef, findControllerRef, document);\n\n const handleScaleChange = useCallback((newScale: number) => {\n setScale(newScale);\n }, []);\n\n const handlePageChange = useCallback((page: number) => {\n setCurrentPage(page);\n }, []);\n\n const { scrollToPage } = usePdfViewerSync({\n pdfViewerRef,\n eventBusRef,\n document,\n scale,\n onScaleChange: handleScaleChange,\n onPageChange: handlePageChange,\n });\n\n const portalTargets = usePdfAnnotationPortals(\n pdfViewerRef,\n eventBusRef,\n document,\n );\n\n // Set initial page after viewer is ready\n useEffect(function setInitialPage() {\n if (pdfViewerRef.current != null && initialPage > 1) {\n pdfViewerRef.current.currentPageNumber = initialPage;\n }\n }, [pdfViewerRef, initialPage]);\n\n // Ctrl+F handler\n useEffect(function registerSearchShortcut() {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === \"f\") {\n e.preventDefault();\n search.openSearch();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [search.openSearch]);\n\n const handleDownload = useCallback(() => {\n if (document == null) {\n return;\n }\n void document.getData().then((data) => {\n const blob = new Blob([data.buffer as ArrayBuffer], {\n type: \"application/pdf\",\n });\n const url = URL.createObjectURL(blob);\n // Extract filename from URL by taking the last path segment and stripping query params\n const filename = typeof src === \"string\"\n ? src.split(\"/\").pop()?.split(\"?\")[0] || \"document.pdf\"\n : \"document.pdf\";\n const a = globalThis.document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n });\n }, [document, src]);\n\n const handleSidebarToggle = useCallback(() => {\n setSidebarOpen((prev) => !prev);\n }, []);\n\n const handleToolbarPageChange = useCallback(\n (page: number) => {\n setCurrentPage(page);\n scrollToPage(page);\n },\n [scrollToPage],\n );\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {error.message}\n </div>\n </div>\n );\n }\n\n if (document == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return (\n <div className={rootClassName}>\n <PdfViewerToolbar\n currentPage={currentPage}\n numPages={numPages}\n scale={scale}\n sidebarOpen={sidebarOpen}\n onPageChange={handleToolbarPageChange}\n onScaleChange={setScale}\n onSearchOpen={search.openSearch}\n onSidebarToggle={handleSidebarToggle}\n onDownload={handleDownload}\n />\n {search.isSearchOpen && (\n <PdfViewerSearchBar\n query={search.query}\n totalMatches={search.totalMatches}\n currentMatchIndex={search.currentMatchIndex}\n onQueryChange={search.setQuery}\n onNext={search.nextMatch}\n onPrev={search.prevMatch}\n onClose={search.closeSearch}\n />\n )}\n <div className={styles.contentArea}>\n {sidebarOpen && (\n <PdfViewerSidebar\n document={document}\n numPages={numPages}\n currentPage={currentPage}\n onPageClick={handleToolbarPageChange}\n />\n )}\n <div className={styles.scrollContainerWrapper}>\n <div ref={containerRef} className={styles.scrollContainer}>\n <div ref={viewerRef} className=\"pdfViewer\" />\n {portalTargets.map((target) => {\n const pageAnnotations = annotations[target.pageNumber]\n ?? EMPTY_ANNOTATION_ARRAY;\n if (pageAnnotations.length === 0) {\n return null;\n }\n return createPortal(\n <PdfViewerAnnotationLayer\n key={target.pageNumber}\n annotations={pageAnnotations}\n pageHeight={target.pageHeight}\n scale={target.scale}\n onAnnotationClick={onAnnotationClick}\n />,\n target.container,\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"PdfViewer.js","names":["Error","ErrorIcon","Spin","classnames","React","createPortal","PdfViewerAnnotationLayer","PdfViewerOutlineSidebar","PdfViewerSearchBar","PdfViewerSidebar","PdfViewerToolbar","EMPTY_ANNOTATION_ARRAY","EMPTY_ANNOTATIONS","usePdfViewerState","styles","BasePdfViewer","src","annotations","onAnnotationClick","onDownload","initialPage","initialScale","initialSidebarOpen","enableDownload","sidebarMode","sidebarModeProp","outlineIcons","className","viewer","rootClassName","pdfViewer","loading","createElement","loadingContainer","spinnerIcon","error","errorContainer","errorIcon","message","document","currentPage","numPages","scale","sidebarOpen","onPageChange","scrollToPage","onScaleChange","setScale","onSearchOpen","search","openSearch","onSidebarToggle","toggleSidebar","download","onRotateLeft","rotateLeft","onRotateRight","rotateRight","isSearchOpen","query","totalMatches","currentMatchIndex","onQueryChange","setQuery","onNext","nextMatch","onPrev","prevMatch","onClose","closeSearch","contentArea","onPageClick","onSidebarModeChange","setSidebarMode","outlineItems","onItemClick","scrollContainerWrapper","ref","containerRef","scrollContainer","viewerRef","portalTargets","map","target","pageAnnotations","pageNumber","length","key","pageHeight","container"],"sources":["PdfViewer.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 { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { PdfViewerAnnotationLayer } from \"./components/PdfViewerAnnotationLayer.js\";\nimport { PdfViewerOutlineSidebar } from \"./components/PdfViewerOutlineSidebar.js\";\nimport { PdfViewerSearchBar } from \"./components/PdfViewerSearchBar.js\";\nimport { PdfViewerSidebar } from \"./components/PdfViewerSidebar.js\";\nimport { PdfViewerToolbar } from \"./components/PdfViewerToolbar.js\";\nimport { EMPTY_ANNOTATION_ARRAY, EMPTY_ANNOTATIONS } from \"./constants.js\";\nimport { usePdfViewerState } from \"./hooks/usePdfViewerState.js\";\nimport styles from \"./PdfViewer.module.css\";\nimport type { PdfViewerProps } from \"./types.js\";\n\nexport function BasePdfViewer({\n src,\n annotations = EMPTY_ANNOTATIONS,\n onAnnotationClick,\n onDownload,\n initialPage = 1,\n initialScale = 1.0,\n initialSidebarOpen = false,\n enableDownload = false,\n sidebarMode: sidebarModeProp = \"thumbnails\",\n outlineIcons,\n className,\n}: PdfViewerProps): React.ReactElement {\n const viewer = usePdfViewerState({\n src,\n initialPage,\n initialScale,\n initialSidebarOpen,\n sidebarMode: sidebarModeProp,\n onDownload,\n });\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (viewer.loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (viewer.error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {viewer.error.message}\n </div>\n </div>\n );\n }\n\n if (viewer.document == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return (\n <div className={rootClassName}>\n <PdfViewerToolbar\n currentPage={viewer.currentPage}\n numPages={viewer.numPages}\n scale={viewer.scale}\n sidebarOpen={viewer.sidebarOpen}\n onPageChange={viewer.scrollToPage}\n onScaleChange={viewer.setScale}\n onSearchOpen={viewer.search.openSearch}\n onSidebarToggle={viewer.toggleSidebar}\n onDownload={viewer.download}\n enableDownload={enableDownload}\n onRotateLeft={viewer.rotateLeft}\n onRotateRight={viewer.rotateRight}\n />\n {viewer.search.isSearchOpen && (\n <PdfViewerSearchBar\n query={viewer.search.query}\n totalMatches={viewer.search.totalMatches}\n currentMatchIndex={viewer.search.currentMatchIndex}\n onQueryChange={viewer.search.setQuery}\n onNext={viewer.search.nextMatch}\n onPrev={viewer.search.prevMatch}\n onClose={viewer.search.closeSearch}\n />\n )}\n <div className={styles.contentArea}>\n {viewer.sidebarOpen && viewer.sidebarMode === \"thumbnails\" && (\n <PdfViewerSidebar\n document={viewer.document}\n numPages={viewer.numPages}\n currentPage={viewer.currentPage}\n onPageClick={viewer.scrollToPage}\n sidebarMode={viewer.sidebarMode}\n onSidebarModeChange={viewer.setSidebarMode}\n />\n )}\n {viewer.sidebarOpen && viewer.sidebarMode === \"outline\" && (\n <PdfViewerOutlineSidebar\n outlineItems={viewer.outlineItems}\n currentPage={viewer.currentPage}\n onItemClick={viewer.scrollToPage}\n sidebarMode={viewer.sidebarMode}\n onSidebarModeChange={viewer.setSidebarMode}\n outlineIcons={outlineIcons}\n />\n )}\n <div className={styles.scrollContainerWrapper}>\n <div ref={viewer.containerRef} className={styles.scrollContainer}>\n <div ref={viewer.viewerRef} className=\"pdfViewer\" />\n {viewer.portalTargets.map((target) => {\n const pageAnnotations = annotations[target.pageNumber]\n ?? EMPTY_ANNOTATION_ARRAY;\n if (pageAnnotations.length === 0) {\n return null;\n }\n return createPortal(\n <PdfViewerAnnotationLayer\n key={target.pageNumber}\n annotations={pageAnnotations}\n pageHeight={target.pageHeight}\n scale={target.scale}\n onAnnotationClick={onAnnotationClick}\n />,\n target.container,\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,IAAIC,SAAS,EAAEC,IAAI,QAAQ,oBAAoB;AAC7D,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAO,+BAA+B;AACtC,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,YAAY,QAAQ,WAAW;AACxC,SAASC,wBAAwB,QAAQ,0CAA0C;AACnF,SAASC,uBAAuB,QAAQ,yCAAyC;AACjF,SAASC,kBAAkB,QAAQ,oCAAoC;AACvE,SAASC,gBAAgB,QAAQ,kCAAkC;AACnE,SAASC,gBAAgB,QAAQ,kCAAkC;AACnE,SAASC,sBAAsB,EAAEC,iBAAiB,QAAQ,gBAAgB;AAC1E,SAASC,iBAAiB,QAAQ,8BAA8B;AAChE,OAAOC,MAAM,MAAM,wBAAwB;AAG3C,OAAO,SAASC,aAAaA,CAAC;EAC5BC,GAAG;EACHC,WAAW,GAAGL,iBAAiB;EAC/BM,iBAAiB;EACjBC,UAAU;EACVC,WAAW,GAAG,CAAC;EACfC,YAAY,GAAG,GAAG;EAClBC,kBAAkB,GAAG,KAAK;EAC1BC,cAAc,GAAG,KAAK;EACtBC,WAAW,EAAEC,eAAe,GAAG,YAAY;EAC3CC,YAAY;EACZC;AACc,CAAC,EAAsB;EACrC,MAAMC,MAAM,GAAGf,iBAAiB,CAAC;IAC/BG,GAAG;IACHI,WAAW;IACXC,YAAY;IACZC,kBAAkB;IAClBE,WAAW,EAAEC,eAAe;IAC5BN;EACF,CAAC,CAAC;EAEF,MAAMU,aAAa,GAAG1B,UAAU,CAACW,MAAM,CAACgB,SAAS,EAAEH,SAAS,CAAC;EAE7D,IAAIC,MAAM,CAACG,OAAO,EAAE;IAClB,oBACE3B,KAAA,CAAA4B,aAAA;MAAKL,SAAS,EAAEE;IAAc,gBAC5BzB,KAAA,CAAA4B,aAAA;MAAKL,SAAS,EAAEb,MAAM,CAACmB;IAAiB,gBACtC7B,KAAA,CAAA4B,aAAA,CAAC9B,IAAI;MAACyB,SAAS,EAAEb,MAAM,CAACoB;IAAY,CAAE,CAAC,iBAEpC,CACF,CAAC;EAEV;EAEA,IAAIN,MAAM,CAACO,KAAK,IAAI,IAAI,EAAE;IACxB,oBACE/B,KAAA,CAAA4B,aAAA;MAAKL,SAAS,EAAEE;IAAc,gBAC5BzB,KAAA,CAAA4B,aAAA;MAAKL,SAAS,EAAEb,MAAM,CAACsB;IAAe,gBACpChC,KAAA,CAAA4B,aAAA,CAAC/B,SAAS;MAAC0B,SAAS,EAAEb,MAAM,CAACuB;IAAU,CAAE,CAAC,wBACtB,EAACT,MAAM,CAACO,KAAK,CAACG,OAC/B,CACF,CAAC;EAEV;EAEA,IAAIV,MAAM,CAACW,QAAQ,IAAI,IAAI,EAAE;IAC3B,oBACEnC,KAAA,CAAA4B,aAAA;MAAKL,SAAS,EAAEE;IAAc,gBAC5BzB,KAAA,CAAA4B,aAAA;MAAKL,SAAS,EAAEb,MAAM,CAACmB;IAAiB,GAAC,aAAgB,CACtD,CAAC;EAEV;EAEA,oBACE7B,KAAA,CAAA4B,aAAA;IAAKL,SAAS,EAAEE;EAAc,gBAC5BzB,KAAA,CAAA4B,aAAA,CAACtB,gBAAgB;IACf8B,WAAW,EAAEZ,MAAM,CAACY,WAAY;IAChCC,QAAQ,EAAEb,MAAM,CAACa,QAAS;IAC1BC,KAAK,EAAEd,MAAM,CAACc,KAAM;IACpBC,WAAW,EAAEf,MAAM,CAACe,WAAY;IAChCC,YAAY,EAAEhB,MAAM,CAACiB,YAAa;IAClCC,aAAa,EAAElB,MAAM,CAACmB,QAAS;IAC/BC,YAAY,EAAEpB,MAAM,CAACqB,MAAM,CAACC,UAAW;IACvCC,eAAe,EAAEvB,MAAM,CAACwB,aAAc;IACtCjC,UAAU,EAAES,MAAM,CAACyB,QAAS;IAC5B9B,cAAc,EAAEA,cAAe;IAC/B+B,YAAY,EAAE1B,MAAM,CAAC2B,UAAW;IAChCC,aAAa,EAAE5B,MAAM,CAAC6B;EAAY,CACnC,CAAC,EACD7B,MAAM,CAACqB,MAAM,CAACS,YAAY,iBACzBtD,KAAA,CAAA4B,aAAA,CAACxB,kBAAkB;IACjBmD,KAAK,EAAE/B,MAAM,CAACqB,MAAM,CAACU,KAAM;IAC3BC,YAAY,EAAEhC,MAAM,CAACqB,MAAM,CAACW,YAAa;IACzCC,iBAAiB,EAAEjC,MAAM,CAACqB,MAAM,CAACY,iBAAkB;IACnDC,aAAa,EAAElC,MAAM,CAACqB,MAAM,CAACc,QAAS;IACtCC,MAAM,EAAEpC,MAAM,CAACqB,MAAM,CAACgB,SAAU;IAChCC,MAAM,EAAEtC,MAAM,CAACqB,MAAM,CAACkB,SAAU;IAChCC,OAAO,EAAExC,MAAM,CAACqB,MAAM,CAACoB;EAAY,CACpC,CACF,eACDjE,KAAA,CAAA4B,aAAA;IAAKL,SAAS,EAAEb,MAAM,CAACwD;EAAY,GAChC1C,MAAM,CAACe,WAAW,IAAIf,MAAM,CAACJ,WAAW,KAAK,YAAY,iBACxDpB,KAAA,CAAA4B,aAAA,CAACvB,gBAAgB;IACf8B,QAAQ,EAAEX,MAAM,CAACW,QAAS;IAC1BE,QAAQ,EAAEb,MAAM,CAACa,QAAS;IAC1BD,WAAW,EAAEZ,MAAM,CAACY,WAAY;IAChC+B,WAAW,EAAE3C,MAAM,CAACiB,YAAa;IACjCrB,WAAW,EAAEI,MAAM,CAACJ,WAAY;IAChCgD,mBAAmB,EAAE5C,MAAM,CAAC6C;EAAe,CAC5C,CACF,EACA7C,MAAM,CAACe,WAAW,IAAIf,MAAM,CAACJ,WAAW,KAAK,SAAS,iBACrDpB,KAAA,CAAA4B,aAAA,CAACzB,uBAAuB;IACtBmE,YAAY,EAAE9C,MAAM,CAAC8C,YAAa;IAClClC,WAAW,EAAEZ,MAAM,CAACY,WAAY;IAChCmC,WAAW,EAAE/C,MAAM,CAACiB,YAAa;IACjCrB,WAAW,EAAEI,MAAM,CAACJ,WAAY;IAChCgD,mBAAmB,EAAE5C,MAAM,CAAC6C,cAAe;IAC3C/C,YAAY,EAAEA;EAAa,CAC5B,CACF,eACDtB,KAAA,CAAA4B,aAAA;IAAKL,SAAS,EAAEb,MAAM,CAAC8D;EAAuB,gBAC5CxE,KAAA,CAAA4B,aAAA;IAAK6C,GAAG,EAAEjD,MAAM,CAACkD,YAAa;IAACnD,SAAS,EAAEb,MAAM,CAACiE;EAAgB,gBAC/D3E,KAAA,CAAA4B,aAAA;IAAK6C,GAAG,EAAEjD,MAAM,CAACoD,SAAU;IAACrD,SAAS,EAAC;EAAW,CAAE,CAAC,EACnDC,MAAM,CAACqD,aAAa,CAACC,GAAG,CAAEC,MAAM,IAAK;IACpC,MAAMC,eAAe,GAAGnE,WAAW,CAACkE,MAAM,CAACE,UAAU,CAAC,IACjD1E,sBAAsB;IAC3B,IAAIyE,eAAe,CAACE,MAAM,KAAK,CAAC,EAAE;MAChC,OAAO,IAAI;IACb;IACA,oBAAOjF,YAAY,cACjBD,KAAA,CAAA4B,aAAA,CAAC1B,wBAAwB;MACvBiF,GAAG,EAAEJ,MAAM,CAACE,UAAW;MACvBpE,WAAW,EAAEmE,eAAgB;MAC7BI,UAAU,EAAEL,MAAM,CAACK,UAAW;MAC9B9C,KAAK,EAAEyC,MAAM,CAACzC,KAAM;MACpBxB,iBAAiB,EAAEA;IAAkB,CACtC,CAAC,EACFiE,MAAM,CAACM,SACT,CAAC;EACH,CAAC,CACE,CACF,CACF,CACF,CAAC;AAEV","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfViewerAnnotationLayer.js","names":["classnames","React","useCallback","useMemo","styles","AnnotationItem","annotation","pageHeight","scale","onClick","handleClick","handleKeyDown","e","key","preventDefault","style","left","rect","x","top","y","height","width","color","className","type","createElement","onKeyDown","role","tabIndex","title","label","id","PdfViewerAnnotationLayer","annotations","onAnnotationClick","annotationLayer","map"],"sources":["PdfViewerAnnotationLayer.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, { useCallback, useMemo } from \"react\";\nimport type { PdfAnnotation } from \"../types.js\";\nimport styles from \"./PdfViewerAnnotationLayer.module.css\";\n\nexport interface PdfViewerAnnotationLayerProps {\n annotations: PdfAnnotation[];\n pageHeight: number;\n scale: number;\n onAnnotationClick?: (annotation: PdfAnnotation) => void;\n}\n\ninterface AnnotationItemProps {\n annotation: PdfAnnotation;\n pageHeight: number;\n scale: number;\n onClick?: (annotation: PdfAnnotation) => void;\n}\n\nfunction AnnotationItem({\n annotation,\n pageHeight,\n scale,\n onClick,\n}: AnnotationItemProps): React.ReactElement {\n const handleClick = useCallback(() => {\n onClick?.(annotation);\n }, [onClick, annotation]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onClick?.(annotation);\n }\n },\n [onClick, annotation],\n );\n\n // Convert PDF coordinates (bottom-left origin) to CSS (top-left origin)\n const style = useMemo(\n () => ({\n left: annotation.rect.x * scale,\n top: (pageHeight - annotation.rect.y - annotation.rect.height) * scale,\n width: annotation.rect.width * scale,\n height: annotation.rect.height * scale,\n ...(annotation.color != null\n ? {\n \"--osdk-pdf-annotation-color\": annotation.color,\n } as React.CSSProperties\n : {}),\n }),\n [annotation, pageHeight, scale],\n );\n\n const className = classnames(\n styles.annotation,\n styles[annotation.type],\n );\n\n return (\n <div\n className={className}\n style={style}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n title={annotation.label}\n data-annotation-id={annotation.id}\n />\n );\n}\n\nexport function PdfViewerAnnotationLayer({\n annotations,\n pageHeight,\n scale,\n onAnnotationClick,\n}: PdfViewerAnnotationLayerProps): React.ReactElement {\n return (\n <div className={styles.annotationLayer}>\n {annotations.map((annotation) => (\n <AnnotationItem\n key={annotation.id}\n annotation={annotation}\n pageHeight={pageHeight}\n scale={scale}\n onClick={onAnnotationClick}\n />\n ))}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAEnD,OAAOC,MAAM,MAAM,uCAAuC;AAgB1D,SAASC,cAAcA,CAAC;EACtBC,UAAU;EACVC,UAAU;EACVC,KAAK;EACLC;AACmB,CAAC,EAAsB;EAC1C,MAAMC,WAAW,GAAGR,WAAW,CAAC,MAAM;IACpCO,OAAO,GAAGH,UAAU,CAAC;EACvB,CAAC,EAAE,CAACG,OAAO,EAAEH,UAAU,CAAC,CAAC;EAEzB,MAAMK,aAAa,GAAGT,WAAW,CAC9BU,CAAsB,IAAK;IAC1B,IAAIA,CAAC,CAACC,GAAG,KAAK,OAAO,EAAE;MACrBD,CAAC,CAACE,cAAc,CAAC,CAAC;MAClBL,OAAO,GAAGH,UAAU,CAAC;IACvB;EACF,CAAC,EACD,CAACG,OAAO,EAAEH,UAAU,CACtB,CAAC;;EAED;EACA,MAAMS,KAAK,GAAGZ,OAAO,CACnB,OAAO;IACLa,IAAI,EAAEV,UAAU,CAACW,IAAI,CAACC,CAAC,GAAGV,KAAK;IAC/BW,GAAG,EAAE,CAACZ,UAAU,GAAGD,UAAU,CAACW,IAAI,CAACG,CAAC,GAAGd,UAAU,CAACW,IAAI,CAACI,MAAM,IAAIb,KAAK;IACtEc,KAAK,EAAEhB,UAAU,CAACW,IAAI,CAACK,KAAK,GAAGd,KAAK;IACpCa,MAAM,EAAEf,UAAU,CAACW,IAAI,CAACI,MAAM,GAAGb,KAAK;IACtC,IAAIF,UAAU,CAACiB,KAAK,IAAI,IAAI,GACxB;MACA,6BAA6B,EAAEjB,UAAU,CAACiB;IAC5C,CAAC,GACC,CAAC,CAAC;EACR,CAAC,CAAC,EACF,CAACjB,UAAU,EAAEC,UAAU,EAAEC,KAAK,CAChC,CAAC;EAED,MAAMgB,SAAS,GAAGxB,UAAU,CAC1BI,MAAM,CAACE,UAAU,EACjBF,MAAM,CAACE,UAAU,CAACmB,IAAI,CACxB,CAAC;EAED,oBACExB,KAAA,CAAAyB,aAAA;IACEF,SAAS,EAAEA,SAAU;IACrBT,KAAK,EAAEA,KAAM;IACbN,OAAO,EAAEC,WAAY;IACrBiB,SAAS,EAAEhB,aAAc;IACzBiB,IAAI,EAAC,QAAQ;IACbC,QAAQ,EAAE,CAAE;IACZC,KAAK,EAAExB,UAAU,CAACyB,KAAM;IACxB,sBAAoBzB,UAAU,CAAC0B;EAAG,CACnC,CAAC;AAEN;AAEA,OAAO,SAASC,wBAAwBA,CAAC;EACvCC,WAAW;EACX3B,UAAU;EACVC,KAAK;EACL2B;AAC6B,CAAC,EAAsB;EACpD,oBACElC,KAAA,CAAAyB,aAAA;IAAKF,SAAS,EAAEpB,MAAM,CAACgC;EAAgB,GACpCF,WAAW,CAACG,GAAG,CAAE/B,UAAU,iBAC1BL,KAAA,CAAAyB,aAAA,CAACrB,cAAc;IACbQ,GAAG,EAAEP,UAAU,CAAC0B,EAAG;IACnB1B,UAAU,EAAEA,UAAW;IACvBC,UAAU,EAAEA,UAAW;IACvBC,KAAK,EAAEA,KAAM;IACbC,OAAO,EAAE0B;EAAkB,CAC5B,CACF,CACE,CAAC;AAEV","ignoreList":[]}
@@ -12,7 +12,6 @@
12
12
  position: absolute;
13
13
  pointer-events: auto;
14
14
  cursor: pointer;
15
- box-sizing: border-box;
16
15
  transition: opacity var(--osdk-emphasis-transition-duration)
17
16
  var(--osdk-emphasis-ease-default);
18
17
  }
@@ -0,0 +1,11 @@
1
+ // CSS Module proxy for PdfViewerAnnotationLayer.module.css
2
+ const styles = {
3
+ "annotationLayer": "PdfViewerAnnotationLayer-module__annotationLayer___mljRfBSQ",
4
+ "annotation": "PdfViewerAnnotationLayer-module__annotation___1dAkVbQ8",
5
+ "highlight": "PdfViewerAnnotationLayer-module__highlight___uPiyo2kN",
6
+ "underline": "PdfViewerAnnotationLayer-module__underline___-qCk9Jld",
7
+ "comment": "PdfViewerAnnotationLayer-module__comment___Yv4tVnUp",
8
+ "pin": "PdfViewerAnnotationLayer-module__pin___9xjpPtr-"
9
+ };
10
+
11
+ export default styles;
@@ -0,0 +1,113 @@
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 { Error as ErrorIcon, Spin } from "@blueprintjs/icons";
18
+ import classnames from "classnames";
19
+ import "pdfjs-dist/web/pdf_viewer.css";
20
+ import React, { useEffect, useRef } from "react";
21
+ import { createPortal } from "react-dom";
22
+ import { EMPTY_ANNOTATION_ARRAY, EMPTY_ANNOTATIONS } from "../constants.js";
23
+ import { usePdfViewerCore } from "../hooks/usePdfViewerCore.js";
24
+ import styles from "../PdfViewer.module.css.js";
25
+ import { PdfViewerAnnotationLayer } from "./PdfViewerAnnotationLayer.js";
26
+ export function PdfViewerContent({
27
+ src,
28
+ annotations = EMPTY_ANNOTATIONS,
29
+ onAnnotationClick,
30
+ initialPage = 1,
31
+ initialScale = 1.0,
32
+ onPageChange: onPageChangeProp,
33
+ onScaleChange: onScaleChangeProp,
34
+ className
35
+ }) {
36
+ const viewer = usePdfViewerCore({
37
+ src,
38
+ initialPage,
39
+ initialScale
40
+ });
41
+
42
+ // Use refs for callbacks to avoid firing on initial mount
43
+ const onPageChangeRef = useRef(onPageChangeProp);
44
+ onPageChangeRef.current = onPageChangeProp;
45
+ const onScaleChangeRef = useRef(onScaleChangeProp);
46
+ onScaleChangeRef.current = onScaleChangeProp;
47
+ const isInitialMountRef = useRef(true);
48
+ useEffect(function () {
49
+ if (isInitialMountRef.current) {
50
+ return;
51
+ }
52
+ onPageChangeRef.current?.(viewer.currentPage);
53
+ }, [viewer.currentPage]);
54
+ useEffect(function () {
55
+ if (isInitialMountRef.current) {
56
+ return;
57
+ }
58
+ onScaleChangeRef.current?.(viewer.scale);
59
+ }, [viewer.scale]);
60
+ useEffect(function () {
61
+ isInitialMountRef.current = false;
62
+ }, []);
63
+ const rootClassName = classnames(styles.pdfViewer, className);
64
+ if (viewer.loading) {
65
+ return /*#__PURE__*/React.createElement("div", {
66
+ className: rootClassName
67
+ }, /*#__PURE__*/React.createElement("div", {
68
+ className: styles.loadingContainer
69
+ }, /*#__PURE__*/React.createElement(Spin, {
70
+ className: styles.spinnerIcon
71
+ }), "Loading\u2026"));
72
+ }
73
+ if (viewer.error != null) {
74
+ return /*#__PURE__*/React.createElement("div", {
75
+ className: rootClassName
76
+ }, /*#__PURE__*/React.createElement("div", {
77
+ className: styles.errorContainer
78
+ }, /*#__PURE__*/React.createElement(ErrorIcon, {
79
+ className: styles.errorIcon
80
+ }), "Failed to load PDF: ", viewer.error.message));
81
+ }
82
+ if (viewer.document == null) {
83
+ return /*#__PURE__*/React.createElement("div", {
84
+ className: rootClassName
85
+ }, /*#__PURE__*/React.createElement("div", {
86
+ className: styles.loadingContainer
87
+ }, "No document"));
88
+ }
89
+ return /*#__PURE__*/React.createElement("div", {
90
+ className: rootClassName
91
+ }, /*#__PURE__*/React.createElement("div", {
92
+ className: styles.scrollContainerWrapper
93
+ }, /*#__PURE__*/React.createElement("div", {
94
+ ref: viewer.containerRef,
95
+ className: styles.scrollContainer
96
+ }, /*#__PURE__*/React.createElement("div", {
97
+ ref: viewer.viewerRef,
98
+ className: "pdfViewer"
99
+ }), viewer.portalTargets.map(target => {
100
+ const pageAnnotations = annotations[target.pageNumber] ?? EMPTY_ANNOTATION_ARRAY;
101
+ if (pageAnnotations.length === 0) {
102
+ return null;
103
+ }
104
+ return /*#__PURE__*/createPortal(/*#__PURE__*/React.createElement(PdfViewerAnnotationLayer, {
105
+ key: target.pageNumber,
106
+ annotations: pageAnnotations,
107
+ pageHeight: target.pageHeight,
108
+ scale: target.scale,
109
+ onAnnotationClick: onAnnotationClick
110
+ }), target.container);
111
+ }))));
112
+ }
113
+ //# sourceMappingURL=PdfViewerContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfViewerContent.js","names":["Error","ErrorIcon","Spin","classnames","React","useEffect","useRef","createPortal","EMPTY_ANNOTATION_ARRAY","EMPTY_ANNOTATIONS","usePdfViewerCore","styles","PdfViewerAnnotationLayer","PdfViewerContent","src","annotations","onAnnotationClick","initialPage","initialScale","onPageChange","onPageChangeProp","onScaleChange","onScaleChangeProp","className","viewer","onPageChangeRef","current","onScaleChangeRef","isInitialMountRef","currentPage","scale","rootClassName","pdfViewer","loading","createElement","loadingContainer","spinnerIcon","error","errorContainer","errorIcon","message","document","scrollContainerWrapper","ref","containerRef","scrollContainer","viewerRef","portalTargets","map","target","pageAnnotations","pageNumber","length","key","pageHeight","container"],"sources":["PdfViewerContent.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 { Error as ErrorIcon, Spin } from \"@blueprintjs/icons\";\nimport classnames from \"classnames\";\nimport \"pdfjs-dist/web/pdf_viewer.css\";\nimport React, { useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { EMPTY_ANNOTATION_ARRAY, EMPTY_ANNOTATIONS } from \"../constants.js\";\nimport { usePdfViewerCore } from \"../hooks/usePdfViewerCore.js\";\nimport styles from \"../PdfViewer.module.css\";\nimport type { PdfAnnotation } from \"../types.js\";\nimport { PdfViewerAnnotationLayer } from \"./PdfViewerAnnotationLayer.js\";\n\nexport interface PdfViewerContentProps {\n /** PDF source — URL string or ArrayBuffer */\n src: string | ArrayBuffer;\n /** Annotations to overlay on the PDF, keyed by page number (1-indexed) */\n annotations?: Record<number, PdfAnnotation[]>;\n /** Callback fired when an annotation is clicked */\n onAnnotationClick?: (annotation: PdfAnnotation) => void;\n /** Initial page number (1-indexed, default 1) */\n initialPage?: number;\n /** Initial zoom scale (default 1.0) */\n initialScale?: number;\n /** Callback fired when the current page changes during scrolling */\n onPageChange?: (page: number) => void;\n /** Callback fired when the zoom scale changes */\n onScaleChange?: (scale: number) => void;\n /** Additional CSS class name for the root element */\n className?: string;\n}\n\nexport function PdfViewerContent({\n src,\n annotations = EMPTY_ANNOTATIONS,\n onAnnotationClick,\n initialPage = 1,\n initialScale = 1.0,\n onPageChange: onPageChangeProp,\n onScaleChange: onScaleChangeProp,\n className,\n}: PdfViewerContentProps): React.ReactElement {\n const viewer = usePdfViewerCore({ src, initialPage, initialScale });\n\n // Use refs for callbacks to avoid firing on initial mount\n const onPageChangeRef = useRef(onPageChangeProp);\n onPageChangeRef.current = onPageChangeProp;\n const onScaleChangeRef = useRef(onScaleChangeProp);\n onScaleChangeRef.current = onScaleChangeProp;\n const isInitialMountRef = useRef(true);\n\n useEffect(function notifyPageChange() {\n if (isInitialMountRef.current) {\n return;\n }\n onPageChangeRef.current?.(viewer.currentPage);\n }, [viewer.currentPage]);\n\n useEffect(function notifyScaleChange() {\n if (isInitialMountRef.current) {\n return;\n }\n onScaleChangeRef.current?.(viewer.scale);\n }, [viewer.scale]);\n\n useEffect(function clearInitialMount() {\n isInitialMountRef.current = false;\n }, []);\n\n const rootClassName = classnames(styles.pdfViewer, className);\n\n if (viewer.loading) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>\n <Spin className={styles.spinnerIcon} />\n Loading…\n </div>\n </div>\n );\n }\n\n if (viewer.error != null) {\n return (\n <div className={rootClassName}>\n <div className={styles.errorContainer}>\n <ErrorIcon className={styles.errorIcon} />\n Failed to load PDF: {viewer.error.message}\n </div>\n </div>\n );\n }\n\n if (viewer.document == null) {\n return (\n <div className={rootClassName}>\n <div className={styles.loadingContainer}>No document</div>\n </div>\n );\n }\n\n return (\n <div className={rootClassName}>\n <div className={styles.scrollContainerWrapper}>\n <div ref={viewer.containerRef} className={styles.scrollContainer}>\n <div ref={viewer.viewerRef} className=\"pdfViewer\" />\n {viewer.portalTargets.map((target) => {\n const pageAnnotations = annotations[target.pageNumber]\n ?? EMPTY_ANNOTATION_ARRAY;\n if (pageAnnotations.length === 0) {\n return null;\n }\n return createPortal(\n <PdfViewerAnnotationLayer\n key={target.pageNumber}\n annotations={pageAnnotations}\n pageHeight={target.pageHeight}\n scale={target.scale}\n onAnnotationClick={onAnnotationClick}\n />,\n target.container,\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,98 @@
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 classnames from "classnames";
18
+ import React, { useCallback, useMemo } from "react";
19
+ import styles from "./PdfViewerOutlineSidebar.module.css.js";
20
+ import { PdfViewerSidebarHeader } from "./PdfViewerSidebarHeader.js";
21
+ const INDENT_PER_DEPTH = 16;
22
+ export function PdfViewerOutlineSidebar({
23
+ outlineItems,
24
+ currentPage,
25
+ onItemClick,
26
+ sidebarMode,
27
+ onSidebarModeChange,
28
+ outlineIcons
29
+ }) {
30
+ const activeIndex = useMemo(() => {
31
+ return computeActiveIndex(outlineItems, currentPage);
32
+ }, [outlineItems, currentPage]);
33
+ if (outlineItems.length === 0) {
34
+ return /*#__PURE__*/React.createElement("div", {
35
+ className: styles.sidebar
36
+ }, /*#__PURE__*/React.createElement(PdfViewerSidebarHeader, {
37
+ sidebarMode: sidebarMode,
38
+ onSidebarModeChange: onSidebarModeChange
39
+ }), /*#__PURE__*/React.createElement("div", {
40
+ className: styles.emptyState
41
+ }, /*#__PURE__*/React.createElement("div", {
42
+ className: styles.emptyStateText
43
+ }, "No outline available")));
44
+ }
45
+ return /*#__PURE__*/React.createElement("div", {
46
+ className: styles.sidebar
47
+ }, /*#__PURE__*/React.createElement(PdfViewerSidebarHeader, {
48
+ sidebarMode: sidebarMode,
49
+ onSidebarModeChange: onSidebarModeChange
50
+ }), /*#__PURE__*/React.createElement("div", {
51
+ className: styles.scrollContainer
52
+ }, outlineItems.map((item, index) => /*#__PURE__*/React.createElement(PdfViewerOutlineItem, {
53
+ key: index,
54
+ item: item,
55
+ isActive: index === activeIndex,
56
+ onClick: onItemClick,
57
+ iconComponent: outlineIcons?.[item.depth]
58
+ }))));
59
+ }
60
+ function PdfViewerOutlineItem({
61
+ item,
62
+ isActive,
63
+ onClick,
64
+ iconComponent: IconComponent
65
+ }) {
66
+ const handleClick = useCallback(() => {
67
+ onClick(item.pageNumber);
68
+ }, [onClick, item.pageNumber]);
69
+ const handleKeyDown = useCallback(e => {
70
+ if (e.key === "Enter" || e.key === " ") {
71
+ e.preventDefault();
72
+ onClick(item.pageNumber);
73
+ }
74
+ }, [onClick, item.pageNumber]);
75
+ const itemClassName = classnames(styles.outlineItem, isActive && styles.outlineItemActive, item.bold && styles.outlineItemBold, item.italic && styles.outlineItemItalic);
76
+ const paddingLeft = INDENT_PER_DEPTH * item.depth + 12;
77
+ return /*#__PURE__*/React.createElement("div", {
78
+ className: itemClassName,
79
+ onClick: handleClick,
80
+ onKeyDown: handleKeyDown,
81
+ role: "button",
82
+ tabIndex: 0,
83
+ "aria-label": item.title,
84
+ "aria-current": isActive ? "location" : undefined,
85
+ style: {
86
+ paddingLeft
87
+ }
88
+ }, IconComponent != null && /*#__PURE__*/React.createElement("span", {
89
+ className: styles.outlineItemIcon
90
+ }, /*#__PURE__*/React.createElement(IconComponent, null)), /*#__PURE__*/React.createElement("span", {
91
+ className: styles.outlineItemTitle
92
+ }, item.title));
93
+ }
94
+ function computeActiveIndex(items, currentPage) {
95
+ const idx = items.findIndex(item => item.pageNumber > currentPage);
96
+ return idx === -1 ? items.length - 1 : idx - 1;
97
+ }
98
+ //# sourceMappingURL=PdfViewerOutlineSidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PdfViewerOutlineSidebar.js","names":["classnames","React","useCallback","useMemo","styles","PdfViewerSidebarHeader","INDENT_PER_DEPTH","PdfViewerOutlineSidebar","outlineItems","currentPage","onItemClick","sidebarMode","onSidebarModeChange","outlineIcons","activeIndex","computeActiveIndex","length","createElement","className","sidebar","emptyState","emptyStateText","scrollContainer","map","item","index","PdfViewerOutlineItem","key","isActive","onClick","iconComponent","depth","IconComponent","handleClick","pageNumber","handleKeyDown","e","preventDefault","itemClassName","outlineItem","outlineItemActive","bold","outlineItemBold","italic","outlineItemItalic","paddingLeft","onKeyDown","role","tabIndex","title","undefined","style","outlineItemIcon","outlineItemTitle","items","idx","findIndex"],"sources":["PdfViewerOutlineSidebar.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, { useCallback, useMemo } from \"react\";\nimport type { OutlineItem, SidebarMode } from \"../types.js\";\nimport styles from \"./PdfViewerOutlineSidebar.module.css\";\nimport { PdfViewerSidebarHeader } from \"./PdfViewerSidebarHeader.js\";\n\nconst INDENT_PER_DEPTH = 16;\n\nexport interface PdfViewerOutlineSidebarProps {\n outlineItems: OutlineItem[];\n currentPage: number;\n onItemClick: (pageNumber: number) => void;\n sidebarMode: SidebarMode;\n onSidebarModeChange: (mode: SidebarMode) => void;\n outlineIcons?: Partial<Record<number, React.ComponentType>>;\n}\n\nexport function PdfViewerOutlineSidebar({\n outlineItems,\n currentPage,\n onItemClick,\n sidebarMode,\n onSidebarModeChange,\n outlineIcons,\n}: PdfViewerOutlineSidebarProps): React.ReactElement {\n const activeIndex = useMemo(() => {\n return computeActiveIndex(outlineItems, currentPage);\n }, [outlineItems, currentPage]);\n\n if (outlineItems.length === 0) {\n return (\n <div className={styles.sidebar}>\n <PdfViewerSidebarHeader\n sidebarMode={sidebarMode}\n onSidebarModeChange={onSidebarModeChange}\n />\n <div className={styles.emptyState}>\n <div className={styles.emptyStateText}>\n No outline available\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={styles.sidebar}>\n <PdfViewerSidebarHeader\n sidebarMode={sidebarMode}\n onSidebarModeChange={onSidebarModeChange}\n />\n <div className={styles.scrollContainer}>\n {outlineItems.map((item, index) => (\n <PdfViewerOutlineItem\n key={index}\n item={item}\n isActive={index === activeIndex}\n onClick={onItemClick}\n iconComponent={outlineIcons?.[item.depth]}\n />\n ))}\n </div>\n </div>\n );\n}\n\ninterface PdfViewerOutlineItemProps {\n item: OutlineItem;\n isActive: boolean;\n onClick: (pageNumber: number) => void;\n iconComponent: React.ComponentType | undefined;\n}\n\nfunction PdfViewerOutlineItem({\n item,\n isActive,\n onClick,\n iconComponent: IconComponent,\n}: PdfViewerOutlineItemProps): React.ReactElement {\n const handleClick = useCallback(() => {\n onClick(item.pageNumber);\n }, [onClick, item.pageNumber]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick(item.pageNumber);\n }\n },\n [onClick, item.pageNumber],\n );\n\n const itemClassName = classnames(\n styles.outlineItem,\n isActive && styles.outlineItemActive,\n item.bold && styles.outlineItemBold,\n item.italic && styles.outlineItemItalic,\n );\n\n const paddingLeft = INDENT_PER_DEPTH * item.depth + 12;\n\n return (\n <div\n className={itemClassName}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={item.title}\n aria-current={isActive ? \"location\" : undefined}\n style={{ paddingLeft }}\n >\n {IconComponent != null && (\n <span className={styles.outlineItemIcon}>\n <IconComponent />\n </span>\n )}\n <span className={styles.outlineItemTitle}>{item.title}</span>\n </div>\n );\n}\n\nfunction computeActiveIndex(\n items: OutlineItem[],\n currentPage: number,\n): number {\n const idx = items.findIndex(item => item.pageNumber > currentPage);\n return idx === -1 ? items.length - 1 : idx - 1;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAEnD,OAAOC,MAAM,MAAM,sCAAsC;AACzD,SAASC,sBAAsB,QAAQ,6BAA6B;AAEpE,MAAMC,gBAAgB,GAAG,EAAE;AAW3B,OAAO,SAASC,uBAAuBA,CAAC;EACtCC,YAAY;EACZC,WAAW;EACXC,WAAW;EACXC,WAAW;EACXC,mBAAmB;EACnBC;AAC4B,CAAC,EAAsB;EACnD,MAAMC,WAAW,GAAGX,OAAO,CAAC,MAAM;IAChC,OAAOY,kBAAkB,CAACP,YAAY,EAAEC,WAAW,CAAC;EACtD,CAAC,EAAE,CAACD,YAAY,EAAEC,WAAW,CAAC,CAAC;EAE/B,IAAID,YAAY,CAACQ,MAAM,KAAK,CAAC,EAAE;IAC7B,oBACEf,KAAA,CAAAgB,aAAA;MAAKC,SAAS,EAAEd,MAAM,CAACe;IAAQ,gBAC7BlB,KAAA,CAAAgB,aAAA,CAACZ,sBAAsB;MACrBM,WAAW,EAAEA,WAAY;MACzBC,mBAAmB,EAAEA;IAAoB,CAC1C,CAAC,eACFX,KAAA,CAAAgB,aAAA;MAAKC,SAAS,EAAEd,MAAM,CAACgB;IAAW,gBAChCnB,KAAA,CAAAgB,aAAA;MAAKC,SAAS,EAAEd,MAAM,CAACiB;IAAe,GAAC,sBAElC,CACF,CACF,CAAC;EAEV;EAEA,oBACEpB,KAAA,CAAAgB,aAAA;IAAKC,SAAS,EAAEd,MAAM,CAACe;EAAQ,gBAC7BlB,KAAA,CAAAgB,aAAA,CAACZ,sBAAsB;IACrBM,WAAW,EAAEA,WAAY;IACzBC,mBAAmB,EAAEA;EAAoB,CAC1C,CAAC,eACFX,KAAA,CAAAgB,aAAA;IAAKC,SAAS,EAAEd,MAAM,CAACkB;EAAgB,GACpCd,YAAY,CAACe,GAAG,CAAC,CAACC,IAAI,EAAEC,KAAK,kBAC5BxB,KAAA,CAAAgB,aAAA,CAACS,oBAAoB;IACnBC,GAAG,EAAEF,KAAM;IACXD,IAAI,EAAEA,IAAK;IACXI,QAAQ,EAAEH,KAAK,KAAKX,WAAY;IAChCe,OAAO,EAAEnB,WAAY;IACrBoB,aAAa,EAAEjB,YAAY,GAAGW,IAAI,CAACO,KAAK;EAAE,CAC3C,CACF,CACE,CACF,CAAC;AAEV;AASA,SAASL,oBAAoBA,CAAC;EAC5BF,IAAI;EACJI,QAAQ;EACRC,OAAO;EACPC,aAAa,EAAEE;AACU,CAAC,EAAsB;EAChD,MAAMC,WAAW,GAAG/B,WAAW,CAAC,MAAM;IACpC2B,OAAO,CAACL,IAAI,CAACU,UAAU,CAAC;EAC1B,CAAC,EAAE,CAACL,OAAO,EAAEL,IAAI,CAACU,UAAU,CAAC,CAAC;EAE9B,MAAMC,aAAa,GAAGjC,WAAW,CAC9BkC,CAAsB,IAAK;IAC1B,IAAIA,CAAC,CAACT,GAAG,KAAK,OAAO,IAAIS,CAAC,CAACT,GAAG,KAAK,GAAG,EAAE;MACtCS,CAAC,CAACC,cAAc,CAAC,CAAC;MAClBR,OAAO,CAACL,IAAI,CAACU,UAAU,CAAC;IAC1B;EACF,CAAC,EACD,CAACL,OAAO,EAAEL,IAAI,CAACU,UAAU,CAC3B,CAAC;EAED,MAAMI,aAAa,GAAGtC,UAAU,CAC9BI,MAAM,CAACmC,WAAW,EAClBX,QAAQ,IAAIxB,MAAM,CAACoC,iBAAiB,EACpChB,IAAI,CAACiB,IAAI,IAAIrC,MAAM,CAACsC,eAAe,EACnClB,IAAI,CAACmB,MAAM,IAAIvC,MAAM,CAACwC,iBACxB,CAAC;EAED,MAAMC,WAAW,GAAGvC,gBAAgB,GAAGkB,IAAI,CAACO,KAAK,GAAG,EAAE;EAEtD,oBACE9B,KAAA,CAAAgB,aAAA;IACEC,SAAS,EAAEoB,aAAc;IACzBT,OAAO,EAAEI,WAAY;IACrBa,SAAS,EAAEX,aAAc;IACzBY,IAAI,EAAC,QAAQ;IACbC,QAAQ,EAAE,CAAE;IACZ,cAAYxB,IAAI,CAACyB,KAAM;IACvB,gBAAcrB,QAAQ,GAAG,UAAU,GAAGsB,SAAU;IAChDC,KAAK,EAAE;MAAEN;IAAY;EAAE,GAEtBb,aAAa,IAAI,IAAI,iBACpB/B,KAAA,CAAAgB,aAAA;IAAMC,SAAS,EAAEd,MAAM,CAACgD;EAAgB,gBACtCnD,KAAA,CAAAgB,aAAA,CAACe,aAAa,MAAE,CACZ,CACP,eACD/B,KAAA,CAAAgB,aAAA;IAAMC,SAAS,EAAEd,MAAM,CAACiD;EAAiB,GAAE7B,IAAI,CAACyB,KAAY,CACzD,CAAC;AAEV;AAEA,SAASlC,kBAAkBA,CACzBuC,KAAoB,EACpB7C,WAAmB,EACX;EACR,MAAM8C,GAAG,GAAGD,KAAK,CAACE,SAAS,CAAChC,IAAI,IAAIA,IAAI,CAACU,UAAU,GAAGzB,WAAW,CAAC;EAClE,OAAO8C,GAAG,KAAK,CAAC,CAAC,GAAGD,KAAK,CAACtC,MAAM,GAAG,CAAC,GAAGuC,GAAG,GAAG,CAAC;AAChD","ignoreList":[]}