Initial commit
BIN
.DS_Store
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2022 Alyssa X
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
BIN
assets/.DS_Store
vendored
Normal file
BIN
assets/Inter-Black.ttf
Normal file
BIN
assets/Inter-Bold.ttf
Normal file
BIN
assets/Inter-ExtraBold.ttf
Normal file
BIN
assets/Inter-ExtraLight.ttf
Normal file
BIN
assets/Inter-Light.ttf
Normal file
BIN
assets/Inter-Medium.ttf
Normal file
BIN
assets/Inter-Regular.ttf
Normal file
BIN
assets/Inter-SemiBold.ttf
Normal file
BIN
assets/Inter-Thin.ttf
Normal file
6
assets/action-delete.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1.75 3.5H2.91667H12.25" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.66699 3.50033V2.33366C4.66699 2.02424 4.78991 1.72749 5.0087 1.5087C5.22749 1.28991 5.52424 1.16699 5.83366 1.16699H8.16699C8.47641 1.16699 8.77316 1.28991 8.99195 1.5087C9.21074 1.72749 9.33366 2.02424 9.33366 2.33366V3.50033M11.0837 3.50033V11.667C11.0837 11.9764 10.9607 12.2732 10.742 12.492C10.5232 12.7107 10.2264 12.8337 9.91699 12.8337H4.08366C3.77424 12.8337 3.47749 12.7107 3.2587 12.492C3.03991 12.2732 2.91699 11.9764 2.91699 11.667V3.50033H11.0837Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5.83301 6.41699V9.91699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.16699 6.41699V9.91699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1,022 B |
BIN
assets/add-action.png
Normal file
|
After Width: | Height: | Size: 654 B |
7
assets/add-action.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="314" height="20" viewBox="0 0 314 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="175" y="10" width="139" height="1" fill="#35373E"/>
|
||||
<rect y="10" width="139" height="1" fill="#35373E"/>
|
||||
<circle cx="157" cy="10" r="10" fill="#6068D2"/>
|
||||
<path d="M157 5.9165V14.0832" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M152.917 10H161.083" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 494 B |
3
assets/bookmark.svg
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M23.75 26.25L15 20L6.25 26.25V6.25C6.25 5.58696 6.51339 4.95107 6.98223 4.48223C7.45107 4.01339 8.08696 3.75 8.75 3.75H21.25C21.913 3.75 22.5489 4.01339 23.0178 4.48223C23.4866 4.95107 23.75 5.58696 23.75 6.25V26.25Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 411 B |
4
assets/camera.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M27.8332 23.1667C27.8332 23.7855 27.5873 24.379 27.1498 24.8166C26.7122 25.2542 26.1187 25.5 25.4998 25.5H4.49984C3.881 25.5 3.28751 25.2542 2.84992 24.8166C2.41234 24.379 2.1665 23.7855 2.1665 23.1667V10.3333C2.1665 9.71449 2.41234 9.121 2.84992 8.68342C3.28751 8.24583 3.881 8 4.49984 8H9.1665L11.4998 4.5H18.4998L20.8332 8H25.4998C26.1187 8 26.7122 8.24583 27.1498 8.68342C27.5873 9.121 27.8332 9.71449 27.8332 10.3333V23.1667Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M15.0002 20.8333C17.5775 20.8333 19.6668 18.744 19.6668 16.1667C19.6668 13.5893 17.5775 11.5 15.0002 11.5C12.4228 11.5 10.3335 13.5893 10.3335 16.1667C10.3335 18.744 12.4228 20.8333 15.0002 20.8333Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 915 B |
4
assets/clipboard.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.33301 2.3335H10.4997C10.8091 2.3335 11.1058 2.45641 11.3246 2.6752C11.5434 2.894 11.6663 3.19074 11.6663 3.50016V11.6668C11.6663 11.9762 11.5434 12.273 11.3246 12.4918C11.1058 12.7106 10.8091 12.8335 10.4997 12.8335H3.49967C3.19026 12.8335 2.89351 12.7106 2.67472 12.4918C2.45592 12.273 2.33301 11.9762 2.33301 11.6668V3.50016C2.33301 3.19074 2.45592 2.894 2.67472 2.6752C2.89351 2.45641 3.19026 2.3335 3.49967 2.3335H4.66634" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.75033 1.1665H5.25033C4.92816 1.1665 4.66699 1.42767 4.66699 1.74984V2.9165C4.66699 3.23867 4.92816 3.49984 5.25033 3.49984H8.75033C9.07249 3.49984 9.33366 3.23867 9.33366 2.9165V1.74984C9.33366 1.42767 9.07249 1.1665 8.75033 1.1665Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 958 B |
4
assets/close-meta.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M22.5 7.5L7.5 22.5" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.5 7.5L22.5 22.5" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 323 B |
4
assets/close.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.5 4.5L4.5 13.5" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.5 4.5L13.5 13.5" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 331 B |
4
assets/down.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15 6.25V23.75" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M23.75 15L15 23.75L6.25 15" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 327 B |
4
assets/duplicate.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M25 11.25H13.75C12.3693 11.25 11.25 12.3693 11.25 13.75V25C11.25 26.3807 12.3693 27.5 13.75 27.5H25C26.3807 27.5 27.5 26.3807 27.5 25V13.75C27.5 12.3693 26.3807 11.25 25 11.25Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.25 18.75H5C4.33696 18.75 3.70107 18.4866 3.23223 18.0178C2.76339 17.5489 2.5 16.913 2.5 16.25V5C2.5 4.33696 2.76339 3.70107 3.23223 3.23223C3.70107 2.76339 4.33696 2.5 5 2.5H16.25C16.913 2.5 17.5489 2.76339 18.0178 3.23223C18.4866 3.70107 18.75 4.33696 18.75 5V6.25" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 731 B |
7
assets/file.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.16634 1.1665H3.49967C3.19026 1.1665 2.89351 1.28942 2.67472 1.50821C2.45592 1.72701 2.33301 2.02375 2.33301 2.33317V11.6665C2.33301 11.9759 2.45592 12.2727 2.67472 12.4915C2.89351 12.7103 3.19026 12.8332 3.49967 12.8332H10.4997C10.8091 12.8332 11.1058 12.7103 11.3246 12.4915C11.5434 12.2727 11.6663 11.9759 11.6663 11.6665V4.6665L8.16634 1.1665Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.16699 1.1665V4.6665H11.667" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.33366 7.5835H4.66699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M9.33366 9.9165H4.66699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5.83366 5.25H5.25033H4.66699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1 KiB |
5
assets/globe.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15 25C20.5228 25 25 20.5228 25 15C25 9.47715 20.5228 5 15 5C9.47715 5 5 9.47715 5 15C5 20.5228 9.47715 25 15 25Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5 15H25" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M15 5C17.5013 7.73835 18.9228 11.292 19 15C18.9228 18.708 17.5013 22.2616 15 25C12.4987 22.2616 11.0772 18.708 11 15C11.0772 11.292 12.4987 7.73835 15 5V5Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 661 B |
4
assets/interact.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1.75 1.75L5.87417 11.6492L7.33833 7.33833L11.6492 5.87417L1.75 1.75Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.58301 7.5835L11.083 11.0835" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 394 B |
4
assets/jquery.nice-select.min.js
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
/* jQuery Nice Select - v1.0
|
||||
https://github.com/hernansartorio/jquery-nice-select
|
||||
Made by Hernán Sartorio */
|
||||
!function(e){e.fn.niceSelect=function(t){function s(t){t.after(e("<div></div>").addClass("nice-select").addClass(t.attr("class")||"").addClass(t.attr("disabled")?"disabled":"").attr("tabindex",t.attr("disabled")?null:"0").html('<span class="current"></span><ul class="list"></ul>'));var s=t.next(),n=t.find("option"),i=t.find("option:selected");s.find(".current").html(i.data("display")||i.text()),n.each(function(t){var n=e(this),i=n.data("display");s.find("ul").append(e("<li></li>").attr("data-value",n.val()).attr("data-display",i||null).addClass("option"+(n.is(":selected")?" selected":"")+(n.is(":disabled")?" disabled":"")).html(n.text()))})}if("string"==typeof t)return"update"==t?this.each(function(){var t=e(this),n=e(this).next(".nice-select"),i=n.hasClass("open");n.length&&(n.remove(),s(t),i&&t.next().trigger("click"))}):"destroy"==t?(this.each(function(){var t=e(this),s=e(this).next(".nice-select");s.length&&(s.remove(),t.css("display",""))}),0==e(".nice-select").length&&e(document).off(".nice_select")):console.log('Method "'+t+'" does not exist.'),this;this.hide(),this.each(function(){var t=e(this);t.next().hasClass("nice-select")||s(t)}),e(document).off(".nice_select"),e(document).on("click.nice_select",".nice-select",function(t){var s=e(this);e(".nice-select").not(s).removeClass("open"),s.toggleClass("open"),s.hasClass("open")?(s.find(".option"),s.find(".focus").removeClass("focus"),s.find(".selected").addClass("focus")):s.focus()}),e(document).on("click.nice_select",function(t){0===e(t.target).closest(".nice-select").length&&e(".nice-select").removeClass("open").find(".option")}),e(document).on("click.nice_select",".nice-select .option:not(.disabled)",function(t){var s=e(this),n=s.closest(".nice-select");n.find(".selected").removeClass("selected"),s.addClass("selected");var i=s.data("display")||s.text();n.find(".current").text(i),n.prev("select").val(s.data("value")).trigger("change")}),e(document).on("keydown.nice_select",".nice-select",function(t){var s=e(this),n=e(s.find(".focus")||s.find(".list .option.selected"));if(32==t.keyCode||13==t.keyCode)return s.hasClass("open")?n.trigger("click"):s.trigger("click"),!1;if(40==t.keyCode){if(s.hasClass("open")){var i=n.nextAll(".option:not(.disabled)").first();i.length>0&&(s.find(".focus").removeClass("focus"),i.addClass("focus"))}else s.trigger("click");return!1}if(38==t.keyCode){if(s.hasClass("open")){var l=n.prevAll(".option:not(.disabled)").first();l.length>0&&(s.find(".focus").removeClass("focus"),l.addClass("focus"))}else s.trigger("click");return!1}if(27==t.keyCode)s.hasClass("open")&&s.trigger("click");else if(9==t.keyCode&&s.hasClass("open"))return!1});var n=document.createElement("a").style;return n.cssText="pointer-events:auto","auto"!==n.pointerEvents&&e("html").addClass("no-csspointerevents"),this}}(jQuery);
|
||||
11
assets/left.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_326_2970)">
|
||||
<path d="M23.75 15L6.25 15" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M15 23.75L6.25 15L15 6.25" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_326_2970">
|
||||
<rect width="30" height="30" fill="white" transform="matrix(1 0 0 -1 0 30)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 507 B |
BIN
assets/logo-128.png
Normal file
|
After Width: | Height: | Size: 4 KiB |
BIN
assets/logo-16.png
Normal file
|
After Width: | Height: | Size: 589 B |
BIN
assets/logo-48.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/logo-anchor.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
assets/logo-asana.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
assets/logo-calendar.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
assets/logo-canva.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
assets/logo-codepen.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
assets/logo-docs.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
assets/logo-excel.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
assets/logo-figma.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
assets/logo-forms.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
assets/logo-github.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
assets/logo-github2.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
assets/logo-keep.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
assets/logo-linear.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
assets/logo-medium.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
assets/logo-meet.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
assets/logo-notion.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
assets/logo-photoshop.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
assets/logo-powerpoint.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
assets/logo-producthunt.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
assets/logo-qr.png
Normal file
|
After Width: | Height: | Size: 9 KiB |
BIN
assets/logo-sheets.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
assets/logo-slides.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
assets/logo-spotify.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
assets/logo-twitter.png
Normal file
|
After Width: | Height: | Size: 937 B |
BIN
assets/logo-wip.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
assets/logo-word.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
assets/logo-wordpress.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
3
assets/more-arrow.svg
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<svg width="11" height="6" viewBox="0 0 11 6" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M1 1L5.36713 4.88189C5.4429 4.94925 5.5571 4.94925 5.63287 4.88189L10 1" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 244 B |
BIN
assets/more-thing.png
Normal file
|
After Width: | Height: | Size: 659 B |
5
assets/navigate.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M1 6H11" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6 1C7.25064 2.36918 7.96138 4.14602 8 6C7.96138 7.85398 7.25064 9.63082 6 11C4.74936 9.63082 4.03862 7.85398 4 6C4.03862 4.14602 4.74936 2.36918 6 1V1Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 658 B |
138
assets/nice-select.css
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
.nice-select {
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
background-color: #fff;
|
||||
border-radius: 5px;
|
||||
border: solid 1px #e8e8e8;
|
||||
box-sizing: border-box;
|
||||
clear: both;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
float: left;
|
||||
font-family: inherit;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
height: 42px;
|
||||
line-height: 40px;
|
||||
outline: none;
|
||||
padding-left: 18px;
|
||||
padding-right: 30px;
|
||||
position: relative;
|
||||
text-align: left !important;
|
||||
-webkit-transition: all 0.2s ease-in-out;
|
||||
transition: all 0.2s ease-in-out;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
white-space: nowrap;
|
||||
width: auto; }
|
||||
.nice-select:hover {
|
||||
border-color: #dbdbdb; }
|
||||
.nice-select:active, .nice-select.open, .nice-select:focus {
|
||||
border-color: #999; }
|
||||
.nice-select:after {
|
||||
border-bottom: 2px solid #999;
|
||||
border-right: 2px solid #999;
|
||||
content: '';
|
||||
display: block;
|
||||
height: 5px;
|
||||
margin-top: -4px;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
right: 12px;
|
||||
top: 50%;
|
||||
-webkit-transform-origin: 66% 66%;
|
||||
-ms-transform-origin: 66% 66%;
|
||||
transform-origin: 66% 66%;
|
||||
-webkit-transform: rotate(45deg);
|
||||
-ms-transform: rotate(45deg);
|
||||
transform: rotate(45deg);
|
||||
-webkit-transition: all 0.15s ease-in-out;
|
||||
transition: all 0.15s ease-in-out;
|
||||
width: 5px; }
|
||||
.nice-select.open:after {
|
||||
-webkit-transform: rotate(-135deg);
|
||||
-ms-transform: rotate(-135deg);
|
||||
transform: rotate(-135deg); }
|
||||
.nice-select.open .list {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
-webkit-transform: scale(1) translateY(0);
|
||||
-ms-transform: scale(1) translateY(0);
|
||||
transform: scale(1) translateY(0); }
|
||||
.nice-select.disabled {
|
||||
border-color: #ededed;
|
||||
color: #999;
|
||||
pointer-events: none; }
|
||||
.nice-select.disabled:after {
|
||||
border-color: #cccccc; }
|
||||
.nice-select.wide {
|
||||
width: 100%; }
|
||||
.nice-select.wide .list {
|
||||
left: 0 !important;
|
||||
right: 0 !important; }
|
||||
.nice-select.right {
|
||||
float: right; }
|
||||
.nice-select.right .list {
|
||||
left: auto;
|
||||
right: 0; }
|
||||
.nice-select.small {
|
||||
font-size: 12px;
|
||||
height: 36px;
|
||||
line-height: 34px; }
|
||||
.nice-select.small:after {
|
||||
height: 4px;
|
||||
width: 4px; }
|
||||
.nice-select.small .option {
|
||||
line-height: 34px;
|
||||
min-height: 34px; }
|
||||
.nice-select .list {
|
||||
background-color: #fff;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11);
|
||||
box-sizing: border-box;
|
||||
margin-top: 4px;
|
||||
opacity: 0;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
-webkit-transform-origin: 50% 0;
|
||||
-ms-transform-origin: 50% 0;
|
||||
transform-origin: 50% 0;
|
||||
-webkit-transform: scale(0.75) translateY(-21px);
|
||||
-ms-transform: scale(0.75) translateY(-21px);
|
||||
transform: scale(0.75) translateY(-21px);
|
||||
-webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
|
||||
transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
|
||||
z-index: 9; }
|
||||
.nice-select .list:hover .option:not(:hover) {
|
||||
background-color: transparent !important; }
|
||||
.nice-select .option {
|
||||
cursor: pointer;
|
||||
font-weight: 400;
|
||||
line-height: 40px;
|
||||
list-style: none;
|
||||
min-height: 40px;
|
||||
outline: none;
|
||||
padding-left: 18px;
|
||||
padding-right: 29px;
|
||||
text-align: left;
|
||||
-webkit-transition: all 0.2s;
|
||||
transition: all 0.2s; }
|
||||
.nice-select .option:hover, .nice-select .option.focus, .nice-select .option.selected.focus {
|
||||
background-color: #f6f6f6; }
|
||||
.nice-select .option.selected {
|
||||
font-weight: bold; }
|
||||
.nice-select .option.disabled {
|
||||
background-color: transparent;
|
||||
color: #999;
|
||||
cursor: default; }
|
||||
|
||||
.no-csspointerevents .nice-select .list {
|
||||
display: none; }
|
||||
|
||||
.no-csspointerevents .nice-select.open .list {
|
||||
display: block; }
|
||||
BIN
assets/preview.png
Normal file
|
After Width: | Height: | Size: 341 B |
11
assets/right.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_326_2970)">
|
||||
<path d="M6.25 15L23.75 15" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M15 23.75L23.75 15L15 6.25" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_326_2970">
|
||||
<rect width="30" height="30" fill="white" transform="matrix(1 0 0 -1 0 30)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 508 B |
BIN
assets/save.png
Normal file
|
After Width: | Height: | Size: 302 B |
4
assets/start-record.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.5 16C12.6421 16 16 12.6421 16 8.5C16 4.35786 12.6421 1 8.5 1C4.35786 1 1 4.35786 1 8.5C1 12.6421 4.35786 16 8.5 16Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M6.25 8.5C6.25 9.74264 7.25736 10.75 8.5 10.75C9.74264 10.75 10.75 9.74264 10.75 8.5C10.75 7.25736 9.74264 6.25 8.5 6.25C7.25736 6.25 6.25 7.25736 6.25 8.5Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 565 B |
4
assets/stop.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="17" height="18" viewBox="0 0 17 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.5 16.5C12.6421 16.5 16 13.1421 16 9C16 4.85786 12.6421 1.5 8.5 1.5C4.35786 1.5 1 4.85786 1 9C1 13.1421 4.35786 16.5 8.5 16.5Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M10.75 6.75H6.25V11.25H10.75V6.75Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 453 B |
7
assets/target-active.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.00033 12.8337C10.222 12.8337 12.8337 10.222 12.8337 7.00033C12.8337 3.77866 10.222 1.16699 7.00033 1.16699C3.77866 1.16699 1.16699 3.77866 1.16699 7.00033C1.16699 10.222 3.77866 12.8337 7.00033 12.8337Z" stroke="#6068D2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.8333 7H10.5" stroke="#6068D2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3.50033 7H1.16699" stroke="#6068D2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 3.50033V1.16699" stroke="#6068D2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 12.8333V10.5" stroke="#6068D2" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 854 B |
7
assets/target.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.00033 12.8337C10.222 12.8337 12.8337 10.222 12.8337 7.00033C12.8337 3.77866 10.222 1.16699 7.00033 1.16699C3.77866 1.16699 1.16699 3.77866 1.16699 7.00033C1.16699 10.222 3.77866 12.8337 7.00033 12.8337Z" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.8333 7H10.5" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3.50033 7H1.16699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 3.50033V1.16699" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 12.8333V10.5" stroke="#A5A5AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 854 B |
4
assets/up.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15 23.75V6.25" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M23.75 15L15 6.25L6.25 15" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 326 B |
342
background.js
Normal file
|
|
@ -0,0 +1,342 @@
|
|||
var actions = [];
|
||||
|
||||
// Clear actions and append default ones
|
||||
function clearActions() {
|
||||
getCurrentTab().then((response) => {
|
||||
var isMac = navigator.platform.toUpperCase().indexOf('MAC')>=0;
|
||||
var muteaction = {title:"Mute tab", desc:"Mute the current tab", type:"action", action:"mute", emoji:true, emojiChar:"🔇", keycheck:true, keys:['⌥','⇧', 'M']};
|
||||
var pinaction = {title:"Pin tab", desc:"Pin the current tab", type:"action", action:"pin", emoji:true, emojiChar:"📌", keycheck:true, keys:['⌥','⇧', 'P']};
|
||||
if (response.mutedInfo.muted) {
|
||||
muteaction = {title:"Unmute tab", desc:"Unmute the current tab", type:"action", action:"unmute", emoji:true, emojiChar:"🔈", keycheck:true, keys:['⌥','⇧', 'M']};
|
||||
}
|
||||
if (response.pinned) {
|
||||
pinaction = {title:"Unpin tab", desc:"Unpin the current tab", type:"action", action:"unpin", emoji:true, emojiChar:"📌", keycheck:true, keys:['⌥','⇧', 'P']};
|
||||
}
|
||||
actions = [
|
||||
{title:"New tab", desc:"Open a new tab", type:"action", action:"new-tab", emoji:true, emojiChar:"✨", keycheck:true, keys:['⌘','T']},
|
||||
{title:"Bookmark", desc:"Create a bookmark", type:"action", action:"create-bookmark", emoji:true, emojiChar:"📕", keycheck:true, keys:['⌘','D']},
|
||||
pinaction,
|
||||
{title:"Fullscreen", desc:"Make the page fullscreen", type:"action", action:"fullscreen", emoji:true, emojiChar:"🖥", keycheck:true, keys:['⌘', 'Ctrl', 'F']},
|
||||
muteaction,
|
||||
{title:"Reload", desc:"Reload the page", type:"action", action:"reload", emoji:true, emojiChar:"♻️", keycheck:true, keys:['⌘','⇧', 'R']},
|
||||
{title:"Help", desc:"Get help with Omni on GitHub", type:"action", action:"url", url:"https://github.com/alyssaxuu/omni", emoji:true, emojiChar:"🤔", keycheck:false},
|
||||
{title:"Compose email", desc:"Compose a new email", type:"action", action:"email", emoji:true, emojiChar:"✉️", keycheck:true, keys:['⌥','⇧', 'C']},
|
||||
{title:"New Notion page", desc:"Create a new Notion page", type:"action", action:"url", url:"https://notion.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-notion.png"), keycheck:false},
|
||||
{title:"New Sheets spreadsheet", desc:"Create a new Google Sheets spreadsheet", type:"action", action:"url", url:"https://sheets.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-sheets.png"), keycheck:false},
|
||||
{title:"New Docs document", desc:"Create a new Google Docs document", type:"action", action:"url", emoji:false, url:"https://docs.new", favIconUrl:chrome.runtime.getURL("assets/logo-docs.png"), keycheck:false},
|
||||
{title:"New Slides presentation", desc:"Create a new Google Slides presentation", type:"action", action:"url", url:"https://slides.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-slides.png"), keycheck:false},
|
||||
{title:"New form", desc:"Create a new Google Forms form", type:"action", action:"url", url:"https://forms.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-forms.png"), keycheck:false},
|
||||
{title:"New Medium story", desc:"Create a new Medium story", type:"action", action:"url", url:"https://story.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-medium.png"), keycheck:false},
|
||||
{title:"New GitHub repository", desc:"Create a new GitHub repository", type:"action", action:"url", url:"https://github.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-github.png"), keycheck:false},
|
||||
{title:"New GitHub gist", desc:"Create a new GitHub gist", type:"action", action:"url", url:"https://gist.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-github.png"), keycheck:false},
|
||||
{title:"New CodePen pen", desc:"Create a new CodePen pen", type:"action", action:"url", url:"https://pen.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-codepen.png"), keycheck:false},
|
||||
{title:"New Excel spreadsheet", desc:"Create a new Excel spreadsheet", type:"action", action:"url", url:"https://excel.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-excel.png"), keycheck:false},
|
||||
{title:"New PowerPoint presentation", desc:"Create a new PowerPoint presentation", type:"action", url:"https://powerpoint.new", action:"url", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-powerpoint.png"), keycheck:false},
|
||||
{title:"New Word document", desc:"Create a new Word document", type:"action", action:"url", url:"https://word.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-word.png"), keycheck:false},
|
||||
{title:"Create a whiteboard", desc:"Create a collaborative whiteboard", type:"action", action:"url", url:"https://whiteboard.new", emoji:true, emojiChar:"🧑🏫", keycheck:false},
|
||||
{title:"Record a video", desc:"Record and edit a video", type:"action", action:"url", url:"https://recording.new", emoji:true, emojiChar:"📹", keycheck:false},
|
||||
{title:"Create a Figma file", desc:"Create a new Figma file", type:"action", action:"url", url:"https://figma.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-figma.png"), keycheck:false},
|
||||
{title:"Create a FigJam file", desc:"Create a new FigJam file", type:"action", action:"url", url:"https://figjam.new", emoji:true, emojiChar:"🖌", keycheck:false},
|
||||
{title:"Hunt a product", desc:"Submit a product to Product Hunt", type:"action", action:"url", url:"https://www.producthunt.com/posts/new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-producthunt.png"), keycheck:false},
|
||||
{title:"Make a tweet", desc:"Make a tweet on Twitter", type:"action", action:"url", url:"https://twitter.com/intent/tweet", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-twitter.png"), keycheck:false},
|
||||
{title:"Create a playlist", desc:"Create a Spotify playlist", type:"action", action:"url", url:"https://playlist.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-spotify.png"), keycheck:false},
|
||||
{title:"Create a Canva design", desc:"Create a new design with Canva", type:"action", action:"url", url:"https://design.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-canva.png"), keycheck:false},
|
||||
{title:"Create a new podcast episode", desc:"Create a new podcast episode with Anchor", type:"action", action:"url", url:"https://episode.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-anchor.png"), keycheck:false},
|
||||
{title:"Edit an image", desc:"Edit an image with Adobe Photoshop", type:"action", action:"url", url:"https://photo.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-photoshop.png"), keycheck:false},
|
||||
{title:"Convert to PDF", desc:"Convert a file to PDF", type:"action", action:"url", url:"https://pdf.new", emoji:true, emojiChar:"📄", keycheck:false},
|
||||
{title:"Scan a QR code", desc:"Scan a QR code with your camera", type:"action", action:"url", url:"https://scan.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-qr.png"), keycheck:false},
|
||||
{title:"Add a task to Asana", desc:"Create a new task in Asana", type:"action", action:"url", url:"https://task.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-asana.png"), keycheck:false},
|
||||
{title:"Add an issue to Linear", desc:"Create a new issue in Linear", type:"action", action:"url", url:"https://linear.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-linear.png"), keycheck:false},
|
||||
{title:"Add a task to WIP", desc:"Create a new task in WIP", type:"action", action:"url", url:"https://todo.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-wip.png"), keycheck:false},
|
||||
{title:"Create an event", desc:"Add an event to Google Calendar", type:"action", action:"url", url:"https://cal.new", emoji:false, favIconUrl:chrome.runtime.getURL("assets/logo-calendar.png"), keycheck:false},
|
||||
{title:"Add a note", desc:"Add a note to Google Keep", type:"action", action:"url", emoji:false, url:"https://note.new", favIconUrl:chrome.runtime.getURL("assets/logo-keep.png"), keycheck:false},
|
||||
{title:"New meeting", desc:"Start a Google Meet meeting", type:"action", action:"url", emoji:false, url:"https://meet.new", favIconUrl:chrome.runtime.getURL("assets/logo-meet.png"), keycheck:false},
|
||||
{title:"Browsing history", desc:"Browse through your browsing history", type:"action", action:"history", emoji:true, emojiChar:"🗂", keycheck:true, keys:['⌘','Y']},
|
||||
{title:"Incognito mode", desc:"Open an incognito window", type:"action", action:"incognito", emoji:true, emojiChar:"🕵️", keycheck:true, keys:['⌘','⇧', 'N']},
|
||||
{title:"Downloads", desc:"Browse through your downloads", type:"action", action:"downloads", emoji:true, emojiChar:"📦", keycheck:true, keys:['⌘','⇧', 'J']},
|
||||
{title:"Extensions", desc:"Manage your Chrome Extensions", type:"action", action:"extensions", emoji:true, emojiChar:"🧩", keycheck:false, keys:['⌘','D']},
|
||||
{title:"Chrome settings", desc:"Open the Chrome settings", type:"action", action:"settings", emoji:true, emojiChar:"⚙️", keycheck:true, keys:['⌘',',']},
|
||||
{title:"Scroll to bottom", desc:"Scroll to the bottom of the page", type:"action", action:"scroll-bottom", emoji:true, emojiChar:"👇", keycheck:true, keys:['⌘','↓']},
|
||||
{title:"Scroll to top", desc:"Scroll to the top of the page", type:"action", action:"scroll-top", emoji:true, emojiChar:"👆", keycheck:true, keys:['⌘','↑']},
|
||||
{title:"Go back", desc:"Go back in history for the current tab", type:"action", action:"go-back", emoji:true, emojiChar:"👈", keycheck:true, keys:['⌘','←']},
|
||||
{title:"Go forward", desc:"Go forward in history for the current tab", type:"action", action:"go-forward", emoji:true, emojiChar:"👉", keycheck:true, keys:['⌘','→']},
|
||||
{title:"Duplicate tab", desc:"Make a copy of the current tab", type:"action", action:"duplicate-tab", emoji:true, emojiChar:"📋", keycheck:true, keys:['⌥','⇧', 'D']},
|
||||
{title:"Close tab", desc:"Close the current tab", type:"action", action:"close-tab", emoji:true, emojiChar:"🗑", keycheck:true, keys:['⌘','W']},
|
||||
{title:"Close window", desc:"Close the current window", type:"action", action:"close-window", emoji:true, emojiChar:"💥", keycheck:true, keys:['⌘','⇧', 'W']},
|
||||
{title:"Manage browsing data", desc:"Manage your browsing data", type:"action", action:"manage-data", emoji:true, emojiChar:"🔬", keycheck:true, keys:['⌘','⇧', 'Delete']},
|
||||
{title:"Clear all browsing data", desc:"Clear all of your browsing data", type:"action", action:"remove-all", emoji:true, emojiChar:"🧹", keycheck:false, keys:['⌘','D']},
|
||||
{title:"Clear browsing history", desc:"Clear all of your browsing history", type:"action", action:"remove-history", emoji:true, emojiChar:"🗂", keycheck:false, keys:['⌘','D']},
|
||||
{title:"Clear cookies", desc:"Clear all cookies", type:"action", action:"remove-cookies", emoji:true, emojiChar:"🍪", keycheck:false, keys:['⌘','D']},
|
||||
{title:"Clear cache", desc:"Clear the cache", type:"action", action:"remove-cache", emoji:true, emojiChar:"🗄", keycheck:false, keys:['⌘','D']},
|
||||
{title:"Clear local storage", desc:"Clear the local storage", type:"action", action:"remove-local-storage", emoji:true, emojiChar:"📦", keycheck:false, keys:['⌘','D']},
|
||||
{title:"Clear passwords", desc:"Clear all saved passwords", type:"action", action:"remove-passwords", emoji:true, emojiChar:"🔑", keycheck:false, keys:['⌘','D']},
|
||||
];
|
||||
if (!isMac) {
|
||||
actions.forEach(function(action){
|
||||
if (action.action == "reload") {
|
||||
action.keys = ['F5'];
|
||||
} else if (action.action == "fullscreen") {
|
||||
action.keys = ['F11'];
|
||||
} else if (action.action == "downloads") {
|
||||
action.keys = ['Ctrl', 'J'];
|
||||
} else if (action.action == "settings") {
|
||||
action.keycheck = false;
|
||||
} else if (action.action = "history") {
|
||||
action.keys = ['Ctrl', 'H'];
|
||||
} else if (action.action == "go-back") {
|
||||
action.keys = ['Alt','←'];
|
||||
} else if (action.action == "go-forward") {
|
||||
action.keys = ['Alt','→']
|
||||
} else if (action.action == "scroll-top") {
|
||||
action.keys = ['Home'];
|
||||
} else if (action.action == "scroll-bottom") {
|
||||
action.keys = ['End'];
|
||||
}
|
||||
actions.keys.forEach(function(key){
|
||||
if (key == "⌘") {
|
||||
key = "Ctrl";
|
||||
} else if (key == "⌥") {
|
||||
key = "Alt";
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Open on install
|
||||
chrome.runtime.onInstalled.addListener(function (object) {
|
||||
chrome.tabs.create({url: "https://alyssax.com/omni/"});
|
||||
});
|
||||
|
||||
// Check when the extension button is clicked
|
||||
chrome.action.onClicked.addListener((tab) => {
|
||||
chrome.tabs.sendMessage(tab.id, {request: "open-omni"});
|
||||
});
|
||||
|
||||
// Listen for the open omni shortcut
|
||||
chrome.commands.onCommand.addListener((command) => {
|
||||
if (command = "open-omni") {
|
||||
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
|
||||
chrome.tabs.sendMessage(tabs[0].id, {request: "open-omni"});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Check if tabs have changed and actions need to be fetched again
|
||||
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
|
||||
clearActions();
|
||||
getTabs();
|
||||
getBookmarks();
|
||||
});
|
||||
chrome.tabs.onCreated.addListener(function(tabId, changeInfo, tab) {
|
||||
clearActions();
|
||||
getTabs();
|
||||
getBookmarks();
|
||||
});
|
||||
chrome.tabs.onRemoved.addListener(function(tabId, changeInfo, tab) {
|
||||
clearActions();
|
||||
getTabs();
|
||||
getBookmarks();
|
||||
});
|
||||
|
||||
// Get the current tab
|
||||
async function getCurrentTab() {
|
||||
let queryOptions = { active: true, currentWindow: true };
|
||||
let [tab] = await chrome.tabs.query(queryOptions);
|
||||
return tab;
|
||||
}
|
||||
|
||||
// Get tabs to populate in the actions
|
||||
function getTabs() {
|
||||
chrome.tabs.query({}, function(tabs) {
|
||||
tabs.forEach(function(tab){
|
||||
tab.desc = "Chrome tab";
|
||||
tab.keycheck = false;
|
||||
tab.action = "switch-tab";
|
||||
tab.type = "tab";
|
||||
})
|
||||
actions = tabs.concat(actions);
|
||||
});
|
||||
}
|
||||
|
||||
// Get bookmarks to populate in the actions
|
||||
function getBookmarks() {
|
||||
function process_bookmark(bookmarks) {
|
||||
for (var i = 0; i < bookmarks.length; i++) {
|
||||
var bookmark = bookmarks[i];
|
||||
if (bookmark.url) {
|
||||
actions.push({title:bookmark.title, desc:"Bookmark", id:bookmark.id, type:"bookmark", action:"bookmark", emoji:true, emojiChar:"⭐️", keycheck:false})
|
||||
}
|
||||
if (bookmark.children) {
|
||||
process_bookmark(bookmark.children);
|
||||
}
|
||||
}
|
||||
}
|
||||
chrome.bookmarks.getTree(process_bookmark);
|
||||
}
|
||||
|
||||
// Lots of different actions
|
||||
function switchTab(tab) {
|
||||
chrome.tabs.highlight({
|
||||
tabs: tab.index
|
||||
})
|
||||
}
|
||||
function goBack(tab) {
|
||||
chrome.tabs.goBack({
|
||||
tabs: tab.index
|
||||
})
|
||||
}
|
||||
function goForward(tab){
|
||||
chrome.tabs.goForward({
|
||||
tabs: tab.index
|
||||
})
|
||||
}
|
||||
function duplicateTab(tab) {
|
||||
getCurrentTab().then((response) => {
|
||||
chrome.tabs.duplicate(response.id);
|
||||
})
|
||||
}
|
||||
function createBookmark(tab) {
|
||||
getCurrentTab().then((response) => {
|
||||
chrome.bookmarks.create({
|
||||
title: response.title,
|
||||
url: response.url
|
||||
});
|
||||
})
|
||||
}
|
||||
function muteTab(mute) {
|
||||
getCurrentTab().then((response) => {
|
||||
chrome.tabs.update(response.id, {"muted": mute})
|
||||
});
|
||||
}
|
||||
function reloadTab() {
|
||||
chrome.tabs.reload();
|
||||
}
|
||||
function pinTab(pin) {
|
||||
getCurrentTab().then((response) => {
|
||||
chrome.tabs.update(response.id, {"pinned": pin})
|
||||
});
|
||||
}
|
||||
function clearAllData() {
|
||||
chrome.browsingData.remove({
|
||||
"since": (new Date()).getTime()
|
||||
}, {
|
||||
"appcache": true,
|
||||
"cache": true,
|
||||
"cacheStorage": true,
|
||||
"cookies": true,
|
||||
"downloads": true,
|
||||
"fileSystems": true,
|
||||
"formData": true,
|
||||
"history": true,
|
||||
"indexedDB": true,
|
||||
"localStorage": true,
|
||||
"passwords": true,
|
||||
"serviceWorkers": true,
|
||||
"webSQL": true
|
||||
});
|
||||
}
|
||||
function clearBrowsingData() {
|
||||
chrome.browsingData.removeHistory({"since": 0});
|
||||
}
|
||||
function clearCookies() {
|
||||
chrome.browsingData.removeCookies({"since": 0});
|
||||
}
|
||||
function clearCache() {
|
||||
chrome.browsingData.removeCache({"since": 0});
|
||||
}
|
||||
function clearLocalStorage() {
|
||||
chrome.browsingData.removeLocalStorage({"since": 0});
|
||||
}
|
||||
function clearPasswords() {
|
||||
chrome.browsingData.removePasswords({"since": 0});
|
||||
}
|
||||
function openChromeUrl(url) {
|
||||
chrome.tabs.create({url: 'chrome://'+url+'/'});
|
||||
}
|
||||
function openIncognito() {
|
||||
chrome.windows.create({"incognito": true});
|
||||
}
|
||||
function closeWindow(id) {
|
||||
chrome.windows.remove(id);
|
||||
}
|
||||
function closeTab(tab) {
|
||||
chrome.tabs.remove(tab.id);
|
||||
}
|
||||
function removeBookmark(bookmark) {
|
||||
chrome.bookmarks.remove(bookmark.id);
|
||||
}
|
||||
|
||||
// Recieve messages from any tab
|
||||
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||
if (message.request == "get-actions") {
|
||||
clearActions();
|
||||
getTabs();
|
||||
getBookmarks();
|
||||
sendResponse({actions:actions});
|
||||
} else if (message.request == "switch-tab") {
|
||||
switchTab(message.tab);
|
||||
} else if (message.request == "go-back") {
|
||||
goBack(message.tab);
|
||||
} else if (message.request == "go-forward") {
|
||||
goForward(message.tab);
|
||||
} else if (message.request == "duplicate-tab") {
|
||||
duplicateTab(message.tab);
|
||||
} else if (message.request == "create-bookmark") {
|
||||
createBookmark(message.tab);
|
||||
} else if (message.request == "mute") {
|
||||
muteTab(true);
|
||||
} else if (message.request == "unmute") {
|
||||
muteTab(false);
|
||||
} else if (message.request == "reload") {
|
||||
reloadTab();
|
||||
} else if (message.request == "pin") {
|
||||
pinTab(true);
|
||||
} else if (message.request == "unpin") {
|
||||
pinTab(false);
|
||||
} else if (message.request == "remove-all") {
|
||||
clearAllData();
|
||||
} else if (message.request == "remove-history") {
|
||||
clearBrowsingData();
|
||||
} else if (message.request == "remove-cookies") {
|
||||
clearCookies();
|
||||
} else if (message.request == "remove-cache") {
|
||||
clearCache();
|
||||
} else if (message.request == "remove-local-storage") {
|
||||
clearLocalStorage();
|
||||
} else if (message.request == "remove-passwords") {
|
||||
clearPasswords();
|
||||
} else if (message.request == "history" || message.request == "downloads" || message.request == "extensions" || message.request == "settings" || message.request == "extensions/shortcuts") {
|
||||
openChromeUrl(message.request);
|
||||
} else if (message.request == "manage-data") {
|
||||
openChromeUrl("settings/clearBrowserData");
|
||||
} else if (message.request == "incognito") {
|
||||
openIncognito();
|
||||
} else if (message.request == "close-window") {
|
||||
closeWindow(sender.tab.windowId);
|
||||
} else if (message.request == "search-history") {
|
||||
chrome.history.search({text:message.query, maxResults:1000, startTime:31536000000*5}).then(function(data){
|
||||
data.forEach(function(action){
|
||||
action.type = "history";
|
||||
action.emoji = true;
|
||||
action.emojiChar = "🏛";
|
||||
action.action = "history";
|
||||
action.desc = "Browsing history";
|
||||
});
|
||||
sendResponse({history:data});
|
||||
})
|
||||
return true;
|
||||
} else if (message.request == "remove") {
|
||||
if (message.type == "bookmark") {
|
||||
removeBookmark(message.action);
|
||||
} else {
|
||||
closeTab(message.action);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Get actions
|
||||
clearActions();
|
||||
getTabs();
|
||||
getBookmarks();
|
||||
302
content.css
Normal file
|
|
@ -0,0 +1,302 @@
|
|||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--background: #1E2128;
|
||||
--border: #35373E;
|
||||
--text: #F1F1F1;
|
||||
--text-2: #C5C6CA;
|
||||
--text-3: #A5A5AE;
|
||||
--select: #17191E;
|
||||
--accent: #6068D2;
|
||||
--accent-hover: #484FAC;
|
||||
--shortcut: #383E4A;
|
||||
--placeholder: #63687B;
|
||||
--background-2: #292D36;
|
||||
}
|
||||
}
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--background: #FAFCFF;
|
||||
--border: #F2F3FB;
|
||||
--text: #2B2D41;
|
||||
--text-2: #2B2D41;
|
||||
--text-3: #929DB2;
|
||||
--select: #EFF3F9;
|
||||
--accent: #6068D2;
|
||||
--accent-hover: #484FAC;
|
||||
--shortcut: #DADEEA;
|
||||
--placeholder: #BAC2D1;
|
||||
--background-2: #292D36;
|
||||
}
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('chrome-extension://__MSG_@@extension_id__/assets/Inter-Regular.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
src: url('chrome-extension://__MSG_@@extension_id__/assets/Inter-Medium.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
src: url('chrome-extension://__MSG_@@extension_id__/assets/Inter-SemiBold.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('chrome-extension://__MSG_@@extension_id__/assets/Inter-Bold.ttf');
|
||||
}
|
||||
.omni-extension .item-details * {
|
||||
line-height: normal;
|
||||
}
|
||||
.omni-extension {
|
||||
font-family: Inter!important;
|
||||
z-index: 99999999999;
|
||||
}
|
||||
.omni-extension #omni-wrap {
|
||||
position: fixed;
|
||||
width: 700px;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 5px;
|
||||
margin: auto;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
z-index: 9999999999;
|
||||
height: 540px;
|
||||
transition: all .2s cubic-bezier(.05,.03,.35,1);
|
||||
}
|
||||
.omni-extension #omni {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
background: var(--background);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 5px;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
z-index: 9999999998;
|
||||
height: fit-content;
|
||||
transition: all .2s cubic-bezier(.05,.03,.35,1);
|
||||
display: block;
|
||||
}
|
||||
.closing #omni {
|
||||
transform: scale(.9);
|
||||
opacity: 0;
|
||||
display: none!important;
|
||||
}
|
||||
.closing {
|
||||
pointer-events: none;
|
||||
}
|
||||
.omni-extension #overlay {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
background-color: #000;
|
||||
z-index: 9999;
|
||||
opacity: .6;
|
||||
transition: all .1s cubic-bezier(.05,.03,.35,1);
|
||||
}
|
||||
.closing #overlay {
|
||||
opacity: 0!important;
|
||||
}
|
||||
.omni-extension #head {
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
width: 95%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
.omni-extension #name {
|
||||
color: var(--text);
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
float: left;
|
||||
}
|
||||
.omni-extension #close {
|
||||
color: var(--text-3);
|
||||
float: right;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.omni-extension #close span {
|
||||
margin-left: 3px;
|
||||
}
|
||||
.omni-extension .shortcut {
|
||||
display: inline-block;
|
||||
font-size: 13px;
|
||||
border-radius: 5px;
|
||||
background-color: var(--shortcut);
|
||||
color: var(--text);
|
||||
text-align: center;
|
||||
height: 20px;
|
||||
line-height: 20px;
|
||||
min-width: 20px;
|
||||
padding-left: 3px;
|
||||
padding-right: 3px;
|
||||
}
|
||||
.omni-extension input {
|
||||
background: transparent;
|
||||
border: 0px;
|
||||
outline: none;
|
||||
font-size: 20px;
|
||||
font-weight: 400;
|
||||
height: 50px;
|
||||
width: 92%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
display: block;
|
||||
color: var(--text);
|
||||
caret-color: var(--accent);
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.omni-extension ::placeholder {
|
||||
color: var(--placeholder);
|
||||
opacity: 1;
|
||||
}
|
||||
.omni-extension :-ms-input-placeholder {
|
||||
color: var(--placeholder);
|
||||
}
|
||||
.omni-extension ::-ms-input-placeholder {
|
||||
color: var(--placeholder);
|
||||
}
|
||||
.omni-extension #list {
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
height: 100%;
|
||||
max-height: 400px;
|
||||
border-top: 1px solid var(--border);
|
||||
position: relative;
|
||||
}
|
||||
.omni-extension .item {
|
||||
height: 60px;
|
||||
width: 100%;
|
||||
}
|
||||
.omni-extension .item:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
.omni-extension .item-active {
|
||||
background-color: var(--select);
|
||||
position: relative;
|
||||
}
|
||||
.omni-extension .item-active:before {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
display: block;
|
||||
content: "";
|
||||
width: 2px;
|
||||
background-color: var(--accent);
|
||||
}
|
||||
.omni-extension .select {
|
||||
float: right;
|
||||
vertical-align: middle;
|
||||
color: var(--text-3);
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
display: none;
|
||||
margin-top: 20px;
|
||||
margin-right: 5%;
|
||||
}
|
||||
.omni-extension .select span {
|
||||
margin-left: 3px;
|
||||
}
|
||||
.omni-extension .item-active .select {
|
||||
display: block!important;
|
||||
}
|
||||
.omni-extension .icon {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin-left: 5%;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-top: -12px;
|
||||
}
|
||||
.omni-extension .emoji-action {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-top: -12px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
text-align: center;
|
||||
margin-left: 5%;
|
||||
font-size: 18px;
|
||||
}
|
||||
.omni-extension .item-details {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
vertical-align: middle;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.omni-extension .item-name {
|
||||
color: var(--text-2);
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
width: 450px;
|
||||
}
|
||||
.omni-extension .item-active .item-name {
|
||||
color: var(--text)!important;
|
||||
}
|
||||
.omni-extension .item-desc {
|
||||
color: var(--text-3);
|
||||
margin-top: 5px;
|
||||
font-size: 14px;
|
||||
}
|
||||
.omni-extension #footer {
|
||||
height: 45px;
|
||||
line-height: 45px;
|
||||
border-top: 1px solid var(--border);
|
||||
width: 92%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.omni-extension #results {
|
||||
color: var(--text-3);
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
float: left;
|
||||
}
|
||||
.omni-extension #arrows {
|
||||
color: var(--text-3);
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
float: right;
|
||||
}
|
||||
.omni-extension #arrows span {
|
||||
margin-left: 3px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
.omni-extension .keys {
|
||||
float: right;
|
||||
vertical-align: middle;
|
||||
font-weight: 500;
|
||||
margin-top: 20px;
|
||||
margin-right: 5%;
|
||||
}
|
||||
.omni-extension .item-active .keys {
|
||||
display: none!important;
|
||||
}
|
||||
.omni-extension .keys span {
|
||||
margin-left: 3px;
|
||||
}
|
||||
#body-wrap {
|
||||
width: calc(100% - 350px);
|
||||
overflow: auto;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
}
|
||||
22
content.html
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<html>
|
||||
<head>
|
||||
</head>
|
||||
<body>
|
||||
<div id="omni-extension" class="closing omni-extension">
|
||||
<div id="omni-wrap">
|
||||
<div id="omni">
|
||||
<div id="search">
|
||||
<input placeholder="Type a command or search">
|
||||
</div>
|
||||
<div id="list">
|
||||
</div>
|
||||
<div id="footer">
|
||||
<div id="results">153 results</div>
|
||||
<div id="arrows">Use arrow keys <span class="shortcut">↑</span><span class="shortcut">↓</span> to navigate</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="overlay"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
268
content.js
Normal file
|
|
@ -0,0 +1,268 @@
|
|||
$(document).ready(function(){
|
||||
var isOpen = false;
|
||||
var actions = [];
|
||||
|
||||
// Append the omni into the current page
|
||||
$.get(chrome.runtime.getURL('/content.html'), function(data) {
|
||||
$(data).appendTo('body');
|
||||
});
|
||||
|
||||
// Request actions from the background
|
||||
chrome.runtime.sendMessage({request:"get-actions"}, function(response) {
|
||||
actions = response.actions;
|
||||
populateOmni();
|
||||
});
|
||||
|
||||
// Add actions to the omni
|
||||
function populateOmni() {
|
||||
$("#omni-extension #list").html("");
|
||||
actions.forEach(function(action, index){
|
||||
var keys = "";
|
||||
if (action.keycheck) {
|
||||
keys = "<div class='keys'>";
|
||||
action.keys.forEach(function(key){
|
||||
keys += "<span class='shortcut'>"+key+"</span>";
|
||||
});
|
||||
keys += "</div>";
|
||||
}
|
||||
var img = "<img src='"+action.favIconUrl+"' alt='favicon' onerror='this.src=""+chrome.runtime.getURL("/assets/globe.svg")+""' class='icon'>";
|
||||
if (action.emoji) {
|
||||
img = "<span class='emoji-action'>"+action.emojiChar+"</span>"
|
||||
}
|
||||
if (index != 0) {
|
||||
$("#omni-extension #list").append("<div class='item' data-type='"+action.type+"'>"+img+"<div class='item-details'><div class='item-name'>"+action.title+"</div><div class='item-desc'>"+action.desc+"</div></div>"+keys+"<div class='select'>Select <span class='shortcut'>⏎</span></div></div>");
|
||||
} else {
|
||||
$("#omni-extension #list").append("<div class='item item-active' data-type='"+action.type+"'>"+img+"<div class='item-details'><div class='item-name'>"+action.title+"</div><div class='item-desc'>"+action.desc+"</div></div>"+keys+"<div class='select'>Select <span class='shortcut'>⏎</span></div></div>");
|
||||
}
|
||||
})
|
||||
$(".omni-extension #results").html(actions.length+" results");
|
||||
}
|
||||
|
||||
// Add actions to the omni
|
||||
function populateOmniHistory(actions) {
|
||||
$("#omni-extension #list").html("");
|
||||
actions.forEach(function(action, index){
|
||||
var keys = "";
|
||||
if (action.keycheck) {
|
||||
keys = "<div class='keys'>";
|
||||
action.keys.forEach(function(key){
|
||||
keys += "<span class='shortcut'>"+key+"</span>";
|
||||
});
|
||||
keys += "</div>";
|
||||
}
|
||||
var img = "<img src='"+action.favIconUrl+"' alt='favicon' onerror='this.src=""+chrome.runtime.getURL("/assets/globe.svg")+""' class='icon'>";
|
||||
if (action.emoji) {
|
||||
img = "<span class='emoji-action'>"+action.emojiChar+"</span>"
|
||||
}
|
||||
if (index != 0) {
|
||||
$("#omni-extension #list").append("<div class='item' data-type='"+action.type+"' data-url='"+action.url+"'>"+img+"<div class='item-details'><div class='item-name'>"+action.title+"</div><div class='item-desc'>"+action.desc+"</div></div>"+keys+"<div class='select'>Select <span class='shortcut'>⏎</span></div></div>");
|
||||
} else {
|
||||
$("#omni-extension #list").append("<div class='item item-active' data-type='"+action.type+"' data-url='"+action.url+"'>"+img+"<div class='item-details'><div class='item-name'>"+action.title+"</div><div class='item-desc'>"+action.desc+"</div></div>"+keys+"<div class='select'>Select <span class='shortcut'>⏎</span></div></div>");
|
||||
}
|
||||
})
|
||||
$(".omni-extension #results").html(actions.length+" results");
|
||||
}
|
||||
|
||||
// Open the omni
|
||||
function openOmni() {
|
||||
chrome.runtime.sendMessage({request:"get-actions"}, function(response) {
|
||||
isOpen = true;
|
||||
actions = response.actions;
|
||||
populateOmni();
|
||||
$("#omni-extension input").val("");
|
||||
$("html, body").stop();
|
||||
$("#omni-extension").removeClass("closing");
|
||||
window.setTimeout(function(){
|
||||
$("#omni-extension input").focus();
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
|
||||
// Close the omni
|
||||
function closeOmni() {
|
||||
isOpen = false;
|
||||
$("#omni-extension").addClass("closing");
|
||||
}
|
||||
|
||||
// Hover over an action in the omni
|
||||
function hoverItem() {
|
||||
$(".item-active").removeClass("item-active");
|
||||
$(this).addClass("item-active");
|
||||
}
|
||||
|
||||
// Search for an action in the omni
|
||||
function search() {
|
||||
var value = $(this).val().toLowerCase();
|
||||
if (value.startsWith("/history")) {
|
||||
var tempvalue = value.replace("/tabs ", "");
|
||||
var query = "";
|
||||
if (tempvalue != "/history") {
|
||||
query = value.replace("/history ", "");
|
||||
}
|
||||
chrome.runtime.sendMessage({request:"search-history", query:query}, function(response){
|
||||
populateOmniHistory(response.history);
|
||||
});
|
||||
} else {
|
||||
populateOmni();
|
||||
$("#omni-extension #list .item").filter(function(){
|
||||
if (value.startsWith("/tabs")) {
|
||||
var tempvalue = value.replace("/tabs ", "");
|
||||
if (tempvalue == "/tabs") {
|
||||
$(this).toggle($(this).attr("data-type") == "tab");
|
||||
} else {
|
||||
tempvalue = value.replace("/tabs ", "");
|
||||
$(this).toggle(($(this).find(".item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "tab");
|
||||
}
|
||||
} else if (value.startsWith("/bookmarks")) {
|
||||
var tempvalue = value.replace("/bookmarks ", "");
|
||||
if (tempvalue == "/bookmarks") {
|
||||
$(this).toggle($(this).attr("data-type") == "bookmark");
|
||||
} else {
|
||||
tempvalue = value.replace("/bookmarks ", "");
|
||||
$(this).toggle(($(this).find(".item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "bookmark");
|
||||
}
|
||||
} else if (value.startsWith("/remove")) {
|
||||
var tempvalue = value.replace("/remove ", "");
|
||||
if (tempvalue == "/remove") {
|
||||
$(this).toggle($(this).attr("data-type") == "bookmark" || $(this).attr("data-type") == "tab");
|
||||
} else {
|
||||
tempvalue = value.replace("/remove ", "");
|
||||
$(this).toggle(($(this).find(".item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && ($(this).attr("data-type") == "bookmark" || $(this).attr("data-type") == "tab"));
|
||||
}
|
||||
} else if (value.startsWith("/actions")) {
|
||||
var tempvalue = value.replace("/actions ", "");
|
||||
if (tempvalue == "/actions") {
|
||||
$(this).toggle($(this).attr("data-type") == "action");
|
||||
} else {
|
||||
tempvalue = value.replace("/actions ", "");
|
||||
$(this).toggle(($(this).find(".item-name").text().toLowerCase().indexOf(tempvalue) > -1 || $(this).find(".item-desc").text().toLowerCase().indexOf(tempvalue) > -1) && $(this).attr("data-type") == "action");
|
||||
}
|
||||
} else {
|
||||
$(this).toggle($(this).find(".item-name").text().toLowerCase().indexOf(value) > -1 || $(this).find(".item-desc").text().toLowerCase().indexOf(value) > -1);
|
||||
}
|
||||
});
|
||||
}
|
||||
$(".omni-extension #results").html($("#omni-extension #list .item:visible").length+" results");
|
||||
}
|
||||
|
||||
// Handle actions from the omni
|
||||
function handleAction() {
|
||||
var action = actions.find(x => x.title == $(".item-active .item-name").text());
|
||||
closeOmni();
|
||||
if ($(".omni-extension input").val().toLowerCase().startsWith("/remove")) {
|
||||
chrome.runtime.sendMessage({request:"remove", type:action.type, action:action});
|
||||
} else if ($(".omni-extension input").val().toLowerCase().startsWith("/history")) {
|
||||
window.open($(".item-active").attr("data-url"), "_self");
|
||||
} else {
|
||||
chrome.runtime.sendMessage({request:action.action, tab:action});
|
||||
if (action.action == "bookmark") {
|
||||
window.open(action.url, "_self");
|
||||
} else if (action.action == "scroll-bottom") {
|
||||
window.scrollTo(0,document.body.scrollHeight);
|
||||
} else if (action.action == "scroll-top") {
|
||||
window.scrollTo(0,0);
|
||||
} else if (action.action == "close-tab") {
|
||||
window.close();
|
||||
} else if (action.action == "navigation") {
|
||||
window.open(action.url, "_self");
|
||||
} else if (action.action == "fullscreen") {
|
||||
var elem = document.documentElement;
|
||||
elem.requestFullscreen();
|
||||
} else if (action.action == "new-tab") {
|
||||
window.open("");
|
||||
} else if (action.action == "email") {
|
||||
window.open("mailto:");
|
||||
} else if (action.action == "url") {
|
||||
window.open(action.url);
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch actions again
|
||||
chrome.runtime.sendMessage({request:"get-actions"}, function(response) {
|
||||
actions = response.actions;
|
||||
populateOmni();
|
||||
});
|
||||
}
|
||||
|
||||
// Customize the shortcut to open the Omni box
|
||||
function openShortcuts() {
|
||||
chrome.runtime.sendMessage({request:"extensions/shortcuts"});
|
||||
}
|
||||
|
||||
|
||||
// Check which keys are down
|
||||
var down = [];
|
||||
$(document).keydown(function(e) {
|
||||
down[e.keyCode] = true;
|
||||
}).keyup(function(e) {
|
||||
if (down[18] && down[16] && down[80]) {
|
||||
if (actions.find(x => x.action == "pin") != undefined) {
|
||||
chrome.runtime.sendMessage({request:"pin-tab"});
|
||||
} else {
|
||||
chrome.runtime.sendMessage({request:"unpin-tab"});
|
||||
}
|
||||
chrome.runtime.sendMessage({request:"get-actions"}, function(response) {
|
||||
actions = response.actions;
|
||||
populateOmni();
|
||||
});
|
||||
} else if (down[18] && down[16] && down[77]) {
|
||||
if (actions.find(x => x.action == "mute") != undefined) {
|
||||
chrome.runtime.sendMessage({request:"mute-tab"});
|
||||
} else {
|
||||
chrome.runtime.sendMessage({request:"unmute-tab"});
|
||||
}
|
||||
chrome.runtime.sendMessage({request:"get-actions"}, function(response) {
|
||||
actions = response.actions;
|
||||
populateOmni();
|
||||
});
|
||||
} else if (down[18] && down[16] && down[67]) {
|
||||
window.open("mailto:");
|
||||
}
|
||||
|
||||
if (down[38]) {
|
||||
// Up key
|
||||
if ($(".item-active").prevAll("div").not(":hidden").first().length) {
|
||||
var previous = $(".item-active").prevAll("div").not(":hidden").first();
|
||||
$(".item-active").removeClass("item-active");
|
||||
previous.addClass("item-active");
|
||||
previous[0].scrollIntoView({block:"nearest", inline:"nearest"});
|
||||
}
|
||||
|
||||
} else if (down[40]) {
|
||||
// Down key
|
||||
if ($(".item-active").nextAll("div").not(":hidden").first().length) {
|
||||
var next = $(".item-active").nextAll("div").not(":hidden").first();
|
||||
$(".item-active").removeClass("item-active");
|
||||
next.addClass("item-active");
|
||||
next[0].scrollIntoView({block:"nearest", inline:"nearest"});
|
||||
}
|
||||
} else if (down[27] && isOpen) {
|
||||
// Esc key
|
||||
closeOmni();
|
||||
} else if (down[13] && isOpen) {
|
||||
// Enter key
|
||||
handleAction();
|
||||
}
|
||||
|
||||
down[e.keyCode] = false;
|
||||
});
|
||||
|
||||
// Recieve messages from background
|
||||
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
||||
if (message.request == "open-omni") {
|
||||
if (isOpen) {
|
||||
closeOmni();
|
||||
} else {
|
||||
openOmni();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Events
|
||||
$(document).on("click", "#open-page-omni-extension-thing", openShortcuts);
|
||||
$(document).on("mouseover", ".omni-extension .item:not(.item-active)", hoverItem);
|
||||
$(document).on("input", ".omni-extension input", search);
|
||||
$(document).on("click", ".item-active", handleAction);
|
||||
$(document).on("click", ".omni-extension #overlay", closeOmni);
|
||||
});
|
||||
2
jquery.js
vendored
Normal file
53
manifest.json
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
{
|
||||
"name": "Omni",
|
||||
"description": "Supercharge Chrome with commands, shortcuts, and more",
|
||||
"offline_enabled": true,
|
||||
"version": "1.0.1",
|
||||
"manifest_version": 3,
|
||||
"action": {
|
||||
"icons": {
|
||||
"16": "assets/logo-16.png",
|
||||
"48": "assets/logo-48.png",
|
||||
"128": "assets/logo-128.png"
|
||||
}
|
||||
},
|
||||
"icons": {
|
||||
"16": "assets/logo-16.png",
|
||||
"48": "assets/logo-48.png",
|
||||
"128": "assets/logo-128.png"
|
||||
},
|
||||
"commands": {
|
||||
"open-omni": {
|
||||
"suggested_key": {
|
||||
"default": "Ctrl+K",
|
||||
"mac": "Command+K"
|
||||
},
|
||||
"description": "Open command menu"
|
||||
}
|
||||
},
|
||||
"background": {
|
||||
"service_worker": "background.js"
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": [
|
||||
"<all_urls>"
|
||||
],
|
||||
"run_at": "document_end",
|
||||
"js": ["jquery.js", "assets/jquery.nice-select.min.js", "content.js"],
|
||||
"css": ["assets/nice-select.css", "content.css"]
|
||||
}
|
||||
],
|
||||
"web_accessible_resources": [
|
||||
{
|
||||
"resources": ["content.html", "assets/*", "popup.css", "popup.js"],
|
||||
"matches": ["<all_urls>"]
|
||||
}
|
||||
],
|
||||
"permissions": [
|
||||
"tabs", "activeTab", "bookmarks", "browsingData", "history"
|
||||
],
|
||||
"host_permissions": [
|
||||
"https://www.googleapis.com/*", "https://gstatic.com/*", "*://*/*"
|
||||
]
|
||||
}
|
||||