diff --git a/.gitignore b/.gitignore
index 855c269..f3a30ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@ timeline.xctimeline
playground.xcworkspace
.vscode/
+.DS_Store
diff --git a/README.md b/README.md
index 4090806..56607bc 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
# Vimari - Keyboard Shortcuts extension for Safari
-[](https://github.com/danielcompton/vimari/actions)
-
[](https://apps.apple.com/us/app/vimari/id1480933944?ls=1&mt=12)
Vimari is a Safari extension that provides keyboard based navigation.
diff --git a/Vimari Extension/Info.plist b/Vimari Extension/Info.plist
index 99ef6fb..6abd427 100644
--- a/Vimari Extension/Info.plist
+++ b/Vimari Extension/Info.plist
@@ -30,6 +30,10 @@
$(PRODUCT_MODULE_NAME).SafariExtensionHandler
SFSafariContentScript
+
+ Script
+ vnotify.js
+
Script
svim-scripts.js
@@ -61,6 +65,10 @@
SFSafariStyleSheet
+
+ Style Sheet
+ vnotify.css
+
Style Sheet
injected.css
diff --git a/Vimari Extension/css/injected.css b/Vimari Extension/css/injected.css
index 3d20791..001d275 100644
--- a/Vimari Extension/css/injected.css
+++ b/Vimari Extension/css/injected.css
@@ -1,3 +1,4 @@
+/* vimium */
.vimiumReset {
background: none;
border: none;
@@ -7,7 +8,7 @@
cursor: auto;
display: inline;
float: none;
- font-family : "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+ font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
font-size: inherit;
font-style: normal;
font-variant: normal;
@@ -81,7 +82,7 @@ div.internalVimiumHintMarker > .matchingCharacter {
border: 1px solid #b3b3b3;
border-bottom: none;
border-radius: 4px 4px 0 0;
- font-family: Lucida Grande, Arial, Sans;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important;
/* One less than vimium's hint markers, so link hints can be shown e.g. for the panel's close button. */
z-index: 99999998;
text-shadow: 0px 1px 2px #FFF;
@@ -89,26 +90,25 @@ div.internalVimiumHintMarker > .matchingCharacter {
opacity: 0;
}
-.vimiumHUD a, .vimiumHUD a:hover {
+.vimiumHUD a, .vimiumHUD a: hover {
background: transparent;
color: blue;
text-decoration: underline;
}
.vimiumHUD a.close-button {
- float:right;
- font-family:courier new;
- font-weight:bold;
- color:#9C9A9A;
- text-decoration:none;
- padding-left:10px;
- margin-top:-1px;
- font-size:14px;
+ float: right;
+ font-family: courier new;
+ font-weight: bold;
+ color: #9C9A9A;
+ text-decoration: none;
+ padding-left: 10px;
+ margin-top: -1px;
+ font-size: 14px;
}
-.vimiumHUD a.close-button:hover {
- color:#333333;
- cursor:default;
- -webkit-user-select:none;
+.vimiumHUD a.close-button: hover {
+ color: #333333;
+ cursor: default;
+ -webkit-user-select: none;
}
-
diff --git a/Vimari Extension/css/vnotify.css b/Vimari Extension/css/vnotify.css
new file mode 100644
index 0000000..aa6c29d
--- /dev/null
+++ b/Vimari Extension/css/vnotify.css
@@ -0,0 +1,90 @@
+/* vNotify */
+.vnotify-container {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif !important;
+ font-size: 12px !important;
+ line-height: 1.5 !important;
+ position: fixed !important; }
+/*
+ .vnotify-container.vn-top-right {
+ right: 10px !important;
+ top: 10px !important; }
+ .vnotify-container.vn-top-left {
+ top: 10px !important;
+ left: 10px !important; }
+*/
+ .vnotify-container.vn-bottom-right {
+ bottom: 10px !important;
+ right: 10px !important; }
+/*
+ .vnotify-container.vn-bottom-left {
+ bottom: 10px !important;
+ left: 10px !important; }
+ .vnotify-container.vn-center {
+ top: 50% !important;
+ left: 50% !important;
+ transform: translate(-50%, -50%) !important; }
+ */
+ .vnotify-container .vn-close {
+ position: absolute !important;
+ top: 5px !important;
+ right: 10px !important;
+ width: 15px !important;
+ height: 15px !important;
+ padding: 2px !important;
+ cursor: pointer !important; }
+ .vnotify-container .vn-close: before, .vnotify-container .vn-close: after {
+ content: '' !important;
+ position: absolute !important;
+ width: 100% !important;
+ top: 50% !important;
+ height: 2px !important;
+ background: #fff !important; }
+ .vnotify-container .vn-close: before {
+ -webkit-transform: rotate(45deg) !important;
+/* -moz-transform: rotate(45deg) !important;*/
+ transform: rotate(45deg) !important; }
+ .vnotify-container .vn-close: after {
+ -webkit-transform: rotate(-45deg) !important;
+/* -moz-transform: rotate(-45deg) !important;*/
+ transform: rotate(-45deg) !important; }
+
+.vnotify-item {
+ width: 8em !important;
+ padding: 7.5px !important;
+ position: relative !important;
+ -webkit-border-radius: 5px !important;
+/* -moz-border-radius: 5px !important;*/
+/* -ms-border-radius: 5px !important;*/
+ border-radius: 5px !important;
+ margin-bottom: 7.5px !important;
+ opacity: 0.5 !important;
+/* -ms-filter: "progid: DXImageTransform.Microsoft.Alpha(Opacity=75)" !important;*/
+ filter: alpha(opacity=50) !important; }
+ .vnotify-item: hover {
+ opacity: 1 !important; }
+
+.vnotify-title {
+ font-weight: bold !important; }
+
+.vnotify-notify {
+background: #333 !important;
+color: #fff !important; }
+
+/*
+.vnotify-success {
+ background: #2ecc71 !important;
+ color: #fff !important; }
+
+.vnotify-error {
+ background: #e74c3c !important;
+ color: #fff !important; }
+
+.vnotify-warning {
+ background: #f39c12 !important;
+ color: #fff !important; }
+
+ .vnotify-info {
+ background: #3498db !important;
+ color: #fff !important; }
+
+*/
diff --git a/Vimari Extension/js/injected.js b/Vimari Extension/js/injected.js
index 79bb66e..bbb413e 100644
--- a/Vimari Extension/js/injected.js
+++ b/Vimari Extension/js/injected.js
@@ -19,71 +19,73 @@
*/
var topWindow = (window.top === window),
- settings = {},
- currentZoomLevel = 100,
- linkHintCss = {},
- extensionActive = true,
- insertMode = false,
- shiftKeyToggle = false,
- hudDuration = 5000,
+ settings = {},
+ currentZoomLevel = 100,
+ linkHintCss = {},
+ extensionActive = true,
+ insertMode = false,
+ shiftKeyToggle = false,
+// hudDuration = 5000,
extensionCommunicator = SafariExtensionCommunicator(messageHandler);
var actionMap = {
- 'hintToggle' : function() {
- HUD.showForDuration('Open link in current tab', hudDuration);
- activateLinkHintsMode(false, false); },
+ 'hintToggle' : function() {
+ vNotify.notify({text: 'Current Tab', title:'Vimari', visibleDuration: 2000, showClose: false});
+// HUD.showForDuration('Open link in current tab', hudDuration);
+ activateLinkHintsMode(false, false); },
- 'newTabHintToggle' : function() {
- HUD.showForDuration('Open link in new tab', hudDuration);
- activateLinkHintsMode(true, false); },
+ 'newTabHintToggle' : function() {
+ vNotify.notify({text: 'New Tab', title:'Vimari', visibleDuration: 2000, showClose: false});
+// HUD.showForDuration('Open link in new tab', hudDuration);
+ activateLinkHintsMode(true, false); },
- 'tabForward':
+ 'tabForward':
function() { extensionCommunicator.requestTabForward(); },
- 'tabBack':
+ 'tabBack':
function() { extensionCommunicator.requestTabBackward() },
- 'scrollDown':
- function() { customScrollBy(0, settings.scrollSize); },
+ 'scrollDown':
+ function() { customScrollBy(0, settings.scrollSize); },
- 'scrollUp':
- function() { customScrollBy(0, -settings.scrollSize); },
+ 'scrollUp':
+ function() { customScrollBy(0, -settings.scrollSize); },
- 'scrollLeft':
- function() { customScrollBy(-settings.scrollSize, 0); },
+ 'scrollLeft':
+ function() { customScrollBy(-settings.scrollSize, 0); },
- 'scrollRight':
- function() { customScrollBy(settings.scrollSize, 0); },
+ 'scrollRight':
+ function() { customScrollBy(settings.scrollSize, 0); },
- 'goBack':
- function() { window.history.back(); },
+ 'goBack':
+ function() { window.history.back(); },
- 'goForward':
- function() { window.history.forward(); },
+ 'goForward':
+ function() { window.history.forward(); },
- 'reload':
- function() { window.location.reload(); },
+ 'reload':
+ function() { window.location.reload(); },
- 'openTab':
- function() { extensionCommunicator.requestNewTab(); },
+ 'openTab':
+ function() { extensionCommunicator.requestNewTab(); },
- 'closeTab':
- function() { extensionCommunicator.requestCloseTab(); },
+ 'closeTab':
+ function() { extensionCommunicator.requestCloseTab(); },
- 'scrollDownHalfPage':
- function() { customScrollBy(0, window.innerHeight / 2); },
+ 'scrollDownHalfPage':
+ function() { customScrollBy(0, window.innerHeight / 2); },
- 'scrollUpHalfPage':
- function() { customScrollBy(0, window.innerHeight / -2); },
+ 'scrollUpHalfPage':
+ function() { customScrollBy(0, window.innerHeight / -2); },
- 'goToPageBottom':
- function() { customScrollBy(0, document.body.scrollHeight); },
+ 'goToPageBottom':
+ function() { customScrollBy(0, document.body.scrollHeight); },
- 'goToPageTop':
- function() { customScrollBy(0, -document.body.scrollHeight); },
+ 'goToPageTop':
+ function() { customScrollBy(0, -document.body.scrollHeight); },
- 'goToFirstInput':
- function() { goToFirstInput(); }
+ 'goToFirstInput':
+ function() { goToFirstInput(); }
};
// Inspiration and general algorithm taken from sVim.
@@ -138,16 +140,16 @@ function goToFirstInput() {
// Meant to be overridden, but still has to be copy/pasted from the original...
Mousetrap.prototype.stopCallback = function(e, element, combo) {
- // Escape key is special, no need to stop. Vimari-specific.
- if (combo === 'esc' || combo === 'ctrl+[') { return false; }
+ // Escape key is special, no need to stop. Vimari-specific.
+ if (combo === 'esc' || combo === 'ctrl+[') { return false; }
// Preserve the behavior of allowing ex. ctrl-j in an input
if (settings.modifier) { return false; }
- // if the element has the class "mousetrap" then no need to stop
- if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {
- return false;
- }
+ // if the element has the class "mousetrap" then no need to stop
+ if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) {
+ return false;
+ }
var tagName = element.tagName;
var contentIsEditable = (element.contentEditable && element.contentEditable === 'true');
@@ -162,67 +164,67 @@ function bindKeyCodesToActions(settings) {
if (typeof settings != "undefined") {
excludedUrl = isExcludedUrl(settings.excludedUrls, document.URL)
}
- // Only add if topWindow... not iframe
+ // Only add if topWindow... not iframe
Mousetrap.reset();
- if (topWindow && !excludedUrl) {
- Mousetrap.bind('esc', enterNormalMode);
- Mousetrap.bind('ctrl+[', enterNormalMode);
- Mousetrap.bind('i', enterInsertMode);
- for (var actionName in actionMap) {
- if (actionMap.hasOwnProperty(actionName)) {
- var keyCode = getKeyCode(actionName);
- Mousetrap.bind(keyCode, executeAction(actionName), 'keydown');
- }
- }
- }
+ if (topWindow && !excludedUrl) {
+ Mousetrap.bind('esc', enterNormalMode);
+ Mousetrap.bind('ctrl+[', enterNormalMode);
+ Mousetrap.bind('i', enterInsertMode);
+ for (var actionName in actionMap) {
+ if (actionMap.hasOwnProperty(actionName)) {
+ var keyCode = getKeyCode(actionName);
+ Mousetrap.bind(keyCode, executeAction(actionName), 'keydown');
+ }
+ }
+ }
}
function enterNormalMode() {
- // Clear input focus
- document.activeElement.blur();
-
- // Clear link hints (if any)
- deactivateLinkHintsMode();
+ // Clear input focus
+ document.activeElement.blur();
+ // Clear link hints (if any)
+ deactivateLinkHintsMode();
if (insertMode === false) {
return // We are already in normal mode.
}
- // Re-enable if in insert mode
- insertMode = false;
- HUD.showForDuration('Normal Mode', hudDuration);
-
- Mousetrap.bind('i', enterInsertMode);
+ // Re-enable if in insert mode
+ insertMode = false;
+ Mousetrap.bind('i', enterInsertMode);
+ var container = document.querySelectorAll('.vnotify-container');
+ for (var i=0; i< container.length; i++) {
+ container[i].outerHTML = '';
+ container[i] = null;
+ }
+ vNotify.notify({text: 'Normal Mode', title:'Vimari', visibleDuration: 500, showClose: false});
}
// Calling it 'insert mode', but it's really just a user-triggered
// off switch for the actions.
function enterInsertMode() {
- if (insertMode === true) {
- return // We are already in insert mode.
- }
insertMode = true;
- HUD.showForDuration('Insert Mode', hudDuration);
- Mousetrap.unbind('i');
+ Mousetrap.unbind('i');
+ vNotify.notify({text: 'Insert Mode', title:'Vimari', visibleDuration: 500, showClose: false, sticky: true});
}
function executeAction(actionName) {
- return function() {
- // don't do anything if we're not supposed to
- if (linkHintsModeActivated || !extensionActive || insertMode)
- return;
+ return function() {
+ // don't do anything if we're not supposed to
+ if (linkHintsModeActivated || !extensionActive || insertMode)
+ return;
- //Call the action function
- actionMap[actionName]();
+ //Call the action function
+ actionMap[actionName]();
- // Tell mousetrap to stop propagation
- return false;
- }
+ // Tell mousetrap to stop propagation
+ return false;
+ }
}
function unbindKeyCodes() {
- Mousetrap.reset();
+ Mousetrap.reset();
document.removeEventListener("keydown", stopSitePropagation);
}
@@ -246,14 +248,14 @@ function isActiveElementEditable() {
// Adds an optional modifier to the configured key code for the action
function getKeyCode(actionName) {
- var keyCode = '';
+ var keyCode = '';
if (typeof settings != 'undefined') {
if(settings.modifier) {
keyCode += settings.modifier + '+';
}
return keyCode + settings["bindings"][actionName];
}
- return keyCode;
+ return keyCode;
}
@@ -263,7 +265,7 @@ function getKeyCode(actionName) {
* css is pre loaded into the page.
*/
function addCssToPage(css) {
- return;
+ return;
}
@@ -275,10 +277,10 @@ function addCssToPage(css) {
* can be controlled via the keyboard, particularly SELECT combo boxes.
*/
function isEditable(target) {
- if (target.getAttribute("contentEditable") === "true")
- return true;
- var focusableInputs = ["input", "textarea", "select", "button"];
- return focusableInputs.indexOf(target.tagName.toLowerCase()) >= 0;
+ if (target.getAttribute("contentEditable") === "true")
+ return true;
+ var focusableInputs = ["input", "textarea", "select", "button"];
+ return focusableInputs.indexOf(target.tagName.toLowerCase()) >= 0;
}
@@ -303,8 +305,8 @@ function messageHandler(event){
* Callback to pass settings to injected script
*/
function setSettings(msg) {
- settings = msg;
- activateExtension(settings);
+ settings = msg;
+ activateExtension(settings);
}
function activateExtension(settings) {
@@ -314,9 +316,9 @@ function activateExtension(settings) {
}
function isExcludedUrl(storedExcludedUrls, currentUrl) {
- if (!storedExcludedUrls.length) {
- return false;
- }
+ if (!storedExcludedUrls.length) {
+ return false;
+ }
var excludedUrls, regexp, url, formattedUrl, _i, _len;
excludedUrls = storedExcludedUrls.split(",");
diff --git a/Vimari Extension/js/lib/mousetrap.js b/Vimari Extension/js/lib/mousetrap.js
index 941372a..35c741d 100644
--- a/Vimari Extension/js/lib/mousetrap.js
+++ b/Vimari Extension/js/lib/mousetrap.js
@@ -1,7 +1,8 @@
// Custom behaviour for Vimari implemented at line 185. Be aware of this
// when upgrading mousetrap.
-/*global define:false */
+/* global define:false */
+
/**
* Copyright 2012-2017 Craig Campbell
*
@@ -23,6 +24,7 @@
* @version 1.6.5
* @url craig.is/killing/mice
*/
+
(function(window, document, undefined) {
// Check if mousetrap is used inside browser, if not, return
diff --git a/Vimari Extension/js/lib/vimium-scripts.js b/Vimari Extension/js/lib/vimium-scripts.js
index 698725d..109ebcb 100644
--- a/Vimari Extension/js/lib/vimium-scripts.js
+++ b/Vimari Extension/js/lib/vimium-scripts.js
@@ -2,11 +2,11 @@
* Code in this file is taken directly from vimium
*/
-
/*
* A heads-up-display (HUD) for showing Vimium page operations.
* Note: you cannot interact with the HUD until document.body is available.
*/
+
HUD = {
_tweenId: -1,
_displayElement: null,
diff --git a/Vimari Extension/js/lib/vnotify.js b/Vimari Extension/js/lib/vnotify.js
new file mode 100644
index 0000000..598968d
--- /dev/null
+++ b/Vimari Extension/js/lib/vnotify.js
@@ -0,0 +1,243 @@
+/*
+* Code in this file is taken directly from [Vanilla-Notify](https://github.com/MLaritz/Vanilla-Notify)
+*/
+
+var vNotify = (function() {
+
+ var positionOption = {
+ topLeft: 'topLeft',
+ topRight: 'topRight',
+ bottomLeft: 'bottomLeft',
+ bottomRight: 'bottomRight',
+ center: 'center'
+ };
+
+ var options = {
+ fadeInDuration: 1000,
+ fadeOutDuration: 1000,
+ fadeInterval: 50,
+ visibleDuration: 5000,
+ postHoverVisibleDuration: 500,
+ position: positionOption.bottomRight,
+ sticky: false,
+ showClose: true
+ };
+
+// var info = function(params) {
+// params.notifyClass = 'vnotify-info';
+// return addNotify(params);
+// };
+// var success = function(params) {
+// params.notifyClass = 'vnotify-success';
+// return addNotify(params);
+// };
+//
+// var error = function(params) {
+// params.notifyClass = 'vnotify-error';
+// return addNotify(params);
+// };
+//
+// var warning = function(params) {
+// params.notifyClass = 'vnotify-warning';
+// return addNotify(params);
+// };
+
+ var notify = function(params) {
+ params.notifyClass = 'vnotify-notify';
+ return addNotify(params);
+ };
+
+// var custom = function(params) {
+// return addNotify(params);
+// };
+
+ var addNotify = function(params) {
+ if (!params.title && !params.text) {
+ return null;
+ }
+
+ var frag = document.createDocumentFragment();
+
+ var item = document.createElement('div');
+ item.classList.add('vnotify-item');
+ item.classList.add(params.notifyClass);
+ item.style.opacity = 0;
+
+ item.options = getOptions(params);
+
+ if (params.title) {
+ item.appendChild(addTitle(params.title));
+ }
+ if (params.text) {
+ item.appendChild(addText(params.text));
+ }
+ if (item.options.showClose) {
+ item.appendChild(addClose(item));
+ }
+
+ item.visibleDuration = item.options.visibleDuration; //option
+
+ var hideNotify = function() {
+ item.fadeInterval = fade('out', item.options.fadeOutDuration, item);
+ };
+
+ var resetInterval = function() {
+ clearTimeout(item.interval);
+ clearTimeout(item.fadeInterval);
+ item.style.opacity = null;
+ item.visibleDuration = item.options.postHoverVisibleDuration;
+ };
+
+ var hideTimeout = function () {
+ item.interval = setTimeout(hideNotify, item.visibleDuration);
+ };
+
+ frag.appendChild(item);
+ var container = getNotifyContainer(item.options.position);
+ container.appendChild(frag);
+
+ item.addEventListener("mouseover", resetInterval);
+
+ fade('in', item.options.fadeInDuration, item);
+
+ if (!item.options.sticky){
+ item.addEventListener("mouseout", hideTimeout);
+ hideTimeout();
+ }
+
+ return item;
+ };
+
+ var addText = function(text) {
+ var item = document.createElement('div');
+ item.classList.add('vnotify-text');
+ item.innerHTML = text;
+ return item;
+ };
+
+ var addTitle = function(title) {
+ var item = document.createElement('div');
+ item.classList.add('vnotify-title');
+ item.innerHTML = title;
+ return item;
+ };
+
+ var addClose = function(parent) {
+ var item = document.createElement('span');
+ item.classList.add('vn-close');
+ item.addEventListener('click', function(){remove(parent);});
+ return item;
+ };
+
+ var getNotifyContainer = function(position) {
+ var positionClass = getPositionClass(position);
+ var container = document.querySelector('.' + positionClass);
+ return container ? container : createNotifyContainer(positionClass);
+ };
+
+ var createNotifyContainer = function(positionClass) {
+ var frag = document.createDocumentFragment();
+ container = document.createElement('div');
+ container.classList.add('vnotify-container');
+ container.classList.add(positionClass);
+ container.setAttribute('role', 'alert');
+
+ frag.appendChild(container);
+ document.body.appendChild(frag);
+
+ return container;
+ };
+
+ var getPositionClass = function(option) {
+ switch (option) {
+ case positionOption.topLeft:
+ return 'vn-top-left';
+ case positionOption.bottomRight:
+ return 'vn-bottom-right';
+ case positionOption.bottomLeft:
+ return 'vn-bottom-left';
+ case positionOption.center:
+ return 'vn-center';
+ default:
+ return 'vn-top-right';
+ }
+ };
+
+ var getOptions = function(opts) {
+ return {
+ fadeInDuration: opts.fadeInDuration || options.fadeInDuration,
+ fadeOutDuration: opts.fadeOutDuration || options.fadeOutDuration,
+ fadeInterval: opts.fadeInterval || options.fadeInterval,
+ visibleDuration: opts.visibleDuration || options.visibleDuration,
+ postHoverVisibleDuration: opts.postHoverVisibleDuration || options.postHoverVisibleDuration,
+ position: opts.position || options.position,
+ sticky: opts.sticky != null ? opts.sticky : options.sticky,
+ showClose: opts.showClose != null ? opts.showClose : options.showClose
+ };
+ };
+
+ var remove = function(item) {
+ item.style.display = 'none';
+ item.outerHTML = '';
+ item = null;
+ };
+
+ // New fade - based on http://toddmotto.com/raw-javascript-jquery-style-fadein-fadeout-functions-hugo-giraudel/
+ var fade = function(type, ms, el) {
+ var isIn = type === 'in',
+ opacity = isIn ? 0 : el.style.opacity || 1,
+ goal = isIn ? 0.8 : 0,
+ gap = options.fadeInterval / ms;
+
+ if(isIn) {
+ el.style.display = 'block';
+ el.style.opacity = opacity;
+ }
+
+ function func() {
+ opacity = isIn ? opacity + gap : opacity - gap;
+ el.style.opacity = opacity;
+
+ if(opacity <= 0) {
+ remove(el);
+ checkRemoveContainer();
+ }
+ if((!isIn && opacity <= goal) || (isIn && opacity >= goal)) {
+ window.clearInterval(fading);
+ }
+ }
+
+ var fading = window.setInterval(func, options.fadeInterval);
+ return fading;
+ };
+
+ var checkRemoveContainer = function() {
+ var item = document.querySelector('.vnotify-item');
+ if (!item) {
+ var container = document.querySelectorAll('.vnotify-container');
+ for (var i=0; i< container.length; i++) {
+ container[i].outerHTML = '';
+ container[i] = null;
+ }
+ }
+ };
+
+ return {
+// info: info,
+// success: success,
+// error: error,
+// warning: warning,
+// custom: custom,
+ notify: notify,
+ options: options,
+ positionOption: positionOption
+ };
+})();
+
+// expose vNotify to the global object
+window.vNotify = vNotify;
+
+// expose as a common js module
+if (typeof module !== 'undefined' && module.exports) {
+ module.exports = vNotify;
+};
diff --git a/Vimari Extension/json/defaultSettings.json b/Vimari Extension/json/defaultSettings.json
index ef40a12..a979c90 100644
--- a/Vimari Extension/json/defaultSettings.json
+++ b/Vimari Extension/json/defaultSettings.json
@@ -1,5 +1,6 @@
{
"excludedUrls": "",
+ "insertModeUrls": "",
"linkHintCharacters": "asdfjklqwerzxc",
"detectByCursorStyle": false,
"scrollSize": 50,
diff --git a/Vimari.xcodeproj/project.pbxproj b/Vimari.xcodeproj/project.pbxproj
index df4b5cd..d245bdd 100644
--- a/Vimari.xcodeproj/project.pbxproj
+++ b/Vimari.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ 4C15F22C24E4441C009DC451 /* vnotify.css in Resources */ = {isa = PBXBuildFile; fileRef = 4C15F22B24E4441C009DC451 /* vnotify.css */; };
+ 4C9DFE0C24E37A60002B9455 /* vnotify.js in Resources */ = {isa = PBXBuildFile; fileRef = 4C9DFE0B24E37A60002B9455 /* vnotify.js */; };
659033F124E2B77400432D0E /* svim-scripts.js in Resources */ = {isa = PBXBuildFile; fileRef = 659033F024E2B77400432D0E /* svim-scripts.js */; };
65E444F324CC3A1B008EA1DC /* SafariExtensionCommunicator.js in Resources */ = {isa = PBXBuildFile; fileRef = 65E444F224CC3A1B008EA1DC /* SafariExtensionCommunicator.js */; };
B1E3C17023A65ED400A56807 /* ConfigurationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E3C16F23A65ED400A56807 /* ConfigurationModel.swift */; };
@@ -58,6 +60,8 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ 4C15F22B24E4441C009DC451 /* vnotify.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = vnotify.css; sourceTree = ""; };
+ 4C9DFE0B24E37A60002B9455 /* vnotify.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = vnotify.js; sourceTree = ""; };
659033F024E2B77400432D0E /* svim-scripts.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "svim-scripts.js"; sourceTree = ""; };
65E444F224CC3A1B008EA1DC /* SafariExtensionCommunicator.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = SafariExtensionCommunicator.js; sourceTree = ""; };
B1E3C16F23A65ED400A56807 /* ConfigurationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationModel.swift; sourceTree = ""; };
@@ -193,6 +197,7 @@
659033F024E2B77400432D0E /* svim-scripts.js */,
E380F27E233183EE00640547 /* mousetrap.js */,
E380F27F233183EE00640547 /* vimium-scripts.js */,
+ 4C9DFE0B24E37A60002B9455 /* vnotify.js */,
);
path = lib;
sourceTree = "";
@@ -201,6 +206,7 @@
isa = PBXGroup;
children = (
E380F282233183EE00640547 /* injected.css */,
+ 4C15F22B24E4441C009DC451 /* vnotify.css */,
);
path = css;
sourceTree = "";
@@ -298,6 +304,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 4C9DFE0C24E37A60002B9455 /* vnotify.js in Resources */,
E380F26C2331806500640547 /* ToolbarItemIcon.pdf in Resources */,
B1FD3B9923A588DE00677A52 /* defaultSettings.json in Resources */,
659033F124E2B77400432D0E /* svim-scripts.js in Resources */,
@@ -305,6 +312,7 @@
E380F28B233183EF00640547 /* injected.css in Resources */,
E380F285233183EF00640547 /* injected.js in Resources */,
E380F287233183EF00640547 /* keyboard-utils.js in Resources */,
+ 4C15F22C24E4441C009DC451 /* vnotify.css in Resources */,
E380F289233183EF00640547 /* vimium-scripts.js in Resources */,
E380F2672331806500640547 /* SafariExtensionViewController.xib in Resources */,
E380F286233183EF00640547 /* mocks.js in Resources */,
@@ -485,7 +493,7 @@
CODE_SIGN_ENTITLEMENTS = "Vimari Extension/Vimari_Extension.entitlements";
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
- DEVELOPMENT_TEAM = Y48UDGWSSQ;
+ DEVELOPMENT_TEAM = 98QL363Q8S;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "Vimari Extension/Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
@@ -508,7 +516,7 @@
CODE_SIGN_ENTITLEMENTS = "Vimari Extension/Vimari_Extension.entitlements";
CODE_SIGN_IDENTITY = "Mac Developer";
CODE_SIGN_STYLE = Automatic;
- DEVELOPMENT_TEAM = Y48UDGWSSQ;
+ DEVELOPMENT_TEAM = 98QL363Q8S;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = "Vimari Extension/Info.plist";
LD_RUNPATH_SEARCH_PATHS = (