diff --git a/ckeditor/translations/ti.js b/ckeditor/translations/ti.js deleted file mode 100644 index ec0a54ea..00000000 --- a/ckeditor/translations/ti.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){const t=e.ti=e.ti||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require Fn)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align center":"ናብ ማእኸል ኣመዓራርይ","Align left":"ንጸጋም ኣመዓራርይ","Align right":"ንየማን ኣመዓራርይ",Aquamarine:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Black:"",Blue:"",Bold:"ቦልድ","Bold text":"ጽሑፍ ኣጉልህ","Break text":"","Bulleted List":"ብምልክት ዝተመልከቱ ዝርዝራት","Bulleted list styles toolbar":"",Cancel:"ንጸግ","Caption for image: %0":"","Caption for the image":"","Centered image":"","Change image text alternative":"","Choose heading":"ርእሲ ምረጽ",Circle:"",Clear:"ደምስስ","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"ኮድ","Content editing keystrokes":"","Create link":"መራኽቦ ፍጠር",Custom:"","Custom image size":"",Decimal:"","Decimal with leading zero":"","Decrease list item indent":"","Dim grey":"",Disc:"",Downloadable:"ዝረግፍ","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"መራኽቦ ኣርም","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor menu bar":"","Editor toolbar":"","Enter image caption":"","Entering a to-do list":"","Error during image upload":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","From computer":"","Full size image":"",Green:"",Grey:"",Heading:"ርእሲ","Heading 1":"ርእሲ 1","Heading 2":"ርእሲ 2","Heading 3":"ርእሲ 3","Heading 4":"ርእሲ 4","Heading 5":"ርእሲ 5","Heading 6":"ርእሲ 6","Help Contents. To close this dialog press ESC.":"",HEX:"",Image:"","Image from computer":"ስእሊ ካብ ኮምፕዩተር","Image resize list":"","Image toolbar":"መኸወኒ ስእሊ","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase list item indent":"","Insert image":"ስእሊ ኣእትው","Insert image via URL":"","Insert via URL":"","Invalid start index value.":"",Italic:"ኢታሊክ","Italic text":"ኢታሊክ ጽሑፍ",Justify:"ብማዕረ መጠን ናብ ኩሉ ኣንፈት ኣመዓራርይ","Keystrokes that can be used in a list":"","Leaving a to-do list":"","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"መራኽቦ","Link image":"","Link URL":"","Link URL must not be empty.":"","List properties":"","Lower-latin":"","Lower–roman":"",MENU_BAR_MENU_EDIT:"ኣርም",MENU_BAR_MENU_FILE:"ፋይል",MENU_BAR_MENU_FONT:"ፎንት",MENU_BAR_MENU_FORMAT:"ፎርማት",MENU_BAR_MENU_HELP:"ሓገዝ",MENU_BAR_MENU_INSERT:"የእትው",MENU_BAR_MENU_TEXT:"ቴክስት",MENU_BAR_MENU_TOOLS:"መኸወንቲ",MENU_BAR_MENU_VIEW:"ተመልከት","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the menu bar, navigate between menu bars":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Navigate through the toolbar or menu bar":"",Next:"ቀጻሊ","No results found":"","No searchable items":"","Numbered List":"ብቁጽሪ ዝተመልከቱ ዝርዝራት","Numbered list styles toolbar":"","Open in a new tab":"","Open link in new tab":"ንመራኽቦ ኣብ ሓዱሽ ታብ ክፈት","Open the accessibility help dialog":"",Orange:"",Original:"",Paragraph:"ዓንቀጽ",'Please enter a valid color (e.g. "ff0000").':"","Press %0 for help.":"",Previous:"ሕሉፍ",Purple:"",Red:"",Redo:"ደጊምካ ከውን","Remove color":"ሕብሪ ኣወግድ","Replace from computer":"ካብ ኮምፕዩተር ተክእ","Replace image":"ስእሊ ተክእ","Replace image from computer":"ንስእሊ ካብ ኮምፕዩተር ተክእ ","Resize image":"መጠን ስእሊ ቀይር","Resize image (in %0)":"","Resize image to %0":"","Resize image to the original size":"","Restore default":"","Reversed order":"","Rich Text Editor":"","Right aligned image":"",Save:"ጠቁብ","Show more items":"","Side image":"",Square:"","Start at":"","Start index must be greater than 0.":"",Strikethrough:"ሰርዝ","Strikethrough text":"ጽሑፍ ሰርዝ",Subscript:"ሳብስክሪፕት",Superscript:"ሱፐርስክሪፕት","Text alignment":"ምዕረያ ጽሑፍ","Text alignment toolbar":"መካወኒ ምዕረያ ጽሑፍ","Text alternative":"","The value must not be empty.":"","The value should be a plain number.":"","These keyboard shortcuts allow for quick access to content editing features.":"","This link has no URL":"","To-do List":"","Toggle caption off":"","Toggle caption on":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"",Turquoise:"","Type or paste your content here.":"ኣብዚ ቦታ ጽሑፍካ ጸሓፍ ወይ ጠቅዕ","Type your title":"ርእሲ ጽሑፍካ ጸሓፍ",Underline:"ኣስምር","Underline text":"ጽሑፍ ኣስምር",Undo:"ዝተኸወነ ምለስ",Unlink:"መራኽቦ ኣወግድ","Update image URL":"","Upload failed":"ምድያብ ፈሺሉ","Upload from computer":"ካብ ኮምፕዩተር ኣደይብ","Upload image from computer":"ንስእሊ ካብ ኮምፕዩተር ኣደይብ ","Uploading image":"","Upper-latin":"","Upper-roman":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"","Via URL":"",White:"","Wrap text":"",Yellow:"","You have no image upload permissions.":""}),t.getPluralForm=function(e){return e>1}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})); \ No newline at end of file diff --git a/language/ar.js b/language/ar.js index 31242e96..4f5f4d70 100644 --- a/language/ar.js +++ b/language/ar.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'تعديل الصورة', saveLabel: 'حفظ', cancelLabel: 'إلغاء', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'إعادة التعيين إلى النسخة الأصلية', loadingImageEditor: 'تحميل محرر الصور، يرجى الانتظار...', selectFiletoUpload: 'حدد ملفا لتحميله', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'ألصق رابط اليوتيوب أو عنوان مصدر الفيديو الاخر', uploadAudioTitle: 'رفع ملف الصوت', uploadVideoTitle: 'رفع ملف الفيديو', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'ادراج', cancel: 'الغاء', height: 'ارتفاع', diff --git a/language/bs.js b/language/bs.js index f8b94b97..88c7b584 100644 --- a/language/bs.js +++ b/language/bs.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Uredite sliku', saveLabel: 'Sačuvati', cancelLabel: 'Otkazati', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Resetirati na original', loadingImageEditor: 'Učitava se editor za sliku, molimo sačekajte...', selectFiletoUpload: 'Označite fajl za upload', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Prenesite YouTube link ili izvorni URL audio fajla', uploadAudioTitle: 'Upload audio fajla', uploadVideoTitle: 'Upload video fajla', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Ubaciti', cancel: 'Otkazati', height: 'visina', diff --git a/language/cs.js b/language/cs.js index 706dad9a..250a0f58 100644 --- a/language/cs.js +++ b/language/cs.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: 'Upravit obrázek', saveLabel: 'Uložit', cancelLabel: 'Zrušit', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Obnovit původní', loadingImageEditor: 'Načítání editoru obrázků, počkejte prosím...', selectFiletoUpload: 'Vyberte soubor, který chcete nahrát', @@ -54,8 +56,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Vložte odkaz na YouTube nebo jinou adresu URL zdroje videa', uploadAudioTitle: 'Nahrajte zvukový soubor', uploadVideoTitle: 'Nahrajte soubor videa', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Vložit', cancel: 'Zrušit', height: 'výška', diff --git a/language/de.js b/language/de.js index 0c0c3521..34bec95b 100644 --- a/language/de.js +++ b/language/de.js @@ -46,6 +46,8 @@ H5PEditor.language.core = { editImage: 'Bild bearbeiten', saveLabel: 'Speichern', cancelLabel: 'Abbrechen', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Auf Original zurücksetzen', loadingImageEditor: 'Lade Bildeditor, bitte warten...', selectFiletoUpload: 'Datei zum Hochladen auswählen', @@ -56,8 +58,13 @@ H5PEditor.language.core = { enterVideoTitle: 'YouTube-Link oder andere Video-URL einfügen', uploadAudioTitle: 'Audio-Datei hochladen', uploadVideoTitle: 'Video-Datei hochladen', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P unterstützt alle externen Videoquellen, die das mp4-, webm- or ogv-Format haben, wie Vimeo Pro, und unterstützt YouTube- und Panopto-Links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Einfügen', cancel: 'Abbrechen', height: 'Höhe', diff --git a/language/el.js b/language/el.js index 6633fd5c..03699a4b 100644 --- a/language/el.js +++ b/language/el.js @@ -46,6 +46,8 @@ H5PEditor.language.core = { editImage: 'Επεξεργασία εικόνας', saveLabel: 'Αποθήκευση', cancelLabel: 'ακύρωση', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Επαναφορά στο πρωτότυπο', loadingImageEditor: 'Φόρτωση επεξεργαστή εικόνας, παρακαλούμε περιμένετε...', selectFiletoUpload: 'Επιλέξτε αρχείο προς μεταφόρτωση', @@ -56,8 +58,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Επικολλήστε σύνδεσμο YouTube ή άλλη διεύθυνση URL βίντεο', uploadAudioTitle: 'Μεταφορτώστε αρχείο ήχου', uploadVideoTitle: 'Μεταφορτώστε αρχείο video', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Εισαγωγή', cancel: 'Ακύρωση', height: 'ύψος', diff --git a/language/en.js b/language/en.js index 7cae6bb4..52b0a399 100644 --- a/language/en.js +++ b/language/en.js @@ -17,8 +17,40 @@ H5PEditor.language.core = { addFile: 'Add file', removeFile: 'Remove file', confirmRemoval: 'Are you sure you wish to remove this :type?', - removeImage: 'Remove image', - confirmImageRemoval: 'This will remove your image. Are you sure you wish to proceed?', + browseFiles: "Browse files", + removeImage: 'Delete Image?', + confirmImageRemoval: 'Are you sure you want to delete this image?', + dragAndDropAndPasteImage: 'Drag and drop image file to upload or paste by :keyCombination', + dragAndDropAndPasteReplaceImage: 'Drag or paste image file here to replace', + dropImage: 'Drop image file here to upload', + uploadImage: 'Upload Image', + uploadingImage: 'Uploading the image, please wait.', + replaceImage: 'Replace Image?', + confirmReplaceImage: 'Are you sure you want to replace this image?', + onlyPasteImageFiles: 'You may only paste image files.', + replaceAudio: 'Replace Audio?', + replaceVideo: 'Replace Video?', + confirmReplaceAudio: 'Are you sure you want to replace this audio?', + confirmReplaceVideo: 'Are you sure you want to replace this video?', + uploadVideo: 'Upload Video', + uploadAudio: 'Upload Audio', + uploadOr: 'or', + dragAndDropAndPasteVideo: 'Drag and drop video file here to upload or paste by :keyCombination', + dragAndDropAndPasteAudio: 'Drag and drop audio file here to upload or paste by :keyCombination', + pasteVideoLink: 'Paste YouTube link or other video source', + pasteAudioLink: 'Paste link or other audio source URL', + dropVideo: 'Drop video file here to upload', + dropAudio: 'Drop audio file here to upload', + enterVideoLink: 'Enter a video link', + enterAudioLink: 'Enter an audio link', + insertUrl: 'Insert URL', + replaceUrl: 'Replace URL', + ctrlKey: 'ctrl', + commandKey: '⌘', + pasteKey: 'v', + supportedVideoFormats: 'H5P supports the following external video sources: Youtube, Panopto and Vimeo.', + dragAndDropToReplaceVideo: 'Drag and drop video file here to replace', + dragAndDropToReplaceAudio: 'Drag and drop audio file here to replace', changeFile: 'Change file', changeLibrary: 'Change content type?', semanticsError: 'Semantics error: :error', @@ -43,7 +75,11 @@ H5PEditor.language.core = { noSemantics: 'Error, could not load the content type form.', editImage: 'Edit image', saveLabel: 'Save', + image: 'Image', cancelLabel: 'Cancel', + deleteLabel: 'Delete', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Reset to original', loadingImageEditor: 'Loading image editor, please wait...', selectFiletoUpload: 'Select file to upload', @@ -54,7 +90,12 @@ H5PEditor.language.core = { enterVideoTitle: 'Paste YouTube link or other video source URL', uploadAudioTitle: 'Upload audio file', uploadVideoTitle: 'Upload video file', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Insert', cancel: 'Cancel', height: 'height', diff --git a/language/es-cr.js b/language/es-cr.js index 9a7109f2..4d87bdb8 100644 --- a/language/es-cr.js +++ b/language/es-cr.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Editar imagen', saveLabel: 'Guardar', cancelLabel: 'Cancelar', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Restablecer el original', loadingImageEditor: 'Cargando editor de imagen, por favor espere...', selectFiletoUpload: 'Seleccione el fichero a subir', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Peque el link de Youtube o la URL de la fuente del video', uploadAudioTitle: 'Subir fichero de audio', uploadVideoTitle: 'Subir fichero de video', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Insertar', cancel: 'Cancelar', height: 'altura', diff --git a/language/es-mx.js b/language/es-mx.js index 299521ed..58d168fe 100644 --- a/language/es-mx.js +++ b/language/es-mx.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Editar imagen', saveLabel: 'Guardar', cancelLabel: 'Cancelar', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Restablecer el original', loadingImageEditor: 'Cargando editor de imagen, por favor espere...', selectFiletoUpload: 'Seleccione el archivo a subir', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Peque el link de Youtube o la URL de la fuente del video', uploadAudioTitle: 'Subir archivo de audio', uploadVideoTitle: 'Subir archivo de video', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Insertar', cancel: 'Cancelar', height: 'altura', diff --git a/language/es.js b/language/es.js index 59685856..8af75e35 100644 --- a/language/es.js +++ b/language/es.js @@ -17,8 +17,34 @@ H5PEditor.language.core = { addFile: 'Añadir archivo', removeFile: 'Eliminar archivo', confirmRemoval: '¿Estás seguro de que quieres eliminar este :type?', - removeImage: 'Eliminar imagen', - confirmImageRemoval: 'Esto eliminará la imagen. ¿Seguro que desea continuar?', + browseFiles: "Búsqueda de archivos", + removeImage: '¿Eliminar imagen?', + confirmImageRemoval: '¿Estás seguro que deseas eliminar esta imagen?', + dragAndDropAndPasteImage: 'Arrastra y suelta la imagen aquí para subirla o pégala usando :keyCombination', + dragAndDropAndPasteReplaceImage: 'Arrastra o pega la imagen aquí para reemplazar', + dropImage: "Suelta la imagen aquí para subirla", + uploadImage: 'Subir imagen', + uploadingImage: 'Subiendo la imagen, por favor, espera.', + replaceImage: '¿Reemplazar imagen?', + confirmReplaceImage: '¿Estás seguro de que deseas reemplazar esta imagen?', + onlyPasteImageFiles: 'Solo puedes pegar archivos de imagen.', + uploadVideo: 'Subir Video', + uploadAudio: 'Subir Audio', + uploadOr: 'o', + dragAndDropAndPasteVideo: 'Arrastra o pega el video aquí para subirlo o pégalo usando :keyCombination', + dragAndDropAndPasteAudio: 'Arrastra o pega el audio aquí para subirlo o pégalo usando :keyCombination', + pasteVideoLink: 'Pega el enlace de YouTube u otro enlace de video', + pasteAudioLink: 'Pega el enlace u otra fuente del audio', + dropVideo: 'Arrastra el video aquí para subirlo', + dropAudio: 'Arrastra el audio aquí para subirlo', + enterVideoLink: 'Inserta el enlace del video', + enterAudioLink: 'Inserta el enlace del audio', + insertUrl: 'Insertar enlace', + replaceUrl: 'Reemplazar enlace', + ctrlKey: 'ctrl', + commandKey: '⌘', + pasteKey: 'v', + supportedVideoFormats: 'H5P soporta las siguientes fuentes de vídeo: Youtube, Panopto y Vimeo.', changeFile: 'Cambiar archivo', changeLibrary: 'Cambiar el tipo de contenido', semanticsError: 'Error en semántica: :error', @@ -44,7 +70,11 @@ H5PEditor.language.core = { noSemantics: 'Error, no se ha podido cargar el formulario del tipo de contenido.', editImage: 'Editar imagen', saveLabel: 'Guardar', + image: 'Imagen', cancelLabel: 'Cancelar', + deleteLabel: 'Eliminar', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Restablecer el original', loadingImageEditor: 'Cargando editor de imagen, por favor espere...', selectFiletoUpload: 'Selecciona el fichero a subir', @@ -55,8 +85,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Peque el link de Youtube o la URL de la fuente del video', uploadAudioTitle: 'Subir fichero de audio', uploadVideoTitle: 'Subir fichero de video', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Insertar', cancel: 'Cancelar', height: 'altura', diff --git a/language/et.js b/language/et.js index 88698e9a..1fd3ffb3 100644 --- a/language/et.js +++ b/language/et.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Töötle pilti', saveLabel: 'Salvesta', cancelLabel: 'Tühista', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Lähtesta algsele kujule', loadingImageEditor: 'Pildiredigeerija laadimine, palun oota...', selectFiletoUpload: 'Vali fail, mida üles laadida', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Kleebi lähtevideo link', uploadAudioTitle: 'Laadi helifail üles', uploadVideoTitle: 'Laadi videofail üles', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Aseta', cancel: 'Tühista', height: 'kõrgus', diff --git a/language/eu.js b/language/eu.js index fdf3c35a..0ef86bbe 100644 --- a/language/eu.js +++ b/language/eu.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Editatu irudia', saveLabel: 'Gorde', cancelLabel: 'Utzi', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Berrezarri jatorrizkoa', loadingImageEditor: 'Irudi editorea kargatzen, itxaron...', selectFiletoUpload: 'Hautatu kargatu nahi duzun fitxategia', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Itsatsi YouTubeko esteka edo bestelako bideo iturriaren URLa', uploadAudioTitle: 'Kargatu audio fitxategia', uploadVideoTitle: 'Kargatu bideo fitxategia', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Txertatu', cancel: 'Utzi', height: 'altuera', diff --git a/language/fi.js b/language/fi.js index 64b55720..b1cdffda 100644 --- a/language/fi.js +++ b/language/fi.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Muokkaa kuvaa', saveLabel: 'Tallenna', cancelLabel: 'Peruuta', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Palauta alkuperäiseksi', loadingImageEditor: 'Lataa kuvaeditoria, odota...', selectFiletoUpload: 'Valitse ladattava tiedosto', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Liitä YouTube linkki tai muu videon osoite', uploadAudioTitle: 'Lataa äänitiedosto', uploadVideoTitle: 'Lataa videotiedosto', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Lisää', cancel: 'Peruuta', height: 'korkeus', diff --git a/language/fr.js b/language/fr.js index a24abca7..f98b3857 100644 --- a/language/fr.js +++ b/language/fr.js @@ -15,8 +15,36 @@ H5PEditor.language.core = { outOfStep: 'La :property ne peut être effectuée que par étape :step.', add: 'Ajouter', addFile: 'Ajouter un fichier', - removeFile: 'Supprimer un fichier', - confirmRemoval: 'Voulez-vous vraiment supprimer :type ?', + browseFiles: 'Parcourir les fichiers', + removeImage: 'Supprimer l\'Image', + confirmImageRemoval: 'Voulez-vous vraiment supprimer cette image ?', + dragAndDropAndPasteImage: 'Glisser-déposer ou coller un fichier image ici via :keyCombination pour l’ajouter', + dragAndDropAndPasteReplaceImage: 'Glisser-déposer ou coller un fichier image ici pour remplacer', + dropImage: 'Déposer un fichier image ici pour l\'ajouter', + uploadImage: 'Ajouter une image', + uploadingImage: 'Ajout de l\'image, veuillez patienter.', + replaceImage: 'Remplacer l\'image ?', + confirmReplaceImage: 'Voulez-vous vraiment remplacer cette image ?', + onlyPasteImageFiles: 'Vous ne pouvez coller que des fichiers image.', + uploadVideo: 'Ajouter une vidéo', + uploadAudio: 'Ajouter un fichier audio', + uploadOr: 'ou', + dragAndDropAndPasteVideo: 'Glisser-déposer ou coller un fichier vidéo ici via :keyCombination pour l’ajouter', + dragAndDropAndPasteAudio: 'Glisser-déposer ou coller un fichier audio ici via :keyCombination pour l’ajouter', + pasteVideoLink: 'Coller un lien YouTube ou une autre source vidéo', + pasteAudioLink: 'Coller un lien ou une autre source audio', + dropVideo: 'Déposer un fichier vidéo ici pour l\'ajouter', + dropAudio: 'Déposer un fichier audio ici pour l\'ajouter', + enterVideoLink: 'Entrer un lien vidéo', + enterAudioLink: 'Entrer un lien audio', + insertUrl: 'Insérer une URL', + replaceUrl: 'Remplacer l\'URL', + ctrlKey: 'ctrl', + commandKey: '⌘', + pasteKey: 'v', + supportedVideoFormats: 'H5P supporte les sources vidéo externes suivantes : Youtube, Panopto et Vimeo.', + dragAndDropToReplaceVideo: 'Glisser-déposer un fichier vidéo ici pour remplacer', + dragAndDropToReplaceAudio: 'Glisser-déposer un fichier audio ici pour remplacer', removeImage: "Supprimer l'image", confirmImageRemoval: 'Votre image va être supprimée. Êtes-vous sûr de vouloir continuer ?', changeFile: 'Changer le fichier', @@ -43,7 +71,11 @@ H5PEditor.language.core = { noSemantics: 'Erreur, impossible de charger ce type de contenu.', editImage: "Editer l'image", saveLabel: 'Enregistrer', + image: 'Image', cancelLabel: 'Annuler', + deleteLabel: 'Supprimer', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Réinitialiser', loadingImageEditor: "Editeur d'image en cours de chargement, patientez...", selectFiletoUpload: 'Choisissez le fichier à charger', @@ -54,8 +86,13 @@ H5PEditor.language.core = { enterVideoTitle: "Coller le lien YouTube link ou l'URL d'une autre source vidéo", uploadAudioTitle: 'Téléverser le fichier audio', uploadVideoTitle: 'Téléverser le fichier vidéo', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Insérer', cancel: 'Annuler', height: 'hauteur', diff --git a/language/gl.js b/language/gl.js index 38d71327..54497d0a 100644 --- a/language/gl.js +++ b/language/gl.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: 'Editar imaxe', saveLabel: 'Gardar', cancelLabel: 'Cancelar', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Voltar á orixinal', loadingImageEditor: 'Cargando o editor de imaxes. Agarda, por favor...', selectFiletoUpload: 'Seleccionar ficheiro a cargar', @@ -54,7 +56,12 @@ H5PEditor.language.core = { enterVideoTitle: 'Pegar enlace de Youtube ou outra URL de fonte de vídeo', uploadAudioTitle: 'Cargar ficheiro de audio', uploadVideoTitle: 'Cargar ficheiro de vídeo', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P suporta todas as fontes externas de vídeo formateado como mp4, webm ou ogv, como Vimeo Pro, e soporta enlaces de YouTube e Panopto.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Inserir', cancel: 'Cancelar', height: 'altura', diff --git a/language/it.js b/language/it.js index d5d15761..b252e580 100644 --- a/language/it.js +++ b/language/it.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: 'Modifica immagine', saveLabel: 'Salva', cancelLabel: 'Cancella', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Ripristina all\'originale', loadingImageEditor: 'Caricamento dell\'immagine dell\'editor, attendere per favore...', selectFiletoUpload: 'Selezionare il file da caricare', @@ -54,7 +56,12 @@ H5PEditor.language.core = { enterVideoTitle: 'Incolla il link YouTube link o un altro URL sorgente video', uploadAudioTitle: 'Carica file audio', uploadVideoTitle: 'Carica file video', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supporta tutte le sorgenti video esterne formattate come mp4, webm o ogv, come Vimeo Pro, e supporta i collegamenti YouTube e Panopto.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Inserisci', cancel: 'Cancella', height: 'altezza', diff --git a/language/ko.js b/language/ko.js index db24b52f..f2278a0c 100644 --- a/language/ko.js +++ b/language/ko.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: '이미지 편집', saveLabel: '저장', cancelLabel: '취소', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: '원본으로 돌아가기', loadingImageEditor: '이미지 편집기 로드 중, 잠시 기다리십시오...', selectFiletoUpload: '업로드할 파일 선택', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: '유튜브 게시 링크 또는 기타 비디오 소스 URL 붙여넣기', uploadAudioTitle: '오디오 파일 업로드', uploadVideoTitle: '비디오 파일 업로드', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P는 비메오 프로처럼 mp4, webm 또는 ogv로 포맷된 모든 외부 비디오 소스를 지원하며, 유튜브 링크를 지원함.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: '삽입', cancel: '취소', height: '높이', diff --git a/language/nb.js b/language/nb.js index f986689f..0c09ac8a 100644 --- a/language/nb.js +++ b/language/nb.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Rediger bilde', saveLabel: 'Lagre', cancelLabel: 'Avbryt', + deleteAudioLabel: 'Fjern Lydfil', + deleteVideoLabel: 'Fjern Videofil', resetToOriginalLabel: 'Tilbakestill bilde', loadingImageEditor: 'Laster inn bilderedigering, vennligst vent...', selectFiletoUpload: 'Velg fil som skal lastes opp', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Lim inn YouTube lenke eller annen videokilde URL', uploadAudioTitle: 'Last opp lydfil', uploadVideoTitle: 'Last opp videofil', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P støtter alle eksterne videokilder på formatene mp4, webm eller ogv, slik som Vimeo Pro, og har støtte for YouTube-lenker og Panopto-lenker.', + unsupportedVideoSource: "Videokilden er ikke støttet", + unsupportedAudioSource: "Lydkilden er ikke støttet", insert: 'Sett inn', cancel: 'Avbryt', height: 'Høyde', diff --git a/language/nl.js b/language/nl.js index 43e6c106..f752e13b 100644 --- a/language/nl.js +++ b/language/nl.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Afbeelding bewerken', saveLabel: 'Opslaan', cancelLabel: 'Annuleren', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Terugzetten naar oorspronkelijk', loadingImageEditor: 'Afbeeldingseditor laden, wachten alstublieft ...', selectFiletoUpload: 'Selecteer bestand om te uploaden', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Plak YouTube-link of andere URL van videobron', uploadAudioTitle: 'Upload audiobestand', uploadVideoTitle: 'Upload videobestand', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Invoegen', cancel: 'Annuleren', height: 'hoogte', diff --git a/language/nn.js b/language/nn.js index e20161ca..931ecf63 100644 --- a/language/nn.js +++ b/language/nn.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Rediger bilete', saveLabel: 'Lagre', cancelLabel: 'Avbryt', + deleteAudioLabel: 'Fjern Lydfil', + deleteVideoLabel: 'Fjern Videofil', resetToOriginalLabel: 'Tilbakestill bilde', loadingImageEditor: 'Laster inn bilderedigering, vennligst vent...', selectFiletoUpload: 'Velg fil som skal lastes opp', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Lim inn YouTube lenke eller annen videokjelde URL', uploadAudioTitle: 'Last opp lydfil', uploadVideoTitle: 'Last opp videofil', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P støtter alle eksterne videokilder på formatene mp4, webm eller ogv, slik som Vimeo Pro, og har støtte for YouTube-lenker og Panopto-lenker.', + unsupportedVideoSource: "Videokjelda er ikkje støtta", + unsupportedAudioSource: "Lydkjelda er ikkje støtta", insert: 'Sett inn', cancel: 'Avbryt', height: 'Høyde', diff --git a/language/pl.js b/language/pl.js index 6ba567a5..6ff761e4 100644 --- a/language/pl.js +++ b/language/pl.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: 'Edytuj obraz', saveLabel: 'Zapisz', cancelLabel: 'Anuluj', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Resetuj do oryginału', loadingImageEditor: 'Wczytywanie edytora obrazów, proszę czekać...', selectFiletoUpload: 'Wybierz plik, który chcesz dodać', @@ -54,8 +56,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Wklej link YouTube lub dodaj plik wideo', uploadAudioTitle: 'Dodaj plik audio', uploadVideoTitle: 'Dodaj plik wideo', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Wstaw', cancel: 'Anuluj', height: 'długość', diff --git a/language/pt-br.js b/language/pt-br.js index 30f70779..b8d0597c 100644 --- a/language/pt-br.js +++ b/language/pt-br.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Editar imagem', saveLabel: 'Salvar', cancelLabel: 'Cancelar', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Resetar para original', loadingImageEditor: 'Carregar editor de imagem, aguarde...', selectFiletoUpload: 'Selecionar arquivo para enviar', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Cole aqui a URL do vídeo ou o link do YouTube', uploadAudioTitle: 'Enviar arquivo de áudio', uploadVideoTitle: 'Enviar arquivo de vídeo', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Inserir', cancel: 'Cancelar', height: 'altura', diff --git a/language/pt.js b/language/pt.js index e75303ae..ba19e5d6 100644 --- a/language/pt.js +++ b/language/pt.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Editar imagem', saveLabel: 'Guardar', cancelLabel: 'Cancelar', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Restabelecer o original', loadingImageEditor: 'A carregar o editor de imagem. Por favor, aguarde...', selectFiletoUpload: 'Selecione o ficheiro para enviar', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Cole aqui o URL do vídeo ou a hiperligação do YouTube', uploadAudioTitle: 'Enviar ficheiro de áudio', uploadVideoTitle: 'Enviar ficheiro de vídeo', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Inserir', cancel: 'Cancelar', height: 'altura', diff --git a/language/ru.js b/language/ru.js index dec2fbe0..0c01c056 100644 --- a/language/ru.js +++ b/language/ru.js @@ -47,6 +47,8 @@ H5PEditor.language.core = { editImage: 'Изменить изображение', saveLabel: 'Сохранить', cancelLabel: 'Отмена', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Сброс к оригиналу', loadingImageEditor: 'Загрузка графического редактора, пожалуйста, подождите ...', selectFiletoUpload: 'Выберите файл для загрузки', @@ -57,8 +59,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Вставить ссылку на YouTube или другой источник видео', uploadAudioTitle: 'Загрузить аудио файл', uploadVideoTitle: 'Загрузить видео файл', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Вставить', cancel: 'Отмена', height: 'высота', diff --git a/language/sl.js b/language/sl.js index d3bf1582..ab77fe16 100644 --- a/language/sl.js +++ b/language/sl.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Uredi sliko', saveLabel: 'Shrani', cancelLabel: 'Prekliči', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Ponastavi na privzeto', loadingImageEditor: 'Nalagam urejevalnik slik, počakajte prosim ...', selectFiletoUpload: 'Izberite datoteko za prenos', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Dodaj spletni naslov (URL) do YouTube ali drugega videoposnetka', uploadAudioTitle: 'Naloži zvočni posnetek', uploadVideoTitle: 'Naloži videoposnetek', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P podpira vse zunanje videoposnetke v formatu mp4, webm ali ogv. Tudi povezave do posnetkov na Vimeo Pro, YouTube in Panopto.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Vstavi', cancel: 'Prekliči', height: 'višina', diff --git a/language/sv.js b/language/sv.js index 7689dfe6..d1830802 100644 --- a/language/sv.js +++ b/language/sv.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Redigera bild', saveLabel: 'Spara', cancelLabel: 'Avbryt', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Återställ till original', loadingImageEditor: 'Laddar bildredigerare,vänta ...', selectFiletoUpload: 'Välj fil att ladda upp', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Klistra in YouTube-länk eller annan URL till videokälla', uploadAudioTitle: 'Ladda upp ljudfil', uploadVideoTitle: 'Ladda upp videofil', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Infoga', cancel: 'Avbryt', height: 'höjd', diff --git a/language/tr.js b/language/tr.js index e4835cfe..6e3411d9 100644 --- a/language/tr.js +++ b/language/tr.js @@ -45,6 +45,8 @@ H5PEditor.language.core = { editImage: 'Resmi düzenle', saveLabel: 'Kaydet', cancelLabel: 'İptal', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: 'Özgün biçimine sıfırla', loadingImageEditor: 'Resim düzenleyici yükleniyor, bekleyin ...', selectFiletoUpload: 'Yüklenecek dosyayı seçin', @@ -55,8 +57,13 @@ H5PEditor.language.core = { enterVideoTitle: 'Youtube linkini ya da diğer video kaynağının URLsini yapıştırın', uploadAudioTitle: 'Ses dosyası yükle', uploadVideoTitle: 'Video dosyası yükle', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P supports all external video sources formatted as mp4, webm or ogv, like Vimeo Pro, and has support for YouTube and Panopto links.', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: 'Ekle', cancel: 'Vazgeç', height: 'yükseklik', diff --git a/language/zh-cn.js b/language/zh-cn.js index 964fc022..67121ef3 100644 --- a/language/zh-cn.js +++ b/language/zh-cn.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: '编辑图片', saveLabel: '保存', cancelLabel: '取消', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: '重置为原始状态', loadingImageEditor: '正在加载图片编辑器,请稍候...', selectFiletoUpload: '请选择要上传的文件', @@ -54,8 +56,13 @@ H5PEditor.language.core = { enterVideoTitle: '粘贴YouTube链接或其他视频源URL', uploadAudioTitle: '上传音频文件', uploadVideoTitle: '上传视频文件', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P 支持格式为 mp4、webm 或 ogv 的所有外部视频源,如 Vimeo Pro,并支持 YouTube 和 Panopto 链接。', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: '插入', cancel: '取消', height: '高度', diff --git a/language/zh-hans.js b/language/zh-hans.js index 964fc022..67121ef3 100644 --- a/language/zh-hans.js +++ b/language/zh-hans.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: '编辑图片', saveLabel: '保存', cancelLabel: '取消', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: '重置为原始状态', loadingImageEditor: '正在加载图片编辑器,请稍候...', selectFiletoUpload: '请选择要上传的文件', @@ -54,8 +56,13 @@ H5PEditor.language.core = { enterVideoTitle: '粘贴YouTube链接或其他视频源URL', uploadAudioTitle: '上传音频文件', uploadVideoTitle: '上传视频文件', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P 支持格式为 mp4、webm 或 ogv 的所有外部视频源,如 Vimeo Pro,并支持 YouTube 和 Panopto 链接。', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: '插入', cancel: '取消', height: '高度', diff --git a/language/zh.js b/language/zh.js index 964fc022..67121ef3 100644 --- a/language/zh.js +++ b/language/zh.js @@ -44,6 +44,8 @@ H5PEditor.language.core = { editImage: '编辑图片', saveLabel: '保存', cancelLabel: '取消', + deleteAudioLabel: 'Delete Audio', + deleteVideoLabel: 'Delete Video', resetToOriginalLabel: '重置为原始状态', loadingImageEditor: '正在加载图片编辑器,请稍候...', selectFiletoUpload: '请选择要上传的文件', @@ -54,8 +56,13 @@ H5PEditor.language.core = { enterVideoTitle: '粘贴YouTube链接或其他视频源URL', uploadAudioTitle: '上传音频文件', uploadVideoTitle: '上传视频文件', + fileUploadTitle: 'File Upload', + insertLinkTitle: 'Insert Link', + recordAudioTitle: 'Record Audio', addVideoDescription: 'H5P 支持格式为 mp4、webm 或 ogv 的所有外部视频源,如 Vimeo Pro,并支持 YouTube 和 Panopto 链接。', + unsupportedVideoSource: "Unsupported video source", + unsupportedAudioSource: "Unsupported audio source", insert: '插入', cancel: '取消', height: '高度', diff --git a/libs/cropper.css b/libs/cropper.css index dbeed421..21a95f9e 100644 --- a/libs/cropper.css +++ b/libs/cropper.css @@ -10,6 +10,16 @@ padding: 35px; user-select: none; } +.cropper-buttons div { + transition: opacity 1s; +} +.hidden { + opacity: 0; +} +.wait div:hover { + cursor: wait; +} + .cropper-button { position: relative; border: 3px solid #2f323a; diff --git a/package-lock.json b/package-lock.json index f8f68cab..dcf8f228 100644 --- a/package-lock.json +++ b/package-lock.json @@ -136,9 +136,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.9", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz", - "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -168,9 +168,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -400,15 +400,15 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.14.0.tgz", + "integrity": "sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -470,12 +470,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -520,9 +520,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001609", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz", - "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==", + "version": "1.0.30001624", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001624.tgz", + "integrity": "sha512-0dWnQG87UevOCPYaOR49CBcLBwoZLpws+k6W37nLjWUhumP1Isusj0p2u+3KhjNloRWK9OKMgjBBzPujQHw4nA==", "dev": true, "funding": [ { @@ -563,6 +563,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -622,18 +634,6 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -696,15 +696,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.735", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.735.tgz", - "integrity": "sha512-pkYpvwg8VyOTQAeBqZ7jsmpCjko1Qc6We1ZtZCjRyYbT5v4AIUKDy5cQTRotQlSSZmMr8jqpEt6JtOj5k7lR7A==", + "version": "1.4.783", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", + "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==", "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -715,9 +715,9 @@ } }, "node_modules/envinfo": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.12.0.tgz", - "integrity": "sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -727,9 +727,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true }, "node_modules/escalade": { @@ -815,6 +815,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -840,9 +852,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -897,15 +909,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -942,7 +954,7 @@ }, "node_modules/h5p-image-cropper": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/h5p/h5p-image-cropper.git#09d0960367fd89e0581539ee8fb8366fd918ab05", + "resolved": "git+ssh://git@github.com/h5p/h5p-image-cropper.git#f0b2e93c92293e06867ef949d838501b8fa3ed70", "dev": true, "license": "MIT" }, @@ -989,9 +1001,9 @@ } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, "node_modules/import-local": { @@ -1159,18 +1171,6 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -1187,12 +1187,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1221,9 +1221,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dev": true, "dependencies": { "schema-utils": "^4.0.0", @@ -1352,9 +1352,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -1469,9 +1469,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1650,9 +1650,9 @@ ] }, "node_modules/sass": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", - "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", + "version": "1.77.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", + "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -1667,9 +1667,9 @@ } }, "node_modules/sass-loader": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.0.tgz", - "integrity": "sha512-jxmjDXD9OYNDb2bp9JvopdE6QjecQY9beTWik/6sEHrsMxyo90Gyc471A4NUz60NLs4WsAh6yVtIvhLwEZcXeg==", + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", + "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -1726,13 +1726,10 @@ } }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -1875,9 +1872,9 @@ } }, "node_modules/terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -2006,9 +2003,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -2025,8 +2022,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -2257,12 +2254,6 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/zebra_datepicker": { "version": "1.9.11", "resolved": "https://registry.npmjs.org/zebra_datepicker/-/zebra_datepicker-1.9.11.tgz", diff --git a/scripts/h5peditor-av.js b/scripts/h5peditor-av.js index 97e856d0..dcbd2031 100644 --- a/scripts/h5peditor-av.js +++ b/scripts/h5peditor-av.js @@ -17,7 +17,6 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) */ function C(parent, field, params, setValue) { var self = this; - // Initialize inheritance H5PEditor.FileUploader.call(self, field); @@ -26,12 +25,25 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) this.params = params; this.setValue = setValue; this.changes = []; + this.hasRecorded = false; if (params !== undefined && params[0] !== undefined) { this.setCopyright(params[0].copyright); } - // When uploading starts + const isAudio = this.field.type === 'audio'; + + this.replaceCallback = () => {}; + this.confirmReplaceDialog = new H5P.ConfirmationDialog({ + headerText: H5PEditor.t('core', isAudio ? 'replaceAudio' : 'replaceVideo'), + dialogText: H5PEditor.t('core', isAudio ? 'confirmReplaceAudio' : 'confirmReplaceVideo') + }).appendTo(document.body); + + this.confirmReplaceDialog.on('confirmed', function () { + self.replaceCallback(); + }); + + self.on('upload', function () { // Insert throbber self.$uploading = $('
' + H5PEditor.t('core', 'uploading') + '
').insertAfter(self.$add.hide()); @@ -39,27 +51,32 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) // Clear old error messages self.$errors.html(''); - // Close dialog self.closeDialog(); }); - // Monitor upload progress self.on('uploadProgress', function (e) { - self.$uploading.html(H5PEditor.t('core', 'uploading') + ' ' + Math.round(e.data * 100) + ' %'); + // New upload, i.e. not update existing box. + if (typeof e.data.updateId === 'undefined') { + self.handleUploadProgress(this.dndAddDialog); + } }); - // Handle upload complete self.on('uploadComplete', function (event) { - var result = event.data; - - // Clear out add dialog - this.$addDialog.find('.h5p-file-url').val(''); - + const result = event.data; + let index = self.params?.length ?? 0; + const updateId = event.data?.updateId ?? undefined; + this.updateId = updateId; + const boxesEl = Array.from(self.$dndFiles.get(0).querySelectorAll('.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider)')); + let boxEl; + try { if (result.error) { throw result.error; } + // Clear out add dialog + this.$addDialog.find('.h5p-file-url').val(''); + // Set params if none is set if (self.params === undefined) { self.params = []; @@ -67,23 +84,47 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) } // Add a new file/source - var file = { + const file = { path: result.data.path, mime: result.data.mime, - copyright: self.copyright + copyright: self.copyright, + tabIndex: C.TABS.UPLOAD, }; - var index = (self.updateIndex !== undefined ? self.updateIndex : self.params.length); - self.params[index] = file; - self.addFile(index); + + if (updateId) { + let foundUpdateIndex = self.params.findIndex(param => param.id === updateId); + + if (foundUpdateIndex !== -1) { + file.id = updateId; + + self.updateIndex = index = foundUpdateIndex; + self.params[index] = file; + boxEl = boxesEl.find(element => element.id === updateId); + + self.addFile(foundUpdateIndex, updateId); + } + else { + throw new Error(`File not found`); + } + } + else { + file.id = H5P.createUUID(); + + boxEl = self.dndAddDialog; + self.params[index] = file; + self.addFile(index); + } + self.setValue(self.field, self.params); // Trigger change callbacks (old event system) - for (var i = 0; i < self.changes.length; i++) { + for (let i = 0; i < self.changes.length; i++) { self.changes[i](file); } + const errorEls = Array.from(self.$dndFiles.get(0).querySelectorAll('.has-error')); + errorEls.forEach(errorEl => errorEl.classList.remove('has-error')); } catch (error) { - // Display errors - self.$errors.append(H5PEditor.createError(error)); + self.setErrorMessage(result.error, boxEl); } if (self.$uploading !== undefined && self.$uploading.length !== 0) { @@ -91,12 +132,33 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) self.$uploading.remove(); self.$add.show(); } + + self.handleUploadComplete(boxEl); }); } C.prototype = Object.create(ns.FileUploader.prototype); C.prototype.constructor = C; + C.prototype.setErrorMessage = function (message, boxEl) { + const errorEl = boxEl.querySelector('.h5p-errors'); + if (errorEl) { + errorEl.innerText = message; + } + if (boxEl) { + boxEl.classList.add('has-error'); + } + this.setAriaLiveErrorMessage(message) + }; + + C.prototype.setAriaLiveErrorMessage = function (message) { + this.ariaLiveEl.innerText = message; + // Note: Should last long enough for the screen reader to read the text above. + setTimeout(() => { + this.ariaLiveEl.innerText = ""; + }, 5000); + }; + /** * Append widget to given wrapper. * @@ -108,44 +170,43 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) var imageHtml = '' + - (self.field.widgetExtensions ? C.createTabbedAdd(self.field.type, self.field.widgetExtensions, id, self.field.description !== undefined) : C.createAdd(self.field.type, id, self.field.description !== undefined)) + C.createTabbedAdd(self.field.type, self.field.widgetExtensions); if (!this.field.disableCopyright) { imageHtml += '' + H5PEditor.t('core', 'editCopyright') + ''; } imageHtml += '
' + - '' + - '
'; - + '' + + ''; + var html = H5PEditor.createFieldMarkup(this.field, imageHtml, id); var $container = $(html).appendTo($wrapper); - - this.$files = $container.children('.file'); + + // Wrappers + this.$dialogAnchor = $container.children('.h5p-dialog-anchor'); + this.$addDialog = this.$dialogAnchor.children('.h5p-add-dialog'); + this.$dialogTable = this.$addDialog.children('.h5p-add-dialog-table'); + this.$tabList = this.$dialogTable.children('.av-tablist'); + this.$add = $container.children('.h5p-add-file').click(function () { - self.$addDialog.addClass('h5p-open'); + this.$addDialog.addClass('h5p-open'); }); - // Tabs that are hard-coded into this widget. Any other tab must be an extension. - const TABS = { - UPLOAD: 0, - INPUT: 1 - }; + // Prepare to add the extra tab instances + const tabInstances = [null, null]; // Add nulls for hard-coded tabs + self.tabInstances = tabInstances; - // The current active tab - let activeTab = TABS.UPLOAD; + let activeTab = C.TABS.UPLOAD; /** * @param {number} tab * @return {boolean} */ const isExtension = function (tab) { - return tab > TABS.INPUT; // Always last tab + return tab > C.TABS.INPUT; // Always last tab }; - /** - * Toggle the currently active tab. - */ const toggleTab = function () { // Pause the last active tab if (isExtension(activeTab)) { @@ -155,35 +216,22 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) // Update tab this.parentElement.querySelector('.selected').classList.remove('selected'); this.classList.add('selected'); - + // Update tab panel - const el = document.getElementById(this.getAttribute('aria-controls')); - el.parentElement.querySelector('.av-tabpanel:not([hidden])').setAttribute('hidden', ''); - el.removeAttribute('hidden'); + const inactiveTabPanel = document.getElementById(this.getAttribute('aria-controls')); + const activeTabPanel = inactiveTabPanel.parentElement.querySelector('.av-tabpanel:not([hidden])'); + activeTabPanel.setAttribute('hidden', ''); + inactiveTabPanel.removeAttribute('hidden'); // Set active tab index - for (let i = 0; i < el.parentElement.children.length; i++) { - if (el.parentElement.children[i] === el) { + for (let i = 0; i < inactiveTabPanel.parentElement.children.length; i++) { + if (inactiveTabPanel.parentElement.children[i] === inactiveTabPanel) { activeTab = i - 1; // Compensate for .av-tablist in the same wrapper break; } } - - // Toggle insert button disabled - if (activeTab === TABS.UPLOAD) { - self.$insertButton[0].disabled = true; - } - else if (activeTab === TABS.INPUT) { - self.$insertButton[0].disabled = false; - } - else { - self.$insertButton[0].disabled = !tabInstances[activeTab].hasMedia(); - } } - /** - * Switch focus between the buttons in the tablist - */ const moveFocus = function (el) { if (el) { this.setAttribute('tabindex', '-1'); @@ -192,30 +240,7 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) } } - // Register event listeners to tab DOM elements - $container.find('.av-tab').click(toggleTab).keydown(function (e) { - if (e.which === 13 || e.which === 32) { // Enter or Space - toggleTab.call(this, e); - e.preventDefault(); - } - else if (e.which === 37 || e.which === 38) { // Left or Up - moveFocus.call(this, this.previousSibling); - e.preventDefault(); - } - else if (e.which === 39 || e.which === 40) { // Right or Down - moveFocus.call(this, this.nextSibling); - e.preventDefault(); - } - }); - - this.$addDialog = this.$add.next().children().first(); - - // Prepare to add the extra tab instances - const tabInstances = [null, null]; // Add nulls for hard-coded tabs - self.tabInstances = tabInstances; - if (self.field.widgetExtensions) { - /** * @param {string} type Constructor name scoped inside this widget * @param {number} index @@ -223,10 +248,29 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) const createTabInstance = function (type, index) { const tabInstance = new H5PEditor.AV[type](); tabInstance.appendTo(self.$addDialog[0].children[0].children[index + 1]); // Compensate for .av-tablist in the same wrapper - tabInstance.on('hasMedia', function (e) { - if (index === activeTab) { - self.$insertButton[0].disabled = !e.data; + this.hasRecorded = false; + let hasUploaded = false; + let media = null; + let timeout = null; + + tabInstance.on('hasMedia', function () { + this.hasRecorded = true; + media = tabInstance.getMedia(); + if (timeout) { + clearTimeout(timeout); + } + if (this.hasRecorded && !hasUploaded && !!media) { + timeout = setTimeout(() => { + hasUploaded = true; + self.upload(media.data, media.name); + self.$tabList.children('.av-tab').get(0).click(); + const avTabPanel = self.$dialogTable.find('.av-tabpanel:not([hidden])'); + avTabPanel.addClass('has_content'); + hasUploaded = false; + return; + }, 100); } + this.hasRecorded = false; }); tabInstances.push(tabInstance); } @@ -238,13 +282,140 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) } } } + + this.$dndTabPanel = this.$dialogTable.children('.av-tabpanel:not([hidden])'); + this.$dndFiles = this.$dndTabPanel.children('.h5p-dnd__av-container'); + + this.dndAddDialog = this.$dndFiles.children('.h5p-dnd__box__url.h5p-dnd__box--is-dashed').get(0); + this.ariaLiveEl = this.$dndFiles.find('.h5p-sr-only[aria-live]').get(0); + + const blockEl = this.dndAddDialog.querySelector('.h5p-dnd__box__block'); + this.addDragAndDropListeners(this.dndAddDialog, blockEl); + + const urlInsertButton = this.$dialogTable.find('.h5p-dnd__btn__insert-url'); + const inputContainer = urlInsertButton.parent().parent().parent(); + this.$videoUrlErrorContainer = inputContainer.find('#errorContainer'); + + urlInsertButton.on('click', () => { + const url = inputContainer.find('.input-video').val().trim(); + const isAudio = this.field.type === 'audio'; + if (url.length === 0) { + return; + } - var $url = this.$url = this.$addDialog.find('.h5p-file-url'); - this.$addDialog.find('.h5p-cancel').click(function () { - self.updateIndex = undefined; - self.closeDialog(); + if (!C.findProvider(url)) { + this.$videoUrlErrorContainer.removeClass('hidden'); + this.$videoUrlErrorContainer.addClass("has-error"); + this.$videoUrlErrorContainer.find('.h5p-errors').text(isAudio ? ns.t('core', 'unsupportedAudioSource') : ns.t('core', 'unsupportedVideoSource')); + } + else { + this.$videoUrlErrorContainer.addClass('hidden'); + + // Check if there is an existing media propery in params + let existingMedia = this.params?.some(p => C.findProvider(p.path)); + + if (existingMedia) { + this.replaceUrl(url); + } else { + this.useUrl(url); + } + this.updatePasteBox(true); + } + }); + + const urlInputField = this.$dialogTable.find('.input-video'); + urlInputField.on('keydown', (e) => { + this.$videoUrlErrorContainer.addClass('hidden'); + if (e.code === 'Enter') { + const url = this.$dialogTable.find('.input-video').val().trim(); + const isAudio = this.field.type === 'audio'; + if (url.length === 0) { + return; + } + + if (!C.findProvider(url)) { + this.$videoUrlErrorContainer.removeClass('hidden'); + this.$videoUrlErrorContainer.addClass("has-error"); + this.$videoUrlErrorContainer.find('.h5p-errors').text(isAudio ? ns.t('core', 'unsupportedAudioSource') : ns.t('core', 'unsupportedVideoSource')); + } + else { + + // Check if there is an existing media propery in params + let existingMedia = this.params?.some(p => C.findProvider(p.path)); + + if (existingMedia) { + this.replaceUrl(url); + } else { + this.useUrl(url); + } + this.updatePasteBox(true); + } + } + }); + + // Need to add listener on the specific dnd tab here + document.addEventListener('paste', (e) => { + const activeElement = document.activeElement.closest('.h5p-dnd__box'); + if (this.$dndFiles.get(0).contains(activeElement) && activeElement && e.clipboardData.files.length > 0) { + const children = Array.from(activeElement.parentElement.parentElement.querySelectorAll('.h5p-dnd__box--has-video')); + let index = -1; + let id; + children.forEach((child, i) => { + if (child === activeElement) { + index = i; + id = child.id ?? null; + } + }) + + this.uploadOrReplaceImage(e.clipboardData.files, index, id, activeElement); + } + }); + + const uploadButton = this.$dialogTable.find('.h5p-dnd__btn__upload'); + uploadButton.on('click', (e) => { + e.preventDefault(); + this.openFileSelector(); + }); + + this.$errors = $container.children('.h5p-errors'); + + if (this.params !== undefined) { + this.params = this.params.map((param) => ({ + ...param, + id: H5P.createUUID(), + tabIndex: C.TABS.UPLOAD, + })); + + for (let index = 0; index < this.params.length; index++) { + this.addFile(index); + } + } + else { + $container.find('.h5p-copyright-button').addClass('hidden'); + } + + // Register event listeners to tab DOM elements + $container.find('.av-tab').click(toggleTab).keydown(function (e) { + if (e.which === 13 || e.which === 32) { // Enter or Space + toggleTab.call(this, e); + e.preventDefault(); + } + else if (e.which === 37 || e.which === 38) { // Left or Up + moveFocus.call(this, this.previousSibling); + e.preventDefault(); + } + else if (e.which === 39 || e.which === 40) { // Right or Down + moveFocus.call(this, this.nextSibling); + e.preventDefault(); + } }); + self.$addDialog = this.$add.next().children().first(); + + self.$addDialog.addClass('h5p-open'); + + this.$url = this.$addDialog.find('.input-video'); + this.$addDialog.find('.h5p-file-drop-upload') .addClass('has-advanced-upload') .on('drag dragstart dragend dragover dragenter dragleave drop', function (e) { @@ -263,36 +434,10 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) }) .click(function () { self.openFileSelector(); - }); - - this.$insertButton = this.$addDialog.find('.h5p-insert').click(function () { - if (isExtension(activeTab)) { - const media = tabInstances[activeTab].getMedia(); - if (media) { - self.upload(media.data, media.name); - } - } - else { - const url = $url.val().trim(); - if (url) { - self.useUrl(url); - } - } - - self.closeDialog(); }); this.$errors = $container.children('.h5p-errors'); - if (this.params !== undefined) { - for (var i = 0; i < this.params.length; i++) { - this.addFile(i); - } - } - else { - $container.find('.h5p-copyright-button').addClass('hidden'); - } - var $dialog = $container.find('.h5p-editor-dialog'); $container.find('.h5p-copyright-button').add($dialog.find('.h5p-close')).click(function () { $dialog.toggleClass('h5p-open'); @@ -305,90 +450,264 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) }; + /** + * + * @param {number} progress 0-100 the progress of uploading the image + */ + C.prototype.handleUploadProgress = function (boxEl) { + + const elementsToHide = Array.from(boxEl.querySelectorAll(':scope > div:not(.h5p-dnd__loader)')); + const loaderEl = boxEl.querySelector('.h5p-dnd__loader'); + + boxEl.classList.add('h5p-dnd__box--is-uploading'); + loaderEl?.removeAttribute('style'); + elementsToHide.forEach(e => e.style = 'display: none;'); + }; + + C.prototype.handleUploadComplete = function (boxEl) { + const elementsToShow = Array.from(boxEl.querySelectorAll(':scope > div:not(.h5p-dnd__loader)')); + const loaderEl = boxEl.querySelector('.h5p-dnd__loader'); + + boxEl.classList.remove('h5p-dnd__box--is-uploading'); + loaderEl.style = 'display: none;'; + elementsToShow.forEach(e => e.removeAttribute('style')); + } + + /** + * Add drag and drop listeners to the appropriate DOM elements. + */ + C.prototype.addDragAndDropListeners = function (boxEl, blockEl, shouldReplace = false) { + boxEl.addEventListener('dragenter', (e) => this.handleDragAndDrop(e, boxEl, blockEl, shouldReplace)); + blockEl.addEventListener('dragover', (e) => this.handleDragAndDrop(e, boxEl, blockEl, shouldReplace)); + blockEl.addEventListener('dragend', (e) => this.handleDragAndDrop(e, boxEl, blockEl, shouldReplace)); + blockEl.addEventListener('dragleave', (e) => this.handleDragAndDrop(e, boxEl, blockEl, shouldReplace)); + blockEl.addEventListener('drop', (e) => this.handleDragAndDrop(e, boxEl, blockEl, shouldReplace)); + }; + + /** + * Handle drag and drop events. Will apply the correct css classes (styling) + * depending on event type and will handle uploading if the user drops the file. + * + * @param {Event} e + */ + C.prototype.handleDragAndDrop = function (e, boxEl, shouldReplace) { + e.preventDefault(); + e.stopPropagation(); + const boxBlock = boxEl.querySelector('.h5p-dnd__box__block'); + + if (e.type === 'dragenter') { + boxEl.classList.add('h5p-dnd__box--is-dragging') + } + else if (e.type === 'dragend' || (e.type === 'dragleave' && boxBlock === e.target)) { + boxEl.classList.remove('h5p-dnd__box--is-dragging'); + } + else if (e.type === 'drop') { + let index; + let id; + boxEl.classList.remove('h5p-dnd__box--is-dragging'); + const boxElParent = $(boxEl.parentElement); + if (shouldReplace && boxElParent.attr('id') !== this.$dndFiles.attr('id')) { + index = boxElParent.index(); + id = boxElParent.attr('id') ?? undefined; + } + else { + index = -1; + id = undefined; + } + this.uploadOrReplaceImage(e.dataTransfer.files, index, id, boxEl); + } + }; + + + /** + * Will either upload or replace (and upload) an image. + * + * @param {FileList} files + */ + C.prototype.uploadOrReplaceImage = function (files, indexToReplace = -1, idToReplace = undefined, boxEl) { + if (idToReplace) { + // Need to make a copy of the file since Firefox loses the reference to it during the confirm replace dialog. + const filesBackup = [new File([files[0]], files[0].name, { type: files[0].type })]; + this.replaceCallback = () => { + this.handleUploadProgress(boxEl); + this.updateIndex = indexToReplace; + this.updateId = idToReplace; + this.uploadFiles(filesBackup, { updateId: idToReplace }); + }; + this.previousState = C.STATE.HAS_IMAGE; + this.previousParams = this.params; + this.confirmReplaceDialog.show(this.$dndFiles.offset().top); + } else { + this.handleUploadProgress(boxEl); + this.previousState = C.STATE.NO_IMAGE; + this.previousParams = null; + this.uploadFiles(files); + } + }; + /** * Add file icon with actions. * * @param {Number} index */ - C.prototype.addFile = function (index) { - var that = this; - var fileHtml; - var file = this.params[index]; - var rowInputId = 'h5p-av-' + C.getNextId(); - var defaultQualityName = H5PEditor.t('core', 'videoQualityDefaultLabel', { ':index': index + 1 }); - var qualityName = (file.metadata && file.metadata.qualityName) ? file.metadata.qualityName : defaultQualityName; + C.prototype.addFile = function (index, updateFileId = undefined) { + let that = this; + const file = this.params[index]; - // Check if source is provider (Vimeo, YouTube, Panopto) - const isProvider = file.path && C.findProvider(file.path); - - // Only allow single source if YouTube - if (isProvider) { - // Remove all other files except this one - that.$files.children().each(function (i) { - if (i !== that.updateIndex) { - that.removeFileWithElement($(this)); - } - }); - // Remove old element if updating - that.$files.children().each(function () { - $(this).remove(); - }); - // This is now the first and only file - index = 0; + if (!!this.params) { + const avTabPanel = this.$dialogTable.find('.av-tabpanel:not([hidden])'); + avTabPanel.addClass('has_content'); } - this.$add.toggleClass('hidden', isProvider); - // If updating remove and recreate element - if (that.updateIndex !== undefined) { - var $oldFile = this.$files.children(':eq(' + index + ')'); - $oldFile.remove(); - this.updateIndex = undefined; + // Check if source is provider (Vimeo, YouTube, Panopto) + const isProvider = file?.path && C.findProvider(file.path); + const isAudio = this.field.type === 'audio'; + + let filesContainer; + switch (file.tabIndex) { + case C.TABS.UPLOAD: + filesContainer = this.$dialogTable.find('#dndFiles'); + break; + + case C.TABS.INPUT: + filesContainer = this.$dialogTable.find('#urlFiles'); + break; } - // Create file with customizable quality if enabled and not youtube - if (this.field.enableCustomQualityLabel === true && !isProvider) { - fileHtml = '
  • ' + - '
    ' + - '
    ' + file.mime.split('/')[1] + '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + H5PEditor.t('core', 'videoQuality') + '
    ' + - '' + - '' + - '
    ' + - '
  • '; + const mimeType = file.mime.split('/')[1]; + const videoText = C.providers.map(p => p.name).includes(mimeType) ? mimeType : `.${mimeType.toUpperCase()}`; + let fileHtml; + if (!isProvider) { + fileHtml = ` +
    +
    +
    +
    +
    +
    +
    + ${videoText} +
    +
    +
    +
    +
    +
    ${isAudio ? H5PEditor.t('core', 'dragAndDropToReplaceAudio') : H5PEditor.t('core', 'dragAndDropToReplaceVideo')}
    +
    +
    + + +
    +
    + +
    +
    + `; + } else { + fileHtml = ` +
    +
    +
    +
    +
    +
    +
    + ${videoText} +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + `; } - else { - fileHtml = '
  • ' + - '
    ' + - '
    ' + file.mime.split('/')[1] + '
    ' + - '
    ' + - '
    ' + - '
  • '; - } - + // Insert file element in appropriate order - var $file = $(fileHtml); - if (index >= that.$files.children().length) { - $file.appendTo(that.$files); + const $file = $(fileHtml); + + this.$add.toggleClass('hidden', isProvider); + + if (updateFileId) { + this.updateId = undefined; + this.updateIndex = undefined; + const oldFile = filesContainer.find(`#${updateFileId}`); + index = oldFile.index(); + oldFile.remove(); + $file.insertBefore(filesContainer.children().eq(index)); } else { - $file.insertBefore(that.$files.children().eq(index)); + $file.prependTo(filesContainer); } this.$add.parent().find('.h5p-copyright-button').removeClass('hidden'); - // Handle thumbnail click + const boxEl = $file.find('.h5p-dnd__box').get(0); + const blockEl = $file.find('.h5p-dnd__box__block').get(0); + + // Handle drag and drop + this.addDragAndDropListeners(boxEl, blockEl, true); + + // Handle space/enter on frame/box + boxEl.addEventListener('keydown', (e) => { + if (!isProvider && e.target?.nodeName !== 'INPUT') { + if ((e.code === 'Space' || e.code === 'Enter')) { + this.openFileSelector({ + onChangeCallback: () => { + this.updateIndex = index; + this.updateId = boxEl.attr('id'); + this.handleUploadProgress(boxEl); + }, + context: { + updateId: boxEl.attr('id'), + updateIndex: index + } + }); + } + } + }); + + // Handle delete file $file - .children('.h5p-thumbnail') - .click(function () { - if (!that.$add.is(':visible')) { - return; // Do not allow editing of file while uploading + .find('.h5p-delete-image-button') + .on('click', (e) => { + e.preventDefault(); + confirmRemovalDialog.show($file.offset().top); + }); + + // Handle click on thumbnail + $file + .find('.h5p-dnd__video-container') + .click(() => { + if (!isProvider) { + this.openFileSelector({ + onChangeCallback: () => { + this.updateIndex = index; + this.updateId = $file.attr('id'); + let current = filesContainer.find(`#${this.updateId}`).get(0); + this.handleUploadProgress(current); + }, + context: { + updateId: $file.attr('id'), + updateIndex: index + } + }); } - that.$addDialog.addClass('h5p-open').find('.h5p-file-url').val(that.params[index].path); - that.updateIndex = index; }); // Handle remove button click @@ -410,7 +729,7 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) }); // Create remove file dialog - var confirmRemovalDialog = new H5P.ConfirmationDialog({ + const confirmRemovalDialog = new H5P.ConfirmationDialog({ headerText: H5PEditor.t('core', 'removeFile'), dialogText: H5PEditor.t('core', 'confirmRemoval', {':type': 'file'}) }).appendTo(document.body); @@ -418,7 +737,7 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) // Remove file on confirmation confirmRemovalDialog.on('confirmed', function () { that.removeFileWithElement($file); - if (that.$files.children().length === 0) { + if (filesContainer.children().length === 0) { that.$add.parent().find('.h5p-copyright-button').addClass('hidden'); } }); @@ -430,36 +749,61 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) * @param {number} $file File element */ C.prototype.removeFileWithElement = function ($file) { - var index = $file.index(); + const avTabPanel = this.$dialogTable.find('.av-tabpanel:not([hidden])'); + const filesContainer = avTabPanel.children('.h5p-dnd__av-container'); + const filesContainerId = filesContainer.attr('id') === 'urlFiles' ? true : false; + const urlInputHasValue = filesContainerId ? filesContainer.get(0).querySelector('.input-video').value : ''; - // Remove from params. if (this.params.length === 1) { + // Remove from params. delete this.params; this.setValue(this.field); + avTabPanel.removeClass('has_content'); } else { + const index = $file.index(); this.params.splice(index, 1); + this.setValue(this.field, this.params); } $file.remove(); this.$add.removeClass('hidden'); + if (filesContainerId && urlInputHasValue !== '') { + this.updatePasteBox(false); + this.$videoUrlErrorContainer.addClass('hidden'); + } // Notify change listeners - for (var i = 0; i < this.changes.length; i++) { + for (let i = 0; i < this.changes.length; i++) { this.changes[i](); } }; + C.prototype.updatePasteBox = function (isReplace) { + const filesContainer = this.$dialogTable.find('.av-tabpanel:not([hidden])').children('.h5p-dnd__av-container'); + const pasteBoxEl = filesContainer.get(0).querySelector('.h5p-dnd__box__video-paste'); + const inputEl = pasteBoxEl.querySelector('.input-video'); + const btnEl = pasteBoxEl.querySelector('.h5p-dnd__btn__insert-url'); + + btnEl.innerText = isReplace ? H5PEditor.t('core', 'replaceUrl') : H5PEditor.t('core', 'insertUrl'); + inputEl.value = isReplace ? inputEl.value : ""; + } + + /** + * Add new url to Url container + * + * @param {string} url new url + */ C.prototype.useUrl = function (url) { if (this.params === undefined) { this.params = []; this.setValue(this.field, this.params); } - var mime; - var aspectRatio; - var i; - var matches = url.match(/\.(webm|mp4|ogv|m4a|mp3|ogg|oga|wav)/i); + let mime; + let aspectRatio; + let i; + const matches = url.match(/\.(webm|mp4|ogv|m4a|mp3|ogg|oga|wav)/i); if (matches !== null) { mime = matches[matches.length - 1]; } @@ -472,14 +816,18 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) } } - var file = { + const file = { + id: H5P.createUUID(), path: url, mime: this.field.type + '/' + (mime ? mime : 'unknown'), copyright: this.copyright, aspectRatio: aspectRatio ? aspectRatio : undefined, + tabIndex: C.TABS.INPUT, }; - var index = (this.updateIndex !== undefined ? this.updateIndex : this.params.length); - this.params[index] = file; + + this.params.push(file); + this.setValue(this.field, this.params); + index = this.params.findIndex(param => param.id === file.id); this.addFile(index); for (i = 0; i < this.changes.length; i++) { @@ -487,6 +835,67 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) } }; + /** + * Replace the file in the Url container + * + * @param {string} url New file url + */ + C.prototype.replaceUrl = function (url) { + let mime; + let aspectRatio; + const matches = url.match(/\.(webm|mp4|ogv|m4a|mp3|ogg|oga|wav)/i); + if (matches !== null) { + mime = matches[matches.length - 1]; + } + else { + // Try to find a provider + const provider = C.findProvider(url); + if (provider) { + mime = provider.name; + aspectRatio = provider.aspectRatio; + } + } + + const index = this.params.findIndex(param => C.findProvider(param.path)); + + const file = { + id: this.params[index].id, + path: url, + mime: this.field.type + '/' + (mime ? mime : 'unknown'), + copyright: this.copyright, + aspectRatio: aspectRatio ? aspectRatio : undefined, + tabIndex: C.TABS.INPUT, + }; + + this.params[index] = file; + this.setValue(this.field, this.params); + + const mimeType = file.mime.split('/')[1]; + const videoText = C.providers.map(p => p.name).includes(mimeType) ? mimeType : `.${mimeType.toUpperCase()}`; + + // Simulating loading to give some feedback to user since this is actually instant. + const urlFilesContainer = this.$dialogTable.find('#urlFiles'); + const boxEl = urlFilesContainer.get(0).querySelector('.h5p-dnd__videobox-wrapper--is-provider .h5p-dnd__box'); + const videoOverlayEl = boxEl.querySelector('.h5p-dnd__video-overlay'); + + videoOverlayEl.innerHTML = ` +
    + ${videoText} + `; + + this.handleUploadProgress(boxEl); + setTimeout(() => { + this.handleUploadComplete(boxEl) + }, 500); + } + + C.prototype.getInputUrlFile = function () { + if (this.params && this.params.length) { + return this.params.filter(param => C.isProvider(param.mimeType) !== 'undefined'); // Should only give one result + } + return null; + } + /** * Validate the field/widget. * @@ -558,14 +967,9 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) * @param {boolean} hasDescription * @returns {string} HTML */ - C.createInsertDialog = function (content, disableInsert, id, hasDescription) { - return '
    ' + - '
    ' + - '
    ' + content + '
    ' + - '
    ' + - '' + - '' + - '
    ' + + C.createInsertDialog = function (content) { + return '
    ' + + '
    ' + content + '
    ' + '
    '; }; @@ -578,22 +982,76 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) */ C.createTabContent = function (tab, type) { const isAudio = (type === 'audio'); - + const firstFile = Array.isArray(this.params) ? this.params[0] : undefined; + const isProvider = firstFile?.path && C.findProvider(firstFile.path); + const copyPasteString = `${ns.t('core', 'ctrlKey')}${ns.t('core', 'commandKey')} + ${ns.t('core', 'pasteKey')}`; + const dragCopyPasteString = ns.t('core', isAudio ? 'dragAndDropAndPasteAudio' : 'dragAndDropAndPasteVideo', { ':keyCombination': copyPasteString }); + switch (tab) { case 'BasicFileUpload': - const id = 'av-upload-' + C.getNextId(); - return '

    ' + H5PEditor.t('core', isAudio ? 'uploadAudioTitle' : 'uploadVideoTitle') + '

    ' + - '
    ' + - '
    ' + - '
    '; + return ` +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + ${H5PEditor.t('core', 'uploadOr')} +
    +
    +
    + ${dragCopyPasteString} +
    +
    +
    +
    + ${isAudio ? H5PEditor.t('core', 'dropAudio') : H5PEditor.t('core', 'dropVideo')} +
    + +
    +
    + `; case 'InputLinkURL': - return '

    ' + H5PEditor.t('core', isAudio ? 'enterAudioTitle' : 'enterVideoTitle') + '

    ' + - '
    ' + - '' + - '
    ' + - (isAudio ? '' : '
    ' + H5PEditor.t('core', 'addVideoDescription') + '
    '); - + return ` +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + ${!isAudio ? ` +
    +
    + ${H5PEditor.t('core', 'supportedVideoFormats')} +
    +
    + `: ''} +
    +
    + `; default: return ''; } @@ -607,60 +1065,53 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) * @param {Array} extraTabs * @returns {string} HTML */ - C.createTabbedAdd = function (type, extraTabs, id, hasDescription) { + C.createTabbedAdd = function (type, extraTabs) { let i; const tabs = [ 'BasicFileUpload', 'InputLinkURL' ]; - for (i = 0; i < extraTabs.length; i++) { - tabs.push(extraTabs[i]); + + // Add when adding record audio + if (extraTabs && extraTabs.length > 0) { + for (i = 0; i < extraTabs.length; i++) { + tabs.push(extraTabs[i]); + } } let tabsHTML = ''; let tabpanelsHTML = ''; for (i = 0; i < tabs.length; i++) { + let title = ''; const tab = tabs[i]; const tabId = C.getNextId(); const tabindex = (i === 0 ? 0 : -1) const selected = (i === 0 ? 'true' : 'false'); - const title = (i > 1 ? H5PEditor.t('H5PEditor.' + tab, 'title') : H5PEditor.t('core', 'tabTitle' + tab)); - tabsHTML += ''; + switch (tab) { + case 'BasicFileUpload': + title = H5PEditor.t('core', 'fileUploadTitle'); + tabsHTML +=''; + break; + case 'InputLinkURL': + title = H5PEditor.t('core', 'insertLinkTitle'); + tabsHTML +=''; + break; + case 'AudioRecorder': + title = H5PEditor.t('core', 'recordAudioTitle'); + tabsHTML +=''; + break; + default: + title = H5PEditor.t('H5PEditor.' + tab, 'title') + break; + } tabpanelsHTML += ''; } return C.createInsertDialog( - '
    ' + tabsHTML + '
    ' + tabpanelsHTML, - true, id, hasDescription - ); - }; - - /** - * Creates the HTML for the basic 'Upload or URL' dialog. - * - * @param {string} type 'video' or 'audio' - * @param {string} id - * @param {boolean} hasDescription - * @returns {string} HTML - */ - C.createAdd = function (type, id, hasDescription) { - return C.createInsertDialog( - '
    ' + - C.createTabContent('BasicFileUpload', type) + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + H5PEditor.t('core', 'or') + '
    ' + - '
    ' + - '
    ' + - '
    ' + - C.createTabContent('InputLinkURL', type) + - '
    ', - false, id, hasDescription + '
    ' + tabsHTML + '
    ' + tabpanelsHTML ); }; @@ -685,9 +1136,9 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) aspectRatio: '16:9', }, { - name: 'Echo360', - regexp: /^[^\/]+:\/\/(echo360[^\/]+)\/media\/([^\/]+)\/h5p.*$/i, - aspectRatio: '16:9', + name: 'Echo360', + regexp: /^[^\/]+:\/\/(echo360[^\/]+)\/media\/([^\/]+)\/h5p.*$/i, + aspectRatio: '16:9', }, ]; @@ -716,5 +1167,17 @@ H5PEditor.widgets.video = H5PEditor.widgets.audio = H5PEditor.AV = (function ($) return idCounter++; }; + C.STATE = { + NO_IMAGE: 'NO_IMAGE', + UPLOADING: 'UPLOADING', + HAS_IMAGE: 'HAS_IMAGE' + }; + + // Tabs that are hard-coded into this widget. Any other tab must be an extension. + C.TABS = { + UPLOAD: 0, + INPUT: 1 + }; + return C; })(H5P.jQuery); diff --git a/scripts/h5peditor-file-uploader.js b/scripts/h5peditor-file-uploader.js index 3953e4f6..846058dc 100644 --- a/scripts/h5peditor-file-uploader.js +++ b/scripts/h5peditor-file-uploader.js @@ -19,7 +19,7 @@ H5PEditor.FileUploader = (function ($, EventDispatcher) { * @param {Blob|File} file * @param {string} filename Required due to validation */ - self.upload = function (file, filename) { + self.upload = function (file, filename, context = {}) { var formData = new FormData(); formData.append('file', file, filename); formData.append('field', JSON.stringify(field)); @@ -29,12 +29,16 @@ H5PEditor.FileUploader = (function ($, EventDispatcher) { var request = new XMLHttpRequest(); request.upload.onprogress = function (e) { if (e.lengthComputable) { - self.trigger('uploadProgress', (e.loaded / e.total)); + self.trigger('uploadProgress', { + ...context, + progress: (e.loaded / e.total) + }); } }; request.onload = function () { var result; var uploadComplete = { + ...context, error: null, data: null }; @@ -77,22 +81,25 @@ H5PEditor.FileUploader = (function ($, EventDispatcher) { * * @param {File[]} files */ - self.uploadFiles = function (files) { - self.upload(files[0], files[0].name); + self.uploadFiles = function (files, context = {}) { + self.upload(files[0], files[0].name, context); }; /** * Open the file selector and trigger upload upon selecting file. */ - self.openFileSelector = function () { + self.openFileSelector = function ({ onChangeCallback, context } = {}) { // Create a file selector const input = document.createElement('input'); input.type = 'file'; input.setAttribute('accept', determineAllowedMimeTypes()); input.style='display:none'; input.addEventListener('change', function () { + if (typeof onChangeCallback === 'function') { + onChangeCallback(); + } // When files are selected, upload them - self.uploadFiles(this.files); + self.uploadFiles(this.files, context); document.body.removeChild(input); }); diff --git a/scripts/h5peditor-file.js b/scripts/h5peditor-file.js index 92288119..43f8d98a 100644 --- a/scripts/h5peditor-file.js +++ b/scripts/h5peditor-file.js @@ -59,6 +59,9 @@ ns.File = function (parent, field, params, setValue) { // Monitor upload progress self.on('uploadProgress', function (e) { + if (typeof self.handleUploadProgress === 'function') { + self.handleUploadProgress(Math.round(e.data.progress*100)); + } self.$file.children().html(ns.t('core', 'uploading') + ' ' + Math.round(e.data * 100) + ' %'); }); @@ -78,18 +81,17 @@ ns.File = function (parent, field, params, setValue) { // Make it possible for other widgets to process the result self.trigger('fileUploaded', result.data); - + self.setValue(self.field, self.params); for (var i = 0; i < self.changes.length; i++) { self.changes[i](self.params); } + self.addFile(); } catch (error) { - self.$errors.append(ns.createError(error)); + this.setErrorMessage(error); } - - self.addFile(); }); }; @@ -115,6 +117,7 @@ ns.File.prototype.appendTo = function ($wrapper) { var html = ns.createFieldMarkup(this.field, fileHtml, this.id); var $container = ns.$(html).appendTo($wrapper); + this.$container = $container; this.$copyrightButton = $container.find('.h5p-copyright-button'); this.$file = $container.find('.file'); this.$errors = $container.find('.h5p-errors'); diff --git a/scripts/h5peditor-image.js b/scripts/h5peditor-image.js index 9bc0d980..c7d71f04 100644 --- a/scripts/h5peditor-image.js +++ b/scripts/h5peditor-image.js @@ -22,6 +22,8 @@ ns.widgets.image = function (parent, field, params, setValue) { this.setValue = setValue; this.library = parent.library + '/' + field.name; this.id = ns.getNextFieldId(field); + this.previousState = typeof params === 'undefined' ? this.STATE.NO_IMAGE : this.STATE.HAS_IMAGE; + this.previousParams = params; if (params !== undefined) { this.copyright = params.copyright; @@ -41,13 +43,25 @@ ns.widgets.image = function (parent, field, params, setValue) { this.confirmationDialog = new H5P.ConfirmationDialog({ headerText: H5PEditor.t('core', 'removeImage'), - bodyText: H5PEditor.t('core', 'confirmImageRemoval') - }); + dialogText: H5PEditor.t('core', 'confirmImageRemoval') + }).appendTo(document.body); this.confirmationDialog.on('confirmed', function () { + self.boxEl.classList.remove('h5p-dnd__box--has-image', 'h5p-dnd__box--is-inline'); + self.previousState = self.STATE.NO_IMAGE; self.removeImage(); }); + this.replaceCallback = () => {}; + this.confirmReplaceDialog = new H5P.ConfirmationDialog({ + headerText: H5PEditor.t('core', 'replaceImage'), + dialogText: H5PEditor.t('core', 'confirmReplaceImage') + }).appendTo(document.body); + + this.confirmReplaceDialog.on('confirmed', function () { + self.replaceCallback(); + }); + // When uploading starts self.on('upload', function () { // Hide edit image button @@ -56,10 +70,11 @@ ns.widgets.image = function (parent, field, params, setValue) { // When a new file has been uploaded self.on('fileUploaded', function (event) { + self.boxContainerEl.classList.remove('has-error'); // Uploaded new original image if (self.isOriginalImage) { delete self.params.originalImage; - self.editImagePopup.mime = self.params.mime + self.editImagePopup.mime = self.params.mime; } // Store width and height @@ -69,6 +84,12 @@ ns.widgets.image = function (parent, field, params, setValue) { // Show edit image button self.$editImage.removeClass('hidden'); self.isEditing = false; + + window.requestAnimationFrame(() => { + this.$container.get(0) + .querySelector('.h5p-editing-image-button') + .focus({focusVisible: true}); + }); }); }; @@ -83,31 +104,41 @@ ns.widgets.image.prototype.constructor = ns.widgets.image; ns.widgets.image.prototype.appendTo = function ($wrapper) { var self = this; - var htmlString = '
    ' + - '
    ' + - ''; + var htmlString = ` +
    +
    + ${this.getBaseMarkup()} +
    +
    +
    + +
    +
    + ` - if (!this.field.disableCopyright) { - htmlString += ''; - } + const markup = ns.createLabel(this.field, '', this.id) + ns.createDescription(this.field.description, this.id) + htmlString; + const wrapperClasses = ns.joinNonEmptyStrings(['field', `field-name-${this.field.name}`, this.field.type, ns.createImportance(this.field.importance), this.field.widget]); + const html = `
    ${markup}
    `; - htmlString += '
    ' + - '
    ' + - '' + - '
    '; + this.$container = ns.$(html).appendTo($wrapper); + this.$imageDropContainer = this.$container.find('.h5p-dnd__container'); + this.boxEl = this.$container.find(".h5p-dnd__box").get(0); + this.boxContainerEl = this.$container.find('.h5p-dnd__container').get(0); - var html = ns.createFieldMarkup(this.field, htmlString, this.id); + this.ariaLiveEl = this.$container.find('.h5p-sr-only').get(0); - var $container = ns.$(html).appendTo($wrapper); - this.$item = $container; - this.$editImage = $container.find('.h5p-editing-image-button'); - this.$copyrightButton = $container.find('.h5p-copyright-button'); - this.$file = $container.find('.file'); - this.$errors = $container.find('.h5p-errors'); + this.addDragAndDropListeners(); + + this.$editImage = this.$container.find('.h5p-editing-image-button'); + this.$copyrightButton = this.$container.find('.h5p-copyright-button'); + this.$file = this.$container.find('.file'); + + this.$errors = this.$container.find('.h5p-errors'); this.addFile(); - var $dialog = $container.find('.h5p-editor-dialog'); - $container.find('.h5p-copyright-button').add($dialog.find('.h5p-close')).click(function () { + const $dialog = this.$container.find('.h5p-editor-dialog'); + + this.$container.parent().on('click', '.h5p-copyright-button, .h5p-editor-dialog .h5p-close', () => { $dialog.toggleClass('h5p-open'); return false; }); @@ -133,6 +164,7 @@ ns.widgets.image.prototype.appendTo = function ($wrapper) { const filenameparts = self.params.path.match(/([^\/]+)\.([^#]+)/); + self.removeImage(); // Upload new image self.upload(e.data, filenameparts[1] + '-edit.' + filenameparts[2]); }); @@ -150,7 +182,7 @@ ns.widgets.image.prototype.appendTo = function ($wrapper) { self.$editImage.removeClass('loading'); }); - $container.find('.h5p-editing-image-button').click(function (event) { + this.$container.on('click', '.edit', function (event) { if (self.params && self.params.path) { var imageSrc; if (!self.isEditing) { @@ -164,6 +196,55 @@ ns.widgets.image.prototype.appendTo = function ($wrapper) { } }); + this.$container.on('click', '.h5p-dnd__btn__upload', (event) => { + event.preventDefault(); + event.stopPropagation(); + this.isOriginalImage = true; + this.openFileSelector(); + }); + + document.addEventListener('paste', (e) => { + if (document.activeElement.closest('.h5p-dnd__box') === this.boxEl) { + if (e.clipboardData.files.length === 0) { + this.boxContainerEl.classList.add("has-error"); + this.$container.find('.h5p-errors').text(ns.t('core', 'onlyPasteImageFiles')); + this.setAriaLiveErrorMessage(ns.t('core', 'onlyPasteImageFiles')); + } else { + this.uploadOrReplaceImage(e.clipboardData.files); + } + } + }); + + this.boxEl.addEventListener('keydown', (e) => { + if (this.boxEl.classList.contains('h5p-dnd__box--has-image')) { + if ((e.code === 'Space' || e.code === 'Enter')) { + this.isOriginalImage = true; + this.openFileSelector({ + onChangeCallback: () => { + this.removeImage(); + } + }); + } + } + }); + + this.boxEl.addEventListener('click', (e) => { + e.preventDefault(); + const imageContainerEl = this.boxEl.querySelector('.h5p-dnd__img__container'); + + // Only trigger file selector when we have an image and the user is actually clicking on the + // image (not the frame around). + if (this.boxEl.classList.contains('h5p-dnd__box--has-image') + && e.target.closest('.h5p-dnd__img__container') === imageContainerEl) { + this.isOriginalImage = true; + this.openFileSelector({ + onChangeCallback: () => { + this.removeImage(); + } + }); + } + }); + ns.File.addCopyright(self, $dialog, function (field, value) { if (self.params !== undefined) { self.params.copyright = value; @@ -173,88 +254,249 @@ ns.widgets.image.prototype.appendTo = function ($wrapper) { }; +/** + * Displays the error message to the user. + * + * @param {string} message + */ +ns.widgets.image.prototype.setErrorMessage = function (message) { + if (this.previousState === this.STATE.HAS_IMAGE) { + this.params = this.previousParams; + this.addFile(); + } else { + this.removeImage(); + } + + this.setAriaLiveErrorMessage(message); + this.boxContainerEl.classList.add('has-error'); + this.$container.find('.h5p-errors').text(message); +}; + +ns.widgets.image.prototype.setAriaLiveErrorMessage = function (message) { + this.ariaLiveEl.innerText = message; + // Note: Should last long enough for the screen reader to read the text above. + setTimeout(() => { + this.ariaLiveEl.innerText = ""; + }, 5000); +}; /** - * Sync copyright. + * Will either upload or replace (and upload) an image. + * + * @param {FileList} files */ -ns.widgets.image.prototype.setCopyright = function (value) { - this.copyright = this.params.copyright = value; +ns.widgets.image.prototype.uploadOrReplaceImage = function (files) { + if (typeof this.params !== 'undefined') { + // Need to make a copy of the file since Firefox loses the reference to it during the confirm replace dialog. + const filesBackup = [new File([files[0]], files[0].name, { type: files[0].type })]; + this.replaceCallback = () => { + this.removeImage(); + this.uploadFile(filesBackup); + }; + this.previousState = this.STATE.HAS_IMAGE; + this.previousParams = this.params; + this.confirmReplaceDialog.show(this.$imageDropContainer.offset().top); + } else { + this.previousState = this.STATE.NO_IMAGE; + this.previousParams = null; + this.uploadFile(files); + } }; +/** + * Add drag and drop listeners to the appropriate DOM elements. + */ +ns.widgets.image.prototype.addDragAndDropListeners = function () { + const boundedHandleDnD = this.handleDragAndDrop.bind(this); + + this.dropBlockEl = this.boxEl.querySelector('.h5p-dnd__box__block'); + this.boxEl.addEventListener('dragenter', boundedHandleDnD); + this.dropBlockEl.addEventListener('dragover', boundedHandleDnD); + this.dropBlockEl.addEventListener('dragend', boundedHandleDnD); + this.dropBlockEl.addEventListener('dragleave', boundedHandleDnD); + this.dropBlockEl.addEventListener('drop', boundedHandleDnD); +}; /** - * Creates thumbnail HTML and actions. + * Upload the first file in the FileList. + * @todo: handle multiple files? * - * @returns {boolean} True if file was added, false if file was removed + * @param {FileList} files */ -ns.widgets.image.prototype.addFile = function () { - var that = this; +ns.widgets.image.prototype.uploadFile = function (files) { + if (files.length > 0) { + this.upload(files[0], files[0].name); + } +}; - if (this.params === undefined) { +/** + * Handle drag and drop events. Will apply the correct css classes (styling) + * depending on event type and will handle uploading if the user drops the file. + * + * @param {Event} e + */ +ns.widgets.image.prototype.handleDragAndDrop = function (e) { + e.preventDefault(); + e.stopPropagation(); - // No image look - let html = '' + - '
    ' + ns.t('core', 'add') + '
    ' + - '
    ' - - this.$file - .html(html) - .children('.add') - .click(function () { - that.isOriginalImage = true; - that.openFileSelector(); - return false; - }); + const container = e.target.closest('.h5p-dnd__container'); + const boxBlock = container.querySelector('.h5p-dnd__box__block'); - // Remove edit image button - this.$editImage.addClass('hidden'); - this.$copyrightButton.addClass('hidden'); - this.isEditing = false; + if (e.type === 'dragenter') { + this.boxEl.classList.add('h5p-dnd__box--is-dragging') + } + else if (e.type === 'dragend' || (e.type === 'dragleave' && boxBlock === e.target)) { + this.boxEl.classList.remove('h5p-dnd__box--is-dragging'); + } + else if (e.type === 'drop') { + this.boxEl.classList.remove('h5p-dnd__box--is-dragging'); + this.uploadOrReplaceImage(e.dataTransfer.files); + } +}; - return false; +/** + * Generates the HTML for the NO_IMAGE state. + * + * @returns string The HTML for the NO_IMAGE state + */ +ns.widgets.image.prototype.getBaseMarkup = function () { + const copyPasteString = `${ns.t('core', 'ctrlKey')}${ns.t('core', 'commandKey')} + ${ns.t('core', 'pasteKey')}`; + const dragCopyPasteString = ns.t('core', 'dragAndDropAndPasteImage', { ':keyCombination': copyPasteString }); + return ` +
    +
    +
    + +
    + +
    +
    + ${dragCopyPasteString} +
    +
    +
    + +
    +
    + ${ns.t('core', 'dropImage')} +
    +
    + ` +}; + +/** + * Generates the HTML for the UPLOADING state. + * @returns string The HTML for the UPLOADING state + */ +ns.widgets.image.prototype.getUploadingMarkup = function () { + return ` +
    +
    +
    +
    +
    + `; +}; + +/** + * Generates the HTML for the HAS_IMAGE state. + * @returns string The HTML for the HAS_IMAGE state + */ +ns.widgets.image.prototype.getUploadedMarkup = function () { + const source = H5P.getPath(this.params.path, H5PEditor.contentId); + const altText = (this.field.label === undefined ? '' : this.field.label); + + return ` +
    +
    +
    +
    + ${altText} +
    +
    +
    +
    + ${ns.t('core', 'dragAndDropAndPasteReplaceImage')} +
    +
    + `; +}; + +/** + * Generates the HTML for the HAS_IMAGE state. This is an extra function needed + * as this HTML will be placed in a different place than the HTML from getUploadedMarkup(). + * @returns string The HTML for the HAS_IMAGE state + */ +ns.widgets.image.prototype.getImageActionMarkup = function () { + return ` +
    +
    + + + +
    + `; +}; + +/** + * + * @param {number} progress 0-100 the progress of uploading the image + */ +ns.widgets.image.prototype.handleUploadProgress = function (progress) { + // @todo: want to use progress for something? + + // Since this function is called multiple times during upload we only want to trigger + // the render of the uploading markup once. + if (this.boxContainerEl.querySelector('.h5p-loader__wrapper') === null) { + this.setAriaLiveErrorMessage(ns.t('core', 'uploadingImage')); + + this.boxEl.innerHTML = this.getUploadingMarkup(); + this.boxEl.classList.add('h5p-dnd__box--is-uploading'); + this.boxEl.classList.remove('h5p-dnd__box--is-dragging') } +}; + +/** + * Sync copyright. + */ +ns.widgets.image.prototype.setCopyright = function (value) { + this.copyright = this.params.copyright = value; +}; - var source = H5P.getPath(this.params.path, H5PEditor.contentId); - var altText = (this.field.label === undefined ? '' : this.field.label); - var fileHtmlString = '' + - ''; - - this.$file.html(fileHtmlString) - .children(':eq(0)') - .click(function () { - that.isOriginalImage = true; - that.openFileSelector(); - return false; - }) - .children('img') - .attr('src', source) - .end() - .next() - .click(function () { - that.confirmRemovalDialog.show(that.$file.offset().top); - return false; - }); - var $img = this.$file.find('img'); - $img.one('load', function () { - // Make editor resize - $img.addClass('loaded'); + this.boxEl.classList.add('h5p-dnd__box--is-inline','h5p-dnd__box--has-image') + this.boxEl.classList.remove('h5p-dnd__box--is-uploading'); + this.boxEl.innerHTML = this.getUploadedMarkup(); + this.boxEl.setAttribute('role', 'button'); + // Only aria-label is supported by NVDA (not aria-describedby which could be an alternative). + const altText = (this.field.label === undefined ? '' : this.field.label); + const ariaLabel = `${altText ?? ns.t('core', 'image')}. ${ns.t('core', 'dragAndDropAndPasteReplaceImage')}`; + this.boxEl.setAttribute('aria-label', ariaLabel); + const actionsContainerEl = document.createElement('div'); + actionsContainerEl.classList.add('h5p-image-action-container'); + actionsContainerEl.innerHTML = this.getImageActionMarkup(); + + this.boxContainerEl.insertBefore(actionsContainerEl, this.boxEl.nextElementSibling); + + this.boxContainerEl.querySelector('.delete').addEventListener('click', (e) => { + e.stopPropagation(); + this.confirmationDialog.show(this.$imageDropContainer.offset().top); }); - // Uploading original image - that.$editImage.removeClass('hidden'); - that.$copyrightButton.removeClass('hidden'); + this.cleanUp(); + this.addDragAndDropListeners(); // Notify listeners that image was changed to params - that.trigger('changedImage', this.params); + this.trigger('changedImage', this.params); return true; }; @@ -263,13 +505,24 @@ ns.widgets.image.prototype.addFile = function () { * Remove image */ ns.widgets.image.prototype.removeImage = function () { - + this.boxEl.classList.remove('h5p-dnd__box--is-uploading'); + this.boxContainerEl.classList.remove('has-error'); + this.cleanUp(); // Notify listeners that we removed image with params this.trigger('removedImage', this.params); + const actionsContainerEl = this.$container.find('.h5p-image-action-container').get(0); + if (actionsContainerEl) { + actionsContainerEl.remove(); + } + delete this.params; this.setValue(this.field); - this.addFile(); + + this.boxEl.removeAttribute('role'); + this.boxEl.innerHTML = this.getBaseMarkup(); + + this.addDragAndDropListeners(); for (var i = 0; i < this.changes.length; i++) { this.changes[i](); @@ -291,6 +544,16 @@ ns.widgets.image.prototype.remove = function () { this.$file.parent().remove(); }; +ns.widgets.image.prototype.cleanUp = function () { + const boundedHandleDnD = this.handleDragAndDrop.bind(this); + + this.boxEl.removeEventListener('dragenter', boundedHandleDnD); + this.dropBlockEl?.removeEventListener('dragover', boundedHandleDnD); + this.dropBlockEl?.removeEventListener('dragend', boundedHandleDnD); + this.dropBlockEl?.removeEventListener('dragleave', boundedHandleDnD); + this.dropBlockEl?.removeEventListener('drop', boundedHandleDnD); +} + /** * Collect functions to execute once the tree is complete. * @@ -304,3 +567,21 @@ ns.widgets.image.prototype.ready = function (ready) { ready(); } }; + +/** + * Lazy load images + */ +ns.widgets.imageObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + entry.target.src = entry.target.dataset.src; + ns.widgets.imageObserver.unobserve(entry.target); + } + }); +}); + +ns.widgets.image.prototype.STATE = { + NO_IMAGE: 'NO_IMAGE', + UPLOADING: 'UPLOADING', + HAS_IMAGE: 'HAS_IMAGE' +}; diff --git a/scripts/h5peditor-metadata.js b/scripts/h5peditor-metadata.js index 2e69b800..2be54e51 100644 --- a/scripts/h5peditor-metadata.js +++ b/scripts/h5peditor-metadata.js @@ -263,7 +263,7 @@ H5PEditor.MetadataForm = (function (EventDispatcher, $, metadataSemantics) { * @param {$} $element */ self.appendButtonTo = function ($item) { - $button.appendTo($item.children('.h5peditor-label-wrapper').wrap('
    ').parent()); + $button.appendTo($item.parent().find('.h5peditor-label-wrapper').first()); }; /** diff --git a/styles/css/application.css b/styles/css/application.css index f44107b1..c9af577d 100644 --- a/styles/css/application.css +++ b/styles/css/application.css @@ -1 +1 @@ -ul.list-unstyled{list-style:none;padding-left:0;margin:0}.field{margin:20px 0;font-size:16px;padding:0}.field:first-child{margin-top:0}.field:last-child{margin-bottom:0}.tree>.field.group:last-child{margin-bottom:0}.fields>.field.group{margin:10px 0}.fields>.field.group:first-child{margin-top:0}.fields>.field.group:last-child{margin-bottom:0}.field.boolean .h5peditor-label{display:inline}.field .h5p-editor-image-buttons{float:left;clear:both}.field .library{border:0}.field.importance-high>.h5peditor-label-wrapper>.h5peditor-label{font-size:18px;color:#356593}.field .h5p-dialog-anchor{position:relative;margin:-16px}.common-fields-library-wrapper{margin:20px 0;border:none;margin:0;padding:0}.common-fields-library-wrapper:first-child{margin-top:0}.common-fields-library-wrapper:last-child{margin-bottom:0}.common-fields-library-wrapper .common-field-legend{display:none}.common>.h5peditor-label,.h5p-li>.list-item-title-bar,.group>.title{visibility:inherit;cursor:pointer}.h5p-li>.list-item-title-bar.importance-high,.group.importance-high>.title{background:#2579c6;border:1px solid #1f67a8;height:42px}.h5p-li>.list-item-title-bar.importance-high>.title,.h5p-li>.list-item-title-bar.importance-high>.h5peditor-label,.group.importance-high>.title{font-size:16px;font-weight:600;line-height:42px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5p-li>.list-item-title-bar,.group>.title{background:#747275;border:1px solid #636164;height:38px}.h5p-li>.list-item-title-bar.importance-medium>.h5peditor-label,.h5p-li>.list-item-title-bar>.h5peditor-label,.group>.title{font-size:16px;font-weight:600;color:#fff;line-height:38px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.common>.h5peditor-label,.h5p-li>.list-item-title-bar.importance-low,.group.importance-low>.title{background:#f5f5f5;height:38px;border:1px solid #d0d0d1}.common>.h5peditor-label,.h5p-li>.list-item-title-bar.importance-low>.title,.h5p-li>.list-item-title-bar.importance-low>.h5peditor-label,.group.importance-low>.title{font-size:16px;font-weight:400;color:#212121;line-height:38px}.group{border:none}.group>.title{padding:0 10px;outline:none}.group>.content{position:relative;display:none;margin:0;padding:20px;border:1px solid #d0d0d1;border-top:none;background:#fff}.group.importance-high>.title{color:#fff}.group.importance-low>.title{color:#212121}.group.importance-low>.title:focus:before{outline:1px dashed}.common .content,.content .content{background-color:#fcfcfc}.common .content .content,.content .content .content{background-color:#fff}.common .content .content .content,.content .content .content .content{background-color:#fcfcfc}.common .content .content .content .content,.content .content .content .content .content{background-color:#fff}.common .content .content .content .content .content,.content .content .content .content .content .content{background-color:#fcfcfc}.common .content .content .content .content .content .content,.content .content .content .content .content .content .content{background-color:#fff}.h5p-li>.list-item-title-bar{color:#fff}.h5p-li>.list-item-title-bar>.h5peditor-label{overflow:hidden;margin:0 54px 0 0;padding:0 10px;white-space:nowrap;line-height:38px;outline:none;text-overflow:ellipsis}.h5p-li>.list-item-title-bar>.list-actions{height:100%;float:right;position:relative}.h5p-li>.list-item-title-bar .remove{cursor:pointer;width:1.25em;height:38px;font-size:1.75em;display:inline-block}.h5p-li>.list-item-title-bar .remove:hover{opacity:1;text-decoration:none}.h5p-li>.list-item-title-bar .remove:after{font-family:"H5P";content:"";opacity:.7;display:inline-block;line-height:38px}.h5p-li>.list-item-title-bar .remove:hover:after{opacity:1}.h5p-li>.list-item-title-bar .order-group{text-align:center;float:right;background:#636164;font-size:16px;cursor:pointer}.h5p-li>.list-item-title-bar .order-up,.h5p-li>.list-item-title-bar .order-down{width:19px;height:19px;line-height:19px}.h5p-li>.list-item-title-bar .order-up:hover,.h5p-li>.list-item-title-bar .order-down:hover{background:#636164}.h5p-li>.list-item-title-bar .order-up:after,.h5p-li>.list-item-title-bar .order-down:after{font-family:"H5P";content:"";display:inline-block}.h5p-li>.list-item-title-bar .order-down:after{content:""}.h5p-li>.list-item-title-bar.importance-high>.title{border:none;margin:0 74px 0 0}.h5p-li>.list-item-title-bar.importance-high .remove{height:42px;line-height:42px;font-size:40px}.h5p-li>.list-item-title-bar.importance-high .remove:after{line-height:42px;opacity:.7}.h5p-li>.list-item-title-bar.importance-high .remove:hover:after{opacity:1}.h5p-li>.list-item-title-bar.importance-high .order-group{background:#1f67a8;font-size:18px}.h5p-li>.list-item-title-bar.importance-high .order-up,.h5p-li>.list-item-title-bar.importance-high .order-down{width:21px;height:21px;line-height:21px}.h5p-li>.list-item-title-bar.importance-high .order-up:hover,.h5p-li>.list-item-title-bar.importance-high .order-down:hover{background:#1f67a8}.h5p-li>.list-item-title-bar.importance-low>.title{border:none;margin:0 54px 0 0}.h5p-li>.list-item-title-bar.importance-low>.title:before{color:#212121}.h5p-li>.list-item-title-bar.importance-low>.title:focus:before{outline:1px dashed #212121}.h5p-li>.list-item-title-bar.importance-low .remove{height:38px;line-height:38px;font-size:30px}.h5p-li>.list-item-title-bar.importance-low .remove:after{line-height:38px}.h5p-li>.list-item-title-bar.importance-low .remove:after{color:#212121;opacity:.7}.h5p-li>.list-item-title-bar.importance-low .remove:hover:after{opacity:1}.h5p-li>.list-item-title-bar.importance-low .order-up,.h5p-li>.list-item-title-bar.importance-low .order-down{width:19px;height:19px;background:#d0d0d1;font-size:16px;line-height:19px}.h5p-li>.list-item-title-bar.importance-low .order-up:hover,.h5p-li>.list-item-title-bar.importance-low .order-down:hover{background:#deddde}.h5p-li>.list-item-title-bar.importance-low .order-up:after,.h5p-li>.list-item-title-bar.importance-low .order-down:after{color:#212121}.group.expanded>.content,.listgroup.expanded>.content{display:block}.listgroup>.list-item-title-bar>.h5peditor-label{cursor:pointer}.list-item-title-bar>.title:before,.group>.title:before{content:"";font-family:"H5P";margin-right:5px}.list-item-title-bar>.title:focus:before,.group>.title:focus:before{outline:1px dashed #fff}.listgroup.expanded>.list-item-title-bar>.h5peditor-label:before,.expanded>.title:before{content:""}.listgroup>.group.field{margin:0;padding:0;min-width:0}.content{display:block;margin:0;padding:20px;border:1px solid #d0d0d1;border-top:none;background:#fff}.common{margin-top:20px}.common>.h5peditor-label{margin:0;padding:0 10px;cursor:pointer;font-size:1em}.common>.h5peditor-label>.icon:before{content:"";font-family:"H5P";margin-right:5px}.common>.h5peditor-label:hover>.icon{opacity:1}.common>.h5peditor-label:focus{outline:none}.common>.h5peditor-label:focus>.icon:before{outline:1px dashed}.common>.fields{min-height:2em;padding:20px;border:1px solid #d0d0d1;border-top:none;background:#fff;position:relative}.common>.fields>.desc{margin:0;font-size:.875em;color:#666;float:left}.common>.fields p:first-child{margin-bottom:20px}.common.collapsed>.h5peditor-label>.icon:before{content:""}.common.collapsed>.fields{display:none}.common.hidden{display:none}.h5peditor-button[aria-label]:before{content:attr(aria-label);visibility:hidden;position:absolute;top:115%;right:-10%;z-index:2;padding:.25em .75em;background:#212121;color:#fff;white-space:nowrap;font-size:14px;line-height:1.5;box-shadow:0 0 .5em #858585}.h5peditor-button[aria-label]:hover:before{visibility:visible}.h5peditor-button[aria-label][aria-disabled=true]:before{display:none}.h5peditor .h5p-editing-image-button{background:linear-gradient(to bottom, #fff 0, #f2f2f2 100%);font-size:14px;color:#212121;line-height:28px;padding-right:20px;margin-right:.5em;height:30px;padding-left:0;font-weight:normal}.h5peditor .h5p-editing-image-button:hover:not([disabled]){background:linear-gradient(to bottom, #fff 0, #d0d0d1 100%);border-color:#999}.h5peditor .h5p-editing-image-button:before{font-family:"H5P";content:"";color:#666;padding-right:.3em;padding-left:.45em;vertical-align:middle;font-size:1.5em;line-height:.9}.h5peditor .h5p-editing-image-button.loading:before{content:""}.h5peditor .h5p-editing-image-button.hidden,.h5peditor .h5p-copyright-button.hidden{display:none !important}.h5peditor .ui-dialog .h5p-editing-image-button,.h5peditor .ui-dialog .h5p-copyright-button{padding-left:.5em}body.h5p-editor-image-popup{position:relative}.h5p-editing-image-popup-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.8);padding:3em 1em;box-sizing:border-box;z-index:102}#darkroom-icons{top:0;left:0}.h5p-editing-image-popup-background.hidden{display:none}.h5p-editing-image-popup{display:inline-block;position:relative;top:0;background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.h5p-editing-image-header{padding:1em .75em}.h5p-editing-image{max-height:100%;max-width:100%}.h5p-editing-image.hidden{display:none}.h5p-editing-image-popup .darkroom-toolbar{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:0}.h5p-editing-image-popup .darkroom-toolbar:before{content:initial}.h5p-editing-image-popup .darkroom-image-container{padding:32px 2em}.h5p-editing-image-popup .darkroom-image-container .canvas-container{box-shadow:0 0 8px 3px rgba(0,0,0,.6);margin:auto}.h5p-editing-image-header-title{display:inline-block;font-size:1.25em}.h5p-editing-image-header-buttons{display:inline-block;float:right}.h5p-editing-image-loading{padding:1em}.h5p-editing-image-loading.hidden{display:none}.h5p-editing-image-editing-container{background:#666}.h5p-editing-image-header-buttons button{padding:.5em 1.75em;margin:0 0 0 1em;border:1px solid #ccc;border-radius:.25em;color:#333;cursor:pointer;background:#f2f2f2;background:-webkit-linear-gradient(top, #fff 0, #f2f2f2 100%);background:-ms-linear-gradient(top, #fff 0, #f2f2f2 100%)}.h5p-editing-image-header-buttons button:hover{background:#ededed}.h5p-editing-image-header-buttons .h5p-done{color:#fff;border-color:#20588f;background:#3673b5;background:-webkit-linear-gradient(top, #5A94D3 0, #3673B5 100%);background:-ms-linear-gradient(top, #5A94D3 0, #3673B5 100%)}.h5p-editing-image-header-buttons .h5p-done:hover{background:#3275bc;background:-webkit-linear-gradient(top, #3275bc 0, #285585 100%);background:-ms-linear-gradient(top, #3275bc 0, #285585 100%)}.h5p-editing-image-header-buttons .h5p-remove{background:none;border:none;color:#a00;padding-right:0;padding-left:0;border-radius:0}.h5p-editing-image-header-buttons .h5p-remove:hover{background:none;color:#e40000}.h5p-vtab-wrapper>.h5p-vtab-forms .h5p-remove:after{color:#d0d0d1}html,body{margin:0;padding:0;color:#212121;font-family:"Open Sans",sans-serif;max-width:960px;position:relative}a{text-decoration:none}.offsite{left:-9999px;opacity:0;position:absolute;top:0}.h5peditor{font-size:16px}.h5peditor .h5p-more-libraries{font-size:.875em;margin-top:.4em}.h5peditor .h5peditor-single>.field.library{border:0;padding:0}.h5peditor .cke_dialog_background_cover{width:100% !important;height:100% !important}.h5peditor .errors p,.h5peditor .h5p-errors{color:#da0001;white-space:normal}.h5peditor textarea{resize:vertical}.h5peditor .h5p-editor-flex-wrapper{display:flex;flex-direction:row}.h5peditor .h5p-editor-flex-wrapper.has-button-collapse{align-items:flex-end;margin-bottom:.5rem;width:100%}.h5peditor .h5p-editor-flex-wrapper.has-button-collapse.has-label{justify-content:space-between;gap:.5rem}.h5peditor .h5p-editor-flex-wrapper.has-button-collapse:not(.has-label){justify-content:flex-end}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse{align-items:center;background-color:#228380;background-image:none;border:3px solid #228380;border-radius:.4rem;box-sizing:border-box;display:grid;font-size:.815rem;font-weight:bold;grid-template-columns:auto 1fr;height:2.6rem;line-height:1.2rem;margin:0;padding:0 .6rem 0 .2rem}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse .label{white-space:nowrap}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse.collapsed .icon::before{content:"";font-family:"H5P";font-size:1.2rem;font-weight:normal;padding:0 .2rem 0 .2rem;vertical-align:middle}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse:not(.collapsed) .icon::before{content:"";font-family:"H5P";font-size:1.2rem;font-weight:normal;padding:0 .2rem 0 .2rem;vertical-align:middle}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse:hover:not([disabled]){background-color:#228380;background-image:none;border:3px solid #4dc2bf}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse.no-label{grid-template-columns:auto;padding:0 .2rem;width:auto}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse.no-label .label{display:none}.h5peditor .h5peditor-label-wrapper{display:flex;flex-direction:row}.h5peditor .has-important-description .h5peditor-field-description{display:none}.h5peditor .has-important-description .h5peditor-label-wrapper{float:left}.h5peditor .important-description-visible .h5peditor-field-important-description{display:block}.h5peditor .important-description-visible .h5peditor-label-wrapper{float:none}.h5peditor .important-description-visible .important-description-show{display:none}.h5peditor textarea,.h5peditor .h5peditor-text,.h5peditor .ckeditor{box-shadow:inset 0px 0px 5px rgba(0,0,0,.12);box-sizing:border-box;margin:0;padding:10px;min-height:40px;border:1px solid #d0d0d1;background:#fff;outline:none;font-size:16px;word-wrap:break-word}.h5peditor textarea a,.h5peditor .h5peditor-text a,.h5peditor .ckeditor a{text-decoration:underline}.h5peditor textarea figure.table,.h5peditor .h5peditor-text figure.table,.h5peditor .ckeditor figure.table{display:table;table-layout:fixed;margin:0 auto;padding:0;float:left}.h5peditor textarea figure.table table,.h5peditor .h5peditor-text figure.table table,.h5peditor .ckeditor figure.table table{border-collapse:collapse;height:100%;width:100%;border-spacing:0;border-width:1px;border-color:#494949}.h5peditor textarea figure.table table td,.h5peditor textarea figure.table table th,.h5peditor .h5peditor-text figure.table table td,.h5peditor .h5peditor-text figure.table table th,.h5peditor .ckeditor figure.table table td,.h5peditor .ckeditor figure.table table th{padding:1px;border-color:#494949;border-bottom-style:solid}.h5peditor textarea figure.table table td,.h5peditor .h5peditor-text figure.table table td,.h5peditor .ckeditor figure.table table td{border-width:.083em}.h5peditor textarea figure.table table th,.h5peditor .h5peditor-text figure.table table th,.h5peditor .ckeditor figure.table table th{border-width:.167em}.h5peditor textarea figure.table table tr:last-child>td,.h5peditor .h5peditor-text figure.table table tr:last-child>td,.h5peditor .ckeditor figure.table table tr:last-child>td{border-bottom-style:none}.h5peditor textarea figure.table figcaption,.h5peditor .h5peditor-text figure.table figcaption,.h5peditor .ckeditor figure.table figcaption{background-color:rgba(0,0,0,0);caption-side:top;color:#333;display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;text-align:center;word-break:break-word}.h5peditor textarea .table-overflow-protection,.h5peditor .h5peditor-text .table-overflow-protection,.h5peditor .ckeditor .table-overflow-protection{clear:both}.h5peditor textarea.error,.h5peditor .h5peditor-text.error,.h5peditor .ckeditor.error{border-color:red}.h5peditor .ck-content figure.table{float:left}.h5peditor .ck-content figure.table table{border-width:1px;border-color:#494949;border-style:none}.h5peditor .ck-content figure.table table td,.h5peditor .ck-content figure.table table th{padding:1px;border-style:none;border-color:#494949;border-bottom-style:solid}.h5peditor .ck-content figure.table table td{border-width:.083em}.h5peditor .ck-content figure.table table th{border-width:.167em;background-color:rgba(0,0,0,0)}.h5peditor .ck-content figure.table table tr:last-child>td{border-bottom-style:none}.h5peditor .ck-content figure.table figcaption{background-color:rgba(0,0,0,0)}.h5peditor .h5peditor-text,.h5peditor textarea{width:100%;box-sizing:border-box}.h5peditor .h5peditor-text.error,.h5peditor textarea.error{border-color:red}.h5peditor .ck a{text-decoration:underline}.h5peditor .ck .ck-font-size-dropdown .ck-dropdown__panel,.h5peditor .ck .ck-text-fragment-language-dropdown .ck-dropdown__panel{max-height:20em;overflow-y:scroll}.h5peditor .ck .ck-fontsize-option .ck-button__label{line-height:normal !important}.h5peditor .ck .ck-content pre{background:initial;border:initial;border-radius:initial;padding:0}.h5peditor textarea:focus::-webkit-input-placeholder,.h5peditor input:focus::-webkit-input-placeholder{color:#fff}.h5peditor textarea:focus:-moz-placeholder,.h5peditor input:focus:-moz-placeholder{color:#fff}.h5peditor textarea:focus::-moz-placeholder,.h5peditor input:focus::-moz-placeholder{color:#fff}.h5peditor textarea:focus:-ms-input-placeholder,.h5peditor input:focus:-ms-input-placeholder{color:#fff}.h5peditor textarea:focus.h5peditor-ckeditor-placeholder,.h5peditor input:focus.h5peditor-ckeditor-placeholder{color:#fff}.h5peditor ::-webkit-input-placeholder{color:#858585}.h5peditor :-moz-placeholder{color:#858585}.h5peditor ::-moz-placeholder{color:#858585}.h5peditor :-ms-input-placeholder{color:#858585}.h5peditor .h5peditor-ckeditor-placeholder{color:#858585}.h5peditor>select,.h5peditor .h5peditor-language-switcher select,.h5peditor h5peditor-select,.h5peditor .field>select{padding:10px 30px 10px 8px;font-family:"Open Sans",sans-serif;font-size:16px;border:1px solid #d0d0d1;background:#fff url(a1aff8c82bc779d09357.png) no-repeat;background-position:calc(100% - 10px);box-shadow:inset 0px 0px 5px rgba(0,0,0,.12);-moz-appearance:none;-webkit-appearance:none}.h5peditor>select:disabled,.h5peditor .h5peditor-language-switcher select:disabled,.h5peditor h5peditor-select:disabled,.h5peditor .field>select:disabled{background-color:#efefef}.h5peditor>select{margin-bottom:13px;margin-right:20px}.h5peditor select::-ms-expand{display:none}.h5peditor a:focus{outline:none}.h5peditor textarea:focus,.h5peditor .h5peditor-text:focus{outline:none;background-color:#fff;border-color:#53a0ff}.h5peditor .h5p-ul{padding:0;margin:0;list-style:none}.h5peditor .h5p-ul .h5p-li{margin:10px 0;padding:0;list-style:none}.h5peditor .h5p-ul .h5p-li:first-child{margin-top:0}.h5peditor .h5p-ul .h5p-li:last-child{margin-bottom:0}.h5peditor .h5p-ul .h5p-li.placeholder{box-sizing:border-box;background:#e8f2fa;border:dashed 2px #2782d1}.h5peditor .h5p-ul .h5p-li:hover{text-decoration:none}.h5peditor .h5p-ul .h5p-li:nth-child(2).moving{margin-top:0}.h5peditor .h5p-ul .h5p-li:nth-last-child(2).placeholder{margin-bottom:0}.h5peditor .dimensions input,.h5peditor .coordinates input,.h5peditor .number input{width:75px}.h5peditor .number input[type=range]{width:300px;float:left;margin:7px 8px 0 0}.h5peditor .h5p-errors{clear:both}.h5peditor .h5p-add-file{float:left;position:relative;background:rgba(0,0,0,0);border:2px dashed #ddd;color:#ddd;margin:.5em;width:6em;height:4.5em;cursor:pointer;outline:none;box-sizing:border-box;-moz-box-sizing:border-box}.h5peditor .h5p-add-file:focus,.h5peditor .h5p-add-file:hover{color:#999;border-color:#999}.h5peditor .h5p-add-file.hidden{visibility:hidden}.h5peditor .h5p-add-file:after{position:absolute;content:"+";font-size:2em;line-height:2.2em;width:100%;height:100%;text-align:center}.h5peditor .h5p-add-dialog{position:absolute;z-index:1;visibility:hidden;opacity:0;background:#fff;left:1em;right:1em;top:1em;border:1px solid #cdcdcd;box-sizing:border-box;-moz-box-sizing:border-box;box-shadow:0 0 8px #666;transition:visibility 0s .2s,opacity .2s}.h5peditor .h5p-add-dialog.h5p-open{visibility:visible;opacity:1;transition:visibility 0s 0s,opacity .2s}.h5peditor .h5p-add-dialog .h5p-add-dialog-table{overflow:hidden}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tablist{overflow:hidden;margin:1em 1em 0 1em}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab{cursor:pointer;float:left;padding:.5em .75em;border-top:1px solid #ccc;border-right:1px solid #ccc;font-weight:bold;font-size:15px;color:#666;background:#f5f5f5}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab:first-child{border-left:1px solid #ccc}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab.selected{color:#333;background:#fff}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tabpanel{border:1px solid #ccc;margin:0 1em 1em 1em;overflow:hidden;padding:1em}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tabpanel h3{margin:0 0 1em 0}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tabpanel .h5p-file-drop-upload{width:90px;margin:0}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-dialog-box{float:left;padding:0;width:60%;margin-right:5%;margin-left:4%;text-align:left;margin-top:30px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-dialog-box:first-child{width:22%;margin-left:3%;margin-right:1%}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-dialog-box:first-child h3{text-align:center}.h5peditor .h5p-add-dialog .h5p-add-dialog-table h3{color:#666;font-size:1em;margin:1.2em 0;line-height:1.1em}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5peditor-field-description{color:#bbb}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper{background-color:#f5f5f5;border:1px solid #bbb;padding:15px 15px 15px 60px;position:relative}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper:before{font-family:"H5P";position:absolute;left:0;top:.083em;font-size:3.8em;line-height:1}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper.video:before{content:"";color:#dd0505}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper.audio:before{content:"";color:#747275}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper input{border-color:#bbb;text-align:left;padding-left:20px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload{position:relative;width:70%;height:90px;margin:0 15%;float:left;background-color:#f5f5f5;text-align:center;cursor:pointer;border:1px solid #bbb}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner{border:2px dashed #bbb;background-color:#fff;position:absolute;top:3px;bottom:3px;left:3px;right:3px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner:after{font-family:"H5P";line-height:1.4em;font-size:3.5em;color:#bbb}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner.video:after{content:""}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner.audio:after{content:""}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload:hover .h5p-file-drop-upload-inner:after,.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload.over .h5p-file-drop-upload-inner:after{color:#999}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-or-vertical{float:left;position:relative;width:5%;height:250px}.h5peditor .h5p-add-dialog .h5p-dialog-box{text-align:center;padding:1em .5em}.h5peditor .h5p-add-dialog .h5p-buttons{padding:.5em;border-top:1px solid #cdcdcd;background:#ddd;text-align:right}.h5peditor .h5p-or{border-bottom:1px solid #cdcdcd;padding:0;margin:0 1em;text-align:center;height:.5em;line-height:1em}.h5peditor .h5p-or>span{background:#fff;padding:0 .5em}.h5peditor .h5p-or-vertical{float:left;position:relative;width:50px;height:80px}.h5peditor .h5p-or-vertical .h5p-or-vertical-line{position:absolute;margin:10px 0;left:49%;top:0;bottom:0;width:1px;background:#ccc;z-index:1}.h5peditor .h5p-or-vertical .h5p-or-vertical-word-wrapper{text-align:center;height:18px;position:absolute;left:0;right:0;top:22%;margin-top:-12px;z-index:2}.h5peditor .h5p-or-vertical .h5p-or-vertical-word-wrapper .h5p-or-vertical-word{color:#999;font-weight:bold;font-size:18px;padding:3px;background:#fff}.h5peditor .h5p-file-url{text-align:center}.h5peditor .h5p-thumbnail{margin:.5em;width:6em;height:4.5em;display:block;float:left;position:relative;box-shadow:0 0 10px 0 #666;border:1px solid #fff;box-sizing:border-box;-moz-box-sizing:border-box}.h5peditor .h5p-thumbnail .h5p-remove{position:absolute;top:0;right:0;cursor:pointer;outline:none;width:1.6em;height:1.6em;line-height:1.6em;overflow:hidden;text-indent:-0.4em;padding:.065em;opacity:.6}.h5peditor .h5p-thumbnail .h5p-remove:hover,.h5peditor .h5p-thumbnail .h5p-remove:focus{opacity:1}.h5peditor .h5p-thumbnail .h5p-remove:after{font-family:"H5P";font-size:2em;color:#fff;content:"";opacity:.6}.h5peditor .h5p-type{position:absolute;width:100%;height:100%;font-size:1.1em;line-height:4em;display:block;text-align:center;background:#000;color:#fff;cursor:pointer}.h5peditor .file{position:relative;float:left;margin-bottom:0;max-width:100%}.h5peditor .file.authorList{float:none}.h5peditor .file.field{float:none}.h5peditor .file .thumbnail{display:inline-block;margin:10px 10px 10px 0;box-shadow:0 0 10px 0 #666;border:1px solid #fff;cursor:pointer;max-width:100%;min-width:1em;min-height:1em;background:#fff url(ae8568c2320881fd5899.png) repeat}.h5peditor .file .thumbnail:focus{box-shadow:0 0 10px 0 #222}.h5peditor .file .add{display:inline-block;cursor:pointer;padding:.5em 1.5em .5em 3em;background:linear-gradient(to bottom, #fbfbfb 0, #f2f2f2 100%);border:1px solid #d0d0d1;border-radius:.25em;color:#222;font-weight:bold;line-height:normal}.h5peditor .file .add:hover{background:#ededed}.h5peditor .file .add:focus{box-shadow:0 0 16px 0 rgba(133,188,255,.84)}.h5peditor .file .add .h5peditor-field-file-upload-text:before{font-family:"H5P";content:"";line-height:1;color:#39c943;font-size:2em;position:absolute;left:.3em;top:.1em}.h5peditor .file .remove{display:block;position:absolute;top:7px;right:7px;cursor:pointer}.h5peditor .file .remove:focus:before{opacity:1}.h5peditor .file .remove:before{font-family:"H5P";font-size:1.4em;color:#fff;content:"";opacity:.6;text-shadow:rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px}.h5peditor .file .remove:hover{text-decoration:none}.h5peditor .file .remove:hover:before{color:#fff;opacity:1;text-shadow:rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px}.h5peditor .file img{max-width:100%;vertical-align:bottom;max-height:100px}.h5peditor .file .h5p-av-row{overflow:auto;margin-bottom:.5em}.h5peditor .file .h5p-av-row .h5p-thumbnail{display:table-cell}.h5peditor .file .h5p-av-row .h5p-video-quality{display:table-cell;overflow:hidden;width:10000px;padding-left:1em}.h5peditor .file .h5p-av-row .h5p-video-quality input.h5peditor-text{width:100%}.h5peditor .file .h5p-av-cell{overflow:auto;float:left}.h5peditor .video .file,.h5peditor .audio .file{position:static;overflow:visible}.h5peditor .video .file .thumbnail,.h5peditor .video .file .add,.h5peditor .audio .file .thumbnail,.h5peditor .audio .file .add{float:left}.h5peditor .video .file .add,.h5peditor .audio .file .add{margin-top:8px}.h5peditor .video .file .thumbnail,.h5peditor .audio .file .thumbnail{overflow:visible;position:relative;cursor:auto}.h5peditor .video .file .remove,.h5peditor .audio .file .remove{top:-3px;right:-5px}.h5peditor .video .file .type,.h5peditor .audio .file .type{padding:16px 8px 4px;background:#000;color:#fff;font-size:10px}.h5peditor .video .file .h5peditor-uploading,.h5peditor .audio .file .h5peditor-uploading{float:left;margin:.5em}.h5peditor .libwrap{margin-top:20px}.h5peditor .libwrap.no-margin,.h5peditor .libwrap:empty{margin-top:0}.h5peditor input[type=checkbox]{margin:4px 4px 4px 0;vertical-align:bottom}.h5peditor .moving{position:absolute;z-index:1;opacity:.8;-webkit-transform:translateZ(0)}.h5peditor .moving .h5peditor-label{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.h5peditor .h5peditor-uploading,.h5peditor .h5peditor-loading{padding-top:10px;padding-bottom:6px;font-size:14px}.h5peditor .h5peditor-loading{padding:.875em 0 1em 3.25em;font-style:italic}.h5peditor .h5p-copyright-button{border-radius:.25em;height:30px;background:linear-gradient(to bottom, #fff 0, #f2f2f2 100%);border:1px solid #d0d0d1;color:#212121;font-size:14px;line-height:28px;padding-right:20px;padding-left:0;clear:both;font-weight:normal}.h5peditor .h5p-copyright-button:before{font-family:"H5P";content:"";color:#666;padding:0 .25em 0 .25em;vertical-align:middle;font-size:1.5em;line-height:.9}.h5peditor .h5p-copyright-button:hover:not([disabled]){background:linear-gradient(to bottom, #fff 0, #d0d0d1 100%);text-decoration:none;border-color:#999}.h5peditor .h5p-copyright-button:focus{box-shadow:0 0 16px 0 rgba(133,188,255,.84)}.h5peditor .field.file>.h5p-copyright-button,.h5peditor .field.video>.h5p-copyright-button,.h5peditor .field.audio>.h5p-copyright-button{float:left}.h5peditor .h5p-editor-dialog{position:absolute;z-index:2;margin:5.5em 0 1em;visibility:hidden;opacity:0;height:0;overflow:hidden;background:#fff;box-shadow:0 0 8px #666;transition:visibility 0s .2s,height 0s .2s,opacity .2s,margin-top .2s}.h5peditor .h5p-editor-dialog.h5p-open{margin-top:3.5em;visibility:visible;opacity:1;height:auto;transition:visibility 0s 0s,height 0s 0s,opacity .2s,margin-top .2s}.h5peditor .h5p-editor-dialog>.field{margin:0;border:0;box-shadow:none}.h5peditor .h5p-editor-dialog .content{border:none;background:#fff}.h5peditor .h5p-editor-dialog .content .h5peditor-label{font-size:18px;font-weight:600}.h5peditor .h5p-editor-dialog .h5p-close{color:#494949}.h5peditor .h5p-editor-dialog .h5p-close:before{font-size:2em;right:-0.125em;top:0;position:absolute;z-index:1;font-family:"H5P";content:"";line-height:1em;transition:scale .2s}.h5peditor .h5p-editor-dialog .h5p-close:hover:before{scale:1.1,1.1}.h5peditor .h5p-li>.content>.library{border:0;padding:0}.ck-powered-by-balloon{display:none !important}.h5p-editor-dialog.h5p-dialog-wide{width:90%;border-radius:.208em}.h5peditor-button-textual{border-radius:.25em;background:#747275;background-image:linear-gradient(#7b797c 50%, transparent 50%, transparent);display:inline-block;width:auto;margin:10px 0 0 0;padding:0 20px;box-sizing:border-box;height:38px;border:1px solid #d0d0d1;font-size:16px;font-family:"Open Sans",sans-serif;line-height:38px;color:#fff;cursor:pointer;font-weight:600;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5peditor-button-textual:focus{box-shadow:0 0 16px 0 rgba(133,188,255,.84)}.h5peditor-button-textual:before,.h5peditor-button-textual:after{color:#fff}.h5peditor-button-textual .h5p-editing-image-button:before{font-family:"H5P";content:"";color:#666;padding-right:.25em;vertical-align:middle;font-size:1.5em;line-height:.9}.h5peditor-button-textual:hover:not([disabled]){background:#636164;background-image:linear-gradient(#6b696c 50%, transparent 50%, transparent);text-decoration:none}.h5peditor-button-textual.importance-high{background:#2579c6;background-image:linear-gradient(#3080c9 50%, transparent 50%, transparent);border-color:#1f67a8;text-transform:uppercase;height:42px;line-height:42px}.h5peditor-button-textual.importance-high:hover:not([disabled]){background:#1f67a8;background-image:linear-gradient(#2a6fac 50%, transparent 50%, transparent);border-color:#1f67a8}.h5peditor-button-textual.importance-low{background:#f5f5f5;background-image:linear-gradient(#eeeeef 50%, transparent 50%, transparent);border-color:#d0d0d1;color:#212121}.h5peditor-button-textual.importance-low:before,.h5peditor-button-textual.importance-low:after{color:#212121}.h5peditor-button-textual.importance-low:hover:not([disabled]){background:#deddde;background-image:linear-gradient(#deddde 50%, transparent 50%, transparent);border-color:#deddde}.h5peditor-button-textual[disabled],.h5peditor-button-textual[aria-disabled=true]{background:#f5f5f5;color:#707171;border-color:#eee;cursor:not-allowed}.h5peditor-button-textual[disabled]:before,.h5peditor-button-textual[aria-disabled=true]:before{font-family:"H5P";content:"";color:#707171;margin-right:.5em;vertical-align:top}.h5peditor-field-description,.h5p-help-text{font-size:12px;margin-top:.3em;margin-bottom:1em;font-weight:500;color:#434446;line-height:15px;letter-spacing:.5px}.h5peditor-field-important-description{position:relative;padding:1.5em 2.2em 2em 2.2em;font-size:.9em;margin:0 0 20px 0;border:1px solid #ffde78;background-color:#f9f9d8;color:#000;display:none}.h5peditor-field-important-description .important-description-close{position:absolute;font-size:.9em;line-height:2em;right:1.5em;top:1em;user-select:none;cursor:pointer}.h5peditor-field-important-description .important-description-close:before{font-family:"H5P";content:"";vertical-align:top;font-size:1.6em}.h5peditor-field-important-description .h5p-info-icon{font-size:.75em}.h5peditor-field-important-description .h5p-info-icon:before{font-family:"H5P";content:"";font-size:2.3em;line-height:.94em;margin-left:-0.3em;vertical-align:middle}.h5peditor-field-important-description .important-description-title{font-weight:bold;font-size:1.2em;vertical-align:bottom}.h5peditor-field-important-description .important-description-content ul{padding:0;line-height:2em;margin-top:20px}.h5peditor-field-important-description .important-description-content ul li{line-height:1.8em;margin-left:1.5em}.h5peditor-field-important-description .important-description-example{border:1px solid #bbde98;background-color:#d9fac3;display:flex;margin-top:20px}.h5peditor-field-important-description .important-description-example .important-description-example-title{padding:15px;font-weight:bold}.h5peditor-field-important-description .important-description-example .important-description-example-text{padding:15px;width:100%;background-color:#f6fef1}.h5peditor-form{position:relative;background:#fcfcfc;border:1px solid #d0d0d1}.h5peditor-form.h5peditor-form-manager>.tree,.h5peditor-form.h5peditor-form-manager>.common,.h5peditor-form.h5peditor-form-manager>.field{max-width:918px;margin:20px auto;padding:0 20px}.h5peditor-form.h5peditor-semi-fullscreen{margin:0;position:fixed;overflow-y:scroll;margin-top:40px;padding-bottom:40px;box-sizing:border-box;background:#fff;height:calc(100% - 40px)}.h5peditor-label{display:block;margin-bottom:6px;font-weight:600;font-size:16px;color:#454347}.h5peditor-label-button{background:rgba(0,0,0,0);border:none;color:#454347;cursor:pointer;display:flex;flex-direction:row;font-family:inherit;font-weight:600;font-size:16px;padding:0 0 0 10px;text-align:left}.h5peditor-label-button.collapsed .icon::before{content:"";font-family:"H5P";margin-right:5px}.h5peditor-label-button:not(.collapsed) .icon::before{content:"";font-family:"H5P";margin-right:5px}#h5peditor-uploader{position:absolute;width:1px;height:1px;top:-1px;border:0;overflow:hidden}.h5p-tutorial-url,.h5p-example-url{font-size:1em;display:inline-flex;align-items:center;line-height:1;margin-right:1em;margin-bottom:.5em;margin-left:.25em;height:2rem;border-radius:1rem}.h5p-tutorial-url:focus,.h5p-example-url:focus{box-shadow:0px 0px 5px #1634f7}.h5p-tutorial-url:active,.h5p-example-url:active{border-color:#1c70ba}.h5p-tutorial-url::before,.h5p-example-url::before{font-family:"H5P";font-size:1.25em;border-radius:50%;width:2rem;height:2rem;position:absolute;display:flex;justify-content:center;align-items:center}.h5p-tutorial-url .h5p-tutorial-url-label,.h5p-tutorial-url .h5p-example-url-label,.h5p-example-url .h5p-tutorial-url-label,.h5p-example-url .h5p-example-url-label{font-style:italic;font-weight:bold;text-decoration:underline;margin:.25em .5em;margin-left:2rem;padding-left:.5em;padding-right:1em}.h5p-tutorial-url:active,.h5p-tutorial-url:hover{background-color:#eaffab}.h5p-tutorial-url::before{content:"";color:#eaffab;background-color:#749e00}.h5p-tutorial-url .h5p-tutorial-url-label{color:#415702}.h5p-example-url:active,.h5p-example-url:hover{background-color:#f8d4ff}.h5p-example-url::before{content:"";font-size:1em;color:#f8d4ff;background-color:#8f4f9c}.h5p-example-url .h5p-example-url-label{color:#422447}.h5peditor-widget-select{display:flex;flex-direction:row-reverse;justify-content:end;overflow:hidden;margin:0 0 -1px;padding:0;list-style:none}.h5peditor-widget-option{border:1px solid #ccc;margin-left:.5em;padding:.6em 1em;color:#0e1a25;font-size:.875em;background:#f5f5f5;line-height:1.285714286em;cursor:pointer;outline:none}.h5peditor-widget-option:hover{color:#000}.h5peditor-widget-option:active{color:#8e636a}.h5peditor-widget-active{background:#fff;line-height:1.357142857em;border-bottom:0}.h5peditor-widgets>.h5peditor-widget-wrapper{border:1px solid #ccc;margin:0 0 .25em;padding:.5em}.h5peditor-widgets>.h5peditor-label,.h5peditor-widgets>.h5peditor-label-button{float:left;margin-top:5px}.h5p-editor-iframe{margin-bottom:1em}.h5peditor-required:after{content:"*";color:#da0001;margin-left:.2em;position:relative;top:-0.2em}.h5peditor .cke_bottom,.h5peditor .cke_top{background:#d0d0d1}.h5peditor .cke_chrome{border:1px solid #f5f5f5;background:#d0d0d1}.h5peditor .cke_contents,.h5peditor .cke_toolgroup,.h5peditor .cke_combo_button{border:1px solid #f5f5f5}.important-description-show{background:#f3d55a;padding:.2em .5em .2em 1.7em;margin-bottom:.5em;font-size:.9em;cursor:pointer;float:right;position:relative;line-height:normal;font-style:italic;font-weight:bold}.important-description-show:before{font-family:"H5P";font-style:normal;font-weight:normal;content:"";font-size:1.8em;position:absolute;left:0em;top:0em;line-height:.85em;vertical-align:top}.important-description-clear-right{display:block;clear:right}.h5peditor fieldset.common-fields-library-wrapper{width:100%;padding:0 1em 1em;box-sizing:border-box;height:20px;border:solid 1px #e2e5ee;border-radius:4px;margin-bottom:1em}.h5peditor fieldset.common-fields-library-wrapper>*{display:none}.h5peditor fieldset.common-fields-library-wrapper>legend{display:block;cursor:pointer;outline:none;color:#363b42;background-color:#fff;padding:10px;font-weight:bold;font-size:.875em}.h5peditor fieldset.common-fields-library-wrapper>legend:before{font-family:"H5P";content:"";margin-right:.5em}.h5peditor fieldset.common-fields-library-wrapper>legend:focus:before{outline:1px dotted #666}.h5peditor fieldset.common-fields-library-wrapper.expanded{height:auto}.h5peditor fieldset.common-fields-library-wrapper.expanded>*{display:block}.h5peditor fieldset.common-fields-library-wrapper.expanded>legend:before{content:""}.h5p-metadata-button-wrapper{display:flex;flex-direction:row;align-items:center;margin-top:-7px;margin-left:7px;cursor:pointer}.h5p-metadata-button-wrapper.inline-with-selector{display:inline-flex;margin-left:17px}.h5p-metadata-toggler{margin-left:-11px;height:14.5px;max-height:14.5px;padding:.217rem .3rem .217rem .217rem;font-size:.625em;font-weight:bold;letter-spacing:.025em;border:1px solid #b6cada;border-left:none;border-radius:4px;background:linear-gradient(#fff, #deeaf1);color:#356593;z-index:1;justify-content:center;align-content:center;line-height:1.5em}.h5p-metadata-button-tip{width:16.5px;height:16.5px;content:"";background:linear-gradient(-215deg, #fff, #deeaf1);border:1px solid #b6cada;border-right:none;border-top:none;border-radius:4px;transform:rotate(45deg);z-index:0}.h5p-metadata-button-wrapper:hover .h5p-metadata-toggler,.h5p-metadata-button-wrapper:hover .h5p-metadata-button-tip{border-color:#6d9fce}.h5p-metadata-button-wrapper:hover .h5p-metadata-toggler{background:linear-gradient(#f3f8fb, #cee5f3)}.h5p-metadata-button-wrapper:hover .h5p-metadata-button-tip{background:linear-gradient(-215deg, #f3f8fb, #cee5f3)}.h5p-metadata-button-wrapper:active .h5p-metadata-toggler,.h5p-metadata-button-wrapper:active .h5p-metadata-button-tip{color:#294f73;border-color:#6d9fce}.h5p-metadata-button-wrapper:active .h5p-metadata-toggler{background:linear-gradient(#f3f8fb, #bcd4e2)}.h5p-metadata-button-wrapper:active .h5p-metadata-button-tip{background:linear-gradient(-215deg, #f3f8fb, #bcd4e2)}#metadata-title-main-label{margin-top:0}.h5p-metadata-button{background:#fff;padding:10px;text-align:center;border-radius:5px;border:2px solid #6b6b6b;color:#6b6b6b;font-weight:bold;display:inline;cursor:pointer}.h5p-metadata-button:hover{border-color:#4a4a4a;color:#4a4a4a}.h5p-metadata-button:active{border-color:#000;color:#000}.h5p-metadata-button.inverted{border:2px solid #0a715e;color:#0a715e}.h5p-metadata-button.inverted:hover{border-color:#0d826c;color:#0d826c}.h5p-metadata-button.inverted:active{border-color:#095345;color:#095345}.h5p-metadata-icon-button{border:none;cursor:pointer;color:#6b6b6b;background:rgba(0,0,0,0);padding:0}.h5p-metadata-icon-button:hover{color:#4a4a4a}.h5p-metadata-icon-button:active{color:#000}.h5p-metadata-wrapper{display:inline-block;background-color:#fff;max-width:700px;width:calc(100% - 4em);text-align:left;border-bottom:20px solid rgba(0,0,0,0);background-clip:padding-box;max-height:calc(100% - 40px);overflow:auto;margin-bottom:20px}.h5p-metadata-wrapper .h5p-metadata-header{display:flex;border-bottom:1px solid #ced6e3;padding:1.5em}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container{flex-grow:1;padding-left:3.5em;white-space:nowrap;overflow:hidden;margin-right:1%;position:relative}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container h2{margin:0}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container p{margin:.1em}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container:before{position:absolute;font-family:"h5p-metadata-icons";content:"";left:0;top:0;font-size:2em;height:1.4em;line-height:1.3}.h5p-metadata-wrapper .h5p-save{border:solid 2px #0a715e;border-radius:.3rem;color:#fff;background-color:#0a715e;padding:.75rem;white-space:nowrap}.h5p-metadata-wrapper .h5p-save:hover{border-color:#0d826c;background-color:#0d826c}.h5p-metadata-wrapper .h5p-save:active{border-color:#095345;background-color:#095345}.h5p-metadata-wrapper .h5peditor-label{font-size:.8em;color:#333}.h5p-metadata-wrapper .h5peditor-field-description{color:#697484;margin-top:.35em;letter-spacing:.5px}.h5p-metadata-wrapper .copyright-form{margin-top:20px}.h5p-metadata-wrapper h2{font-size:1em;overflow:hidden;text-overflow:ellipsis}.h5p-metadata-wrapper p{font-size:.8333em;color:#697484;overflow:hidden;text-overflow:ellipsis;margin-bottom:0}.h5p-metadata-wrapper .errors p,.h5p-metadata-wrapper .h5p-errors p{color:#da0001;font-size:1em;white-space:normal;text-overflow:unset}.h5p-metadata-wrapper select.h5peditor-select,.h5p-metadata-wrapper input.h5peditor-text,.h5p-metadata-wrapper textarea{border:1px solid #b8c0cd;font-size:.833em;border-radius:.208em;box-shadow:none;font-family:"Open Sans",sans-serif}.h5p-metadata-wrapper select:focus,.h5p-metadata-wrapper input:focus,.h5p-metadata-wrapper textarea:focus{box-shadow:inset 0px 0px 10px rgba(0,0,0,.15)}.h5p-metadata-wrapper select{width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper{display:flex;flex-wrap:wrap;margin:1.5em}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field{margin-bottom:0;width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-license{width:49%;margin-right:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-licenseVersion{width:49%;margin-left:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearFrom{width:24%;margin-right:1%;white-space:nowrap}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearFrom .h5peditor-text{width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearTo{width:23%;margin-right:1%;margin-left:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearTo .h5peditor-text{width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-source{width:49%;margin-left:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label{justify-content:space-between}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle{background:none;border:none;cursor:pointer}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:before{font-family:"h5p-metadata-icons";content:"";margin-right:.5em;font-size:1.5em;vertical-align:middle}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:focus,.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:active,.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:hover{border:none}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:hover .h5p-a11y-title-text{text-decoration:underline}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-a11yTitle{transition:max-height .2s,margin .2s;overflow:hidden}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-a11yTitle.hide{max-height:0;margin:0}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-a11yTitle.hidden{display:none}.h5p-metadata-wrapper .field.group>.title{font-weight:400;background:#f6f6f6;color:#323232;border:solid 1px #ced6e3;border-radius:.208em}.h5p-metadata-wrapper .field.group.expanded>.title{border-radius:.208em .208em 0 0}.h5p-metadata-wrapper .field.group>.title:focus{border-color:#4d90fe}.h5p-metadata-wrapper .field.group>.content{border:solid 1px #ced6e3;border-radius:0 0 .208em .208em;padding:20px;border-top:0}.h5p-metadata-additional-information{width:100%;margin-top:1em}.h5p-metadata-additional-information .content.h5peditor-single{min-height:2em;border:1px solid #d0d0d1;border-top:none;background:#fff}.h5p-metadata-additional-information .title{font-weight:400;background:#f6f6f6;color:#323232;border:solid 1px #ced6e3;border-radius:.208em}.h5p-metadata-additional-information .title:focus{border-color:#4d90fe}.h5p-metadata-popup-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.85);z-index:101;text-align:center}.h5p-metadata-changelog{width:100%}.h5p-metadata-changelog .field-name-change.expanded .content{display:flex;flex-wrap:wrap}.h5p-metadata-changelog .field-name-change .field-name-date{width:49%;margin-bottom:.5em;margin-right:1%;margin-top:0}.h5p-metadata-changelog .field-name-change .field-name-date span{width:100%}.h5p-metadata-changelog .field-name-change .field-name-author{width:49%;margin-bottom:.5em;margin-left:1%;margin-top:0}.h5p-metadata-changelog .field-name-change .field-name-log{width:100%}.h5p-metadata-changelog .field-name-change .h5p-add-author:before{content:"+";margin-right:.7em}.h5p-metadata-changelog .field-name-change .h5p-cancel{margin-right:10px}.h5p-metadata-changelog .field-name-change .h5p-metadata-changelog-buttons{width:100%}.h5p-metadata-changelog .field-name-change .h5p-metadata-logged-changes{width:100%;margin-top:1em}.h5p-metadata-changelog .field-name-change .h5p-metadata-logged-changes.editing{display:none}.h5p-metadata-changelog .field-name-change .h5p-metadata-logged-changes .h5peditor-field-description{margin-bottom:0}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-wrapper{margin-top:1em;border:solid 1px #ced6e3;border-radius:.208em;max-height:15.917rem;overflow-y:auto;padding:0 .5em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log{display:flex;margin-top:.5em;padding-bottom:.5em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log .h5p-metadata-delete{margin-left:2em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log .h5p-metadata-delete:after{font-family:"h5p-metadata-icons";content:"";font-size:1.2em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log .h5p-metadata-edit:after{font-family:"h5p-metadata-icons";content:"";font-size:1.2em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-buttons{min-width:3em;line-height:2.5}.h5p-metadata-changelog .field-name-change .h5p-metadata-log:not(:last-child){border-bottom:solid 1px #ced6e3}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-date{min-width:25%;font-size:.85em;font-style:italic;line-height:2.5}.h5p-metadata-changelog .field-name-change .h5p-metadata-description-wrapper{flex-grow:1;font-size:.85em;font-style:italic}.h5p-metadata-changelog .field-name-change .h5p-metadata-description-wrapper{font-weight:bolder}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-author{font-weight:normal}.h5p-metadata-changelog .field-name-change .h5p-metadata-new-log-message{width:100%;background:#c5e7e1;padding:.5em;margin-bottom:1em;color:#0a715e}.h5p-metadata-author-widget{display:flex;flex-direction:column;border:solid 1px #ced6e3;border-radius:.208em;width:100%;padding:1em;margin-top:1em}.h5p-metadata-author-widget .h5p-save-author{border:solid 2px #0a715e;color:#fff;background-color:#0a715e}.h5p-metadata-author-widget .h5p-save-author:hover{border-color:#0d826c;color:#fff;background-color:#0d826c}.h5p-metadata-author-widget .h5p-save-author:active{border-color:#095345;color:#fff;background-color:#095345}.h5p-metadata-author-widget .h5p-author-data{display:flex;flex-direction:row;flex-wrap:nowrap}.h5p-metadata-author-widget .h5p-author-data>.field{margin-bottom:0}.h5p-metadata-author-widget .field-name-name{flex-grow:1;margin-right:2%;overflow:hidden;white-space:nowrap;min-width:49%}.h5p-metadata-author-widget .field-name-role{margin-top:0;margin-right:2%;width:25%;flex-grow:1;overflow:hidden;white-space:nowrap}.h5p-metadata-author-widget .authorList{margin-top:1.5em;white-space:nowrap}.h5p-metadata-author-widget .authorList li{display:inline;margin-right:.5em}.h5p-metadata-author-widget .authorList li span{margin-right:1em;font-style:italic}.h5p-metadata-author-widget .h5p-author-list-wrapper{margin-top:.5em}.h5p-metadata-author-widget .h5p-author-list-wrapper ul{margin:0;padding:0}.h5p-metadata-author-widget .h5p-author-list-wrapper li{display:inline-block;margin-right:2em;list-style:none;font-weight:bold;font-size:.8em}.h5p-metadata-author-widget .h5p-author-list-wrapper .h5p-metadata-role{font-style:italic;margin:0 .6em;font-weight:normal;font-size:.85em;color:#757575}.h5p-metadata-author-widget .h5p-author-list-wrapper button:after{font-family:"h5p-metadata-icons";content:"";font-size:1em;position:relative;top:-0.1em}.h5peditor-copypaste-wrap{float:right}.h5peditor>.h5peditor-copypaste-wrap{margin-bottom:14px}.h5peditor-copypaste-wrap.hidden{display:none}.h5peditor-clearfix{clear:both}.h5peditor-paste-button,.h5peditor-copy-button{border:1px solid #deeeec;padding:.5em .75em .75em .5em;margin-left:.5em;border-radius:.25em;cursor:pointer;background:#f2faff;line-height:.5em}.h5peditor-paste-button:hover,.h5peditor-copy-button:hover{border-color:#bbdae8}.h5peditor-paste-button:active,.h5peditor-copy-button:active{background-color:#deeffb}.h5peditor-paste-button.disabled,.h5peditor-copy-button.disabled{color:#707070;background-color:#f5f5f5;border-color:#ededed;cursor:not-allowed}.h5peditor-copy-button:before,.h5peditor-paste-button:before{font-family:"H5P";margin-right:5px;font-size:1.5em;position:relative;top:.2em;color:#2372b3}.h5peditor-copy-button:before{content:""}.h5peditor-paste-button:before{content:""}.h5peditor-copy-button.disabled:before,.h5peditor-paste-button.disabled:before{color:#707070}.h5peditor-copy-button.disabled:before{content:""}.h5peditor-paste-button.disabled:before{content:""}.h5p-hub .h5peditor-paste-button{font-family:"Open Sans",sans-serif;color:#fff;border:solid 1px #9fc8f4;padding:0 .75em .5em .75em;background:rgba(0,0,0,0);line-height:1;height:auto;margin-top:.675em;margin-right:.675em}.h5p-hub .h5peditor-paste-button:hover{background:#4b5460;border-color:#606a78}.h5p-hub .h5peditor-paste-button:active{background:#434b55}.h5p-hub .h5peditor-paste-button.disabled{border-color:#30353d;background:#30353d;color:#c2c2c2}.h5p-hub .h5peditor-paste-button:before{color:#9fc8f4}.h5p-hub .h5peditor-paste-button.disabled:before{color:#c3c3c3}@font-face{font-family:"h5p-fullscreen-bar";src:url(./fonts/h5p-fullscreen-bar.eot);src:url(./fonts/h5p-fullscreen-bar.eot#iefix) format("embedded-opentype"),url(./fonts/h5p-fullscreen-bar.ttf) format("truetype"),url(./fonts/h5p-fullscreen-bar.woff) format("woff"),url(./fonts/h5p-fullscreen-bar.svg#h5p) format("svg");font-weight:normal;font-style:normal}.h5peditor-form-manager-head{background:#f5f5f5;color:#414141;border-bottom:1px solid #dfdfdf;height:41px;line-height:40px;box-sizing:border-box;position:relative;display:flex;z-index:3;justify-content:space-between;align-items:flex-start;box-shadow:0px 2px 2px rgba(128,128,128,.15);padding:0 1em 0 .5em}.h5peditor-form-manager-button{background:rgba(0,0,0,0);padding:0;border:0;cursor:pointer;color:#414141;position:relative;white-space:nowrap;line-height:normal}.h5peditor-form-manager-button-inner{display:block;outline:none}.h5peditor-form-manager-breadcrumb{display:flex;min-width:0;flex-grow:1}.h5peditor-form-manager-proceed{display:none;background:#186df7;color:#fff;font-size:14px;font-weight:bold;font-family:Open Sans,sans-serif;border-radius:2px;margin-right:5px;margin-top:5px;padding:5px 10px}.h5peditor-form-manager-proceed:hover{background:#20588f}.h5peditor-form-manager-fullscreen{width:24px;height:24px;font-size:20px;margin-top:9px;margin-left:.25em}.h5peditor-form-manager-fullscreen .h5peditor-form-manager-button-inner:before{font-family:"h5p-fullscreen-bar";content:""}.h5peditor-form-manager-fullscreen:after{visibility:hidden;position:absolute;top:120%;right:-10%;z-index:3;padding:.25em .75em;background:#212121;color:#fff;white-space:nowrap;font-size:14px;box-shadow:0 0 .5em #858585;text-indent:0;font-weight:normal;pointer-events:none;outline:none;line-height:normal;content:attr(aria-label)}.h5peditor-form-manager-fullscreen:hover:after,.h5peditor-form-manager-fullscreen:focus:after{visibility:visible}.h5peditor-semi-fullscreen .h5peditor-form-manager-fullscreen .h5peditor-form-manager-button-inner:before{content:""}.h5peditor-semi-fullscreen .h5peditor-form-manager-proceed{display:block}.h5peditor-semi-fullscreen .h5peditor-form-manager-head{position:fixed;top:0;left:0;right:0;z-index:2}.form-manager-exit.form-manager-fullscreen .h5peditor-form-manager-button-inner:before{content:""}.h5peditor-form-manager-title{position:relative;min-width:20px;font-weight:bold;font-size:14px}.h5peditor-form-manager-title:before{font-family:"h5p-fullscreen-bar";content:"";font-size:1.2em;position:relative;top:.1em;margin-right:.25em;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5peditor-form-manager-title.dragtext:before{content:""}.h5peditor-form-manager-title.markthewords:before{content:""}.h5peditor-form-manager-title.multichoice:before{content:""}.h5peditor-form-manager-title.interactivevideo:before{content:""}.h5peditor-form-manager-title.audio:before{content:""}.h5peditor-form-manager-title.truefalse:before{content:""}.h5peditor-form-manager-title.dialogcards:before{content:""}.h5peditor-form-manager-title.questionnaire:before{content:""}.h5peditor-form-manager-title.coursepresentation:before{content:""}.h5peditor-form-manager-title.dragquestion:before{content:""}.h5peditor-form-manager-title.summary:before{content:""}.h5peditor-form-manager-title.singlechoiceset:before{content:""}.h5peditor-form-manager-title.blanks:before{content:""}.h5peditor-semi-fullscreen+.h5p-metadata-popup-overlay{position:fixed}.h5peditor-semi-fullscreen+.h5p-metadata-popup-overlay .h5p-metadata-wrapper{margin-top:20px !important}.h5peditor .h5peditor-language-switcher{float:right;white-space:nowrap;margin-bottom:1em}.h5peditor .h5peditor-language-switcher .language-label{padding:0 10px;font-size:15px}.h5peditor .h5peditor-language-switcher select{padding:6px 30px 6px 8px;font-size:15px}.h5peditor-language-notice{display:none;clear:both;font-size:14px;background:#dcf6ff;color:#295b7a;padding:10px 20px 10px 40px;margin:1em 0;line-height:1.5;position:relative}.h5peditor-language-notice:before{font-family:h5p;content:"";position:absolute;left:15px;font-size:1.125em}.h5peditor-language-notice.show{display:block}.h5peditor-language-notice .first{font-weight:bold}.h5peditor-language-notice a{text-decoration:underline}.h5p-loader__wrapper{width:100%;height:100%;flex:1;display:flex;align-items:center;padding:10px;min-width:180px}.h5p-loader__wrapper .h5p-loader__icon{border:8px solid #d0cfd4;border-bottom-color:#554e4a;border-radius:50%;width:40px;height:40px;animation:rotation linear 1s infinite;margin:0 auto}@keyframes rotation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.h5p-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0} +ul.list-unstyled{list-style:none;padding-left:0;margin:0}.field{margin:20px 0;font-size:16px;padding:0}.field:first-child{margin-top:0}.field:last-child{margin-bottom:0}.tree>.field.group:last-child{margin-bottom:0}.fields>.field.group{margin:10px 0}.fields>.field.group:first-child{margin-top:0}.fields>.field.group:last-child{margin-bottom:0}.field.boolean .h5peditor-label{display:inline}.field .library{border:0}.field.importance-high>.h5peditor-label-wrapper>.h5peditor-label{font-size:18px;color:#356593}.field .h5p-dialog-anchor{position:relative;width:100%}.common-fields-library-wrapper{margin:20px 0;border:none;margin:0;padding:0}.common-fields-library-wrapper:first-child{margin-top:0}.common-fields-library-wrapper:last-child{margin-bottom:0}.common-fields-library-wrapper .common-field-legend{display:none}.common>.h5peditor-label,.h5p-li>.list-item-title-bar,.group>.title{visibility:inherit;cursor:pointer}.h5p-li>.list-item-title-bar.importance-high,.group.importance-high>.title{background:#2579c6;border:1px solid #1f67a8;height:42px}.h5p-li>.list-item-title-bar.importance-high>.title,.h5p-li>.list-item-title-bar.importance-high>.h5peditor-label,.group.importance-high>.title{font-size:16px;font-weight:600;line-height:42px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5p-li>.list-item-title-bar,.group>.title{background:#747275;border:1px solid #636164;height:38px}.h5p-li>.list-item-title-bar.importance-medium>.h5peditor-label,.h5p-li>.list-item-title-bar>.h5peditor-label,.group>.title{font-size:16px;font-weight:600;color:#fff;line-height:38px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.common>.h5peditor-label,.h5p-li>.list-item-title-bar.importance-low,.group.importance-low>.title{background:#f5f5f5;height:38px;border:1px solid #d0d0d1}.common>.h5peditor-label,.h5p-li>.list-item-title-bar.importance-low>.title,.h5p-li>.list-item-title-bar.importance-low>.h5peditor-label,.group.importance-low>.title{font-size:16px;font-weight:400;color:#212121;line-height:38px}.group{border:none}.group>.title{padding:0 10px;outline:none}.group>.content{position:relative;display:none;margin:0;padding:20px;border:1px solid #d0d0d1;border-top:none;background:#fff}.group.importance-high>.title{color:#fff}.group.importance-low>.title{color:#212121}.group.importance-low>.title:focus:before{outline:1px dashed}.common .content,.content .content{background-color:#fcfcfc}.common .content .content,.content .content .content{background-color:#fff}.common .content .content .content,.content .content .content .content{background-color:#fcfcfc}.common .content .content .content .content,.content .content .content .content .content{background-color:#fff}.common .content .content .content .content .content,.content .content .content .content .content .content{background-color:#fcfcfc}.common .content .content .content .content .content .content,.content .content .content .content .content .content .content{background-color:#fff}.h5p-li>.list-item-title-bar{color:#fff}.h5p-li>.list-item-title-bar>.h5peditor-label{overflow:hidden;margin:0 54px 0 0;padding:0 10px;white-space:nowrap;line-height:38px;outline:none;text-overflow:ellipsis}.h5p-li>.list-item-title-bar>.list-actions{height:100%;float:right;position:relative}.h5p-li>.list-item-title-bar .remove{cursor:pointer;width:1.25em;height:38px;font-size:1.75em;display:inline-block}.h5p-li>.list-item-title-bar .remove:hover{opacity:1;text-decoration:none}.h5p-li>.list-item-title-bar .remove:after{font-family:"H5P";content:"";opacity:.7;display:inline-block;line-height:38px}.h5p-li>.list-item-title-bar .remove:hover:after{opacity:1}.h5p-li>.list-item-title-bar .order-group{text-align:center;float:right;background:#636164;font-size:16px;cursor:pointer}.h5p-li>.list-item-title-bar .order-up,.h5p-li>.list-item-title-bar .order-down{width:19px;height:19px;line-height:19px}.h5p-li>.list-item-title-bar .order-up:hover,.h5p-li>.list-item-title-bar .order-down:hover{background:#636164}.h5p-li>.list-item-title-bar .order-up:after,.h5p-li>.list-item-title-bar .order-down:after{font-family:"H5P";content:"";display:inline-block}.h5p-li>.list-item-title-bar .order-down:after{content:""}.h5p-li>.list-item-title-bar.importance-high>.title{border:none;margin:0 74px 0 0}.h5p-li>.list-item-title-bar.importance-high .remove{height:42px;line-height:42px;font-size:40px}.h5p-li>.list-item-title-bar.importance-high .remove:after{line-height:42px;opacity:.7}.h5p-li>.list-item-title-bar.importance-high .remove:hover:after{opacity:1}.h5p-li>.list-item-title-bar.importance-high .order-group{background:#1f67a8;font-size:18px}.h5p-li>.list-item-title-bar.importance-high .order-up,.h5p-li>.list-item-title-bar.importance-high .order-down{width:21px;height:21px;line-height:21px}.h5p-li>.list-item-title-bar.importance-high .order-up:hover,.h5p-li>.list-item-title-bar.importance-high .order-down:hover{background:#1f67a8}.h5p-li>.list-item-title-bar.importance-low>.title{border:none;margin:0 54px 0 0}.h5p-li>.list-item-title-bar.importance-low>.title:before{color:#212121}.h5p-li>.list-item-title-bar.importance-low>.title:focus:before{outline:1px dashed #212121}.h5p-li>.list-item-title-bar.importance-low .remove{height:38px;line-height:38px;font-size:30px}.h5p-li>.list-item-title-bar.importance-low .remove:after{line-height:38px}.h5p-li>.list-item-title-bar.importance-low .remove:after{color:#212121;opacity:.7}.h5p-li>.list-item-title-bar.importance-low .remove:hover:after{opacity:1}.h5p-li>.list-item-title-bar.importance-low .order-up,.h5p-li>.list-item-title-bar.importance-low .order-down{width:19px;height:19px;background:#d0d0d1;font-size:16px;line-height:19px}.h5p-li>.list-item-title-bar.importance-low .order-up:hover,.h5p-li>.list-item-title-bar.importance-low .order-down:hover{background:#deddde}.h5p-li>.list-item-title-bar.importance-low .order-up:after,.h5p-li>.list-item-title-bar.importance-low .order-down:after{color:#212121}.group.expanded>.content,.listgroup.expanded>.content{display:block}.listgroup>.list-item-title-bar>.h5peditor-label{cursor:pointer}.list-item-title-bar>.title:before,.group>.title:before{content:"";font-family:"H5P";margin-right:5px}.list-item-title-bar>.title:focus:before,.group>.title:focus:before{outline:1px dashed #fff}.listgroup.expanded>.list-item-title-bar>.h5peditor-label:before,.expanded>.title:before{content:""}.listgroup>.group.field{margin:0;padding:0;min-width:0}.content{display:block;margin:0;padding:20px;border:1px solid #d0d0d1;border-top:none;background:#fff}.common{margin-top:20px}.common>.h5peditor-label{margin:0;padding:0 10px;cursor:pointer;font-size:1em}.common>.h5peditor-label>.icon:before{content:"";font-family:"H5P";margin-right:5px}.common>.h5peditor-label:hover>.icon{opacity:1}.common>.h5peditor-label:focus{outline:none}.common>.h5peditor-label:focus>.icon:before{outline:1px dashed}.common>.fields{min-height:2em;padding:20px;border:1px solid #d0d0d1;border-top:none;background:#fff;position:relative}.common>.fields>.desc{margin:0;font-size:.875em;color:#666;float:left}.common>.fields p:first-child{margin-bottom:20px}.common.collapsed>.h5peditor-label>.icon:before{content:""}.common.collapsed>.fields{display:none}.common.hidden{display:none}.h5peditor-button[aria-label]:before{content:attr(aria-label);visibility:hidden;position:absolute;top:115%;right:-10%;z-index:2;padding:.25em .75em;background:#212121;color:#fff;white-space:nowrap;font-size:14px;line-height:1.5;box-shadow:0 0 .5em #858585}.h5peditor-button[aria-label]:hover:before{visibility:visible}.h5peditor-button[aria-label][aria-disabled=true]:before{display:none}.h5peditor .h5p-delete-image-button,.h5peditor .h5p-editing-image-button{background:linear-gradient(to bottom, #fff 0, #f2f2f2 100%);font-size:14px;color:#212121;line-height:28px;padding-right:20px;margin-right:.5em;height:30px;padding-left:0;font-weight:normal}.h5peditor .h5p-delete-image-button:hover:not([disabled]),.h5peditor .h5p-editing-image-button:hover:not([disabled]){background:linear-gradient(to bottom, #fff 0, #d0d0d1 100%);border-color:#999}.h5peditor .h5p-delete-image-button:before,.h5peditor .h5p-editing-image-button:before{font-family:"H5P";color:#666;padding-right:.3em;padding-left:.45em;vertical-align:middle;font-size:1.5em;line-height:.9}.h5peditor .h5p-delete-image-button:before{content:""}.h5peditor .h5p-editing-image-button:before{content:""}.h5peditor .h5p-delete-image-button.loading:before,.h5peditor .h5p-editing-image-button.loading:before{content:""}.h5peditor .h5p-delete-image-button.hidden,.h5peditor .h5p-editing-image-button.hidden,.h5peditor .h5p-copyright-button.hidden{display:none !important}.h5peditor .ui-dialog .h5p-delete-image-button,.h5peditor .ui-dialog .h5p-editing-image-button,.h5peditor .ui-dialog .h5p-copyright-button{padding-left:.5em}body.h5p-editor-image-popup{position:relative}.h5p-editing-image-popup-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.8);padding:3em 1em;box-sizing:border-box;z-index:102}#darkroom-icons{top:0;left:0}.h5p-editing-image-popup-background.hidden{display:none}.h5p-editing-image-popup{display:inline-block;position:relative;top:0;background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.h5p-editing-image-header{padding:1em .75em}.h5p-editing-image{max-height:100%;max-width:100%}.h5p-editing-image.hidden{display:none}.h5p-editing-image-popup .darkroom-toolbar{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:0}.h5p-editing-image-popup .darkroom-toolbar:before{content:initial}.h5p-editing-image-popup .darkroom-image-container{padding:32px 2em}.h5p-editing-image-popup .darkroom-image-container .canvas-container{box-shadow:0 0 8px 3px rgba(0,0,0,.6);margin:auto}.h5p-editing-image-header-title{display:inline-block;font-size:1.25em}.h5p-editing-image-header-buttons{display:inline-block;float:right}.h5p-editing-image-loading{padding:1em}.h5p-editing-image-loading.hidden{display:none}.h5p-editing-image-editing-container{background:#666}.h5p-editing-image-header-buttons button{padding:.5em 1.75em;margin:0 0 0 1em;border:1px solid #ccc;border-radius:.25em;color:#333;cursor:pointer;background:#f2f2f2;background:-webkit-linear-gradient(top, #fff 0, #f2f2f2 100%);background:-ms-linear-gradient(top, #fff 0, #f2f2f2 100%)}.h5p-editing-image-header-buttons button:hover{background:#ededed}.h5p-editing-image-header-buttons .h5p-done{color:#fff;border-color:#20588f;background:#3673b5;background:-webkit-linear-gradient(top, #5A94D3 0, #3673B5 100%);background:-ms-linear-gradient(top, #5A94D3 0, #3673B5 100%)}.h5p-editing-image-header-buttons .h5p-done:hover{background:#3275bc;background:-webkit-linear-gradient(top, #3275bc 0, #285585 100%);background:-ms-linear-gradient(top, #3275bc 0, #285585 100%)}.h5p-editing-image-header-buttons .h5p-remove{background:none;border:none;color:#a00;padding-right:0;padding-left:0;border-radius:0}.h5p-editing-image-header-buttons .h5p-remove:hover{background:none;color:#e40000}.h5p-dnd__container{clear:both;margin-top:.5rem}.h5p-dnd__container.has-error .h5p-errors,.h5p-dnd__box.has-error .h5p-errors,.video-url-error-container.has-error .h5p-errors{margin-top:1em;display:flex;align-items:center}.h5p-dnd__container.has-error .h5p-errors:before,.h5p-dnd__box.has-error .h5p-errors:before,.video-url-error-container.has-error .h5p-errors:before{font-family:"H5P";content:"";font-size:1.5em;vertical-align:middle}.h5p-dnd__container .h5p-errors,.h5p-dnd__box .h5p-errors,.video-url-error-container .h5p-errors{display:none}.h5p-dnd__box{display:flex;flex-flow:row;align-items:stretch;justify-content:center;border:solid 2px #d0cfd4;border-radius:6px;flex:1;min-height:150px;position:relative;background:none;font-size:14px}.h5p-dnd__box--is-dashed{border:dashed 2px #d0cfd4}.h5p-dnd__box--is-inline{display:inline-flex}.h5p-dnd__box--has-image{flex-flow:column;width:min-content;min-height:auto;min-width:140px}.h5p-dnd__box:focus-visible{outline:none}.h5p-dnd__box:not(.h5p-dnd__box--is-uploading):hover{border:dashed 2px #acacac}.h5p-dnd__box--has-image:not(.h5p-dnd__box--is-uploading):hover,.h5p-dnd__box.h5p-dnd__box--is-focused:not(.h5p-dnd__box--is-uploading),.h5p-dnd__box:not(.h5p-dnd__box--is-uploading):focus,.h5p-dnd__box.h5p-dnd__box--is-dragging:not(.h5p-dnd__box--is-uploading){border:solid 2px #1670df}.h5p-dnd__box:focus:not(.h5p-dnd__box--has-image):not(.h5p-dnd__box--is-uploading):not(.h5p-dnd__box--is-inline) .h5p-dnd__column--is-highlighted{background:#fff}.h5p-dnd__box:focus:not(.h5p-dnd__box--has-image):not(.h5p-dnd__box--is-uploading):not(.h5p-dnd__box--is-inline) .h5p-dnd__column:not(.h5p-dnd__column--is-highlighted):not(.h5p-dnd__column--tight){background:#f6faff}.h5p-dnd__box__block{position:absolute;top:0;left:0;right:0;bottom:0;display:none;z-index:2}.h5p-dnd__box--is-dragging .h5p-dnd__box__block{display:block}.h5p-dnd__column{margin:10px;display:flex;flex-flow:column;align-items:center;justify-content:center;border-radius:6px;flex:1}.h5p-dnd__column--is-highlighted{background:#f6faff}.h5p-dnd__column--is-fixed{flex:0 0 150px}.h5p-dnd__column--is-full-width{flex:1}.h5p-dnd__column--show-when-focus{display:none}.h5p-dnd__column--is-padded{padding:0 20px}.h5p-dnd__column--is-padded-small{padding:0 10px}.h5p-dnd__column.h5p-dnd__column--is-padded-small{margin:0}.h5p-dnd__box--is-dragging .h5p-dnd__column--hide-when-focus{display:none}.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--is-dragging .h5p-dnd__column--show-when-focus,.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--has-image:focus .h5p-dnd__column--show-when-focus{display:flex}.h5p-dnd__column--tight{max-height:130px}.h5p-dnd__column--tight:has(.h5p-dnd__video-container){margin-right:0}.h5p-dnd__column__drag-text{margin-top:-5px}.h5p-dnd__btn{display:flex;align-items:center;justify-content:center;padding:8px 10px;gap:5px;border-radius:4px;border:1px solid #1f67a8;background:#2579c6;font-family:"Open Sans",sans-serif;font-size:1em;font-weight:600;color:#fff;cursor:pointer}.h5p-dnd__btn:focus{outline:solid 2px #1f67a8;outline-offset:2px}.h5p-dnd__btn:before{font-family:"H5P";content:"";vertical-align:middle;font-size:1.5em;line-height:.9;font-weight:400}.h5p-dnd__btn:hover{background:#1f67a8}.h5p-dnd__btn:focus{outline:solid 2px #1f67a8;outline-offset:2px}div:has(>.h5p-dnd__badge),div:has(>.h5p-dnd-nowrap),.h5p-dnd__column--is-padded:has(.h5p-dnd__badge){line-height:1.7}.h5p-dnd__badge{background:#e7e9ee;color:#434446;text-transform:uppercase;font-weight:400;font-size:12px;font-family:"Arial Black";border-radius:6px;padding:3px 8px;display:inline-flex;line-height:1.4}.h5p-dnd__badge .h5p-dnd__badge__separator{border-left:solid 2px rgba(67,68,70,.25);margin:3px 6px;overflow:hidden;display:inline-block;overflow:hidden;top:0;left:0;right:0;bottom:0;position:relative}.h5p-dnd__img{max-width:175px;max-height:120px;min-width:40px;min-height:40px;border-radius:6px;display:block}.h5p-dnd__img__container{position:relative;min-width:100%;display:flex;align-items:center;justify-content:center}.h5p-dnd__img__overlay{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:6px;background:#1670df;opacity:.9;color:#fff;display:none;cursor:pointer}.h5p-dnd__img__overlay:before{font-family:"H5P";content:"";font-size:2.5em}.h5p-dnd__img__container:hover .h5p-dnd__img__overlay,.h5p-dnd__box:focus:not(.h5p-dnd__box--is-uploading) .h5p-dnd__img__overlay,.h5p-dnd__box.h5p-dnd__box--is-dragging:not(.h5p-dnd__box--is-uploading) .h5p-dnd__img__overlay{display:flex;align-items:center;justify-content:center}.h5p-dnd__text{font-family:"Open Sans",sans-serif;font-size:14px;text-align:center;color:#454347}.h5p-dnd__upload-image-svg,.h5p-dnd__upload-audio-svg,.h5p-dnd__upload-video-svg{width:60px;height:43px;margin-bottom:13px}.h5p-dnd__upload-image-svg{background:url(./fonts/upload-image.svg) no-repeat}.h5p-dnd__upload-video-svg{background:url(./fonts/upload-video.svg) no-repeat}.h5p-dnd__upload-audio-svg{background:url(./fonts/upload-audio.svg) no-repeat}.h5p-dnd__play-icon-svg{background:url(./fonts/play-icon.svg) no-repeat;width:28px;height:29px}.h5p-dnd__drop-text{display:flex;flex-flow:column;align-items:center;justify-content:center;font-size:.9em}.h5p-dnd__drop-text:before{font-size:3.9em;font-family:"H5P";content:"";color:#3b435a;line-height:.9;margin-bottom:10px}.input-container{display:flex;align-items:center;border:solid 1px #d0d0d1;padding:3px;width:100%;border-radius:2px;background:#fff;gap:5px}.input-container:has(.input-video:focus){border:solid 1px #1570df}.h5p-dnd__av-container .h5p-dnd__box__url.h5p-dnd__box__video-paste .input-container input[type=text].input-video{border:0;flex:1;outline:0;font-size:1em;box-shadow:none}.h5p-dnd__av-container .h5p-dnd__box__url.h5p-dnd__box__video-paste .input-container input[type=text].input-video:focus{background:none;box-shadow:none}.video-url-error-container{display:flex;flex-direction:row;align-items:center;justify-content:center;margin-bottom:5px;width:100%}.video-url-error-container.hidden{display:none}.text-muted{color:#454347;text-align:center;font-family:"Open Sans",sans-serif;font-size:.85em;font-weight:400;line-height:normal}.text-center{text-align:center}.h5p-dnd__box__title{color:#454347;text-align:center;font-size:16px;font-weight:600;font-family:"Open Sans",sans-serif}.h5p-dnd__box.h5p-dnd__box__url,.h5p-dnd__box__url{display:flex;flex-flow:column;align-items:center;justify-content:center;color:#454347;font-size:14px;border-radius:6px;flex:1;min-height:169px;position:relative;background:none;padding:10px;gap:7px;min-width:271px;box-sizing:border-box}.h5p-dnd__box.h5p-dnd__box__url:focus:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-dragging):not(.h5p-dnd__box--is-uploading),.h5p-dnd__box.h5p-dnd__box__url:focus-within:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-dragging):not(.h5p-dnd__box--is-uploading),.h5p-dnd__box__url:focus:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-dragging):not(.h5p-dnd__box--is-uploading),.h5p-dnd__box__url:focus-within:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-dragging):not(.h5p-dnd__box--is-uploading){background:#f6faff;border:solid 2px #1570df}.h5p-dnd__box.h5p-dnd__box__url:focus-visible:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-uploading),.h5p-dnd__box__url:focus-visible:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-uploading){outline:0;border:solid 2px #1570df}.h5p-dnd__box.h5p-dnd__box__url.h5p-dnd__box__video-paste,.h5p-dnd__box__url.h5p-dnd__box__video-paste{border:solid 1px #d0cfd4;padding:20px}.h5p-dnd__box.h5p-dnd__box__action{flex:2}.h5p-dnd__box.h5p-dnd__box__video-paste{flex:1 0 fit-content}.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url{height:154px;min-height:110px;min-width:260px}.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url .h5p-dnd__upload-audio-svg,.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url .h5p-dnd__upload-video-svg{display:none}.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url.h5p-dnd__box.has-error{height:auto}.h5p-dnd__box--is-dashed:not(.h5p-dnd__box--is-uploading):hover{border:dashed 2px #acacac}.h5p-dnd__row{display:flex;flex:1;align-items:center;justify-content:center;width:100%}.h5p-bold{font-weight:700}.divider{border-top:solid 1px #d0cfd4;width:35%;margin:0 10px}.h5p-dnd__box--has-video{flex-flow:column;width:100%}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__box--has-video:focus .h5p-dnd__video-container{background:#1670df}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__box--has-video:focus .h5p-dnd__video-container:before{font-family:"H5P";content:"";font-size:2.5em}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__box--has-video:focus .h5p-dnd__video-container .h5p-dnd__video-overlay{display:none}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__video-container{cursor:pointer}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__video-container:hover{background:#1670df}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__video-container:hover:before{font-family:"H5P";content:"";font-size:2.5em}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) .h5p-dnd__video-container:hover .h5p-dnd__video-overlay{display:none}.h5p-dnd__videobox-wrapper--is-provider .h5p-dnd__box--has-video:focus,.h5p-dnd__videobox-wrapper--is-provider .h5p-dnd__box--has-video:hover{border:solid 2px #d0cfd4}.h5p-dnd__videobox-wrapper--has-label{min-width:400px;flex:1}.h5p-dnd__video-container{width:100%;height:100%;min-height:130px;background:#1b1b1b;border-radius:6px;overflow:hidden;display:flex;align-items:center;justify-content:center;color:#fff}.h5p-dnd__video-overlay{display:flex;flex-flow:column;justify-content:center;align-items:center;gap:10px}.h5p-dnd__box--has-video.h5p-dnd__box--is-dragging .h5p-dnd__video-container{background:#1670df}.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--has-image:focus .h5p-dnd__column--show-when-focus,.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--has-video:focus .h5p-dnd__column--show-when-focus{display:flex}.h5p-dnd__av-container{display:flex;align-items:flex-start;gap:11px;flex-flow:row wrap;margin-bottom:20px;container:h5p-dnd__av-container/inline-size}.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider)~.h5p-dnd__box__video-paste,.h5p-dnd__box--is-dragging+.h5p-dnd__box__video-paste{display:none}.h5p-dnd__videobox-wrapper--is-provider+.h5p-dnd__box__url{display:none}.h5p-dnd__box--is-uploading+.h5p-dnd__box__video-paste{display:none}.h5p-dnd__videobox-wrapper{width:195px;text-align:center}.h5p-dnd__video-quality{text-align:left;height:130px;display:flex;flex-flow:column;justify-content:space-between;box-sizing:border-box;border-left:solid 1px #ccc;padding:0 10px}.h5p-dnd__video-quality-title{font-size:14px}.h5p-dnd__video-quality-description{font-size:11px;line-height:normal;display:inline-block;font-family:"Open Sans",sans-serif}.h5p-dnd__box__url.h5p-dnd__box--is-dragging .h5p-dnd__column.h5p-dnd__column--is-highlighted{width:100%;margin:0}.h5p-dnd__btn__insert-url{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;max-width:150px}.h5p-dnd__btn__insert-url:before{content:""}@media(max-width: 525px){.h5p-dnd__box{flex-flow:column}}.h5p-dnd__box__url{container:h5p-dnd__box__url/inline-size}.h5p-dnd__row--when-wide,.h5p-dnd__column--when-wide{display:none}.h5p-dnd__row:has(.input-container),.h5p-dnd__row:has(.video-url-error-container){flex:0}.h5p-dnd__column--no-margin,.h5p-dnd__column--no-margin.h5p-dnd__column{margin:0}@container h5p-dnd__av-container (min-width: 760px){.h5p-dnd__box.h5p-dnd__box__action{flex-flow:row;align-items:stretch;padding:0}.h5p-dnd__row--when-wide,.h5p-dnd__column--when-wide{display:flex}.h5p-dnd__row--when-small,.h5p-dnd__column--when-small{display:none}.h5p-dnd__box.h5p-dnd__box__action,.h5p-dnd__box__action{background:#fff}}@container h5p-dnd__av-container (max-width: 760px){.h5p-dnd__badge,.h5p-dnd__column,.h5p-dnd__row{font-size:.85em}.text-muted{font-size:1em}.h5p-dnd__btn__insert-url{max-width:120px}}@container h5p-dnd__av-container (max-width: 250px){.h5p-dnd__box__url,.h5p-dnd__box.h5p-dnd__box__url,.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url{min-width:0;flex-basis:100%}.h5p-dnd__btn__insert-url{max-width:90px}.h5p-dnd__box__url.h5p-dnd__box__video-paste{padding:10px}}.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url.h5p-dnd__box.h5p-dnd__box__action{flex-flow:column;align-items:center;padding:10px}.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url .h5p-dnd__row--when-wide,.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url .h5p-dnd__column--when-wide{display:none}.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url .h5p-dnd__row--when-small,.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url .h5p-dnd__column--when-small{display:flex}.h5p-dnd-nowrap{white-space:nowrap}.h5p-vtab-wrapper>.h5p-vtab-forms .h5p-remove:after{color:#d0d0d1}html,body{margin:0;padding:0;color:#212121;font-family:"Open Sans",sans-serif;max-width:960px;position:relative}a{text-decoration:none}.offsite{left:-9999px;opacity:0;position:absolute;top:0}.h5peditor{font-size:16px}.h5peditor .h5p-more-libraries{font-size:.875em;margin-top:.4em}.h5peditor .h5peditor-single>.field.library{border:0;padding:0}.h5peditor .cke_dialog_background_cover{width:100% !important;height:100% !important}.h5peditor .errors p,.h5peditor .h5p-errors{color:#da0001;white-space:normal}.h5peditor textarea{resize:vertical}.h5peditor .h5p-editor-flex-wrapper{display:flex;flex-direction:row}.h5peditor .h5p-editor-flex-wrapper.has-button-collapse{align-items:flex-end;margin-bottom:.5rem;width:100%}.h5peditor .h5p-editor-flex-wrapper.has-button-collapse.has-label{justify-content:space-between;gap:.5rem}.h5peditor .h5p-editor-flex-wrapper.has-button-collapse:not(.has-label){justify-content:flex-end}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse{align-items:center;background-color:#228380;background-image:none;border:3px solid #228380;border-radius:.4rem;box-sizing:border-box;display:grid;font-size:.815rem;font-weight:bold;grid-template-columns:auto 1fr;height:2.6rem;line-height:1.2rem;margin:0;padding:0 .6rem 0 .2rem}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse .label{white-space:nowrap}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse.collapsed .icon::before{content:"";font-family:"H5P";font-size:1.2rem;font-weight:normal;padding:0 .2rem 0 .2rem;vertical-align:middle}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse:not(.collapsed) .icon::before{content:"";font-family:"H5P";font-size:1.2rem;font-weight:normal;padding:0 .2rem 0 .2rem;vertical-align:middle}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse:hover:not([disabled]){background-color:#228380;background-image:none;border:3px solid #4dc2bf}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse.no-label{grid-template-columns:auto;padding:0 .2rem;width:auto}.h5peditor .h5p-editor-flex-wrapper .h5peditor-button-collapse.no-label .label{display:none}.h5peditor .h5peditor-label-wrapper{display:flex;flex-direction:row}.h5peditor .has-important-description .h5peditor-field-description{display:none}.h5peditor .has-important-description .h5peditor-label-wrapper{float:left}.h5peditor .important-description-visible .h5peditor-field-important-description{display:block}.h5peditor .important-description-visible .h5peditor-label-wrapper{float:none}.h5peditor .important-description-visible .important-description-show{display:none}.h5peditor textarea,.h5peditor .h5peditor-text,.h5peditor .ckeditor{box-shadow:inset 0px 0px 5px rgba(0,0,0,.12);box-sizing:border-box;margin:0;padding:10px;min-height:40px;border:1px solid #d0d0d1;background:#fff;outline:none;font-size:16px;word-wrap:break-word}.h5peditor textarea a,.h5peditor .h5peditor-text a,.h5peditor .ckeditor a{text-decoration:underline}.h5peditor textarea figure.table,.h5peditor .h5peditor-text figure.table,.h5peditor .ckeditor figure.table{display:table;table-layout:fixed;margin:0 auto;padding:0;float:left}.h5peditor textarea figure.table table,.h5peditor .h5peditor-text figure.table table,.h5peditor .ckeditor figure.table table{border-collapse:collapse;height:100%;width:100%;border-spacing:0;border-width:1px;border-color:#494949}.h5peditor textarea figure.table table td,.h5peditor textarea figure.table table th,.h5peditor .h5peditor-text figure.table table td,.h5peditor .h5peditor-text figure.table table th,.h5peditor .ckeditor figure.table table td,.h5peditor .ckeditor figure.table table th{padding:1px;border-color:#494949;border-bottom-style:solid}.h5peditor textarea figure.table table td,.h5peditor .h5peditor-text figure.table table td,.h5peditor .ckeditor figure.table table td{border-width:.083em}.h5peditor textarea figure.table table th,.h5peditor .h5peditor-text figure.table table th,.h5peditor .ckeditor figure.table table th{border-width:.167em}.h5peditor textarea figure.table table tr:last-child>td,.h5peditor .h5peditor-text figure.table table tr:last-child>td,.h5peditor .ckeditor figure.table table tr:last-child>td{border-bottom-style:none}.h5peditor textarea figure.table figcaption,.h5peditor .h5peditor-text figure.table figcaption,.h5peditor .ckeditor figure.table figcaption{background-color:rgba(0,0,0,0);caption-side:top;color:#333;display:table-caption;font-size:.75em;outline-offset:-1px;padding:.6em;text-align:center;word-break:break-word}.h5peditor textarea .table-overflow-protection,.h5peditor .h5peditor-text .table-overflow-protection,.h5peditor .ckeditor .table-overflow-protection{clear:both}.h5peditor textarea.error,.h5peditor .h5peditor-text.error,.h5peditor .ckeditor.error{border-color:red}.h5peditor .ck-content figure.table{float:left}.h5peditor .ck-content figure.table table{border-width:1px;border-color:#494949;border-style:none}.h5peditor .ck-content figure.table table td,.h5peditor .ck-content figure.table table th{padding:1px;border-style:none;border-color:#494949;border-bottom-style:solid}.h5peditor .ck-content figure.table table td{border-width:.083em}.h5peditor .ck-content figure.table table th{border-width:.167em;background-color:rgba(0,0,0,0)}.h5peditor .ck-content figure.table table tr:last-child>td{border-bottom-style:none}.h5peditor .ck-content figure.table figcaption{background-color:rgba(0,0,0,0)}.h5peditor .h5peditor-text,.h5peditor textarea{width:100%;box-sizing:border-box}.h5peditor .h5peditor-text.error,.h5peditor textarea.error{border-color:red}.h5peditor .ck a{text-decoration:underline}.h5peditor .ck .ck-font-size-dropdown .ck-dropdown__panel,.h5peditor .ck .ck-text-fragment-language-dropdown .ck-dropdown__panel{max-height:20em;overflow-y:scroll}.h5peditor .ck .ck-fontsize-option .ck-button__label{line-height:normal !important}.h5peditor .ck .ck-content pre{background:initial;border:initial;border-radius:initial;padding:0}.h5peditor textarea:focus::-webkit-input-placeholder,.h5peditor input:focus::-webkit-input-placeholder{color:#fff}.h5peditor textarea:focus:-moz-placeholder,.h5peditor input:focus:-moz-placeholder{color:#fff}.h5peditor textarea:focus::-moz-placeholder,.h5peditor input:focus::-moz-placeholder{color:#fff}.h5peditor textarea:focus:-ms-input-placeholder,.h5peditor input:focus:-ms-input-placeholder{color:#fff}.h5peditor textarea:focus.h5peditor-ckeditor-placeholder,.h5peditor input:focus.h5peditor-ckeditor-placeholder{color:#fff}.h5peditor ::-webkit-input-placeholder{color:#858585}.h5peditor :-moz-placeholder{color:#858585}.h5peditor ::-moz-placeholder{color:#858585}.h5peditor :-ms-input-placeholder{color:#858585}.h5peditor .h5peditor-ckeditor-placeholder{color:#858585}.h5peditor>select,.h5peditor .h5peditor-language-switcher select,.h5peditor h5peditor-select,.h5peditor .field>select{padding:10px 30px 10px 8px;font-family:"Open Sans",sans-serif;font-size:16px;border:1px solid #d0d0d1;background:#fff url(a1aff8c82bc779d09357.png) no-repeat;background-position:calc(100% - 10px);box-shadow:inset 0px 0px 5px rgba(0,0,0,.12);-moz-appearance:none;-webkit-appearance:none}.h5peditor>select:disabled,.h5peditor .h5peditor-language-switcher select:disabled,.h5peditor h5peditor-select:disabled,.h5peditor .field>select:disabled{background-color:#efefef}.h5peditor>select{margin-bottom:13px;margin-right:20px}.h5peditor select::-ms-expand{display:none}.h5peditor a:focus{outline:none}.h5peditor textarea:focus,.h5peditor .h5peditor-text:focus{outline:none;background-color:#fff;border-color:#53a0ff}.h5peditor .h5p-ul{padding:0;margin:0;list-style:none}.h5peditor .h5p-ul .h5p-li{margin:10px 0;padding:0;list-style:none}.h5peditor .h5p-ul .h5p-li:first-child{margin-top:0}.h5peditor .h5p-ul .h5p-li:last-child{margin-bottom:0}.h5peditor .h5p-ul .h5p-li.placeholder{box-sizing:border-box;background:#e8f2fa;border:dashed 2px #2782d1}.h5peditor .h5p-ul .h5p-li:hover{text-decoration:none}.h5peditor .h5p-ul .h5p-li:nth-child(2).moving{margin-top:0}.h5peditor .h5p-ul .h5p-li:nth-last-child(2).placeholder{margin-bottom:0}.h5peditor .dimensions input,.h5peditor .coordinates input,.h5peditor .number input{width:75px}.h5peditor .number input[type=range]{width:300px;float:left;margin:7px 8px 0 0}.h5peditor .h5p-errors{clear:both}.h5peditor .h5p-add-file{float:left;position:relative;background:rgba(0,0,0,0);border:2px dashed #ddd;color:#ddd;margin:.5em;width:6em;height:4.5em;cursor:pointer;outline:none;box-sizing:border-box;-moz-box-sizing:border-box}.h5peditor .h5p-add-file:focus,.h5peditor .h5p-add-file:hover{color:#999;border-color:#999}.h5peditor .h5p-add-file.hidden{visibility:hidden}.h5peditor .h5p-add-file:after{position:absolute;content:"+";font-size:2em;line-height:2.2em;width:100%;height:100%;text-align:center}.h5peditor .h5p-add-dialog{position:inherit;z-index:1;visibility:hidden;opacity:0;background:#fff;margin-bottom:1rem;box-sizing:border-box;-moz-box-sizing:border-box;transition:visibility 0s .2s,opacity .2s}.h5peditor .h5p-add-dialog.h5p-open{visibility:visible;opacity:1;transition:visibility 0s 0s,opacity .2s}.h5peditor .h5p-add-dialog .h5p-add-dialog-table{overflow:hidden;position:relative}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tablist{display:inline-flex;border-left:1px solid #d0cfd4}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tablist:has(~.av-tabpanel.has_content) .av-tab:not(.selected){opacity:.5;cursor:not-allowed;pointer-events:none}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab{cursor:pointer;padding:.5em .75em;border-top:1px solid #d0cfd4;border-right:1px solid #d0cfd4;position:relative;font-weight:600;font-size:15px;background:#e7e9ee;z-index:1}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab::before{font-family:"H5P";color:#297bc7;vertical-align:middle;font-size:1.8em;margin-right:4px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab.selected{color:#000;background:#fff}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tab.selected::after{content:"";position:absolute;bottom:-1px;left:0;right:0;height:1px;background:#fff}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tabpanel{border:1px solid #d0cfd4;border-radius:0 0 5px 5px;margin-top:1px;position:relative;padding:1em;top:-1px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tabpanel h3{margin:0 0 1em 0}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .av-tabpanel .h5p-file-drop-upload{width:90px;margin:0}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-dialog-box{float:left;padding:0;width:60%;margin-right:5%;margin-left:4%;text-align:left;margin-top:30px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-dialog-box:first-child{width:22%;margin-left:3%;margin-right:1%}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-dialog-box:first-child h3{text-align:center}.h5peditor .h5p-add-dialog .h5p-add-dialog-table h3{color:#666;font-size:1em;margin:1.2em 0;line-height:1.1em}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5peditor-field-description{color:#bbb}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper{background-color:#f5f5f5;border:1px solid #bbb;padding:15px 15px 15px 60px;position:relative}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper:before{font-family:"H5P";position:absolute;left:0;top:.083em;font-size:3.8em;line-height:1}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper.video:before{content:"";color:#dd0505}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper.audio:before{content:"";color:#747275}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-url-wrapper input{border-color:#bbb;text-align:left;padding-left:20px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload{position:relative;width:70%;height:90px;margin:0 15%;float:left;background-color:#f5f5f5;text-align:center;cursor:pointer;border:1px solid #bbb}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner{border:2px dashed #bbb;background-color:#fff;position:absolute;top:3px;bottom:3px;left:3px;right:3px}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner:after{font-family:"H5P";line-height:1.4em;font-size:3.5em;color:#bbb}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner.video:after{content:""}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload .h5p-file-drop-upload-inner.audio:after{content:""}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload:hover .h5p-file-drop-upload-inner:after,.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-file-drop-upload.over .h5p-file-drop-upload-inner:after{color:#999}.h5peditor .h5p-add-dialog .h5p-add-dialog-table .h5p-or-vertical{float:left;position:relative;width:5%;height:250px}.h5peditor .h5p-add-dialog .h5p-dialog-box{text-align:center;padding:1em .5em}.h5peditor .h5p-add-dialog .h5p-buttons{padding:.5em;border-top:1px solid #cdcdcd;background:#ddd;text-align:right}.h5peditor .h5p-or{border-bottom:1px solid #cdcdcd;padding:0;margin:0 1em;text-align:center;height:.5em;line-height:1em}.h5peditor .h5p-or>span{background:#fff;padding:0 .5em}.h5peditor .h5p-or-vertical{float:left;position:relative;width:50px;height:80px}.h5peditor .h5p-or-vertical .h5p-or-vertical-line{position:absolute;margin:10px 0;left:49%;top:0;bottom:0;width:1px;background:#ccc;z-index:1}.h5peditor .h5p-or-vertical .h5p-or-vertical-word-wrapper{text-align:center;height:18px;position:absolute;left:0;right:0;top:22%;margin-top:-12px;z-index:2}.h5peditor .h5p-or-vertical .h5p-or-vertical-word-wrapper .h5p-or-vertical-word{color:#999;font-weight:bold;font-size:18px;padding:3px;background:#fff}.h5peditor .h5p-file-url{text-align:center}.h5peditor .h5p-thumbnail{margin:.5em;width:6em;height:4.5em;display:block;float:left;position:relative;box-shadow:0 0 10px 0 #666;border:1px solid #fff;box-sizing:border-box;-moz-box-sizing:border-box}.h5peditor .h5p-thumbnail .h5p-remove{position:absolute;top:0;right:0;cursor:pointer;outline:none;width:1.6em;height:1.6em;line-height:1.6em;overflow:hidden;text-indent:-0.4em;padding:.065em;opacity:.6}.h5peditor .h5p-thumbnail .h5p-remove:hover,.h5peditor .h5p-thumbnail .h5p-remove:focus{opacity:1}.h5peditor .h5p-thumbnail .h5p-remove:after{font-family:"H5P";font-size:2em;color:#fff;content:"";opacity:.6}.h5peditor .h5p-type{position:absolute;width:100%;height:100%;font-size:1.1em;line-height:4em;display:block;text-align:center;background:#000;color:#fff;cursor:pointer}.h5peditor .file{position:relative;float:left;margin-bottom:0;max-width:100%}.h5peditor .file.authorList{float:none}.h5peditor .file.field{float:none}.h5peditor .file .thumbnail{display:inline-block;margin:10px 10px 10px 0;box-shadow:0 0 10px 0 #666;border:1px solid #fff;cursor:pointer;max-width:100%;min-width:1em;min-height:1em;background:#fff url(ae8568c2320881fd5899.png) repeat}.h5peditor .file .thumbnail:focus{box-shadow:0 0 10px 0 #222}.h5peditor .file .add{display:inline-block;cursor:pointer;padding:.5em 1.5em .5em 3em;background:linear-gradient(to bottom, #fbfbfb 0, #f2f2f2 100%);border:1px solid #d0d0d1;border-radius:.25em;color:#222;font-weight:bold;line-height:normal}.h5peditor .file .add:hover{background:#ededed}.h5peditor .file .add:focus{box-shadow:0 0 16px 0 rgba(133,188,255,.84)}.h5peditor .file .add .h5peditor-field-file-upload-text:before{font-family:"H5P";content:"";line-height:1;color:#39c943;font-size:2em;position:absolute;left:.3em;top:.1em}.h5peditor .file .remove{display:block;position:absolute;top:7px;right:7px;cursor:pointer}.h5peditor .file .remove:focus:before{opacity:1}.h5peditor .file .remove:before{font-family:"H5P";font-size:1.4em;color:#fff;content:"";opacity:.6;text-shadow:rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px}.h5peditor .file .remove:hover{text-decoration:none}.h5peditor .file .remove:hover:before{color:#fff;opacity:1;text-shadow:rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px,rgba(0,0,0,.4) 0 0 4px}.h5peditor .file img{max-width:100%;vertical-align:bottom;max-height:100px}.h5peditor .file .h5p-av-row{overflow:auto;margin-bottom:.5em}.h5peditor .file .h5p-av-row .h5p-thumbnail{display:table-cell}.h5peditor .file .h5p-av-row .h5p-video-quality{display:table-cell;overflow:hidden;width:10000px;padding-left:1em}.h5peditor .file .h5p-av-row .h5p-video-quality input.h5peditor-text{width:100%}.h5peditor .file .h5p-av-cell{overflow:auto;float:left}.h5peditor .video .file,.h5peditor .audio .file{position:static;overflow:visible}.h5peditor .video .file .thumbnail,.h5peditor .video .file .add,.h5peditor .audio .file .thumbnail,.h5peditor .audio .file .add{float:left}.h5peditor .video .file .add,.h5peditor .audio .file .add{margin-top:8px}.h5peditor .video .file .thumbnail,.h5peditor .audio .file .thumbnail{overflow:visible;position:relative;cursor:auto}.h5peditor .video .file .remove,.h5peditor .audio .file .remove{top:-3px;right:-5px}.h5peditor .video .file .type,.h5peditor .audio .file .type{padding:16px 8px 4px;background:#000;color:#fff;font-size:10px}.h5peditor .video .file .h5peditor-uploading,.h5peditor .audio .file .h5peditor-uploading{float:left;margin:.5em}.h5peditor .libwrap{margin-top:20px}.h5peditor .libwrap.no-margin,.h5peditor .libwrap:empty{margin-top:0}.h5peditor input[type=checkbox]{margin:4px 4px 4px 0;vertical-align:bottom}.h5peditor .moving{position:absolute;z-index:1;opacity:.8;-webkit-transform:translateZ(0)}.h5peditor .moving .h5peditor-label{cursor:grabbing;cursor:-moz-grabbing;cursor:-webkit-grabbing}.h5peditor .h5peditor-uploading,.h5peditor .h5peditor-loading{padding-top:10px;padding-bottom:6px;font-size:14px}.h5peditor .h5peditor-loading{padding:.875em 0 1em 3.25em;font-style:italic}.h5peditor .h5p-copyright-button{border-radius:.25em;height:30px;background:linear-gradient(to bottom, #fff 0, #f2f2f2 100%);border:1px solid #d0d0d1;color:#212121;font-size:14px;line-height:28px;padding-right:20px;padding-left:0;clear:both;font-weight:normal}.h5peditor .h5p-copyright-button:before{font-family:"H5P";content:"";color:#666;padding:0 .25em 0 .25em;vertical-align:middle;font-size:1.5em;line-height:.9}.h5peditor .h5p-copyright-button:hover:not([disabled]){background:linear-gradient(to bottom, #fff 0, #d0d0d1 100%);text-decoration:none;border-color:#999}.h5peditor .h5p-copyright-button:focus{box-shadow:0 0 16px 0 rgba(133,188,255,.84)}.h5peditor .field.file>.h5p-copyright-button,.h5peditor .field.video>.h5p-copyright-button,.h5peditor .field.audio>.h5p-copyright-button{float:left}.h5peditor .h5p-editor-dialog{position:absolute;z-index:2;margin:5.5em 0 1em;visibility:hidden;opacity:0;height:0;overflow:hidden;background:#fff;box-shadow:0 0 8px #666;transition:visibility 0s .2s,height 0s .2s,opacity .2s,margin-top .2s}.h5peditor .h5p-editor-dialog.h5p-open{margin-top:3.5em;visibility:visible;opacity:1;height:auto;transition:visibility 0s 0s,height 0s 0s,opacity .2s,margin-top .2s}.h5peditor .h5p-editor-dialog>.field{margin:0;border:0;box-shadow:none}.h5peditor .h5p-editor-dialog .content{border:none;background:#fff}.h5peditor .h5p-editor-dialog .content .h5peditor-label{font-size:18px;font-weight:600}.h5peditor .h5p-editor-dialog .h5p-close{color:#494949}.h5peditor .h5p-editor-dialog .h5p-close:before{font-size:2em;right:-0.125em;top:0;position:absolute;z-index:1;font-family:"H5P";content:"";line-height:1em;transition:scale .2s}.h5peditor .h5p-editor-dialog .h5p-close:hover:before{scale:1.1,1.1}.h5peditor .h5p-li>.content>.library{border:0;padding:0}.ck-powered-by-balloon{display:none !important}.h5p-editor-dialog.h5p-dialog-wide{width:90%;border-radius:.208em}.h5peditor-button-textual{border-radius:.25em;background:#747275;background-image:linear-gradient(#7b797c 50%, transparent 50%, transparent);display:inline-block;width:auto;margin:10px 0 0 0;padding:0 20px;box-sizing:border-box;height:38px;border:1px solid #d0d0d1;font-size:16px;font-family:"Open Sans",sans-serif;line-height:38px;color:#fff;cursor:pointer;font-weight:600;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5peditor-button-textual:focus{box-shadow:0 0 16px 0 rgba(133,188,255,.84)}.h5peditor-button-textual:before,.h5peditor-button-textual:after{color:#fff}.h5peditor-button-textual .h5p-editing-image-button:before{font-family:"H5P";content:"";color:#666;padding-right:.25em;vertical-align:middle;font-size:1.5em;line-height:.9}.h5peditor-button-textual:hover:not([disabled]){background:#636164;background-image:linear-gradient(#6b696c 50%, transparent 50%, transparent);text-decoration:none}.h5peditor-button-textual.importance-high{background:#2579c6;background-image:linear-gradient(#3080c9 50%, transparent 50%, transparent);border-color:#1f67a8;text-transform:uppercase;height:42px;line-height:42px}.h5peditor-button-textual.importance-high:hover:not([disabled]){background:#1f67a8;background-image:linear-gradient(#2a6fac 50%, transparent 50%, transparent);border-color:#1f67a8}.h5peditor-button-textual.importance-low{background:#f5f5f5;background-image:linear-gradient(#eeeeef 50%, transparent 50%, transparent);border-color:#d0d0d1;color:#212121}.h5peditor-button-textual.importance-low:before,.h5peditor-button-textual.importance-low:after{color:#212121}.h5peditor-button-textual.importance-low:hover:not([disabled]){background:#deddde;background-image:linear-gradient(#deddde 50%, transparent 50%, transparent);border-color:#deddde}.h5peditor-button-textual[disabled],.h5peditor-button-textual[aria-disabled=true]{background:#f5f5f5;color:#707171;border-color:#eee;cursor:not-allowed}.h5peditor-button-textual[disabled]:before,.h5peditor-button-textual[aria-disabled=true]:before{font-family:"H5P";content:"";color:#707171;margin-right:.5em;vertical-align:top}.h5peditor-field-description,.h5p-help-text{font-size:12px;margin-top:.3em;margin-bottom:1em;font-weight:500;color:#434446;line-height:15px;letter-spacing:.5px}.h5peditor-field-important-description{position:relative;padding:1.5em 2.2em 2em 2.2em;font-size:.9em;margin:0 0 20px 0;border:1px solid #ffde78;background-color:#f9f9d8;color:#000;display:none}.h5peditor-field-important-description .important-description-close{position:absolute;font-size:.9em;line-height:2em;right:1.5em;top:1em;user-select:none;cursor:pointer}.h5peditor-field-important-description .important-description-close:before{font-family:"H5P";content:"";vertical-align:top;font-size:1.6em}.h5peditor-field-important-description .h5p-info-icon{font-size:.75em}.h5peditor-field-important-description .h5p-info-icon:before{font-family:"H5P";content:"";font-size:2.3em;line-height:.94em;margin-left:-0.3em;vertical-align:middle}.h5peditor-field-important-description .important-description-title{font-weight:bold;font-size:1.2em;vertical-align:bottom}.h5peditor-field-important-description .important-description-content ul{padding:0;line-height:2em;margin-top:20px}.h5peditor-field-important-description .important-description-content ul li{line-height:1.8em;margin-left:1.5em}.h5peditor-field-important-description .important-description-example{border:1px solid #bbde98;background-color:#d9fac3;display:flex;margin-top:20px}.h5peditor-field-important-description .important-description-example .important-description-example-title{padding:15px;font-weight:bold}.h5peditor-field-important-description .important-description-example .important-description-example-text{padding:15px;width:100%;background-color:#f6fef1}.av-tab__file-upload::before{content:""}.av-tab__insert-url::before{content:""}.av-tab__record-audio:last-child::before{content:""}.h5peditor-form{position:relative;background:#fcfcfc;border:1px solid #d0d0d1}.h5peditor-form.h5peditor-form-manager>.tree,.h5peditor-form.h5peditor-form-manager>.common,.h5peditor-form.h5peditor-form-manager>.field{max-width:918px;margin:20px auto;padding:0 20px}.h5peditor-form.h5peditor-semi-fullscreen{margin:0;position:fixed;overflow-y:scroll;margin-top:40px;padding-bottom:40px;box-sizing:border-box;background:#fff;height:calc(100% - 40px)}.h5peditor-label{display:block;margin-bottom:6px;font-weight:600;font-size:16px;color:#454347}.h5peditor-label-button{background:rgba(0,0,0,0);border:none;color:#454347;cursor:pointer;display:flex;flex-direction:row;font-family:inherit;font-weight:600;font-size:16px;padding:0 0 0 10px;text-align:left}.h5peditor-label-button.collapsed .icon::before{content:"";font-family:"H5P";margin-right:5px}.h5peditor-label-button:not(.collapsed) .icon::before{content:"";font-family:"H5P";margin-right:5px}#h5peditor-uploader{position:absolute;width:1px;height:1px;top:-1px;border:0;overflow:hidden}.h5p-tutorial-url,.h5p-example-url{font-size:1em;display:inline-flex;align-items:center;line-height:1;margin-right:1em;margin-bottom:.5em;margin-left:.25em;height:2rem;border-radius:1rem}.h5p-tutorial-url:focus,.h5p-example-url:focus{box-shadow:0px 0px 5px #1634f7}.h5p-tutorial-url:active,.h5p-example-url:active{border-color:#1c70ba}.h5p-tutorial-url::before,.h5p-example-url::before{font-family:"H5P";font-size:1.25em;border-radius:50%;width:2rem;height:2rem;position:absolute;display:flex;justify-content:center;align-items:center}.h5p-tutorial-url .h5p-tutorial-url-label,.h5p-tutorial-url .h5p-example-url-label,.h5p-example-url .h5p-tutorial-url-label,.h5p-example-url .h5p-example-url-label{font-style:italic;font-weight:bold;text-decoration:underline;margin:.25em .5em;margin-left:2rem;padding-left:.5em;padding-right:1em}.h5p-tutorial-url:active,.h5p-tutorial-url:hover{background-color:#eaffab}.h5p-tutorial-url::before{content:"";color:#eaffab;background-color:#749e00}.h5p-tutorial-url .h5p-tutorial-url-label{color:#415702}.h5p-example-url:active,.h5p-example-url:hover{background-color:#f8d4ff}.h5p-example-url::before{content:"";font-size:1em;color:#f8d4ff;background-color:#8f4f9c}.h5p-example-url .h5p-example-url-label{color:#422447}.h5peditor-widget-select{display:flex;flex-direction:row-reverse;justify-content:end;overflow:hidden;margin:0 0 -1px;padding:0;list-style:none}.h5peditor-widget-option{border:1px solid #ccc;margin-left:.5em;padding:.6em 1em;color:#0e1a25;font-size:.875em;background:#f5f5f5;line-height:1.285714286em;cursor:pointer;outline:none}.h5peditor-widget-option:hover{color:#000}.h5peditor-widget-option:active{color:#8e636a}.h5peditor-widget-active{background:#fff;line-height:1.357142857em;border-bottom:0}.h5peditor-widgets>.h5peditor-widget-wrapper{border:1px solid #ccc;margin:0 0 .25em;padding:.5em}.h5peditor-widgets>.h5peditor-label,.h5peditor-widgets>.h5peditor-label-button{float:left;margin-top:5px}.h5p-editor-iframe{margin-bottom:1em}.h5peditor-required:after{content:"*";color:#da0001;margin-left:.2em;position:relative;top:-0.2em}.h5peditor .cke_bottom,.h5peditor .cke_top{background:#d0d0d1}.h5peditor .cke_chrome{border:1px solid #f5f5f5;background:#d0d0d1}.h5peditor .cke_contents,.h5peditor .cke_toolgroup,.h5peditor .cke_combo_button{border:1px solid #f5f5f5}.important-description-show{background:#f3d55a;padding:.2em .5em .2em 1.7em;margin-bottom:.5em;font-size:.9em;cursor:pointer;float:right;position:relative;line-height:normal;font-style:italic;font-weight:bold}.important-description-show:before{font-family:"H5P";font-style:normal;font-weight:normal;content:"";font-size:1.8em;position:absolute;left:0em;top:0em;line-height:.85em;vertical-align:top}.important-description-clear-right{display:block;clear:right}.h5peditor fieldset.common-fields-library-wrapper{width:100%;padding:0 1em 1em;box-sizing:border-box;height:20px;border:solid 1px #e2e5ee;border-radius:4px;margin-bottom:1em}.h5peditor fieldset.common-fields-library-wrapper>*{display:none}.h5peditor fieldset.common-fields-library-wrapper>legend{display:block;cursor:pointer;outline:none;color:#363b42;background-color:#fff;padding:10px;font-weight:bold;font-size:.875em}.h5peditor fieldset.common-fields-library-wrapper>legend:before{font-family:"H5P";content:"";margin-right:.5em}.h5peditor fieldset.common-fields-library-wrapper>legend:focus:before{outline:1px dotted #666}.h5peditor fieldset.common-fields-library-wrapper.expanded{height:auto}.h5peditor fieldset.common-fields-library-wrapper.expanded>*{display:block}.h5peditor fieldset.common-fields-library-wrapper.expanded>legend:before{content:""}.h5p-metadata-button-wrapper{display:flex;flex-direction:row;align-items:center;margin-top:-7px;margin-left:7px;cursor:pointer}.h5p-metadata-button-wrapper.inline-with-selector{display:inline-flex;margin-left:17px}.h5p-metadata-toggler{margin-left:-11px;height:14.5px;max-height:14.5px;padding:.217rem .3rem .217rem .217rem;font-size:.625em;font-weight:bold;letter-spacing:.025em;border:1px solid #b6cada;border-left:none;border-radius:4px;background:linear-gradient(#fff, #deeaf1);color:#356593;z-index:1;justify-content:center;align-content:center;line-height:1.5em}.h5p-metadata-button-tip{width:16.5px;height:16.5px;content:"";background:linear-gradient(-215deg, #fff, #deeaf1);border:1px solid #b6cada;border-right:none;border-top:none;border-radius:4px;transform:rotate(45deg);z-index:0}.h5p-metadata-button-wrapper:hover .h5p-metadata-toggler,.h5p-metadata-button-wrapper:hover .h5p-metadata-button-tip{border-color:#6d9fce}.h5p-metadata-button-wrapper:hover .h5p-metadata-toggler{background:linear-gradient(#f3f8fb, #cee5f3)}.h5p-metadata-button-wrapper:hover .h5p-metadata-button-tip{background:linear-gradient(-215deg, #f3f8fb, #cee5f3)}.h5p-metadata-button-wrapper:active .h5p-metadata-toggler,.h5p-metadata-button-wrapper:active .h5p-metadata-button-tip{color:#294f73;border-color:#6d9fce}.h5p-metadata-button-wrapper:active .h5p-metadata-toggler{background:linear-gradient(#f3f8fb, #bcd4e2)}.h5p-metadata-button-wrapper:active .h5p-metadata-button-tip{background:linear-gradient(-215deg, #f3f8fb, #bcd4e2)}#metadata-title-main-label{margin-top:0}.h5p-metadata-button{background:#fff;padding:10px;text-align:center;border-radius:5px;border:2px solid #6b6b6b;color:#6b6b6b;font-weight:bold;display:inline;cursor:pointer}.h5p-metadata-button:hover{border-color:#4a4a4a;color:#4a4a4a}.h5p-metadata-button:active{border-color:#000;color:#000}.h5p-metadata-button.inverted{border:2px solid #0a715e;color:#0a715e}.h5p-metadata-button.inverted:hover{border-color:#0d826c;color:#0d826c}.h5p-metadata-button.inverted:active{border-color:#095345;color:#095345}.h5p-metadata-icon-button{border:none;cursor:pointer;color:#6b6b6b;background:rgba(0,0,0,0);padding:0}.h5p-metadata-icon-button:hover{color:#4a4a4a}.h5p-metadata-icon-button:active{color:#000}.h5p-metadata-wrapper{display:inline-block;background-color:#fff;max-width:700px;width:calc(100% - 4em);text-align:left;border-bottom:20px solid rgba(0,0,0,0);background-clip:padding-box;max-height:calc(100% - 40px);overflow:auto;margin-bottom:20px}.h5p-metadata-wrapper .h5p-metadata-header{display:flex;border-bottom:1px solid #ced6e3;padding:1.5em}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container{flex-grow:1;padding-left:3.5em;white-space:nowrap;overflow:hidden;margin-right:1%;position:relative}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container h2{margin:0}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container p{margin:.1em}.h5p-metadata-wrapper .h5p-metadata-header .h5p-title-container:before{position:absolute;font-family:"h5p-metadata-icons";content:"";left:0;top:0;font-size:2em;height:1.4em;line-height:1.3}.h5p-metadata-wrapper .h5p-save{border:solid 2px #0a715e;border-radius:.3rem;color:#fff;background-color:#0a715e;padding:.75rem;white-space:nowrap}.h5p-metadata-wrapper .h5p-save:hover{border-color:#0d826c;background-color:#0d826c}.h5p-metadata-wrapper .h5p-save:active{border-color:#095345;background-color:#095345}.h5p-metadata-wrapper .h5peditor-label{font-size:.8em;color:#333}.h5p-metadata-wrapper .h5peditor-field-description{color:#697484;margin-top:.35em;letter-spacing:.5px}.h5p-metadata-wrapper .copyright-form{margin-top:20px}.h5p-metadata-wrapper h2{font-size:1em;overflow:hidden;text-overflow:ellipsis}.h5p-metadata-wrapper p{font-size:.8333em;color:#697484;overflow:hidden;text-overflow:ellipsis;margin-bottom:0}.h5p-metadata-wrapper .errors p,.h5p-metadata-wrapper .h5p-errors p{color:#da0001;font-size:1em;white-space:normal;text-overflow:unset}.h5p-metadata-wrapper select.h5peditor-select,.h5p-metadata-wrapper input.h5peditor-text,.h5p-metadata-wrapper textarea{border:1px solid #b8c0cd;font-size:.833em;border-radius:.208em;box-shadow:none;font-family:"Open Sans",sans-serif}.h5p-metadata-wrapper select:focus,.h5p-metadata-wrapper input:focus,.h5p-metadata-wrapper textarea:focus{box-shadow:inset 0px 0px 10px rgba(0,0,0,.15)}.h5p-metadata-wrapper select{width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper{display:flex;flex-wrap:wrap;margin:1.5em}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field{margin-bottom:0;width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-license{width:49%;margin-right:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-licenseVersion{width:49%;margin-left:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearFrom{width:24%;margin-right:1%;white-space:nowrap}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearFrom .h5peditor-text{width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearTo{width:23%;margin-right:1%;margin-left:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-yearTo .h5peditor-text{width:100%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper>.field-name-source{width:49%;margin-left:1%}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label{justify-content:space-between}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle{background:none;border:none;cursor:pointer}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:before{font-family:"h5p-metadata-icons";content:"";margin-right:.5em;font-size:1.5em;vertical-align:middle}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:focus,.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:active,.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:hover{border:none}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-title label .a11y-title-toggle:hover .h5p-a11y-title-text{text-decoration:underline}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-a11yTitle{transition:max-height .2s,margin .2s;overflow:hidden}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-a11yTitle.hide{max-height:0;margin:0}.h5p-metadata-wrapper .h5p-metadata-fields-wrapper .field-name-a11yTitle.hidden{display:none}.h5p-metadata-wrapper .field.group>.title{font-weight:400;background:#f6f6f6;color:#323232;border:solid 1px #ced6e3;border-radius:.208em}.h5p-metadata-wrapper .field.group.expanded>.title{border-radius:.208em .208em 0 0}.h5p-metadata-wrapper .field.group>.title:focus{border-color:#4d90fe}.h5p-metadata-wrapper .field.group>.content{border:solid 1px #ced6e3;border-radius:0 0 .208em .208em;padding:20px;border-top:0}.h5p-metadata-additional-information{width:100%;margin-top:1em}.h5p-metadata-additional-information .content.h5peditor-single{min-height:2em;border:1px solid #d0d0d1;border-top:none;background:#fff}.h5p-metadata-additional-information .title{font-weight:400;background:#f6f6f6;color:#323232;border:solid 1px #ced6e3;border-radius:.208em}.h5p-metadata-additional-information .title:focus{border-color:#4d90fe}.h5p-metadata-popup-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.85);z-index:101;text-align:center}.h5p-metadata-changelog{width:100%}.h5p-metadata-changelog .field-name-change.expanded .content{display:flex;flex-wrap:wrap}.h5p-metadata-changelog .field-name-change .field-name-date{width:49%;margin-bottom:.5em;margin-right:1%;margin-top:0}.h5p-metadata-changelog .field-name-change .field-name-date span{width:100%}.h5p-metadata-changelog .field-name-change .field-name-author{width:49%;margin-bottom:.5em;margin-left:1%;margin-top:0}.h5p-metadata-changelog .field-name-change .field-name-log{width:100%}.h5p-metadata-changelog .field-name-change .h5p-add-author:before{content:"+";margin-right:.7em}.h5p-metadata-changelog .field-name-change .h5p-cancel{margin-right:10px}.h5p-metadata-changelog .field-name-change .h5p-metadata-changelog-buttons{width:100%}.h5p-metadata-changelog .field-name-change .h5p-metadata-logged-changes{width:100%;margin-top:1em}.h5p-metadata-changelog .field-name-change .h5p-metadata-logged-changes.editing{display:none}.h5p-metadata-changelog .field-name-change .h5p-metadata-logged-changes .h5peditor-field-description{margin-bottom:0}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-wrapper{margin-top:1em;border:solid 1px #ced6e3;border-radius:.208em;max-height:15.917rem;overflow-y:auto;padding:0 .5em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log{display:flex;margin-top:.5em;padding-bottom:.5em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log .h5p-metadata-delete{margin-left:2em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log .h5p-metadata-delete:after{font-family:"h5p-metadata-icons";content:"";font-size:1.2em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log .h5p-metadata-edit:after{font-family:"h5p-metadata-icons";content:"";font-size:1.2em}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-buttons{min-width:3em;line-height:2.5}.h5p-metadata-changelog .field-name-change .h5p-metadata-log:not(:last-child){border-bottom:solid 1px #ced6e3}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-date{min-width:25%;font-size:.85em;font-style:italic;line-height:2.5}.h5p-metadata-changelog .field-name-change .h5p-metadata-description-wrapper{flex-grow:1;font-size:.85em;font-style:italic}.h5p-metadata-changelog .field-name-change .h5p-metadata-description-wrapper{font-weight:bolder}.h5p-metadata-changelog .field-name-change .h5p-metadata-log-author{font-weight:normal}.h5p-metadata-changelog .field-name-change .h5p-metadata-new-log-message{width:100%;background:#c5e7e1;padding:.5em;margin-bottom:1em;color:#0a715e}.h5p-metadata-author-widget{display:flex;flex-direction:column;border:solid 1px #ced6e3;border-radius:.208em;width:100%;padding:1em;margin-top:1em}.h5p-metadata-author-widget .h5p-save-author{border:solid 2px #0a715e;color:#fff;background-color:#0a715e}.h5p-metadata-author-widget .h5p-save-author:hover{border-color:#0d826c;color:#fff;background-color:#0d826c}.h5p-metadata-author-widget .h5p-save-author:active{border-color:#095345;color:#fff;background-color:#095345}.h5p-metadata-author-widget .h5p-author-data{display:flex;flex-direction:row;flex-wrap:nowrap}.h5p-metadata-author-widget .h5p-author-data>.field{margin-bottom:0}.h5p-metadata-author-widget .field-name-name{flex-grow:1;margin-right:2%;overflow:hidden;white-space:nowrap;min-width:49%}.h5p-metadata-author-widget .field-name-role{margin-top:0;margin-right:2%;width:25%;flex-grow:1;overflow:hidden;white-space:nowrap}.h5p-metadata-author-widget .authorList{margin-top:1.5em;white-space:nowrap}.h5p-metadata-author-widget .authorList li{display:inline;margin-right:.5em}.h5p-metadata-author-widget .authorList li span{margin-right:1em;font-style:italic}.h5p-metadata-author-widget .h5p-author-list-wrapper{margin-top:.5em}.h5p-metadata-author-widget .h5p-author-list-wrapper ul{margin:0;padding:0}.h5p-metadata-author-widget .h5p-author-list-wrapper li{display:inline-block;margin-right:2em;list-style:none;font-weight:bold;font-size:.8em}.h5p-metadata-author-widget .h5p-author-list-wrapper .h5p-metadata-role{font-style:italic;margin:0 .6em;font-weight:normal;font-size:.85em;color:#757575}.h5p-metadata-author-widget .h5p-author-list-wrapper button:after{font-family:"h5p-metadata-icons";content:"";font-size:1em;position:relative;top:-0.1em}.h5peditor-copypaste-wrap{float:right}.h5peditor>.h5peditor-copypaste-wrap{margin-bottom:14px}.h5peditor-copypaste-wrap.hidden{display:none}.h5peditor-clearfix{clear:both}.h5peditor-paste-button,.h5peditor-copy-button{border:1px solid #deeeec;padding:.5em .75em .75em .5em;margin-left:.5em;border-radius:.25em;cursor:pointer;background:#f2faff;line-height:.5em}.h5peditor-paste-button:hover,.h5peditor-copy-button:hover{border-color:#bbdae8}.h5peditor-paste-button:active,.h5peditor-copy-button:active{background-color:#deeffb}.h5peditor-paste-button.disabled,.h5peditor-copy-button.disabled{color:#707070;background-color:#f5f5f5;border-color:#ededed;cursor:not-allowed}.h5peditor-copy-button:before,.h5peditor-paste-button:before{font-family:"H5P";margin-right:5px;font-size:1.5em;position:relative;top:.2em;color:#2372b3}.h5peditor-copy-button:before{content:""}.h5peditor-paste-button:before{content:""}.h5peditor-copy-button.disabled:before,.h5peditor-paste-button.disabled:before{color:#707070}.h5peditor-copy-button.disabled:before{content:""}.h5peditor-paste-button.disabled:before{content:""}.h5p-hub .h5peditor-paste-button{font-family:"Open Sans",sans-serif;color:#fff;border:solid 1px #9fc8f4;padding:0 .75em .5em .75em;background:rgba(0,0,0,0);line-height:1;height:auto;margin-top:.675em;margin-right:.675em}.h5p-hub .h5peditor-paste-button:hover{background:#4b5460;border-color:#606a78}.h5p-hub .h5peditor-paste-button:active{background:#434b55}.h5p-hub .h5peditor-paste-button.disabled{border-color:#30353d;background:#30353d;color:#c2c2c2}.h5p-hub .h5peditor-paste-button:before{color:#9fc8f4}.h5p-hub .h5peditor-paste-button.disabled:before{color:#c3c3c3}@font-face{font-family:"h5p-fullscreen-bar";src:url(./fonts/h5p-fullscreen-bar.eot);src:url(./fonts/h5p-fullscreen-bar.eot#iefix) format("embedded-opentype"),url(./fonts/h5p-fullscreen-bar.ttf) format("truetype"),url(./fonts/h5p-fullscreen-bar.woff) format("woff"),url(./fonts/h5p-fullscreen-bar.svg#h5p) format("svg");font-weight:normal;font-style:normal}.h5peditor-form-manager-head{background:#f5f5f5;color:#414141;border-bottom:1px solid #dfdfdf;height:41px;line-height:40px;box-sizing:border-box;position:relative;display:flex;z-index:3;justify-content:space-between;align-items:flex-start;box-shadow:0px 2px 2px rgba(128,128,128,.15);padding:0 1em 0 .5em}.h5peditor-form-manager-button{background:rgba(0,0,0,0);padding:0;border:0;cursor:pointer;color:#414141;position:relative;white-space:nowrap;line-height:normal}.h5peditor-form-manager-button-inner{display:block;outline:none}.h5peditor-form-manager-breadcrumb{display:flex;min-width:0;flex-grow:1}.h5peditor-form-manager-proceed{display:none;background:#186df7;color:#fff;font-size:14px;font-weight:bold;font-family:Open Sans,sans-serif;border-radius:2px;margin-right:5px;margin-top:5px;padding:5px 10px}.h5peditor-form-manager-proceed:hover{background:#20588f}.h5peditor-form-manager-fullscreen{width:24px;height:24px;font-size:20px;margin-top:9px;margin-left:.25em}.h5peditor-form-manager-fullscreen .h5peditor-form-manager-button-inner:before{font-family:"h5p-fullscreen-bar";content:""}.h5peditor-form-manager-fullscreen:after{visibility:hidden;position:absolute;top:120%;right:-10%;z-index:3;padding:.25em .75em;background:#212121;color:#fff;white-space:nowrap;font-size:14px;box-shadow:0 0 .5em #858585;text-indent:0;font-weight:normal;pointer-events:none;outline:none;line-height:normal;content:attr(aria-label)}.h5peditor-form-manager-fullscreen:hover:after,.h5peditor-form-manager-fullscreen:focus:after{visibility:visible}.h5peditor-semi-fullscreen .h5peditor-form-manager-fullscreen .h5peditor-form-manager-button-inner:before{content:""}.h5peditor-semi-fullscreen .h5peditor-form-manager-proceed{display:block}.h5peditor-semi-fullscreen .h5peditor-form-manager-head{position:fixed;top:0;left:0;right:0;z-index:2}.form-manager-exit.form-manager-fullscreen .h5peditor-form-manager-button-inner:before{content:""}.h5peditor-form-manager-title{position:relative;min-width:20px;font-weight:bold;font-size:14px}.h5peditor-form-manager-title:before{font-family:"h5p-fullscreen-bar";content:"";font-size:1.2em;position:relative;top:.1em;margin-right:.25em;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.h5peditor-form-manager-title.dragtext:before{content:""}.h5peditor-form-manager-title.markthewords:before{content:""}.h5peditor-form-manager-title.multichoice:before{content:""}.h5peditor-form-manager-title.interactivevideo:before{content:""}.h5peditor-form-manager-title.audio:before{content:""}.h5peditor-form-manager-title.truefalse:before{content:""}.h5peditor-form-manager-title.dialogcards:before{content:""}.h5peditor-form-manager-title.questionnaire:before{content:""}.h5peditor-form-manager-title.coursepresentation:before{content:""}.h5peditor-form-manager-title.dragquestion:before{content:""}.h5peditor-form-manager-title.summary:before{content:""}.h5peditor-form-manager-title.singlechoiceset:before{content:""}.h5peditor-form-manager-title.blanks:before{content:""}.h5peditor-semi-fullscreen+.h5p-metadata-popup-overlay{position:fixed}.h5peditor-semi-fullscreen+.h5p-metadata-popup-overlay .h5p-metadata-wrapper{margin-top:20px !important}.h5peditor .h5peditor-language-switcher{float:right;white-space:nowrap;margin-bottom:1em}.h5peditor .h5peditor-language-switcher .language-label{padding:0 10px;font-size:15px}.h5peditor .h5peditor-language-switcher select{padding:6px 30px 6px 8px;font-size:15px}.h5peditor-language-notice{display:none;clear:both;font-size:14px;background:#dcf6ff;color:#295b7a;padding:10px 20px 10px 40px;margin:1em 0;line-height:1.5;position:relative}.h5peditor-language-notice:before{font-family:h5p;content:"";position:absolute;left:15px;font-size:1.125em}.h5peditor-language-notice.show{display:block}.h5peditor-language-notice .first{font-weight:bold}.h5peditor-language-notice a{text-decoration:underline}.h5p-loader__wrapper{width:100%;height:100%;flex:1;display:flex;align-items:center;padding:10px;min-width:180px}.h5p-loader__wrapper .h5p-loader__icon{border:8px solid #d0cfd4;border-bottom-color:#554e4a;border-radius:50%;width:40px;height:40px;animation:rotation linear 1s infinite;margin:0 auto}@keyframes rotation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.h5p-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0} diff --git a/styles/css/fonts/play-icon.svg b/styles/css/fonts/play-icon.svg new file mode 100644 index 00000000..4fae56b2 --- /dev/null +++ b/styles/css/fonts/play-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/styles/css/fonts/upload-audio.svg b/styles/css/fonts/upload-audio.svg new file mode 100644 index 00000000..ed298d0e --- /dev/null +++ b/styles/css/fonts/upload-audio.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/styles/css/fonts/upload-image.svg b/styles/css/fonts/upload-image.svg new file mode 100644 index 00000000..5da31db0 --- /dev/null +++ b/styles/css/fonts/upload-image.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/styles/css/fonts/upload-video.svg b/styles/css/fonts/upload-video.svg new file mode 100644 index 00000000..e69a2b0c --- /dev/null +++ b/styles/css/fonts/upload-video.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/styles/scss/_form-field.scss b/styles/scss/_form-field.scss index 4439013a..7eac8cbb 100644 --- a/styles/scss/_form-field.scss +++ b/styles/scss/_form-field.scss @@ -20,11 +20,6 @@ display: inline; } - .h5p-editor-image-buttons { - float: left; - clear: both; - } - .library { border: 0; } @@ -36,7 +31,7 @@ .h5p-dialog-anchor { position: relative; - margin: -16px; + width: 100%; } } diff --git a/styles/scss/_h5peditor-drag-and-drop.scss b/styles/scss/_h5peditor-drag-and-drop.scss new file mode 100644 index 00000000..891ee4fb --- /dev/null +++ b/styles/scss/_h5peditor-drag-and-drop.scss @@ -0,0 +1,709 @@ +.h5p-dnd__container { + clear: both; + margin-top: 0.5rem; +} + +.h5p-dnd__container, +.h5p-dnd__box, +.video-url-error-container { + &.has-error .h5p-errors { + margin-top: 1em; + display: flex; + align-items: center; + &:before { + font-family: $icon-font-family; + content: "\e859"; + font-size: 1.5em; + vertical-align: middle; + } + } + .h5p-errors { + display: none; + } +} + +.h5p-dnd__box { + display: flex; + flex-flow: row; + align-items: stretch; + justify-content: center; + border: solid 2px $dnd-gray-light; + border-radius: 6px; + flex: 1; + min-height: 150px; + position: relative; + background: none; + font-size: 14px; +} + +.h5p-dnd__box--is-dashed { + border: dashed 2px $dnd-gray-light; +} + +.h5p-dnd__box--is-inline { + display: inline-flex; +} + +.h5p-dnd__box--has-image { + flex-flow: column; + width: min-content; + min-height: auto; + min-width: 140px; +} + +.h5p-dnd__box:focus-visible { + outline: none; +} + +.h5p-dnd__box:not(.h5p-dnd__box--is-uploading):hover { + border: dashed 2px $dnd-gray-dark; +} + +.h5p-dnd__box--has-image:not(.h5p-dnd__box--is-uploading):hover, +.h5p-dnd__box.h5p-dnd__box--is-focused:not(.h5p-dnd__box--is-uploading), +.h5p-dnd__box:not(.h5p-dnd__box--is-uploading):focus, +.h5p-dnd__box.h5p-dnd__box--is-dragging:not(.h5p-dnd__box--is-uploading) { + border: solid 2px $dnd-blue; +} + + +.h5p-dnd__box:focus:not(.h5p-dnd__box--has-image):not(.h5p-dnd__box--is-uploading):not(.h5p-dnd__box--is-inline) { + .h5p-dnd__column--is-highlighted { + background: #fff; + } + .h5p-dnd__column:not(.h5p-dnd__column--is-highlighted):not(.h5p-dnd__column--tight) { + background: $dnd-blue-faded; + } +} + +.h5p-dnd__box__block { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: none; + z-index: 2; +} + +.h5p-dnd__box--is-dragging .h5p-dnd__box__block { + display: block; +} + +.h5p-dnd__column { + margin: 10px; + display: flex; + flex-flow: column; + align-items: center; + justify-content: center; + border-radius: 6px; + flex: 1; +} + +.h5p-dnd__column--is-highlighted { + background: $dnd-blue-faded; +} + +.h5p-dnd__column--is-fixed { + flex: 0 0 150px; +} + +.h5p-dnd__column--is-full-width { + flex: 1; +} +.h5p-dnd__column--show-when-focus { + display: none; +} + +.h5p-dnd__column--is-padded { + padding: 0 20px; +} + +.h5p-dnd__column--is-padded-small { + padding: 0 10px; +} + +.h5p-dnd__column.h5p-dnd__column--is-padded-small { + margin: 0; +} + +.h5p-dnd__box--is-dragging .h5p-dnd__column--hide-when-focus { + display: none; +} + +.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--is-dragging .h5p-dnd__column--show-when-focus, +.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--has-image:focus .h5p-dnd__column--show-when-focus { + display: flex; +} + +.h5p-dnd__column--tight { + max-height: 130px; + &:has(.h5p-dnd__video-container) { + margin-right: 0; + } +} + +.h5p-dnd__column__drag-text { + margin-top: -5px; +} + +.h5p-dnd__btn { + display: flex; + align-items: center; + justify-content: center; + padding: 8px 10px; + gap: 5px; + border-radius: 4px; + border: 1px solid #1F67A8; + background: #2579C6; + font-family: 'Open Sans', sans-serif; + font-size: 1em; + font-weight: 600; + color: #fff; + cursor: pointer; + + &:focus { + outline: solid 2px #1F67A8; + outline-offset: 2px; + } + + &:before { + font-family: $icon-font-family; + content: "\e85d"; + vertical-align: middle; + font-size: 1.5em; + line-height: 0.9; + font-weight: 400; + } +} + +.h5p-dnd__btn:hover { + background: #1F67A8; +} + +.h5p-dnd__btn:focus { + outline: solid 2px #1F67A8; + outline-offset: 2px; +} + +div:has(> .h5p-dnd__badge), +div:has(> .h5p-dnd-nowrap), +.h5p-dnd__column--is-padded:has(.h5p-dnd__badge) { + line-height: 1.7; +} + + +.h5p-dnd__badge { + background: #E7E9EE; + color: #434446; + text-transform: uppercase; + font-weight: 400; + font-size: 12px; + font-family: 'Arial Black'; + border-radius: 6px; + padding: 3px 8px; + display: inline-flex; + line-height: 1.4; + + .h5p-dnd__badge__separator { + border-left: solid 2px rgba(67, 68, 70, 0.25); + margin: 3px 6px; + overflow: hidden; + display: inline-block; + overflow: hidden; + top: 0; + left: 0; + right: 0; + bottom: 0; + position: relative; + } +} + +.h5p-dnd__img { + max-width: 175px; + max-height: 120px; + min-width: 40px; + min-height: 40px; + border-radius: 6px; + display: block; +} + +.h5p-dnd__img__container { + position: relative; + min-width: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.h5p-dnd__img__overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: 6px; + background: $dnd-blue; + opacity: 0.9; + color: #fff; + display: none; + cursor: pointer; + &:before { + font-family: $icon-font-family; + content: "\e85d"; + font-size: 2.5em; + } +} + +.h5p-dnd__img__container:hover .h5p-dnd__img__overlay, +.h5p-dnd__box:focus:not(.h5p-dnd__box--is-uploading) .h5p-dnd__img__overlay, +.h5p-dnd__box.h5p-dnd__box--is-dragging:not(.h5p-dnd__box--is-uploading) .h5p-dnd__img__overlay { + display: flex; + align-items: center; + justify-content: center; +} + +.h5p-dnd__text { + font-family: 'Open Sans', sans-serif; + font-size: 14px; + text-align: center; + color: $dnd-text-color; +} + +.h5p-dnd__upload-image-svg, +.h5p-dnd__upload-audio-svg, +.h5p-dnd__upload-video-svg { + width: 60px; + height: 43px; + margin-bottom: 13px; +} + + +.h5p-dnd__upload-image-svg { + background: url("../css/fonts/upload-image.svg") no-repeat; +} + +.h5p-dnd__upload-video-svg { + background: url("../css/fonts/upload-video.svg") no-repeat; +} + +.h5p-dnd__upload-audio-svg { + background: url("../css/fonts/upload-audio.svg") no-repeat; +} +.h5p-dnd__play-icon-svg { + background: url("../css/fonts/play-icon.svg") no-repeat; + width: 28px; + height: 29px; +} + +.h5p-dnd__drop-text { + display: flex; + flex-flow: column; + align-items: center; + justify-content: center; + font-size: 0.9em; + + &:before { + font-size: 3.9em; + font-family: $icon-font-family; + content: "\e85d"; + color: #3B435A; + line-height: 0.9; + margin-bottom: 10px; + } +} + +.input-container { + display: flex; + align-items: center; + border: solid 1px #D0D0D1; + padding: 3px; + width: 100%; + border-radius: 2px; + background: #fff; + gap: 5px; + + &:has(.input-video:focus) { + border: solid 1px #1570df; + } +} + +/* Need high specificity to counteract interactive video styling for inputs */ +.h5p-dnd__av-container .h5p-dnd__box__url.h5p-dnd__box__video-paste .input-container input[type="text"].input-video { + border: 0; + flex: 1; + outline: 0; + font-size: 1em; + box-shadow: none; + + &:focus { + background: none; + box-shadow: none; + } +} + +.video-url-error-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + margin-bottom: 5px; + width: 100%; + + &.hidden { + display: none; + } +} + +.text-muted { + color: #454347; + text-align: center; + font-family: "Open Sans", sans-serif; + font-size: 0.85em; + font-weight: 400; + line-height: normal; +} +.text-center { + text-align: center; +} + +.h5p-dnd__box__title { + color: #454347; + text-align: center; + font-size: 16px; + font-weight: 600; + font-family: "Open Sans", sans-serif; +} + +.h5p-dnd__box.h5p-dnd__box__url, +.h5p-dnd__box__url { + display: flex; + flex-flow: column; + align-items: center; + justify-content: center; + color: #454347; + font-size: 14px; + border-radius: 6px; + flex: 1; + min-height: 169px; + position: relative; + background: none; + padding: 10px; + gap: 7px; + min-width: 271px; + box-sizing: border-box; + + &:focus:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-dragging):not(.h5p-dnd__box--is-uploading), + &:focus-within:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-dragging):not(.h5p-dnd__box--is-uploading) { + background: $dnd-blue-faded; + border: solid 2px #1570df; + } + &:focus-visible:not(.h5p-dnd__box__video-paste):not(.h5p-dnd__box--is-uploading) { + outline: 0; + border: solid 2px #1570df; + } + + &.h5p-dnd__box__video-paste { + border: solid 1px #D0CFD4; + padding: 20px; + } +} + +.h5p-dnd__box.h5p-dnd__box__action { + flex: 2; +} + +.h5p-dnd__box.h5p-dnd__box__video-paste { + flex: 1 0 fit-content; +} + +.h5p-dnd__videobox-wrapper ~ .h5p-dnd__box__url { + height: 154px; + min-height: 110px; + min-width: 260px; + + .h5p-dnd__upload-audio-svg, + .h5p-dnd__upload-video-svg { + display: none; + } +} + +.h5p-dnd__videobox-wrapper~.h5p-dnd__box__url.h5p-dnd__box.has-error { + height: auto; +} + +.h5p-dnd__box--is-dashed:not(.h5p-dnd__box--is-uploading):hover { + border: dashed 2px #ACACAC; +} + +.h5p-dnd__row { + display: flex; + flex: 1; + align-items: center; + justify-content: center; + width: 100%; +} + +.h5p-bold { + font-weight: 700; +} + +.divider { + border-top: solid 1px #D0CFD4; + width: 35%; + margin: 0 10px; +} + +.h5p-dnd__box--has-video { + flex-flow: column; + width: 100%; +} + +.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) { + .h5p-dnd__box--has-video:focus { + .h5p-dnd__video-container { + background: #1670DF; + &:before { + font-family: $icon-font-family; + content: "\e85d"; + font-size: 2.5em; + } + + .h5p-dnd__video-overlay { + display: none; + } + } + } + .h5p-dnd__video-container { + cursor: pointer; + + &:hover { + background: #1670DF; + + &:before { + font-family: $icon-font-family; + content: "\e85d"; + font-size: 2.5em; + } + .h5p-dnd__video-overlay { + display: none; + } + } + } +} + +.h5p-dnd__videobox-wrapper--is-provider { + .h5p-dnd__box--has-video { + &:focus, + &:hover { + border: solid 2px #D0CFD4; + } + } +} + +.h5p-dnd__videobox-wrapper--has-label { + min-width: 400px; + flex: 1; +} + +.h5p-dnd__video-container { + width: 100%; + height: 100%; + min-height: 130px; + background: #1B1B1B; + border-radius: 6px; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + color: #fff; +} + +.h5p-dnd__video-overlay { + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + gap: 10px; +} + +.h5p-dnd__box--has-video.h5p-dnd__box--is-dragging { + .h5p-dnd__video-container { + background: #1670DF; + } +} + +.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--has-image:focus .h5p-dnd__column--show-when-focus, +.h5p-dnd__box:not(.h5p-dnd__box--is-uploading).h5p-dnd__box--has-video:focus .h5p-dnd__column--show-when-focus +{ + display: flex; +} + +.h5p-dnd__av-container { + display: flex; + align-items: flex-start; + gap: 11px; + flex-flow: row wrap; + margin-bottom: 20px; + container: h5p-dnd__av-container / inline-size; +} + +.h5p-dnd__videobox-wrapper:not(.h5p-dnd__videobox-wrapper--is-provider) ~ .h5p-dnd__box__video-paste, +.h5p-dnd__box--is-dragging + .h5p-dnd__box__video-paste { + display: none; +} + +.h5p-dnd__videobox-wrapper--is-provider + .h5p-dnd__box__url { + display: none; +} + +.h5p-dnd__box--is-uploading + .h5p-dnd__box__video-paste { + display: none; +} + +.h5p-dnd__videobox-wrapper { + width: 195px; + text-align: center; +} + +.h5p-dnd__video-quality { + text-align: left; + height: 130px; + display: flex; + flex-flow: column; + justify-content: space-between; + box-sizing: border-box; + border-left: solid 1px #ccc; + padding: 0 10px; +} + +.h5p-dnd__video-quality-title { + font-size: 14px; +} + +.h5p-dnd__video-quality-description { + font-size: 11px; + line-height: normal; + display: inline-block; + font-family: 'Open Sans', sans-serif; +} + +.h5p-dnd__box__url.h5p-dnd__box--is-dragging .h5p-dnd__column.h5p-dnd__column--is-highlighted { + width: 100%; + margin: 0; +} + +.h5p-dnd__btn__insert-url { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; + max-width: 150px; + &:before { + content: '\e85c'; + } +} + +@media (max-width: 525px) { + .h5p-dnd__box { + flex-flow: column; + } +} + +.h5p-dnd__box__url { + container: h5p-dnd__box__url / inline-size; +} + +.h5p-dnd__row--when-wide, +.h5p-dnd__column--when-wide { + display: none; +} + +.h5p-dnd__row:has(.input-container), +.h5p-dnd__row:has(.video-url-error-container) { + flex: 0; +} + +.h5p-dnd__column--no-margin, +.h5p-dnd__column--no-margin.h5p-dnd__column { + margin: 0; +} + +@container h5p-dnd__av-container (min-width: 760px) { + .h5p-dnd__box.h5p-dnd__box__action { + flex-flow: row; + align-items: stretch; + padding: 0; + } + + .h5p-dnd__row--when-wide, + .h5p-dnd__column--when-wide { + display: flex; + } + + .h5p-dnd__row--when-small, + .h5p-dnd__column--when-small { + display: none; + } + + .h5p-dnd__box.h5p-dnd__box__action, + .h5p-dnd__box__action { + background: #fff; + } +} + + +@container h5p-dnd__av-container (max-width: 760px) { + .h5p-dnd__badge, + .h5p-dnd__column, + .h5p-dnd__row { + font-size: 0.85em; + } + + .text-muted { + font-size: 1em; + } + + .h5p-dnd__btn__insert-url { + max-width: 120px; + } +} + +@container h5p-dnd__av-container (max-width: 250px) { + .h5p-dnd__box__url, + .h5p-dnd__box.h5p-dnd__box__url, + .h5p-dnd__videobox-wrapper~.h5p-dnd__box__url { + min-width: 0; + flex-basis: 100%; + } + + .h5p-dnd__btn__insert-url { + max-width: 90px; + } + + .h5p-dnd__box__url.h5p-dnd__box__video-paste { + padding: 10px; + } +} + +.h5p-dnd__videobox-wrapper ~ .h5p-dnd__box__url { + &.h5p-dnd__box.h5p-dnd__box__action { + flex-flow: column; + align-items: center; + padding: 10px; + } + + .h5p-dnd__row--when-wide, + .h5p-dnd__column--when-wide { + display: none; + } + + .h5p-dnd__row--when-small, + .h5p-dnd__column--when-small { + display: flex; + } +} + +.h5p-dnd-nowrap { + white-space: nowrap; +} \ No newline at end of file diff --git a/styles/scss/_h5peditor-image-edit.scss b/styles/scss/_h5peditor-image-edit.scss index ebeb318b..8741f170 100644 --- a/styles/scss/_h5peditor-image-edit.scss +++ b/styles/scss/_h5peditor-image-edit.scss @@ -1,6 +1,7 @@ @import 'variables'; .h5peditor { + .h5p-delete-image-button, .h5p-editing-image-button { background: linear-gradient(to bottom, #fff 0, #f2f2f2 100%); font-size: $font-size-small; @@ -18,9 +19,9 @@ } } + .h5p-delete-image-button:before, .h5p-editing-image-button:before { font-family: $icon-font-family; - content: "\e900"; color: #666; padding-right: 0.3em; padding-left: 0.45em; @@ -28,16 +29,27 @@ font-size: 1.5em; line-height: 0.9; } + + .h5p-delete-image-button:before { + content: "\e85f"; + } + .h5p-editing-image-button:before { + content : "\e85e"; + } + + .h5p-delete-image-button.loading:before, .h5p-editing-image-button.loading:before { content: "\e901"; } + .h5p-delete-image-button.hidden, .h5p-editing-image-button.hidden, .h5p-copyright-button.hidden { display: none !important; } + .ui-dialog .h5p-delete-image-button, .ui-dialog .h5p-editing-image-button, .ui-dialog .h5p-copyright-button { padding-left: 0.5em; diff --git a/styles/scss/_variables.scss b/styles/scss/_variables.scss index 3b08cf69..0b9f5070 100644 --- a/styles/scss/_variables.scss +++ b/styles/scss/_variables.scss @@ -56,6 +56,21 @@ $form-item-buttons-width-small: 54px; $form-label: #454347; $form-label-importance-high: #356593; +// Audio and Video (av) tab widget +$av-tab-container-border-color: #D0CFD4; +$av-tab-container-background-color: #FFFFFF; +$av-tab-button-color: #E7E9EE; +$av-tab-button-selected-color: #FFFFFF; +$av-tab-button-title-color: #000000; +$av-tab-button-font-color: #297BC7; + +// Drag and drop +$dnd-blue: #1670DF; +$dnd-blue-faded: #f6faff; +$dnd-text-color: #454347; +$dnd-gray-light: #D0CFD4; +$dnd-gray-dark: #ACACAC; + // Group collapse button $group-collapse-button-color: #228380; $group-collapse-button-color-light: #4dc2bf; diff --git a/styles/scss/application.scss b/styles/scss/application.scss index 9d433d84..605cc65b 100644 --- a/styles/scss/application.scss +++ b/styles/scss/application.scss @@ -5,6 +5,7 @@ @import "form-groups"; @import "h5peditor-image-edit"; @import "h5peditor-image-edit-popup"; +@import "h5peditor-drag-and-drop"; @import "deprecated"; html, body { @@ -443,18 +444,14 @@ a { text-align: center; } .h5p-add-dialog { - position: absolute; + position: inherit; z-index: 1; visibility: hidden; opacity: 0; background: #fff; - left: 1em; - right: 1em; - top: 1em; - border: 1px solid #cdcdcd; + margin-bottom: 1rem; box-sizing: border-box; -moz-box-sizing: border-box; - box-shadow: 0 0 8px #666; transition: visibility 0s 0.2s, opacity 0.2s; &.h5p-open { @@ -465,37 +462,63 @@ a { .h5p-add-dialog-table { overflow: hidden; + position: relative; .av-tablist { - overflow: hidden; - margin: 1em 1em 0 1em; + display: inline-flex; + border-left: 1px solid $av-tab-container-border-color; + + &:has(~ .av-tabpanel.has_content) { + .av-tab:not(.selected) { + opacity: 0.5; + cursor: not-allowed; + pointer-events: none; + } + } } .av-tab { cursor: pointer; - float: left; padding: 0.5em 0.75em; - border-top: 1px solid #ccc; - border-right: 1px solid #ccc; - font-weight: bold; + border-top: 1px solid $av-tab-container-border-color; + border-right: 1px solid $av-tab-container-border-color; + position: relative; + font-weight: 600; font-size: 15px; - color: #666; - background: #f5f5f5; + background: $av-tab-button-color; + z-index: 1; - &:first-child { - border-left: 1px solid #ccc; + &::before { + font-family: $icon-font-family; + color: $av-tab-button-font-color; + vertical-align: middle; + font-size: 1.8em; + margin-right: 4px; } + &.selected { - color: #333; - background: #fff; + color: $av-tab-button-title-color; + background: $av-tab-button-selected-color; + + &::after { + content: ""; + position: absolute; + bottom: -1px; + left: 0; + right: 0; + height: 1px; + background: $av-tab-button-selected-color; + } } } .av-tabpanel { - border: 1px solid #ccc; - margin: 0 1em 1em 1em; - overflow: hidden; + border: 1px solid $av-tab-container-border-color; + border-radius: 0 0 5px 5px; + margin-top: 1px; + position: relative; padding: 1em; + top: -1px; h3 { margin: 0 0 1em 0; @@ -1219,6 +1242,19 @@ a { } } +.av-tab__file-upload::before { + content: "\e85d"; +} + +.av-tab__insert-url::before { + content: "\e85c"; +} + +.av-tab__record-audio:last-child::before { + content: "\e85d"; // TODO: Change to microphone icon +} + + .h5peditor-form { position: relative; background: $form-background;