@cratis/scene.primereact 4.6.0 → 4.8.0
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/.storybook/preview.tsx +8 -1
- package/EnumerationResolution.ts +7 -0
- package/README.md +22 -12
- package/data/DataGallery.stories.tsx +6 -0
- package/data/DataScrollerRow.tsx +35 -0
- package/data/PrimeDataScroller.tsx +84 -0
- package/data/PrimeTreeTable.tsx +145 -0
- package/data/TreeTableCheckState.ts +9 -0
- package/data/TreeTableRow.ts +22 -0
- package/data/TreeTableRowView.tsx +86 -0
- package/data/TreeTableSelectionMode.ts +10 -0
- package/data/checkboxSelection.ts +92 -0
- package/data/index.ts +4 -0
- package/data/isSerializedLegacyElement.ts +30 -0
- package/data/readableValue.ts +32 -0
- package/data/selectionKeysOf.ts +40 -0
- package/data/treeTableRows.ts +32 -0
- package/data/useIncrementalLoad.ts +36 -0
- package/data/useLoadOnReach.ts +31 -0
- package/data/useTreeGridNavigation.ts +81 -0
- package/dist/cjs/data/DataScrollerRow.js +50 -0
- package/dist/cjs/data/DataScrollerRow.js.map +1 -0
- package/dist/cjs/data/PrimeDataScroller.js +120 -0
- package/dist/cjs/data/PrimeDataScroller.js.map +1 -0
- package/dist/cjs/data/PrimeTreeTable.js +217 -0
- package/dist/cjs/data/PrimeTreeTable.js.map +1 -0
- package/dist/cjs/data/TreeTableCheckState.js +13 -0
- package/dist/cjs/data/TreeTableCheckState.js.map +1 -0
- package/dist/cjs/data/TreeTableRowView.js +76 -0
- package/dist/cjs/data/TreeTableRowView.js.map +1 -0
- package/dist/cjs/data/TreeTableSelectionMode.js +14 -0
- package/dist/cjs/data/TreeTableSelectionMode.js.map +1 -0
- package/dist/cjs/data/checkboxSelection.js +88 -0
- package/dist/cjs/data/checkboxSelection.js.map +1 -0
- package/dist/cjs/data/isSerializedLegacyElement.js +30 -0
- package/dist/cjs/data/isSerializedLegacyElement.js.map +1 -0
- package/dist/cjs/data/readableValue.js +31 -0
- package/dist/cjs/data/readableValue.js.map +1 -0
- package/dist/cjs/data/selectionKeysOf.js +40 -0
- package/dist/cjs/data/selectionKeysOf.js.map +1 -0
- package/dist/cjs/data/treeTableRows.js +42 -0
- package/dist/cjs/data/treeTableRows.js.map +1 -0
- package/dist/cjs/data/useIncrementalLoad.js +46 -0
- package/dist/cjs/data/useIncrementalLoad.js.map +1 -0
- package/dist/cjs/data/useLoadOnReach.js +42 -0
- package/dist/cjs/data/useLoadOnReach.js.map +1 -0
- package/dist/cjs/data/useTreeGridNavigation.js +75 -0
- package/dist/cjs/data/useTreeGridNavigation.js.map +1 -0
- package/dist/cjs/editor/PrimeEditor.js +96 -0
- package/dist/cjs/editor/PrimeEditor.js.map +1 -0
- package/dist/cjs/editor/QuillLoaderContext.js +10 -0
- package/dist/cjs/editor/QuillLoaderContext.js.map +1 -0
- package/dist/cjs/editor/QuillLoaderProvider.js +21 -0
- package/dist/cjs/editor/QuillLoaderProvider.js.map +1 -0
- package/dist/cjs/editor/applyHtml.js +25 -0
- package/dist/cjs/editor/applyHtml.js.map +1 -0
- package/dist/cjs/editor/characterCount.js +10 -0
- package/dist/cjs/editor/characterCount.js.map +1 -0
- package/dist/cjs/editor/htmlToPlainText.js +101 -0
- package/dist/cjs/editor/htmlToPlainText.js.map +1 -0
- package/dist/cjs/editor/renderSafeNodes.js +35 -0
- package/dist/cjs/editor/renderSafeNodes.js.map +1 -0
- package/dist/cjs/editor/safeUrls.js +44 -0
- package/dist/cjs/editor/safeUrls.js.map +1 -0
- package/dist/cjs/editor/sanitizeHtml.js +140 -0
- package/dist/cjs/editor/sanitizeHtml.js.map +1 -0
- package/dist/cjs/editor/serializeSafeNodes.js +33 -0
- package/dist/cjs/editor/serializeSafeNodes.js.map +1 -0
- package/dist/cjs/editor/toolbarLayout.js +35 -0
- package/dist/cjs/editor/toolbarLayout.js.map +1 -0
- package/dist/cjs/editor/useQuillEditor.js +137 -0
- package/dist/cjs/editor/useQuillEditor.js.map +1 -0
- package/dist/cjs/file/FileUploadContext.js +13 -0
- package/dist/cjs/file/FileUploadContext.js.map +1 -0
- package/dist/cjs/file/FileUploadHandlerProvider.js +25 -0
- package/dist/cjs/file/FileUploadHandlerProvider.js.map +1 -0
- package/dist/cjs/file/FileUploadMode.js +13 -0
- package/dist/cjs/file/FileUploadMode.js.map +1 -0
- package/dist/cjs/file/PrimeFileUpload.js +161 -0
- package/dist/cjs/file/PrimeFileUpload.js.map +1 -0
- package/dist/cjs/file/postFiles.js +31 -0
- package/dist/cjs/file/postFiles.js.map +1 -0
- package/dist/cjs/file/resolveUploadTarget.js +68 -0
- package/dist/cjs/file/resolveUploadTarget.js.map +1 -0
- package/dist/cjs/file/useUploadSession.js +62 -0
- package/dist/cjs/file/useUploadSession.js.map +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/legacyEnumerationChoices.js +39 -0
- package/dist/cjs/legacyEnumerationChoices.js.map +1 -0
- package/dist/cjs/loadQuill/index.js +22 -0
- package/dist/cjs/loadQuill/index.js.map +1 -0
- package/dist/cjs/primeReactComponents.js +10 -0
- package/dist/cjs/primeReactComponents.js.map +1 -1
- package/dist/cjs/primeReactDescriptors.js +243 -0
- package/dist/cjs/primeReactDescriptors.js.map +1 -1
- package/dist/cjs/primeReactPackage.js +4 -0
- package/dist/cjs/primeReactPackage.js.map +1 -1
- package/dist/cjs/resolveEnumeration.js +55 -0
- package/dist/cjs/resolveEnumeration.js.map +1 -0
- package/dist/cjs/treeNodes.js +42 -7
- package/dist/cjs/treeNodes.js.map +1 -1
- package/dist/cjs/useResettingState.js +47 -0
- package/dist/cjs/useResettingState.js.map +1 -0
- package/dist/esm/EnumerationResolution.d.ts +9 -0
- package/dist/esm/EnumerationResolution.d.ts.map +1 -0
- package/dist/esm/EnumerationResolution.js +2 -0
- package/dist/esm/EnumerationResolution.js.map +1 -0
- package/dist/esm/data/DataGallery.stories.d.ts.map +1 -1
- package/dist/esm/data/DataGallery.stories.js +6 -0
- package/dist/esm/data/DataGallery.stories.js.map +1 -1
- package/dist/esm/data/DataScrollerRow.d.ts +4 -0
- package/dist/esm/data/DataScrollerRow.d.ts.map +1 -0
- package/dist/esm/data/DataScrollerRow.js +48 -0
- package/dist/esm/data/DataScrollerRow.js.map +1 -0
- package/dist/esm/data/PrimeDataScroller.d.ts +3 -0
- package/dist/esm/data/PrimeDataScroller.d.ts.map +1 -0
- package/dist/esm/data/PrimeDataScroller.js +118 -0
- package/dist/esm/data/PrimeDataScroller.js.map +1 -0
- package/dist/esm/data/PrimeTreeTable.d.ts +3 -0
- package/dist/esm/data/PrimeTreeTable.d.ts.map +1 -0
- package/dist/esm/data/PrimeTreeTable.js +215 -0
- package/dist/esm/data/PrimeTreeTable.js.map +1 -0
- package/dist/esm/data/TreeTableCheckState.d.ts +6 -0
- package/dist/esm/data/TreeTableCheckState.d.ts.map +1 -0
- package/dist/esm/data/TreeTableCheckState.js +11 -0
- package/dist/esm/data/TreeTableCheckState.js.map +1 -0
- package/dist/esm/data/TreeTableRow.d.ts +10 -0
- package/dist/esm/data/TreeTableRow.d.ts.map +1 -0
- package/dist/esm/data/TreeTableRow.js +2 -0
- package/dist/esm/data/TreeTableRow.js.map +1 -0
- package/dist/esm/data/TreeTableRowView.d.ts +21 -0
- package/dist/esm/data/TreeTableRowView.d.ts.map +1 -0
- package/dist/esm/data/TreeTableRowView.js +74 -0
- package/dist/esm/data/TreeTableRowView.js.map +1 -0
- package/dist/esm/data/TreeTableSelectionMode.d.ts +7 -0
- package/dist/esm/data/TreeTableSelectionMode.d.ts.map +1 -0
- package/dist/esm/data/TreeTableSelectionMode.js +12 -0
- package/dist/esm/data/TreeTableSelectionMode.js.map +1 -0
- package/dist/esm/data/checkboxSelection.d.ts +9 -0
- package/dist/esm/data/checkboxSelection.d.ts.map +1 -0
- package/dist/esm/data/checkboxSelection.js +85 -0
- package/dist/esm/data/checkboxSelection.js.map +1 -0
- package/dist/esm/data/index.d.ts +4 -0
- package/dist/esm/data/index.d.ts.map +1 -1
- package/dist/esm/data/index.js +4 -0
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/data/isSerializedLegacyElement.d.ts +3 -0
- package/dist/esm/data/isSerializedLegacyElement.d.ts.map +1 -0
- package/dist/esm/data/isSerializedLegacyElement.js +27 -0
- package/dist/esm/data/isSerializedLegacyElement.js.map +1 -0
- package/dist/esm/data/readableValue.d.ts +2 -0
- package/dist/esm/data/readableValue.d.ts.map +1 -0
- package/dist/esm/data/readableValue.js +29 -0
- package/dist/esm/data/readableValue.js.map +1 -0
- package/dist/esm/data/selectionKeysOf.d.ts +2 -0
- package/dist/esm/data/selectionKeysOf.d.ts.map +1 -0
- package/dist/esm/data/selectionKeysOf.js +38 -0
- package/dist/esm/data/selectionKeysOf.js.map +1 -0
- package/dist/esm/data/treeTableRows.d.ts +6 -0
- package/dist/esm/data/treeTableRows.d.ts.map +1 -0
- package/dist/esm/data/treeTableRows.js +38 -0
- package/dist/esm/data/treeTableRows.js.map +1 -0
- package/dist/esm/data/useIncrementalLoad.d.ts +6 -0
- package/dist/esm/data/useIncrementalLoad.d.ts.map +1 -0
- package/dist/esm/data/useIncrementalLoad.js +44 -0
- package/dist/esm/data/useIncrementalLoad.js.map +1 -0
- package/dist/esm/data/useLoadOnReach.d.ts +3 -0
- package/dist/esm/data/useLoadOnReach.d.ts.map +1 -0
- package/dist/esm/data/useLoadOnReach.js +40 -0
- package/dist/esm/data/useLoadOnReach.js.map +1 -0
- package/dist/esm/data/useTreeGridNavigation.d.ts +17 -0
- package/dist/esm/data/useTreeGridNavigation.d.ts.map +1 -0
- package/dist/esm/data/useTreeGridNavigation.js +73 -0
- package/dist/esm/data/useTreeGridNavigation.js.map +1 -0
- package/dist/esm/editor/PrimeEditor.d.ts +3 -0
- package/dist/esm/editor/PrimeEditor.d.ts.map +1 -0
- package/dist/esm/editor/PrimeEditor.js +94 -0
- package/dist/esm/editor/PrimeEditor.js.map +1 -0
- package/dist/esm/editor/QuillConstructor.d.ts +4 -0
- package/dist/esm/editor/QuillConstructor.d.ts.map +1 -0
- package/dist/esm/editor/QuillConstructor.js +2 -0
- package/dist/esm/editor/QuillConstructor.js.map +1 -0
- package/dist/esm/editor/QuillEditorOptions.d.ts +13 -0
- package/dist/esm/editor/QuillEditorOptions.d.ts.map +1 -0
- package/dist/esm/editor/QuillEditorOptions.js +2 -0
- package/dist/esm/editor/QuillEditorOptions.js.map +1 -0
- package/dist/esm/editor/QuillEditorState.d.ts +6 -0
- package/dist/esm/editor/QuillEditorState.d.ts.map +1 -0
- package/dist/esm/editor/QuillEditorState.js +2 -0
- package/dist/esm/editor/QuillEditorState.js.map +1 -0
- package/dist/esm/editor/QuillInstance.d.ts +16 -0
- package/dist/esm/editor/QuillInstance.d.ts.map +1 -0
- package/dist/esm/editor/QuillInstance.js +2 -0
- package/dist/esm/editor/QuillInstance.js.map +1 -0
- package/dist/esm/editor/QuillLoader.d.ts +5 -0
- package/dist/esm/editor/QuillLoader.d.ts.map +1 -0
- package/dist/esm/editor/QuillLoader.js +2 -0
- package/dist/esm/editor/QuillLoader.js.map +1 -0
- package/dist/esm/editor/QuillLoaderContext.d.ts +3 -0
- package/dist/esm/editor/QuillLoaderContext.d.ts.map +1 -0
- package/dist/esm/editor/QuillLoaderContext.js +8 -0
- package/dist/esm/editor/QuillLoaderContext.js.map +1 -0
- package/dist/esm/editor/QuillLoaderProvider.d.ts +8 -0
- package/dist/esm/editor/QuillLoaderProvider.d.ts.map +1 -0
- package/dist/esm/editor/QuillLoaderProvider.js +19 -0
- package/dist/esm/editor/QuillLoaderProvider.js.map +1 -0
- package/dist/esm/editor/QuillOptions.d.ts +9 -0
- package/dist/esm/editor/QuillOptions.d.ts.map +1 -0
- package/dist/esm/editor/QuillOptions.js +2 -0
- package/dist/esm/editor/QuillOptions.js.map +1 -0
- package/dist/esm/editor/SafeElement.d.ts +7 -0
- package/dist/esm/editor/SafeElement.d.ts.map +1 -0
- package/dist/esm/editor/SafeElement.js +2 -0
- package/dist/esm/editor/SafeElement.js.map +1 -0
- package/dist/esm/editor/SafeNode.d.ts +3 -0
- package/dist/esm/editor/SafeNode.d.ts.map +1 -0
- package/dist/esm/editor/SafeNode.js +2 -0
- package/dist/esm/editor/SafeNode.js.map +1 -0
- package/dist/esm/editor/applyHtml.d.ts +3 -0
- package/dist/esm/editor/applyHtml.d.ts.map +1 -0
- package/dist/esm/editor/applyHtml.js +23 -0
- package/dist/esm/editor/applyHtml.js.map +1 -0
- package/dist/esm/editor/characterCount.d.ts +3 -0
- package/dist/esm/editor/characterCount.d.ts.map +1 -0
- package/dist/esm/editor/characterCount.js +8 -0
- package/dist/esm/editor/characterCount.js.map +1 -0
- package/dist/esm/editor/htmlToPlainText.d.ts +2 -0
- package/dist/esm/editor/htmlToPlainText.d.ts.map +1 -0
- package/dist/esm/editor/htmlToPlainText.js +99 -0
- package/dist/esm/editor/htmlToPlainText.js.map +1 -0
- package/dist/esm/editor/index.d.ts +14 -0
- package/dist/esm/editor/index.d.ts.map +1 -0
- package/dist/esm/editor/index.js +14 -0
- package/dist/esm/editor/index.js.map +1 -0
- package/dist/esm/editor/renderSafeNodes.d.ts +4 -0
- package/dist/esm/editor/renderSafeNodes.d.ts.map +1 -0
- package/dist/esm/editor/renderSafeNodes.js +33 -0
- package/dist/esm/editor/renderSafeNodes.js.map +1 -0
- package/dist/esm/editor/safeUrls.d.ts +3 -0
- package/dist/esm/editor/safeUrls.d.ts.map +1 -0
- package/dist/esm/editor/safeUrls.js +41 -0
- package/dist/esm/editor/safeUrls.js.map +1 -0
- package/dist/esm/editor/sanitizeHtml.d.ts +3 -0
- package/dist/esm/editor/sanitizeHtml.d.ts.map +1 -0
- package/dist/esm/editor/sanitizeHtml.js +138 -0
- package/dist/esm/editor/sanitizeHtml.js.map +1 -0
- package/dist/esm/editor/serializeSafeNodes.d.ts +3 -0
- package/dist/esm/editor/serializeSafeNodes.d.ts.map +1 -0
- package/dist/esm/editor/serializeSafeNodes.js +31 -0
- package/dist/esm/editor/serializeSafeNodes.js.map +1 -0
- package/dist/esm/editor/toolbarLayout.d.ts +2 -0
- package/dist/esm/editor/toolbarLayout.d.ts.map +1 -0
- package/dist/esm/editor/toolbarLayout.js +33 -0
- package/dist/esm/editor/toolbarLayout.js.map +1 -0
- package/dist/esm/editor/useQuillEditor.d.ts +4 -0
- package/dist/esm/editor/useQuillEditor.d.ts.map +1 -0
- package/dist/esm/editor/useQuillEditor.js +135 -0
- package/dist/esm/editor/useQuillEditor.js.map +1 -0
- package/dist/esm/file/FileGallery.stories.d.ts +19 -0
- package/dist/esm/file/FileGallery.stories.d.ts.map +1 -0
- package/dist/esm/file/FileGallery.stories.js +23 -0
- package/dist/esm/file/FileGallery.stories.js.map +1 -0
- package/dist/esm/file/FileUploadContext.d.ts +7 -0
- package/dist/esm/file/FileUploadContext.d.ts.map +1 -0
- package/dist/esm/file/FileUploadContext.js +11 -0
- package/dist/esm/file/FileUploadContext.js.map +1 -0
- package/dist/esm/file/FileUploadHandler.d.ts +4 -0
- package/dist/esm/file/FileUploadHandler.d.ts.map +1 -0
- package/dist/esm/file/FileUploadHandler.js +2 -0
- package/dist/esm/file/FileUploadHandler.js.map +1 -0
- package/dist/esm/file/FileUploadHandlerProvider.d.ts +9 -0
- package/dist/esm/file/FileUploadHandlerProvider.d.ts.map +1 -0
- package/dist/esm/file/FileUploadHandlerProvider.js +23 -0
- package/dist/esm/file/FileUploadHandlerProvider.js.map +1 -0
- package/dist/esm/file/FileUploadMode.d.ts +6 -0
- package/dist/esm/file/FileUploadMode.d.ts.map +1 -0
- package/dist/esm/file/FileUploadMode.js +11 -0
- package/dist/esm/file/FileUploadMode.js.map +1 -0
- package/dist/esm/file/PrimeFileUpload.d.ts +3 -0
- package/dist/esm/file/PrimeFileUpload.d.ts.map +1 -0
- package/dist/esm/file/PrimeFileUpload.js +159 -0
- package/dist/esm/file/PrimeFileUpload.js.map +1 -0
- package/dist/esm/file/UploadStatus.d.ts +5 -0
- package/dist/esm/file/UploadStatus.d.ts.map +1 -0
- package/dist/esm/file/UploadStatus.js +2 -0
- package/dist/esm/file/UploadStatus.js.map +1 -0
- package/dist/esm/file/UploadTarget.d.ts +8 -0
- package/dist/esm/file/UploadTarget.d.ts.map +1 -0
- package/dist/esm/file/UploadTarget.js +2 -0
- package/dist/esm/file/UploadTarget.js.map +1 -0
- package/dist/esm/file/index.d.ts +7 -0
- package/dist/esm/file/index.d.ts.map +1 -0
- package/dist/esm/file/index.js +7 -0
- package/dist/esm/file/index.js.map +1 -0
- package/dist/esm/file/postFiles.d.ts +2 -0
- package/dist/esm/file/postFiles.d.ts.map +1 -0
- package/dist/esm/file/postFiles.js +29 -0
- package/dist/esm/file/postFiles.js.map +1 -0
- package/dist/esm/file/resolveUploadTarget.d.ts +3 -0
- package/dist/esm/file/resolveUploadTarget.d.ts.map +1 -0
- package/dist/esm/file/resolveUploadTarget.js +66 -0
- package/dist/esm/file/resolveUploadTarget.js.map +1 -0
- package/dist/esm/file/useUploadSession.d.ts +10 -0
- package/dist/esm/file/useUploadSession.d.ts.map +1 -0
- package/dist/esm/file/useUploadSession.js +60 -0
- package/dist/esm/file/useUploadSession.js.map +1 -0
- package/dist/esm/form/FormGallery.stories.d.ts.map +1 -1
- package/dist/esm/form/FormGallery.stories.js +1 -0
- package/dist/esm/form/FormGallery.stories.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/legacyEnumerationChoices.d.ts +3 -0
- package/dist/esm/legacyEnumerationChoices.d.ts.map +1 -0
- package/dist/esm/legacyEnumerationChoices.js +37 -0
- package/dist/esm/legacyEnumerationChoices.js.map +1 -0
- package/dist/esm/loadQuill/index.d.ts +3 -0
- package/dist/esm/loadQuill/index.d.ts.map +1 -0
- package/dist/esm/loadQuill/index.js +20 -0
- package/dist/esm/loadQuill/index.js.map +1 -0
- package/dist/esm/primeReactComponents.d.ts.map +1 -1
- package/dist/esm/primeReactComponents.js +10 -0
- package/dist/esm/primeReactComponents.js.map +1 -1
- package/dist/esm/primeReactDescriptors.d.ts.map +1 -1
- package/dist/esm/primeReactDescriptors.js +243 -0
- package/dist/esm/primeReactDescriptors.js.map +1 -1
- package/dist/esm/primeReactPackage.js +4 -0
- package/dist/esm/primeReactPackage.js.map +1 -1
- package/dist/esm/resolveEnumeration.d.ts +3 -0
- package/dist/esm/resolveEnumeration.d.ts.map +1 -0
- package/dist/esm/resolveEnumeration.js +53 -0
- package/dist/esm/resolveEnumeration.js.map +1 -0
- package/dist/esm/treeNodes.d.ts +2 -1
- package/dist/esm/treeNodes.d.ts.map +1 -1
- package/dist/esm/treeNodes.js +42 -8
- package/dist/esm/treeNodes.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/useResettingState.d.ts +3 -0
- package/dist/esm/useResettingState.d.ts.map +1 -0
- package/dist/esm/useResettingState.js +45 -0
- package/dist/esm/useResettingState.js.map +1 -0
- package/editor/PrimeEditor.tsx +83 -0
- package/editor/QuillConstructor.ts +8 -0
- package/editor/QuillEditorOptions.ts +29 -0
- package/editor/QuillEditorState.ts +14 -0
- package/editor/QuillInstance.ts +27 -0
- package/editor/QuillLoader.ts +13 -0
- package/editor/QuillLoaderContext.ts +8 -0
- package/editor/QuillLoaderProvider.tsx +24 -0
- package/editor/QuillOptions.ts +10 -0
- package/editor/SafeElement.ts +15 -0
- package/editor/SafeNode.ts +7 -0
- package/editor/applyHtml.ts +21 -0
- package/editor/characterCount.ts +9 -0
- package/editor/htmlToPlainText.ts +74 -0
- package/editor/index.ts +16 -0
- package/editor/renderSafeNodes.tsx +26 -0
- package/editor/safeUrls.ts +43 -0
- package/editor/sanitizeHtml.ts +94 -0
- package/editor/serializeSafeNodes.ts +26 -0
- package/editor/toolbarLayout.ts +10 -0
- package/editor/useQuillEditor.ts +114 -0
- package/file/FileGallery.stories.tsx +32 -0
- package/file/FileUploadContext.ts +17 -0
- package/file/FileUploadHandler.ts +15 -0
- package/file/FileUploadHandlerProvider.tsx +33 -0
- package/file/FileUploadMode.ts +9 -0
- package/file/PrimeFileUpload.tsx +129 -0
- package/file/UploadStatus.ts +9 -0
- package/file/UploadTarget.ts +12 -0
- package/file/index.ts +9 -0
- package/file/postFiles.ts +23 -0
- package/file/resolveUploadTarget.ts +61 -0
- package/file/useUploadSession.ts +67 -0
- package/form/FormGallery.stories.tsx +1 -0
- package/index.ts +2 -0
- package/legacyEnumerationChoices.ts +35 -0
- package/loadQuill/index.ts +21 -0
- package/package.json +17 -7
- package/primeReactComponents.ts +8 -0
- package/primeReactDescriptors.ts +63 -0
- package/primeReactPackage.ts +2 -2
- package/primeReactTheme.css +69 -0
- package/resolveEnumeration.ts +50 -0
- package/treeNodes.ts +44 -6
- package/useResettingState.ts +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderSafeNodes.js","sources":["../../../editor/renderSafeNodes.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { createElement, ReactNode } from 'react';\nimport { SafeNode } from './SafeNode';\n\nconst voidTags = new Set(['br', 'hr', 'img']);\n\n/**\n * Renders safe nodes as React elements.\n *\n * Nothing is ever injected as markup: each node becomes an element created from the allowlisted tag name with\n * the validated attributes, and text goes through React's escaping. Links are made `noopener noreferrer` and\n * open in the same context.\n *\n * @param nodes The nodes `sanitizeHtml` returned.\n */\nexport function renderSafeNodes(nodes: SafeNode[]): ReactNode[] {\n return nodes.map((node, index) => {\n if (typeof node === 'string') return node;\n const { class: className, ...attributes } = node.attributes;\n const properties: Record<string, string | undefined> = { key: String(index), className, ...attributes };\n if (node.tag === 'a') properties.rel = 'noopener noreferrer';\n return createElement(node.tag, properties, ...(voidTags.has(node.tag) ? [] : renderSafeNodes(node.children)));\n });\n}\n"],"names":["voidTags","Set","renderSafeNodes","nodes","map","node","index","class","className","attributes","properties","key","String","tag","rel","createElement","has","children"],"mappings":";;;;AAAA;AACA;AAKA,MAAMA,QAAAA,GAAW,IAAIC,GAAAA,CAAI;AAAC,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA;AAAM,CAAA,CAAA;AAE5C;;;;;;;;IASO,SAASC,eAAAA,CAAgBC,KAAiB,EAAA;AAC7C,IAAA,OAAOA,KAAAA,CAAMC,GAAG,CAAC,CAACC,IAAAA,EAAMC,KAAAA,GAAAA;QACpB,IAAI,OAAOD,IAAAA,KAAS,QAAA,EAAU,OAAOA,IAAAA;QACrC,MAAM,EAAEE,OAAOC,SAAS,EAAE,GAAGC,UAAAA,EAAY,GAAGJ,KAAKI,UAAU;AAC3D,QAAA,MAAMC,UAAAA,GAAiD;AAAEC,YAAAA,GAAAA,EAAKC,MAAAA,CAAON,KAAAA,CAAAA;AAAQE,YAAAA,SAAAA;AAAW,YAAA,GAAGC;AAAW,SAAA;AACtG,QAAA,IAAIJ,KAAKQ,GAAG,KAAK,GAAA,EAAKH,UAAAA,CAAWI,GAAG,GAAG,qBAAA;AACvC,QAAA,qBAAOC,mBAAAA,CAAcV,IAAAA,CAAKQ,GAAG,EAAEH,eAAgBV,QAAAA,CAASgB,GAAG,CAACX,IAAAA,CAAKQ,GAAG,CAAA,GAAI,EAAE,GAAGX,eAAAA,CAAgBG,KAAKY,QAAQ,CAAA,CAAA;AAC9G,IAAA,CAAA,CAAA;AACJ;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
/** Schemes a link may use. Anything else, `javascript:` and `data:` above all, is dropped. */ const linkProtocols = new Set([
|
|
6
|
+
'http:',
|
|
7
|
+
'https:',
|
|
8
|
+
'mailto:',
|
|
9
|
+
'tel:'
|
|
10
|
+
]);
|
|
11
|
+
/** The only images that are kept: small raster data URLs. A remote image is a request made just by rendering. */ const rasterDataUrl = /^data:image\/(png|jpeg|gif|webp);base64,[a-z0-9+/]+={0,2}$/i;
|
|
12
|
+
/** Resolved against, to learn which scheme a browser would act on. It is never sent to. */ const placeholderOrigin = 'https://editor.invalid';
|
|
13
|
+
/**
|
|
14
|
+
* Returns a link target a browser may follow, or `undefined`.
|
|
15
|
+
*
|
|
16
|
+
* Browsers strip tabs and newlines from inside a scheme, so the address is judged by what `URL` resolves it to
|
|
17
|
+
* and not by its text: `java\tscript:` is a `javascript:` link. Relative links and fragments resolve against
|
|
18
|
+
* an http origin and are kept.
|
|
19
|
+
*
|
|
20
|
+
* @param value The authored `href`.
|
|
21
|
+
*/ function safeLinkUrl(value) {
|
|
22
|
+
const trimmed = value.trim();
|
|
23
|
+
if (trimmed === '') return undefined;
|
|
24
|
+
try {
|
|
25
|
+
return linkProtocols.has(new URL(trimmed, placeholderOrigin).protocol) ? trimmed : undefined;
|
|
26
|
+
} catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns an image source that may be rendered, or `undefined`.
|
|
32
|
+
*
|
|
33
|
+
* Only base64 PNG, JPEG, GIF and WebP data URLs pass. SVG is refused because it can carry script, and an
|
|
34
|
+
* `http(s)` image is refused because rendering it would contact a server the author named.
|
|
35
|
+
*
|
|
36
|
+
* @param value The authored `src`.
|
|
37
|
+
*/ function safeImageUrl(value) {
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
return rasterDataUrl.test(trimmed) ? trimmed : undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
exports.safeImageUrl = safeImageUrl;
|
|
43
|
+
exports.safeLinkUrl = safeLinkUrl;
|
|
44
|
+
//# sourceMappingURL=safeUrls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeUrls.js","sources":["../../../editor/safeUrls.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** Schemes a link may use. Anything else, `javascript:` and `data:` above all, is dropped. */\nconst linkProtocols = new Set(['http:', 'https:', 'mailto:', 'tel:']);\n\n/** The only images that are kept: small raster data URLs. A remote image is a request made just by rendering. */\nconst rasterDataUrl = /^data:image\\/(png|jpeg|gif|webp);base64,[a-z0-9+/]+={0,2}$/i;\n\n/** Resolved against, to learn which scheme a browser would act on. It is never sent to. */\nconst placeholderOrigin = 'https://editor.invalid';\n\n/**\n * Returns a link target a browser may follow, or `undefined`.\n *\n * Browsers strip tabs and newlines from inside a scheme, so the address is judged by what `URL` resolves it to\n * and not by its text: `java\\tscript:` is a `javascript:` link. Relative links and fragments resolve against\n * an http origin and are kept.\n *\n * @param value The authored `href`.\n */\nexport function safeLinkUrl(value: string): string | undefined {\n const trimmed = value.trim();\n if (trimmed === '') return undefined;\n try {\n return linkProtocols.has(new URL(trimmed, placeholderOrigin).protocol) ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Returns an image source that may be rendered, or `undefined`.\n *\n * Only base64 PNG, JPEG, GIF and WebP data URLs pass. SVG is refused because it can carry script, and an\n * `http(s)` image is refused because rendering it would contact a server the author named.\n *\n * @param value The authored `src`.\n */\nexport function safeImageUrl(value: string): string | undefined {\n const trimmed = value.trim();\n return rasterDataUrl.test(trimmed) ? trimmed : undefined;\n}\n"],"names":["linkProtocols","Set","rasterDataUrl","placeholderOrigin","safeLinkUrl","value","trimmed","trim","undefined","has","URL","protocol","safeImageUrl","test"],"mappings":";;AAAA;AACA;AAEA,+FACA,MAAMA,aAAAA,GAAgB,IAAIC,GAAAA,CAAI;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA;AAAO,CAAA,CAAA;AAEpE,kHACA,MAAMC,aAAAA,GAAgB,6DAAA;AAEtB,4FACA,MAAMC,iBAAAA,GAAoB,wBAAA;AAE1B;;;;;;;;IASO,SAASC,WAAAA,CAAYC,KAAa,EAAA;IACrC,MAAMC,OAAAA,GAAUD,MAAME,IAAI,EAAA;IAC1B,IAAID,OAAAA,KAAY,IAAI,OAAOE,SAAAA;IAC3B,IAAI;QACA,OAAOR,aAAAA,CAAcS,GAAG,CAAC,IAAIC,IAAIJ,OAAAA,EAASH,iBAAAA,CAAAA,CAAmBQ,QAAQ,CAAA,GAAIL,OAAAA,GAAUE,SAAAA;AACvF,IAAA,CAAA,CAAE,OAAM;QACJ,OAAOA,SAAAA;AACX,IAAA;AACJ;AAEA;;;;;;;IAQO,SAASI,YAAAA,CAAaP,KAAa,EAAA;IACtC,MAAMC,OAAAA,GAAUD,MAAME,IAAI,EAAA;AAC1B,IAAA,OAAOL,aAAAA,CAAcW,IAAI,CAACP,OAAAA,CAAAA,GAAWA,OAAAA,GAAUE,SAAAA;AACnD;;;"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var safeUrls = require('./safeUrls.js');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
6
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
7
|
+
/** Elements that are kept. Every other element is unwrapped: its children stay, the element does not. */ const keptTags = new Set([
|
|
8
|
+
'p',
|
|
9
|
+
'div',
|
|
10
|
+
'span',
|
|
11
|
+
'br',
|
|
12
|
+
'hr',
|
|
13
|
+
'strong',
|
|
14
|
+
'b',
|
|
15
|
+
'em',
|
|
16
|
+
'i',
|
|
17
|
+
'u',
|
|
18
|
+
's',
|
|
19
|
+
'strike',
|
|
20
|
+
'del',
|
|
21
|
+
'sub',
|
|
22
|
+
'sup',
|
|
23
|
+
'code',
|
|
24
|
+
'pre',
|
|
25
|
+
'blockquote',
|
|
26
|
+
'h1',
|
|
27
|
+
'h2',
|
|
28
|
+
'h3',
|
|
29
|
+
'h4',
|
|
30
|
+
'h5',
|
|
31
|
+
'h6',
|
|
32
|
+
'ul',
|
|
33
|
+
'ol',
|
|
34
|
+
'li',
|
|
35
|
+
'a',
|
|
36
|
+
'img'
|
|
37
|
+
]);
|
|
38
|
+
/** Elements whose content is never text to show - script, style, embedded documents and form controls. */ const discardedWithContent = new Set([
|
|
39
|
+
'script',
|
|
40
|
+
'style',
|
|
41
|
+
'template',
|
|
42
|
+
'noscript',
|
|
43
|
+
'iframe',
|
|
44
|
+
'frame',
|
|
45
|
+
'frameset',
|
|
46
|
+
'object',
|
|
47
|
+
'embed',
|
|
48
|
+
'applet',
|
|
49
|
+
'svg',
|
|
50
|
+
'math',
|
|
51
|
+
'audio',
|
|
52
|
+
'video',
|
|
53
|
+
'canvas',
|
|
54
|
+
'textarea',
|
|
55
|
+
'select',
|
|
56
|
+
'option',
|
|
57
|
+
'button',
|
|
58
|
+
'input',
|
|
59
|
+
'form',
|
|
60
|
+
'head',
|
|
61
|
+
'title',
|
|
62
|
+
'meta',
|
|
63
|
+
'link',
|
|
64
|
+
'base'
|
|
65
|
+
]);
|
|
66
|
+
/** Quill's own formatting classes. They name CSS rules, so a fixed vocabulary is safe and anything else is not kept. */ const formattingClass = /^ql-(align-(center|right|justify)|indent-[1-8]|size-(small|large|huge)|font-(serif|monospace)|direction-rtl)$/;
|
|
67
|
+
const listKinds = new Set([
|
|
68
|
+
'bullet',
|
|
69
|
+
'ordered',
|
|
70
|
+
'checked',
|
|
71
|
+
'unchecked'
|
|
72
|
+
]);
|
|
73
|
+
/** Deeper than any real document nests. Anything below is flattened to its text. */ const maximumDepth = 64;
|
|
74
|
+
/**
|
|
75
|
+
* Reduces authored HTML to the part that is safe to render.
|
|
76
|
+
*
|
|
77
|
+
* It parses with `DOMParser`, which builds an inert document: nothing in it loads, runs or paints while it is
|
|
78
|
+
* walked. The walk then keeps only elements from an allowlist and, on those, only the attributes listed
|
|
79
|
+
* here - a validated `href` or image `src`, Quill's formatting classes and list kind. Event handlers,
|
|
80
|
+
* `style`, `srcdoc`, unknown elements' attributes and every URL that is not allowed are dropped, and script,
|
|
81
|
+
* style, SVG, frames and form controls are removed together with their content.
|
|
82
|
+
*
|
|
83
|
+
* The result is plain data. Render it with `renderSafeNodes` or serialize it with `serializeSafeNodes`; the
|
|
84
|
+
* authored string itself is never put into the document.
|
|
85
|
+
*
|
|
86
|
+
* @param html The authored HTML.
|
|
87
|
+
* @returns The safe nodes.
|
|
88
|
+
* @throws When there is no `DOMParser`. Use `htmlToPlainText` where there is no DOM.
|
|
89
|
+
*/ function sanitizeHtml(html) {
|
|
90
|
+
if (typeof DOMParser === 'undefined') throw new Error('Sanitizing HTML needs a DOM. Use htmlToPlainText where there is none.');
|
|
91
|
+
return sanitizeChildren(new DOMParser().parseFromString(html, 'text/html').body, 0);
|
|
92
|
+
}
|
|
93
|
+
function sanitizeChildren(parent, depth) {
|
|
94
|
+
const nodes = [];
|
|
95
|
+
for (const child of Array.from(parent.childNodes)){
|
|
96
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
97
|
+
if (child.textContent !== null && child.textContent !== '') nodes.push(child.textContent);
|
|
98
|
+
} else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
99
|
+
nodes.push(...sanitizeElement(child, depth));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return nodes;
|
|
103
|
+
}
|
|
104
|
+
function sanitizeElement(element, depth) {
|
|
105
|
+
const tag = element.tagName.toLowerCase();
|
|
106
|
+
if (discardedWithContent.has(tag)) return [];
|
|
107
|
+
if (depth >= maximumDepth) return [
|
|
108
|
+
element.textContent ?? ''
|
|
109
|
+
];
|
|
110
|
+
const children = sanitizeChildren(element, depth + 1);
|
|
111
|
+
if (!keptTags.has(tag)) return children;
|
|
112
|
+
const attributes = keptAttributes(tag, element);
|
|
113
|
+
if (tag === 'img' && attributes.src === undefined) return [];
|
|
114
|
+
if (tag === 'a' && attributes.href === undefined) return children;
|
|
115
|
+
return [
|
|
116
|
+
{
|
|
117
|
+
tag,
|
|
118
|
+
attributes,
|
|
119
|
+
children
|
|
120
|
+
}
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
function keptAttributes(tag, element) {
|
|
124
|
+
const attributes = {};
|
|
125
|
+
const href = tag === 'a' ? safeUrls.safeLinkUrl(element.getAttribute('href') ?? '') : undefined;
|
|
126
|
+
if (href !== undefined) attributes.href = href;
|
|
127
|
+
const source = tag === 'img' ? safeUrls.safeImageUrl(element.getAttribute('src') ?? '') : undefined;
|
|
128
|
+
if (source !== undefined) {
|
|
129
|
+
attributes.src = source;
|
|
130
|
+
attributes.alt = element.getAttribute('alt') ?? '';
|
|
131
|
+
}
|
|
132
|
+
const classes = (element.getAttribute('class') ?? '').split(/\s+/).filter((name)=>formattingClass.test(name));
|
|
133
|
+
if (classes.length > 0) attributes.class = classes.join(' ');
|
|
134
|
+
const listKind = element.getAttribute('data-list');
|
|
135
|
+
if (tag === 'li' && listKind !== null && listKinds.has(listKind)) attributes['data-list'] = listKind;
|
|
136
|
+
return attributes;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
exports.sanitizeHtml = sanitizeHtml;
|
|
140
|
+
//# sourceMappingURL=sanitizeHtml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizeHtml.js","sources":["../../../editor/sanitizeHtml.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { SafeElement } from './SafeElement';\nimport { SafeNode } from './SafeNode';\nimport { safeImageUrl, safeLinkUrl } from './safeUrls';\n\n/** Elements that are kept. Every other element is unwrapped: its children stay, the element does not. */\nconst keptTags = new Set([\n 'p', 'div', 'span', 'br', 'hr', 'strong', 'b', 'em', 'i', 'u', 's', 'strike', 'del', 'sub', 'sup', 'code', 'pre', 'blockquote',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'a', 'img',\n]);\n\n/** Elements whose content is never text to show - script, style, embedded documents and form controls. */\nconst discardedWithContent = new Set([\n 'script', 'style', 'template', 'noscript', 'iframe', 'frame', 'frameset', 'object', 'embed', 'applet', 'svg', 'math',\n 'audio', 'video', 'canvas', 'textarea', 'select', 'option', 'button', 'input', 'form', 'head', 'title', 'meta', 'link', 'base',\n]);\n\n/** Quill's own formatting classes. They name CSS rules, so a fixed vocabulary is safe and anything else is not kept. */\nconst formattingClass = /^ql-(align-(center|right|justify)|indent-[1-8]|size-(small|large|huge)|font-(serif|monospace)|direction-rtl)$/;\n\nconst listKinds = new Set(['bullet', 'ordered', 'checked', 'unchecked']);\n\n/** Deeper than any real document nests. Anything below is flattened to its text. */\nconst maximumDepth = 64;\n\n/**\n * Reduces authored HTML to the part that is safe to render.\n *\n * It parses with `DOMParser`, which builds an inert document: nothing in it loads, runs or paints while it is\n * walked. The walk then keeps only elements from an allowlist and, on those, only the attributes listed\n * here - a validated `href` or image `src`, Quill's formatting classes and list kind. Event handlers,\n * `style`, `srcdoc`, unknown elements' attributes and every URL that is not allowed are dropped, and script,\n * style, SVG, frames and form controls are removed together with their content.\n *\n * The result is plain data. Render it with `renderSafeNodes` or serialize it with `serializeSafeNodes`; the\n * authored string itself is never put into the document.\n *\n * @param html The authored HTML.\n * @returns The safe nodes.\n * @throws When there is no `DOMParser`. Use `htmlToPlainText` where there is no DOM.\n */\nexport function sanitizeHtml(html: string): SafeNode[] {\n if (typeof DOMParser === 'undefined') throw new Error('Sanitizing HTML needs a DOM. Use htmlToPlainText where there is none.');\n return sanitizeChildren(new DOMParser().parseFromString(html, 'text/html').body, 0);\n}\n\nfunction sanitizeChildren(parent: Node, depth: number): SafeNode[] {\n const nodes: SafeNode[] = [];\n for (const child of Array.from(parent.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n if (child.textContent !== null && child.textContent !== '') nodes.push(child.textContent);\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n nodes.push(...sanitizeElement(child as Element, depth));\n }\n }\n return nodes;\n}\n\nfunction sanitizeElement(element: Element, depth: number): SafeNode[] {\n const tag = element.tagName.toLowerCase();\n if (discardedWithContent.has(tag)) return [];\n if (depth >= maximumDepth) return [element.textContent ?? ''];\n\n const children = sanitizeChildren(element, depth + 1);\n if (!keptTags.has(tag)) return children;\n\n const attributes = keptAttributes(tag, element);\n if (tag === 'img' && attributes.src === undefined) return [];\n if (tag === 'a' && attributes.href === undefined) return children;\n return [{ tag, attributes, children } satisfies SafeElement];\n}\n\nfunction keptAttributes(tag: string, element: Element): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n const href = tag === 'a' ? safeLinkUrl(element.getAttribute('href') ?? '') : undefined;\n if (href !== undefined) attributes.href = href;\n\n const source = tag === 'img' ? safeImageUrl(element.getAttribute('src') ?? '') : undefined;\n if (source !== undefined) {\n attributes.src = source;\n attributes.alt = element.getAttribute('alt') ?? '';\n }\n\n const classes = (element.getAttribute('class') ?? '').split(/\\s+/).filter(name => formattingClass.test(name));\n if (classes.length > 0) attributes.class = classes.join(' ');\n\n const listKind = element.getAttribute('data-list');\n if (tag === 'li' && listKind !== null && listKinds.has(listKind)) attributes['data-list'] = listKind;\n\n return attributes;\n}\n"],"names":["keptTags","Set","discardedWithContent","formattingClass","listKinds","maximumDepth","sanitizeHtml","html","DOMParser","Error","sanitizeChildren","parseFromString","body","parent","depth","nodes","child","Array","from","childNodes","nodeType","Node","TEXT_NODE","textContent","push","ELEMENT_NODE","sanitizeElement","element","tag","tagName","toLowerCase","has","children","attributes","keptAttributes","src","undefined","href","safeLinkUrl","getAttribute","source","safeImageUrl","alt","classes","split","filter","name","test","length","class","join","listKind"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
const voidTags = new Set([
|
|
6
|
+
'br',
|
|
7
|
+
'hr',
|
|
8
|
+
'img'
|
|
9
|
+
]);
|
|
10
|
+
const escapes = {
|
|
11
|
+
'&': '&',
|
|
12
|
+
'<': '<',
|
|
13
|
+
'>': '>',
|
|
14
|
+
'"': '"'
|
|
15
|
+
};
|
|
16
|
+
const escape = (text)=>text.replace(/[&<>"]/g, (character)=>escapes[character]);
|
|
17
|
+
/**
|
|
18
|
+
* Writes safe nodes back out as an HTML string, for an editor that reads HTML.
|
|
19
|
+
*
|
|
20
|
+
* Text and attribute values are escaped, and only tags and attributes the allowlist produced are written, so
|
|
21
|
+
* the string can contain nothing the allowlist did not already accept.
|
|
22
|
+
*
|
|
23
|
+
* @param nodes The nodes `sanitizeHtml` returned.
|
|
24
|
+
*/ function serializeSafeNodes(nodes) {
|
|
25
|
+
return nodes.map((node)=>{
|
|
26
|
+
if (typeof node === 'string') return escape(node);
|
|
27
|
+
const attributes = Object.entries(node.attributes).map(([name, value])=>` ${name}="${escape(value)}"`).join('');
|
|
28
|
+
return voidTags.has(node.tag) ? `<${node.tag}${attributes}>` : `<${node.tag}${attributes}>${serializeSafeNodes(node.children)}</${node.tag}>`;
|
|
29
|
+
}).join('');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.serializeSafeNodes = serializeSafeNodes;
|
|
33
|
+
//# sourceMappingURL=serializeSafeNodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializeSafeNodes.js","sources":["../../../editor/serializeSafeNodes.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { SafeNode } from './SafeNode';\n\nconst voidTags = new Set(['br', 'hr', 'img']);\n\nconst escapes: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"' };\n\nconst escape = (text: string) => text.replace(/[&<>\"]/g, character => escapes[character]);\n\n/**\n * Writes safe nodes back out as an HTML string, for an editor that reads HTML.\n *\n * Text and attribute values are escaped, and only tags and attributes the allowlist produced are written, so\n * the string can contain nothing the allowlist did not already accept.\n *\n * @param nodes The nodes `sanitizeHtml` returned.\n */\nexport function serializeSafeNodes(nodes: SafeNode[]): string {\n return nodes.map(node => {\n if (typeof node === 'string') return escape(node);\n const attributes = Object.entries(node.attributes).map(([name, value]) => ` ${name}=\"${escape(value)}\"`).join('');\n return voidTags.has(node.tag) ? `<${node.tag}${attributes}>` : `<${node.tag}${attributes}>${serializeSafeNodes(node.children)}</${node.tag}>`;\n }).join('');\n}\n"],"names":["voidTags","Set","escapes","escape","text","replace","character","serializeSafeNodes","nodes","map","node","attributes","Object","entries","name","value","join","has","tag","children"],"mappings":";;AAAA;AACA;AAIA,MAAMA,QAAAA,GAAW,IAAIC,GAAAA,CAAI;AAAC,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA;AAAM,CAAA,CAAA;AAE5C,MAAMC,OAAAA,GAAkC;IAAE,GAAA,EAAK,OAAA;IAAS,GAAA,EAAK,MAAA;IAAQ,GAAA,EAAK,MAAA;IAAQ,GAAA,EAAK;AAAS,CAAA;AAEhG,MAAMC,MAAAA,GAAS,CAACC,IAAAA,GAAiBA,IAAAA,CAAKC,OAAO,CAAC,SAAA,EAAWC,CAAAA,SAAAA,GAAaJ,OAAO,CAACI,SAAAA,CAAU,CAAA;AAExF;;;;;;;IAQO,SAASC,kBAAAA,CAAmBC,KAAiB,EAAA;IAChD,OAAOA,KAAAA,CAAMC,GAAG,CAACC,CAAAA,IAAAA,GAAAA;AACb,QAAA,IAAI,OAAOA,IAAAA,KAAS,QAAA,EAAU,OAAOP,MAAAA,CAAOO,IAAAA,CAAAA;QAC5C,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACH,IAAAA,CAAKC,UAAU,CAAA,CAAEF,GAAG,CAAC,CAAC,CAACK,IAAAA,EAAMC,KAAAA,CAAM,GAAK,CAAC,CAAC,EAAED,IAAAA,CAAK,EAAE,EAAEX,MAAAA,CAAOY,KAAAA,CAAAA,CAAO,CAAC,CAAC,CAAA,CAAEC,IAAI,CAAC,EAAA,CAAA;AAC9G,QAAA,OAAOhB,QAAAA,CAASiB,GAAG,CAACP,IAAAA,CAAKQ,GAAG,CAAA,GAAI,CAAC,CAAC,EAAER,KAAKQ,GAAG,CAAA,EAAGP,UAAAA,CAAW,CAAC,CAAC,GAAG,CAAC,CAAC,EAAED,KAAKQ,GAAG,CAAA,EAAGP,UAAAA,CAAW,CAAC,EAAEJ,kBAAAA,CAAmBG,IAAAA,CAAKS,QAAQ,CAAA,CAAE,EAAE,EAAET,IAAAA,CAAKQ,GAAG,CAAC,CAAC,CAAC;AACjJ,IAAA,CAAA,CAAA,CAAGF,IAAI,CAAC,EAAA,CAAA;AACZ;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
/** The formats the toolbar offers. Content in other formats is still shown, but cannot be produced here. */ const toolbarLayout = [
|
|
6
|
+
[
|
|
7
|
+
'bold',
|
|
8
|
+
'italic',
|
|
9
|
+
'underline'
|
|
10
|
+
],
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
header: [
|
|
14
|
+
1,
|
|
15
|
+
2,
|
|
16
|
+
3,
|
|
17
|
+
false
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
{
|
|
23
|
+
list: 'ordered'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
list: 'bullet'
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
'link'
|
|
31
|
+
]
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
exports.toolbarLayout = toolbarLayout;
|
|
35
|
+
//# sourceMappingURL=toolbarLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbarLayout.js","sources":["../../../editor/toolbarLayout.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** The formats the toolbar offers. Content in other formats is still shown, but cannot be produced here. */\nexport const toolbarLayout: (string | Record<string, unknown>)[][] = [\n ['bold', 'italic', 'underline'],\n [{ header: [1, 2, 3, false] }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n ['link'],\n];\n"],"names":["toolbarLayout","header","list"],"mappings":";;AAAA;AACA;AAEA,6GACO,MAAMA,aAAAA,GAAwD;AACjE,IAAA;AAAC,QAAA,MAAA;AAAQ,QAAA,QAAA;AAAU,QAAA;AAAY,KAAA;AAC/B,IAAA;AAAC,QAAA;YAAEC,MAAAA,EAAQ;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;AAAM;AAAC;AAAE,KAAA;AAC9B,IAAA;AAAC,QAAA;YAAEC,IAAAA,EAAM;AAAU,SAAA;AAAG,QAAA;YAAEA,IAAAA,EAAM;AAAS;AAAE,KAAA;AACzC,IAAA;AAAC,QAAA;AAAO;;;"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var applyHtml = require('./applyHtml.js');
|
|
5
|
+
var characterCount = require('./characterCount.js');
|
|
6
|
+
var toolbarLayout = require('./toolbarLayout.js');
|
|
7
|
+
|
|
8
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
9
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
10
|
+
const idle = {
|
|
11
|
+
ready: false,
|
|
12
|
+
failure: undefined,
|
|
13
|
+
characters: 0
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Builds and owns a Quill editor inside an element React leaves alone.
|
|
17
|
+
*
|
|
18
|
+
* The editor is constructed once per loader and toolbar setting, in a container this hook creates and
|
|
19
|
+
* removes itself. React renders the host with no children, so a re-render can never wipe what Quill built -
|
|
20
|
+
* the failure of rendering the authored HTML as the host's children and then letting Quill take it over.
|
|
21
|
+
*
|
|
22
|
+
* Everything else is applied to the live editor without rebuilding it:
|
|
23
|
+
* - a changed `html` replaces the content silently, and only when the authored value really changed, so a
|
|
24
|
+
* user's edit survives an unrelated property change;
|
|
25
|
+
* - `editable`, the placeholder and the accessible name update in place;
|
|
26
|
+
* - the `text-change` listener is removed, and the toolbar and surface with the container, when the editor
|
|
27
|
+
* is rebuilt or the control unmounts.
|
|
28
|
+
*
|
|
29
|
+
* Only a user edit calls `onUserChange`.
|
|
30
|
+
*/ function useQuillEditor(options) {
|
|
31
|
+
const { loader, host, html, showHeader, editable, placeholder, ariaLabel } = options;
|
|
32
|
+
const [state, setState] = react.useState(idle);
|
|
33
|
+
const quillReference = react.useRef(undefined);
|
|
34
|
+
const appliedHtml = react.useRef(html);
|
|
35
|
+
const latest = react.useRef(options);
|
|
36
|
+
latest.current = options;
|
|
37
|
+
react.useEffect(()=>{
|
|
38
|
+
const container = host.current;
|
|
39
|
+
if (loader === undefined || container === null) return undefined;
|
|
40
|
+
let disposed = false;
|
|
41
|
+
let dispose;
|
|
42
|
+
loader().then((loaded)=>{
|
|
43
|
+
if (disposed) return;
|
|
44
|
+
const Quill = typeof loaded === 'function' ? loaded : loaded.default;
|
|
45
|
+
const surface = container.ownerDocument.createElement('div');
|
|
46
|
+
container.appendChild(surface);
|
|
47
|
+
const quill = new Quill(surface, {
|
|
48
|
+
theme: 'snow',
|
|
49
|
+
modules: {
|
|
50
|
+
toolbar: showHeader ? toolbarLayout.toolbarLayout : false
|
|
51
|
+
},
|
|
52
|
+
placeholder: latest.current.placeholder,
|
|
53
|
+
readOnly: !latest.current.editable
|
|
54
|
+
});
|
|
55
|
+
applyHtml.applyHtml(quill, latest.current.html);
|
|
56
|
+
appliedHtml.current = latest.current.html;
|
|
57
|
+
const changed = (_delta, _previous, source)=>{
|
|
58
|
+
if (source === 'silent') return;
|
|
59
|
+
setState((current)=>({
|
|
60
|
+
...current,
|
|
61
|
+
characters: characterCount.characterCount(quill)
|
|
62
|
+
}));
|
|
63
|
+
if (source === 'user') latest.current.onUserChange();
|
|
64
|
+
};
|
|
65
|
+
quill.on('text-change', changed);
|
|
66
|
+
quillReference.current = quill;
|
|
67
|
+
dispose = ()=>{
|
|
68
|
+
quill.off('text-change', changed);
|
|
69
|
+
quillReference.current = undefined;
|
|
70
|
+
container.replaceChildren();
|
|
71
|
+
};
|
|
72
|
+
setState({
|
|
73
|
+
ready: true,
|
|
74
|
+
failure: undefined,
|
|
75
|
+
characters: characterCount.characterCount(quill)
|
|
76
|
+
});
|
|
77
|
+
}).catch((error)=>{
|
|
78
|
+
if (!disposed) setState({
|
|
79
|
+
...idle,
|
|
80
|
+
failure: error instanceof Error ? error.message : String(error)
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
return ()=>{
|
|
84
|
+
disposed = true;
|
|
85
|
+
dispose?.();
|
|
86
|
+
setState(idle);
|
|
87
|
+
};
|
|
88
|
+
}, [
|
|
89
|
+
loader,
|
|
90
|
+
host,
|
|
91
|
+
showHeader
|
|
92
|
+
]);
|
|
93
|
+
react.useEffect(()=>{
|
|
94
|
+
const quill = quillReference.current;
|
|
95
|
+
if (!state.ready || quill === undefined || html === appliedHtml.current) return;
|
|
96
|
+
appliedHtml.current = html;
|
|
97
|
+
applyHtml.applyHtml(quill, html);
|
|
98
|
+
setState((current)=>({
|
|
99
|
+
...current,
|
|
100
|
+
characters: characterCount.characterCount(quill)
|
|
101
|
+
}));
|
|
102
|
+
}, [
|
|
103
|
+
html,
|
|
104
|
+
state.ready
|
|
105
|
+
]);
|
|
106
|
+
react.useEffect(()=>{
|
|
107
|
+
const quill = quillReference.current;
|
|
108
|
+
if (!state.ready || quill === undefined) return;
|
|
109
|
+
quill.enable(editable);
|
|
110
|
+
quill.root.setAttribute('aria-readonly', String(!editable));
|
|
111
|
+
const toolbar = quill.getModule('toolbar');
|
|
112
|
+
toolbar?.container?.querySelectorAll('button, select').forEach((control)=>{
|
|
113
|
+
if (editable) control.removeAttribute('disabled');
|
|
114
|
+
else control.setAttribute('disabled', '');
|
|
115
|
+
});
|
|
116
|
+
}, [
|
|
117
|
+
editable,
|
|
118
|
+
state.ready
|
|
119
|
+
]);
|
|
120
|
+
react.useEffect(()=>{
|
|
121
|
+
const quill = quillReference.current;
|
|
122
|
+
if (!state.ready || quill === undefined) return;
|
|
123
|
+
quill.root.setAttribute('role', 'textbox');
|
|
124
|
+
quill.root.setAttribute('aria-multiline', 'true');
|
|
125
|
+
quill.root.setAttribute('aria-label', ariaLabel);
|
|
126
|
+
if (placeholder === undefined) quill.root.removeAttribute('data-placeholder');
|
|
127
|
+
else quill.root.setAttribute('data-placeholder', placeholder);
|
|
128
|
+
}, [
|
|
129
|
+
ariaLabel,
|
|
130
|
+
placeholder,
|
|
131
|
+
state.ready
|
|
132
|
+
]);
|
|
133
|
+
return state;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
exports.useQuillEditor = useQuillEditor;
|
|
137
|
+
//# sourceMappingURL=useQuillEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuillEditor.js","sources":["../../../editor/useQuillEditor.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useRef, useState } from 'react';\nimport { QuillConstructor } from './QuillConstructor';\nimport { QuillEditorOptions } from './QuillEditorOptions';\nimport { QuillEditorState } from './QuillEditorState';\nimport { QuillInstance } from './QuillInstance';\nimport { applyHtml } from './applyHtml';\nimport { characterCount } from './characterCount';\nimport { toolbarLayout } from './toolbarLayout';\n\nconst idle: QuillEditorState = { ready: false, failure: undefined, characters: 0 };\n\n/**\n * Builds and owns a Quill editor inside an element React leaves alone.\n *\n * The editor is constructed once per loader and toolbar setting, in a container this hook creates and\n * removes itself. React renders the host with no children, so a re-render can never wipe what Quill built -\n * the failure of rendering the authored HTML as the host's children and then letting Quill take it over.\n *\n * Everything else is applied to the live editor without rebuilding it:\n * - a changed `html` replaces the content silently, and only when the authored value really changed, so a\n * user's edit survives an unrelated property change;\n * - `editable`, the placeholder and the accessible name update in place;\n * - the `text-change` listener is removed, and the toolbar and surface with the container, when the editor\n * is rebuilt or the control unmounts.\n *\n * Only a user edit calls `onUserChange`.\n */\nexport function useQuillEditor(options: QuillEditorOptions): QuillEditorState {\n const { loader, host, html, showHeader, editable, placeholder, ariaLabel } = options;\n const [state, setState] = useState<QuillEditorState>(idle);\n const quillReference = useRef<QuillInstance | undefined>(undefined);\n const appliedHtml = useRef(html);\n const latest = useRef(options);\n latest.current = options;\n\n useEffect(() => {\n const container = host.current;\n if (loader === undefined || container === null) return undefined;\n\n let disposed = false;\n let dispose: (() => void) | undefined;\n\n loader().then(loaded => {\n if (disposed) return;\n const Quill: QuillConstructor = typeof loaded === 'function' ? loaded : loaded.default;\n const surface = container.ownerDocument.createElement('div');\n container.appendChild(surface);\n const quill = new Quill(surface, {\n theme: 'snow',\n modules: { toolbar: showHeader ? toolbarLayout : false },\n placeholder: latest.current.placeholder,\n readOnly: !latest.current.editable,\n });\n\n applyHtml(quill, latest.current.html);\n appliedHtml.current = latest.current.html;\n const changed = (_delta: unknown, _previous: unknown, source: string) => {\n if (source === 'silent') return;\n setState(current => ({ ...current, characters: characterCount(quill) }));\n if (source === 'user') latest.current.onUserChange();\n };\n\n quill.on('text-change', changed);\n quillReference.current = quill;\n dispose = () => {\n quill.off('text-change', changed);\n quillReference.current = undefined;\n container.replaceChildren();\n };\n setState({ ready: true, failure: undefined, characters: characterCount(quill) });\n }).catch((error: unknown) => {\n if (!disposed) setState({ ...idle, failure: error instanceof Error ? error.message : String(error) });\n });\n\n return () => {\n disposed = true;\n dispose?.();\n setState(idle);\n };\n }, [loader, host, showHeader]);\n\n useEffect(() => {\n const quill = quillReference.current;\n if (!state.ready || quill === undefined || html === appliedHtml.current) return;\n appliedHtml.current = html;\n applyHtml(quill, html);\n setState(current => ({ ...current, characters: characterCount(quill) }));\n }, [html, state.ready]);\n\n useEffect(() => {\n const quill = quillReference.current;\n if (!state.ready || quill === undefined) return;\n quill.enable(editable);\n quill.root.setAttribute('aria-readonly', String(!editable));\n const toolbar = quill.getModule('toolbar') as { container?: HTMLElement } | undefined;\n toolbar?.container?.querySelectorAll('button, select').forEach(control => {\n if (editable) control.removeAttribute('disabled'); else control.setAttribute('disabled', '');\n });\n }, [editable, state.ready]);\n\n useEffect(() => {\n const quill = quillReference.current;\n if (!state.ready || quill === undefined) return;\n quill.root.setAttribute('role', 'textbox');\n quill.root.setAttribute('aria-multiline', 'true');\n quill.root.setAttribute('aria-label', ariaLabel);\n if (placeholder === undefined) quill.root.removeAttribute('data-placeholder'); else quill.root.setAttribute('data-placeholder', placeholder);\n }, [ariaLabel, placeholder, state.ready]);\n\n return state;\n}\n"],"names":["idle","ready","failure","undefined","characters","useQuillEditor","options","loader","host","html","showHeader","editable","placeholder","ariaLabel","state","setState","useState","quillReference","useRef","appliedHtml","latest","current","useEffect","container","disposed","dispose","then","loaded","Quill","default","surface","ownerDocument","createElement","appendChild","quill","theme","modules","toolbar","toolbarLayout","readOnly","applyHtml","changed","_delta","_previous","source","characterCount","onUserChange","on","off","replaceChildren","catch","error","Error","message","String","enable","root","setAttribute","getModule","querySelectorAll","forEach","control","removeAttribute"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
6
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
7
|
+
/** Without a provider an upload goes only to the page's own origin and the control makes the request itself. */ const FileUploadContext = react.createContext({
|
|
8
|
+
handler: undefined,
|
|
9
|
+
allowedOrigins: []
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
exports.FileUploadContext = FileUploadContext;
|
|
13
|
+
//# sourceMappingURL=FileUploadContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploadContext.js","sources":["../../../file/FileUploadContext.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { createContext } from 'react';\nimport { FileUploadHandler } from './FileUploadHandler';\n\n/** What a host provides to the file uploads inside it. */\nexport interface FileUploadContextValue {\n /** The host-owned upload effect, when it owns the effect. */\n handler: FileUploadHandler | undefined;\n\n /** The origins, besides the page's own, an upload may be sent to. */\n allowedOrigins: readonly string[];\n}\n\n/** Without a provider an upload goes only to the page's own origin and the control makes the request itself. */\nexport const FileUploadContext = createContext<FileUploadContextValue>({ handler: undefined, allowedOrigins: [] });\n"],"names":["FileUploadContext","createContext","handler","undefined","allowedOrigins"],"mappings":";;;;AAAA;AACA;AAcA,iHACO,MAAMA,iBAAAA,GAAoBC,mBAAAA,CAAsC;IAAEC,OAAAA,EAASC,SAAAA;AAAWC,IAAAA,cAAAA,EAAgB;AAAG,CAAA;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var FileUploadContext = require('./FileUploadContext.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Makes a host's upload effect and origin policy available without coupling the Scene package to that host's
|
|
9
|
+
* server client.
|
|
10
|
+
*/ function FileUploadHandlerProvider({ handler, allowedOrigins = [], children }) {
|
|
11
|
+
const value = react.useMemo(()=>({
|
|
12
|
+
handler,
|
|
13
|
+
allowedOrigins
|
|
14
|
+
}), [
|
|
15
|
+
handler,
|
|
16
|
+
allowedOrigins
|
|
17
|
+
]);
|
|
18
|
+
return /*#__PURE__*/ jsxRuntime.jsx(FileUploadContext.FileUploadContext.Provider, {
|
|
19
|
+
value: value,
|
|
20
|
+
children: children
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.FileUploadHandlerProvider = FileUploadHandlerProvider;
|
|
25
|
+
//# sourceMappingURL=FileUploadHandlerProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploadHandlerProvider.js","sources":["../../../file/FileUploadHandlerProvider.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ReactNode, useMemo } from 'react';\nimport { FileUploadContext } from './FileUploadContext';\nimport { FileUploadHandler } from './FileUploadHandler';\n\nexport interface FileUploadHandlerProviderProps {\n /**\n * The host-owned upload effect available to the enclosed Scene surface. When omitted the control posts the\n * files itself, to the authored address, under the origin policy.\n */\n handler?: FileUploadHandler;\n\n /**\n * Origins besides the page's own that an authored upload address may name, for example\n * `['https://files.example.com']`. An address on any other origin is refused before anything is sent - to\n * the handler as well. Cookies are never sent to these origins.\n */\n allowedOrigins?: readonly string[];\n\n /** The surface whose file uploads the host configures. */\n children: ReactNode;\n}\n\n/**\n * Makes a host's upload effect and origin policy available without coupling the Scene package to that host's\n * server client.\n */\nexport function FileUploadHandlerProvider({ handler, allowedOrigins = [], children }: FileUploadHandlerProviderProps) {\n const value = useMemo(() => ({ handler, allowedOrigins }), [handler, allowedOrigins]);\n return <FileUploadContext.Provider value={value}>{children}</FileUploadContext.Provider>;\n}\n"],"names":["FileUploadHandlerProvider","handler","allowedOrigins","children","value","useMemo","_jsx","FileUploadContext","Provider"],"mappings":";;;;;;AAyBA;;;IAIO,SAASA,yBAAAA,CAA0B,EAAEC,OAAO,EAAEC,cAAAA,GAAiB,EAAE,EAAEC,QAAQ,EAAkC,EAAA;IAChH,MAAMC,KAAAA,GAAQC,aAAAA,CAAQ,KAAO;AAAEJ,YAAAA,OAAAA;AAASC,YAAAA;AAAe,SAAA,CAAA,EAAI;AAACD,QAAAA,OAAAA;AAASC,QAAAA;AAAe,KAAA,CAAA;IACpF,qBAAOI,cAAA,CAACC,oCAAkBC,QAAQ,EAAA;QAACJ,KAAAA,EAAOA,KAAAA;AAAQD,QAAAA,QAAAA,EAAAA;;AACtD;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
/** The canonical operating modes for a file upload control. */ var FileUploadMode = /*#__PURE__*/ function(FileUploadMode) {
|
|
6
|
+
FileUploadMode["Advanced"] = "advanced";
|
|
7
|
+
FileUploadMode["Basic"] = "basic";
|
|
8
|
+
FileUploadMode["Auto"] = "auto";
|
|
9
|
+
return FileUploadMode;
|
|
10
|
+
}({});
|
|
11
|
+
|
|
12
|
+
exports.FileUploadMode = FileUploadMode;
|
|
13
|
+
//# sourceMappingURL=FileUploadMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploadMode.js","sources":["../../../file/FileUploadMode.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n/** The canonical operating modes for a file upload control. */\nexport enum FileUploadMode {\n Advanced = 'advanced',\n Basic = 'basic',\n Auto = 'auto',\n}\n"],"names":["FileUploadMode"],"mappings":";;AAAA;AACA;AAEA,gEACO,IAAKA,cAAAA,iBAAAA,SAAAA,cAAAA,EAAAA;;;;AAAAA,IAAAA,OAAAA,cAAAA;AAIX,CAAA,CAAA,EAAA;;"}
|