From 7e2652b5a8ddaee31594634667293e0fa8967b31 Mon Sep 17 00:00:00 2001 From: daniel cebrian Date: Thu, 16 Jan 2014 01:03:46 +0100 Subject: [PATCH] annotation tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First set of fixes from the pull request This does not include some of the testing files. The textannotation and videoannotation test files are not ready. waiting for an answer on the issue. Deleted token line in api.py and added test for token generator Added notes_spec.coffee remove spec file fixed minor error with the test fixes some quality errors fixed unit test fixed unit test added advanced module Added notes_spec.coffee remove spec file Quality and Testing Coverage 1. in test_textannotation.py I already check for line 75 as it states in the diff in line 43, same with test_videoanntotation 2. Like you said, exceptions cannot be checked for firebase_token_generator.py. The version of python that is active on the edx server is 2.7 or higher, but the code is there for correctness. Error checking works the same way. 3. I added a test for student/views/.py within tests and deleted the unused secret assignment. 4. test_token_generator.py is now its own file Added Secret Token data input fixed token generator Annotation Tools in Place The purpose of this pull request is to install two major modules: (1) a module to annotate text and (2) a module to annotate video. In either case an instructor can declare them in advanced settings under advanced_modules and input content (HTML in text, mp4 or YouTube videos for video). Students will be able to highlight portions and add their comments as well as reply to each other. There needs to be a storage server set up per course as well as a secret token to talk with said storage. Changes: 1. Added test to check for the creation of a token in tests.py (along with the rest of the tests for student/view.py) 2. Removed items in cms pertaining to annotation as this will only be possible in the lms 3. Added more comments to firebase_token_generator.py, the test files, students/views.py 4. Added some internationalization stuff to textannotation.html and videoannotation.html. I need some help with doing it in javascript, but the html is covered. incorporated lib for traslate fixed quality errors fixed my notes with catch token Text and Video Annotation Modules - First Iteration The following code-change is the first iteration of the modules for text and video annotation. Installing Modules: 1. Under “Advanced Settings”, add “textannotation” and “videoannotation” to the list of advanced_modules. 2. Add link to an external storage for annotations under “annotation_storage_url” 3. Add the secret token for talking with said storage under “annotation_token_secret” Using Modules 1. When creating new unit, you can find Text and Video annotation modules under “Advanced” component 2. Make sure you have either Text or Video in one unit, but not both. 3. Annotations are only allowed on Live/Public version and not Studio. Added missing templates and fixed more of the quality errors Fixed annotator not existing issue in cmd and tried to find the get_html() from the annotation module class to the descriptor Added a space after # in comments Fixed issue with an empty Module and token links Added licenses and fixed vis naming scheme and location. --- .../contentstore/tests/test_contentstore.py | 2 + .../contentstore/views/component.py | 2 + .../student/firebase_token_generator.py | 99 + .../student/tests/test_token_generator.py | 43 + common/djangoapps/student/tests/tests.py | 26 +- common/djangoapps/student/views.py | 25 + common/lib/xmodule/setup.py | 2 + .../xmodule/modulestore/inheritance.py | 2 + .../xmodule/tests/test_textannotation.py | 74 + .../xmodule/tests/test_videoannotation.py | 165 + .../xmodule/xmodule/textannotation_module.py | 106 + .../xmodule/xmodule/videoannotation_module.py | 172 + common/static/css/vendor/ova/annotator.css | 888 +++ .../static/css/vendor/ova/edx-annotator.css | 104 + .../css/vendor/ova/flagging-annotator.css | 27 + common/static/css/vendor/ova/ova.css | 605 ++ common/static/css/vendor/ova/rangeslider.css | 186 + .../css/vendor/ova/richText-annotator.css | 33 + .../static/css/vendor/ova/share-annotator.css | 203 + .../static/css/vendor/ova/tags-annotator.css | 97 + .../css/vendor/ova/video-js.font.dev.svg | 65 + common/static/css/vendor/ova/video-js.fw.png | Bin 0 -> 78899 bytes common/static/css/vendor/ova/video-js.less | 949 +++ common/static/css/vendor/ova/video-js.min.css | 5 + common/static/css/vendor/ova/video-js.png | Bin 0 -> 4565 bytes .../css/vendor/ova/videojs/skin/vjs.eot | Bin 0 -> 3536 bytes .../css/vendor/ova/videojs/skin/vjs.svg | 65 + .../css/vendor/ova/videojs/skin/vjs.ttf | Bin 0 -> 3372 bytes .../css/vendor/ova/videojs/skin/vjs.woff | Bin 0 -> 4228 bytes common/static/js/vendor/ova/annotator-full.js | 3386 +++++++++ .../static/js/vendor/ova/catch/css/main.css | 516 ++ .../js/vendor/ova/catch/img/closeIcon.png | Bin 0 -> 1114 bytes .../vendor/ova/catch/img/expandableIcon.png | Bin 0 -> 1279 bytes .../ova/catch/img/expandableIcon_Arrow.png | Bin 0 -> 3002 bytes .../static/js/vendor/ova/catch/img/fish.jpg | Bin 0 -> 11572 bytes .../vendor/ova/catch/img/geolocation_icon.png | Bin 0 -> 740 bytes .../js/vendor/ova/catch/img/groups_icon.png | Bin 0 -> 747 bytes .../js/vendor/ova/catch/img/privacy_icon.png | Bin 0 -> 635 bytes .../js/vendor/ova/catch/img/shareControls.png | Bin 0 -> 9691 bytes .../js/vendor/ova/catch/img/share_icon.png | Bin 0 -> 655 bytes common/static/js/vendor/ova/catch/js/catch.js | 1107 +++ .../vendor/ova/catch/js/handlebars-1.1.2.js | 2595 +++++++ .../js/vendor/ova/flagging-annotator.js | 104 + common/static/js/vendor/ova/jquery-Watch.js | 116 + common/static/js/vendor/ova/ova.js | 2553 +++++++ common/static/js/vendor/ova/rangeslider.js | 1078 +++ .../static/js/vendor/ova/reply-annotator.js | 99 + .../js/vendor/ova/richText-annotator.js | 142 + .../static/js/vendor/ova/share-annotator.js | 499 ++ .../skins/lightgray/content.inline.min.css | 1 + .../ova/skins/lightgray/content.min.css | 1 + .../skins/lightgray/fonts/icomoon-small.eot | Bin 0 -> 8344 bytes .../skins/lightgray/fonts/icomoon-small.svg | 175 + .../skins/lightgray/fonts/icomoon-small.ttf | Bin 0 -> 8160 bytes .../skins/lightgray/fonts/icomoon-small.woff | Bin 0 -> 8336 bytes .../ova/skins/lightgray/fonts/icomoon.eot | Bin 0 -> 8268 bytes .../ova/skins/lightgray/fonts/icomoon.svg | 153 + .../ova/skins/lightgray/fonts/icomoon.ttf | Bin 0 -> 8104 bytes .../ova/skins/lightgray/fonts/icomoon.woff | Bin 0 -> 8400 bytes .../vendor/ova/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../vendor/ova/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../vendor/ova/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../vendor/ova/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../vendor/ova/skins/lightgray/img/wline.gif | Bin 0 -> 46 bytes .../ova/skins/lightgray/skin.ie7.min.css | 1 + .../vendor/ova/skins/lightgray/skin.min.css | 1 + common/static/js/vendor/ova/tags-annotator.js | 1100 +++ common/static/js/vendor/ova/tinymce.min.js | 9 + common/static/js/vendor/ova/video.dev.js | 6461 +++++++++++++++++ common/static/js/vendor/ova/vjs.youtube.js | 605 ++ lms/djangoapps/notes/views.py | 7 +- lms/djangoapps/staticbook/views.py | 2 + lms/envs/common.py | 30 +- lms/static/coffee/src/notes.coffee | 80 +- lms/templates/notes.html | 152 +- lms/templates/static_htmlbook.html | 3 +- lms/templates/textannotation.html | 190 + lms/templates/videoannotation.html | 195 + lms/urls.py | 1 + 79 files changed, 25267 insertions(+), 40 deletions(-) create mode 100644 common/djangoapps/student/firebase_token_generator.py create mode 100644 common/djangoapps/student/tests/test_token_generator.py create mode 100644 common/lib/xmodule/xmodule/tests/test_textannotation.py create mode 100644 common/lib/xmodule/xmodule/tests/test_videoannotation.py create mode 100644 common/lib/xmodule/xmodule/textannotation_module.py create mode 100644 common/lib/xmodule/xmodule/videoannotation_module.py create mode 100644 common/static/css/vendor/ova/annotator.css create mode 100644 common/static/css/vendor/ova/edx-annotator.css create mode 100644 common/static/css/vendor/ova/flagging-annotator.css create mode 100644 common/static/css/vendor/ova/ova.css create mode 100644 common/static/css/vendor/ova/rangeslider.css create mode 100644 common/static/css/vendor/ova/richText-annotator.css create mode 100644 common/static/css/vendor/ova/share-annotator.css create mode 100644 common/static/css/vendor/ova/tags-annotator.css create mode 100644 common/static/css/vendor/ova/video-js.font.dev.svg create mode 100644 common/static/css/vendor/ova/video-js.fw.png create mode 100644 common/static/css/vendor/ova/video-js.less create mode 100644 common/static/css/vendor/ova/video-js.min.css create mode 100644 common/static/css/vendor/ova/video-js.png create mode 100644 common/static/css/vendor/ova/videojs/skin/vjs.eot create mode 100644 common/static/css/vendor/ova/videojs/skin/vjs.svg create mode 100644 common/static/css/vendor/ova/videojs/skin/vjs.ttf create mode 100644 common/static/css/vendor/ova/videojs/skin/vjs.woff create mode 100644 common/static/js/vendor/ova/annotator-full.js create mode 100644 common/static/js/vendor/ova/catch/css/main.css create mode 100644 common/static/js/vendor/ova/catch/img/closeIcon.png create mode 100644 common/static/js/vendor/ova/catch/img/expandableIcon.png create mode 100644 common/static/js/vendor/ova/catch/img/expandableIcon_Arrow.png create mode 100644 common/static/js/vendor/ova/catch/img/fish.jpg create mode 100644 common/static/js/vendor/ova/catch/img/geolocation_icon.png create mode 100644 common/static/js/vendor/ova/catch/img/groups_icon.png create mode 100644 common/static/js/vendor/ova/catch/img/privacy_icon.png create mode 100644 common/static/js/vendor/ova/catch/img/shareControls.png create mode 100644 common/static/js/vendor/ova/catch/img/share_icon.png create mode 100644 common/static/js/vendor/ova/catch/js/catch.js create mode 100644 common/static/js/vendor/ova/catch/js/handlebars-1.1.2.js create mode 100644 common/static/js/vendor/ova/flagging-annotator.js create mode 100644 common/static/js/vendor/ova/jquery-Watch.js create mode 100644 common/static/js/vendor/ova/ova.js create mode 100644 common/static/js/vendor/ova/rangeslider.js create mode 100644 common/static/js/vendor/ova/reply-annotator.js create mode 100644 common/static/js/vendor/ova/richText-annotator.js create mode 100644 common/static/js/vendor/ova/share-annotator.js create mode 100644 common/static/js/vendor/ova/skins/lightgray/content.inline.min.css create mode 100644 common/static/js/vendor/ova/skins/lightgray/content.min.css create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon-small.eot create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon-small.svg create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon-small.ttf create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon-small.woff create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon.eot create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon.svg create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon.ttf create mode 100644 common/static/js/vendor/ova/skins/lightgray/fonts/icomoon.woff create mode 100644 common/static/js/vendor/ova/skins/lightgray/img/anchor.gif create mode 100644 common/static/js/vendor/ova/skins/lightgray/img/loader.gif create mode 100644 common/static/js/vendor/ova/skins/lightgray/img/object.gif create mode 100644 common/static/js/vendor/ova/skins/lightgray/img/trans.gif create mode 100644 common/static/js/vendor/ova/skins/lightgray/img/wline.gif create mode 100644 common/static/js/vendor/ova/skins/lightgray/skin.ie7.min.css create mode 100644 common/static/js/vendor/ova/skins/lightgray/skin.min.css create mode 100644 common/static/js/vendor/ova/tags-annotator.js create mode 100644 common/static/js/vendor/ova/tinymce.min.js create mode 100644 common/static/js/vendor/ova/video.dev.js create mode 100644 common/static/js/vendor/ova/vjs.youtube.js create mode 100644 lms/templates/textannotation.html create mode 100644 lms/templates/videoannotation.html diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 2f57158f0c..3cd0ba90b1 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -146,6 +146,8 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): # response HTML self.check_components_on_page(ADVANCED_COMPONENT_TYPES, ['Word cloud', 'Annotation', + 'Text Annotation', + 'Video Annotation', 'Open Response Assessment', 'Peer Grading Interface']) diff --git a/cms/djangoapps/contentstore/views/component.py b/cms/djangoapps/contentstore/views/component.py index 38b05c094c..d466bbe732 100644 --- a/cms/djangoapps/contentstore/views/component.py +++ b/cms/djangoapps/contentstore/views/component.py @@ -52,6 +52,8 @@ else: ADVANCED_COMPONENT_TYPES = [ 'annotatable', + 'textannotation', # module for annotating text (with annotation table) + 'videoannotation', # module for annotating video (with annotation table) 'word_cloud', 'graphical_slider_tool', 'lti', diff --git a/common/djangoapps/student/firebase_token_generator.py b/common/djangoapps/student/firebase_token_generator.py new file mode 100644 index 0000000000..f84a85277e --- /dev/null +++ b/common/djangoapps/student/firebase_token_generator.py @@ -0,0 +1,99 @@ +''' + Firebase - library to generate a token + License: https://github.com/firebase/firebase-token-generator-python/blob/master/LICENSE + Tweaked and Edited by @danielcebrianr and @lduarte1991 + + This library will take either objects or strings and use python's built-in encoding + system as specified by RFC 3548. Thanks to the firebase team for their open-source + library. This was made specifically for speaking with the annotation_storage_url and + can be used and expanded, but not modified by anyone else needing such a process. +''' +from base64 import urlsafe_b64encode +import hashlib +import hmac +import sys +try: + import json +except ImportError: + import simplejson as json + +__all__ = ['create_token'] + +TOKEN_SEP = '.' + + +def create_token(secret, data): + ''' + Simply takes in the secret key and the data and + passes it to the local function _encode_token + ''' + return _encode_token(secret, data) + + +if sys.version_info < (2, 7): + def _encode(bytes_data): + ''' + Takes a json object, string, or binary and + uses python's urlsafe_b64encode to encode data + and make it safe pass along in a url. + To make sure it does not conflict with variables + we make sure equal signs are removed. + More info: docs.python.org/2/library/base64.html + ''' + encoded = urlsafe_b64encode(bytes(bytes_data)) + return encoded.decode('utf-8').replace('=', '') +else: + def _encode(bytes_info): + ''' + Same as above function but for Python 2.7 or later + ''' + encoded = urlsafe_b64encode(bytes_info) + return encoded.decode('utf-8').replace('=', '') + + +def _encode_json(obj): + ''' + Before a python dict object can be properly encoded, + it must be transformed into a jason object and then + transformed into bytes to be encoded using the function + defined above. + ''' + return _encode(bytearray(json.dumps(obj), 'utf-8')) + + +def _sign(secret, to_sign): + ''' + This function creates a sign that goes at the end of the + message that is specific to the secret and not the actual + content of the encoded body. + More info on hashing: http://docs.python.org/2/library/hmac.html + The function creates a hashed values of the secret and to_sign + and returns the digested values based the secure hash + algorithm, 256 + ''' + def portable_bytes(string): + ''' + Simply transforms a string into a bytes object, + which is a series of immutable integers 0<=x<=256. + Always try to encode as utf-8, unless it is not + compliant. + ''' + try: + return bytes(string, 'utf-8') + except TypeError: + return bytes(string) + return _encode(hmac.new(portable_bytes(secret), portable_bytes(to_sign), hashlib.sha256).digest()) # pylint: disable=E1101 + + +def _encode_token(secret, claims): + ''' + This is the main function that takes the secret token and + the data to be transmitted. There is a header created for decoding + purposes. Token_SEP means that a period/full stop separates the + header, data object/message, and signatures. + ''' + encoded_header = _encode_json({'typ': 'JWT', 'alg': 'HS256'}) + encoded_claims = _encode_json(claims) + secure_bits = '%s%s%s' % (encoded_header, TOKEN_SEP, encoded_claims) + sig = _sign(secret, secure_bits) + return '%s%s%s' % (secure_bits, TOKEN_SEP, sig) diff --git a/common/djangoapps/student/tests/test_token_generator.py b/common/djangoapps/student/tests/test_token_generator.py new file mode 100644 index 0000000000..1eb09c9173 --- /dev/null +++ b/common/djangoapps/student/tests/test_token_generator.py @@ -0,0 +1,43 @@ +""" +This test will run for firebase_token_generator.py. +""" + +from django.test import TestCase + +from student.firebase_token_generator import _encode, _encode_json, _encode_token, create_token + + +class TokenGenerator(TestCase): + """ + Tests for the file firebase_token_generator.py + """ + def test_encode(self): + """ + This tests makes sure that no matter what version of python + you have, the _encode function still returns the appropriate result + for a string. + """ + expected = "dGVzdDE" + result = _encode("test1") + self.assertEqual(expected, result) + + def test_encode_json(self): + """ + Same as above, but this one focuses on a python dict type + transformed into a json object and then encoded. + """ + expected = "eyJ0d28iOiAidGVzdDIiLCAib25lIjogInRlc3QxIn0" + result = _encode_json({'one': 'test1', 'two': 'test2'}) + self.assertEqual(expected, result) + + def test_create_token(self): + """ + Unlike its counterpart in student/views.py, this function + just checks for the encoding of a token. The other function + will test depending on time and user. + """ + expected = "eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJ1c2VySWQiOiAidXNlcm5hbWUiLCAidHRsIjogODY0MDB9.-p1sr7uwCapidTQ0qB7DdU2dbF-hViKpPNN_5vD10t8" + result1 = _encode_token('4c7f4d1c-8ac4-4e9f-84c8-b271c57fcac4', {"userId": "username", "ttl": 86400}) + result2 = create_token('4c7f4d1c-8ac4-4e9f-84c8-b271c57fcac4', {"userId": "username", "ttl": 86400}) + self.assertEqual(expected, result1) + self.assertEqual(expected, result2) diff --git a/common/djangoapps/student/tests/tests.py b/common/djangoapps/student/tests/tests.py index ea16b3f143..8df41609d6 100644 --- a/common/djangoapps/student/tests/tests.py +++ b/common/djangoapps/student/tests/tests.py @@ -20,6 +20,7 @@ from django.contrib.auth.hashers import UNUSABLE_PASSWORD from django.contrib.auth.tokens import default_token_generator from django.utils.http import int_to_base36 from django.core.urlresolvers import reverse +from django.http import HttpResponse from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase @@ -30,7 +31,7 @@ from textwrap import dedent from student.models import anonymous_id_for_user, user_by_anonymous_id, CourseEnrollment, unique_id_for_user from student.views import (process_survey_link, _cert_info, password_reset, password_reset_confirm_wrapper, - change_enrollment, complete_course_mode_info) + change_enrollment, complete_course_mode_info, token, course_from_id) from student.tests.factories import UserFactory, CourseModeFactory from student.tests.test_email import mock_render_to_string @@ -556,3 +557,26 @@ class AnonymousLookupTable(TestCase): anonymous_id = anonymous_id_for_user(self.user, self.course.id) real_user = user_by_anonymous_id(anonymous_id) self.assertEqual(self.user, real_user) + + +@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE) +class Token(ModuleStoreTestCase): + """ + Test for the token generator. This creates a random course and passes it through the token file which generates the + token that will be passed in to the annotation_storage_url. + """ + request_factory = RequestFactory() + COURSE_SLUG = "100" + COURSE_NAME = "test_course" + COURSE_ORG = "edx" + + def setUp(self): + self.course = CourseFactory.create(org=self.COURSE_ORG, display_name=self.COURSE_NAME, number=self.COURSE_SLUG) + self.user = User.objects.create(username="username", email="username") + self.req = self.request_factory.post('/token?course_id=edx/100/test_course', {'user': self.user}) + self.req.user = self.user + + def test_token(self): + expected = HttpResponse("eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJpc3N1ZWRBdCI6ICIyMDE0LTAxLTIzVDE5OjM1OjE3LjUyMjEwNC01OjAwIiwgImNvbnN1bWVyS2V5IjogInh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCIsICJ1c2VySWQiOiAidXNlcm5hbWUiLCAidHRsIjogODY0MDB9.OjWz9mzqJnYuzX-f3uCBllqJUa8PVWJjcDy_McfxLvc", mimetype="text/plain") + response = token(self.req) + self.assertEqual(expected.content.split('.')[0], response.content.split('.')[0]) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index cae7605f28..95ff269a3a 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -1443,3 +1443,28 @@ def change_email_settings(request): track.views.server_track(request, "change-email-settings", {"receive_emails": "no", "course": course_id}, page='dashboard') return HttpResponse(json.dumps({'success': True})) + +from student.firebase_token_generator import create_token + + +@login_required +def token(request): + ''' + Return a token for the backend of annotations. + It uses the course id to retrieve a variable that contains the secret + token found in inheritance.py. It also contains information of when + the token was issued. This will be stored with the user along with + the id for identification purposes in the backend. + ''' + course_id = request.GET.get("course_id") + course = course_from_id(course_id) + dtnow = datetime.datetime.now() + dtutcnow = datetime.datetime.utcnow() + delta = dtnow - dtutcnow + newhour, newmin = divmod((delta.days * 24 * 60 * 60 + delta.seconds + 30) // 60, 60) + newtime = "%s%+02d:%02d" % (dtnow.isoformat(), newhour, newmin) + secret = course.annotation_token_secret + custom_data = {"issuedAt": newtime, "consumerKey": secret, "userId": request.user.email, "ttl": 86400} + newtoken = create_token(secret, custom_data) + response = HttpResponse(newtoken, mimetype="text/plain") + return response diff --git a/common/lib/xmodule/setup.py b/common/lib/xmodule/setup.py index 558668c9fa..f487081f8f 100644 --- a/common/lib/xmodule/setup.py +++ b/common/lib/xmodule/setup.py @@ -33,6 +33,8 @@ XMODULES = [ "wrapper = xmodule.wrapper_module:WrapperDescriptor", "graphical_slider_tool = xmodule.gst_module:GraphicalSliderToolDescriptor", "annotatable = xmodule.annotatable_module:AnnotatableDescriptor", + "textannotation = xmodule.textannotation_module:TextAnnotationDescriptor", + "videoannotation = xmodule.videoannotation_module:VideoAnnotationDescriptor", "foldit = xmodule.foldit_module:FolditDescriptor", "word_cloud = xmodule.word_cloud_module:WordCloudDescriptor", "hidden = xmodule.hidden_module:HiddenDescriptor", diff --git a/common/lib/xmodule/xmodule/modulestore/inheritance.py b/common/lib/xmodule/xmodule/modulestore/inheritance.py index 8f824f38c6..0a20716e30 100644 --- a/common/lib/xmodule/xmodule/modulestore/inheritance.py +++ b/common/lib/xmodule/xmodule/modulestore/inheritance.py @@ -41,6 +41,8 @@ class InheritanceMixin(XBlockMixin): scope=Scope.settings, ) xqa_key = String(help="DO NOT USE", scope=Scope.settings) + annotation_storage_url = String(help="Location of Annotation backend", scope=Scope.settings, default="http://your_annotation_storage.com", display_name="Url for Annotation Storage") + annotation_token_secret = String(help="Secret string for annotation storage", scope=Scope.settings, default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", display_name="Secret Token String for Annotation") graceperiod = Timedelta( help="Amount of time after the due date that submissions will be accepted", scope=Scope.settings, diff --git a/common/lib/xmodule/xmodule/tests/test_textannotation.py b/common/lib/xmodule/xmodule/tests/test_textannotation.py new file mode 100644 index 0000000000..397e3990ef --- /dev/null +++ b/common/lib/xmodule/xmodule/tests/test_textannotation.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +"Test for Annotation Xmodule functional logic." + +import unittest +from mock import Mock +from lxml import etree + +from xblock.field_data import DictFieldData +from xblock.fields import ScopeIds + +from xmodule.textannotation_module import TextAnnotationModule + +from . import get_test_system + + +class TextAnnotationModuleTestCase(unittest.TestCase): + ''' text Annotation Module Test Case ''' + sample_xml = ''' + +

