@osdk/react-components 0.2.0-beta.22 → 0.2.0-beta.24
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.
- package/CHANGELOG.md +28 -0
- package/README.md +22 -6
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/fields/DateCalendar.js +70 -0
- package/build/browser/action-form/fields/DateCalendar.js.map +1 -0
- package/build/browser/action-form/fields/DateCalendar.module.css +136 -0
- package/build/browser/action-form/fields/DateCalendar.module.css.js +22 -0
- package/build/browser/action-form/fields/DatetimePickerField.js +98 -0
- package/build/browser/action-form/fields/DatetimePickerField.js.map +1 -0
- package/build/browser/action-form/fields/DatetimePickerField.module.css +66 -0
- package/build/browser/action-form/fields/DatetimePickerField.module.css.js +10 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js +10 -1
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/LazyDateCalendar.js +27 -0
- package/build/browser/action-form/fields/LazyDateCalendar.js.map +1 -0
- package/build/browser/filter-list/FilterList.js +9 -5
- package/build/browser/filter-list/FilterList.js.map +1 -1
- package/build/browser/filter-list/FilterListApi.js.map +1 -1
- package/build/browser/filter-list/base/BaseFilterList.js +3 -1
- package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
- package/build/browser/filter-list/base/BaseFilterListApi.js.map +1 -1
- package/build/browser/filter-list/base/FilterListHeader.js +3 -2
- package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
- package/build/browser/filter-list/base/inputs/DateRangeInput.js +1 -1
- package/build/browser/filter-list/base/inputs/DateRangeInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/MultiDateInput.js +1 -1
- package/build/browser/filter-list/base/inputs/MultiDateInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/SingleDateInput.js +1 -1
- package/build/browser/filter-list/base/inputs/SingleDateInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TimelineInput.js +1 -1
- package/build/browser/filter-list/base/inputs/TimelineInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/index.js +1 -1
- package/build/browser/filter-list/base/inputs/index.js.map +1 -1
- package/build/browser/filter-list/hooks/useFilterListState.js +3 -0
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/hooks/useFilterVisibility.js +7 -1
- package/build/browser/filter-list/hooks/useFilterVisibility.js.map +1 -1
- package/build/browser/filter-list/utils/filterStateToWhereClause.js +1 -1
- package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/browser/object-table/LoadingCell.js +2 -1
- package/build/browser/object-table/LoadingCell.js.map +1 -1
- package/build/browser/object-table/LoadingCell.module.css +3 -20
- package/build/browser/object-table/LoadingCell.module.css.js +1 -2
- package/build/browser/object-table/LoadingStateTable.js +2 -1
- package/build/browser/object-table/LoadingStateTable.js.map +1 -1
- package/build/browser/pdf-viewer/PdfRenderer.js +1 -1
- package/build/browser/pdf-viewer/PdfRenderer.js.map +1 -1
- package/build/browser/pdf-viewer/PdfViewer.js +59 -118
- package/build/browser/pdf-viewer/PdfViewer.js.map +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.js.map +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerAnnotationLayer.module.css.js +11 -0
- package/build/browser/pdf-viewer/components/PdfViewerContent.js +113 -0
- package/build/browser/pdf-viewer/components/PdfViewerContent.js.map +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.js +98 -0
- package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.js.map +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.module.css +89 -0
- package/build/browser/pdf-viewer/components/PdfViewerOutlineSidebar.module.css.js +15 -0
- package/build/browser/pdf-viewer/components/PdfViewerSearchBar.js.map +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerSearchBar.module.css.js +10 -0
- package/build/browser/pdf-viewer/{PdfViewerSidebar.js → components/PdfViewerSidebar.js} +9 -5
- package/build/browser/pdf-viewer/components/PdfViewerSidebar.js.map +1 -0
- package/build/{esm/pdf-viewer → browser/pdf-viewer/components}/PdfViewerSidebar.module.css +0 -9
- package/build/browser/pdf-viewer/{PdfViewerSidebar.module.css.js → components/PdfViewerSidebar.module.css.js} +5 -6
- package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.js +54 -0
- package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.js.map +1 -0
- package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.module.css +70 -0
- package/build/browser/pdf-viewer/components/PdfViewerSidebarHeader.module.css.js +8 -0
- package/build/browser/pdf-viewer/{PdfViewerThumbnail.js → components/PdfViewerThumbnail.js} +1 -1
- package/build/browser/pdf-viewer/components/PdfViewerThumbnail.js.map +1 -0
- package/build/browser/pdf-viewer/{PdfViewerThumbnail.module.css.js → components/PdfViewerThumbnail.module.css.js} +3 -3
- package/build/browser/pdf-viewer/{PdfViewerToolbar.js → components/PdfViewerToolbar.js} +39 -12
- package/build/browser/pdf-viewer/components/PdfViewerToolbar.js.map +1 -0
- package/build/browser/pdf-viewer/{PdfViewerToolbar.module.css → components/PdfViewerToolbar.module.css} +2 -2
- package/build/browser/pdf-viewer/components/PdfViewerToolbar.module.css.js +12 -0
- package/build/browser/pdf-viewer/constants.js +7 -5
- package/build/browser/pdf-viewer/constants.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfDocument.js +2 -3
- package/build/browser/pdf-viewer/hooks/usePdfDocument.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfOutline.js +268 -0
- package/build/browser/pdf-viewer/hooks/usePdfOutline.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewer.js +12 -1
- package/build/browser/pdf-viewer/hooks/usePdfViewer.js.map +1 -1
- package/build/browser/pdf-viewer/hooks/usePdfViewerCore.js +80 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerCore.js.map +1 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerState.js +135 -0
- package/build/browser/pdf-viewer/hooks/usePdfViewerState.js.map +1 -0
- package/build/browser/pdf-viewer/types.js.map +1 -1
- package/build/browser/public/experimental.js +21 -2
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/public/primitives.js +20 -0
- package/build/browser/public/primitives.js.map +1 -0
- package/build/browser/{filter-list/base/inputs → shared}/dateUtils.js +38 -2
- package/build/browser/shared/dateUtils.js.map +1 -0
- package/build/browser/styles.css +421 -74
- package/build/cjs/DateCalendar-QWGFKD6J.css +113 -0
- package/build/cjs/DateCalendar-QWGFKD6J.css.map +1 -0
- package/build/cjs/DateCalendar-R44GMN3O.cjs +67 -0
- package/build/cjs/DateCalendar-R44GMN3O.cjs.map +1 -0
- package/build/cjs/chunk-GT6IV6LV.cjs +163 -0
- package/build/cjs/chunk-GT6IV6LV.cjs.map +1 -0
- package/build/cjs/chunk-HMQTYQEX.cjs +9 -0
- package/build/cjs/chunk-HMQTYQEX.cjs.map +1 -0
- package/build/cjs/chunk-UZ2E5NRX.cjs +8 -0
- package/build/cjs/chunk-UZ2E5NRX.cjs.map +1 -0
- package/build/cjs/index.cjs +2 -0
- package/build/cjs/public/experimental.cjs +2157 -1592
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +388 -116
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +273 -14
- package/build/cjs/public/primitives.cjs +25 -0
- package/build/cjs/public/primitives.cjs.map +1 -0
- package/build/cjs/public/primitives.css +154 -0
- package/build/cjs/public/primitives.css.map +1 -0
- package/build/cjs/public/primitives.d.cts +49 -0
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/fields/DateCalendar.js +70 -0
- package/build/esm/action-form/fields/DateCalendar.js.map +1 -0
- package/build/esm/action-form/fields/DateCalendar.module.css +136 -0
- package/build/esm/action-form/fields/DatetimePickerField.js +98 -0
- package/build/esm/action-form/fields/DatetimePickerField.js.map +1 -0
- package/build/esm/action-form/fields/DatetimePickerField.module.css +66 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js +10 -1
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/LazyDateCalendar.js +27 -0
- package/build/esm/action-form/fields/LazyDateCalendar.js.map +1 -0
- package/build/esm/filter-list/FilterList.js +9 -5
- package/build/esm/filter-list/FilterList.js.map +1 -1
- package/build/esm/filter-list/FilterListApi.js.map +1 -1
- package/build/esm/filter-list/base/BaseFilterList.js +3 -1
- package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
- package/build/esm/filter-list/base/BaseFilterListApi.js.map +1 -1
- package/build/esm/filter-list/base/FilterListHeader.js +3 -2
- package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
- package/build/esm/filter-list/base/inputs/DateRangeInput.js +1 -1
- package/build/esm/filter-list/base/inputs/DateRangeInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/MultiDateInput.js +1 -1
- package/build/esm/filter-list/base/inputs/MultiDateInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/SingleDateInput.js +1 -1
- package/build/esm/filter-list/base/inputs/SingleDateInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TimelineInput.js +1 -1
- package/build/esm/filter-list/base/inputs/TimelineInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/index.js +1 -1
- package/build/esm/filter-list/base/inputs/index.js.map +1 -1
- package/build/esm/filter-list/hooks/useFilterListState.js +3 -0
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/hooks/useFilterVisibility.js +7 -1
- package/build/esm/filter-list/hooks/useFilterVisibility.js.map +1 -1
- package/build/esm/filter-list/utils/filterStateToWhereClause.js +1 -1
- package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
- package/build/esm/object-table/LoadingCell.js +2 -1
- package/build/esm/object-table/LoadingCell.js.map +1 -1
- package/build/esm/object-table/LoadingCell.module.css +3 -20
- package/build/esm/object-table/LoadingStateTable.js +2 -1
- package/build/esm/object-table/LoadingStateTable.js.map +1 -1
- package/build/esm/pdf-viewer/PdfRenderer.js +1 -1
- package/build/esm/pdf-viewer/PdfRenderer.js.map +1 -1
- package/build/esm/pdf-viewer/PdfViewer.js +59 -118
- package/build/esm/pdf-viewer/PdfViewer.js.map +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerAnnotationLayer.js.map +1 -0
- package/build/esm/pdf-viewer/components/PdfViewerContent.js +113 -0
- package/build/esm/pdf-viewer/components/PdfViewerContent.js.map +1 -0
- package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.js +98 -0
- package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.js.map +1 -0
- package/build/esm/pdf-viewer/components/PdfViewerOutlineSidebar.module.css +89 -0
- package/build/esm/pdf-viewer/components/PdfViewerSearchBar.js.map +1 -0
- package/build/esm/pdf-viewer/{PdfViewerSidebar.js → components/PdfViewerSidebar.js} +9 -5
- package/build/esm/pdf-viewer/components/PdfViewerSidebar.js.map +1 -0
- package/build/{browser/pdf-viewer → esm/pdf-viewer/components}/PdfViewerSidebar.module.css +0 -9
- package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.js +54 -0
- package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.js.map +1 -0
- package/build/esm/pdf-viewer/components/PdfViewerSidebarHeader.module.css +70 -0
- package/build/esm/pdf-viewer/{PdfViewerThumbnail.js → components/PdfViewerThumbnail.js} +1 -1
- package/build/esm/pdf-viewer/components/PdfViewerThumbnail.js.map +1 -0
- package/build/esm/pdf-viewer/{PdfViewerToolbar.js → components/PdfViewerToolbar.js} +39 -12
- package/build/esm/pdf-viewer/components/PdfViewerToolbar.js.map +1 -0
- package/build/esm/pdf-viewer/{PdfViewerToolbar.module.css → components/PdfViewerToolbar.module.css} +2 -2
- package/build/esm/pdf-viewer/constants.js +7 -5
- package/build/esm/pdf-viewer/constants.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfDocument.js +2 -3
- package/build/esm/pdf-viewer/hooks/usePdfDocument.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfOutline.js +268 -0
- package/build/esm/pdf-viewer/hooks/usePdfOutline.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewer.js +12 -1
- package/build/esm/pdf-viewer/hooks/usePdfViewer.js.map +1 -1
- package/build/esm/pdf-viewer/hooks/usePdfViewerCore.js +80 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerCore.js.map +1 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerState.js +135 -0
- package/build/esm/pdf-viewer/hooks/usePdfViewerState.js.map +1 -0
- package/build/esm/pdf-viewer/types.js.map +1 -1
- package/build/esm/public/experimental.js +21 -2
- package/build/esm/public/experimental.js.map +1 -1
- package/build/esm/public/primitives.js +20 -0
- package/build/esm/public/primitives.js.map +1 -0
- package/build/esm/{filter-list/base/inputs → shared}/dateUtils.js +38 -2
- package/build/esm/shared/dateUtils.js.map +1 -0
- package/build/types/action-form/FormFieldApi.d.ts +21 -7
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/DateCalendar.d.ts +9 -0
- package/build/types/action-form/fields/DateCalendar.d.ts.map +1 -0
- package/build/types/action-form/fields/DatetimePickerField.d.ts +3 -0
- package/build/types/action-form/fields/DatetimePickerField.d.ts.map +1 -0
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
- package/build/types/action-form/fields/LazyDateCalendar.d.ts +3 -0
- package/build/types/action-form/fields/LazyDateCalendar.d.ts.map +1 -0
- package/build/types/filter-list/FilterListApi.d.ts +2 -1
- package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/BaseFilterListApi.d.ts +2 -1
- package/build/types/filter-list/base/BaseFilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListHeader.d.ts +3 -2
- package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/DateRangeInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/SingleDateInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/index.d.ts +1 -1
- package/build/types/filter-list/base/inputs/index.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterVisibility.d.ts +2 -0
- package/build/types/filter-list/hooks/useFilterVisibility.d.ts.map +1 -1
- package/build/types/object-table/LoadingCell.d.ts.map +1 -1
- package/build/types/object-table/LoadingStateTable.d.ts.map +1 -1
- package/build/types/pdf-viewer/PdfRenderer.d.ts +2 -2
- package/build/types/pdf-viewer/PdfRenderer.d.ts.map +1 -1
- package/build/types/pdf-viewer/PdfViewer.d.ts +1 -1
- package/build/types/pdf-viewer/PdfViewer.d.ts.map +1 -1
- package/build/types/pdf-viewer/{PdfViewerAnnotationLayer.d.ts → components/PdfViewerAnnotationLayer.d.ts} +2 -3
- package/build/types/pdf-viewer/components/PdfViewerAnnotationLayer.d.ts.map +1 -0
- package/build/types/pdf-viewer/components/PdfViewerContent.d.ts +22 -0
- package/build/types/pdf-viewer/components/PdfViewerContent.d.ts.map +1 -0
- package/build/types/pdf-viewer/components/PdfViewerOutlineSidebar.d.ts +11 -0
- package/build/types/pdf-viewer/components/PdfViewerOutlineSidebar.d.ts.map +1 -0
- package/build/types/pdf-viewer/{PdfViewerSearchBar.d.ts → components/PdfViewerSearchBar.d.ts} +1 -2
- package/build/types/pdf-viewer/components/PdfViewerSearchBar.d.ts.map +1 -0
- package/build/types/pdf-viewer/components/PdfViewerSidebar.d.ts +12 -0
- package/build/types/pdf-viewer/components/PdfViewerSidebar.d.ts.map +1 -0
- package/build/types/pdf-viewer/components/PdfViewerSidebarHeader.d.ts +7 -0
- package/build/types/pdf-viewer/components/PdfViewerSidebarHeader.d.ts.map +1 -0
- package/build/types/pdf-viewer/{PdfViewerThumbnail.d.ts.map → components/PdfViewerThumbnail.d.ts.map} +1 -1
- package/build/types/pdf-viewer/{PdfViewerToolbar.d.ts → components/PdfViewerToolbar.d.ts} +5 -3
- package/build/types/pdf-viewer/components/PdfViewerToolbar.d.ts.map +1 -0
- package/build/types/pdf-viewer/constants.d.ts +5 -0
- package/build/types/pdf-viewer/constants.d.ts.map +1 -1
- package/build/types/pdf-viewer/hooks/usePdfDocument.d.ts.map +1 -1
- package/build/types/pdf-viewer/hooks/usePdfOutline.d.ts +3 -0
- package/build/types/pdf-viewer/hooks/usePdfOutline.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts +1 -1
- package/build/types/pdf-viewer/hooks/usePdfViewer.d.ts.map +1 -1
- package/build/types/pdf-viewer/hooks/usePdfViewerCore.d.ts +43 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerCore.d.ts.map +1 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerState.d.ts +39 -0
- package/build/types/pdf-viewer/hooks/usePdfViewerState.d.ts.map +1 -0
- package/build/types/pdf-viewer/types.d.ts +42 -0
- package/build/types/pdf-viewer/types.d.ts.map +1 -1
- package/build/types/public/experimental.d.ts +17 -2
- package/build/types/public/experimental.d.ts.map +1 -1
- package/build/types/public/primitives.d.ts +3 -0
- package/build/types/public/primitives.d.ts.map +1 -0
- package/build/types/shared/dateUtils.d.ts +31 -0
- package/build/types/shared/dateUtils.d.ts.map +1 -0
- package/package.json +14 -4
- package/primitives.d.ts +17 -0
- package/build/browser/filter-list/base/inputs/dateUtils.js.map +0 -1
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.js.map +0 -1
- package/build/browser/pdf-viewer/PdfViewerAnnotationLayer.module.css.js +0 -11
- package/build/browser/pdf-viewer/PdfViewerSearchBar.js.map +0 -1
- package/build/browser/pdf-viewer/PdfViewerSearchBar.module.css.js +0 -10
- package/build/browser/pdf-viewer/PdfViewerSidebar.js.map +0 -1
- package/build/browser/pdf-viewer/PdfViewerThumbnail.js.map +0 -1
- package/build/browser/pdf-viewer/PdfViewerToolbar.js.map +0 -1
- package/build/browser/pdf-viewer/PdfViewerToolbar.module.css.js +0 -12
- package/build/esm/filter-list/base/inputs/dateUtils.js.map +0 -1
- package/build/esm/pdf-viewer/PdfViewerAnnotationLayer.js.map +0 -1
- package/build/esm/pdf-viewer/PdfViewerSearchBar.js.map +0 -1
- package/build/esm/pdf-viewer/PdfViewerSidebar.js.map +0 -1
- package/build/esm/pdf-viewer/PdfViewerThumbnail.js.map +0 -1
- package/build/esm/pdf-viewer/PdfViewerToolbar.js.map +0 -1
- package/build/types/filter-list/base/inputs/dateUtils.d.ts +0 -17
- package/build/types/filter-list/base/inputs/dateUtils.d.ts.map +0 -1
- package/build/types/pdf-viewer/PdfViewerAnnotationLayer.d.ts.map +0 -1
- package/build/types/pdf-viewer/PdfViewerSearchBar.d.ts.map +0 -1
- package/build/types/pdf-viewer/PdfViewerSidebar.d.ts +0 -10
- package/build/types/pdf-viewer/PdfViewerSidebar.d.ts.map +0 -1
- package/build/types/pdf-viewer/PdfViewerToolbar.d.ts.map +0 -1
- /package/build/browser/pdf-viewer/{PdfViewerAnnotationLayer.js → components/PdfViewerAnnotationLayer.js} +0 -0
- /package/build/browser/pdf-viewer/{PdfViewerAnnotationLayer.module.css → components/PdfViewerAnnotationLayer.module.css} +0 -0
- /package/build/browser/pdf-viewer/{PdfViewerSearchBar.js → components/PdfViewerSearchBar.js} +0 -0
- /package/build/browser/pdf-viewer/{PdfViewerSearchBar.module.css → components/PdfViewerSearchBar.module.css} +0 -0
- /package/build/browser/pdf-viewer/{PdfViewerThumbnail.module.css → components/PdfViewerThumbnail.module.css} +0 -0
- /package/build/esm/pdf-viewer/{PdfViewerAnnotationLayer.js → components/PdfViewerAnnotationLayer.js} +0 -0
- /package/build/esm/pdf-viewer/{PdfViewerAnnotationLayer.module.css → components/PdfViewerAnnotationLayer.module.css} +0 -0
- /package/build/esm/pdf-viewer/{PdfViewerSearchBar.js → components/PdfViewerSearchBar.js} +0 -0
- /package/build/esm/pdf-viewer/{PdfViewerSearchBar.module.css → components/PdfViewerSearchBar.module.css} +0 -0
- /package/build/esm/pdf-viewer/{PdfViewerThumbnail.module.css → components/PdfViewerThumbnail.module.css} +0 -0
- /package/build/types/pdf-viewer/{PdfViewerThumbnail.d.ts → components/PdfViewerThumbnail.d.ts} +0 -0
|
@@ -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";
|
|
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";
|
|
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":"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","ignoreList":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
.sidebar {
|
|
2
|
+
width: var(--osdk-pdf-viewer-sidebar-width);
|
|
3
|
+
flex-shrink: 0;
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
background-color: var(--osdk-pdf-viewer-sidebar-bg);
|
|
7
|
+
border-right: 1px solid var(--osdk-pdf-viewer-sidebar-border);
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
.scrollContainer {
|
|
13
|
+
flex: 1;
|
|
14
|
+
overflow-y: auto;
|
|
15
|
+
padding: var(--osdk-pdf-viewer-sidebar-thumbnail-gap) 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.outlineItem {
|
|
19
|
+
display: flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
gap: var(--osdk-pdf-viewer-outline-item-gap, 6px);
|
|
22
|
+
padding: var(--osdk-pdf-viewer-outline-item-padding-y, 4px)
|
|
23
|
+
var(--osdk-pdf-viewer-outline-item-padding-x, 12px);
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
font-family: var(--osdk-typography-family-default);
|
|
26
|
+
font-size: var(--osdk-typography-size-body-small);
|
|
27
|
+
color: var(--osdk-typography-color-default);
|
|
28
|
+
text-decoration: none;
|
|
29
|
+
border: none;
|
|
30
|
+
background: none;
|
|
31
|
+
text-align: left;
|
|
32
|
+
width: 100%;
|
|
33
|
+
line-height: 1.4;
|
|
34
|
+
border-radius: var(--osdk-pdf-viewer-outline-item-radius, 4px);
|
|
35
|
+
transition: background-color 0.15s ease;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.outlineItem:hover {
|
|
39
|
+
background-color: var(--osdk-pdf-viewer-outline-item-hover-bg, rgba(0, 0, 0, 0.06));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.outlineItem:focus-visible {
|
|
43
|
+
outline: var(--osdk-focus-outline);
|
|
44
|
+
outline-offset: var(--osdk-focus-visible-outline-offset);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.outlineItemActive {
|
|
48
|
+
background-color: var(--osdk-pdf-viewer-outline-item-active-bg, rgba(45, 114, 210, 0.1));
|
|
49
|
+
color: var(--osdk-pdf-viewer-outline-item-active-color, var(--osdk-intent-primary));
|
|
50
|
+
font-weight: var(--osdk-typography-weight-semibold);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.outlineItemBold {
|
|
54
|
+
font-weight: var(--osdk-typography-weight-bold);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.outlineItemItalic {
|
|
58
|
+
font-style: italic;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.outlineItemIcon {
|
|
62
|
+
flex-shrink: 0;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.outlineItemTitle {
|
|
68
|
+
overflow: hidden;
|
|
69
|
+
text-overflow: ellipsis;
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.emptyState {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-direction: column;
|
|
76
|
+
align-items: center;
|
|
77
|
+
justify-content: center;
|
|
78
|
+
gap: var(--osdk-pdf-viewer-outline-empty-gap, 12px);
|
|
79
|
+
padding: var(--osdk-pdf-viewer-outline-empty-padding, 24px);
|
|
80
|
+
flex: 1;
|
|
81
|
+
text-align: center;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.emptyStateText {
|
|
85
|
+
font-family: var(--osdk-typography-family-default);
|
|
86
|
+
font-size: var(--osdk-typography-size-body-small);
|
|
87
|
+
color: var(--osdk-typography-color-muted);
|
|
88
|
+
}
|
|
89
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfViewerSearchBar.js","names":["ChevronDown","ChevronUp","Cross","React","useCallback","styles","PdfViewerSearchBar","query","totalMatches","currentMatchIndex","onQueryChange","onNext","onPrev","onClose","handleInputChange","e","target","value","handleKeyDown","key","preventDefault","shiftKey","matchDisplay","length","createElement","className","searchBar","autoFocus","searchInput","type","onChange","onKeyDown","placeholder","matchCount","navButton","onClick","disabled","size","closeButton"],"sources":["PdfViewerSearchBar.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 { ChevronDown, ChevronUp, Cross } from \"@blueprintjs/icons\";\nimport React, { useCallback } from \"react\";\nimport styles from \"./PdfViewerSearchBar.module.css\";\n\nexport interface PdfViewerSearchBarProps {\n query: string;\n totalMatches: number;\n currentMatchIndex: number;\n onQueryChange: (query: string) => void;\n onNext: () => void;\n onPrev: () => void;\n onClose: () => void;\n}\n\nexport function PdfViewerSearchBar({\n query,\n totalMatches,\n currentMatchIndex,\n onQueryChange,\n onNext,\n onPrev,\n onClose,\n}: PdfViewerSearchBarProps): React.ReactElement {\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onQueryChange(e.target.value);\n },\n [onQueryChange],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (e.shiftKey) {\n onPrev();\n } else {\n onNext();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onClose();\n }\n },\n [onNext, onPrev, onClose],\n );\n\n const matchDisplay = totalMatches > 0\n ? `${currentMatchIndex + 1} of ${totalMatches}`\n : query.length > 0\n ? \"No results\"\n : \"\";\n\n return (\n <div className={styles.searchBar}>\n <input\n autoFocus\n className={styles.searchInput}\n type=\"text\"\n value={query}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Find in document...\"\n aria-label=\"Search in PDF\"\n />\n {matchDisplay.length > 0 && (\n <span className={styles.matchCount}>{matchDisplay}</span>\n )}\n <button\n className={styles.navButton}\n onClick={onPrev}\n disabled={totalMatches === 0}\n aria-label=\"Previous match\"\n type=\"button\"\n >\n <ChevronUp size={16} />\n </button>\n <button\n className={styles.navButton}\n onClick={onNext}\n disabled={totalMatches === 0}\n aria-label=\"Next match\"\n type=\"button\"\n >\n <ChevronDown size={16} />\n </button>\n <button\n className={styles.closeButton}\n onClick={onClose}\n aria-label=\"Close search\"\n type=\"button\"\n >\n <Cross size={16} />\n </button>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,14 +16,17 @@
|
|
|
16
16
|
|
|
17
17
|
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
18
18
|
import React, { useEffect, useRef } from "react";
|
|
19
|
-
import { DEFAULT_PAGE_HEIGHT, THUMBNAIL_GAP, THUMBNAIL_SCALE } from "
|
|
19
|
+
import { DEFAULT_PAGE_HEIGHT, THUMBNAIL_GAP, THUMBNAIL_SCALE } from "../constants.js";
|
|
20
20
|
import styles from "./PdfViewerSidebar.module.css";
|
|
21
|
+
import { PdfViewerSidebarHeader } from "./PdfViewerSidebarHeader.js";
|
|
21
22
|
import { PdfViewerThumbnail } from "./PdfViewerThumbnail.js";
|
|
22
23
|
export function PdfViewerSidebar({
|
|
23
24
|
document,
|
|
24
25
|
numPages,
|
|
25
26
|
currentPage,
|
|
26
|
-
onPageClick
|
|
27
|
+
onPageClick,
|
|
28
|
+
sidebarMode,
|
|
29
|
+
onSidebarModeChange
|
|
27
30
|
}) {
|
|
28
31
|
const scrollContainerRef = useRef(null);
|
|
29
32
|
const estimatedItemHeight = Math.floor(DEFAULT_PAGE_HEIGHT * THUMBNAIL_SCALE) + THUMBNAIL_GAP + 20;
|
|
@@ -42,9 +45,10 @@ export function PdfViewerSidebar({
|
|
|
42
45
|
}, [currentPage, virtualizer]);
|
|
43
46
|
return /*#__PURE__*/React.createElement("div", {
|
|
44
47
|
className: styles.sidebar
|
|
45
|
-
}, /*#__PURE__*/React.createElement(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
}, /*#__PURE__*/React.createElement(PdfViewerSidebarHeader, {
|
|
49
|
+
sidebarMode: sidebarMode,
|
|
50
|
+
onSidebarModeChange: onSidebarModeChange
|
|
51
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
48
52
|
ref: scrollContainerRef,
|
|
49
53
|
className: styles.scrollContainer
|
|
50
54
|
}, /*#__PURE__*/React.createElement("div", {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfViewerSidebar.js","names":["useVirtualizer","React","useEffect","useRef","DEFAULT_PAGE_HEIGHT","THUMBNAIL_GAP","THUMBNAIL_SCALE","styles","PdfViewerSidebarHeader","PdfViewerThumbnail","PdfViewerSidebar","document","numPages","currentPage","onPageClick","sidebarMode","onSidebarModeChange","scrollContainerRef","estimatedItemHeight","Math","floor","virtualizer","count","getScrollElement","current","estimateSize","overscan","scrollToIndex","align","createElement","className","sidebar","ref","scrollContainer","thumbnailsContainer","style","height","getTotalSize","getVirtualItems","map","virtualItem","pageNumber","index","key","thumbnailWrapper","top","start","size","isActive","onClick"],"sources":["PdfViewerSidebar.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 { useVirtualizer } from \"@tanstack/react-virtual\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport React, { useEffect, useRef } from \"react\";\nimport {\n DEFAULT_PAGE_HEIGHT,\n THUMBNAIL_GAP,\n THUMBNAIL_SCALE,\n} from \"../constants.js\";\nimport type { SidebarMode } from \"../types.js\";\nimport styles from \"./PdfViewerSidebar.module.css\";\nimport { PdfViewerSidebarHeader } from \"./PdfViewerSidebarHeader.js\";\nimport { PdfViewerThumbnail } from \"./PdfViewerThumbnail.js\";\n\nexport interface PdfViewerSidebarProps {\n document: PDFDocumentProxy;\n numPages: number;\n currentPage: number;\n onPageClick: (page: number) => void;\n sidebarMode: SidebarMode;\n onSidebarModeChange: (mode: SidebarMode) => void;\n}\n\nexport function PdfViewerSidebar({\n document,\n numPages,\n currentPage,\n onPageClick,\n sidebarMode,\n onSidebarModeChange,\n}: PdfViewerSidebarProps): React.ReactElement {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const estimatedItemHeight = Math.floor(DEFAULT_PAGE_HEIGHT * THUMBNAIL_SCALE)\n + THUMBNAIL_GAP + 20;\n\n const virtualizer = useVirtualizer({\n count: numPages,\n getScrollElement: () => scrollContainerRef.current,\n estimateSize: () => estimatedItemHeight,\n overscan: 2,\n });\n\n // Auto-scroll to keep the active thumbnail visible\n useEffect(function syncActiveThumbnail() {\n virtualizer.scrollToIndex(currentPage - 1, { align: \"auto\" });\n }, [currentPage, virtualizer]);\n\n return (\n <div className={styles.sidebar}>\n <PdfViewerSidebarHeader\n sidebarMode={sidebarMode}\n onSidebarModeChange={onSidebarModeChange}\n />\n <div ref={scrollContainerRef} className={styles.scrollContainer}>\n <div\n className={styles.thumbnailsContainer}\n style={{ height: virtualizer.getTotalSize() }}\n >\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const pageNumber = virtualItem.index + 1;\n return (\n <div\n key={virtualItem.key}\n className={styles.thumbnailWrapper}\n style={{\n top: virtualItem.start,\n height: virtualItem.size,\n }}\n >\n <div>\n <PdfViewerThumbnail\n document={document}\n pageNumber={pageNumber}\n isActive={pageNumber === currentPage}\n onClick={() => onPageClick(pageNumber)}\n />\n <div className={styles.pageNumber}>{pageNumber}</div>\n </div>\n </div>\n );\n })}\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,cAAc,QAAQ,yBAAyB;AAExD,OAAOC,KAAK,IAAIC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAChD,SACEC,mBAAmB,EACnBC,aAAa,EACbC,eAAe,QACV,iBAAiB;AAExB,OAAOC,MAAM,MAAM,+BAA+B;AAClD,SAASC,sBAAsB,QAAQ,6BAA6B;AACpE,SAASC,kBAAkB,QAAQ,yBAAyB;AAW5D,OAAO,SAASC,gBAAgBA,CAAC;EAC/BC,QAAQ;EACRC,QAAQ;EACRC,WAAW;EACXC,WAAW;EACXC,WAAW;EACXC;AACqB,CAAC,EAAsB;EAC5C,MAAMC,kBAAkB,GAAGd,MAAM,CAAiB,IAAI,CAAC;EACvD,MAAMe,mBAAmB,GAAGC,IAAI,CAACC,KAAK,CAAChB,mBAAmB,GAAGE,eAAe,CAAC,GACzED,aAAa,GAAG,EAAE;EAEtB,MAAMgB,WAAW,GAAGrB,cAAc,CAAC;IACjCsB,KAAK,EAAEV,QAAQ;IACfW,gBAAgB,EAAEA,CAAA,KAAMN,kBAAkB,CAACO,OAAO;IAClDC,YAAY,EAAEA,CAAA,KAAMP,mBAAmB;IACvCQ,QAAQ,EAAE;EACZ,CAAC,CAAC;;EAEF;EACAxB,SAAS,CAAC,YAA+B;IACvCmB,WAAW,CAACM,aAAa,CAACd,WAAW,GAAG,CAAC,EAAE;MAAEe,KAAK,EAAE;IAAO,CAAC,CAAC;EAC/D,CAAC,EAAE,CAACf,WAAW,EAAEQ,WAAW,CAAC,CAAC;EAE9B,oBACEpB,KAAA,CAAA4B,aAAA;IAAKC,SAAS,EAAEvB,MAAM,CAACwB;EAAQ,gBAC7B9B,KAAA,CAAA4B,aAAA,CAACrB,sBAAsB;IACrBO,WAAW,EAAEA,WAAY;IACzBC,mBAAmB,EAAEA;EAAoB,CAC1C,CAAC,eACFf,KAAA,CAAA4B,aAAA;IAAKG,GAAG,EAAEf,kBAAmB;IAACa,SAAS,EAAEvB,MAAM,CAAC0B;EAAgB,gBAC9DhC,KAAA,CAAA4B,aAAA;IACEC,SAAS,EAAEvB,MAAM,CAAC2B,mBAAoB;IACtCC,KAAK,EAAE;MAAEC,MAAM,EAAEf,WAAW,CAACgB,YAAY,CAAC;IAAE;EAAE,GAE7ChB,WAAW,CAACiB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,WAAW,IAAK;IAClD,MAAMC,UAAU,GAAGD,WAAW,CAACE,KAAK,GAAG,CAAC;IACxC,oBACEzC,KAAA,CAAA4B,aAAA;MACEc,GAAG,EAAEH,WAAW,CAACG,GAAI;MACrBb,SAAS,EAAEvB,MAAM,CAACqC,gBAAiB;MACnCT,KAAK,EAAE;QACLU,GAAG,EAAEL,WAAW,CAACM,KAAK;QACtBV,MAAM,EAAEI,WAAW,CAACO;MACtB;IAAE,gBAEF9C,KAAA,CAAA4B,aAAA,2BACE5B,KAAA,CAAA4B,aAAA,CAACpB,kBAAkB;MACjBE,QAAQ,EAAEA,QAAS;MACnB8B,UAAU,EAAEA,UAAW;MACvBO,QAAQ,EAAEP,UAAU,KAAK5B,WAAY;MACrCoC,OAAO,EAAEA,CAAA,KAAMnC,WAAW,CAAC2B,UAAU;IAAE,CACxC,CAAC,eACFxC,KAAA,CAAA4B,aAAA;MAAKC,SAAS,EAAEvB,MAAM,CAACkC;IAAW,GAAEA,UAAgB,CACjD,CACF,CAAC;EAEV,CAAC,CACE,CACF,CACF,CAAC;AAEV","ignoreList":[]}
|
|
@@ -8,15 +8,6 @@
|
|
|
8
8
|
overflow: hidden;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
.sidebarHeader {
|
|
12
|
-
padding: var(--osdk-pdf-viewer-sidebar-thumbnail-gap);
|
|
13
|
-
font-family: var(--osdk-typography-family-default);
|
|
14
|
-
font-size: var(--osdk-typography-size-body-small);
|
|
15
|
-
font-weight: var(--osdk-typography-weight-semibold);
|
|
16
|
-
color: var(--osdk-typography-color-muted);
|
|
17
|
-
border-bottom: 1px solid var(--osdk-pdf-viewer-sidebar-border);
|
|
18
|
-
flex-shrink: 0;
|
|
19
|
-
}
|
|
20
11
|
|
|
21
12
|
.scrollContainer {
|
|
22
13
|
flex: 1;
|
|
@@ -0,0 +1,54 @@
|
|
|
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 { Toggle } from "@base-ui/react/toggle";
|
|
18
|
+
import { ToggleGroup } from "@base-ui/react/toggle-group";
|
|
19
|
+
import { GridView, Properties } from "@blueprintjs/icons";
|
|
20
|
+
import React, { useCallback } from "react";
|
|
21
|
+
import styles from "./PdfViewerSidebarHeader.module.css";
|
|
22
|
+
const SIDEBAR_MODE_VALUE = Object.freeze(["thumbnails"]);
|
|
23
|
+
const OUTLINE_MODE_VALUE = Object.freeze(["outline"]);
|
|
24
|
+
export function PdfViewerSidebarHeader({
|
|
25
|
+
sidebarMode,
|
|
26
|
+
onSidebarModeChange
|
|
27
|
+
}) {
|
|
28
|
+
const value = sidebarMode === "thumbnails" ? SIDEBAR_MODE_VALUE : OUTLINE_MODE_VALUE;
|
|
29
|
+
const handleValueChange = useCallback(newValue => {
|
|
30
|
+
if (newValue.length > 0) {
|
|
31
|
+
onSidebarModeChange(newValue[0]);
|
|
32
|
+
}
|
|
33
|
+
}, [onSidebarModeChange]);
|
|
34
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
35
|
+
className: styles.sidebarHeader
|
|
36
|
+
}, /*#__PURE__*/React.createElement(ToggleGroup, {
|
|
37
|
+
value: value,
|
|
38
|
+
onValueChange: handleValueChange,
|
|
39
|
+
className: styles.toggleGroup
|
|
40
|
+
}, /*#__PURE__*/React.createElement(Toggle, {
|
|
41
|
+
value: "thumbnails",
|
|
42
|
+
className: styles.modeButton,
|
|
43
|
+
"aria-label": "Page thumbnails"
|
|
44
|
+
}, /*#__PURE__*/React.createElement(GridView, {
|
|
45
|
+
size: 16
|
|
46
|
+
})), /*#__PURE__*/React.createElement(Toggle, {
|
|
47
|
+
value: "outline",
|
|
48
|
+
className: styles.modeButton,
|
|
49
|
+
"aria-label": "Document outline"
|
|
50
|
+
}, /*#__PURE__*/React.createElement(Properties, {
|
|
51
|
+
size: 16
|
|
52
|
+
}))));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=PdfViewerSidebarHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfViewerSidebarHeader.js","names":["Toggle","ToggleGroup","GridView","Properties","React","useCallback","styles","SIDEBAR_MODE_VALUE","Object","freeze","OUTLINE_MODE_VALUE","PdfViewerSidebarHeader","sidebarMode","onSidebarModeChange","value","handleValueChange","newValue","length","createElement","className","sidebarHeader","onValueChange","toggleGroup","modeButton","size"],"sources":["PdfViewerSidebarHeader.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 { Toggle } from \"@base-ui/react/toggle\";\nimport { ToggleGroup } from \"@base-ui/react/toggle-group\";\nimport { GridView, Properties } from \"@blueprintjs/icons\";\nimport React, { useCallback } from \"react\";\nimport type { SidebarMode } from \"../types.js\";\nimport styles from \"./PdfViewerSidebarHeader.module.css\";\n\nexport interface PdfViewerSidebarHeaderProps {\n sidebarMode: SidebarMode;\n onSidebarModeChange: (mode: SidebarMode) => void;\n}\n\nconst SIDEBAR_MODE_VALUE = Object.freeze([\"thumbnails\"]) as readonly string[];\nconst OUTLINE_MODE_VALUE = Object.freeze([\"outline\"]) as readonly string[];\n\nexport function PdfViewerSidebarHeader({\n sidebarMode,\n onSidebarModeChange,\n}: PdfViewerSidebarHeaderProps): React.ReactElement {\n const value = sidebarMode === \"thumbnails\"\n ? SIDEBAR_MODE_VALUE\n : OUTLINE_MODE_VALUE;\n\n const handleValueChange = useCallback(\n (newValue: string[]) => {\n if (newValue.length > 0) {\n onSidebarModeChange(newValue[0] as SidebarMode);\n }\n },\n [onSidebarModeChange],\n );\n\n return (\n <div className={styles.sidebarHeader}>\n <ToggleGroup\n value={value}\n onValueChange={handleValueChange}\n className={styles.toggleGroup}\n >\n <Toggle\n value=\"thumbnails\"\n className={styles.modeButton}\n aria-label=\"Page thumbnails\"\n >\n <GridView size={16} />\n </Toggle>\n\n <Toggle\n value=\"outline\"\n className={styles.modeButton}\n aria-label=\"Document outline\"\n >\n <Properties size={16} />\n </Toggle>\n </ToggleGroup>\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,QAAQ,EAAEC,UAAU,QAAQ,oBAAoB;AACzD,OAAOC,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAE1C,OAAOC,MAAM,MAAM,qCAAqC;AAOxD,MAAMC,kBAAkB,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAsB;AAC7E,MAAMC,kBAAkB,GAAGF,MAAM,CAACC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAsB;AAE1E,OAAO,SAASE,sBAAsBA,CAAC;EACrCC,WAAW;EACXC;AAC2B,CAAC,EAAsB;EAClD,MAAMC,KAAK,GAAGF,WAAW,KAAK,YAAY,GACtCL,kBAAkB,GAClBG,kBAAkB;EAEtB,MAAMK,iBAAiB,GAAGV,WAAW,CAClCW,QAAkB,IAAK;IACtB,IAAIA,QAAQ,CAACC,MAAM,GAAG,CAAC,EAAE;MACvBJ,mBAAmB,CAACG,QAAQ,CAAC,CAAC,CAAgB,CAAC;IACjD;EACF,CAAC,EACD,CAACH,mBAAmB,CACtB,CAAC;EAED,oBACET,KAAA,CAAAc,aAAA;IAAKC,SAAS,EAAEb,MAAM,CAACc;EAAc,gBACnChB,KAAA,CAAAc,aAAA,CAACjB,WAAW;IACVa,KAAK,EAAEA,KAAM;IACbO,aAAa,EAAEN,iBAAkB;IACjCI,SAAS,EAAEb,MAAM,CAACgB;EAAY,gBAE9BlB,KAAA,CAAAc,aAAA,CAAClB,MAAM;IACLc,KAAK,EAAC,YAAY;IAClBK,SAAS,EAAEb,MAAM,CAACiB,UAAW;IAC7B,cAAW;EAAiB,gBAE5BnB,KAAA,CAAAc,aAAA,CAAChB,QAAQ;IAACsB,IAAI,EAAE;EAAG,CAAE,CACf,CAAC,eAETpB,KAAA,CAAAc,aAAA,CAAClB,MAAM;IACLc,KAAK,EAAC,SAAS;IACfK,SAAS,EAAEb,MAAM,CAACiB,UAAW;IAC7B,cAAW;EAAkB,gBAE7BnB,KAAA,CAAAc,aAAA,CAACf,UAAU;IAACqB,IAAI,EAAE;EAAG,CAAE,CACjB,CACG,CACV,CAAC;AAEV","ignoreList":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
.sidebarHeader {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: flex-start;
|
|
21
|
+
padding: var(--osdk-surface-spacing);
|
|
22
|
+
border-bottom: var(--osdk-pdf-viewer-sidebar-border);
|
|
23
|
+
flex-shrink: 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.toggleGroup {
|
|
27
|
+
display: flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
gap: var(--osdk-spacing-2xs, 2px);
|
|
30
|
+
padding: var(--osdk-spacing-2xs, 2px);
|
|
31
|
+
border: 1px solid var(--osdk-surface-border-color, rgba(0, 0, 0, 0.15));
|
|
32
|
+
border-radius: var(--osdk-surface-border-radius);
|
|
33
|
+
background-color: var(--osdk-surface-background-color, transparent);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.modeButton {
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
justify-content: center;
|
|
40
|
+
width: 28px;
|
|
41
|
+
height: 28px;
|
|
42
|
+
border: none;
|
|
43
|
+
background: none;
|
|
44
|
+
color: var(--osdk-typography-color-muted);
|
|
45
|
+
cursor: pointer;
|
|
46
|
+
border-radius: var(--osdk-surface-border-radius);
|
|
47
|
+
padding: 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.modeButton:hover {
|
|
51
|
+
background-color: var(--osdk-surface-background-color-default-hover);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.modeButton:active {
|
|
55
|
+
background-color: var(--osdk-surface-background-color-default-active);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.modeButton:focus-visible {
|
|
59
|
+
outline: var(--osdk-focus-outline);
|
|
60
|
+
outline-offset: var(--osdk-focus-visible-outline-offset);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.modeButton[data-pressed] {
|
|
64
|
+
background-color: var(--osdk-pdf-viewer-outline-item-active-bg, rgba(45, 114, 210, 0.1));
|
|
65
|
+
color: var(--osdk-pdf-viewer-outline-item-active-color, var(--osdk-intent-primary));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.modeButton[data-pressed]:hover {
|
|
69
|
+
background-color: var(--osdk-pdf-viewer-outline-item-active-bg, rgba(45, 114, 210, 0.1));
|
|
70
|
+
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import classnames from "classnames";
|
|
18
18
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
19
|
-
import { DEVICE_PIXEL_RATIO, THUMBNAIL_SCALE } from "
|
|
19
|
+
import { DEVICE_PIXEL_RATIO, THUMBNAIL_SCALE } from "../constants.js";
|
|
20
20
|
import styles from "./PdfViewerThumbnail.module.css";
|
|
21
21
|
export function PdfViewerThumbnail({
|
|
22
22
|
document,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PdfViewerThumbnail.js","names":["classnames","React","useCallback","useEffect","useRef","useState","DEVICE_PIXEL_RATIO","THUMBNAIL_SCALE","styles","PdfViewerThumbnail","document","pageNumber","isActive","onClick","canvasRef","renderTaskRef","dimensions","setDimensions","undefined","cancelled","getPage","then","page","current","viewport","getViewport","scale","canvas","context","getContext","width","Math","floor","height","style","cancel","setTransform","renderTask","render","canvasContext","promise","catch","err","Error","message","includes","handleKeyDown","e","key","preventDefault","containerClassName","thumbnailContainer","active","createElement","className","onKeyDown","role","tabIndex","ref"],"sources":["PdfViewerThumbnail.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 type { PDFDocumentProxy, PDFPageProxy } from \"pdfjs-dist\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { DEVICE_PIXEL_RATIO, THUMBNAIL_SCALE } from \"../constants.js\";\nimport styles from \"./PdfViewerThumbnail.module.css\";\n\ninterface PdfViewerThumbnailProps {\n document: PDFDocumentProxy;\n pageNumber: number;\n isActive: boolean;\n onClick: () => void;\n}\n\nexport function PdfViewerThumbnail({\n document,\n pageNumber,\n isActive,\n onClick,\n}: PdfViewerThumbnailProps): React.ReactElement {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const renderTaskRef = useRef<ReturnType<PDFPageProxy[\"render\"]> | null>(null);\n const [dimensions, setDimensions] = useState<\n { width: number; height: number } | undefined\n >(undefined);\n\n useEffect(() => {\n let cancelled = false;\n\n void document.getPage(pageNumber).then((page) => {\n if (cancelled || canvasRef.current == null) {\n return;\n }\n\n const viewport = page.getViewport({ scale: THUMBNAIL_SCALE });\n const canvas = canvasRef.current;\n const context = canvas.getContext(\"2d\");\n if (context == null) {\n return;\n }\n\n canvas.width = Math.floor(viewport.width * DEVICE_PIXEL_RATIO);\n canvas.height = Math.floor(viewport.height * DEVICE_PIXEL_RATIO);\n canvas.style.width = `${Math.floor(viewport.width)}px`;\n canvas.style.height = `${Math.floor(viewport.height)}px`;\n\n setDimensions({\n width: Math.floor(viewport.width),\n height: Math.floor(viewport.height),\n });\n\n if (renderTaskRef.current != null) {\n renderTaskRef.current.cancel();\n }\n\n context.setTransform(\n DEVICE_PIXEL_RATIO,\n 0,\n 0,\n DEVICE_PIXEL_RATIO,\n 0,\n 0,\n );\n\n const renderTask = page.render({\n canvasContext: context,\n viewport,\n });\n renderTaskRef.current = renderTask;\n\n void renderTask.promise.catch((err: unknown) => {\n if (err instanceof Error && err.message.includes(\"cancelled\")) {\n return;\n }\n throw err;\n });\n });\n\n return () => {\n cancelled = true;\n if (renderTaskRef.current != null) {\n renderTaskRef.current.cancel();\n renderTaskRef.current = null;\n }\n };\n }, [document, pageNumber]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n },\n [onClick],\n );\n\n const containerClassName = classnames(\n styles.thumbnailContainer,\n isActive && styles.active,\n );\n\n return (\n <div\n className={containerClassName}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label={`Page ${pageNumber}`}\n aria-current={isActive ? \"page\" : undefined}\n style={dimensions != null\n ? { width: dimensions.width, height: dimensions.height }\n : undefined}\n >\n <canvas ref={canvasRef} className={styles.canvas} />\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|