From 9d3b2aee02740f1f84cbad551ba9136c87ab11cd Mon Sep 17 00:00:00 2001 From: tsareg Date: Tue, 21 Jun 2016 12:08:32 +0300 Subject: [PATCH 1/7] Show overlay with guidance for gUM permission prompts --- conference.js | 29 +++++++++--- css/overlay.css | 15 +++++++ lang/main.json | 13 +++++- modules/UI/UI.js | 15 +++++++ .../UserMediaPermissionsGuidanceOverlay.js | 45 +++++++++++++++++++ 5 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js diff --git a/conference.js b/conference.js index eb4bbe04b..188c6c8f9 100644 --- a/conference.js +++ b/conference.js @@ -27,6 +27,8 @@ let room, connection, localAudio, localVideo, roomLocker; import {VIDEO_CONTAINER_TYPE} from "./modules/UI/videolayout/LargeVideo"; +const USER_MEDIA_PERMISSIONS_GUIDANCE_OVERLAY_TIMEOUT = 500; + /** * Known custom conference commands. */ @@ -427,25 +429,42 @@ export default { }; } - let audioAndVideoError, audioOnlyError; + let audioAndVideoError, + audioOnlyError, + tracksCreated; return JitsiMeetJS.init(config).then(() => { - return Promise.all([ + let tryCreateLocalTracks = // try to retrieve audio and video createLocalTracks(['audio', 'video']) - // if failed then try to retrieve only audio + // if failed then try to retrieve only audio .catch(err => { audioAndVideoError = err; return createLocalTracks(['audio']); }) - // if audio also failed then just return empty array + // if audio also failed then just return empty array .catch(err => { audioOnlyError = err; return []; - }), + }) + .then(tracks => { + tracksCreated = true; + return tracks; + }); + + window.setTimeout(() => { + if (!audioAndVideoError && !audioOnlyError && !tracksCreated) { + APP.UI.showUserMediaPermissionsGuidanceOverlay(); + } + }, USER_MEDIA_PERMISSIONS_GUIDANCE_OVERLAY_TIMEOUT); + + return Promise.all([ + tryCreateLocalTracks, connect(options.roomName) ]); }).then(([tracks, con]) => { + APP.UI.hideUserMediaPermissionsGuidanceOverlay(); + if (audioAndVideoError) { if (audioOnlyError) { // If both requests for 'audio' + 'video' and 'audio' only diff --git a/css/overlay.css b/css/overlay.css index feb4200c8..52e922dbe 100644 --- a/css/overlay.css +++ b/css/overlay.css @@ -11,6 +11,10 @@ display: block; } +.overlay_transparent { + background: none; +} + .overlay_container { width: 100%; height: 100%; @@ -49,3 +53,14 @@ margin-top: 20px; float: left; } + +.overlay_text_small { + font-size: 18px; +} + +.overlay_icon { + position: relative; + z-index: 1013; + float: none; + font-size: 100px; +} diff --git a/lang/main.json b/lang/main.json index e947c3f72..0f3735857 100644 --- a/lang/main.json +++ b/lang/main.json @@ -11,6 +11,15 @@ "defaultNickname": "ex. Jane Pink", "defaultLink": "e.g. __url__", "calling": "Calling __name__ ...", + "userMedia": { + "react-nativeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", + "chromeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", + "firefoxGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Share Selected Device button", + "operaGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", + "iexplorerGrantPermissions": "Please grant permissions to use your camera and microphone by pressing OK button", + "safariGrantPermissions": "Please grant permissions to use your camera and microphone by pressing OK button", + "nwjsGrantPermissions": "Please grant permissions to use your camera and microphone" + }, "keyboardShortcuts": { "keyboardShortcuts": "Keyboard shortcuts:", "raiseHand": "Raise your hand.", @@ -245,11 +254,11 @@ "cameraErrorPresent": "There was an error connecting to your camera.", "cameraUnsupportedResolutionError": "Your camera does not support required video resolution.", "cameraUnknownError": "Cannot use camera for a unknown reason.", - "cameraPermissionDeniedError": "You have not granted permission to use your camera.", + "cameraPermissionDeniedError": "You have not granted permission to use your camera. You can still join the conference but others won't see you. Use the camera button in the address bar to fix this.", "cameraNotFoundError": "Requested camera was not found.", "cameraConstraintFailedError": "Yor camera does not satisfy some of required constraints.", "micUnknownError": "Cannot use microphone for a unknown reason.", - "micPermissionDeniedError": "You have not granted permission to use your microphone.", + "micPermissionDeniedError": "You have not granted permission to use your microphone. You can still join the conference but others won't hear you. Use the camera button in the address bar to fix this.", "micNotFoundError": "Requested microphone was not found.", "micConstraintFailedError": "Yor microphone does not satisfy some of required constraints." }, diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 300e00a7e..e7619d893 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -15,6 +15,7 @@ import CQEvents from '../../service/connectionquality/CQEvents'; import EtherpadManager from './etherpad/Etherpad'; import SharedVideoManager from './shared_video/SharedVideo'; import Recording from "./recording/Recording"; +import GumPermissionsOverlay from './gum_overlay/UserMediaPermissionsGuidanceOverlay'; import VideoLayout from "./videolayout/VideoLayout"; import FilmStrip from "./videolayout/FilmStrip"; @@ -1385,6 +1386,20 @@ UI.hideRingOverLay = function () { FilmStrip.toggleFilmStrip(true); }; +/** + * Shows browser-specific overlay with guidance how to proceed with gUM prompt. + */ +UI.showUserMediaPermissionsGuidanceOverlay = function () { + GumPermissionsOverlay.show(); +}; + +/** + * Hides browser-specific overlay with guidance how to proceed with gUM prompt. + */ +UI.hideUserMediaPermissionsGuidanceOverlay = function () { + GumPermissionsOverlay.hide(); +}; + /** * Shows or hides the keyboard shortcuts panel.' */ diff --git a/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js b/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js new file mode 100644 index 000000000..8c72a4a7e --- /dev/null +++ b/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js @@ -0,0 +1,45 @@ +/* global $, APP, JitsiMeetJS */ + +let $overlay; + +/** + * Internal function that constructs overlay with guidance how to proceed with + * gUM prompt. + */ +function buildOverlayHtml() { + let browser = JitsiMeetJS.environment.getBrowserType() + .split('rtc_browser.')[1] || 'chrome'; + + $overlay = $(` +
+
+
+ + + +
+
`); + + APP.translation.translateElement($overlay); +} + +export default { + /** + * Shows browser-specific overlay with guidance how to proceed with + * gUM prompt. + */ + show() { + !$overlay && buildOverlayHtml(); + + $overlay && $overlay.appendTo('body'); + }, + + /** + * Hides browser-specific overlay with guidance how to proceed with + * gUM prompt. + */ + hide() { + $overlay && $overlay.detach(); + } +}; \ No newline at end of file From 8ca282079a38c41904716fe39f1dddc733047807 Mon Sep 17 00:00:00 2001 From: tsareg Date: Thu, 23 Jun 2016 11:03:26 +0300 Subject: [PATCH 2/7] Changes after code review --- conference.js | 156 +++++++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 73 deletions(-) diff --git a/conference.js b/conference.js index 188c6c8f9..93ec80ac7 100644 --- a/conference.js +++ b/conference.js @@ -58,6 +58,64 @@ function connect(roomName) { }); } +/** + * Creates local media tracks and connects to room. Will show error + * dialogs in case if accessing local microphone and/or camera failed. Will + * show guidance overlay for users on how to give access to camera and/or + * microphone, + * @param {string} roomName + * @returns {Promise.} + */ +function createInitialLocalTracksAndConnect(roomName) { + let audioAndVideoError, + audioOnlyError, + tracksCreated; + + // First try to retrieve both audio and video. + let tryCreateLocalTracks = createLocalTracks(['audio', 'video']) + .catch(err => { + // If failed then try to retrieve only audio. + audioAndVideoError = err; + return createLocalTracks(['audio']); + }) + .catch(err => { + // If audio failed too then just return empty array for tracks. + audioOnlyError = err; + return []; + }) + .then(tracks => { + tracksCreated = true; + return tracks; + }); + + window.setTimeout(() => { + if (!audioAndVideoError && !audioOnlyError && !tracksCreated) { + APP.UI.showUserMediaPermissionsGuidanceOverlay(); + } + }, USER_MEDIA_PERMISSIONS_GUIDANCE_OVERLAY_TIMEOUT); + + return Promise.all([ tryCreateLocalTracks, connect(roomName) ]) + .then(([tracks, con]) => { + APP.UI.hideUserMediaPermissionsGuidanceOverlay(); + + if (audioAndVideoError) { + if (audioOnlyError) { + // If both requests for 'audio' + 'video' and 'audio' only + // failed, we assume that there is some problems with user's + // microphone and show corresponding dialog. + APP.UI.showDeviceErrorDialog(audioOnlyError, null); + } else { + // If request for 'audio' + 'video' failed, but request for + // 'audio' only was OK, we assume that we had problems with + // camera and show corresponding dialog. + APP.UI.showDeviceErrorDialog(null, audioAndVideoError); + } + } + + return [tracks, con]; + }); +} + /** * Share data to other users. * @param command the command @@ -403,7 +461,6 @@ export default { * @returns {Promise} */ init(options) { - let self = this; this.roomName = options.roomName; JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.TRACE); @@ -429,85 +486,38 @@ export default { }; } - let audioAndVideoError, - audioOnlyError, - tracksCreated; + return JitsiMeetJS.init(config) + .then(() => createInitialLocalTracksAndConnect(options.roomName)) + .then(([tracks, con]) => { + console.log('initialized with %s local tracks', tracks.length); + APP.connection = connection = con; + this._createRoom(tracks); + this.isDesktopSharingEnabled = + JitsiMeetJS.isDesktopSharingEnabled(); + if(this.isDesktopSharingEnabled) + APP.API.addPostisMessageListener('toggle-share-screen', + () => this.toggleScreenSharing()); - return JitsiMeetJS.init(config).then(() => { - let tryCreateLocalTracks = - // try to retrieve audio and video - createLocalTracks(['audio', 'video']) - // if failed then try to retrieve only audio - .catch(err => { - audioAndVideoError = err; - return createLocalTracks(['audio']); - }) - // if audio also failed then just return empty array - .catch(err => { - audioOnlyError = err; - return []; - }) - .then(tracks => { - tracksCreated = true; - return tracks; - }); - - window.setTimeout(() => { - if (!audioAndVideoError && !audioOnlyError && !tracksCreated) { - APP.UI.showUserMediaPermissionsGuidanceOverlay(); + // if user didn't give access to mic or camera or doesn't have + // them at all, we disable corresponding toolbar buttons + if (!tracks.find((t) => t.isAudioTrack())) { + APP.UI.disableMicrophoneButton(); } - }, USER_MEDIA_PERMISSIONS_GUIDANCE_OVERLAY_TIMEOUT); - return Promise.all([ - tryCreateLocalTracks, - connect(options.roomName) - ]); - }).then(([tracks, con]) => { - APP.UI.hideUserMediaPermissionsGuidanceOverlay(); - - if (audioAndVideoError) { - if (audioOnlyError) { - // If both requests for 'audio' + 'video' and 'audio' only - // failed, we assume that there is some problems with user's - // microphone and show corresponding dialog. - APP.UI.showDeviceErrorDialog(audioOnlyError, null); - } else { - // If request for 'audio' + 'video' failed, but request for - // 'audio' only was OK, we assume that we had problems with - // camera and show corresponding dialog. - APP.UI.showDeviceErrorDialog(null, audioAndVideoError); + if (!tracks.find((t) => t.isVideoTrack())) { + APP.UI.disableCameraButton(); } - } - console.log('initialized with %s local tracks', tracks.length); - APP.connection = connection = con; - this._createRoom(tracks); - this.isDesktopSharingEnabled = - JitsiMeetJS.isDesktopSharingEnabled(); - if(this.isDesktopSharingEnabled) - APP.API.addPostisMessageListener('toggle-share-screen', - () => this.toggleScreenSharing()); + this._initDeviceList(); - // if user didn't give access to mic or camera or doesn't have - // them at all, we disable corresponding toolbar buttons - if (!tracks.find((t) => t.isAudioTrack())) { - APP.UI.disableMicrophoneButton(); - } + if (config.iAmRecorder) + this.recorder = new Recorder(); - if (!tracks.find((t) => t.isVideoTrack())) { - APP.UI.disableCameraButton(); - } - - this._initDeviceList(); - - if (config.iAmRecorder) - this.recorder = new Recorder(); - - // XXX The API will take care of disconnecting from the XMPP server - // (and, thus, leaving the room) on unload. - return new Promise((resolve, reject) => { - (new ConferenceConnector(resolve, reject)).connect(); - }); + // XXX The API will take care of disconnecting from the XMPP + // server (and, thus, leaving the room) on unload. + return new Promise((resolve, reject) => { + (new ConferenceConnector(resolve, reject)).connect(); + }); }); }, /** From d149ba6fc5cc214295a5f3e89c1755d63be18bb2 Mon Sep 17 00:00:00 2001 From: tsareg Date: Fri, 24 Jun 2016 12:47:13 +0300 Subject: [PATCH 3/7] Fire an optional JitsiMediaDevices.PERMISSION_PROMPT_IS_SHOWN event when browser shows user media permission prompt when calling createLocalTracks --- conference.js | 132 ++++++++++-------- lang/main.json | 1 + modules/UI/UI.js | 6 +- .../UserMediaPermissionsGuidanceOverlay.js | 15 +- modules/devices/mediaDeviceHelper.js | 19 ++- 5 files changed, 99 insertions(+), 74 deletions(-) diff --git a/conference.js b/conference.js index 93ec80ac7..70da1dc49 100644 --- a/conference.js +++ b/conference.js @@ -27,8 +27,6 @@ let room, connection, localAudio, localVideo, roomLocker; import {VIDEO_CONTAINER_TYPE} from "./modules/UI/videolayout/LargeVideo"; -const USER_MEDIA_PERMISSIONS_GUIDANCE_OVERLAY_TIMEOUT = 500; - /** * Known custom conference commands. */ @@ -68,32 +66,26 @@ function connect(roomName) { */ function createInitialLocalTracksAndConnect(roomName) { let audioAndVideoError, - audioOnlyError, - tracksCreated; + audioOnlyError; + + JitsiMeetJS.mediaDevices.addEventListener( + JitsiMeetJS.events.mediaDevices.PERMISSION_PROMPT_IS_SHOWN, + browser => APP.UI.showUserMediaPermissionsGuidanceOverlay(browser)); // First try to retrieve both audio and video. - let tryCreateLocalTracks = createLocalTracks(['audio', 'video']) + let tryCreateLocalTracks = createLocalTracks( + { devices: ['audio', 'video'] }, true) .catch(err => { // If failed then try to retrieve only audio. audioAndVideoError = err; - return createLocalTracks(['audio']); + return createLocalTracks({ devices: ['audio'] }, true); }) .catch(err => { // If audio failed too then just return empty array for tracks. audioOnlyError = err; return []; - }) - .then(tracks => { - tracksCreated = true; - return tracks; }); - window.setTimeout(() => { - if (!audioAndVideoError && !audioOnlyError && !tracksCreated) { - APP.UI.showUserMediaPermissionsGuidanceOverlay(); - } - }, USER_MEDIA_PERMISSIONS_GUIDANCE_OVERLAY_TIMEOUT); - return Promise.all([ tryCreateLocalTracks, connect(roomName) ]) .then(([tracks, con]) => { APP.UI.hideUserMediaPermissionsGuidanceOverlay(); @@ -245,32 +237,42 @@ function hangup (requestFeedback = false) { /** * Create local tracks of specified types. - * @param {string[]} devices - required track types ('audio', 'video' etc.) - * @param {string|null} [cameraDeviceId] - camera device id, if undefined - one - * from settings will be used - * @param {string|null} [micDeviceId] - microphone device id, if undefined - one - * from settings will be used + * @param {Object} options + * @param {string[]} options.devices - required track types + * ('audio', 'video' etc.) + * @param {string|null} (options.cameraDeviceId) - camera device id, if + * undefined - one from settings will be used + * @param {string|null} (options.micDeviceId) - microphone device id, if + * undefined - one from settings will be used + * @param {boolean} (checkForPermissionPrompt) - if lib-jitsi-meet should check + * for gUM permission prompt * @returns {Promise} */ -function createLocalTracks (devices, cameraDeviceId, micDeviceId) { - return JitsiMeetJS.createLocalTracks({ - // copy array to avoid mutations inside library - devices: devices.slice(0), - resolution: config.resolution, - cameraDeviceId: typeof cameraDeviceId === 'undefined' - || cameraDeviceId === null +function createLocalTracks (options, checkForPermissionPrompt) { + options || (options = {}); + + return JitsiMeetJS + .createLocalTracks({ + // copy array to avoid mutations inside library + devices: options.devices.slice(0), + resolution: config.resolution, + cameraDeviceId: typeof options.cameraDeviceId === 'undefined' || + options.cameraDeviceId === null ? APP.settings.getCameraDeviceId() - : cameraDeviceId, - micDeviceId: typeof micDeviceId === 'undefined' || micDeviceId === null - ? APP.settings.getMicDeviceId() - : micDeviceId, - // adds any ff fake device settings if any - firefox_fake_device: config.firefox_fake_device - }).catch(function (err) { - console.error('failed to create local tracks', ...devices, err); - return Promise.reject(err); - }); -} + : options.cameraDeviceId, + micDeviceId: typeof options.micDeviceId === 'undefined' || + options.micDeviceId === null + ? APP.settings.getMicDeviceId() + : options.micDeviceId, + // adds any ff fake device settings if any + firefox_fake_device: config.firefox_fake_device + }, checkForPermissionPrompt) + .catch(function (err) { + console.error( + 'failed to create local tracks', options.devices, err); + return Promise.reject(err); + }); + } /** * Changes the email for the local user @@ -861,7 +863,7 @@ export default { this.videoSwitchInProgress = true; if (shareScreen) { - createLocalTracks(['desktop']).then(([stream]) => { + createLocalTracks({ devices: ['desktop'] }).then(([stream]) => { stream.on( TrackEvents.LOCAL_TRACK_STOPPED, () => { @@ -918,7 +920,7 @@ export default { APP.UI.messageHandler.openDialog(dialogTitle, dialogTxt, false); }); } else { - createLocalTracks(['video']).then( + createLocalTracks({ devices: ['video'] }).then( ([stream]) => this.useVideoStream(stream) ).then(() => { this.videoSwitchInProgress = false; @@ -1260,32 +1262,40 @@ export default { APP.UI.addListener( UIEvents.VIDEO_DEVICE_CHANGED, (cameraDeviceId) => { - createLocalTracks(['video'], cameraDeviceId, null) - .then(([stream]) => { - this.useVideoStream(stream); - console.log('switched local video device'); - APP.settings.setCameraDeviceId(cameraDeviceId); - }) - .catch((err) => { - APP.UI.showDeviceErrorDialog(null, err); - APP.UI.setSelectedCameraFromSettings(); - }); + createLocalTracks({ + devices: ['video'], + cameraDeviceId: cameraDeviceId, + micDeviceId: null + }) + .then(([stream]) => { + this.useVideoStream(stream); + console.log('switched local video device'); + APP.settings.setCameraDeviceId(cameraDeviceId); + }) + .catch((err) => { + APP.UI.showDeviceErrorDialog(null, err); + APP.UI.setSelectedCameraFromSettings(); + }); } ); APP.UI.addListener( UIEvents.AUDIO_DEVICE_CHANGED, (micDeviceId) => { - createLocalTracks(['audio'], null, micDeviceId) - .then(([stream]) => { - this.useAudioStream(stream); - console.log('switched local audio device'); - APP.settings.setMicDeviceId(micDeviceId); - }) - .catch((err) => { - APP.UI.showDeviceErrorDialog(err, null); - APP.UI.setSelectedMicFromSettings(); - }); + createLocalTracks({ + devices: ['audio'], + cameraDeviceId: null, + micDeviceId: micDeviceId + }) + .then(([stream]) => { + this.useAudioStream(stream); + console.log('switched local audio device'); + APP.settings.setMicDeviceId(micDeviceId); + }) + .catch((err) => { + APP.UI.showDeviceErrorDialog(err, null); + APP.UI.setSelectedMicFromSettings(); + }); } ); diff --git a/lang/main.json b/lang/main.json index 0f3735857..04796672c 100644 --- a/lang/main.json +++ b/lang/main.json @@ -14,6 +14,7 @@ "userMedia": { "react-nativeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", "chromeGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", + "androidGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", "firefoxGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Share Selected Device button", "operaGrantPermissions": "Please grant permissions to use your camera and microphone by pressing Allow button", "iexplorerGrantPermissions": "Please grant permissions to use your camera and microphone by pressing OK button", diff --git a/modules/UI/UI.js b/modules/UI/UI.js index e7619d893..2eb8f97f7 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -1388,9 +1388,11 @@ UI.hideRingOverLay = function () { /** * Shows browser-specific overlay with guidance how to proceed with gUM prompt. + * @param {string} browser - name of browser for which to show the guidance + * overlay. */ -UI.showUserMediaPermissionsGuidanceOverlay = function () { - GumPermissionsOverlay.show(); +UI.showUserMediaPermissionsGuidanceOverlay = function (browser) { + GumPermissionsOverlay.show(browser); }; /** diff --git a/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js b/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js index 8c72a4a7e..ef2cfc9c1 100644 --- a/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js +++ b/modules/UI/gum_overlay/UserMediaPermissionsGuidanceOverlay.js @@ -5,11 +5,10 @@ let $overlay; /** * Internal function that constructs overlay with guidance how to proceed with * gUM prompt. + * @param {string} browser - name of browser for which to construct the + * guidance overlay. */ -function buildOverlayHtml() { - let browser = JitsiMeetJS.environment.getBrowserType() - .split('rtc_browser.')[1] || 'chrome'; - +function buildOverlayHtml(browser) { $overlay = $(`
@@ -28,11 +27,13 @@ export default { /** * Shows browser-specific overlay with guidance how to proceed with * gUM prompt. + * @param {string} browser - name of browser for which to show the + * guidance overlay. */ - show() { - !$overlay && buildOverlayHtml(); + show(browser) { + !$overlay && buildOverlayHtml(browser); - $overlay && $overlay.appendTo('body'); + !$overlay.parents('body').length && $overlay.appendTo('body'); }, /** diff --git a/modules/devices/mediaDeviceHelper.js b/modules/devices/mediaDeviceHelper.js index 8b68ad838..c4e1953ec 100644 --- a/modules/devices/mediaDeviceHelper.js +++ b/modules/devices/mediaDeviceHelper.js @@ -191,8 +191,11 @@ export default { if (audioRequested && videoRequested) { // First we try to create both audio and video tracks together. - return createLocalTracks( - ['audio', 'video'], cameraDeviceId, micDeviceId) + return createLocalTracks({ + devices: ['audio', 'video'], + cameraDeviceId: cameraDeviceId, + micDeviceId: micDeviceId + }) // If we fail to do this, try to create them separately. .catch(() => Promise.all( [createAudioTrack(false), createVideoTrack(false)])) @@ -213,7 +216,11 @@ export default { } function createAudioTrack(showError) { - return createLocalTracks(['audio'], null, micDeviceId) + return createLocalTracks({ + devices: ['audio'], + cameraDeviceId: null, + micDeviceId: micDeviceId + }) .catch(err => { audioTrackError = err; showError && APP.UI.showDeviceErrorDialog(err, null); @@ -222,7 +229,11 @@ export default { } function createVideoTrack(showError) { - return createLocalTracks(['video'], cameraDeviceId, null) + return createLocalTracks({ + devices: ['video'], + cameraDeviceId: cameraDeviceId, + micDeviceId: null + }) .catch(err => { videoTrackError = err; showError && APP.UI.showDeviceErrorDialog(null, err); From 970e8c764c759f646cec76e2f0aba37e2bb5f9dc Mon Sep 17 00:00:00 2001 From: hristoterezov Date: Fri, 24 Jun 2016 12:22:51 -0500 Subject: [PATCH 4/7] Fixes issue with gsm bars for remote participants are always full --- modules/connectionquality/connectionquality.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/connectionquality/connectionquality.js b/modules/connectionquality/connectionquality.js index a2c5d61c5..390493703 100644 --- a/modules/connectionquality/connectionquality.js +++ b/modules/connectionquality/connectionquality.js @@ -99,7 +99,8 @@ export default { var newVal = 100 - data.packetLoss.total; var oldVal = remoteConnectionQuality[id]; - remoteConnectionQuality[id] = calculateQuality(newVal, oldVal); + remoteConnectionQuality[id] = calculateQuality(newVal, oldVal || 100); + console.debug(newVal, oldVal, remoteConnectionQuality[id]); eventEmitter.emit( CQEvents.REMOTESTATS_UPDATED, id, remoteConnectionQuality[id], From 3c0295e2948fe8cc40c2d996b1777c62ad2fd08c Mon Sep 17 00:00:00 2001 From: hristoterezov Date: Fri, 24 Jun 2016 12:25:21 -0500 Subject: [PATCH 5/7] Removes console.debug --- modules/connectionquality/connectionquality.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/connectionquality/connectionquality.js b/modules/connectionquality/connectionquality.js index 390493703..91b44a03d 100644 --- a/modules/connectionquality/connectionquality.js +++ b/modules/connectionquality/connectionquality.js @@ -100,7 +100,6 @@ export default { var newVal = 100 - data.packetLoss.total; var oldVal = remoteConnectionQuality[id]; remoteConnectionQuality[id] = calculateQuality(newVal, oldVal || 100); - console.debug(newVal, oldVal, remoteConnectionQuality[id]); eventEmitter.emit( CQEvents.REMOTESTATS_UPDATED, id, remoteConnectionQuality[id], From 770b003163d717950bde3e405479141619232d43 Mon Sep 17 00:00:00 2001 From: yanas Date: Thu, 23 Jun 2016 14:48:38 -0500 Subject: [PATCH 6/7] Change global font, unify fonts, colors and more --- css/contact_list.css | 6 +- css/font.css | 12 + css/jitsi_popover.css | 4 +- css/login_menu.css | 2 +- css/main.css | 46 +- css/overlay.css | 6 +- css/settingsmenu.css | 18 +- css/toastr.css | 30 +- css/unsupported_browser.css | 2 +- css/videolayout_default.css | 2 +- css/welcome_page.css | 16 +- fonts/OpenSans-Light-webfont.eot | Bin 0 -> 19514 bytes fonts/OpenSans-Light-webfont.svg | 1831 +++++++++++++++++++++++++++++ fonts/OpenSans-Light-webfont.ttf | Bin 0 -> 37336 bytes fonts/OpenSans-Light-webfont.woff | Bin 0 -> 22248 bytes index.html | 8 +- lang/main.json | 14 +- 17 files changed, 1924 insertions(+), 73 deletions(-) create mode 100644 fonts/OpenSans-Light-webfont.eot create mode 100644 fonts/OpenSans-Light-webfont.svg create mode 100644 fonts/OpenSans-Light-webfont.ttf create mode 100644 fonts/OpenSans-Light-webfont.woff diff --git a/css/contact_list.css b/css/contact_list.css index 51d6650e7..3dd0fbc69 100644 --- a/css/contact_list.css +++ b/css/contact_list.css @@ -8,11 +8,15 @@ text-align: left; padding: 7px 10px; margin: 2px; - color: #00ccff; + color: #21B9FC; font-size: 11pt; border-bottom: 1px solid #676767; } +#contactlist>div.title>span { + margin-left: 5px; +} + #contactlist>ul#contacts { position: absolute; top: 31px; diff --git a/css/font.css b/css/font.css index 076d668ac..6ea8e5b25 100644 --- a/css/font.css +++ b/css/font.css @@ -1,3 +1,15 @@ +@font-face { + font-family: 'open_sanslight'; + src: url('../fonts/OpenSans-Light-webfont.eot'); + src: url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'), + url('../fonts/OpenSans-Light-webfont.woff') format('woff'), + url('../fonts/OpenSans-Light-webfont.ttf') format('truetype'), + url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg'); + font-weight: normal; + font-style: normal; + +} + @font-face { font-family: 'jitsi'; src:url('../fonts/jitsi.eot?94d075'); diff --git a/css/jitsi_popover.css b/css/jitsi_popover.css index 545ebf1c4..bdf8a09a9 100644 --- a/css/jitsi_popover.css +++ b/css/jitsi_popover.css @@ -86,12 +86,12 @@ .jitsipopover_blue { - color: #06a5df; + color: #21B9FC; } .jitsipopover_showmore { - background-color: #06a5df; + background-color: #21B9FC; color: #ffffff; cursor: pointer; border-radius: 3px; diff --git a/css/login_menu.css b/css/login_menu.css index 17969a539..c7ad327bb 100644 --- a/css/login_menu.css +++ b/css/login_menu.css @@ -1,6 +1,6 @@ /*Initialize*/ ul.loginmenu { - font-family:'Helvetica Neue', Helvetica, sans-serif; + font-family: inherit; display:none; position: absolute; margin: 0; diff --git a/css/main.css b/css/main.css index 750dde54e..535466c88 100644 --- a/css/main.css +++ b/css/main.css @@ -7,12 +7,19 @@ html, body{ margin:0px; height:100%; color: #424242; - font-family:'Helvetica Neue', Helvetica, sans-serif; + font-size: 14px; font-weight: 400; background: #000000; overflow: hidden; } +html, body, input, textarea, keygen, select, button { + font-family: 'open_sanslight', + 'Helvetica Neue', + Helvetica, + sans-serif !important; +} + .right-panel { display:none; position:absolute; @@ -58,7 +65,7 @@ html, body{ text-align: center; text-shadow: 0 1px 0 rgba(255,255,255,.3), 0 -1px 0 rgba(0,0,0,.6); z-index: 1; - font-size: 1.22em !important; + font-size: 1.44em !important; vertical-align: middle; } @@ -82,18 +89,18 @@ html, body{ } /*#ffde00*/ #toolbar_button_chat.active, #contactListButton.glowing, #chatBottomButton.glowing { - -webkit-text-shadow: -1px 0 10px #00ccff, - 0 1px 10px #00ccff, - 1px 0 10px #00ccff, - 0 -1px 10px #00ccff; - -moz-text-shadow: 1px 0 10px #00ccff, - 0 1px 10px #00ccff, - 1px 0 10px #00ccff, - 0 -1px 10px #00ccff; - text-shadow: -1px 0 10px #00ccff, - 0 1px 10px #00ccff, - 1px 0 10px #00ccff, - 0 -1px 10px #00ccff; + -webkit-text-shadow: -1px 0 10px #21B9FC, + 0 1px 10px #21B9FC, + 1px 0 10px #21B9FC, + 0 -1px 10px #21B9FC; + -moz-text-shadow: 1px 0 10px #21B9FC, + 0 1px 10px #21B9FC, + 1px 0 10px #21B9FC, + 0 -1px 10px #21B9FC; + text-shadow: -1px 0 10px #21B9FC, + 0 1px 10px #21B9FC, + 1px 0 10px #21B9FC, + 0 -1px 10px #21B9FC; } #toolbar_button_hangup { @@ -116,7 +123,7 @@ html, body{ } #contactListButton.active #numberOfParticipants { - color: #00ccff; + color: #21B9FC; } #toolbar { @@ -365,16 +372,11 @@ div.feedbackButton:hover { } .connected { - color: forestgreen; + color: #21B9FC; font-size: 12px; } -.disconnected { - color: darkred; - font-size: 12px; -} - -.lastN { +.lastN, .disconnected { color: #a3a3a3; font-size: 12px; } diff --git a/css/overlay.css b/css/overlay.css index 52e922dbe..70352c27b 100644 --- a/css/overlay.css +++ b/css/overlay.css @@ -6,13 +6,13 @@ width: 100%; height: 100%; z-index: 1013; - background: #000000; /* Old browsers */ + background: #21B9FC; /* Old browsers */ opacity: 0.75; display: block; } .overlay_transparent { - background: none; + background: rgba(22, 185, 252, .9); } .overlay_container { @@ -50,7 +50,7 @@ position: relative; width: 400px; z-index: 1013; - margin-top: 20px; + margin-top: 50px; float: left; } diff --git a/css/settingsmenu.css b/css/settingsmenu.css index 0d7d59467..f21aafcf4 100644 --- a/css/settingsmenu.css +++ b/css/settingsmenu.css @@ -1,7 +1,7 @@ #settingsmenu { display: none; background: black; - color: #00ccff; + color: #21B9FC; overflow-y: auto; } @@ -16,6 +16,18 @@ color: #a7a7a7; } +#settingsmenu>div.title { + text-align: left; + padding: 7px 10px; + margin: 2px; + font-size: 11pt; + border-bottom: 1px solid #676767; +} + +#settingsmenu>div.title>span { + margin-left: 5px; +} + #settingsmenu .arrow-up { width: 0; height: 0; @@ -35,10 +47,6 @@ position: relative; } -#settingsmenu .icon-settings { - padding: 34px; -} - #languages_selectbox { height: 40px; cursor: pointer; diff --git a/css/toastr.css b/css/toastr.css index c58653f3a..91c7c1940 100644 --- a/css/toastr.css +++ b/css/toastr.css @@ -95,7 +95,7 @@ button.toast-close-button { } #toast-container > div { margin: 0 0 6px; - padding: 15px 15px 15px 50px; + padding: 15px 15px 15px 15px; width: 300px; -moz-border-radius: 3px 3px 3px 3px; -webkit-border-radius: 3px 3px 3px 3px; @@ -119,21 +119,17 @@ button.toast-close-button { filter: alpha(opacity=100); cursor: pointer; } -#toast-container > .toast-info { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important; -} -#toast-container > .toast-error { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important; -} -#toast-container > .toast-success { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important; -} -#toast-container > .toast-warning { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important; +#toast-container .toast-info, +#toast-container .toast-success, +#toast-container .toast-error, +#toast-container .toast-warning +{ + padding: 10px 10px 10px 10px !important; } + #toast-container.toast-top-full-width > div, #toast-container.toast-bottom-full-width > div { - width: 96%; + width: 100%; margin: auto; } .toast { @@ -154,7 +150,7 @@ button.toast-close-button { /*Responsive Design*/ @media all and (max-width: 240px) { #toast-container > div { - padding: 8px 8px 8px 50px; + padding: 8px 8px 8px 8px; width: 11em; } #toast-container .toast-close-button { @@ -164,7 +160,7 @@ button.toast-close-button { } @media all and (min-width: 241px) and (max-width: 480px) { #toast-container > div { - padding: 8px 8px 8px 50px; + padding: 8px 8px 8px 8px; width: 18em; } #toast-container .toast-close-button { @@ -174,7 +170,7 @@ button.toast-close-button { } @media all and (min-width: 481px) and (max-width: 768px) { #toast-container > div { - padding: 15px 15px 15px 50px; + padding: 15px 15px 15px 15px; width: 25em; } -} +} \ No newline at end of file diff --git a/css/unsupported_browser.css b/css/unsupported_browser.css index 65744b12d..e7df43229 100644 --- a/css/unsupported_browser.css +++ b/css/unsupported_browser.css @@ -3,7 +3,7 @@ body { height:100%; background-color: white; color: #424242; - font-family:Helvetica,'YanoneKaffeesatzLight',Verdana,Tahoma,Arial; + font-family: 'open_sanslight', 'Helvetica Neue', Helvetica, sans-serif; font-size: 28px; margin:0; padding:0; diff --git a/css/videolayout_default.css b/css/videolayout_default.css index 62dcdcbd6..8e97dcf87 100644 --- a/css/videolayout_default.css +++ b/css/videolayout_default.css @@ -318,7 +318,7 @@ z-index: 3; text-align: center; border-radius: 50%; - background: #0cf; + background: #21B9FC; margin: 5px; display: inline-block; position: absolute; diff --git a/css/welcome_page.css b/css/welcome_page.css index 84435dc3c..6c055ab25 100644 --- a/css/welcome_page.css +++ b/css/welcome_page.css @@ -21,7 +21,6 @@ -moz-user-select: none; background-repeat: no-repeat; font-weight: 500; - font-family: Helvetica; font-size: 16px; color: #acacac; z-index: 2; @@ -35,7 +34,6 @@ -moz-user-select: none; background-repeat: no-repeat; font-weight: 500; - font-family: Helvetica; font-size: 16px; color: #acacac; z-index: 2; @@ -56,21 +54,21 @@ #domain_name { float: left; - padding: 20px 0px 10px 20px; + height: 55px; + line-height: 55px; font-size: 18px; font-weight: 500; - font-family: Helvetica; + padding-left: 20px; } #enter_room_field { font-size: 15px; - padding: 15px 0px 10px 10px; border: none; -webkit-appearance: none; width: 228px; height: 55px; + line-height: 55px; font-weight: 500; - font-family: Helvetica; box-shadow: none; float: left; background-color: #FFFFFF; @@ -81,7 +79,7 @@ #enter_room_button { width: 73px; height: 45px; - background-color: #16a8fe; + background-color: #21B9FC; moz-border-radius: 1px; -webkit-border-radius: 1px; color: #ffffff; @@ -89,7 +87,6 @@ border: none; margin-top: 5px; font-size: 19px; - font-family: Helvetica; padding-top: 6px; outline: none; float:left; @@ -136,7 +133,6 @@ width: 885px; height: 100px; color: #ffffff; - font-family: Helvetica; font-size: 24px; text-align: center; margin: 0px auto 0px auto; @@ -171,7 +167,6 @@ background-repeat: no-repeat; width: 169px; height: 169px; - font-family: Helvetica; color: #ffffff; font-size: 22px; /*font-weight: bold;*/ @@ -183,7 +178,6 @@ .feature_description { width: 190px; - font-family: Helvetica; color: #ffffff; font-size: 16px; padding-top: 30px; diff --git a/fonts/OpenSans-Light-webfont.eot b/fonts/OpenSans-Light-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..14868406aa7d728a88d63963f119635813b5d30e GIT binary patch literal 19514 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 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Light-webfont.svg b/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 000000000..11a472ca8 --- /dev/null +++ b/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Light-webfont.ttf b/fonts/OpenSans-Light-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..63af664cde6abb0083a37fb7f9d561c461997f49 GIT binary patch literal 37336 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 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Light-webfont.woff b/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e786074813a27d0a7a249047832988d5bf0fe756 GIT binary patch literal 22248 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 755a504db..e5f8e8a16 100644 --- a/index.html +++ b/index.html @@ -231,12 +231,16 @@