diff --git a/src/api/components/panel.css b/src/api/components/panel.css deleted file mode 100644 index 547d484..0000000 --- a/src/api/components/panel.css +++ /dev/null @@ -1,221 +0,0 @@ -/** - * notion-enhancer: components - * (c) 2021 dragonwocky (https://dragonwocky.me/) - * (c) 2021 CloudHill (https://github.com/CloudHill) - * (https://notion-enhancer.github.io/) under the MIT license - */ - -:root { - --component--panel-width: 260px; -} - -#enhancer--panel-hover-trigger { - height: 100vh; - width: 2.5rem; - max-height: 100%; - z-index: 999; - position: absolute; - top: 45px; - right: 0; - flex-grow: 0; - flex-shrink: 0; - transition: width 300ms ease-in-out; -} -#enhancer--panel-hover-trigger[data-enhancer-panel-pinned] { - /* taking up the physical space of the panel to move topbar buttons */ - top: 0; - position: relative; - width: var(--component--panel-width); -} - -.notion-frame { - transition: padding-right 300ms ease-in-out; -} -.notion-frame[data-enhancer-panel-pinned] { - padding-right: var(--component--panel-width); -} -.notion-cursor-listener > div[style*='flex-end'] { - transition: margin-right 300ms ease-in-out; -} -.notion-cursor-listener > div[style*='flex-end'][data-enhancer-panel-pinned], -#enhancer--panel[data-enhancer-panel-pinned] + div[style*='flex-end'] { - margin-right: var(--component--panel-width); -} - -#enhancer--panel { - z-index: 999; - position: absolute; - background: var(--theme--bg_secondary); - width: var(--component--panel-width); - right: calc(-1 * var(--component--panel-width)); - opacity: 0; - height: 100vh; - flex-grow: 0; - flex-shrink: 0; - display: flex; - flex-direction: column; - transition: 300ms ease-in; - - margin-top: 5rem; - max-height: calc(100vh - 10rem); -} -#enhancer--panel-hover-trigger:hover + #enhancer--panel:not([data-enhancer-panel-pinned]), -#enhancer--panel:not([data-enhancer-panel-pinned]):hover { - opacity: 1; - transform: translateX(calc(-1 * var(--component--panel-width))); - box-shadow: var(--theme--ui_shadow, rgba(15, 15, 15, 0.05)) 0px 0px 0px 1px, - var(--theme--ui_shadow, rgba(15, 15, 15, 0.1)) 0px 3px 6px, - var(--theme--ui_shadow, rgba(15, 15, 15, 0.2)) 0px 9px 24px !important; -} -#enhancer--panel[data-enhancer-panel-pinned] { - opacity: 1; - max-height: 100%; - margin-top: 0; - transform: translateX(calc(-1 * var(--component--panel-width))); -} - -.enhancer--panel-view-title { - margin: 0; - height: 1em; - display: flex; - align-items: center; - font-size: 1.1rem; - font-weight: 600; -} -.enhancer--panel-view-title svg, -.enhancer--panel-view-title img { - height: 1em; - width: 1em; -} -.enhancer--panel-view-icon { - margin-bottom: -2px; -} -.enhancer--panel-view-title .enhancer--panel-view-title-text { - font-size: 0.9em; - margin: 0 0 0 0.75em; - padding-bottom: 0.3em; - white-space: nowrap; - overflow: hidden; -} - -#enhancer--panel-header { - font-size: 1.2rem; - font-weight: 600; - display: flex; - align-items: center; - cursor: pointer; - user-select: none; - padding: 0.75rem 0 0.75rem 1rem; - background: var(--theme--bg_secondary); -} -#enhancer--panel-header-title { - max-width: calc(100% - 4.25rem); -} -#enhancer--panel-header-title .enhancer--panel-view-title { - font-size: 1.2rem; -} -#enhancer--panel-header-title .enhancer--panel-view-title-text { - max-width: calc(100% - 1.75em); - position: relative; -} - -#enhancer--panel-switcher-overlay-container { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 999; - overflow: hidden; -} -#enhancer--panel-switcher { - max-width: 320px; - position: relative; - right: 14px; - border-radius: 3px; - padding: 8px 0; - background: var(--theme--bg_card); - box-shadow: var(--theme--ui_shadow, rgba(15, 15, 15, 0.05)) 0px 0px 0px 1px, - var(--theme--ui_shadow, rgba(15, 15, 15, 0.1)) 0px 3px 6px, - var(--theme--ui_shadow, rgba(15, 15, 15, 0.2)) 0px 9px 24px !important; - overflow: hidden; -} -.enhancer--panel-switcher-item { - display: flex; - align-items: center; - width: 100%; - padding: 8px 14px; - user-select: none; - cursor: pointer; - overflow: hidden; - position: relative; - background: var(--theme--bg_card); -} -#enhancer--panel-header:hover, -#enhancer--panel-header:focus-within, -.enhancer--panel-switcher-item:hover, -.enhancer--panel-switcher-item:focus { - background: var(--theme--ui_interactive-hover); -} -#enhancer--panel-header:active, -.enhancer--panel-switcher-item:active { - background: var(--theme--ui_interactive-active); -} - -#enhancer--panel-content { - margin: 0.75rem 1rem; - font-size: 1rem; -} -#enhancer--panel-header-switcher { - padding: 4px; -} -#enhancer--panel-header-toggle { - margin-left: auto; - padding-right: 1rem; - height: 100%; - width: 2.5em; - opacity: 0; - display: flex; -} -#enhancer--panel-header-toggle > div { - margin: auto 0 auto auto; -} -#enhancer--panel-header-switcher, -#enhancer--panel-header-toggle > div { - color: var(--theme--icon_secondary); - height: 1em; - width: 1em; - cursor: pointer; - display: flex; - flex-direction: column; - transition: 300ms ease-in-out; -} -#enhancer--panel #enhancer--panel-header-toggle svg { - transition: 300ms ease-in-out; -} -#enhancer--panel:not([data-enhancer-panel-pinned]) #enhancer--panel-header-toggle svg { - transform: rotateZ(-180deg); -} -#enhancer--panel:hover #enhancer--panel-header-toggle { - opacity: 1; -} - -#enhancer--panel-resize { - position: absolute; - left: -5px; - height: 100%; - width: 10px; -} -#enhancer--panel[data-enhancer-panel-pinned] #enhancer--panel-resize { - cursor: col-resize; -} -#enhancer--panel-resize div { - transition: background 150ms ease-in-out; - background: transparent; - width: 2px; - margin-left: 4px; - height: 100%; -} -#enhancer--panel[data-enhancer-panel-pinned] #enhancer--panel-resize:hover div { - background: var(--theme--ui_divider); -} diff --git a/src/api/components/panel.mjs b/src/api/components/panel.mjs deleted file mode 100644 index 8f82a58..0000000 --- a/src/api/components/panel.mjs +++ /dev/null @@ -1,292 +0,0 @@ -/** - * notion-enhancer: components - * (c) 2021 dragonwocky (https://dragonwocky.me/) - * (c) 2021 CloudHill (https://github.com/CloudHill) - * (https://notion-enhancer.github.io/) under the MIT license - */ - -'use strict'; - -/** shared notion-style elements */ - -import { web, components, registry } from '../index.mjs'; - -const _views = [], - svgExpand = web.raw` - - `; - -let $stylesheet, - db, - // open + close - $notionFrame, - $notionRightSidebar, - $panel, - $hoverTrigger, - // resize - $resizeHandle, - dragStartX, - dragStartWidth, - dragEventsFired, - panelWidth, - // render content - $notionApp, - $pinnedToggle, - $panelTitle, - $header, - $panelContent, - $switcher, - $switcherTrigger, - $switcherOverlayContainer; - -// open + close -const panelPinnedAttr = 'data-enhancer-panel-pinned', - isPinned = () => $panel.hasAttribute(panelPinnedAttr), - togglePanel = () => { - const $elems = [$notionFrame, $notionRightSidebar, $hoverTrigger, $panel].filter( - ($el) => $el - ); - if (isPinned()) { - closeSwitcher(); - for (const $elem of $elems) $elem.removeAttribute(panelPinnedAttr); - } else { - for (const $elem of $elems) $elem.setAttribute(panelPinnedAttr, 'true'); - } - db.set(['panel.pinned'], isPinned()); - }, - // resize - updateWidth = () => { - document.documentElement.style.setProperty('--component--panel-width', panelWidth + 'px'); - db.set(['panel.width'], panelWidth); - }, - resizeDrag = (event) => { - event.preventDefault(); - dragEventsFired = true; - panelWidth = dragStartWidth + (dragStartX - event.clientX); - if (panelWidth < 190) panelWidth = 190; - if (panelWidth > 480) panelWidth = 480; - $panel.style.width = panelWidth + 'px'; - $hoverTrigger.style.width = panelWidth + 'px'; - $notionFrame.style.paddingRight = panelWidth + 'px'; - if ($notionRightSidebar) $notionRightSidebar.style.right = panelWidth + 'px'; - }, - resizeEnd = (_event) => { - $panel.style.width = ''; - $hoverTrigger.style.width = ''; - $notionFrame.style.paddingRight = ''; - if ($notionRightSidebar) $notionRightSidebar.style.right = ''; - updateWidth(); - $resizeHandle.style.cursor = ''; - document.body.removeEventListener('mousemove', resizeDrag); - document.body.removeEventListener('mouseup', resizeEnd); - }, - resizeStart = (event) => { - dragStartX = event.clientX; - dragStartWidth = panelWidth; - $resizeHandle.style.cursor = 'auto'; - document.body.addEventListener('mousemove', resizeDrag); - document.body.addEventListener('mouseup', resizeEnd); - }, - // render content - isSwitcherOpen = () => document.body.contains($switcher), - openSwitcher = () => { - if (!isPinned()) return togglePanel(); - web.render($notionApp, $switcherOverlayContainer); - web.empty($switcher); - for (const view of _views) { - const open = $panelTitle.contains(view.$title), - $item = web.render( - web.html`
`, - web.render( - web.html``, - view.$icon.cloneNode(true), - view.$title.cloneNode(true) - ) - ); - $item.addEventListener('click', () => { - renderView(view); - db.set(['panel.open'], view.id); - }); - web.render($switcher, $item); - } - const rect = $header.getBoundingClientRect(); - web.render( - web.empty($switcherOverlayContainer), - web.render( - web.html`
`, - web.render( - web.html`
`, - $switcher - ) - ) - ); - $switcher.querySelector('[data-open]').focus(); - $switcher.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 200 }); - document.addEventListener('keydown', switcherKeyListeners); - }, - closeSwitcher = () => { - document.removeEventListener('keydown', switcherKeyListeners); - $switcher.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 200 }).onfinish = () => - $switcherOverlayContainer.remove(); - }, - switcherKeyListeners = (event) => { - if (isSwitcherOpen()) { - switch (event.key) { - case 'Escape': - closeSwitcher(); - event.stopPropagation(); - break; - case 'Enter': - document.activeElement.click(); - event.stopPropagation(); - break; - case 'ArrowUp': { - const $prev = event.target.previousElementSibling; - ($prev || event.target.parentElement.lastElementChild).focus(); - event.stopPropagation(); - break; - } - case 'ArrowDown': { - const $next = event.target.nextElementSibling; - ($next || event.target.parentElement.firstElementChild).focus(); - event.stopPropagation(); - break; - } - } - } - }, - renderView = (view) => { - const prevView = _views.find(({ $content }) => document.contains($content)); - web.render( - web.empty($panelTitle), - web.render( - web.html``, - view.$icon, - view.$title - ) - ); - view.onFocus(); - web.render(web.empty($panelContent), view.$content); - if (prevView) prevView.onBlur(); - }; - -async function createPanel() { - await web.whenReady(['.notion-frame']); - $notionFrame = document.querySelector('.notion-frame'); - - $panel = web.html`
`; - $hoverTrigger = web.html`
`; - $resizeHandle = web.html`
`; - $panelTitle = web.html`
`; - $header = web.render(web.html`
`, $panelTitle); - $panelContent = web.html`
`; - $switcher = web.html`
`; - $switcherTrigger = web.html`
- ${svgExpand} -
`; - $switcherOverlayContainer = web.html`
`; - - const notionRightSidebarSelector = '.notion-cursor-listener > div[style*="flex-end"]', - detectRightSidebar = () => { - if (!document.contains($notionRightSidebar)) { - $notionRightSidebar = document.querySelector(notionRightSidebarSelector); - if (isPinned() && $notionRightSidebar) { - $notionRightSidebar.setAttribute(panelPinnedAttr, 'true'); - } - } - }; - $notionRightSidebar = document.querySelector(notionRightSidebarSelector); - web.addDocumentObserver(detectRightSidebar, [notionRightSidebarSelector]); - - if (await db.get(['panel.pinned'])) togglePanel(); - web.addHotkeyListener(await db.get(['panel.hotkey']), togglePanel); - $pinnedToggle.addEventListener('click', (event) => { - event.stopPropagation(); - togglePanel(); - }); - web.render( - $panel, - web.render($header, $panelTitle, $switcherTrigger, $pinnedToggle), - $panelContent, - $resizeHandle - ); - - await enablePanelResize(); - await createViews(); - - const cursorListenerSelector = - '.notion-cursor-listener > .notion-sidebar-container ~ [style^="position: absolute"]'; - await web.whenReady([cursorListenerSelector]); - document.querySelector(cursorListenerSelector).before($hoverTrigger, $panel); -} - -async function enablePanelResize() { - panelWidth = await db.get(['panel.width'], 240); - updateWidth(); - $resizeHandle.addEventListener('mousedown', resizeStart); - $resizeHandle.addEventListener('click', () => { - if (dragEventsFired) { - dragEventsFired = false; - } else togglePanel(); - }); -} - -function createViews() { - $notionApp = document.querySelector('.notion-app-inner'); - $header.addEventListener('click', openSwitcher); - $switcherTrigger.addEventListener('click', openSwitcher); - $switcherOverlayContainer.addEventListener('click', closeSwitcher); -} - -/** - * adds a view to the enhancer's side panel - * @param {object} panel - information used to construct and render the panel - * @param {string} panel.id - a uuid, used to restore the last open view on reload - * @param {string} panel.icon - an svg string - * @param {string} panel.title - the name of the view - * @param {Element} panel.$content - an element containing the content of the view - * @param {function} panel.onBlur - runs when the view is selected/focused - * @param {function} panel.onFocus - runs when the view is unfocused/closed - */ -export const addPanelView = async ({ - id, - icon, - title, - $content, - onFocus = () => {}, - onBlur = () => {}, -}) => { - if (!$stylesheet) { - $stylesheet = web.loadStylesheet('api/components/panel.css'); - } - - if (!db) db = await registry.db('36a2ffc9-27ff-480e-84a7-c7700a7d232d'); - if (!$pinnedToggle) { - $pinnedToggle = web.html`
- ${await components.feather('chevrons-right')} -
`; - } - - const view = { - id, - $icon: web.render( - web.html``, - icon instanceof Element ? icon : web.html`${icon}` - ), - $title: web.render(web.html``, title), - $content, - onFocus, - onBlur, - }; - _views.push(view); - if (_views.length === 1) await createPanel(); - if (_views.length === 1 || (await db.get(['panel.open'])) === id) renderView(view); -}; diff --git a/src/api/components/corner-action.css b/src/archive/corner-action.css similarity index 100% rename from src/api/components/corner-action.css rename to src/archive/corner-action.css diff --git a/src/api/components/corner-action.mjs b/src/archive/corner-action.mjs similarity index 100% rename from src/api/components/corner-action.mjs rename to src/archive/corner-action.mjs diff --git a/src/shared/notion.js b/src/archive/notion.js similarity index 100% rename from src/shared/notion.js rename to src/archive/notion.js