diff --git a/extension/api/env.mjs b/extension/api/env.mjs index 7d90ae4..71d8355 100644 --- a/extension/api/env.mjs +++ b/extension/api/env.mjs @@ -42,7 +42,7 @@ export const reloadTabs = () => chrome.runtime.sendMessage({ action: 'reloadTabs /** a notification displayed when the menu is opened for the first time */ export const welcomeNotification = { id: '84e2d49b-c3dc-44b4-a154-cf589676bfa0', - color: 'blue', + // color: 'blue', icon: 'message-circle', message: 'Welcome! Come chat with us on Discord.', link: 'https://discord.gg/sFWPXtA', diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.js b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.js index ae163cb..4de605a 100644 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.js +++ b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.js @@ -9,8 +9,6 @@ const _id = 'a6621988-551d-495a-97d8-3c568bca2e9e'; import { env, storage, web, fmt, fs, registry, regexers } from '../../api/_.mjs'; -document.querySelector('img[data-notion]').addEventListener('click', env.focusNotion); - import * as router from './router.js'; const components = {}; diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.mjs b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.mjs index 850cde0..afb4a1b 100644 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.mjs +++ b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/menu.mjs @@ -24,7 +24,8 @@ const mapColorVariables = (color) => ({ setup({ preflight: { - body: apply`px-4 py-3 bg-notion-bg font-sans`, + html: apply`w-full h-full`, + body: apply`w-full h-full bg-notion-bg font-sans text-foreground`, }, theme: { fontFamily: { @@ -91,7 +92,7 @@ document.addEventListener('visibilitychange', loadTheme); loadTheme(); const notifications = { - $container: web.html`
`, + $container: web.html`
`, cache: await db.get(['notifications'], []), provider: [ env.welcomeNotification, @@ -99,7 +100,9 @@ const notifications = { ], add({ icon, message, id = undefined, color = undefined, link = undefined }) { const style = tw`p-2 ${ - color ? `bg-${color}-tag text-${color}-tag-text` : 'bg-notion-popup text-foreground' + color + ? `bg-${color}-tag text-${color}-tag-text border border-${color}-text hover:bg-${color}-text` + : 'bg-notion-popup text-foreground hover:bg-interactive-hover border border-notion-divider' } flex items-center rounded-full mt-3 shadow-md cursor-pointer`, $notification = web.render( link @@ -143,3 +146,57 @@ if (errors.length) { color: 'red', }); } + +// mod config + +const $container = web.html`
`, + $nav = web.html``, + $main = web.html`
abc
`, + $footer = web.html``, + $sidebar = web.html`
`; + +const $notion = web.html`

+ ${(await fs.getText('icon/colour.svg')).replace( + /width="\d+" height="\d+"/, + `class="${tw`h-6 w-6 mr-3`}"` + )} + notion-enhancer +

`; +$notion.children[0].addEventListener('click', env.focusNotion); + +const navItemStyle = tw`px-3 py-2 rounded-md text-sm font-medium bg-interactive hover:bg-interactive-hover`, + selectedNavItemStyle = tw`px-3 py-2 rounded-md text-sm font-medium ring-1 ring-notion-divider bg-notion-secondary`; + +const $extensionsNavItem = web.html`extensions`, + $themesNavItem = web.html`themes`, + $supportNavItem = web.html`support`; + +web.render( + document.body, + web.render( + $container, + web.render( + web.html`
`, + web.render($nav, $notion, $extensionsNavItem, $themesNavItem, $supportNavItem), + $main, + $footer + ), + $sidebar + ) +); + +import * as router from './router.mjs'; + +router.addView('extensions', () => { + $themesNavItem.className = navItemStyle; + $extensionsNavItem.className = selectedNavItemStyle; + web.empty($main); + web.render($main, 123); +}); +router.addView('themes', () => { + $extensionsNavItem.className = navItemStyle; + $themesNavItem.className = selectedNavItemStyle; + web.empty($main); + web.render($main, 456); +}); +router.listen('extensions', $main); diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/router.js b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/router.js deleted file mode 100644 index 229be2e..0000000 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/router.js +++ /dev/null @@ -1,102 +0,0 @@ -/* - * notion-enhancer core: menu - * (c) 2021 dragonwocky (https://dragonwocky.me/) - * (https://notion-enhancer.github.io/) under the MIT license - */ - -'use strict'; - -import { web } from '../../api/_.mjs'; - -export const getSearch = () => - new Map( - location.search - .slice(1) - .split('&') - .map((query) => query.split('=')) - ); - -let defaultView = ''; -const views = new Map(), - filters = new Map(); - -export function setDefaultView(name) { - defaultView = name; -} -export function addView(name, loader, filter = () => {}) { - views.set(name, loader); - filters.set(name, filter); -} -export function removeView(name) { - views.delete(name); - filters.delete(name); -} - -function router(event) { - event.preventDefault(); - const anchor = event.path.find((anchor) => anchor.nodeName === 'A'); - if (location.search !== anchor.getAttribute('href')) { - window.history.pushState( - { search: anchor.getAttribute('href'), hash: '' }, - '', - anchor.href - ); - load(); - } -} -function navigator(event) { - event.preventDefault(); - const anchor = event.path.find((anchor) => anchor.nodeName === 'A'), - hash = anchor.getAttribute('href').slice(1); - document.getElementById(hash).scrollIntoView(true); - document.documentElement.scrollTop = 0; - history.replaceState({ search: location.search, hash }, null, `#${hash}`); -} - -export async function load(force = false) { - const $container = document.querySelector('main'), - search = getSearch(), - fallbackView = () => { - window.history.replaceState( - { search: `?view=${defaultView}`, hash: '' }, - null, - `?view=${defaultView}` - ); - return load(); - }; - if (force || !search.get('view') || document.body.dataset.view !== search.get('view')) { - if (views.get(search.get('view'))) { - const $body = await (views.get(search.get('view')) || (() => void 0))(); - if ($body) { - $container.style.opacity = 0; - await new Promise((res, rej) => - setTimeout(() => { - document.body.dataset.view = search.get('view'); - $container.innerHTML = ''; - $container.append($body); - requestAnimationFrame(() => { - $container.style.opacity = ''; - setTimeout(res, 200); - }); - }, 200) - ); - } else return fallbackView(); - } else return fallbackView(); - } - if (filters.get(search.get('view'))) filters.get(search.get('view'))(search); -} -window.addEventListener('popstate', (event) => { - if (event.state) load(); - document.getElementById(location.hash.slice(1))?.scrollIntoView(true); - document.documentElement.scrollTop = 0; -}); -web.addDocumentObserver((mutation) => { - mutation.target.querySelectorAll('a[href^="?"]').forEach((a) => { - a.removeEventListener('click', router); - a.addEventListener('click', router); - }); - mutation.target.querySelectorAll('a[href^="#"]').forEach((a) => { - a.removeEventListener('click', navigator); - a.addEventListener('click', navigator); - }); -}); diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/router.mjs b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/router.mjs new file mode 100644 index 0000000..2575fb9 --- /dev/null +++ b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/router.mjs @@ -0,0 +1,80 @@ +/* + * notion-enhancer core: menu + * (c) 2021 dragonwocky (https://dragonwocky.me/) + * (https://notion-enhancer.github.io/) under the MIT license + */ + +'use strict'; + +import { web } from '../../api/_.mjs'; + +export const queryParams = () => new URLSearchParams(window.location.search); + +let _defaultView = '', + $viewRoot; +const _views = new Map(); + +export function addView(name, loadFunc) { + _views.set(name, loadFunc); +} +export function removeView(name) { + _views.delete(name); +} + +function router(event) { + event.preventDefault(); + const anchor = event.path.find((anchor) => anchor.nodeName === 'A'); + if (location.search !== anchor.getAttribute('href')) { + window.history.pushState(null, null, anchor.href); + listen(); + } +} +function navigator(event) { + event.preventDefault(); + const anchor = event.path.find((anchor) => anchor.nodeName === 'A'), + hash = anchor.getAttribute('href').slice(1); + document.getElementById(hash).scrollIntoView(true); + document.documentElement.scrollTop = 0; + history.replaceState({ search: location.search, hash }, null, `#${hash}`); +} + +export async function listen(defaultView = null, $elem = null) { + if (defaultView) _defaultView = defaultView; + if ($elem) $viewRoot = $elem; + if (!$viewRoot) throw new Error('no view root set.'); + if (!_defaultView) throw new Error('no view root set.'); + + const query = queryParams(), + fallbackView = () => { + window.history.replaceState(null, null, `?view=${_defaultView}`); + return listen(); + }; + if (!query.get('view') || document.body.dataset.view !== query.get('view')) { + if (_views.get(query.get('view'))) { + $viewRoot.style.opacity = 0; + const loadFunc = _views.get(query.get('view'))(); + setTimeout(async () => { + await loadFunc; + requestAnimationFrame(() => { + $viewRoot.style.opacity = ''; + }); + }, 200); + } else return fallbackView(); + } else return fallbackView(); +} + +window.addEventListener('popstate', (event) => { + if (event.state) listen(); + document.getElementById(location.hash.slice(1))?.scrollIntoView(true); + document.documentElement.scrollTop = 0; +}); +web.addDocumentObserver((mutation) => { + mutation.target.querySelectorAll('a[href^="?"]').forEach((a) => { + a.removeEventListener('click', router); + a.addEventListener('click', router); + }); + mutation.target.querySelectorAll('a[href^="#"]').forEach((a) => { + a.removeEventListener('click', navigator); + a.addEventListener('click', navigator); + }); +});