├── .gitignore ├── README.md ├── background.js ├── favicon.png ├── icon.png ├── icon@2x.png ├── icon@3x.png ├── index.html ├── manifest.json ├── package-lock.json ├── package.json ├── postcss.config.js ├── static ├── css │ ├── style.css │ └── tailwind.css ├── img │ └── default-yellow.webp └── js │ ├── alpine.min.js │ ├── bookmarks.js │ ├── jquery-3.5.0.min.js │ ├── mark.min.js │ ├── modal.js │ ├── semantic.min.js │ ├── settings.js │ ├── sortable.min.js │ └── tasks.js └── tailwind.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mission-control 2 | Mission Control - New Tab Chrome Extension 3 | 4 | Visit Website: https://mission-control.app/ 5 | 6 | Install on Chrome: https://chrome.google.com/webstore/detail/mission-control-bookmarks/moefgmdpmpkpfiflljmcjgjlmjnjaall?hl=en-US 7 | -------------------------------------------------------------------------------- /background.js: -------------------------------------------------------------------------------- 1 | // background.js 2 | (function () { 3 | "use strict"; 4 | 5 | chrome.runtime.onInstalled.addListener(function () { 6 | chrome.contextMenus.create({ 7 | id: "AddpagetoBookmarks", 8 | title: "Add this Page to Mission Control", 9 | contexts: ["page"], 10 | }); 11 | chrome.contextMenus.create({ 12 | id: "AddLinktoBookmarks", 13 | title: "Add this link to Mission Control", 14 | contexts: ["link"], 15 | }); 16 | chrome.contextMenus.create({ 17 | id: "AddtoTasks", 18 | title: "Add as Task in Mission Control", 19 | contexts: ["selection"], 20 | }); 21 | }); 22 | 23 | chrome.action.onClicked.addListener(handleBrowserActionClicked); 24 | 25 | function handleBrowserActionClicked(tab) { 26 | const opts = { 27 | url: chrome.runtime.getURL("index.html"), 28 | }; 29 | chrome.tabs.create(opts, handleCallback); 30 | } 31 | 32 | // Open on New Tab 33 | // So give users a chance to use other New Tab 34 | 35 | // chrome.tabs.onCreated.addListener(function (tab) { 36 | // // Only redirect if this is a blank new tab (not opened by clicking a link). 37 | 38 | // setTimeout(() => { 39 | // console.log(tab); 40 | // if ((tab.pendingUrl || tab.url) === "chrome://newtab/") { 41 | // // Show your website. This might highlight the omnibox, 42 | // console.log("this"); 43 | // // but it's not guaranteed. 44 | // chrome.tabs.update( 45 | // tab.id, 46 | // { 47 | // url: chrome.runtime.getURL("index.html"), 48 | // }, 49 | // handleCallback 50 | // ); 51 | // console.log("here"); 52 | // } 53 | // }, 100); 54 | // }); 55 | 56 | // function handleCallback(window) { 57 | // console.log("done"); 58 | // } 59 | 60 | chrome.alarms.create({ delayInMinutes: 0.1 }); 61 | console.log("alarn"); 62 | 63 | chrome.alarms.onAlarm.addListener(() => { 64 | console.log("alarm run"); 65 | if (chrome.notifications) { 66 | console.log("yup run"); 67 | //show(); 68 | } 69 | }); 70 | 71 | // function show() { 72 | // var opt = { 73 | // iconUrl: 74 | // "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA" + 75 | // "AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO" + 76 | // "9TXL0Y4OHwAAAABJRU5ErkJggg==", 77 | // type: "basic", 78 | // title: "Primary Title", 79 | // message: "Primary message to display", 80 | // priority: 1, 81 | // }; 82 | // chrome.notifications.create( 83 | // "1", 84 | // { 85 | // iconUrl: 86 | // "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA" + 87 | // "AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO" + 88 | // "9TXL0Y4OHwAAAABJRU5ErkJggg==", 89 | // title: "This should be a notification", 90 | // type: "basic", 91 | // message: "Notification body", 92 | // isClickable: true, 93 | // priority: 2, 94 | // }, 95 | // function (id) { 96 | // console.log("Last error:", chrome.runtime.lastError); 97 | // } 98 | // ); 99 | // } 100 | 101 | // items: [ 102 | // { title: "Item1", message: "This is item 1." }, 103 | // { title: "Item2", message: "This is item 2." }, 104 | // { title: "Item3", message: "This is item 3." }, 105 | // ], 106 | 107 | // chrome.contextMenus.create({ 108 | // title: "Add this Website to Mission Control", 109 | // id: "mc-add", 110 | // contexts: ["all"], 111 | // }); 112 | 113 | // chrome.contextMenus.onClicked.addListener(async (info, tab) => { 114 | // console.log(info); 115 | // console.log(tab); 116 | // const { menuItemId } = info; 117 | // if (menuItemId === "mc-add") { 118 | // console.log("yup"); 119 | // await addToAWMT(info); 120 | // } 121 | // }); 122 | 123 | // chrome.browserAction.onClicked.addListener(async (tab) => { 124 | // const { url } = tab; 125 | // addToAWMT({ webpage: url }); 126 | // }); 127 | 128 | // async function addToAWMT(info) { 129 | // const { srcUrl, selectionText, webpage } = info; 130 | // console.log("goko"); 131 | // chrome.tabs.getSelected(null, (tab) => { 132 | // const source = tab.url; 133 | 134 | // if (srcUrl) { 135 | // console.log({ type: "Image", url: srcUrl, source }); 136 | // } 137 | 138 | // if (selectionText) { 139 | // console.log({ content: selectionText, source }); 140 | // } 141 | 142 | // if (webpage) { 143 | // console.log({ type: "WebPage", url: webpage, source }); 144 | // } 145 | // }); 146 | // } 147 | 148 | // // var xhr = new XMLHttpRequest(); 149 | // // xhr.open("GET", "https://yahoo.com/", true); 150 | // // xhr.onreadystatechange = function () { 151 | // // if (xhr.readyState == 4) { 152 | // // // JSON.parse does not evaluate the attacker's scripts. 153 | // // var title = /(.*?)<\/title>/m.exec(xhr.responseText)[1]; 154 | // // console.log(title); 155 | // // } 156 | // // }; 157 | // // xhr.send(); 158 | 159 | // // chrome.runtime.onMessage.addListener( 160 | // // function(request, sender, sendResponse) { 161 | // // if (request.contentScriptQuery == "queryPrice") { 162 | // // var url = "https://another-site.com/price-query?itemId=" + 163 | // // encodeURIComponent(request.itemId); 164 | // // fetch(url) 165 | // // .then(response => response.text()) 166 | // // .then(text => parsePrice(text)) 167 | // // .then(price => sendResponse(price)) 168 | // // .catch(error => ...) 169 | // // return true; // Will respond asynchronously. 170 | // // } 171 | // // }); 172 | })(); 173 | -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/mission-control/ed84904a7788ac4b7fc1daca244d941d9adc02c2/favicon.png -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/mission-control/ed84904a7788ac4b7fc1daca244d941d9adc02c2/icon.png -------------------------------------------------------------------------------- /icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/mission-control/ed84904a7788ac4b7fc1daca244d941d9adc02c2/icon@2x.png -------------------------------------------------------------------------------- /icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/mission-control/ed84904a7788ac4b7fc1daca244d941d9adc02c2/icon@3x.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | 4 | <head> 5 | <meta charset="UTF-8"> 6 | 7 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 | <meta http-equiv="X-UA-Compatible" content="ie=edge"> 9 | <title> New Tab by Mission Control 10 | 11 | 12 | 13 | 14 | 15 | 43 | 44 | 45 | 46 | 166 | 167 | 168 | 367 | 368 | 369 |
370 | 371 |
372 | 373 | 374 | 375 | 376 | 377 | 378 | 380 | 382 | 383 | 384 | 385 | 386 | 387 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 |
398 | 399 |
400 | 401 | 402 |
403 | 404 | 405 | 406 | 407 | 430 | 431 | 432 | 433 | 434 |
436 | 437 | 438 | 439 | 440 | 441 | 447 | 448 | 449 | 453 | 454 | 455 | 456 | 457 | 458 |
459 | 460 | 461 | 462 | 463 | 464 |
465 | 466 | 467 | 468 | 470 | 471 | 472 | 473 | 474 | 712 | 713 | 715 | 716 | 717 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Mission Control - Bookmarks & Tasks", 3 | "author": "Surjith S M", 4 | "version": "1.0.0", 5 | "description": "Turn your New Tab into a Mission Control. Focus on your important tasks and organize your bookmarks.", 6 | "permissions": ["storage", "topSites", "notifications", "alarms", "contextMenus", "unlimitedStorage", "clipboardRead"], 7 | "manifest_version": 3, 8 | "short_name": "Mission Control", 9 | "host_permissions": [ 10 | "", 11 | "*://*/*" 12 | ], 13 | "background": { 14 | "service_worker": "background.js" 15 | }, 16 | "chrome_url_overrides": { 17 | "newtab": "index.html" 18 | }, 19 | "icons": { 20 | "128": "icon.png" 21 | }, 22 | "action": { 23 | "default_icon": "icon.png", 24 | "default_title": "Open Mission Control" 25 | } 26 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mission-control", 3 | "version": "1.0.0", 4 | "description": "Chrome Extension", 5 | "main": "background.js", 6 | "scripts": { 7 | "dev": "postcss ./static/css/tailwind.css -o ./static/css/style.css -w", 8 | "build": "cross-env NODE_ENV=production postcss ./static/css/tailwind.css -o ./static/css/style.css" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/surjithctly/mission-control.git" 13 | }, 14 | "keywords": [ 15 | "chrome", 16 | "extension" 17 | ], 18 | "author": "Surjith S M", 19 | "license": "ISC", 20 | "bugs": { 21 | "url": "https://github.com/surjithctly/mission-control/issues" 22 | }, 23 | "homepage": "https://github.com/surjithctly/mission-control#readme", 24 | "devDependencies": { 25 | "@tailwindcss/jit": "^0.1.17", 26 | "autoprefixer": "^10.2.5", 27 | "cross-env": "^7.0.3", 28 | "cssnano": "^4.1.11", 29 | "postcss": "^8.3.0", 30 | "postcss-cli": "^8.3.1", 31 | "tailwindcss": "^2.0.4", 32 | "vite": "^2.1.4" 33 | }, 34 | "dependencies": {} 35 | } 36 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | "@tailwindcss/jit": {}, 4 | autoprefixer: {}, 5 | [process.env.NODE_ENV === "production" ? "cssnano" : ""]: {}, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /static/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* h1.ui.center.header { 6 | margin-top: 3em; 7 | } 8 | 9 | .completed label { 10 | opacity: 0.5; 11 | text-decoration: line-through; 12 | } */ 13 | 14 | /*-----Tailwind Overrides-----*/ 15 | /* .bg-gray-100 { 16 | --bg-opacity: 1; 17 | background-color: #f7fafc; 18 | background-color: rgba(247, 250, 252, var(--bg-opacity)); 19 | } */ 20 | /*------------*/ 21 | 22 | .spinner { 23 | animation: rotate 2s linear infinite; 24 | } 25 | 26 | .spinner .path { 27 | stroke-linecap: round; 28 | animation: dash 1.5s ease-in-out infinite; 29 | } 30 | 31 | @keyframes rotate { 32 | 100% { 33 | transform: rotate(360deg); 34 | } 35 | } 36 | 37 | @keyframes dash { 38 | 0% { 39 | stroke-dasharray: 1, 150; 40 | stroke-dashoffset: 0; 41 | } 42 | 43 | 50% { 44 | stroke-dasharray: 90, 150; 45 | stroke-dashoffset: -35; 46 | } 47 | 48 | 100% { 49 | stroke-dasharray: 90, 150; 50 | stroke-dashoffset: -124; 51 | } 52 | } 53 | 54 | .check-icon { 55 | display: none; 56 | } 57 | 58 | .completed .check-icon { 59 | display: block; 60 | } 61 | 62 | .completed .task__title { 63 | text-decoration: line-through; 64 | opacity: 0.3; 65 | } 66 | 67 | .completed .checkbox { 68 | background-color: #e5e7e8; 69 | border: 0; 70 | } 71 | 72 | .scrolling-touch { 73 | -webkit-overflow-scrolling: touch !important; 74 | } 75 | 76 | .scrollbar-none { 77 | scrollbar-width: none; 78 | } 79 | 80 | .scrollbar-none::-webkit-scrollbar { 81 | display: none !important; 82 | } 83 | 84 | .scrollbar-w-2::-webkit-scrollbar { 85 | width: 0.5rem !important; 86 | height: 0.5rem !important; 87 | } 88 | 89 | .scrollbar-track-gray-lighter::-webkit-scrollbar-track { 90 | background-color: #fff !important; 91 | } 92 | 93 | .scrollbar-thumb-gray::-webkit-scrollbar-thumb { 94 | --bg-opacity: 0.5 !important; 95 | background-color: #fff !important; 96 | /* background-color: rgba(203, 213, 224, var(--bg-opacity)) !important*/ 97 | } 98 | 99 | .scrollbar-thumb-rounded::-webkit-scrollbar-thumb { 100 | border-radius: 0.25rem !important; 101 | } 102 | 103 | .h-1\/3 { 104 | height: 33.333333%; 105 | } 106 | 107 | .h-1\/2 { 108 | height: 50%; 109 | } 110 | 111 | .h-25 { 112 | height: 25rem; 113 | } 114 | 115 | .pt-05 { 116 | padding-top: 0.1rem; 117 | } 118 | 119 | .remove { 120 | display: none; 121 | } 122 | 123 | .item:hover .remove { 124 | display: block; 125 | } 126 | 127 | .card__is__dragging, 128 | .site__is__dragging { 129 | background-color: #edf2f7; 130 | } 131 | 132 | .card__is__dragging *, 133 | .site__is__dragging * { 134 | opacity: 0; 135 | } 136 | 137 | /* 138 | .js__bookmark_card::-webkit-scrollbar { 139 | opacity: 0; 140 | display: none; 141 | } */ 142 | 143 | /* .js__bookmark_card:hover::-webkit-scrollbar { 144 | opacity: 1; 145 | display: initial; 146 | } */ 147 | 148 | .disabled\:opacity-75:disabled { 149 | opacity: 0.75 !important; 150 | } 151 | 152 | .overflow__block.scrollbar-thumb-gray:hover::-webkit-scrollbar-thumb { 153 | --bg-opacity: 0.5 !important; 154 | background-color: #cbd5e0 !important; 155 | background-color: rgba(203, 213, 224, var(--bg-opacity)) !important; 156 | } 157 | 158 | .draggable-svg { 159 | top: 9px; 160 | left: -12px; 161 | } 162 | 163 | .draggable-tasks { 164 | top: 12px; 165 | left: 7px; 166 | opacity: 0; 167 | } 168 | 169 | .js__tasks_card .item:hover .draggable-tasks { 170 | opacity: 1; 171 | } 172 | 173 | .disable__hover item:hover { 174 | pointer-events: none; 175 | background: rgba(255, 255, 255, 0); 176 | } 177 | 178 | .grabbable { 179 | cursor: move; 180 | /* fallback if grab cursor is unsupported */ 181 | cursor: grab; 182 | cursor: -moz-grab; 183 | cursor: -webkit-grab; 184 | } 185 | 186 | /* (Optional) Apply a "closed-hand" cursor during drag operation. */ 187 | .grabbable:active { 188 | cursor: grabbing; 189 | cursor: -moz-grabbing; 190 | cursor: -webkit-grabbing; 191 | } 192 | 193 | .js__bookmark_card:after, 194 | .js__tasks_card:after { 195 | content: ""; 196 | width: 100%; 197 | height: 70px; 198 | position: absolute; 199 | left: 0; 200 | bottom: 0; 201 | background: linear-gradient(transparent 0, white 95%); 202 | opacity: 1; 203 | pointer-events: none; 204 | transition: all ease 0.2s; 205 | } 206 | 207 | .js__bookmark_card:hover:after, 208 | .js__tasks_card:hover:after { 209 | opacity: 0; 210 | } 211 | 212 | .card__actions { 213 | opacity: 0; 214 | transition: all ease 0.2s; 215 | } 216 | 217 | .js__bookmark_card:hover .card__actions { 218 | opacity: 1; 219 | } 220 | 221 | .js__tasks_card:hover .card__actions { 222 | opacity: 1; 223 | } 224 | 225 | /* Taks : Show Hide completed */ 226 | 227 | .hide_completed .completed { 228 | display: none; 229 | } 230 | 231 | /* Toggle */ 232 | .toggle__active { 233 | background: white; 234 | border-radius: 9999px; 235 | color: #7f9cf5; 236 | } 237 | 238 | /* SETTINGS */ 239 | .settings__is_open > a > span { 240 | display: none; 241 | } 242 | 243 | .settings__go-back { 244 | display: none; 245 | } 246 | 247 | .settings__is_open .settings__go-back { 248 | display: initial; 249 | } 250 | 251 | .max-h-25 { 252 | max-height: 25rem; 253 | } 254 | -------------------------------------------------------------------------------- /static/img/default-yellow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/mission-control/ed84904a7788ac4b7fc1daca244d941d9adc02c2/static/img/default-yellow.webp -------------------------------------------------------------------------------- /static/js/alpine.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Minified by jsDelivr using Terser v3.14.1. 3 | * Original file: /gh/alpinejs/alpine@2.3.3/dist/alpine.js 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Alpine=t()}(this,function(){"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)}return n}function n(n){for(var i=1;i{const t=u(e.name),n=t.match(a),i=t.match(/:([a-zA-Z\-:]+)/),r=t.match(/\.[^.\]]+(?=[^\]]*$)/g)||[];return{type:n?n[1]:null,value:i?i[1]:null,modifiers:r.map(e=>e.replace(".","")),expression:e.value}}).filter(e=>!t||e.type===t)}function u(e){return e.startsWith("@")?e.replace("@","x-on:"):e.startsWith(":")?e.replace(":","x-bind:"):e}function d(e,t,n=!1){if(n)return t();const i=c(e,"transition"),r=c(e,"show")[0];if(r&&r.modifiers.includes("transition")){let n=r.modifiers;if(n.includes("out")&&!n.includes("in"))return t();const i=n.includes("in")&&n.includes("out");(function(e,t,n){const i={duration:m(t,"duration",150),origin:m(t,"origin","center"),first:{opacity:0,scale:m(t,"scale",95)},second:{opacity:1,scale:100}};p(e,t,n,()=>{},i)})(e,n=i?n.filter((e,t)=>t0?function(e,t,n){const i=(t.find(e=>"enter"===e.value)||{expression:""}).expression.split(" ").filter(e=>""!==e),r=(t.find(e=>"enter-start"===e.value)||{expression:""}).expression.split(" ").filter(e=>""!==e),s=(t.find(e=>"enter-end"===e.value)||{expression:""}).expression.split(" ").filter(e=>""!==e);h(e,i,r,s,n,()=>{})}(e,i,t):t()}function f(e,t,n=!1){if(n)return t();const i=c(e,"transition"),r=c(e,"show")[0];if(r&&r.modifiers.includes("transition")){let n=r.modifiers;if(n.includes("in")&&!n.includes("out"))return t();const i=n.includes("in")&&n.includes("out");(function(e,t,n,i){const r={duration:n?m(t,"duration",150):m(t,"duration",150)/2,origin:m(t,"origin","center"),first:{opacity:1,scale:100},second:{opacity:0,scale:m(t,"scale",95)}};p(e,t,()=>{},i,r)})(e,n=i?n.filter((e,t)=>t>n.indexOf("out")):n,i,t)}else i.length>0?function(e,t,n){const i=(t.find(e=>"leave"===e.value)||{expression:""}).expression.split(" ").filter(e=>""!==e),r=(t.find(e=>"leave-start"===e.value)||{expression:""}).expression.split(" ").filter(e=>""!==e),s=(t.find(e=>"leave-end"===e.value)||{expression:""}).expression.split(" ").filter(e=>""!==e);h(e,i,r,s,()=>{},n)}(e,i,t):t()}function m(e,t,n){if(-1===e.indexOf(t))return n;const i=e[e.indexOf(t)+1];if(!i)return n;if("scale"===t&&!b(i))return n;if("duration"===t){let e=i.match(/([0-9]+)ms/);if(e)return e[1]}return"origin"===t&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[i,e[e.indexOf(t)+2]].join(" "):i}function p(e,t,n,i,r){const s=e.style.opacity,o=e.style.transform,a=e.style.transformOrigin,l=!t.includes("opacity")&&!t.includes("scale"),c=l||t.includes("opacity"),u=l||t.includes("scale"),d={start(){c&&(e.style.opacity=r.first.opacity),u&&(e.style.transform=`scale(${r.first.scale/100})`)},during(){u&&(e.style.transformOrigin=r.origin),e.style.transitionProperty=[c?"opacity":"",u?"transform":""].join(" ").trim(),e.style.transitionDuration=`${r.duration/1e3}s`,e.style.transitionTimingFunction="cubic-bezier(0.4, 0.0, 0.2, 1)"},show(){n()},end(){c&&(e.style.opacity=r.second.opacity),u&&(e.style.transform=`scale(${r.second.scale/100})`)},hide(){i()},cleanup(){c&&(e.style.opacity=s),u&&(e.style.transform=o),u&&(e.style.transformOrigin=a),e.style.transitionProperty=null,e.style.transitionDuration=null,e.style.transitionTimingFunction=null}};v(e,d)}function h(e,t,n,i,r,s){const o=e.__x_original_classes||[],a={start(){e.classList.add(...n)},during(){e.classList.add(...t)},show(){r()},end(){e.classList.remove(...n.filter(e=>!o.includes(e))),e.classList.add(...i)},hide(){s()},cleanup(){e.classList.remove(...t.filter(e=>!o.includes(e))),e.classList.remove(...i.filter(e=>!o.includes(e)))}};v(e,a)}function v(e,t){t.start(),t.during(),requestAnimationFrame(()=>{let n=1e3*Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s",""));t.show(),requestAnimationFrame(()=>{t.end(),setTimeout(()=>{t.hide(),e.isConnected&&t.cleanup()},n)})})}function b(e){return!isNaN(e)}function y(e,t,i,r,s){"template"!==t.tagName.toLowerCase()&&console.warn("Alpine: [x-for] directive should only be added to