Test Instructions.

+

+ One Fish. Two Fish. + Red Fish. Blue Fish. + + Oh the places you'll go! +

+
+ ''' + + def setUp(self): + """ + Makes sure that the Module is declared and mocked with the sample xml above. + """ + self.mod = TextAnnotationModule( + Mock(), + get_test_system(), + DictFieldData({'data': self.sample_xml}), + ScopeIds(None, None, None, None) + ) + + def test_render_content(self): + """ + Tests to make sure the sample xml is rendered and that it forms a valid xmltree + that does not contain a display_name. + """ + content = self.mod._render_content() # pylint: disable=W0212 + self.assertIsNotNone(content) + element = etree.fromstring(content) + self.assertIsNotNone(element) + self.assertFalse('display_name' in element.attrib, "Display Name should have been deleted from Content") + + def test_extract_instructions(self): + """ + Tests to make sure that the instructions are correctly pulled from the sample xml above. + It also makes sure that if no instructions exist, that it does in fact return nothing. + """ + xmltree = etree.fromstring(self.sample_xml) + + expected_xml = u"

Test Instructions.

" + actual_xml = self.mod._extract_instructions(xmltree) # pylint: disable=W0212 + self.assertIsNotNone(actual_xml) + self.assertEqual(expected_xml.strip(), actual_xml.strip()) + + xmltree = etree.fromstring('foo') + actual = self.mod._extract_instructions(xmltree) # pylint: disable=W0212 + self.assertIsNone(actual) + + def test_get_html(self): + """ + Tests the function that passes in all the information in the context that will be used in templates/textannotation.html + """ + context = self.mod.get_html() + for key in ['display_name', 'tag', 'source', 'instructions_html', 'content_html', 'annotation_storage']: + self.assertIn(key, context) diff --git a/common/lib/xmodule/xmodule/tests/test_videoannotation.py b/common/lib/xmodule/xmodule/tests/test_videoannotation.py new file mode 100644 index 0000000000..cb63d05503 --- /dev/null +++ b/common/lib/xmodule/xmodule/tests/test_videoannotation.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +"Test for Annotation Xmodule functional logic." + +import unittest +from mock import Mock +from lxml import etree + +from xblock.field_data import DictFieldData +from xblock.fields import ScopeIds + +from xmodule.videoannotation_module import VideoAnnotationModule + +from . import get_test_system + + +class VideoAnnotationModuleTestCase(unittest.TestCase): + ''' Video Annotation Module Test Case ''' + sample_xml = ''' + +

Video Test Instructions.

