@instructure/canvas-rce 7.0.0 → 7.3.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/CHANGELOG.md +60 -1
- package/__tests__/common/indicate.test.js +5 -6
- package/es/bridge/Bridge.js +2 -4
- package/es/canvasFileBrowser/FileBrowser.js +2 -4
- package/es/defaultTinymceConfig.d.ts +1 -1
- package/es/defaultTinymceConfig.js +149 -114
- package/es/enhance-user-content/doc_previews.js +1 -14
- package/es/enhance-user-content/enhance_user_content.js +7 -1
- package/es/enhance-user-content/instructure_helper.js +4 -0
- package/es/enhance-user-content/youtube_overlay.d.ts +1 -0
- package/es/enhance-user-content/youtube_overlay.js +87 -0
- package/es/format-message.d.js +1 -0
- package/es/format-message.js +5 -0
- package/es/index.d.ts +2 -1
- package/es/index.js +2 -1
- package/es/rce/AlertMessageArea.d.ts +2 -2
- package/es/rce/AlertMessageArea.js +4 -6
- package/es/rce/RCE.d.ts +0 -1
- package/es/rce/RCE.js +5 -10
- package/es/rce/RCEGlobals.d.ts +2 -0
- package/es/rce/RCEGlobals.js +1 -0
- package/es/rce/RCEVariants.d.ts +8 -3
- package/es/rce/RCEVariants.js +31 -5
- package/es/rce/RCEWrapper.d.ts +16 -14
- package/es/rce/RCEWrapper.js +260 -244
- package/es/rce/RCEWrapperProps.d.ts +1 -1
- package/es/rce/ShowOnFocusButton/index.js +4 -2
- package/es/rce/StatusBar.js +61 -15
- package/es/rce/alertHandler.js +6 -7
- package/es/rce/plugins/instructure-ui-icons/plugin.js +2 -2
- package/es/rce/plugins/instructure_equation/EquationEditorModal/index.js +6 -10
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.d.ts +5 -15
- package/es/rce/plugins/instructure_icon_maker/components/CreateIconMakerForm/ImageSection/Course.js +4 -10
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.d.ts +7 -0
- package/es/rce/plugins/instructure_image/ImageEmbedOptions.js +45 -2
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/clickCallback.d.ts +2 -0
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/clickCallback.js +45 -0
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/plugin.d.ts +1 -0
- package/es/rce/plugins/instructure_keyboard_shortcuts_header/plugin.js +43 -0
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.d.ts +1 -8
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +13 -33
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.d.ts +1 -2
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialogModal.js +2 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.d.ts +1 -1
- package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolSelectionDialog/ExternalToolSelectionDialog.js +25 -25
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.d.ts +1 -1
- package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +2 -1
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.d.ts +1 -1
- package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +2 -1
- package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +10 -7
- package/es/rce/plugins/instructure_record/mediaTranslations.js +1 -1
- package/es/rce/plugins/instructure_studio_media_options/plugin.js +109 -14
- package/es/rce/plugins/instructure_studio_media_options/studioToolbarIcons.d.ts +5 -0
- package/es/rce/plugins/instructure_studio_media_options/studioToolbarIcons.js +23 -0
- package/es/rce/plugins/instructure_wordcount_header/plugin.d.ts +1 -0
- package/es/rce/plugins/instructure_wordcount_header/plugin.js +75 -0
- package/es/rce/plugins/shared/ContentSelection.d.ts +1 -2
- package/es/rce/plugins/shared/ContentSelection.js +1 -18
- package/es/rce/plugins/shared/DimensionsInput/index.js +3 -3
- package/es/rce/plugins/shared/FixedContentTray.d.ts +7 -23
- package/es/rce/plugins/shared/FixedContentTray.js +7 -16
- package/es/rce/plugins/shared/ImageCropper/constants.d.ts +1 -1
- package/es/rce/plugins/shared/ImageCropper/constants.js +1 -1
- package/es/rce/plugins/shared/ImageCropper/controls/CustomNumberInput.js +1 -1
- package/es/rce/plugins/shared/PreviewIcon.js +1 -1
- package/es/rce/plugins/shared/StudioLtiSupportUtils.d.ts +9 -1
- package/es/rce/plugins/shared/StudioLtiSupportUtils.js +94 -1
- package/es/rce/plugins/shared/Upload/ComputerPanel.js +1 -1
- package/es/rce/plugins/shared/Upload/UploadFileModal.js +37 -4
- package/es/rce/plugins/shared/Upload/VideoUrlPanel.d.ts +15 -0
- package/es/rce/plugins/shared/Upload/VideoUrlPanel.js +51 -0
- package/es/rce/plugins/shared/Upload/videoValidationUtils.d.ts +7 -0
- package/es/rce/plugins/shared/Upload/videoValidationUtils.js +58 -0
- package/es/rce/plugins/shared/ai_tools/aiicons.d.ts +3 -3
- package/es/rce/plugins/shared/ai_tools/aiicons.js +11 -11
- package/es/rce/plugins/shared/iframeUtils.d.ts +1 -0
- package/es/rce/plugins/shared/iframeUtils.js +37 -0
- package/es/rce/plugins/tinymce-a11y-checker/components/checker.js +7 -1
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.d.ts +1 -1
- package/es/rce/plugins/tinymce-a11y-checker/utils/indicate.js +1 -1
- package/es/rce/style.js +19 -17
- package/es/rce/tinyRCE.js +2 -0
- package/es/sidebar/actions/upload.d.ts +1 -0
- package/es/sidebar/actions/upload.js +56 -0
- package/es/sidebar/containers/sidebarHandlers.d.ts +1 -0
- package/es/sidebar/containers/sidebarHandlers.js +2 -1
- package/es/translations/locales/ar.js +44 -11
- package/es/translations/locales/ca.js +47 -14
- package/es/translations/locales/cy.js +44 -11
- package/es/translations/locales/da-x-k12.js +44 -11
- package/es/translations/locales/da.js +44 -11
- package/es/translations/locales/de.js +44 -11
- package/es/translations/locales/el.js +6 -0
- package/es/translations/locales/en-AU-x-unimelb.js +44 -11
- package/es/translations/locales/en-GB-x-ukhe.js +44 -11
- package/es/translations/locales/en.js +47 -11
- package/es/translations/locales/en_AU.js +44 -11
- package/es/translations/locales/en_CA.js +44 -11
- package/es/translations/locales/en_CY.js +44 -11
- package/es/translations/locales/en_GB.js +44 -11
- package/es/translations/locales/es.js +44 -11
- package/es/translations/locales/es_ES.js +44 -11
- package/es/translations/locales/fa_IR.js +6 -6
- package/es/translations/locales/fi.js +44 -11
- package/es/translations/locales/fr.js +44 -11
- package/es/translations/locales/fr_CA.js +49 -16
- package/es/translations/locales/ga.js +61 -28
- package/es/translations/locales/he.js +6 -0
- package/es/translations/locales/hi.js +44 -11
- package/es/translations/locales/ht.js +44 -11
- package/es/translations/locales/hu.js +6 -12
- package/es/translations/locales/hy.js +6 -0
- package/es/translations/locales/id.js +44 -11
- package/es/translations/locales/is.js +44 -11
- package/es/translations/locales/it.js +44 -11
- package/es/translations/locales/ja.js +44 -11
- package/es/translations/locales/ko.js +6 -0
- package/es/translations/locales/mi.js +44 -11
- package/es/translations/locales/ms.js +44 -11
- package/es/translations/locales/nb-x-k12.js +44 -11
- package/es/translations/locales/nb.js +44 -11
- package/es/translations/locales/nl.js +44 -11
- package/es/translations/locales/nn.js +6 -12
- package/es/translations/locales/pl.js +44 -11
- package/es/translations/locales/pt.js +44 -11
- package/es/translations/locales/pt_BR.js +44 -11
- package/es/translations/locales/ru.js +44 -11
- package/es/translations/locales/sl.js +44 -11
- package/es/translations/locales/sv-x-k12.js +44 -11
- package/es/translations/locales/sv.js +44 -11
- package/es/translations/locales/th.js +44 -11
- package/es/translations/locales/tr.js +6 -3
- package/es/translations/locales/uk_UA.js +6 -9
- package/es/translations/locales/vi.js +44 -11
- package/es/translations/locales/zh-Hans.js +44 -11
- package/es/translations/locales/zh-Hant.js +44 -11
- package/es/translations/locales/zh.js +44 -11
- package/es/translations/locales/zh_HK.js +44 -11
- package/es/util/contextHelper.d.ts +7 -0
- package/{testcafe/axe.test.js → es/util/contextHelper.js} +10 -21
- package/es/util/loadingPlaceholder.js +11 -11
- package/eslint.config.js +3 -25
- package/jest/jest-setup.js +27 -2
- package/jest.config.js +5 -1
- package/package.json +61 -84
- package/testcafe/RCEWrapper.test.js +0 -319
- package/testcafe/StatusBar.test.js +0 -108
- package/testcafe/enhanceUserContent.html +0 -58
- package/testcafe/enhanceUserContent.test.js +0 -44
- package/testcafe/entry.jsx +0 -77
- package/testcafe/testcafe.html +0 -14
- package/webpack.testcafe.config.js +0 -61
|
@@ -49,17 +49,17 @@ function renderJoinedItem(bodyAs, renderBody, renderFooter) {
|
|
|
49
49
|
}, renderFooter()))));
|
|
50
50
|
}
|
|
51
51
|
export const FixedContentTray = ({
|
|
52
|
-
title,
|
|
53
|
-
isOpen,
|
|
54
|
-
onDismiss,
|
|
55
|
-
onUnmount,
|
|
52
|
+
title = null,
|
|
53
|
+
isOpen = false,
|
|
54
|
+
onDismiss = () => {},
|
|
55
|
+
onUnmount = () => {},
|
|
56
56
|
mountNode,
|
|
57
57
|
renderHeader,
|
|
58
58
|
renderBody,
|
|
59
59
|
renderFooter,
|
|
60
|
-
bodyAs,
|
|
61
|
-
shouldJoinBodyAndFooter,
|
|
62
|
-
shouldCloseOnDocumentClick
|
|
60
|
+
bodyAs = 'div',
|
|
61
|
+
shouldJoinBodyAndFooter = false,
|
|
62
|
+
shouldCloseOnDocumentClick = true
|
|
63
63
|
}) => {
|
|
64
64
|
return /*#__PURE__*/React.createElement(Tray, {
|
|
65
65
|
"data-mce-component": true,
|
|
@@ -105,13 +105,4 @@ FixedContentTray.propTypes = {
|
|
|
105
105
|
bodyAs: PropTypes.string,
|
|
106
106
|
shouldJoinBodyAndFooter: PropTypes.bool,
|
|
107
107
|
shouldCloseOnDocumentClick: PropTypes.bool
|
|
108
|
-
};
|
|
109
|
-
FixedContentTray.defaultProps = {
|
|
110
|
-
title: null,
|
|
111
|
-
isOpen: false,
|
|
112
|
-
onDismiss: () => {},
|
|
113
|
-
onUnmount: () => {},
|
|
114
|
-
bodyAs: 'div',
|
|
115
|
-
shouldJoinBodyAndFooter: false,
|
|
116
|
-
shouldCloseOnDocumentClick: true
|
|
117
108
|
};
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
export const PREVIEW_BACKGROUND_COLOR = '#
|
|
19
|
+
export const PREVIEW_BACKGROUND_COLOR = '#334451';
|
|
20
20
|
export const PREVIEW_WIDTH = 942;
|
|
21
21
|
export const PREVIEW_HEIGHT = 350;
|
|
22
22
|
export const SHAPE_CONTAINER_LENGTH = 350;
|
|
@@ -37,7 +37,7 @@ export const CustomNumberInput = ({
|
|
|
37
37
|
formatValueCallback,
|
|
38
38
|
onChange
|
|
39
39
|
});
|
|
40
|
-
const handleChange = (
|
|
40
|
+
const handleChange = (_event, newValue) => digestNewValue(newValue.trim());
|
|
41
41
|
const handleBlur = () => digestCurrentValue();
|
|
42
42
|
const handleIncrement = () => onChange(processValueCallback(value + 1));
|
|
43
43
|
const handleDecrement = () => onChange(processValueCallback(value - 1));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EditorEvent, Events } from 'tinymce';
|
|
1
|
+
import { Editor, EditorEvent, Events } from 'tinymce';
|
|
2
2
|
/**
|
|
3
3
|
* Interface for content item's 'custom' field, specifically for what is expected to come from Studio
|
|
4
4
|
*
|
|
@@ -35,3 +35,11 @@ export declare function parseStudioOptions(element: Element | null): ParsedStudi
|
|
|
35
35
|
* underlying iframe has a `data-studio-resizable='false'`
|
|
36
36
|
*/
|
|
37
37
|
export declare function handleBeforeObjectSelected(e: EditorEvent<Events.ObjectSelectedEvent>): void;
|
|
38
|
+
export declare function findStudioLtiIframeFromSelection(selectedNode: Node): HTMLIFrameElement | null;
|
|
39
|
+
export declare const notifyStudioEmbedTypeChange: (editor: Editor, embedType: "thumbnail_embed" | "learn_embed" | "collaboration_embed") => void;
|
|
40
|
+
export type EmbedType = 'thumbnail_embed' | 'learn_embed' | 'collaboration_embed';
|
|
41
|
+
export declare const updateStudioIframeDimensions: (editor: Editor, width: number, height: number, embedType: EmbedType) => void;
|
|
42
|
+
type ValidStudioEmbedType = 'thumbnail_embed' | 'learn_embed' | 'collaboration_embed';
|
|
43
|
+
export declare const isValidEmbedType: (embedType: any) => embedType is ValidStudioEmbedType;
|
|
44
|
+
export declare const isValidDimension: (value: any) => value is number;
|
|
45
|
+
export {};
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import PropTypes, { bool, shape } from 'prop-types';
|
|
20
|
+
import { findMediaPlayerIframe } from './iframeUtils';
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Interface for content item's 'custom' field, specifically for what is expected to come from Studio
|
|
@@ -71,4 +72,96 @@ export function handleBeforeObjectSelected(e) {
|
|
|
71
72
|
if (targetElement.getAttribute('data-mce-p-data-studio-resizable') === 'false') {
|
|
72
73
|
targetElement.setAttribute('data-mce-resize', 'false');
|
|
73
74
|
}
|
|
74
|
-
}
|
|
75
|
+
}
|
|
76
|
+
export function findStudioLtiIframeFromSelection(selectedNode) {
|
|
77
|
+
let outerIframe = null;
|
|
78
|
+
|
|
79
|
+
// First, find the outer iframe
|
|
80
|
+
if (selectedNode.nodeName === 'IFRAME') {
|
|
81
|
+
outerIframe = selectedNode;
|
|
82
|
+
} else if (selectedNode.nodeType === Node.ELEMENT_NODE) {
|
|
83
|
+
// Look for iframe inside the selected element (the span)
|
|
84
|
+
outerIframe = selectedNode.querySelector('iframe');
|
|
85
|
+
}
|
|
86
|
+
if (!outerIframe) {
|
|
87
|
+
console.error('No outer iframe found');
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Now try to access the content document of the outer iframe
|
|
92
|
+
try {
|
|
93
|
+
const outerIframeDoc = outerIframe.contentDocument || outerIframe.contentWindow?.document;
|
|
94
|
+
if (!outerIframeDoc) {
|
|
95
|
+
return outerIframe; // Return outer iframe as fallback
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Search for nested iframe with data-lti-launch attribute
|
|
99
|
+
const nestedIframe = outerIframeDoc.querySelector('iframe[data-lti-launch="true"]');
|
|
100
|
+
if (nestedIframe) {
|
|
101
|
+
return nestedIframe;
|
|
102
|
+
} else {
|
|
103
|
+
// Try to find any iframe inside
|
|
104
|
+
const anyNestedIframe = outerIframeDoc.querySelector('iframe');
|
|
105
|
+
if (anyNestedIframe) {
|
|
106
|
+
return anyNestedIframe;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} catch (error) {
|
|
110
|
+
console.error('>> Cannot access outer iframe content (cross-origin):', error);
|
|
111
|
+
// Return the outer iframe as fallback since we can't access its contents
|
|
112
|
+
return outerIframe;
|
|
113
|
+
}
|
|
114
|
+
return outerIframe;
|
|
115
|
+
}
|
|
116
|
+
export const notifyStudioEmbedTypeChange = (editor, embedType) => {
|
|
117
|
+
const studioIframe = findStudioLtiIframeFromSelection(editor.selection.getNode());
|
|
118
|
+
if (studioIframe && studioIframe.contentWindow) {
|
|
119
|
+
studioIframe.contentWindow.postMessage({
|
|
120
|
+
subject: 'studio.embedTypeChanged',
|
|
121
|
+
embedType: embedType,
|
|
122
|
+
timestamp: Date.now()
|
|
123
|
+
}, '*');
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
export const updateStudioIframeDimensions = (editor, width, height, embedType) => {
|
|
127
|
+
const selectedNode = editor.selection.getNode();
|
|
128
|
+
const videoContainer = findMediaPlayerIframe(selectedNode);
|
|
129
|
+
if (videoContainer?.tagName !== 'IFRAME') {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const tinymceIframeShim = videoContainer.parentElement;
|
|
133
|
+
if (!tinymceIframeShim) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
editor.dom.setStyles(tinymceIframeShim, {
|
|
137
|
+
width: `${width}px`,
|
|
138
|
+
height: `${height}px`
|
|
139
|
+
});
|
|
140
|
+
editor.dom.setStyles(videoContainer, {
|
|
141
|
+
width: `${width}px`,
|
|
142
|
+
height: `${height}px`
|
|
143
|
+
});
|
|
144
|
+
const href = editor.dom.getAttrib(tinymceIframeShim, 'data-mce-p-src');
|
|
145
|
+
if (href && embedType) {
|
|
146
|
+
if (embedType) {
|
|
147
|
+
// Replace thumbnail_embed, learn_embed, or collaboration_embed with the new embed type
|
|
148
|
+
const updatedHref = href.replace(/(thumbnail_embed|learn_embed|collaboration_embed)/g, embedType);
|
|
149
|
+
|
|
150
|
+
// updating only mce-p-src as in we only want to update the real src whenever we step out of the editor or save it
|
|
151
|
+
editor.dom.setAttrib(tinymceIframeShim, 'data-mce-p-src', updatedHref);
|
|
152
|
+
editor.nodeChanged();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
editor.fire('ObjectResized', {
|
|
156
|
+
// @ts-expect-error - needed for aligning tooltip with new iframe size
|
|
157
|
+
target: videoContainer,
|
|
158
|
+
width,
|
|
159
|
+
height
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
export const isValidEmbedType = embedType => {
|
|
163
|
+
return typeof embedType === 'string' && ['thumbnail_embed', 'learn_embed', 'collaboration_embed'].includes(embedType);
|
|
164
|
+
};
|
|
165
|
+
export const isValidDimension = value => {
|
|
166
|
+
return typeof value === 'number' && !isNaN(value) && isFinite(value) && value > 0;
|
|
167
|
+
};
|
|
@@ -238,7 +238,7 @@ export default function ComputerPanel({
|
|
|
238
238
|
});
|
|
239
239
|
},
|
|
240
240
|
renderIcon: IconTrashLine,
|
|
241
|
-
screenReaderLabel: formatMessage('
|
|
241
|
+
screenReaderLabel: formatMessage('Remove {filename}', {
|
|
242
242
|
filename
|
|
243
243
|
})
|
|
244
244
|
})), /*#__PURE__*/React.createElement(Flex.Item, {
|
|
@@ -31,9 +31,11 @@ import ImageOptionsForm from '../ImageOptionsForm';
|
|
|
31
31
|
import UsageRightsSelectBox from './UsageRightsSelectBox';
|
|
32
32
|
import { View } from '@instructure/ui-view';
|
|
33
33
|
import { UploadCanvasPanelIds, CanvasPanelTitles } from '../canvasContentUtils';
|
|
34
|
+
import { validateVideoUrl } from './videoValidationUtils';
|
|
34
35
|
const CanvasContentPanel = /*#__PURE__*/React.lazy(() => import('./CanvasContentPanel'));
|
|
35
36
|
const ComputerPanel = /*#__PURE__*/React.lazy(() => import('./ComputerPanel'));
|
|
36
37
|
const UrlPanel = /*#__PURE__*/React.lazy(() => import('./UrlPanel'));
|
|
38
|
+
const VideoUrlPanel = /*#__PURE__*/React.lazy(() => import('./VideoUrlPanel'));
|
|
37
39
|
function shouldBeDisabled({
|
|
38
40
|
fileUrl,
|
|
39
41
|
theFile,
|
|
@@ -46,6 +48,7 @@ function shouldBeDisabled({
|
|
|
46
48
|
case 'COMPUTER':
|
|
47
49
|
return !theFile || theFile.error;
|
|
48
50
|
case 'URL':
|
|
51
|
+
case 'VIDEO_URL':
|
|
49
52
|
return !fileUrl;
|
|
50
53
|
default:
|
|
51
54
|
if (UploadCanvasPanelIds.includes(selectedPanel)) return !fileUrl;
|
|
@@ -133,8 +136,17 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef(({
|
|
|
133
136
|
if (submitDisabled || uploading) {
|
|
134
137
|
return false;
|
|
135
138
|
}
|
|
139
|
+
let finalFileUrl = fileUrl;
|
|
140
|
+
if (selectedPanel === 'VIDEO_URL' && finalFileUrl) {
|
|
141
|
+
const validation = validateVideoUrl(finalFileUrl);
|
|
142
|
+
if (!validation.isValid) {
|
|
143
|
+
setError('Invalid video URL');
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
finalFileUrl = validation.embedUrl;
|
|
147
|
+
}
|
|
136
148
|
onSubmit(editor, accept, selectedPanel, {
|
|
137
|
-
fileUrl,
|
|
149
|
+
fileUrl: finalFileUrl,
|
|
138
150
|
theFile,
|
|
139
151
|
imageOptions: {
|
|
140
152
|
altText,
|
|
@@ -155,7 +167,7 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef(({
|
|
|
155
167
|
}), /*#__PURE__*/React.createElement(Heading, null, label)), /*#__PURE__*/React.createElement(Modal.Body, {
|
|
156
168
|
ref: ref
|
|
157
169
|
}, /*#__PURE__*/React.createElement(Tabs, {
|
|
158
|
-
onRequestTabChange: (
|
|
170
|
+
onRequestTabChange: (_event, {
|
|
159
171
|
index
|
|
160
172
|
}) => handleRequestTabChange(index)
|
|
161
173
|
}, panels.map(panel => {
|
|
@@ -197,7 +209,28 @@ const UploadFileModal = /*#__PURE__*/React.forwardRef(({
|
|
|
197
209
|
})
|
|
198
210
|
}, /*#__PURE__*/React.createElement(UrlPanel, {
|
|
199
211
|
fileUrl: fileUrl,
|
|
200
|
-
setFileUrl: setFileUrl
|
|
212
|
+
setFileUrl: setFileUrl,
|
|
213
|
+
urlHasError: !!error
|
|
214
|
+
})));
|
|
215
|
+
case 'VIDEO_URL':
|
|
216
|
+
return /*#__PURE__*/React.createElement(Tabs.Panel, {
|
|
217
|
+
key: panel,
|
|
218
|
+
renderTitle: function () {
|
|
219
|
+
return formatMessage('Video URL');
|
|
220
|
+
},
|
|
221
|
+
isSelected: selectedPanel === 'VIDEO_URL'
|
|
222
|
+
}, /*#__PURE__*/React.createElement(Suspense, {
|
|
223
|
+
fallback: /*#__PURE__*/React.createElement(Spinner, {
|
|
224
|
+
renderTitle: formatMessage('Loading'),
|
|
225
|
+
size: "large"
|
|
226
|
+
})
|
|
227
|
+
}, /*#__PURE__*/React.createElement(VideoUrlPanel, {
|
|
228
|
+
fileUrl: fileUrl,
|
|
229
|
+
setFileUrl: url => {
|
|
230
|
+
setError(null);
|
|
231
|
+
setFileUrl(url);
|
|
232
|
+
},
|
|
233
|
+
urlHasError: !!error
|
|
201
234
|
})));
|
|
202
235
|
default:
|
|
203
236
|
if (UploadCanvasPanelIds.includes(panel)) {
|
|
@@ -274,7 +307,7 @@ UploadFileModal.propTypes = {
|
|
|
274
307
|
canvasOrigin: string,
|
|
275
308
|
onSubmit: func,
|
|
276
309
|
onDismiss: func.isRequired,
|
|
277
|
-
panels: arrayOf(oneOf(['COMPUTER', 'URL', ...UploadCanvasPanelIds])),
|
|
310
|
+
panels: arrayOf(oneOf(['COMPUTER', 'URL', 'VIDEO_URL', ...UploadCanvasPanelIds])),
|
|
278
311
|
label: string.isRequired,
|
|
279
312
|
accept: oneOfType([arrayOf(string), string]),
|
|
280
313
|
modalBodyWidth: number,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare function VideoUrlPanel({ fileUrl, setFileUrl, urlHasError }: {
|
|
2
|
+
fileUrl: any;
|
|
3
|
+
setFileUrl: any;
|
|
4
|
+
urlHasError: any;
|
|
5
|
+
}): React.JSX.Element;
|
|
6
|
+
declare namespace VideoUrlPanel {
|
|
7
|
+
namespace propTypes {
|
|
8
|
+
export let fileUrl: import("prop-types").Validator<string>;
|
|
9
|
+
export let setFileUrl: import("prop-types").Validator<(...args: any[]) => any>;
|
|
10
|
+
export { bool as urlHasError };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export default VideoUrlPanel;
|
|
14
|
+
import React from 'react';
|
|
15
|
+
import { bool } from 'prop-types';
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2025 - present Instructure, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of Canvas.
|
|
5
|
+
*
|
|
6
|
+
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
+
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
+
* Software Foundation, version 3 of the License.
|
|
9
|
+
*
|
|
10
|
+
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
+
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
+
* details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
+
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import React from 'react';
|
|
20
|
+
import { string, func, bool } from 'prop-types';
|
|
21
|
+
import { TextInput } from '@instructure/ui-text-input';
|
|
22
|
+
import formatMessage from '../../../../format-message';
|
|
23
|
+
export default function VideoUrlPanel({
|
|
24
|
+
fileUrl,
|
|
25
|
+
setFileUrl,
|
|
26
|
+
urlHasError
|
|
27
|
+
}) {
|
|
28
|
+
const handleChange = (_e, val) => {
|
|
29
|
+
setFileUrl(val);
|
|
30
|
+
};
|
|
31
|
+
const getErrorMessage = () => {
|
|
32
|
+
if (!urlHasError) return [];
|
|
33
|
+
return [{
|
|
34
|
+
text: formatMessage('Please enter a valid video URL from a supported platform.'),
|
|
35
|
+
type: 'newError'
|
|
36
|
+
}];
|
|
37
|
+
};
|
|
38
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TextInput, {
|
|
39
|
+
name: "video-url",
|
|
40
|
+
renderLabel: formatMessage('YouTube embed URL'),
|
|
41
|
+
type: "text",
|
|
42
|
+
value: fileUrl,
|
|
43
|
+
onChange: handleChange,
|
|
44
|
+
messages: getErrorMessage()
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
VideoUrlPanel.propTypes = {
|
|
48
|
+
fileUrl: string.isRequired,
|
|
49
|
+
setFileUrl: func.isRequired,
|
|
50
|
+
urlHasError: bool
|
|
51
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2020 - present Instructure, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of Canvas.
|
|
5
|
+
*
|
|
6
|
+
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
+
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
+
* Software Foundation, version 3 of the License.
|
|
9
|
+
*
|
|
10
|
+
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
+
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
+
* details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
+
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
function validateAndExtractYouTubeUrl(input) {
|
|
20
|
+
if (!input || typeof input !== 'string') {
|
|
21
|
+
return {
|
|
22
|
+
isValid: false,
|
|
23
|
+
embedUrl: null
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const trimmedInput = input.trim();
|
|
27
|
+
const patterns = [/^(?:https?:\/\/)?(?:www\.|m\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]+)(?:[&?][^\s]*)?$/, /^(?:https?:\/\/)?(?:www\.)?youtube\.com\/embed\/([a-zA-Z0-9_-]+)(?:[?][^\s]*)?$/, /<iframe[^>]*src=["'](?:https?:\/\/)?(?:www\.)?youtube\.com\/embed\/([a-zA-Z0-9_-]+)[^"']*["'][^>]*>/];
|
|
28
|
+
for (const pattern of patterns) {
|
|
29
|
+
const match = trimmedInput.match(pattern);
|
|
30
|
+
if (match && match[1]) {
|
|
31
|
+
const videoId = match[1];
|
|
32
|
+
return {
|
|
33
|
+
isValid: true,
|
|
34
|
+
embedUrl: `https://www.youtube.com/embed/${videoId}`
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
isValid: false,
|
|
40
|
+
embedUrl: null
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function validateVideoUrl(input) {
|
|
44
|
+
if (!input || typeof input !== 'string') {
|
|
45
|
+
return {
|
|
46
|
+
isValid: false,
|
|
47
|
+
embedUrl: null
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const youTubeRegexp = /(?:https?:\/\/)?(?:www\.|m\.)?(?:youtube\.com|youtu\.be)/i;
|
|
51
|
+
if (youTubeRegexp.test(input)) {
|
|
52
|
+
return validateAndExtractYouTubeUrl(input);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
isValid: false,
|
|
56
|
+
embedUrl: null
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
declare const AIWandSVG = "<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<mask id=\"mask0_5548_26552\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"18\" height=\"18\">\n<path d=\"M8.48511 5.85958C8.34447 5.71049 8.11666 5.71049 7.97603 5.85958L6.54795 7.3735C6.40731 7.52256 6.40731 7.76409 6.54795 7.91315L8.75896 10.2571L8.75968 10.2582L8.76075 10.259L15.9574 17.8882C16.0277 17.9627 16.1198 18 16.2119 18C16.304 18 16.3961 17.9627 16.4664 17.8882L17.8945 16.3743C18.0352 16.2252 18.0352 15.9837 17.8945 15.8346L8.48511 5.85958ZM8.23057 6.66907L9.93327 8.47413L9.01436 9.44848L7.31157 7.64331L8.23057 6.66907ZM16.2119 17.0787L9.52344 9.98813L10.4423 9.01378L17.1309 16.1044L16.2119 17.0787Z\" fill=\"#
|
|
2
|
-
declare const InsertSVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M16.9455 16.9451H12.375V18H18V12.375H16.9455V16.9451Z\" fill=\"#
|
|
1
|
+
declare const AIWandSVG = "<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<mask id=\"mask0_5548_26552\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"18\" height=\"18\">\n<path d=\"M8.48511 5.85958C8.34447 5.71049 8.11666 5.71049 7.97603 5.85958L6.54795 7.3735C6.40731 7.52256 6.40731 7.76409 6.54795 7.91315L8.75896 10.2571L8.75968 10.2582L8.76075 10.259L15.9574 17.8882C16.0277 17.9627 16.1198 18 16.2119 18C16.304 18 16.3961 17.9627 16.4664 17.8882L17.8945 16.3743C18.0352 16.2252 18.0352 15.9837 17.8945 15.8346L8.48511 5.85958ZM8.23057 6.66907L9.93327 8.47413L9.01436 9.44848L7.31157 7.64331L8.23057 6.66907ZM16.2119 17.0787L9.52344 9.98813L10.4423 9.01378L17.1309 16.1044L16.2119 17.0787Z\" fill=\"#273540\"/>\n<path d=\"M6.9677 4.52528C6.98177 4.52716 6.99581 4.52789 7.00988 4.52789C7.13082 4.52789 7.24473 4.46343 7.3119 4.35423L7.89726 3.3986L8.97165 3.3688C9.10875 3.3647 9.23182 3.27899 9.28912 3.14703C9.34641 3.01511 9.32815 2.86005 9.242 2.74714L8.56629 1.86119L8.8711 0.769191C8.91013 0.629809 8.87074 0.479228 8.77021 0.380468C8.66999 0.281678 8.52444 0.251498 8.39683 0.304431L7.39345 0.712163L6.50783 0.0674013C6.395 -0.0153617 6.24769 -0.0224389 6.12816 0.0491233C6.00862 0.119925 5.93726 0.256733 5.94426 0.401699L6.00018 1.53956L5.14798 2.23316C5.03898 2.32151 4.98731 2.46759 5.01402 2.61033C5.04075 2.75272 5.1413 2.86675 5.27383 2.90442L6.31166 3.19959L6.67062 4.27372C6.71633 4.4105 6.83164 4.50815 6.9677 4.52528ZM6.16471 2.36772L6.58872 2.0226C6.68292 1.94618 6.73531 1.82543 6.72932 1.7002L6.70157 1.13443L7.14172 1.45495C7.23946 1.52614 7.36393 1.54216 7.47466 1.49672L7.97354 1.29396L7.822 1.83698C7.78827 1.95773 7.81287 2.08781 7.88741 2.18546L8.2235 2.62601L7.68912 2.64089C7.57063 2.64425 7.46131 2.70912 7.39662 2.81458L7.10552 3.28978L6.92693 2.75571C6.88753 2.63718 6.79542 2.54699 6.68083 2.51455L6.16471 2.36772Z\" fill=\"#273540\"/>\n<path d=\"M5.00785 9.67232L5.31265 8.58029C5.35166 8.4409 5.31229 8.29032 5.21174 8.19156C5.11119 8.0928 4.96636 8.06262 4.83838 8.11553L3.83536 8.52329L2.94939 7.8785C2.83617 7.79614 2.68853 7.78904 2.56968 7.86025C2.45015 7.93105 2.37878 8.06783 2.38582 8.21282L2.44171 9.35068L1.5895 10.0443C1.48054 10.1326 1.42884 10.2787 1.45557 10.4215C1.48227 10.5638 1.58283 10.6779 1.71538 10.7155L2.75358 11.0107L3.11251 12.0845C3.15822 12.2212 3.27353 12.3189 3.40959 12.336C3.42366 12.3379 3.43773 12.3386 3.45179 12.3386C3.57273 12.3386 3.68664 12.2742 3.75379 12.1649L4.33915 11.2097L5.41354 11.1799C5.55067 11.1758 5.6737 11.0901 5.731 10.9582C5.78833 10.8262 5.77004 10.6712 5.68391 10.5582L5.00785 9.67232ZM4.13101 10.452C4.01255 10.4554 3.90319 10.5202 3.8385 10.6257L3.54741 11.1009L3.36881 10.5668C3.32945 10.4483 3.23734 10.3581 3.12271 10.3257L2.6066 10.1788L3.03024 9.83369C3.12448 9.7573 3.17687 9.63655 3.17088 9.51133L3.1431 8.94517L3.58363 9.26608C3.68137 9.33764 3.80581 9.35329 3.91655 9.30781L4.41509 9.10506L4.26356 9.6481C4.22982 9.76886 4.25443 9.89894 4.32894 9.99659L4.66541 10.4371L4.13101 10.452Z\" fill=\"#273540\"/>\n<path d=\"M1.96063 6.47752C1.97467 6.47936 1.98874 6.48012 2.00281 6.48012C2.12375 6.48012 2.23765 6.41563 2.3048 6.30643L2.89016 5.35083L3.96458 5.321C4.10168 5.3169 4.22472 5.23119 4.28204 5.09923C4.33934 4.96731 4.32105 4.81225 4.23492 4.69934L3.55922 3.81343L3.86402 2.72139C3.90303 2.58201 3.86366 2.43143 3.76311 2.33267C3.66292 2.23391 3.51701 2.2037 3.38975 2.25663L2.38637 2.66437L1.50076 2.0196C1.38754 1.93687 1.24095 1.92976 1.12106 2.00133C1.00152 2.07216 0.930156 2.20894 0.937191 2.3539L0.993081 3.49176L0.140875 4.18536C0.0319077 4.27371 -0.0197896 4.41982 0.00694182 4.56256C0.0336457 4.70493 0.134199 4.81898 0.266753 4.85662L1.30459 5.15179L1.66355 6.22592C1.70923 6.3627 1.82457 6.46035 1.96063 6.47752ZM1.15764 4.31992L1.58161 3.9748C1.67585 3.89838 1.72824 3.77763 1.72225 3.6524L1.69447 3.08666L2.13464 3.40718C2.23274 3.47872 2.35718 3.49439 2.46759 3.44892L2.96646 3.24616L2.81493 3.78918C2.78119 3.90996 2.8058 4.04001 2.88031 4.13766L3.21643 4.57821L2.68204 4.59312C2.56356 4.59646 2.45421 4.66132 2.38954 4.76678L2.09842 5.24198L1.91983 4.70791C1.88046 4.58938 1.78835 4.49919 1.67373 4.46676L1.15764 4.31992Z\" fill=\"#273540\"/>\n</mask>\n<g mask=\"url(#mask0_5548_26552)\">\n<rect width=\"18\" height=\"18\" fill=\"currentColor\"/>\n</g>\n</svg>\n";
|
|
2
|
+
declare const InsertSVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path d=\"M16.9455 16.9451H12.375V18H18V12.375H16.9455V16.9451Z\" fill=\"#273540\"/>\n <path d=\"M1.05487 1.0545H5.625V0H0V5.625H1.0545L1.05487 1.0545Z\" fill=\"#273540\"/>\n <path d=\"M12.375 0V1.0545H16.9455V5.625H18V0H12.375Z\" fill=\"#273540\"/>\n <path d=\"M1.05487 12.375H0V18H5.625V16.9451H1.05487V12.375Z\" fill=\"#273540\"/>\n <path d=\"M3.59082 14.4093H14.4099V3.59058H3.59082V14.4093ZM4.64532 4.64508H13.3551V13.3548H4.64532V4.64508Z\" fill=\"#273540\"/>\n <path d=\"M9.52752 6.92065H8.47302V8.47278H6.9209V9.52728H8.47302V11.0794H9.52752V9.52728H11.0796V8.47278H9.52752V6.92065Z\" fill=\"#273540\"/>\n</svg>";
|
|
3
3
|
declare const CopySVG: any;
|
|
4
4
|
declare const RefreshSVG: any;
|
|
5
|
-
declare const DislikeSVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.17647 7.41176L3.2353 7.41176L3.2353 6.35294C2.65189 6.35294 2.17647 5.87859 2.17647 5.29411C2.17647 4.70964 2.65189 4.23529 3.2353 4.23529L4.29412 4.23529L4.29412 3.17647C3.71071 3.17647 3.2353 2.70211 3.2353 2.11764C3.2353 1.53317 3.71071 1.05882 4.29412 1.05882L13.2941 1.05882C14.7532 1.05882 15.9412 2.24576 15.9412 3.70588L15.9412 9.52941L14.9417 9.52941C13.6277 9.52941 12.3698 10.0694 11.4888 11.0086C10.2267 12.3554 8.738 14.4445 8.54953 16.9412L8.20859 16.9412C7.7353 16.9412 7.28953 16.7315 6.98671 16.3652C6.68071 15.9946 6.55683 15.5107 6.64788 15.0385C6.86071 13.9267 7.21224 12.8255 7.69083 11.7656C7.91424 11.2733 7.87188 10.71 7.58071 10.2568C7.28635 9.80153 6.78659 9.52941 6.24341 9.52941L2.17647 9.52941C1.59306 9.52941 1.11765 9.05506 1.11765 8.47059C1.11765 7.88611 1.59306 7.41176 2.17647 7.41176ZM0.0588235 8.47059C0.0588234 9.63847 1.00859 10.5882 2.17647 10.5882L6.24341 10.5882C6.42765 10.5882 6.59071 10.6761 6.69024 10.8307C6.78765 10.9821 6.80141 11.1642 6.72624 11.3294C6.21377 12.4645 5.83682 13.6461 5.60706 14.8405C5.45776 15.624 5.66212 16.4255 6.17035 17.0396C6.67541 17.6495 7.41871 18 8.20859 18L9.58824 18L9.58824 17.4706C9.58824 15.0851 11.042 13.0341 12.2607 11.7328C12.9426 11.0065 13.9199 10.5882 14.9416 10.5882L17 10.5882L17 3.70588C17 1.66235 15.3376 -1.45327e-07 13.2941 -3.23979e-07L4.29412 -1.11078e-06C3.12624 -1.21288e-06 2.17647 0.949763 2.17647 2.11765C2.17647 2.55282 2.30882 2.95835 2.53435 3.29506C1.71059 3.58518 1.11765 4.37188 1.11765 5.29412C1.11765 5.72929 1.25 6.13482 1.47553 6.47153C0.651767 6.76164 0.0588235 7.54835 0.0588235 8.47059Z\" fill=\"#
|
|
5
|
+
declare const DislikeSVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.17647 7.41176L3.2353 7.41176L3.2353 6.35294C2.65189 6.35294 2.17647 5.87859 2.17647 5.29411C2.17647 4.70964 2.65189 4.23529 3.2353 4.23529L4.29412 4.23529L4.29412 3.17647C3.71071 3.17647 3.2353 2.70211 3.2353 2.11764C3.2353 1.53317 3.71071 1.05882 4.29412 1.05882L13.2941 1.05882C14.7532 1.05882 15.9412 2.24576 15.9412 3.70588L15.9412 9.52941L14.9417 9.52941C13.6277 9.52941 12.3698 10.0694 11.4888 11.0086C10.2267 12.3554 8.738 14.4445 8.54953 16.9412L8.20859 16.9412C7.7353 16.9412 7.28953 16.7315 6.98671 16.3652C6.68071 15.9946 6.55683 15.5107 6.64788 15.0385C6.86071 13.9267 7.21224 12.8255 7.69083 11.7656C7.91424 11.2733 7.87188 10.71 7.58071 10.2568C7.28635 9.80153 6.78659 9.52941 6.24341 9.52941L2.17647 9.52941C1.59306 9.52941 1.11765 9.05506 1.11765 8.47059C1.11765 7.88611 1.59306 7.41176 2.17647 7.41176ZM0.0588235 8.47059C0.0588234 9.63847 1.00859 10.5882 2.17647 10.5882L6.24341 10.5882C6.42765 10.5882 6.59071 10.6761 6.69024 10.8307C6.78765 10.9821 6.80141 11.1642 6.72624 11.3294C6.21377 12.4645 5.83682 13.6461 5.60706 14.8405C5.45776 15.624 5.66212 16.4255 6.17035 17.0396C6.67541 17.6495 7.41871 18 8.20859 18L9.58824 18L9.58824 17.4706C9.58824 15.0851 11.042 13.0341 12.2607 11.7328C12.9426 11.0065 13.9199 10.5882 14.9416 10.5882L17 10.5882L17 3.70588C17 1.66235 15.3376 -1.45327e-07 13.2941 -3.23979e-07L4.29412 -1.11078e-06C3.12624 -1.21288e-06 2.17647 0.949763 2.17647 2.11765C2.17647 2.55282 2.30882 2.95835 2.53435 3.29506C1.71059 3.58518 1.11765 4.37188 1.11765 5.29412C1.11765 5.72929 1.25 6.13482 1.47553 6.47153C0.651767 6.76164 0.0588235 7.54835 0.0588235 8.47059Z\" fill=\"#273540\"/>\n</svg>";
|
|
6
6
|
declare const AIAvatarSVG = "\n<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g id=\"Avatar - AI\">\n<rect id=\"Rectangle 2318\" x=\"0.5\" y=\"0.5\" width=\"39\" height=\"39\" rx=\"19.5\" fill=\"white\" stroke=\"#C7CDD1\"/>\n<rect id=\"Untitled-4 1\" x=\"8\" y=\"9\" width=\"24\" height=\"23.4915\" fill=\"url(#pattern0_5509_72095)\"/>\n</g>\n<defs>\n<pattern id=\"pattern0_5509_72095\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n<use xlink:href=\"#image0_5509_72095\" transform=\"scale(0.0313 0.0313)\"/>\n</pattern>\n<image id=\"image0_5509_72095\" data-name=\"Untitled-4.png\" width=\"32\" height=\"32\" xlink:href=\"data:image/png;base64,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\"/>\n</defs>\n</svg>\n";
|
|
7
7
|
export { AIWandSVG, AIAvatarSVG, InsertSVG, CopySVG, RefreshSVG, DislikeSVG };
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
import { IconCopyLine, IconRefreshLine } from '@instructure/ui-icons/es/svg';
|
|
21
21
|
const AIWandSVG = `<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
22
22
|
<mask id="mask0_5548_26552" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="18" height="18">
|
|
23
|
-
<path d="M8.48511 5.85958C8.34447 5.71049 8.11666 5.71049 7.97603 5.85958L6.54795 7.3735C6.40731 7.52256 6.40731 7.76409 6.54795 7.91315L8.75896 10.2571L8.75968 10.2582L8.76075 10.259L15.9574 17.8882C16.0277 17.9627 16.1198 18 16.2119 18C16.304 18 16.3961 17.9627 16.4664 17.8882L17.8945 16.3743C18.0352 16.2252 18.0352 15.9837 17.8945 15.8346L8.48511 5.85958ZM8.23057 6.66907L9.93327 8.47413L9.01436 9.44848L7.31157 7.64331L8.23057 6.66907ZM16.2119 17.0787L9.52344 9.98813L10.4423 9.01378L17.1309 16.1044L16.2119 17.0787Z" fill="#
|
|
24
|
-
<path d="M6.9677 4.52528C6.98177 4.52716 6.99581 4.52789 7.00988 4.52789C7.13082 4.52789 7.24473 4.46343 7.3119 4.35423L7.89726 3.3986L8.97165 3.3688C9.10875 3.3647 9.23182 3.27899 9.28912 3.14703C9.34641 3.01511 9.32815 2.86005 9.242 2.74714L8.56629 1.86119L8.8711 0.769191C8.91013 0.629809 8.87074 0.479228 8.77021 0.380468C8.66999 0.281678 8.52444 0.251498 8.39683 0.304431L7.39345 0.712163L6.50783 0.0674013C6.395 -0.0153617 6.24769 -0.0224389 6.12816 0.0491233C6.00862 0.119925 5.93726 0.256733 5.94426 0.401699L6.00018 1.53956L5.14798 2.23316C5.03898 2.32151 4.98731 2.46759 5.01402 2.61033C5.04075 2.75272 5.1413 2.86675 5.27383 2.90442L6.31166 3.19959L6.67062 4.27372C6.71633 4.4105 6.83164 4.50815 6.9677 4.52528ZM6.16471 2.36772L6.58872 2.0226C6.68292 1.94618 6.73531 1.82543 6.72932 1.7002L6.70157 1.13443L7.14172 1.45495C7.23946 1.52614 7.36393 1.54216 7.47466 1.49672L7.97354 1.29396L7.822 1.83698C7.78827 1.95773 7.81287 2.08781 7.88741 2.18546L8.2235 2.62601L7.68912 2.64089C7.57063 2.64425 7.46131 2.70912 7.39662 2.81458L7.10552 3.28978L6.92693 2.75571C6.88753 2.63718 6.79542 2.54699 6.68083 2.51455L6.16471 2.36772Z" fill="#
|
|
25
|
-
<path d="M5.00785 9.67232L5.31265 8.58029C5.35166 8.4409 5.31229 8.29032 5.21174 8.19156C5.11119 8.0928 4.96636 8.06262 4.83838 8.11553L3.83536 8.52329L2.94939 7.8785C2.83617 7.79614 2.68853 7.78904 2.56968 7.86025C2.45015 7.93105 2.37878 8.06783 2.38582 8.21282L2.44171 9.35068L1.5895 10.0443C1.48054 10.1326 1.42884 10.2787 1.45557 10.4215C1.48227 10.5638 1.58283 10.6779 1.71538 10.7155L2.75358 11.0107L3.11251 12.0845C3.15822 12.2212 3.27353 12.3189 3.40959 12.336C3.42366 12.3379 3.43773 12.3386 3.45179 12.3386C3.57273 12.3386 3.68664 12.2742 3.75379 12.1649L4.33915 11.2097L5.41354 11.1799C5.55067 11.1758 5.6737 11.0901 5.731 10.9582C5.78833 10.8262 5.77004 10.6712 5.68391 10.5582L5.00785 9.67232ZM4.13101 10.452C4.01255 10.4554 3.90319 10.5202 3.8385 10.6257L3.54741 11.1009L3.36881 10.5668C3.32945 10.4483 3.23734 10.3581 3.12271 10.3257L2.6066 10.1788L3.03024 9.83369C3.12448 9.7573 3.17687 9.63655 3.17088 9.51133L3.1431 8.94517L3.58363 9.26608C3.68137 9.33764 3.80581 9.35329 3.91655 9.30781L4.41509 9.10506L4.26356 9.6481C4.22982 9.76886 4.25443 9.89894 4.32894 9.99659L4.66541 10.4371L4.13101 10.452Z" fill="#
|
|
26
|
-
<path d="M1.96063 6.47752C1.97467 6.47936 1.98874 6.48012 2.00281 6.48012C2.12375 6.48012 2.23765 6.41563 2.3048 6.30643L2.89016 5.35083L3.96458 5.321C4.10168 5.3169 4.22472 5.23119 4.28204 5.09923C4.33934 4.96731 4.32105 4.81225 4.23492 4.69934L3.55922 3.81343L3.86402 2.72139C3.90303 2.58201 3.86366 2.43143 3.76311 2.33267C3.66292 2.23391 3.51701 2.2037 3.38975 2.25663L2.38637 2.66437L1.50076 2.0196C1.38754 1.93687 1.24095 1.92976 1.12106 2.00133C1.00152 2.07216 0.930156 2.20894 0.937191 2.3539L0.993081 3.49176L0.140875 4.18536C0.0319077 4.27371 -0.0197896 4.41982 0.00694182 4.56256C0.0336457 4.70493 0.134199 4.81898 0.266753 4.85662L1.30459 5.15179L1.66355 6.22592C1.70923 6.3627 1.82457 6.46035 1.96063 6.47752ZM1.15764 4.31992L1.58161 3.9748C1.67585 3.89838 1.72824 3.77763 1.72225 3.6524L1.69447 3.08666L2.13464 3.40718C2.23274 3.47872 2.35718 3.49439 2.46759 3.44892L2.96646 3.24616L2.81493 3.78918C2.78119 3.90996 2.8058 4.04001 2.88031 4.13766L3.21643 4.57821L2.68204 4.59312C2.56356 4.59646 2.45421 4.66132 2.38954 4.76678L2.09842 5.24198L1.91983 4.70791C1.88046 4.58938 1.78835 4.49919 1.67373 4.46676L1.15764 4.31992Z" fill="#
|
|
23
|
+
<path d="M8.48511 5.85958C8.34447 5.71049 8.11666 5.71049 7.97603 5.85958L6.54795 7.3735C6.40731 7.52256 6.40731 7.76409 6.54795 7.91315L8.75896 10.2571L8.75968 10.2582L8.76075 10.259L15.9574 17.8882C16.0277 17.9627 16.1198 18 16.2119 18C16.304 18 16.3961 17.9627 16.4664 17.8882L17.8945 16.3743C18.0352 16.2252 18.0352 15.9837 17.8945 15.8346L8.48511 5.85958ZM8.23057 6.66907L9.93327 8.47413L9.01436 9.44848L7.31157 7.64331L8.23057 6.66907ZM16.2119 17.0787L9.52344 9.98813L10.4423 9.01378L17.1309 16.1044L16.2119 17.0787Z" fill="#273540"/>
|
|
24
|
+
<path d="M6.9677 4.52528C6.98177 4.52716 6.99581 4.52789 7.00988 4.52789C7.13082 4.52789 7.24473 4.46343 7.3119 4.35423L7.89726 3.3986L8.97165 3.3688C9.10875 3.3647 9.23182 3.27899 9.28912 3.14703C9.34641 3.01511 9.32815 2.86005 9.242 2.74714L8.56629 1.86119L8.8711 0.769191C8.91013 0.629809 8.87074 0.479228 8.77021 0.380468C8.66999 0.281678 8.52444 0.251498 8.39683 0.304431L7.39345 0.712163L6.50783 0.0674013C6.395 -0.0153617 6.24769 -0.0224389 6.12816 0.0491233C6.00862 0.119925 5.93726 0.256733 5.94426 0.401699L6.00018 1.53956L5.14798 2.23316C5.03898 2.32151 4.98731 2.46759 5.01402 2.61033C5.04075 2.75272 5.1413 2.86675 5.27383 2.90442L6.31166 3.19959L6.67062 4.27372C6.71633 4.4105 6.83164 4.50815 6.9677 4.52528ZM6.16471 2.36772L6.58872 2.0226C6.68292 1.94618 6.73531 1.82543 6.72932 1.7002L6.70157 1.13443L7.14172 1.45495C7.23946 1.52614 7.36393 1.54216 7.47466 1.49672L7.97354 1.29396L7.822 1.83698C7.78827 1.95773 7.81287 2.08781 7.88741 2.18546L8.2235 2.62601L7.68912 2.64089C7.57063 2.64425 7.46131 2.70912 7.39662 2.81458L7.10552 3.28978L6.92693 2.75571C6.88753 2.63718 6.79542 2.54699 6.68083 2.51455L6.16471 2.36772Z" fill="#273540"/>
|
|
25
|
+
<path d="M5.00785 9.67232L5.31265 8.58029C5.35166 8.4409 5.31229 8.29032 5.21174 8.19156C5.11119 8.0928 4.96636 8.06262 4.83838 8.11553L3.83536 8.52329L2.94939 7.8785C2.83617 7.79614 2.68853 7.78904 2.56968 7.86025C2.45015 7.93105 2.37878 8.06783 2.38582 8.21282L2.44171 9.35068L1.5895 10.0443C1.48054 10.1326 1.42884 10.2787 1.45557 10.4215C1.48227 10.5638 1.58283 10.6779 1.71538 10.7155L2.75358 11.0107L3.11251 12.0845C3.15822 12.2212 3.27353 12.3189 3.40959 12.336C3.42366 12.3379 3.43773 12.3386 3.45179 12.3386C3.57273 12.3386 3.68664 12.2742 3.75379 12.1649L4.33915 11.2097L5.41354 11.1799C5.55067 11.1758 5.6737 11.0901 5.731 10.9582C5.78833 10.8262 5.77004 10.6712 5.68391 10.5582L5.00785 9.67232ZM4.13101 10.452C4.01255 10.4554 3.90319 10.5202 3.8385 10.6257L3.54741 11.1009L3.36881 10.5668C3.32945 10.4483 3.23734 10.3581 3.12271 10.3257L2.6066 10.1788L3.03024 9.83369C3.12448 9.7573 3.17687 9.63655 3.17088 9.51133L3.1431 8.94517L3.58363 9.26608C3.68137 9.33764 3.80581 9.35329 3.91655 9.30781L4.41509 9.10506L4.26356 9.6481C4.22982 9.76886 4.25443 9.89894 4.32894 9.99659L4.66541 10.4371L4.13101 10.452Z" fill="#273540"/>
|
|
26
|
+
<path d="M1.96063 6.47752C1.97467 6.47936 1.98874 6.48012 2.00281 6.48012C2.12375 6.48012 2.23765 6.41563 2.3048 6.30643L2.89016 5.35083L3.96458 5.321C4.10168 5.3169 4.22472 5.23119 4.28204 5.09923C4.33934 4.96731 4.32105 4.81225 4.23492 4.69934L3.55922 3.81343L3.86402 2.72139C3.90303 2.58201 3.86366 2.43143 3.76311 2.33267C3.66292 2.23391 3.51701 2.2037 3.38975 2.25663L2.38637 2.66437L1.50076 2.0196C1.38754 1.93687 1.24095 1.92976 1.12106 2.00133C1.00152 2.07216 0.930156 2.20894 0.937191 2.3539L0.993081 3.49176L0.140875 4.18536C0.0319077 4.27371 -0.0197896 4.41982 0.00694182 4.56256C0.0336457 4.70493 0.134199 4.81898 0.266753 4.85662L1.30459 5.15179L1.66355 6.22592C1.70923 6.3627 1.82457 6.46035 1.96063 6.47752ZM1.15764 4.31992L1.58161 3.9748C1.67585 3.89838 1.72824 3.77763 1.72225 3.6524L1.69447 3.08666L2.13464 3.40718C2.23274 3.47872 2.35718 3.49439 2.46759 3.44892L2.96646 3.24616L2.81493 3.78918C2.78119 3.90996 2.8058 4.04001 2.88031 4.13766L3.21643 4.57821L2.68204 4.59312C2.56356 4.59646 2.45421 4.66132 2.38954 4.76678L2.09842 5.24198L1.91983 4.70791C1.88046 4.58938 1.78835 4.49919 1.67373 4.46676L1.15764 4.31992Z" fill="#273540"/>
|
|
27
27
|
</mask>
|
|
28
28
|
<g mask="url(#mask0_5548_26552)">
|
|
29
29
|
<rect width="18" height="18" fill="currentColor"/>
|
|
@@ -31,17 +31,17 @@ const AIWandSVG = `<svg width="18" height="18" viewBox="0 0 18 18" fill="none" x
|
|
|
31
31
|
</svg>
|
|
32
32
|
`;
|
|
33
33
|
const InsertSVG = `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
|
|
34
|
-
<path d="M16.9455 16.9451H12.375V18H18V12.375H16.9455V16.9451Z" fill="#
|
|
35
|
-
<path d="M1.05487 1.0545H5.625V0H0V5.625H1.0545L1.05487 1.0545Z" fill="#
|
|
36
|
-
<path d="M12.375 0V1.0545H16.9455V5.625H18V0H12.375Z" fill="#
|
|
37
|
-
<path d="M1.05487 12.375H0V18H5.625V16.9451H1.05487V12.375Z" fill="#
|
|
38
|
-
<path d="M3.59082 14.4093H14.4099V3.59058H3.59082V14.4093ZM4.64532 4.64508H13.3551V13.3548H4.64532V4.64508Z" fill="#
|
|
39
|
-
<path d="M9.52752 6.92065H8.47302V8.47278H6.9209V9.52728H8.47302V11.0794H9.52752V9.52728H11.0796V8.47278H9.52752V6.92065Z" fill="#
|
|
34
|
+
<path d="M16.9455 16.9451H12.375V18H18V12.375H16.9455V16.9451Z" fill="#273540"/>
|
|
35
|
+
<path d="M1.05487 1.0545H5.625V0H0V5.625H1.0545L1.05487 1.0545Z" fill="#273540"/>
|
|
36
|
+
<path d="M12.375 0V1.0545H16.9455V5.625H18V0H12.375Z" fill="#273540"/>
|
|
37
|
+
<path d="M1.05487 12.375H0V18H5.625V16.9451H1.05487V12.375Z" fill="#273540"/>
|
|
38
|
+
<path d="M3.59082 14.4093H14.4099V3.59058H3.59082V14.4093ZM4.64532 4.64508H13.3551V13.3548H4.64532V4.64508Z" fill="#273540"/>
|
|
39
|
+
<path d="M9.52752 6.92065H8.47302V8.47278H6.9209V9.52728H8.47302V11.0794H9.52752V9.52728H11.0796V8.47278H9.52752V6.92065Z" fill="#273540"/>
|
|
40
40
|
</svg>`;
|
|
41
41
|
const CopySVG = IconCopyLine?.src;
|
|
42
42
|
const RefreshSVG = IconRefreshLine?.src;
|
|
43
43
|
const DislikeSVG = `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18" fill="none">
|
|
44
|
-
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.17647 7.41176L3.2353 7.41176L3.2353 6.35294C2.65189 6.35294 2.17647 5.87859 2.17647 5.29411C2.17647 4.70964 2.65189 4.23529 3.2353 4.23529L4.29412 4.23529L4.29412 3.17647C3.71071 3.17647 3.2353 2.70211 3.2353 2.11764C3.2353 1.53317 3.71071 1.05882 4.29412 1.05882L13.2941 1.05882C14.7532 1.05882 15.9412 2.24576 15.9412 3.70588L15.9412 9.52941L14.9417 9.52941C13.6277 9.52941 12.3698 10.0694 11.4888 11.0086C10.2267 12.3554 8.738 14.4445 8.54953 16.9412L8.20859 16.9412C7.7353 16.9412 7.28953 16.7315 6.98671 16.3652C6.68071 15.9946 6.55683 15.5107 6.64788 15.0385C6.86071 13.9267 7.21224 12.8255 7.69083 11.7656C7.91424 11.2733 7.87188 10.71 7.58071 10.2568C7.28635 9.80153 6.78659 9.52941 6.24341 9.52941L2.17647 9.52941C1.59306 9.52941 1.11765 9.05506 1.11765 8.47059C1.11765 7.88611 1.59306 7.41176 2.17647 7.41176ZM0.0588235 8.47059C0.0588234 9.63847 1.00859 10.5882 2.17647 10.5882L6.24341 10.5882C6.42765 10.5882 6.59071 10.6761 6.69024 10.8307C6.78765 10.9821 6.80141 11.1642 6.72624 11.3294C6.21377 12.4645 5.83682 13.6461 5.60706 14.8405C5.45776 15.624 5.66212 16.4255 6.17035 17.0396C6.67541 17.6495 7.41871 18 8.20859 18L9.58824 18L9.58824 17.4706C9.58824 15.0851 11.042 13.0341 12.2607 11.7328C12.9426 11.0065 13.9199 10.5882 14.9416 10.5882L17 10.5882L17 3.70588C17 1.66235 15.3376 -1.45327e-07 13.2941 -3.23979e-07L4.29412 -1.11078e-06C3.12624 -1.21288e-06 2.17647 0.949763 2.17647 2.11765C2.17647 2.55282 2.30882 2.95835 2.53435 3.29506C1.71059 3.58518 1.11765 4.37188 1.11765 5.29412C1.11765 5.72929 1.25 6.13482 1.47553 6.47153C0.651767 6.76164 0.0588235 7.54835 0.0588235 8.47059Z" fill="#
|
|
44
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.17647 7.41176L3.2353 7.41176L3.2353 6.35294C2.65189 6.35294 2.17647 5.87859 2.17647 5.29411C2.17647 4.70964 2.65189 4.23529 3.2353 4.23529L4.29412 4.23529L4.29412 3.17647C3.71071 3.17647 3.2353 2.70211 3.2353 2.11764C3.2353 1.53317 3.71071 1.05882 4.29412 1.05882L13.2941 1.05882C14.7532 1.05882 15.9412 2.24576 15.9412 3.70588L15.9412 9.52941L14.9417 9.52941C13.6277 9.52941 12.3698 10.0694 11.4888 11.0086C10.2267 12.3554 8.738 14.4445 8.54953 16.9412L8.20859 16.9412C7.7353 16.9412 7.28953 16.7315 6.98671 16.3652C6.68071 15.9946 6.55683 15.5107 6.64788 15.0385C6.86071 13.9267 7.21224 12.8255 7.69083 11.7656C7.91424 11.2733 7.87188 10.71 7.58071 10.2568C7.28635 9.80153 6.78659 9.52941 6.24341 9.52941L2.17647 9.52941C1.59306 9.52941 1.11765 9.05506 1.11765 8.47059C1.11765 7.88611 1.59306 7.41176 2.17647 7.41176ZM0.0588235 8.47059C0.0588234 9.63847 1.00859 10.5882 2.17647 10.5882L6.24341 10.5882C6.42765 10.5882 6.59071 10.6761 6.69024 10.8307C6.78765 10.9821 6.80141 11.1642 6.72624 11.3294C6.21377 12.4645 5.83682 13.6461 5.60706 14.8405C5.45776 15.624 5.66212 16.4255 6.17035 17.0396C6.67541 17.6495 7.41871 18 8.20859 18L9.58824 18L9.58824 17.4706C9.58824 15.0851 11.042 13.0341 12.2607 11.7328C12.9426 11.0065 13.9199 10.5882 14.9416 10.5882L17 10.5882L17 3.70588C17 1.66235 15.3376 -1.45327e-07 13.2941 -3.23979e-07L4.29412 -1.11078e-06C3.12624 -1.21288e-06 2.17647 0.949763 2.17647 2.11765C2.17647 2.55282 2.30882 2.95835 2.53435 3.29506C1.71059 3.58518 1.11765 4.37188 1.11765 5.29412C1.11765 5.72929 1.25 6.13482 1.47553 6.47153C0.651767 6.76164 0.0588235 7.54835 0.0588235 8.47059Z" fill="#273540"/>
|
|
45
45
|
</svg>`;
|
|
46
46
|
const AIAvatarSVG = `
|
|
47
47
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function findMediaPlayerIframe(elem: Element | null): Element | null;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2025 - present Instructure, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of Canvas.
|
|
5
|
+
*
|
|
6
|
+
* Canvas is free software: you can redistribute it and/or modify it under
|
|
7
|
+
* the terms of the GNU Affero General Public License as published by the Free
|
|
8
|
+
* Software Foundation, version 3 of the License.
|
|
9
|
+
*
|
|
10
|
+
* Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
11
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
12
|
+
* A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
13
|
+
* details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU Affero General Public License along
|
|
16
|
+
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export function findMediaPlayerIframe(elem) {
|
|
20
|
+
if (!elem) return null;
|
|
21
|
+
if (elem.tagName === 'IFRAME') {
|
|
22
|
+
// we have the iframe
|
|
23
|
+
return elem;
|
|
24
|
+
}
|
|
25
|
+
if (elem.firstElementChild?.tagName === 'IFRAME') {
|
|
26
|
+
// we have the shim tinymce puts around the iframe
|
|
27
|
+
return elem.firstElementChild;
|
|
28
|
+
}
|
|
29
|
+
if (elem.classList.contains('mce-shim')) {
|
|
30
|
+
// tinymce puts a <span class='mce-shin'> after the iframe (since v5, I think)
|
|
31
|
+
const prevSibling = elem.previousSibling;
|
|
32
|
+
if (prevSibling && 'tagName' in prevSibling && prevSibling.tagName === 'IFRAME') {
|
|
33
|
+
return prevSibling;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
@@ -115,6 +115,9 @@ export default class Checker extends React.Component {
|
|
|
115
115
|
errors: [],
|
|
116
116
|
errorIndex: 0
|
|
117
117
|
}, () => {
|
|
118
|
+
window.webkit?.messageHandlers?.modalPresentation?.postMessage?.({
|
|
119
|
+
open: true
|
|
120
|
+
});
|
|
118
121
|
if (typeof this.state.config.beforeCheck === 'function') {
|
|
119
122
|
this.state.config.beforeCheck(this.props.editor, () => {
|
|
120
123
|
this._check(() => {
|
|
@@ -292,7 +295,10 @@ export default class Checker extends React.Component {
|
|
|
292
295
|
this.setState({
|
|
293
296
|
open: false
|
|
294
297
|
}, () => {
|
|
295
|
-
this.props
|
|
298
|
+
this.props?.onClose();
|
|
299
|
+
window.webkit?.messageHandlers?.modalPresentation?.postMessage?.({
|
|
300
|
+
open: false
|
|
301
|
+
});
|
|
296
302
|
});
|
|
297
303
|
}
|
|
298
304
|
render() {
|
|
@@ -3,5 +3,5 @@ export function buildDepthSelector(elem: any): string;
|
|
|
3
3
|
export function findChildDepth(parent: any, target: any): number;
|
|
4
4
|
export function ensureA11yCheckerStyleElement(doc: any): any;
|
|
5
5
|
export default function indicate(elem: any): void;
|
|
6
|
-
export const INDICATOR_STYLE: "\noutline:2px solid #
|
|
6
|
+
export const INDICATOR_STYLE: "\noutline:2px solid #273540;\noutline-offset:2px;\n";
|
|
7
7
|
export const A11Y_CHECKER_STYLE_ELEM_ID: "a11y-checker-style";
|