From 37c9cb8c0d589aba7550939142425af00b7761a1 Mon Sep 17 00:00:00 2001 From: Anthony Cossins <1451668+anthonyec@users.noreply.github.com> Date: Wed, 19 Apr 2023 18:39:03 +0800 Subject: [PATCH 01/20] Support loading SVG from files --- webpack.config.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index e4355cf..8715f16 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,12 +10,13 @@ module.exports = { devtool: 'cheap-module-source-map', entry: { popup: './src/popup/index.js', - background: './src/background/index.js' + background: './src/background/index.js', + content: './src/content/index.js', }, output: { path: path.resolve(__dirname, 'dist'), filename: '[name].bundle.js', - chunkFilename: '[name].[contenthash:5].chunk.js' + chunkFilename: '[name].[contenthash:5].chunk.js', }, optimization: { chunkIds: 'named', @@ -41,6 +42,10 @@ module.exports = { { test: /\.css$/, use: [MiniCssExtractPlugin.loader, 'css-loader'] + }, + { + test: /\.svg/, + type: 'asset/inline', } ] }, From dc80df27f0e9e9f42d6903aab66f17a08f0b4245 Mon Sep 17 00:00:00 2001 From: Anthony Cossins <1451668+anthonyec@users.noreply.github.com> Date: Wed, 19 Apr 2023 18:39:10 +0800 Subject: [PATCH 02/20] Start adding content script --- src/content/add_icon.svg | 1 + src/content/create_shadow_dom.js | 21 +++++++++ src/content/index.js | 73 ++++++++++++++++++++++++++++++++ src/manifest.json | 4 ++ 4 files changed, 99 insertions(+) create mode 100644 src/content/add_icon.svg create mode 100644 src/content/create_shadow_dom.js create mode 100644 src/content/index.js diff --git a/src/content/add_icon.svg b/src/content/add_icon.svg new file mode 100644 index 0000000..b8fb459 --- /dev/null +++ b/src/content/add_icon.svg @@ -0,0 +1 @@ + diff --git a/src/content/create_shadow_dom.js b/src/content/create_shadow_dom.js new file mode 100644 index 0000000..627fb72 --- /dev/null +++ b/src/content/create_shadow_dom.js @@ -0,0 +1,21 @@ +export function createShadowDom() { + const shadowElement = document.createElement('div'); + + shadowElement.style.background = "none"; + shadowElement.style.border = "none"; + shadowElement.style.outline = "none"; + shadowElement.style.boxShadow = "none"; + shadowElement.style.margin = "0"; + shadowElement.style.padding = "0"; + shadowElement.style.position = "absolute"; + shadowElement.style.top = "0"; + shadowElement.style.left = "0"; + shadowElement.style.transform = "none"; + shadowElement.style.zIndex = "2147483647"; + shadowElement.style.width = "100%"; + shadowElement.style.height = "0"; + + document.body.appendChild(shadowElement); + + return shadowElement.attachShadow({ mode: "open" }); +} diff --git a/src/content/index.js b/src/content/index.js new file mode 100644 index 0000000..bb52290 --- /dev/null +++ b/src/content/index.js @@ -0,0 +1,73 @@ +import { createShadowDom } from './create_shadow_dom'; +import addIcon from './add_icon.svg'; + +const ADD_REMOVE_BUTTON_ID = "powerlet-add-remove-button" + +const shadow = createShadowDom(); +const scripts = document.querySelectorAll('[href*="javascript:"]'); + +const style = document.createElement('style'); + +style.innerHTML = ` + #${ADD_REMOVE_BUTTON_ID} { + color: white; + background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); + border-radius: 13.5px; + border: none; + cursor: pointer; + display: flex; + align-items: center; + padding: 5px 10px; + padding-right: 14px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-size: 15px; + font-weight: 500; + position: absolute; + top: 10px; + left: 10px; + gap: 5px; + } +`; + +const button = document.createElement("button"); +const icon = document.createElement('img'); + +icon.src = addIcon; + +button.id = ADD_REMOVE_BUTTON_ID; +button.textContent = "Add Bookmarklet"; + +button.prepend(icon); +shadow.appendChild(style); +shadow.appendChild(button); + +// Array.from(scripts).forEach((script) => { +// const href = script.getAttribute('href'); + +// script.addEventListener('mouseenter', () => { +// const existingAddRemoveButton = document.getElementById(ADD_REMOVE_BUTTON_ID); + +// if (existingAddRemoveButton) { +// document.body.removeChild(existingAddRemoveButton); +// } + +// const rect = script.getBoundingClientRect(); +// const button = document.createElement("button"); + +// button.id = ADD_REMOVE_BUTTON_ID; +// button.style.border = "none"; +// button.style.background = "#D86299" +// button.style.borderRadius = "8px"; +// button.style.fontFamily = "sans-serif"; +// button.style.padding = "2px 4px"; +// button.style.margin = "0"; +// button.style.color = "white"; +// button.style.left = `${rect.x + rect.width}px`; +// button.style.top = `${rect.y - rect.height}px`; +// button.style.position = "fixed"; +// button.textContent = "+ Add to Powerlet" + +// shadow.appendChild(button); +// }); +// }); + diff --git a/src/manifest.json b/src/manifest.json index 355afe4..bf1ca4d 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -9,6 +9,10 @@ "scripts": ["background.bundle.js"], "persistent": false }, + "content_scripts": [{ + "js": ["content.bundle.js"], + "matches": ["http://*/*", "https://*/*"] + }], "browser_action": { "default_popup": "popup.html", "default_icon": { From f1600dddc5c47bc4184603c07a9d266b9493089d Mon Sep 17 00:00:00 2001 From: Anthony Cossins <1451668+anthonyec@users.noreply.github.com> Date: Wed, 19 Apr 2023 22:25:44 +0800 Subject: [PATCH 03/20] Add button styles --- ...dow_dom.js => create_shadow_dom_inside.js} | 10 +- src/content/index.js | 114 +++++++++--------- 2 files changed, 63 insertions(+), 61 deletions(-) rename src/content/{create_shadow_dom.js => create_shadow_dom_inside.js} (68%) diff --git a/src/content/create_shadow_dom.js b/src/content/create_shadow_dom_inside.js similarity index 68% rename from src/content/create_shadow_dom.js rename to src/content/create_shadow_dom_inside.js index 627fb72..d9077c0 100644 --- a/src/content/create_shadow_dom.js +++ b/src/content/create_shadow_dom_inside.js @@ -1,4 +1,4 @@ -export function createShadowDom() { +export function createShadowDomInside(target) { const shadowElement = document.createElement('div'); shadowElement.style.background = "none"; @@ -7,15 +7,17 @@ export function createShadowDom() { shadowElement.style.boxShadow = "none"; shadowElement.style.margin = "0"; shadowElement.style.padding = "0"; - shadowElement.style.position = "absolute"; shadowElement.style.top = "0"; shadowElement.style.left = "0"; shadowElement.style.transform = "none"; shadowElement.style.zIndex = "2147483647"; - shadowElement.style.width = "100%"; + shadowElement.style.width = "0"; shadowElement.style.height = "0"; + shadowElement.style.minWidth = "0"; + shadowElement.style.minHeight = "0"; + shadowElement.style.display = "inline-block"; - document.body.appendChild(shadowElement); + target.appendChild(shadowElement); return shadowElement.attachShadow({ mode: "open" }); } diff --git a/src/content/index.js b/src/content/index.js index bb52290..541887e 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -1,73 +1,73 @@ -import { createShadowDom } from './create_shadow_dom'; +import { createShadowDomInside } from './create_shadow_dom_inside'; import addIcon from './add_icon.svg'; -const ADD_REMOVE_BUTTON_ID = "powerlet-add-remove-button" +const BUTTON_ID = "powerlet-add-remove-button" +const LABEL_ID = "powerlet-add-remove-button__label" -const shadow = createShadowDom(); -const scripts = document.querySelectorAll('[href*="javascript:"]'); +const scripts = document.body.querySelectorAll('[href*="javascript:"]'); -const style = document.createElement('style'); +Array.from(scripts).forEach((script) => { + const shadow = createShadowDomInside(script); + const style = document.createElement('style'); -style.innerHTML = ` - #${ADD_REMOVE_BUTTON_ID} { - color: white; - background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); - border-radius: 13.5px; - border: none; - cursor: pointer; - display: flex; - align-items: center; - padding: 5px 10px; - padding-right: 14px; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; - font-size: 15px; - font-weight: 500; - position: absolute; - top: 10px; - left: 10px; - gap: 5px; - } -`; + const button = document.createElement('button'); + const icon = document.createElement('img'); + const label = document.createElement('span'); -const button = document.createElement("button"); -const icon = document.createElement('img'); + icon.src = addIcon; -icon.src = addIcon; + button.id = BUTTON_ID; + button.style.position = "relative"; -button.id = ADD_REMOVE_BUTTON_ID; -button.textContent = "Add Bookmarklet"; + label.id = LABEL_ID; + label.textContent = "Add Bookmarklet"; -button.prepend(icon); -shadow.appendChild(style); -shadow.appendChild(button); + style.innerHTML = ` + #${BUTTON_ID} { + color: white; + background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); + border-radius: 13.5px; + border: none; + cursor: pointer; + display: flex; + align-items: center; + padding: 5px; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-size: 15px; + font-weight: 500; + position: absolute; + width: 27px; + height: 27px; + transform: translateY(-50%); + transition: all; + gap: 5px; + } -// Array.from(scripts).forEach((script) => { -// const href = script.getAttribute('href'); + #${BUTTON_ID} img { + flex-shrink: 0; + } -// script.addEventListener('mouseenter', () => { -// const existingAddRemoveButton = document.getElementById(ADD_REMOVE_BUTTON_ID); + #${BUTTON_ID}:hover { + width: min-content; + } -// if (existingAddRemoveButton) { -// document.body.removeChild(existingAddRemoveButton); -// } + #${LABEL_ID} { + margin-right: 3px; + white-space: nowrap; + opacity: 0; + visibility: hidden; + } -// const rect = script.getBoundingClientRect(); -// const button = document.createElement("button"); + #${BUTTON_ID}:hover #${LABEL_ID} { + opacity: 1; + visibility: visible; + } + `; -// button.id = ADD_REMOVE_BUTTON_ID; -// button.style.border = "none"; -// button.style.background = "#D86299" -// button.style.borderRadius = "8px"; -// button.style.fontFamily = "sans-serif"; -// button.style.padding = "2px 4px"; -// button.style.margin = "0"; -// button.style.color = "white"; -// button.style.left = `${rect.x + rect.width}px`; -// button.style.top = `${rect.y - rect.height}px`; -// button.style.position = "fixed"; -// button.textContent = "+ Add to Powerlet" + button.append(icon); + button.append(label); -// shadow.appendChild(button); -// }); -// }); + shadow.appendChild(style); + shadow.appendChild(button); +}); From af8c894b49e229ec3706c0a88a3856e95d550811 Mon Sep 17 00:00:00 2001 From: Anthony Cossins <1451668+anthonyec@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:36:00 +0800 Subject: [PATCH 04/20] Add adding functionality --- src/background/index.js | 7 +++ src/content/add_icon.svg | 4 +- src/content/create_shadow_dom_inside.js | 1 + src/content/index.js | 79 +++++++++++++++++-------- 4 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/background/index.js b/src/background/index.js index 6142148..3dfaae9 100644 --- a/src/background/index.js +++ b/src/background/index.js @@ -4,3 +4,10 @@ const renderIcon = createIconRenderer(); setInterval(renderIcon, 1000); renderIcon(); + +chrome.runtime.onMessage.addListener((message) => { + chrome.bookmarks.create({ + title: message.payload.title, + url: message.payload.url + }); +}); diff --git a/src/content/add_icon.svg b/src/content/add_icon.svg index b8fb459..b493266 100644 --- a/src/content/add_icon.svg +++ b/src/content/add_icon.svg @@ -1 +1,3 @@ - + diff --git a/src/content/create_shadow_dom_inside.js b/src/content/create_shadow_dom_inside.js index d9077c0..8d56183 100644 --- a/src/content/create_shadow_dom_inside.js +++ b/src/content/create_shadow_dom_inside.js @@ -15,6 +15,7 @@ export function createShadowDomInside(target) { shadowElement.style.height = "0"; shadowElement.style.minWidth = "0"; shadowElement.style.minHeight = "0"; + shadowElement.style.position = "relative"; shadowElement.style.display = "inline-block"; target.appendChild(shadowElement); diff --git a/src/content/index.js b/src/content/index.js index 541887e..6d79e19 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -1,29 +1,54 @@ import { createShadowDomInside } from './create_shadow_dom_inside'; + import addIcon from './add_icon.svg'; -const BUTTON_ID = "powerlet-add-remove-button" -const LABEL_ID = "powerlet-add-remove-button__label" +const POWERLET_BUTTON = "powerlet-button" +const MANAGE_BUTTON = "manage-button" +const LABEL_ID = "add-remove-button__label" const scripts = document.body.querySelectorAll('[href*="javascript:"]'); Array.from(scripts).forEach((script) => { + const title = script.textContent; const shadow = createShadowDomInside(script); const style = document.createElement('style'); + const powerletButton = document.createElement('button'); + const powerletIcon = document.createElement('img'); const button = document.createElement('button'); const icon = document.createElement('img'); const label = document.createElement('span'); - icon.src = addIcon; + powerletButton.classList.add(POWERLET_BUTTON); - button.id = BUTTON_ID; - button.style.position = "relative"; + button.classList.add(MANAGE_BUTTON); - label.id = LABEL_ID; + label.classList.add(LABEL_ID); label.textContent = "Add Bookmarklet"; + powerletIcon.src = addIcon; + icon.src = addIcon; + style.innerHTML = ` - #${BUTTON_ID} { + .${POWERLET_BUTTON} { + background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); + border-radius: 100px; + border: none; + cursor: pointer; + display: flex; + width: 19px; + height: 19px; + align-items: center; + justify-content: center; + position: absolute; + transform: translateY(-100%); + } + + .${POWERLET_BUTTON}:hover ~ .${MANAGE_BUTTON} { + visibility: visible; + } + + .${MANAGE_BUTTON} { color: white; background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); border-radius: 13.5px; @@ -36,38 +61,44 @@ Array.from(scripts).forEach((script) => { font-size: 15px; font-weight: 500; position: absolute; - width: 27px; - height: 27px; - transform: translateY(-50%); - transition: all; + transform: translateY(-100%); + top: 0; + left: 0; gap: 5px; + visibility: hidden; } - #${BUTTON_ID} img { - flex-shrink: 0; + .${MANAGE_BUTTON}:hover { + visibility: visible; } - #${BUTTON_ID}:hover { - width: min-content; + .${MANAGE_BUTTON} img { + flex-shrink: 0; } - #${LABEL_ID} { - margin-right: 3px; + .${LABEL_ID} { + margin-right: 4px; white-space: nowrap; - opacity: 0; - visibility: hidden; - } - - #${BUTTON_ID}:hover #${LABEL_ID} { - opacity: 1; - visibility: visible; } `; + button.addEventListener('click', (event) => { + event.preventDefault(); + event.stopPropagation(); + + chrome.runtime.sendMessage({ action: "create_bookmark", payload: { + title, + url: script.getAttribute('href'), + }}); + }); + + powerletButton.append(powerletIcon); + button.append(icon); button.append(label); shadow.appendChild(style); + shadow.appendChild(powerletButton); shadow.appendChild(button); }); From f36e856e6a08c4c8e7fd46018bdff3c185263074 Mon Sep 17 00:00:00 2001 From: Anthony Cossins <1451668+anthonyec@users.noreply.github.com> Date: Wed, 19 Apr 2023 23:36:07 +0800 Subject: [PATCH 05/20] Format --- src/content/create_shadow_dom_inside.js | 34 ++++++++++++------------- src/content/index.js | 20 ++++++++------- src/manifest.json | 10 +++++--- webpack.config.js | 6 ++--- 4 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/content/create_shadow_dom_inside.js b/src/content/create_shadow_dom_inside.js index 8d56183..e4b09dd 100644 --- a/src/content/create_shadow_dom_inside.js +++ b/src/content/create_shadow_dom_inside.js @@ -1,24 +1,24 @@ export function createShadowDomInside(target) { const shadowElement = document.createElement('div'); - shadowElement.style.background = "none"; - shadowElement.style.border = "none"; - shadowElement.style.outline = "none"; - shadowElement.style.boxShadow = "none"; - shadowElement.style.margin = "0"; - shadowElement.style.padding = "0"; - shadowElement.style.top = "0"; - shadowElement.style.left = "0"; - shadowElement.style.transform = "none"; - shadowElement.style.zIndex = "2147483647"; - shadowElement.style.width = "0"; - shadowElement.style.height = "0"; - shadowElement.style.minWidth = "0"; - shadowElement.style.minHeight = "0"; - shadowElement.style.position = "relative"; - shadowElement.style.display = "inline-block"; + shadowElement.style.background = 'none'; + shadowElement.style.border = 'none'; + shadowElement.style.outline = 'none'; + shadowElement.style.boxShadow = 'none'; + shadowElement.style.margin = '0'; + shadowElement.style.padding = '0'; + shadowElement.style.top = '0'; + shadowElement.style.left = '0'; + shadowElement.style.transform = 'none'; + shadowElement.style.zIndex = '2147483647'; + shadowElement.style.width = '0'; + shadowElement.style.height = '0'; + shadowElement.style.minWidth = '0'; + shadowElement.style.minHeight = '0'; + shadowElement.style.position = 'relative'; + shadowElement.style.display = 'inline-block'; target.appendChild(shadowElement); - return shadowElement.attachShadow({ mode: "open" }); + return shadowElement.attachShadow({ mode: 'open' }); } diff --git a/src/content/index.js b/src/content/index.js index 6d79e19..3d4a9a3 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -2,9 +2,9 @@ import { createShadowDomInside } from './create_shadow_dom_inside'; import addIcon from './add_icon.svg'; -const POWERLET_BUTTON = "powerlet-button" -const MANAGE_BUTTON = "manage-button" -const LABEL_ID = "add-remove-button__label" +const POWERLET_BUTTON = 'powerlet-button'; +const MANAGE_BUTTON = 'manage-button'; +const LABEL_ID = 'add-remove-button__label'; const scripts = document.body.querySelectorAll('[href*="javascript:"]'); @@ -24,7 +24,7 @@ Array.from(scripts).forEach((script) => { button.classList.add(MANAGE_BUTTON); label.classList.add(LABEL_ID); - label.textContent = "Add Bookmarklet"; + label.textContent = 'Add Bookmarklet'; powerletIcon.src = addIcon; icon.src = addIcon; @@ -86,10 +86,13 @@ Array.from(scripts).forEach((script) => { event.preventDefault(); event.stopPropagation(); - chrome.runtime.sendMessage({ action: "create_bookmark", payload: { - title, - url: script.getAttribute('href'), - }}); + chrome.runtime.sendMessage({ + action: 'create_bookmark', + payload: { + title, + url: script.getAttribute('href') + } + }); }); powerletButton.append(powerletIcon); @@ -101,4 +104,3 @@ Array.from(scripts).forEach((script) => { shadow.appendChild(powerletButton); shadow.appendChild(button); }); - diff --git a/src/manifest.json b/src/manifest.json index bf1ca4d..e08a132 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -9,10 +9,12 @@ "scripts": ["background.bundle.js"], "persistent": false }, - "content_scripts": [{ - "js": ["content.bundle.js"], - "matches": ["http://*/*", "https://*/*"] - }], + "content_scripts": [ + { + "js": ["content.bundle.js"], + "matches": ["http://*/*", "https://*/*"] + } + ], "browser_action": { "default_popup": "popup.html", "default_icon": { diff --git a/webpack.config.js b/webpack.config.js index 8715f16..fb236da 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,12 +11,12 @@ module.exports = { entry: { popup: './src/popup/index.js', background: './src/background/index.js', - content: './src/content/index.js', + content: './src/content/index.js' }, output: { path: path.resolve(__dirname, 'dist'), filename: '[name].bundle.js', - chunkFilename: '[name].[contenthash:5].chunk.js', + chunkFilename: '[name].[contenthash:5].chunk.js' }, optimization: { chunkIds: 'named', @@ -45,7 +45,7 @@ module.exports = { }, { test: /\.svg/, - type: 'asset/inline', + type: 'asset/inline' } ] }, From 3e881f9a5903436826469082632cfe5ef7fc81fb Mon Sep 17 00:00:00 2001 From: Anthony Cossins <1451668+anthonyec@users.noreply.github.com> Date: Thu, 20 Apr 2023 16:59:49 +0800 Subject: [PATCH 06/20] Add content script to example page --- src/content/check_icon.svg | 1 + src/content/index.js | 83 ++++++++++++++++++++------------------ src/pages/examples.html | 2 +- src/pages/examples.js | 2 + webpack.config.js | 3 +- 5 files changed, 50 insertions(+), 41 deletions(-) create mode 100644 src/content/check_icon.svg diff --git a/src/content/check_icon.svg b/src/content/check_icon.svg new file mode 100644 index 0000000..fddb0af --- /dev/null +++ b/src/content/check_icon.svg @@ -0,0 +1 @@ + diff --git a/src/content/index.js b/src/content/index.js index 3d4a9a3..4b09892 100644 --- a/src/content/index.js +++ b/src/content/index.js @@ -1,10 +1,11 @@ import { createShadowDomInside } from './create_shadow_dom_inside'; import addIcon from './add_icon.svg'; +import checkIcon from './check_icon.svg'; -const POWERLET_BUTTON = 'powerlet-button'; -const MANAGE_BUTTON = 'manage-button'; -const LABEL_ID = 'add-remove-button__label'; +const CONTAINER_CLASS_NAME = 'powerlet-button'; +const MANAGE_BUTTON_CLASS_NAME = 'manage-button'; +const LABEL_CLASS_NAME = 'add-remove-button__label'; const scripts = document.body.querySelectorAll('[href*="javascript:"]'); @@ -13,72 +14,74 @@ Array.from(scripts).forEach((script) => { const shadow = createShadowDomInside(script); const style = document.createElement('style'); - const powerletButton = document.createElement('button'); - const powerletIcon = document.createElement('img'); + const container = document.createElement('div'); const button = document.createElement('button'); const icon = document.createElement('img'); const label = document.createElement('span'); - powerletButton.classList.add(POWERLET_BUTTON); + container.classList.add(CONTAINER_CLASS_NAME); + button.classList.add(MANAGE_BUTTON_CLASS_NAME); - button.classList.add(MANAGE_BUTTON); - - label.classList.add(LABEL_ID); + label.classList.add(LABEL_CLASS_NAME); label.textContent = 'Add Bookmarklet'; - powerletIcon.src = addIcon; icon.src = addIcon; style.innerHTML = ` - .${POWERLET_BUTTON} { - background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); - border-radius: 100px; - border: none; - cursor: pointer; - display: flex; - width: 19px; - height: 19px; - align-items: center; - justify-content: center; + .${CONTAINER_CLASS_NAME} { + width: 28px; + height: 28px; position: absolute; - transform: translateY(-100%); + transform: translate(-30%, -100%); + top: 50%; + left: 50%; } - .${POWERLET_BUTTON}:hover ~ .${MANAGE_BUTTON} { - visibility: visible; + .${CONTAINER_CLASS_NAME}:hover .${MANAGE_BUTTON_CLASS_NAME} { + padding: 5px; + width: auto; + height: auto; + transform: translate(-12.5px, -50%); } - .${MANAGE_BUTTON} { + .${CONTAINER_CLASS_NAME}:hover .${LABEL_CLASS_NAME} { + display: block; + } + + .${MANAGE_BUTTON_CLASS_NAME} { color: white; background-image: linear-gradient(-30deg, #D86299 0%, #A449D6 100%); - border-radius: 13.5px; + border-radius: 100px; border: none; cursor: pointer; display: flex; align-items: center; - padding: 5px; + justify-content: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; font-size: 15px; font-weight: 500; position: absolute; - transform: translateY(-100%); - top: 0; - left: 0; + top: 50%; + left: 50%; + transform: translate(-9px, -50%); gap: 5px; - visibility: hidden; + + width: 19px; + height: 19px; } - .${MANAGE_BUTTON}:hover { - visibility: visible; + .${MANAGE_BUTTON_CLASS_NAME}--added { + background: green; } - .${MANAGE_BUTTON} img { + .${MANAGE_BUTTON_CLASS_NAME} img { flex-shrink: 0; } - .${LABEL_ID} { + .${LABEL_CLASS_NAME} { margin-right: 4px; white-space: nowrap; + display: none; } `; @@ -89,18 +92,20 @@ Array.from(scripts).forEach((script) => { chrome.runtime.sendMessage({ action: 'create_bookmark', payload: { - title, + title: title.trim(), url: script.getAttribute('href') } }); - }); - powerletButton.append(powerletIcon); + label.textContent = 'Added!'; + button.classList.add(`${MANAGE_BUTTON_CLASS_NAME}--added`); + icon.src = checkIcon; + }); button.append(icon); button.append(label); + container.append(button); shadow.appendChild(style); - shadow.appendChild(powerletButton); - shadow.appendChild(button); + shadow.appendChild(container); }); diff --git a/src/pages/examples.html b/src/pages/examples.html index 2d5c533..92a0c6a 100644 --- a/src/pages/examples.html +++ b/src/pages/examples.html @@ -103,6 +103,6 @@