+
+ ''' + sample_sourceurl = "http://video-js.zencoder.com/oceans-clip.mp4" + sample_youtubeurl = "http://www.youtube.com/watch?v=yxLIu-scR9Y" + + def setUp(self): + """ + Makes sure that the Video Annotation Module is created. + """ + self.mod = VideoAnnotationModule( + Mock(), + get_test_system(), + DictFieldData({'data': self.sample_xml, 'sourceUrl': self.sample_sourceurl}), + ScopeIds(None, None, None, None) + ) + + def test_annotation_class_attr_default(self): + """ + Makes sure that it can detect annotation values in text-form if user + decides to add text to the area below video, video functionality is completely + found in javascript. + """ + xml = 'test' + element = etree.fromstring(xml) + + expected_attr = {'class': {'value': 'annotatable-span highlight'}} + actual_attr = self.mod._get_annotation_class_attr(element) # pylint: disable=W0212 + + self.assertIsInstance(actual_attr, dict) + self.assertDictEqual(expected_attr, actual_attr) + + def test_annotation_class_attr_with_valid_highlight(self): + """ + Same as above but more specific to an area that is highlightable in the appropriate + color designated. + """ + xml = 'test' + + for color in self.mod.highlight_colors: + element = etree.fromstring(xml.format(highlight=color)) + value = 'annotatable-span highlight highlight-{highlight}'.format(highlight=color) + + expected_attr = {'class': { + 'value': value, + '_delete': 'highlight'} + } + actual_attr = self.mod._get_annotation_class_attr(element) # pylint: disable=W0212 + + self.assertIsInstance(actual_attr, dict) + self.assertDictEqual(expected_attr, actual_attr) + + def test_annotation_class_attr_with_invalid_highlight(self): + """ + Same as above, but checked with invalid colors. + """ + xml = 'test' + + for invalid_color in ['rainbow', 'blink', 'invisible', '', None]: + element = etree.fromstring(xml.format(highlight=invalid_color)) + expected_attr = {'class': { + 'value': 'annotatable-span highlight', + '_delete': 'highlight'} + } + actual_attr = self.mod._get_annotation_class_attr(element) # pylint: disable=W0212 + + self.assertIsInstance(actual_attr, dict) + self.assertDictEqual(expected_attr, actual_attr) + + def test_annotation_data_attr(self): + """ + Test that each highlight contains the data information from the annotation itself. + """ + element = etree.fromstring('test') + + expected_attr = { + 'data-comment-body': {'value': 'foo', '_delete': 'body'}, + 'data-comment-title': {'value': 'bar', '_delete': 'title'}, + 'data-problem-id': {'value': '0', '_delete': 'problem'} + } + + actual_attr = self.mod._get_annotation_data_attr(element) # pylint: disable=W0212 + + self.assertIsInstance(actual_attr, dict) + self.assertDictEqual(expected_attr, actual_attr) + + def test_render_annotation(self): + """ + Tests to make sure that the spans designating annotations acutally visually render as annotations. + """ + expected_html = 'z' + expected_el = etree.fromstring(expected_html) + + actual_el = etree.fromstring('z') + self.mod._render_annotation(actual_el) # pylint: disable=W0212 + + self.assertEqual(expected_el.tag, actual_el.tag) + self.assertEqual(expected_el.text, actual_el.text) + self.assertDictEqual(dict(expected_el.attrib), dict(actual_el.attrib)) + + def test_render_content(self): + """ + Like above, but using the entire text, it makes sure that display_name is removed and that there is only one + div encompassing the annotatable area. + """ + content = self.mod._render_content() # pylint: disable=W0212 + element = etree.fromstring(content) + self.assertIsNotNone(element) + self.assertEqual('div', element.tag, 'root tag is a div') + self.assertFalse('display_name' in element.attrib, "Display Name should have been deleted from Content") + + def test_extract_instructions(self): + """ + This test ensures that if an instruction exists it is pulled and + formatted from the tags. Otherwise, it should return nothing. + """ + xmltree = etree.fromstring(self.sample_xml) + + expected_xml = u"

Video Test Instructions.

" + actual_xml = self.mod._extract_instructions(xmltree) # pylint: disable=W0212 + self.assertIsNotNone(actual_xml) + self.assertEqual(expected_xml.strip(), actual_xml.strip()) + + xmltree = etree.fromstring('foo') + actual = self.mod._extract_instructions(xmltree) # pylint: disable=W0212 + self.assertIsNone(actual) + + def test_get_extension(self): + """ + Tests the function that returns the appropriate extension depending on whether it is + a video from youtube, or one uploaded to the EdX server. + """ + expectedyoutube = 'video/youtube' + expectednotyoutube = 'video/mp4' + result1 = self.mod._get_extension(self.sample_sourceurl) # pylint: disable=W0212 + result2 = self.mod._get_extension(self.sample_youtubeurl) # pylint: disable=W0212 + self.assertEqual(expectedyoutube, result2) + self.assertEqual(expectednotyoutube, result1) + + def test_get_html(self): + """ + Tests to make sure variables passed in truly exist within the html once it is all rendered. + """ + context = self.mod.get_html() + for key in ['display_name', 'content_html', 'instructions_html', 'sourceUrl', 'typeSource', 'poster', 'alert', 'annotation_storage']: + self.assertIn(key, context) diff --git a/common/lib/xmodule/xmodule/textannotation_module.py b/common/lib/xmodule/xmodule/textannotation_module.py new file mode 100644 index 0000000000..1d732d8709 --- /dev/null +++ b/common/lib/xmodule/xmodule/textannotation_module.py @@ -0,0 +1,106 @@ +''' Text annotation module ''' + +from lxml import etree +from pkg_resources import resource_string + +from xmodule.x_module import XModule +from xmodule.raw_module import RawDescriptor +from xblock.core import Scope, String + +import textwrap + + +class AnnotatableFields(object): + """Fields for `TextModule` and `TextDescriptor`.""" + data = String(help="XML data for the annotation", scope=Scope.content, default=textwrap.dedent("""\ + + +

+ Add the instructions to the assignment here. +

+
+

+ Lorem ipsum dolor sit amet, at amet animal petentium nec. Id augue nemore postulant mea. Ex eam dicant noluisse expetenda, alia admodum abhorreant qui et. An ceteros expetenda mea, tale natum ipsum quo no, ut pro paulo alienum noluisse. +

+
+ """)) + display_name = String( + display_name="Display Name", + help="Display name for this module", + scope=Scope.settings, + default='Text Annotation', + ) + tags = String( + display_name="Tags for Assignments", + help="Add tags that automatically highlight in a certain color using the comma-separated form, i.e. imagery:red,parallelism:blue", + scope=Scope.settings, + default='imagery:red,parallelism:blue', + ) + source = String( + display_name="Source/Citation", + help="Optional for citing source of any material used. Automatic citation can be done using EasyBib", + scope=Scope.settings, + default='None', + ) + annotation_storage_url = String(help="Location of Annotation backend", scope=Scope.settings, default="http://your_annotation_storage.com", display_name="Url for Annotation Storage") + + +class TextAnnotationModule(AnnotatableFields, XModule): + ''' Text Annotation Module ''' + js = {'coffee': [], + 'js': []} + css = {'scss': [resource_string(__name__, 'css/annotatable/display.scss')]} + icon_class = 'textannotation' + + def __init__(self, *args, **kwargs): + super(TextAnnotationModule, self).__init__(*args, **kwargs) + + xmltree = etree.fromstring(self.data) + + self.instructions = self._extract_instructions(xmltree) + self.content = etree.tostring(xmltree, encoding='unicode') + self.highlight_colors = ['yellow', 'orange', 'purple', 'blue', 'green'] + + def _render_content(self): + """ Renders annotatable content with annotation spans and returns HTML. """ + xmltree = etree.fromstring(self.content) + if 'display_name' in xmltree.attrib: + del xmltree.attrib['display_name'] + + return etree.tostring(xmltree, encoding='unicode') + + def _extract_instructions(self, xmltree): + """ Removes from the xmltree and returns them as a string, otherwise None. """ + instructions = xmltree.find('instructions') + if instructions is not None: + instructions.tag = 'div' + xmltree.remove(instructions) + return etree.tostring(instructions, encoding='unicode') + return None + + def get_html(self): + """ Renders parameters to template. """ + context = { + 'display_name': self.display_name_with_default, + 'tag': self.tags, + 'source': self.source, + 'instructions_html': self.instructions, + 'content_html': self._render_content(), + 'annotation_storage': self.annotation_storage_url + } + + return self.system.render_template('textannotation.html', context) + + +class TextAnnotationDescriptor(AnnotatableFields, RawDescriptor): + ''' Text Annotation Descriptor ''' + module_class = TextAnnotationModule + mako_template = "widgets/raw-edit.html" + + @property + def non_editable_metadata_fields(self): + non_editable_fields = super(TextAnnotationDescriptor, self).non_editable_metadata_fields + non_editable_fields.extend([ + TextAnnotationDescriptor.annotation_storage_url + ]) + return non_editable_fields diff --git a/common/lib/xmodule/xmodule/videoannotation_module.py b/common/lib/xmodule/xmodule/videoannotation_module.py new file mode 100644 index 0000000000..a27eb7c628 --- /dev/null +++ b/common/lib/xmodule/xmodule/videoannotation_module.py @@ -0,0 +1,172 @@ +""" +Module for Video annotations using annotator. +""" +from lxml import etree +from pkg_resources import resource_string + +from xmodule.x_module import XModule +from xmodule.raw_module import RawDescriptor +from xblock.core import Scope, String + +import textwrap + + +class AnnotatableFields(object): + """ Fields for `VideoModule` and `VideoDescriptor`. """ + data = String(help="XML data for the annotation", scope=Scope.content, default=textwrap.dedent("""\ + + +

+ Add the instructions to the assignment here. +

+
+
+ """)) + display_name = String( + display_name="Display Name", + help="Display name for this module", + scope=Scope.settings, + default='Video Annotation', + ) + sourceurl = String(help="The external source URL for the video.", display_name="Source URL", scope=Scope.settings, default="http://video-js.zencoder.com/oceans-clip.mp4") + poster_url = String(help="Poster Image URL", display_name="Poster URL", scope=Scope.settings, default="") + annotation_storage_url = String(help="Location of Annotation backend", scope=Scope.settings, default="http://your_annotation_storage.com", display_name="Url for Annotation Storage") + + +class VideoAnnotationModule(AnnotatableFields, XModule): + '''Video Annotation Module''' + js = {'coffee': [resource_string(__name__, 'js/src/javascript_loader.coffee'), + resource_string(__name__, 'js/src/collapsible.coffee'), + resource_string(__name__, 'js/src/html/display.coffee'), + resource_string(__name__, 'js/src/annotatable/display.coffee') + ], + 'js': []} + css = {'scss': [resource_string(__name__, 'css/annotatable/display.scss')]} + icon_class = 'videoannotation' + + def __init__(self, *args, **kwargs): + super(VideoAnnotationModule, self).__init__(*args, **kwargs) + + xmltree = etree.fromstring(self.data) + + self.instructions = self._extract_instructions(xmltree) + self.content = etree.tostring(xmltree, encoding='unicode') + self.highlight_colors = ['yellow', 'orange', 'purple', 'blue', 'green'] + + def _get_annotation_class_attr(self, element): + """ Returns a dict with the CSS class attribute to set on the annotation + and an XML key to delete from the element. + """ + + attr = {} + cls = ['annotatable-span', 'highlight'] + highlight_key = 'highlight' + color = element.get(highlight_key) + + if color is not None: + if color in self.highlight_colors: + cls.append('highlight-' + color) + attr['_delete'] = highlight_key + attr['value'] = ' '.join(cls) + + return {'class': attr} + + def _get_annotation_data_attr(self, element): + """ Returns a dict in which the keys are the HTML data attributes + to set on the annotation element. Each data attribute has a + corresponding 'value' and (optional) '_delete' key to specify + an XML attribute to delete. + """ + + data_attrs = {} + attrs_map = { + 'body': 'data-comment-body', + 'title': 'data-comment-title', + 'problem': 'data-problem-id' + } + + for xml_key in attrs_map.keys(): + if xml_key in element.attrib: + value = element.get(xml_key, '') + html_key = attrs_map[xml_key] + data_attrs[html_key] = {'value': value, '_delete': xml_key} + + return data_attrs + + def _render_annotation(self, element): + """ Renders an annotation element for HTML output. """ + attr = {} + attr.update(self._get_annotation_class_attr(element)) + attr.update(self._get_annotation_data_attr(element)) + + element.tag = 'span' + + for key in attr.keys(): + element.set(key, attr[key]['value']) + if '_delete' in attr[key] and attr[key]['_delete'] is not None: + delete_key = attr[key]['_delete'] + del element.attrib[delete_key] + + def _render_content(self): + """ Renders annotatable content with annotation spans and returns HTML. """ + xmltree = etree.fromstring(self.content) + xmltree.tag = 'div' + if 'display_name' in xmltree.attrib: + del xmltree.attrib['display_name'] + + for element in xmltree.findall('.//annotation'): + self._render_annotation(element) + + return etree.tostring(xmltree, encoding='unicode') + + def _extract_instructions(self, xmltree): + """ Removes from the xmltree and returns them as a string, otherwise None. """ + instructions = xmltree.find('instructions') + if instructions is not None: + instructions.tag = 'div' + xmltree.remove(instructions) + return etree.tostring(instructions, encoding='unicode') + return None + + def _get_extension(self, srcurl): + ''' get the extension of a given url ''' + if 'youtu' in srcurl: + return 'video/youtube' + else: + spliturl = srcurl.split(".") + extensionplus1 = spliturl[len(spliturl) - 1] + spliturl = extensionplus1.split("?") + extensionplus2 = spliturl[0] + spliturl = extensionplus2.split("#") + return 'video/' + spliturl[0] + + def get_html(self): + """ Renders parameters to template. """ + extension = self._get_extension(self.sourceurl) + + context = { + 'display_name': self.display_name_with_default, + 'instructions_html': self.instructions, + 'sourceUrl': self.sourceurl, + 'typeSource': extension, + 'poster': self.poster_url, + 'alert': self, + 'content_html': self._render_content(), + 'annotation_storage': self.annotation_storage_url + } + + return self.system.render_template('videoannotation.html', context) + + +class VideoAnnotationDescriptor(AnnotatableFields, RawDescriptor): + ''' Video annotation descriptor ''' + module_class = VideoAnnotationModule + mako_template = "widgets/raw-edit.html" + + @property + def non_editable_metadata_fields(self): + non_editable_fields = super(VideoAnnotationDescriptor, self).non_editable_metadata_fields + non_editable_fields.extend([ + VideoAnnotationDescriptor.annotation_storage_url + ]) + return non_editable_fields diff --git a/common/static/css/vendor/ova/annotator.css b/common/static/css/vendor/ova/annotator.css new file mode 100644 index 0000000000..92248d1caf --- /dev/null +++ b/common/static/css/vendor/ova/annotator.css @@ -0,0 +1,888 @@ +/* Base Reset +-------------------------------------------------------------------- */ + +.annotator-notice, +.annotator-filter *, +.annotator-widget * { + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + font-weight: normal; + text-align: left; + margin: 0; + padding: 0; + background: none; + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + -o-box-shadow: none; + box-shadow: none; + color: rgb(144, 144, 144); +} + +/* Images +-------------------------------------------------------------------- */ + +.annotator-adder { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAAAwCAYAAAD+WvNWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMzgwMTE3NDA3MjA2ODExODRCQUU5RDY0RTkyQTJDNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowOUY5RUFERDYwOEIxMUUxOTQ1RDkyQzU2OTNEMDZENCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowOUY5RUFEQzYwOEIxMUUxOTQ1RDkyQzU2OTNEMDZENCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA1ODAxMTc0MDcyMDY4MTE5MTA5OUIyNDhFRUQ1QkM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjAzODAxMTc0MDcyMDY4MTE4NEJBRTlENjRFOTJBMkM2Ii8+IDwvcmRmOkRlc2NyaXB0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'); + background-repeat: no-repeat; +} + +.annotator-resize, +.annotator-widget::after, +.annotator-editor a::after, +.annotator-viewer .annotator-controls button, +.annotator-viewer .annotator-controls a, +.annotator-filter .annotator-filter-navigation button::after, +.annotator-filter .annotator-filter-property .annotator-filter-clear { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAEiCAYAAAD0w4JOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDY0MTMzNTM2QUQzMTFFMUE2REJERDgwQTM3Njg5NTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDY0MTMzNTQ2QUQzMTFFMUE2REJERDgwQTM3Njg5NTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2ODkwQjlFQzZBRDExMUUxQTZEQkREODBBMzc2ODk1NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENjQxMzM1MjZBRDMxMUUxQTZEQkREODBBMzc2ODk1NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkijPpwAABBRSURBVHja7JsJVBRX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'); + background-repeat: no-repeat; +} + +/* Annotator Highlight +-------------------------------------------------------------------- */ + +.annotator-hl { + background: rgba(255, 255, 10, 0.3); +} + +.annotator-hl-temporary { + background: rgba(0, 124, 255, 0.3); +} + +/* Annotator Wrapper +-------------------------------------------------------------------- */ + +.annotator-wrapper { + position: relative; +} + +/* NB: If you change the list of classes for which z-index is set, + you should update Annotator._setupDynamicStyle() */ +.annotator-adder, +.annotator-outer, +.annotator-notice { + z-index: 1020; +} + +.annotator-filter { + z-index: 1010; +} + +.annotator-adder, +.annotator-outer, +.annotator-widget, +.annotator-notice { + position: absolute; + font-size: 10px; + line-height: 1; +} + +.annotator-hide { + display: none; + visibility: hidden; +} + +/* Annotator Adder +-------------------------------------------------------------------- */ + +.annotator-adder { + margin-top: -48px; + margin-left: -24px; + width: 48px; + height: 48px; + background-position: left top; +} + +.annotator-adder:hover { + background-position: center top; +} + +.annotator-adder:active { + background-position: center right; +} + +.annotator-adder button { + display: block; + width: 36px; + height: 41px; + margin: 0 auto; + border: none; + background: none; + text-indent: -999em; + cursor: pointer; +} + +/* Annotator Widget + + This applies to both the Viewer and the Editor +-------------------------------------------------------------------- */ + +.annotator-outer { + width: 0; + height: 0; +} + +.annotator-widget { + margin: 0; + padding: 0; + bottom: 15px; + left: -18px; + min-width: 265px; + background-color: rgba(251, 251, 251, 0.98); + border: 1px solid rgba(122, 122, 122, 0.6); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); + -o-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); +} + +.annotator-invert-x .annotator-widget { + left: auto; + right: -18px; +} + +.annotator-invert-y .annotator-widget { + bottom: auto; + top: 8px; +} + +.annotator-widget strong { + font-weight: bold; +} + +.annotator-widget .annotator-listing, +.annotator-widget .annotator-item { + padding: 0; + margin: 0; + list-style: none; +} + +.annotator-widget::after { + content: ""; + display: block; + width: 18px; + height: 10px; + background-position: 0 0; + position: absolute; + bottom: -10px; + left: 8px; +} + +.annotator-invert-x .annotator-widget::after { + left: auto; + right: 8px; +} + +.annotator-invert-y .annotator-widget::after { + background-position: 0 -15px; + bottom: auto; + top: -9px; +} + +.annotator-widget .annotator-item, +.annotator-editor .annotator-item input, +.annotator-editor .annotator-item textarea { + position: relative; + font-size: 12px; +} + +.annotator-viewer .annotator-item { + border-top: 2px solid rgba(122, 122, 122, 0.2); +} + +.annotator-widget .annotator-item:first-child { + border-top: none; +} + +.annotator-editor .annotator-item, +.annotator-viewer div { + border-top: 1px solid rgba(133, 133, 133, 0.11); +} + +/* Annotator Viewer +-------------------------------------------------------------------- */ + +.annotator-viewer div { + padding: 6px 6px; +} + +.annotator-viewer .annotator-item ol, +.annotator-viewer .annotator-item ul { + padding: 4px 16px; +} + +.annotator-viewer .annotator-item li { +} + +.annotator-viewer div:first-of-type, +.annotator-editor .annotator-item:first-child textarea { + padding-top: 12px; + padding-bottom: 12px; + color: rgb(60, 60, 60); + font-size: 13px; + font-style: italic; + line-height: 1.3; + border-top: none; +} + +.annotator-viewer .annotator-controls { + position: relative; + top: 5px; + right: 5px; + padding-left: 5px; + opacity: 0; + -webkit-transition: opacity 0.2s ease-in; + -moz-transition: opacity 0.2s ease-in; + -o-transition: opacity 0.2s ease-in; + transition: opacity 0.2s ease-in; + float: right; +} + +.annotator-viewer li:hover .annotator-controls, +.annotator-viewer li .annotator-controls.annotator-visible { + opacity: 1; +} + +.annotator-viewer .annotator-controls button, +.annotator-viewer .annotator-controls a { + cursor: pointer; + display: inline-block; + width: 13px; + height: 13px; + margin-left: 2px; + border: none; + opacity: 0.2; + text-indent: -900em; + background-color: transparent; + outline: none; +} + +.annotator-viewer .annotator-controls button:hover, +.annotator-viewer .annotator-controls button:focus, +.annotator-viewer .annotator-controls a:hover, +.annotator-viewer .annotator-controls a:focus { + opacity: 0.9; +} + +.annotator-viewer .annotator-controls button:active, +.annotator-viewer .annotator-controls a:active { + opacity: 1; +} + +.annotator-viewer .annotator-controls button[disabled] { + display: none; +} + +.annotator-viewer .annotator-controls .annotator-edit { + background-position: 0 -60px; +} + +.annotator-viewer .annotator-controls .annotator-delete { + background-position: 0 -75px; +} + +.annotator-viewer .annotator-controls .annotator-link { + background-position: 0 -270px; +} + +/* Annotator Editor +-------------------------------------------------------------------- */ + +.annotator-editor .annotator-item { + position: relative; +} + +.annotator-editor .annotator-item label { + top: 0; + display: inline; + cursor: pointer; + font-size: 12px; +} + +.annotator-editor .annotator-item input, +.annotator-editor .annotator-item textarea { + display: block; + min-width: 100%; + padding: 10px 8px; + border: none; + margin: 0; + color: rgb(60, 60, 60); + background: none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + resize: none; +} + +.annotator-editor .annotator-item textarea::-webkit-scrollbar { + height: 8px; + width: 8px; +} + +.annotator-editor .annotator-item textarea::-webkit-scrollbar-track-piece { + margin: 13px 0 3px; + background-color: #e5e5e5; + -webkit-border-radius: 4px; +} + +.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:vertical { + height: 25px; + background-color: #ccc; + -webkit-border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:horizontal { + width: 25px; + background-color: #ccc; + -webkit-border-radius: 4px; +} + +.annotator-editor .annotator-item:first-child textarea { + min-height: 5.5em; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -o-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.annotator-editor .annotator-item input:focus, +.annotator-editor .annotator-item textarea:focus{ + background-color: rgb(243, 243, 243); + outline: none; +} + +.annotator-editor .annotator-item input[type=radio], +.annotator-editor .annotator-item input[type=checkbox] { + width: auto; + min-width: 0; + padding: 0; + display: inline; + margin: 0 4px 0 0; + cursor: pointer; +} + +.annotator-editor .annotator-checkbox { + padding: 8px 6px; +} + +.annotator-filter, +.annotator-filter .annotator-filter-navigation button, +.annotator-editor .annotator-controls { + text-align: right; + padding: 3px; + border-top: 1px solid rgb(212,212,212); + background-color: rgb(212, 212, 212); + background-image: -webkit-gradient( + linear, left top, left bottom, + from(rgb(245, 245, 245)), + color-stop(0.6, rgb(220, 220, 220)), + to(rgb(210, 210, 210)) + ); + background-image: -moz-linear-gradient( + to bottom, + rgb(245, 245, 245), + rgb(220, 220, 220) 60%, + rgb(210, 210, 210) + ); + background-image: -webkit-linear-gradient( + to bottom, + rgb(245, 245, 245), + rgb(220, 220, 220) 60%, + rgb(210, 210, 210) + ); + background-image: linear-gradient( + to bottom, + rgb(245, 245, 245), + rgb(220, 220, 220) 60%, + rgb(210, 210, 210) + ); + -webkit-box-shadow: + inset 1px 0 0 rgba(255, 255, 255, 0.7), + inset -1px 0 0 rgba(255, 255, 255, 0.7), + inset 0 1px 0 rgba(255, 255, 255, 0.7); + -moz-box-shadow: + inset 1px 0 0 rgba(255, 255, 255, 0.7), + inset -1px 0 0 rgba(255, 255, 255, 0.7), + inset 0 1px 0 rgba(255, 255, 255, 0.7); + -o-box-shadow: + inset 1px 0 0 rgba(255, 255, 255, 0.7), + inset -1px 0 0 rgba(255, 255, 255, 0.7), + inset 0 1px 0 rgba(255, 255, 255, 0.7); + box-shadow: + inset 1px 0 0 rgba(255, 255, 255, 0.7), + inset -1px 0 0 rgba(255, 255, 255, 0.7), + inset 0 1px 0 rgba(255, 255, 255, 0.7); + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + -o-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +.annotator-editor.annotator-invert-y .annotator-controls { + border-top: none; + border-bottom: 1px solid rgb(180, 180, 180); + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -o-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.annotator-editor a, +.annotator-filter .annotator-filter-property label { + position: relative; + display: inline-block; + padding: 0 6px 0 22px; + color: rgb(54, 54, 54); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.75); + text-decoration: none; + line-height: 24px; + font-size: 12px; + font-weight: bold; + border: 1px solid rgb(162, 162, 162); + background-color: rgb(212, 212, 212); + background-image: -webkit-gradient( + linear, left top, left bottom, + from(rgb(245, 245, 245)), + color-stop(0.5, rgb(210, 210, 210)), + color-stop(0.5, rgb(190, 190, 190)), + to(rgb(210, 210, 210)) + ); + background-image: -moz-linear-gradient( + to bottom, + rgb(245, 245, 245), + rgb(210, 210, 210) 50%, + rgb(190, 190, 190) 50%, + rgb(210, 210, 210) + ); + background-image: -webkit-linear-gradient( + to bottom, + rgb(245, 245, 245), + rgb(210, 210, 210) 50%, + rgb(190, 190, 190) 50%, + rgb(210, 210, 210) + ); + background-image: linear-gradient( + to bottom, + rgb(245, 245, 245), + rgb(210, 210, 210) 50%, + rgb(190, 190, 190) 50%, + rgb(210, 210, 210) + ); + -webkit-box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + -moz-box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + -o-box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +.annotator-editor a::after { + position: absolute; + top: 50%; + left: 5px; + display: block; + content: ""; + width: 15px; + height: 15px; + margin-top: -7px; + background-position: 0 -90px; +} + +.annotator-editor a:hover, +.annotator-editor a:focus, +.annotator-editor a.annotator-focus, +.annotator-filter .annotator-filter-active label, +.annotator-filter .annotator-filter-navigation button:hover { + outline: none; + border-color: rgb(67, 90, 160); + background-color: rgb(56, 101, 249); + background-image: -webkit-gradient( + linear, left top, left bottom, + from(rgb(118, 145, 251)), + color-stop(0.5, rgb(80, 117, 251)), + color-stop(0.5, rgb(56, 101, 249)), + to(rgb(54, 101, 250)) + ); + background-image: -moz-linear-gradient( + to bottom, + rgb(118, 145, 251), + rgb(80, 117, 251) 50%, + rgb(56, 101, 249) 50%, + rgb(54, 101, 250) + ); + background-image: -webkit-linear-gradient( + to bottom, + rgb(118, 145, 251), + rgb(80, 117, 251) 50%, + rgb(56, 101, 249) 50%, + rgb(54, 101, 250) + ); + background-image: linear-gradient( + to bottom, + rgb(118, 145, 251), + rgb(80, 117, 251) 50%, + rgb(56, 101, 249) 50%, + rgb(54, 101, 250) + ); + color: rgb(255, 255, 255); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.42); +} + +.annotator-editor a:hover::after, +.annotator-editor a:focus::after { + margin-top: -8px; + background-position: 0 -105px; +} + +.annotator-editor a:active, +.annotator-filter .annotator-filter-navigation button:active { + border-color: rgb(112, 12, 73); + background-color: rgb(209, 46, 142); + background-image: -webkit-gradient( + linear, left top, left bottom, + from(rgb(252, 124, 202)), + color-stop(0.5, rgb(232, 93, 178)), + color-stop(0.5, rgb(209, 46, 142)), + to(rgb(255, 0, 156)) + ); + background-image: -moz-linear-gradient( + to bottom, + rgb(252, 124, 202), + rgb(232, 93, 178) 50%, + rgb(209, 46, 142) 50%, + rgb(255, 0, 156) + ); + background-image: -webkit-linear-gradient( + to bottom, + rgb(252, 124, 202), + rgb(232, 93, 178) 50%, + rgb(209, 46, 142) 50%, + rgb(255, 0, 156) + ); + background-image: linear-gradient( + to bottom, + rgb(252, 124, 202), + rgb(232, 93, 178) 50%, + rgb(209, 46, 142) 50%, + rgb(255, 0, 156) + ); +} + +.annotator-editor a.annotator-save::after { + background-position: 0 -120px; +} + +.annotator-editor a.annotator-save:hover::after, +.annotator-editor a.annotator-save:focus::after, +.annotator-editor a.annotator-save.annotator-focus::after { + margin-top: -8px; + background-position: 0 -135px; +} + +.annotator-editor .annotator-widget::after { + background-position: 0 -30px; +} + +.annotator-editor.annotator-invert-y .annotator-widget .annotator-controls { + background-color: #f2f2f2; +} + +.annotator-editor.annotator-invert-y .annotator-widget::after { + background-position: 0 -45px; + height: 11px; +} + +.annotator-resize { + position: absolute; + top: 0; + right: 0; + width: 12px; + height: 12px; + background-position: 2px -150px; +} + +.annotator-invert-x .annotator-resize { + right: auto; + left: 0; + background-position: 0 -195px; +} + +.annotator-invert-y .annotator-resize { + top: auto; + bottom: 0; + background-position: 2px -165px; +} + +.annotator-invert-y.annotator-invert-x .annotator-resize { + background-position: 0 -180px; +} + +/* Annotator Notification +-------------------------------------------------------------------- */ + +.annotator-notice { + color: #fff; + position: absolute; + position: fixed; + top: -54px; + left: 0; + width: 100%; + font-size: 14px; + line-height: 50px; + text-align: center; + background: black; + background: rgba(0, 0, 0, 0.9); + border-bottom: 4px solid #d4d4d4; + -webkit-transition: top 0.4s ease-out; + -moz-transition: top 0.4s ease-out; + -o-transition: top 0.4s ease-out; + transition: top 0.4s ease-out; +} + +.ie6 .annotator-notice { + position: absolute; +} + +.annotator-notice-success { + border-color: #3665f9; +} + +.annotator-notice-error { + border-color: #ff7e00; +} + +.annotator-notice p { + margin: 0; +} + +.annotator-notice a { + color: #fff; +} + +.annotator-notice-show { + top: 0; +} + +/* Annotator Tags Plugin +-------------------------------------------------------------------- */ + +.annotator-tags { + margin-bottom: -2px; +} + +.annotator-tags .annotator-tag { + display: inline-block; + padding: 0 8px; + margin-bottom: 2px; + line-height: 1.6; + font-weight: bold; + background-color: rgb(230, 230, 230); + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + -o-border-radius: 8px; + border-radius: 8px; +} + +/* Annotator Filter Plugin +-------------------------------------------------------------------- */ + +.annotator-filter { + position: fixed; + top: 0; + right: 0; + left: 0; + text-align: left; + line-height: 0; + border: none; + border-bottom: 1px solid #878787; + padding-left: 10px; + padding-right: 10px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + -o-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: + inset 0 -1px 0 rgba(255, 255, 255, 0.3); + -moz-box-shadow: + inset 0 -1px 0 rgba(255, 255, 255, 0.3); + -o-box-shadow: + inset 0 -1px 0 rgba(255, 255, 255, 0.3); + box-shadow: + inset 0 -1px 0 rgba(255, 255, 255, 0.3); +} + +.annotator-filter strong { + font-size: 12px; + font-weight: bold; + color: #3c3c3c; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7); + position: relative; + top: -9px; +} + + +.annotator-filter .annotator-filter-property, +.annotator-filter .annotator-filter-navigation { + position: relative; + display: inline-block; + overflow: hidden; + line-height: 10px; + padding: 2px 0; + margin-right: 8px; +} + +.annotator-filter .annotator-filter-property label, +.annotator-filter .annotator-filter-navigation button { + text-align: left; + display: block; + float: left; + line-height: 20px; + -webkit-border-radius: 10px 0 0 10px; + -moz-border-radius: 10px 0 0 10px; + -o-border-radius: 10px 0 0 10px; + border-radius: 10px 0 0 10px; +} + +.annotator-filter .annotator-filter-property label { + padding-left: 8px; +} + +.annotator-filter .annotator-filter-property input { + display: block; + float: right; + -webkit-appearance: none; + background-color: #fff; + border: 1px solid #878787; + border-left: none; + padding: 2px 4px; + line-height: 16px; + min-height: 16px; + font-size: 12px; + width: 150px; + color: #333; + background-color: #f8f8f8; + -webkit-border-radius: 0 10px 10px 0; + -moz-border-radius: 0 10px 10px 0; + -o-border-radius: 0 10px 10px 0; + border-radius: 0 10px 10px 0; + -webkit-box-shadow: + inset 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: + inset 0 1px 1px rgba(0, 0, 0, 0.2); + -o-box-shadow: + inset 0 1px 1px rgba(0, 0, 0, 0.2); + box-shadow: + inset 0 1px 1px rgba(0, 0, 0, 0.2); + +} + +.annotator-filter .annotator-filter-property input:focus { + outline: none; + background-color: #fff; +} + +.annotator-filter .annotator-filter-clear { + position: absolute; + right: 3px; + top: 6px; + border: none; + text-indent: -900em; + width: 15px; + height: 15px; + background-position: 0 -90px; + opacity: 0.4; +} + +.annotator-filter .annotator-filter-clear:hover, +.annotator-filter .annotator-filter-clear:focus { + opacity: 0.8; +} + +.annotator-filter .annotator-filter-clear:active { + opacity: 1; +} + +.annotator-filter .annotator-filter-navigation button { + border: 1px solid rgb(162, 162, 162); + padding: 0; + text-indent: -900px; + width: 20px; + min-height: 22px; + -webkit-box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + -moz-box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + -o-box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); + box-shadow: + inset 0 0 5px rgba(255, 255, 255, 0.2), + inset 0 0 1px rgba(255, 255, 255, 0.8); +} + +.annotator-filter .annotator-filter-navigation button, +.annotator-filter .annotator-filter-navigation button:hover, +.annotator-filter .annotator-filter-navigation button:focus { + color: transparent; +} + +.annotator-filter .annotator-filter-navigation button::after { + position: absolute; + top: 8px; + left: 8px; + content: ""; + display: block; + width: 9px; + height: 9px; + background-position: 0 -210px; +} + +.annotator-filter .annotator-filter-navigation button:hover::after { + background-position: 0 -225px; +} + +.annotator-filter .annotator-filter-navigation .annotator-filter-next { + -webkit-border-radius: 0 10px 10px 0; + -moz-border-radius: 0 10px 10px 0; + -o-border-radius: 0 10px 10px 0; + border-radius: 0 10px 10px 0; + border-left: none; +} + +.annotator-filter .annotator-filter-navigation .annotator-filter-next::after { + left: auto; + right: 7px; + background-position: 0 -240px; +} + +.annotator-filter .annotator-filter-navigation .annotator-filter-next:hover::after { + background-position: 0 -255px; +} + +.annotator-hl-active { + background: rgba(255, 255, 10, 0.8); +} + +.annotator-hl-filtered { + background-color: transparent; +} + diff --git a/common/static/css/vendor/ova/edx-annotator.css b/common/static/css/vendor/ova/edx-annotator.css new file mode 100644 index 0000000000..fd720d0842 --- /dev/null +++ b/common/static/css/vendor/ova/edx-annotator.css @@ -0,0 +1,104 @@ +/*This is written to fix some design problems with edX*/ +.annotator-wrapper .annotator-adder button { + opacity:0; +} +.annotator-editor a, .annotator-filter .annotator-filter-property label{ + line-height: 24px !important; + color: #363636 !important; + font-size: 12px!important; + font-weight: bold !important; + text-shadow: none !important; +} +.annotator-outer ul { + list-style: none !important; + padding-left: 0em !important; +} +.annotator-outer li { + margin-bottom: 0em!important; +} +.vjs-rangeslider-holder span.vjs-time-text{ + line-height: 1!important; + float: left; +} +span .annotator-hl{ + font:inherit; +} +.vjs-has-started .vjs-loading-spinner { + display: none!important; +} +/*Catch*/ +#mainCatch *{ + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +/*PublicPrivate Notes in My notes */ +.notes-wrapper .PublicPrivate.separator, +.notes-wrapper .PublicPrivate.myNotes{ + position:relative; + float:left; +} +.notes-wrapper .PublicPrivate.active *{ + color:black; +} + +/* My notes buttons */ +.notes-wrapper .buttonCatch{ + -moz-box-shadow:inset 0px 1px 0px 0px #ffffff; + -webkit-box-shadow:inset 0px 1px 0px 0px #ffffff; + box-shadow:inset 0px 1px 0px 0px #ffffff; + + background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffffff), color-stop(1, #a6a3a3)); + background:-moz-linear-gradient(top, #ffffff 5%, #a6a3a3 100%); + background:-webkit-linear-gradient(top, #ffffff 5%, #a6a3a3 100%); + background:-o-linear-gradient(top, #ffffff 5%, #a6a3a3 100%); + background:-ms-linear-gradient(top, #ffffff 5%, #a6a3a3 100%); + background:linear-gradient(to bottom, #ffffff 5%, #a6a3a3 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#a6a3a3',GradientType=0); + + background-color:#ffffff; + + -moz-border-radius:6px; + -webkit-border-radius:6px; + border-radius:6px; + + border:1px solid #c2c2c2; + + display:inline-block; + color:#302f2f; + font-family:arial; + font-size:15px; + font-weight:bold; + padding:6px 24px; + text-decoration:none; + + text-shadow:0px 1px 0px #ffffff; + margin: 0px 5px 10px 5px; + cursor:pointer; +} +.notes-wrapper .buttonCatch.active{ + color:red; +} +.notes-wrapper .buttonCatch:hover { + background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #a6a3a3), color-stop(1, #ffffff)); + background:-moz-linear-gradient(top, #a6a3a3 5%, #ffffff 100%); + background:-webkit-linear-gradient(top, #a6a3a3 5%, #ffffff 100%); + background:-o-linear-gradient(top, #a6a3a3 5%, #ffffff 100%); + background:-ms-linear-gradient(top, #a6a3a3 5%, #ffffff 100%); + background:linear-gradient(to bottom, #a6a3a3 5%, #ffffff 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#a6a3a3', endColorstr='#ffffff',GradientType=0); + + background-color:#a6a3a3; +} +.notes-wrapper .buttonCatch:active { + position:relative; + top:1px; +} + +.annotatable-content #sourceCitation { + color:#CCC; + font-style:italic; + font-size:12px; +} + diff --git a/common/static/css/vendor/ova/flagging-annotator.css b/common/static/css/vendor/ova/flagging-annotator.css new file mode 100644 index 0000000000..575822b09b --- /dev/null +++ b/common/static/css/vendor/ova/flagging-annotator.css @@ -0,0 +1,27 @@ +.flag-icon{ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAsCAMAAAAgsQpJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAytpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQ1NzExMTM2MEUwMTFFM0I2RjhDOENEOEZGRUY1MzQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQ1NzExMTI2MEUwMTFFM0I2RjhDOENEOEZGRUY1MzQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5kaWQ6YWNmNmE5ZGQtZDlkOC00YTlhLThmMjAtY2EzNGM5ODcxZDJhIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOmFjZjZhOWRkLWQ5ZDgtNGE5YS04ZjIwLWNhMzRjOTg3MWQyYSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pnen528AAAAJUExURc3Nzf///////3aZ7dEAAAADdFJOU///ANfKDUEAAACzSURBVHjarNRLFoJADETRZ+1/0cpAYuevx8w4XOjQdApZ8SpVxQ+QJYRW4hzV+3GO4rk3hFNCWMG765a7NEhbBtlBxtK86peQNbws/y+teoz/ofiWFbSTtHLTHt0TErddqfMHNxxGWzUbj8SlUIdL5trBc9Br6AKh7PHh5pXc1XM9uQiT9lJYOQc//mGXj51LgrTIPpbOBWmTuizaC/moOZr79k44uDtIJ3cmriao2ekpwADT/geMPTQb1AAAAABJRU5ErkJggg=="); + background-repeat: no-repeat; + background-size:13px 13px; + top: 2px; + left: 5px; + float: left; + border: none; + width: 13px; + height: 13px; + cursor: pointer; + position: absolute; +} + +.flag-icon-used, .flag-icon:hover{ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAsCAMAAAAgsQpJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAytpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDQ1NzExMEY2MEUwMTFFM0I2RjhDOENEOEZGRUY1MzQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDQ1NzExMEU2MEUwMTFFM0I2RjhDOENEOEZGRUY1MzQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5kaWQ6YWNmNmE5ZGQtZDlkOC00YTlhLThmMjAtY2EzNGM5ODcxZDJhIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOmFjZjZhOWRkLWQ5ZDgtNGE5YS04ZjIwLWNhMzRjOTg3MWQyYSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpBey0IAAAAVUExURQAAAAEBAQ4ODrGxscHBwfj4+P///6napTIAAAAHdFJOU////////wAaSwNGAAABW0lEQVR42oyVWQLDIAhEBwZy/yNX3EpSo+WrSV+GVcT1NVf1682Qfquq/QNSAP4BEhC8+56gAUFOSVKVC9BUg4Sm7zQnh5GwVMWhwngQTR4w9KSRUkWIZuWlZZBNr5NKxbTpHcPP/Cscfp8gHKAT2URE8iO6c7jiYK0QUNlj0vuKu6c1auZFEUdOQ/UcY3FZuqm4eOKiO0Xtug4x1qaG4l6ydsZYwS1ZueLde6+TguXs2CafY3p8TI/SyyjN0rL5szy4LEPD1lZNaRjRO7M4HtbaGkCpcp+zFRiSZS4tPpkjvgTjYATHOY2vIOTBLcFyMki32yFcgZQQ8ju3AFnLZxIl3YFtU9nPGsIv56H6s9fwKHVwkbTv9mMPrNC07SJtgcXcHxZp4wDbL1KNBOKo2XaRek/jdd8jcy/h3fcjH0OwBqsSd5dCAy247S3TwYhQd9dWjnHVjWwfAQYAR+4aJLhjvXgAAAAASUVORK5CYII="); + background-repeat: no-repeat; + background-size:13px 13px; + top: 2px; + left: 5px; + float: left; + border: none; + width: 13px; + height: 13px; + cursor: pointer; + position: absolute; +} diff --git a/common/static/css/vendor/ova/ova.css b/common/static/css/vendor/ova/ova.css new file mode 100644 index 0000000000..947dddd0cc --- /dev/null +++ b/common/static/css/vendor/ova/ova.css @@ -0,0 +1,605 @@ +/* --- BigNewAnnotation --- */ + +.vjs-default-skin .vjs-big-new-annotation{ + float: left; + cursor: pointer; + line-height: 1.6em; + margin: 3% 3% 3% 4%; + top: 41%; + width: 6em; + height: 6em; + background-color: rgba(7,40,50,.7); + border-radius: 6px; + border: 0.25em solid #ccc; +} + +.vjs-default-skin .vjs-big-new-annotation div{ + width: 100%; + height: 100%; + top: 0em; + font-weight: bold; + font-size: 600%; + padding-top: 0.32em; +} + +.vjs-default-skin.vjs-fullscreen .vjs-big-new-annotation{ + top: 68%; + width: 8em; + height: 8em; +} + +.vjs-default-skin.vjs-fullscreen .vjs-big-new-annotation div{ + font-size: 750%; + padding-top: 42%; +} + +.vjs-default-skin .vjs-big-new-annotation div:hover { + -webkit-box-shadow: 0 0 1em rgba(255, 255, 255, 1); + -moz-box-shadow: 0 0 1em rgba(255, 255, 255, 1); + box-shadow: 0 0 1em rgba(255, 255, 255, 1); +} + +div.video-js > div.vjs-big-new-annotation { + visibility:hidden; + opacity:0; + -webkit-transition: visibility 0s linear 1s,opacity 1s linear; + -moz-transition: visibility 0s linear 1s,opacity 1s linear; + -o-transition: visibility 0s linear 1s,opacity 1s linear; + transition:visibility 0s linear 1s,opacity 1s linear; +} +div.video-js:hover > div.vjs-big-new-annotation { + visibility:visible; + opacity:1; + transition-delay:0s; +} + + +.vjs-default-skin .vjs-big-new-annotation.ul{ + top:0%; +} +.vjs-default-skin .vjs-big-new-annotation.ur{ + top:0%; + float:right; +} +.vjs-default-skin .vjs-big-new-annotation.br{ + float:right; +} +.vjs-default-skin .vjs-big-new-annotation.c{ + top:24%; + left:40%; +} + +div.video-js:hover > div.vjs-big-new-annotation.none { + visibility:hidden; +} +.vjs-default-skin.vjs-fullscreen .vjs-big-new-annotation.c{ + top:35%; +} + + + +/* --- ControlBar --> AnContainerButtons --- */ + +.vjs-default-skin .vjs-container-button-annotation{ + width: 101px; +} + + + +/* --- ControlBar --> AnContainerButtons --> ShowStatistics --- */ +/* --- ControlBar --> AnContainerButtons --> NewAnnotation --- */ +/* --- ControlBar --> AnContainerButtons --> ShowAnnotations --- */ + +.vjs-default-skin .vjs-statistics-annotation, +.vjs-default-skin .vjs-showannotations-annotation, +.vjs-default-skin .vjs-new-annotation{ + float: right; + cursor: pointer; + line-height: 1.6em; + background-position: left top; + margin: 4px; + width: 23px; + height: 21px; + background-repeat: no-repeat; +} + +.vjs-default-skin .vjs-statistics-annotation.active, +.vjs-default-skin .vjs-showannotations-annotation.active, +.vjs-default-skin .vjs-statistics-annotation:hover, +.vjs-default-skin .vjs-showannotations-annotation:hover, +.vjs-default-skin .vjs-new-annotation:hover { + background-position: center top; +} + +.vjs-default-skin .vjs-statistics-annotation:active, +.vjs-default-skin .vjs-showannotations-annotation:active, +.vjs-default-skin .vjs-new-annotation:active { + background-position: center right; +} + +.vjs-default-skin .vjs-new-annotation { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEUAAAAVCAYAAAAQAyPeAAAABmJLR0QA/wDoAACU1v3rAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QgdAg4VAK182QAACfBJREFUWMOtmHtwVNUdxz/n3LubF4tAMAYEIYC8UiGOaAvYlwUqSqO042MQZgRsZ5R2pr5QW6d2FGEc6VhqLdQiDHQKRpniFBUd0JHUimSAmFB5CAQkD8mDJLvZ5733nNM/drMPgmgNZ+Y32fnt/r4553t+zyMAXlyzZuTw4cPXBwKBOVJKvukyxhCJRo81NzUteGnt2rrDhw+r6ZUvjLy8ZPj6/ILAbIEQ3xgbg5OIHmtrbV5Qv2ddXbj7iLo3f+bIsitGrx9cPGS2FPKbYQswRhMKho6dbD25YEe0vk48t2rV5ZMmT66fNXt2qVYKbQz9Wfn5eRw8cNDZu3fvjM3vRM6MLptcf911N5eG435UP6AFECgyNJ6qcQ7V750xdMcrZ26cPLP+/p/fX5rfbRD9ADcSKM5j+/tvOjvf3TnDHjx48NqpFVNL4/E4l2L19LiMnzDBf6qhYduAQNeBsVdPK+3o8YPpP3ZHl6D4iqn+gYNObbuycNiBW+fcUpp31sVg+g/f5DJ76nf9dTW122wp5cySkhLC4QiXatm2jTFmtETmFwauojPoXTJsRxVhtBkthcwvHz6BeHvwkmEHTD7CmNG2EEIkEgk8L3fjUkoGDBhwUZBIJIIQoo+twWBZFsJCxB3wVK6d8jxamo5iLhKqJcPGIBDk5RfmhpEAaUlsv18Qc9AqF9xTHseaG748DRjD2NJRCKAwvzDHx4wr8fn92Fpr4SkP13VzCKmurmbx4iU4jvOl3rBlyxaOHj3CwoUL+yRcrTVGK+EpyObMICkr/oKXn6y4KOGr/naW4cVxPqgz2P6idPgJAUZrAKGURns6s28EZ0cqrv/j0otin/lDNW6pD++jIEW+gjS2khow2EoblKdybjsQCPDggw+xdesWZs2ahTrvNgCUUixcuIj9+/cTDAZZtmxZBkOANgatFZ4CNysJRuOKJ34zgrWvO9SdFFyoZjiJbh5eOJRJY2wKC5t540MfPp8vCS0NymgMYDyV4yk65lH20E2ENxzCHO6CCxTSYCJC6bIb8I8v5kxRLfY7bfjsJLZWEgNIo5OEnC/RaJSSkhIaGxtpaWnJkcOHj/DAA8t45pmnmTJlCrW1nxAOhzP2rodWCqMVriJHHA+ktDh8WtMThWAkI6GoJBZpZ9FcwUuvtnHmrOHb1w7H7/flYBitQILyVFJUSlwPW9okjp9DhRN4PSkJJdA9Dm3RLuw7x9K0fh+6KcyI68dh+ey0vfYUCLCV1ijl5XiK53kIIXAcB611DtNaa1avfp6KigqWL1/O+vXrKSgooKOjI8dTVDJ8UAqyHa03vxidDKvsziURbuaJpYM43RLn/jsK+e1fwrieD4SVsZep8BEmeRCV2Z9JhZLWBjydrOOp1RLrZNivZxJr6mTQ4qmcfbYa2xVYIuNOyfABqbVGa51hOyUgyP5Oa000GuWxxx5n8uRyNmzYSCAwEKUUjz66HL/fn2FcJe2M0cnb9ZJkZOcXT2fplMCNtfL7B4ZyuiXObTcVY/kG0tkVY8ktISIxkWOvtQIh0J5GeyotKsW4UQrteWl9m9PFyMd/QLSxk9K55QywC4h0hnAXjEJHnSwMDyPA1lrjeW5OonVdByHAdTP61tZWqqqqmDFjOps2baaiooJVq1aybds2Dhw4gFIq/VuBSRHqEXMgloEmmsrbcTelN5ohBa0s/NlA6o4GmT9rKEc+hxUbFbNmXMb0CsnKLYZeZ/ObXlIgEewhHsy0EjrsIIBETxRCMYwxdBVrShdcy7n6M1xZOZX4kXa6V3/MoBtHM/D6Mlqfr0UUJHOK7bfBGGxtDK7j4mZVGSfhgBB4blJ/7tw5Nm3azNhx41i37q/MmTOHRx95mGB3N36fLxlqiUQGw+h0+HSGIRjOJNpQ6gzdUUNHyDAo7yxL7ynmdFOERT8p5d+fePzuFY+EK5gcNihjOBeGeMrDfL6kJwgJXZ81EwtlSFGhOKOAnlOtqOYeOodqJi27leDpNsbeeyPBD07S9PhOiCkGjMgjoDRdx5qQRf4kKT4brRVSK52Oa0FOGKY61B6eXbkKn8/H1q1bueuuu/jVL5fR3d2NEBkLIUTaXgiB0bq3dCYrBX2b2kB+mD89MgStHe6+uZi3PnJ57h/JcMpu7znP3uhk9ZEKhEr+lQpkb0rT4AyQXLPublytKLvnO3S+8SmtT72PjBuESv4GQHgZe5FyR1spBUIisgZBISUYg5CSuvpDHD9+nBMnTlBZWcn8+bfjuC7SskAI0nOYENCLISRaK7T2+hBhso47/VuSiWUBJpbBrhqPl3cIOntMshe5oE3yszYeSJBuhojeA0JSN3BmGUMmjYBJI+h++yidL+xDt0WTl6czBEgvyy51q7bWCikEMqsMSCEwxpCfl0fNvn3MmzePefPmMf7qcSQSiXRFEkJgSQutdQ6GFKCURhv1JXOxIBaL8cNpA9lTB+/thz2fSOIOyFShEUbguUGEKOwzGPZ6oKXBUn1JcaIxRs2aRHRXA+G3PiO8qwEr5mL1VjFj8BIOQghsL0OQJZP4tlIaKUUqFDId6ZgxY3i16jXuuPMObMsiFOqhpqamzyiw+73dlJeXY4xJY0gpMUZjLtD0WRLOBQ2LZkfY/m4zsbhGacWYy85rDrXh5huu4lijQApzXlugMBJsV2K7mX1rY+G1Rcj7RQX1VdWoaAKlNEwUQKasG62ZNH8C7n87sI2FSGHYyN7qoxBSkv2OEovF2LhxA3Pm/JiqqqqLvp/MnTuXFc88TSgUSmNIKdHaoE1fUooK4L7nFNtXjmDhvBEXbcdrjhiWr3UpyDv//yZ7EEsJ7Kz8Q0EerZWvMf7jxYy/73sXxY59eIb2xW/i8/voLW22FMnwiUSjEWNM2vVN6lAYw8kTx3NyzYWfCnr4oqUFy7LAJMcrIQWRaNRTTiTik31np+Z2Q/kih696urEt+hBiWx6eE/biyoloabC988pDQw+NBau/+n3GlliFNplZwCB8goSXwG5v73jl4MHaFeXl16CUyqk+JxsavtbILS0rKzwE4XCYUCj0djzSXtPTuH2Fb/BPcT2TM+kOKPj/R3spBXnqc7xE8O0uFa7ZrQ6tmCMnYFydm3WK8r8eYHY+kpKW/AiRiPsvq7a29vDIkSMnWpIJJVeU9vtN4vSpBvbsqT6+Zs2LS8821lUXBQZNLLTCE1RB+QXe0r6+WNKiILKL9pOvHz/ynz8v/TTcVF1cEJjoFDJhXHxov/e9b3ATOxIHjq9t2blUAMVA0W2VlUumTZv2VH/BT5w4sXnbtn+ujETDnYAGikZc/f0lV46/td/YXqLtaO3u1bdrSGP/6PIpS8blD3tSC21JIdDGIIxAyOSkntYhMOR+l9YhTLsb/PsbHftWGpfO/wH+lr/CdYGcQQAAAABJRU5ErkJggg=='); +} + +.vjs-default-skin .vjs-showannotations-annotation { + background-image: url('data:image/png;base64,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'); +} + +.vjs-default-skin .vjs-statistics-annotation { + background-image: url('data:image/png;base64,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'); +} + +/* --- ControlBar --> BackAnDisplay --- */ + +.vjs-default-skin .vjs-back-anpanel-annotation{ + float: left; + left: 0em; + right: 0em; + position:absolute; + background-color: rgba(0,0,0,0.3); + width: auto; + /*font-size: .3em;*/ + font-size: .9em; + -webkit-transition: top .4s,height .4s,font-size .4s,-webkit-transform .4s; + -moz-transition: top .4s,height .4s,font-size .4s,-moz-transform .4s; + -o-transition: top .4s,height .4s,font-size .4s,-o-transform .4s; + transition: top .4s,height .4s,font-size .4s,transform .4s; + opacity:1; + visibility:visible; + transition-delay:0s; + +} + + + +/* --- ControlBar --> BackAnDisplay --> RangeSelectorDisplay --- */ + +.vjs-default-skin .vjs-rangeselector-anpanel-annotation{ + height: 100%; + width: 100%; + position: absolute; + top: -1em; +} + +.vjs-default-skin .vjs-back-anpanel-annotation.statistics .vjs-rangeselector-anpanel-annotation{ + z-index:2; +} + +/* RangeSelectorLeft */ +.vjs-default-skin .vjs-leftselector-anpanel-annotation{ + height: 100%; + margin-top: 1em; + width:0%; + float:left; + position:absolute; + left: 0%; +} +.vjs-default-skin .vjs-leftselector-anpanel-annotation .vjs-selector-arrow{ + z-index:10; + border-left: 1em solid #FFE800; + cursor: e-resize; +} +.vjs-default-skin .vjs-leftselector-anpanel-annotation .vjs-leftselector-back{ + right:100%; + border-right: 1px dashed #FFE800; +} +.vjs-default-skin .vjs-leftselector-anpanel-annotation.include .vjs-leftselector-back{ + border-right: 1px dashed rgb(255, 163, 0); +} +.vjs-default-skin .vjs-leftselector-anpanel-annotation.include .vjs-selector-arrow{ + border-left: 1em solid rgb(255, 163, 0); +} + +/* RangeSelectorRight */ +.vjs-default-skin .vjs-rightselector-anpanel-annotation{ + height: 100%; + margin-top: 1em; + width:100%; + float:right; + position:absolute; +} +.vjs-default-skin .vjs-rightselector-anpanel-annotation .vjs-selector-arrow{ + z-index:20; + border-right: 1em solid #FFE800; + margin-left: -1em; + cursor: w-resize; +} +.vjs-default-skin .vjs-rightselector-anpanel-annotation .vjs-rightselector-back{ + border-left: 1px dashed #FFE800; +} +.vjs-default-skin .vjs-rightselector-anpanel-annotation.include .vjs-rightselector-back{ + border-left: 1px dashed rgb(255, 163, 0); +} +.vjs-default-skin .vjs-rightselector-anpanel-annotation.include .vjs-selector-arrow{ + border-right: 1em solid rgb(255, 163, 0); +} + +.vjs-default-skin .vjs-leftselector-back, +.vjs-default-skin .vjs-rightselector-back{ + height: 100%; + width: 100%; + position:absolute; + background-color: rgba(0,0,0,0.6); +} +.vjs-default-skin .vjs-selector-arrow{ + width: 0; + height: 0; + border-top: 1em solid transparent; + border-bottom: 1em solid transparent; + opacity: 0.8; + position: absolute; + top: -2em; +} + +/* RangeSelectorBar */ +.vjs-default-skin .vjs-barselector-anpanel-annotation{ + height: 2em; + margin-top: -1em; + background-color: rgba(0,0,0,0.6); + border: 1px solid rgba(255,255,255,0.6); + position: absolute; + float: left; + visibility:visible; + transition-delay:0s; +} +.vjs-default-skin .vjs-barselector-anpanel-annotation.disable{ + visibility:hidden; + opacity:0; + -webkit-transition: visibility 0.5s linear 0.5s,opacity 0.5s linear; + -moz-transition: visibility 0.5s linear 0.5s,opacity 0.5s linear; + -o-transition: visibility 0.5s linear 0.5s,opacity 0.5s linear; + transition:visibility 0.5s linear 0.5s,opacity 0.5s linear; +} +.vjs-default-skin .vjs-barselector-anpanel-annotation .vjs-barselector-left{ + float: left; + left: 1em; +} +.vjs-default-skin .vjs-barselector-anpanel-annotation .vjs-barselector-right{ + right: 1em; + float: right; +} +.vjs-default-skin .vjs-barselector-anpanel-annotation .vjs-barselector-right, +.vjs-default-skin .vjs-barselector-anpanel-annotation .vjs-barselector-left{ + height: 2em; + font-size: 1.3em; + position: absolute; +} +.vjs-default-skin .vjs-rangeselector-anpanel-annotation.active .vjs-barselector-anpanel-annotation{ + z-index: 1; +} + +/* --- ControlBar --> BackAnDisplay --> AnDisplay --- */ + +.vjs-default-skin .vjs-anpanel-annotation{ + float: left; + width: 100%; + height: 100%; + left: 0em; + right: 0em; + position:absolute; + /*background-color: #FFE800; + background: #FFE800; + background: -moz-linear-gradient(top, #FFE800, #A69700); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFE800), to(#A69700)); + background: -webkit-linear-gradient(top, #FFE800, #A69700); + background: -o-linear-gradient(top, #FFE800, #A69700); + background: -ms-linear-gradient(top, #FFE800, #A69700); + background: linear-gradient(top, #FFE800, #A69700);*/ + opacity: 0.8; + overflow: hidden; +} + + +.vjs-default-skin .vjs-anpanel-annotation .annotation{ + height: 1em; + float: left; + width: 100%; + left: 0em; + right: 0em; + cursor:pointer; + position:absolute; + background-color: #FFE800; + background: #FFE800; + background: -moz-linear-gradient(top, #FFE800, #A69700); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFE800), to(#A69700)); + background: -webkit-linear-gradient(top, #FFE800, #A69700); + background: -o-linear-gradient(top, #FFE800, #A69700); + background: -ms-linear-gradient(top, #FFE800, #A69700); + background: linear-gradient(top, #FFE800, #A69700); + opacity: 0.8; +} + +.vjs-default-skin .vjs-anpanel-annotation .annotation.active { + background-color: #2DCF02; + background: #2DCF02; + background: -moz-linear-gradient(top, #2DCF02, #114F01); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#2DCF02), to(#114F01)); + background: -webkit-linear-gradient(top, #2DCF02, #114F01); + background: -o-linear-gradient(top, #2DCF02, #114F01); + background: -ms-linear-gradient(top, #2DCF02, #114F01); + background: linear-gradient(top, #2DCF02, #114F01); + z-index: 1; +} + +.vjs-default-skin .vjs-anpanel-annotation .annotation.point { + border-radius: 50%; + width: 1em; + height: 1em; + margin-left: -0.4em; +} + +.vjs-default-skin .vjs-back-anpanel-annotation.statistics .vjs-anpanel-annotation{ + visibility:hidden; +} + + + +/* --- ControlBar --> BackAnDisplay --> AnStat --- */ +.vjs-default-skin .vjs-anstat-annotation{ + float: left; + width: 100%; + height: 100%; + left: 0em; + right: 0em; + position: absolute; + opacity: 0.8; + visibility:visible; + transition-delay:0s; + font-size: 1.2em; +} + +.vjs-default-skin .vjs-anstat-annotation.disable{ + visibility:hidden; + opacity:0; +} + +.vjs-default-skin .vjs-totan-anstat-annotation, +.vjs-default-skin .vjs-maxcon-anstat-annotation{ + position: absolute; + top: 0.3em; + background-color: rgba(0,0,0,0.5); + border-radius: 0.5em; + padding: 0.1em; + color: rgb(255, 163, 0); +} +.vjs-default-skin .vjs-totan-anstat-annotation{ + float: right; + right:1em; +} +.vjs-default-skin .vjs-maxcon-anstat-annotation{ + float: left; + left:1em; +} + + + +/* --- ControlBar --> BackAnDisplay --> --- */ + +.vjs-default-skin .dashed-line{ + float: left; + right: 0em; + position:absolute; + color: #2DCF02; + border-left:0.23em dashed #2DCF02; + border-right:0.23em dashed #2DCF02; + opacity: 0.8; +} +.vjs-default-skin .dashed-line.point{ + border-right:0; +} + +.vjs-default-skin .box-dashed-line{ + height: 1em; + float: left; + right: 0em; + color: #2DCF02; + position:absolute; + background-color:#2DCF02; + opacity: 0.8; +} +.vjs-default-skin .boxup-dashed-line{ + height: 1em; + float: left; + right: 0em; + color: #2DCF02; + position:absolute; + opacity: 0.8; + background-color: #2DCF02; + background: #2DCF02; + background: -moz-linear-gradient(top, #2DCF02, #114F01); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#2DCF02), to(#114F01)); + background: -webkit-linear-gradient(top, #2DCF02, #114F01); + background: -o-linear-gradient(top, #2DCF02, #114F01); + background: -ms-linear-gradient(top, #2DCF02, #114F01); + background: linear-gradient(top, #2DCF02, #114F01); + z-index: 4; + -webkit-transition: top 1s,-webkit-transform .4s; + -moz-transition: top 1s,-moz-transform .4s; + -o-transition: top 1s,-o-transform .4s; + transition: top 1s,transform .4s; +} + +.vjs-default-skin .boxup-dashed-line.point{ + border-radius: 50%; + width: 1em; + height: 1em; + margin-left: -0.4em; +} + + + +/* --- ControlBar --> BackAnDisplay --> BackAnDisplayScroll --- */ + +.vjs-default-skin .vjs-down-scroll-annotation, +.vjs-default-skin .vjs-up-scroll-annotation{ + width:2em; + height:2em; + float: left; + right: 0em; + position:absolute; + cursor: pointer; + border-left: 1em solid transparent; + border-right: 1em solid transparent; + /*font-size: .3em;*/ + font-size: .9em; + -webkit-transition: top .4s,height .4s,font-size .4s,-webkit-transform .4s; + -moz-transition: top .4s,height .4s,font-size .4s,-moz-transform .4s; + -o-transition: top .4s,height .4s,font-size .4s,-o-transform .4s; + transition: top .4s,height .4s,font-size .4s,transform .4s; + opacity: 0.8; + transition-delay:0s; +} + +.vjs-default-skin .vjs-up-scroll-annotation{ + border-bottom: 1em solid black; +} + +.vjs-default-skin .vjs-down-scroll-annotation{ + top: -3em; + border-top: 1em solid black; +} +.vjs-default-skin .vjs-scroll-anpanel-annotation.disable, +.vjs-default-skin .vjs-back-anpanel-annotation.disable{ + visibility:hidden; + opacity:0; + /*-webkit-transition: visibility 1s linear 1s,opacity 1s linear; + -moz-transition: visibility 1s linear 1s,opacity 1s linear; + -o-transition: visibility 1s linear 1s,opacity 1s linear; + transition:visibility 1s linear 1s,opacity 1s linear;*/ +} + +.vjs-default-skin:hover .vjs-back-anpanel-annotation, +.vjs-default-skin:hover .vjs-down-scroll-annotation, +.vjs-default-skin:hover .vjs-up-scroll-annotation { + font-size: .9em; + -webkit-transition: top .2s,height .2s,font-size .2s,-webkit-transform .2s; + -moz-transition: top .2s,height .2s,font-size .2s,-moz-transform .2s; + -o-transition: top .2s,height .2s,font-size .2s,-o-transform .2s; + transition: top .2s,height .2s,font-size .2s,transform .2s; +} + + + +/* --- ControlBar --> BackAnDisplay --> BackAnDisplayScroll--> BackAnDisplayScrollBar --- */ + +.vjs-default-skin .vjs-scrollbar-anpanel-annotation{ + float: left; + position: absolute; + cursor: pointer; + right: 0.5em; + width: 1em; + /*font-size: .3em;*/ + font-size: .9em; + background-color: black; + opacity: 0.8; + visibility:visible; + transition-delay:0s; + -webkit-transition: top .4s,height .4s,font-size .4s,-webkit-transform .4s; + -moz-transition: top .4s,height .4s,font-size .4s,-moz-transform .4s; + -o-transition: top .4s,height .4s,font-size .4s,-o-transform .4s; + transition: top .4s,height .4s,font-size .4s,transform .4s; +} + +.vjs-default-skin .vjs-scrollbar-anpanel-annotation.disable{ + visibility:hidden; + opacity:0; + -webkit-transition: visibility 1s linear 1s,opacity 1s linear; + -moz-transition: visibility 1s linear 1s,opacity 1s linear; + -o-transition: visibility 1s linear 1s,opacity 1s linear; + transition:visibility 1s linear 1s,opacity 1s linear; +} +.vjs-default-skin .vjs-scrollbar-anpanel-annotation:hover{ + opacity: 0.8; + visibility:visible; + transition-delay:0s; +} + +.vjs-default-skin:hover .vjs-scrollbar-anpanel-annotation{ + font-size: .9em; +} + +.vjs-default-skin .vjs-scrollbar-selector{ + width: 1em; + background-color: gray; + border: 1px solid black; + position:absolute; + height: 3em; + border-radius: 0.4em; +} + + + +/* --- ControlBar --> BackAnDisplay --> BackAnDisplayScroll--> BackAnDisplayScrollTime --- */ +.vjs-default-skin .vjs-down-scrolltime-annotation, +.vjs-default-skin .vjs-up-scrolltime-annotation{ + width: 100%; + height:1em; + float: left; + position:absolute; + font-size: .9em; + opacity: 0.8; + transition-delay:0s; + right: 3em; + text-align: right; + margin-top:0.2em; +} + +.vjs-default-skin .vjs-down-scrolltime-annotation{ + top: -2.6em; + margin-top: -0.2em; +} + +.vjs-default-skin .vjs-scrolltime-anpanel-annotation span{ + font-size: 1.3em; + background-color: rgba(0,0,0,1); + border-radius: 0.5em; + padding: 0.1em; + border: 0.1em solid white; + padding-left: 0.4em; + padding-right: 0.4em; +} + + + +/* ---------------- Modify the CSS of Annotator plugin ---------------- */ +.annotator-wrapper.vjs-fullscreen .annotator-adder, +.annotator-wrapper.vjs-fullscreen .annotator-outer, +.annotator-wrapper.vjs-fullscreen .annotator-widget, +.annotator-wrapper.vjs-fullscreen .annotator-notice { + z-index:3000000000; /*To fix full-screen*/ +} + + + +/* ---------------- Modify the CSS of Video-js plugin ---------------- */ + +.vjs-default-skin *, .vjs-default-skin *:before, .vjs-default-skin *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + + + +/* ---------------- Modify the CSS of Range Slider plugin ---------------- */ + +/* Selection bar in green color */ +.vjs-default-skin .vjs-rangeslider-holder.locked span.annotator-hl > div.vjs-selectionbar-RS { + background-color: #2DCF02; + background: #2DCF02; + background: -moz-linear-gradient(top, #2DCF02, #114F01); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#2DCF02), to(#114F01)); + background: -webkit-linear-gradient(top, #2DCF02, #114F01); + background: -o-linear-gradient(top, #2DCF02, #114F01); + background: -ms-linear-gradient(top, #2DCF02, #114F01); + background: linear-gradient(top, #2DCF02, #114F01); +} + +.vjs-default-skin div.vjs-rangeslider-holder.locked .vjs-rangeslider-handle > div.vjs-selectionbar-line-RS { + background-color: #2DCF02; +} + +.vjs-default-skin div.vjs-rangeslider-holder.locked .vjs-rangeslider-handle > div.vjs-selectionbar-arrow-RS { + border-top-color: #2DCF02; +} + diff --git a/common/static/css/vendor/ova/rangeslider.css b/common/static/css/vendor/ova/rangeslider.css new file mode 100644 index 0000000000..9dd96bb0e2 --- /dev/null +++ b/common/static/css/vendor/ova/rangeslider.css @@ -0,0 +1,186 @@ +/*Range Slider Bar Time*/ +.vjs-default-skin .vjs-timebar-RS{ + color: red; + top: -1em; + height: 100%; + position: relative; + background: rgba(100,100,100,.5);/*Quitar*/ +} + + + +/*Selection Range Slider Bar Selected*/ +.vjs-default-skin .vjs-rangeslider-holder{height: 100%;} + +.vjs-default-skin .vjs-selectionbar-RS{ + height: 100%; + float: left; + width: 100%; + left: 0em; + right: 0em; + position:absolute; + background-color: #FFE800; + background: #FFE800; + background: -moz-linear-gradient(top, #FFE800, #A69700); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFE800), to(#A69700)); + background: -webkit-linear-gradient(top, #FFE800, #A69700); + background: -o-linear-gradient(top, #FFE800, #A69700); + background: -ms-linear-gradient(top, #FFE800, #A69700); + background: linear-gradient(top, #FFE800, #A69700); + opacity: 0.8; +} + +.vjs-default-skin div.vjs-rangeslider-holder.locked > div.vjs-selectionbar-RS { + background-color: #FF6565; + background: #FF6565; + background: -moz-linear-gradient(top, #FF6565, #300000); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FF6565), to(#300000)); + background: -webkit-linear-gradient(top, #FF6565, #300000); + background: -o-linear-gradient(top, #FF6565, #300000); + background: -ms-linear-gradient(top, #FF6565, #300000); + background: linear-gradient(top, #FF6565, #300000); +} + + +/*Arrow and Handle*/ +.vjs-default-skin div.vjs-rangeslider-handle { + position: absolute; + margin-top: 0; + cursor: pointer !important; + background-color: transparent; +} + +.vjs-default-skin .vjs-selectionbar-left-RS{height: 100%;left: 0;z-index:10} +.vjs-default-skin .vjs-selectionbar-right-RS{height: 100%;left: 100%;z-index:20} + +.vjs-default-skin div.vjs-selectionbar-left-RS, +.vjs-default-skin div.vjs-selectionbar-right-RS { + top: 0em; + position: absolute; + width:0em; +} + +.vjs-default-skin div.vjs-selectionbar-arrow-RS { + width: 0; + height: 0; + border-left: 1em solid transparent; + border-right: 1em solid transparent; + border-top: 1em solid #FFF273; + margin-left: -1em; + opacity: 0.8; + + position: absolute; + top: -1em; +} +.vjs-default-skin div.vjs-rangeslider-handle.active > div.vjs-selectionbar-arrow-RS { + border-top-color: #5F5FB3; +} + +.vjs-default-skin div.vjs-rangeslider-holder.locked .vjs-rangeslider-handle > div.vjs-selectionbar-arrow-RS { + border-top-color: #FF6565; +} + +.vjs-default-skin div.vjs-selectionbar-line-RS { + width: 1px; + height: 1em; + background-color: #FFF273; + + position:absolute; + top: 0em; +} +.vjs-default-skin div.vjs-rangeslider-handle.active > div.vjs-selectionbar-line-RS { + background-color: #5F5FB3; +} + +.vjs-default-skin div.vjs-rangeslider-holder.locked .vjs-rangeslider-handle > div.vjs-selectionbar-line-RS { + background-color: #FF6565; +} + + +/* Time Panel */ +.vjs-default-skin .vjs-timepanel-RS{ + width: 100%; + height: 1em; + font-weight: bold; + font-size: 15px; + top: -2em; + position: absolute; + visibility:visible; + opacity:1; + transition-delay:0s; +} +.vjs-default-skin .vjs-timepanel-RS.disable{ + visibility:hidden; + opacity:0; + -webkit-transition: visibility 1s linear 1s,opacity 1s linear; + -moz-transition: visibility 1s linear 1s,opacity 1s linear; + -o-transition: visibility 1s linear 1s,opacity 1s linear; + transition:visibility 1s linear 1s,opacity 1s linear; +} + +.vjs-default-skin .vjs-timepanel-left-RS, +.vjs-default-skin .vjs-timepanel-right-RS{ + font-weight: normal; + font-size: 1em; + color: #666666; + border: 1px solid #666666; + background-color: white; + border-radius: 5px; + position: absolute; + height:116%; + padding-right: 0.3em; + padding-left: 0.3em; +} +.vjs-default-skin .vjs-timepanel-left-RS{ + left:0.5% +} +.vjs-default-skin .vjs-timepanel-right-RS{ + left:92% +} + + + + +/* Control Time Panel */ +.vjs-default-skin .vjs-controltimepanel-RS{ + width: 18em; + font-size: 1em; + line-height: 3em; +} + +.vjs-default-skin .vjs-controltimepanel-RS input{ + width: 1.5em; + background: rgba(102, 168, 204, 0.16); + border: 1px solid transparent; + color: black; + font-size: 1em; + margin-left: 2px; + text-align: center; + color: white; +} + +.vjs-default-skin .vjs-controltimepanel-left-RS{ + width: 50%; + float: left; +} +.vjs-default-skin .vjs-controltimepanel-right-RS{ + float:right; + width: 48%; +} +.vjs-default-skin .vjs-controltimepanel-RS input{ + margin: 0; + padding: 0; + display: table-cell; +} + + +/* ---------------- Video-js plugin ---------------- */ + +.vjs-default-skin *, .vjs-default-skin *:before, .vjs-default-skin *:after { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; +} + diff --git a/common/static/css/vendor/ova/richText-annotator.css b/common/static/css/vendor/ova/richText-annotator.css new file mode 100644 index 0000000000..b03e0eec01 --- /dev/null +++ b/common/static/css/vendor/ova/richText-annotator.css @@ -0,0 +1,33 @@ +.annotator-viewer div:first-of-type.richText-annotation *, +.annotator-viewer div:first-of-type.richText-annotation{ + font-style: normal; + font-weight: inherit; + text-align: inherit; +} +.annotator-viewer div:first-of-type.richText-annotation{ + padding-top: 22px; +} + +/* Fix in the tinymce */ +.annotator-viewer div:first-of-type.richText-annotation strong{ + font-weight: bold; +} +.annotator-viewer div:first-of-type.richText-annotation em{ + font-style: italic; +} + +.mce-container { + z-index:3000000000!important; /*To fix full-screen problems*/ +} + + +/* Some change in the design of Annotator */ +.annotator-editor .annotator-widget{ + min-width: 400px; +} + +/*Rubric icon*/ +.mce-ico.mce-i-rubric{ + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QkBBB07nraNoQAAAhZJREFUKM+NkstrE1EUxr+5c08ykztpJtVoazHBF8FgQQzonyBKEZS6FrQKLl0EXBRT0ZULJSs3oii4TyHgu90IlTaL6qouWlv7Ck1N0BSnmZk714WbPHz07M4534+Pw3eAHdTY8A9+Nd9/bshU1DpnO4HXjh2ZY2J9/OSTxHTrnP8PvJYf+BDQ6qEDaQBB43jrTusUFy4oPjsYWYzF+VS91nxLYfdhKgONaQT3W/KMxr1XY5e+qj86f8zsKYYsZ6AvjWFzA8ORHkAnwN8So7evzL/8pzMAXL/Hq8mMv1up371T7Z+/c3n9cKeuDS6Xy6dN07zLuZ56Onk2Ed2/ANJsnE/PQMpgyffle+kYzwazB1+3waVS6X48Hr9BRPB9H57nYXplFKeSt8D1Hriug9XKF0x+Lmw+ys8m2m42DOOn4zhQSsGyLOi6jqONm9isbmFVFlDbaGKx8QaB1rvdlbNhGLAsC0IIGIYBIQSy2ROQ0oOp7wOPraHXEugRvDtnzjmi0SiICEIIEBGklAB9B6cmbG0AUnrY5m73h+m6DsYYTNMEYwxEBMY0hGNVhHkcZigBO9qHlDHS7cwYg23bAIBQKAQigud7IH0XwtxDoHwEIQ9SLKx0wa7rPiaivYyxESklXNeFBg0mjyNQTQSuATMSm6ipuYt//eVcLhdeXl5+UKlUlur1upqamVAv3j3/VCyOD3VqfwF6uLp3q+vMcgAAAABJRU5ErkJggg=='); + background-repeat: no-repeat; +} diff --git a/common/static/css/vendor/ova/share-annotator.css b/common/static/css/vendor/ova/share-annotator.css new file mode 100644 index 0000000000..d0968677a1 --- /dev/null +++ b/common/static/css/vendor/ova/share-annotator.css @@ -0,0 +1,203 @@ +/* Editor */ +.share-container-annotator{ + display: block; + min-width: 100%; + border: none; + margin: 0; + color: rgb(60, 60, 60); + background: none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + resize: none; + padding-left: 0.6em; + padding-right: 1em; + height: 3.1em; +} + +.share-container-annotator .share-text-annotator{ + float:left; + padding-top: 1em; +} + +.annotator-editor .share-container-annotator .share-text-annotator{ + height: 2.1em; +} + +.share-container-annotator .share-button{ + top: 0.3em; + outline: 0; + float:left; + position: relative; + text-align: center; + margin: 0; + padding: 0; + margin-left:0.3em; + height: 2.5em; + width: 2.5em; + background-repeat: no-repeat; + background-size: 2.5em; +} + +.share-container-annotator .share-button:hover{ + opacity: .6; + cursor: pointer; +} + +/* Popup */ + +.share-container-annotator .share-popup-overlay-bg{ + display: none; + position: fixed; + top: 0; + left: 0; + height:100%; + width: 100%; + cursor: pointer; + background: #000; /* fallback */ + background: rgba(0,0,0,0.75); + padding: 0; +} +.share-container-annotator .share-popup-overlay-bg .share-popup{ + background: #fff; + padding: 1% !important; + width: 30%; + position: relative; + top: 15%; + left: 50%; + margin: 0 0 0 -17% !important; /* add negative left margin for half the width to center the div */ + cursor: default; + border-radius: 4px; + box-shadow: 0 0 5px rgba(0,0,0,0.9); +} +.share-container-annotator .share-popup-overlay-bg .share-popup-copy, +.share-container-annotator .share-popup-overlay-bg .share-popup-title{ + font-style: normal; + font-weight: bold; + font-size: 21px; + padding-top: 0px; + padding-bottom: 20px; + color: #222; +} +.share-container-annotator .share-popup-overlay-bg .share-popup-uri{ + width:100%; + border: 1px solid rgb(144, 144, 144); + height: 24px; + margin-bottom: 10px; +} +.share-container-annotator .share-popup-overlay-bg .share-popup-copy{ + font-size: 15px; + float: left; + width: 100%; + padding:0; + margin: 1.0em 0em 0.5em 0em !important; +} +.share-container-annotator .share-popup-overlay-bg .share-popup .share-button{ + width: 50%; + padding: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -o-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid; + margin: 0; + text-align: center; + alignment-baseline: central; + background-position: 0.5em; + height: 4em; + padding-top: 1.3em !important; +} +/* Close button */ +.share-container-annotator .share-popup-overlay-bg .close-btn { + cursor: pointer; + position: relative; + display: inline-block; + padding: 0 12px 0 12px; + color: rgb(54, 54, 54); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.75); + text-decoration: none; + line-height: 24px; + font-size: 12px; + font-weight: bold; + border: 1px solid rgb(162, 162, 162); + background-color: rgb(212, 212, 212); + background-image: -webkit-gradient( linear, left top, left bottom, from(rgb(245, 245, 245)), color-stop(0.5, rgb(210, 210, 210)), color-stop(0.5, rgb(190, 190, 190)), to(rgb(210, 210, 210)) ); + background-image: -moz-linear-gradient( to bottom, rgb(245, 245, 245), rgb(210, 210, 210) 50%, rgb(190, 190, 190) 50%, rgb(210, 210, 210) ); + background-image: -webkit-linear-gradient( to bottom, rgb(245, 245, 245), rgb(210, 210, 210) 50%, rgb(190, 190, 190) 50%, rgb(210, 210, 210) ); + background-image: linear-gradient( to bottom, rgb(245, 245, 245), rgb(210, 210, 210) 50%, rgb(190, 190, 190) 50%, rgb(210, 210, 210) ); + -webkit-box-shadow: inset 0 0 5px rgba(255, 255, 255, 0.2), inset 0 0 1px rgba(255, 255, 255, 0.8); + -moz-box-shadow: inset 0 0 5px rgba(255, 255, 255, 0.2), inset 0 0 1px rgba(255, 255, 255, 0.8); + -o-box-shadow: inset 0 0 5px rgba(255, 255, 255, 0.2), inset 0 0 1px rgba(255, 255, 255, 0.8); + box-shadow: inset 0 0 5px rgba(255, 255, 255, 0.2), inset 0 0 1px rgba(255, 255, 255, 0.8); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +.share-container-annotator .share-popup-overlay-bg .close-btn:hover { + outline: none; + border-color: rgb(67, 90, 160); + background-color: rgb(56, 101, 249); + background-image: -webkit-gradient( linear, left top, left bottom, from(rgb(118, 145, 251)), color-stop(0.5, rgb(80, 117, 251)), color-stop(0.5, rgb(56, 101, 249)), to(rgb(54, 101, 250)) ); + background-image: -moz-linear-gradient( to bottom, rgb(118, 145, 251), rgb(80, 117, 251) 50%, rgb(56, 101, 249) 50%, rgb(54, 101, 250) ); + background-image: -webkit-linear-gradient( to bottom, rgb(118, 145, 251), rgb(80, 117, 251) 50%, rgb(56, 101, 249) 50%, rgb(54, 101, 250) ); + background-image: linear-gradient( to bottom, rgb(118, 145, 251), rgb(80, 117, 251) 50%, rgb(56, 101, 249) 50%, rgb(54, 101, 250) ); + color: rgb(255, 255, 255); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.42); +} + +.share-container-annotator .share-popup-overlay-bg .close-btn:active { + border-color: rgb(112, 12, 73); + background-color: rgb(209, 46, 142); + background-image: -webkit-gradient( linear, left top, left bottom, from(rgb(252, 124, 202)), color-stop(0.5, rgb(232, 93, 178)), color-stop(0.5, rgb(209, 46, 142)), to(rgb(255, 0, 156)) ); + background-image: -moz-linear-gradient( to bottom, rgb(252, 124, 202), rgb(232, 93, 178) 50%, rgb(209, 46, 142) 50%, rgb(255, 0, 156) ); + background-image: -webkit-linear-gradient( to bottom, rgb(252, 124, 202), rgb(232, 93, 178) 50%, rgb(209, 46, 142) 50%, rgb(255, 0, 156) ); + background-image: linear-gradient( to bottom, rgb(252, 124, 202), rgb(232, 93, 178) 50%, rgb(209, 46, 142) 50%, rgb(255, 0, 156) ); +} + + + +/* Viewer */ +.annotator-viewer .share-viewer-annotator div.share-text-annotator, +.annotator-viewer .share-viewer-annotator div.share-button{ + border-top: 0; + padding: 0; + background-size: 2em; + margin-top: -0.2em; + top: -0.5em; + font-style: normal; +} + + + +/* Buttons */ +.share-container-annotator .share-facebook-annotator { + background-image: url('data:image/png;base64,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'); +} + + +.share-container-annotator .share-twitter-annotator { + background-image: url('data:image/png;base64,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'); +} + + +.share-container-annotator .share-google-annotator { + background-image: url('data:image/png;base64,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'); +} + + +.share-container-annotator .share-email-annotator { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABIUExURf///7KysrKyss/Pz9DQ0NHR0dLS0u7u7vDw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///37mbPQAAAACdFJOUwCWb//7SQAAAQNJREFUSMft1M2SgyAQRtHkC0RtbP6V93/TWZikFDuQ2c7krrCKU1gKXC7f/lNX9LvuAVB6AUdw78y/V2CEXltpjEcwmabQMNMR0GwbQsPOVAF2AXqR0wiOK2DYh/RGaKTg2VTA+pgXUWgsOXorghUq1ymsDVBOQqE0QYFK+xRKBxyFQumCvVAoH4ACFbe2+f0VnkKhfLICnmsoPJ46X2l7q1u4PUYdgNdxeY2aQDp4b/40+5AyxM2NLGw+YhcisrhbM+J5e9NsPWLKUinCnw7QZBg+hCgVggfXR3QksHVezlkGVZfAADIzs5Ving1hqO6lYZyIjBzRNA7He+nXV+W3v98P7gg+L5LCf08AAAAASUVORK5CYII='); +} + +.share-container-annotator .share-button-annotator { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAvCAMAAABE+WOeAAAAA3NCSVQICAjb4U/gAAAATlBMVEXMzMzZ2dn////r6+vPz8/n5+f5+fnl5eXT09P19fXz8/Pg4ODX19f7+/vR0dHp6enu7u7d3d339/fj4+PV1dX////b29vt7e3h4eHx8fHJkyUPAAAAGnRSTlP//wD//////////////////////////////zDtagYAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAedEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzUuMasfSOsAAAAVdEVYdENyZWF0aW9uIFRpbWUAOC8xNi8xM7KZeroAAAFnSURBVEiJrZaNbsMgDIS9jpCQ0dBoVaW9/4vOQHD4OVIh9aRKLf0UG9scoduYqF7Qs1UUpeys3/Buo1Kbu+BnQpo7/KogznmtiMcPr0MIv1/gRHvNLy0zcXH0dPxYSh483cR/TBmBerlPKYMUYT75FWQsndJpZRUeFTIr4SGVeFjJlg8ZUb5wnU94Bn8cwr/u9X5ZLvD1iHn9SjYmW908r1t6+eM0bNGvlCSB3e4MfqOovGO62XqRO6U702SZl+LH+E9uiwHTFKSYT9+NbNH1DgJXVHiZl/urS+c86s8VD/r/UX40H9mvgZ06+VQ8qWfXV2L9pb+xX767TcuTLJifn/44hPlp9mdNMfS5NJz/p/HzCcZ5652vBzwux/kCDVKnYeYRLvxBjm+2veQPyH/AeIj/IH8D/OlvIKN2nDL/BP7c2G3hz8D/Kzuv/B9FyPvV3C/D99fw/dgN0bt/vcbud6+x94e3+gd13Qxqz2VnfwAAAABJRU5ErkJggg=='); +} + + +/* Api */ +.annotator-wrapper .annotator-hl.api { + background:rgba(0, 190, 99, 0.3); +} diff --git a/common/static/css/vendor/ova/tags-annotator.css b/common/static/css/vendor/ova/tags-annotator.css new file mode 100644 index 0000000000..e1e5828628 --- /dev/null +++ b/common/static/css/vendor/ova/tags-annotator.css @@ -0,0 +1,97 @@ +/* Editor */ +li.token-input-token { + overflow: hidden; + height: auto !important; + margin: 3px; + padding: 1px 3px; + background-color: #eff2f7; + color: #000; + cursor: default; + border: 1px solid #ccd5e4; + font-size: 11px; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + display: inline; + white-space: nowrap; +} + +li.token-input-token p { + display: inline; + padding: 0; + margin: 0; +} + +li.token-input-token span { + color: #a6b3cf; + margin-left: 5px; + font-weight: bold; + cursor: pointer; +} + +li.token-input-selected-token { + background-color: #5670a6; + border: 1px solid #3b5998; + color: #fff; +} + +li.token-input-input-token { + margin: 0; + padding: 0; + list-style-type: none; +} + +div.token-input-dropdown { + position: absolute; + width: 120px; + background-color: #fff; + overflow: hidden; + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + cursor: default; + font-size: 11px; + font-family: Verdana; + z-index: 1000000000; +} + +div.token-input-dropdown p { + margin: 0; + padding: 5px; + font-weight: bold; + color: #777; +} + +div.token-input-dropdown ul { + margin: 0; + padding: 0; +} + +div.token-input-dropdown ul li { + background-color: #fff; + padding: 3px; + margin: 0; + list-style-type: none; +} + +div.token-input-dropdown ul li.token-input-dropdown-item { + background-color: #fff; +} + +div.token-input-dropdown ul li.token-input-dropdown-item2 { + background-color: #fff; +} + +div.token-input-dropdown ul li em { + font-weight: bold; + font-style: normal; +} + +div.token-input-dropdown ul li.token-input-selected-dropdown-item { + background-color: #3b5998; + color: #fff; +} + +.token-input-list{ + padding:0px; +} \ No newline at end of file diff --git a/common/static/css/vendor/ova/video-js.font.dev.svg b/common/static/css/vendor/ova/video-js.font.dev.svg new file mode 100644 index 0000000000..496cf6d102 --- /dev/null +++ b/common/static/css/vendor/ova/video-js.font.dev.svg @@ -0,0 +1,65 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common/static/css/vendor/ova/video-js.fw.png b/common/static/css/vendor/ova/video-js.fw.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7f208c21813246bdd708fcd21db2863febe03b GIT binary patch literal 78899 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 literal 0 HcmV?d00001 diff --git a/common/static/css/vendor/ova/video-js.less b/common/static/css/vendor/ova/video-js.less new file mode 100644 index 0000000000..e5d1da1120 --- /dev/null +++ b/common/static/css/vendor/ova/video-js.less @@ -0,0 +1,949 @@ +/*! +Video.js Default Styles (http://videojs.com) +Version GENERATED_AT_BUILD +Create your own skin at http://designer.videojs.com +*/ + +// To customize the player skin, change the values of the variables or edit the +// CSS below. +// (This file uses LESS. Learn more at http://lesscss.org/) + +// The base font size controls the size of everything, not just text. All +// diminensions use em-based sizes so that the scale along with the font size. +// Try increasing it to 20px and see what happens. +@base-font-size: 10px; +@touch-device-font-size: 15px; + +// The main font color controls the color of the text and the icons (font icons) +@main-font-color: #CCCCCC; // e.g. rgb(255, 255, 255) or #ffffff + +// The default color of control backgrounds is mostly black but with a little +// bit of blue so it can still be seen on all black video frames, which are +// common. +@control-bg-color: #07141E; // e.g. rgb(255, 255, 255) or #ffffff +@control-bg-alpha: 0.7; // 1.0 = 100% opacity, 0.0 = 0% opacity + +// The slider bar color is used for the progress bar and the volume bar +@slider-bar-color: #66A8CC; // e.g. rgb(255, 255, 255) or #ffffff +// The background of the progress bar and volume bar have a lined pattern that +// is created from a base64 encoded image. You can generate your own pattern at +// http://www.patternify.com/ then replace the value in the quotes with your own +@slider-bar-pattern: ~'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC'; +// The color of the slider background +@slider-background-color: #333333; +@slider-background-alpha: 0.9; // 1.0 = 100% opacity, 0.0 = 0% opacity + +// The "Big Play Button" is the play button that shows before the video plays. +// To center it set the align values to center and middle. The typical location +// of the button is the center, but there is trend towards moving it to a corner +// where it gets out of the way of valuable content in the poster image. +@big-play-align: left; // left, center, or right +@big-play-vertical-align: top; // top, middle, or bottom +// The button colors match the control colors by default but you can customize +// them by replace the variables (@control-bg-color) with your own color values. +@big-play-bg-color: @control-bg-color; +@big-play-bg-alpha: @control-bg-alpha; +// The font size is what makes the big play button, big. All width/height values +// use ems, which are a multiple of the font size. +// If the @base-font-size is 10px, then 3em equals 30px. +@big-play-font-size: 3em; +// Now that font size is set, the following em values will be a multiple of the +// new font size. If @big-play-font-size is 3em (30px), then setting the any of +// the following values to 2em would equal 60px. 2 * font-size +@big-play-margin: 0.5em; +@big-play-width: 4em; +@big-play-height: 2.6em; +@big-play-border-radius: 0.8em; +@big-play-border-width: 0.1em; +@big-play-border-color: #3b4249; + +/* SKIN +================================================================================ +The main class name for all skin-specific styles. To make your own skin, +replace all occurances of 'vjs-default-skin' with a new name. Then add your new +skin name to your video tag instead of the default skin. +e.g.