diff --git a/apps/actors/lib/LinkHandlerParent.sys.mjs b/apps/actors/lib/LinkHandlerParent.sys.mjs
index 1c0ba31..2c6eb90 100644
--- a/apps/actors/lib/LinkHandlerParent.sys.mjs
+++ b/apps/actors/lib/LinkHandlerParent.sys.mjs
@@ -8,14 +8,15 @@
export class LinkHandlerParent extends JSWindowActorParent {
/** @param {{ name: 'Link:SetIcon'; data: { iconURL: string } }} aMsg */
receiveMessage(aMsg) {
+ /** @type {Window} */
const win = this.browsingContext.topChromeWindow
switch (aMsg.name) {
case 'Link:SetIcon':
- return win.windowApi.tabs.setIcon(
- this.browsingContext.embedderElement,
- aMsg.data.iconURL,
- )
+ return win.eventBus.emit('iconUpdate', {
+ browserId: this.browsingContext.embedderElement.browserId,
+ iconUrl: aMsg.data.iconURL,
+ })
}
}
}
diff --git a/apps/actors/lib/ThemeMetaChild.sys.mjs b/apps/actors/lib/ThemeMetaChild.sys.mjs
new file mode 100644
index 0000000..d90c1bf
--- /dev/null
+++ b/apps/actors/lib/ThemeMetaChild.sys.mjs
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @ts-check
+///
+
+/**
+ * @typedef {object} CurrentPageColors
+ * @property {string} [meta]
+ * @property {string} [body]
+ */
+
+export class ThemeMetaChild extends JSWindowActorChild {
+ /** @type {CurrentPageColors} */
+ currentColorOptions = {}
+
+ /**
+ * @param {DOMMetaAddedEvent|DOMMetaChangedEvent} event
+ */
+ handleMetaEvent(event) {
+ const { target } = event
+
+ if (target.name === 'theme-color') {
+ this.currentColorOptions.meta =
+ target.getAttribute('content') || undefined
+
+ this.sendUpdatedThemeColors()
+ }
+ }
+
+ /**
+ * @param {PageShowEvent} event
+ */
+ handlePageLoad(event) {
+ const document = event.target
+ this.currentColorOptions.body =
+ this.getHeaderColor(document.body, document.body) || undefined
+
+ this.sendUpdatedThemeColors()
+ }
+
+ /**
+ * @param {HTMLElement} element
+ * @param {HTMLElement} body
+ * @returns {string | null}
+ */
+ getHeaderColor(element, body) {
+ if (!element.getBoundingClientRect) {
+ return null
+ }
+
+ if (element != body && element.getBoundingClientRect().y != 0) {
+ return null
+ }
+
+ let elementColor = null
+
+ if (element.firstChild) {
+ elementColor = this.getHeaderColor(element.firstChild, body)
+ }
+
+ if (!elementColor) {
+ elementColor = this.contentWindow.getComputedStyle(element).background
+ if (
+ elementColor.toLowerCase() == 'none' ||
+ elementColor.toLowerCase() == 'transperent'
+ ) {
+ return null
+ }
+ }
+
+ return elementColor
+ }
+
+ sendUpdatedThemeColors() {
+ this.sendAsyncMessage('Theme:ColorsUpdated', this.currentColorOptions)
+ }
+
+ /**
+ * @param {PageShowEvent | DOMMetaAddedEvent | DOMMetaChangedEvent} event
+ */
+ handleEvent(event) {
+ switch (event.type) {
+ case 'DOMMetaAdded':
+ case 'DOMMetaChanged':
+ return this.handleMetaEvent(event)
+ case 'pageshow':
+ return this.handlePageLoad(event)
+ }
+ }
+}
diff --git a/apps/actors/lib/ThemeMetaParent.sys.mjs b/apps/actors/lib/ThemeMetaParent.sys.mjs
new file mode 100644
index 0000000..692956c
--- /dev/null
+++ b/apps/actors/lib/ThemeMetaParent.sys.mjs
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @ts-check
+///
+
+export class ThemeMetaParent extends JSWindowActorParent {
+ receiveMessage(aMsg) {
+ /** @type {Window} */
+ const win = this.browsingContext.topChromeWindow
+
+ if (aMsg.name === 'Theme:ColorsUpdated') {
+ win.eventBus.emit('themeUpdate', {
+ ...aMsg.data,
+ browserId: this.browsingContext.embedderElement.browserId,
+ })
+ }
+ }
+}
diff --git a/apps/content/package.json b/apps/content/package.json
index dc71cf6..40d4942 100644
--- a/apps/content/package.json
+++ b/apps/content/package.json
@@ -12,17 +12,17 @@
"license": "ISC",
"devDependencies": {
"@browser/link": "workspace:*",
- "@melt-ui/pp": "^0.3.0",
"@total-typescript/ts-reset": "^0.5.1",
"@tsconfig/svelte": "^5.0.2",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.8.1",
+ "gecko-types": "github:quark-platform/gecko-types",
"html-webpack-plugin": "^5.6.0",
"mini-css-extract-plugin": "^2.7.6",
"postcss-loader": "^7.3.4",
"style-loader": "^3.3.3",
- "svelte": "^4.2.8",
- "svelte-loader": "^3.1.9",
+ "svelte": "^4.2.12",
+ "svelte-loader": "^3.2.0",
"svelte-preprocess": "^5.1.3",
"svelte-sequential-preprocessor": "^2.0.1",
"ts-loader": "^9.5.1",
@@ -33,14 +33,15 @@
"webpack-license-plugin": "^4.4.2"
},
"dependencies": {
+ "@amadeus-it-group/tansu": "^1.0.0",
"@catppuccin/palette": "^1.0.1",
- "@experiment/shared": "workspace:*",
- "@melt-ui/svelte": "^0.67.0",
+ "colorjs.io": "^0.5.0",
"fnts": "^2.1.0",
"mitt": "^3.0.1",
"nanoid": "^5.0.4",
"remixicon": "^4.0.1",
"snarkdown": "^2.0.0",
+ "svelte-remixicon": "^2.4.0",
"zora": "^5.2.0"
}
}
diff --git a/apps/content/patches/@melt-ui__svelte@0.64.5.patch b/apps/content/patches/@melt-ui__svelte@0.64.5.patch
deleted file mode 100644
index c09e07a..0000000
--- a/apps/content/patches/@melt-ui__svelte@0.64.5.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/package.json b/package.json
-index 9b7faa1b796b3fd8ac90b3364450f57896d866c0..b852ad9188adb271ad2b3b07b2e61bbb6ff124a0 100644
---- a/package.json
-+++ b/package.json
-@@ -7,7 +7,8 @@
- "exports": {
- ".": {
- "types": "./dist/index.d.ts",
-- "svelte": "./dist/index.js"
-+ "svelte": "./dist/index.js",
-+ "import": "./dist/index.js"
- },
- "./internal/*": {
- "types": "./dist/internal/*/index.d.ts",
-@@ -130,7 +131,6 @@
- "svelte": "./dist/index.js",
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
-- "type": "module",
- "packageManager": "pnpm@8.6.3",
- "scripts": {
- "dev": "vite dev",
diff --git a/apps/content/src/bookmarks/Bookmarks.svelte b/apps/content/src/bookmarks/Bookmarks.svelte
deleted file mode 100644
index 6d16001..0000000
--- a/apps/content/src/bookmarks/Bookmarks.svelte
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
- {#await $fullTree}
-
Loading...
- {:then tree}
-
-
- {#if selectedBookmark}
-
{
- selectedBookmarkId = undefined
- selectedBookmark = undefined
- }}
- />
- {/if}
- {/await}
-
-
-
diff --git a/apps/content/src/browser/components/customizableUI/index.ts b/apps/content/src/bookmarks/bookmarks.js
similarity index 100%
rename from apps/content/src/browser/components/customizableUI/index.ts
rename to apps/content/src/bookmarks/bookmarks.js
diff --git a/apps/content/src/bookmarks/bookmarks.ts b/apps/content/src/bookmarks/bookmarks.ts
deleted file mode 100644
index ef5c124..0000000
--- a/apps/content/src/bookmarks/bookmarks.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import 'remixicon/fonts/remixicon.css'
-
-import '@shared/styles/window.css'
-
-import App from './Bookmarks.svelte'
-
-new App({ target: document.body })
diff --git a/apps/content/src/bookmarks/components/BookmarkEditor.svelte b/apps/content/src/bookmarks/components/BookmarkEditor.svelte
deleted file mode 100644
index 97b55cd..0000000
--- a/apps/content/src/bookmarks/components/BookmarkEditor.svelte
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
- Title
-
- {#if url}
- URL
- {/if}
-
- {
- remove(id)
- .then(() => getFullTree())
- .then((ft) => {
- fullTree.set(new Promise((res) => res(ft)))
- dispatch('delete')
- })
- }}>Delete
-
-
-
diff --git a/apps/content/src/bookmarks/components/BookmarkItem.svelte b/apps/content/src/bookmarks/components/BookmarkItem.svelte
deleted file mode 100644
index 521f803..0000000
--- a/apps/content/src/bookmarks/components/BookmarkItem.svelte
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
- {
- opened = !opened
- selectedBookmark = node.id
- }}
- aria-selected={selectedBookmark == node.id}
->
-
-
-
-
- {#if node.type === 'folder'}
-
- {:else if node.type === 'bookmark'}
-
- {:else if node.type === 'separator'}
-
- {/if}
-
-
{node.title}
-
-
-
- {#each node.children || [] as child}
-
- {/each}
-
-
-
diff --git a/apps/content/src/bookmarks/components/BookmarkTree.svelte b/apps/content/src/bookmarks/components/BookmarkTree.svelte
deleted file mode 100644
index 8ff4558..0000000
--- a/apps/content/src/bookmarks/components/BookmarkTree.svelte
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
- {#each tree as node}
-
- {/each}
-
-
-
diff --git a/apps/content/src/browser/Browser.svelte b/apps/content/src/browser/Browser.svelte
deleted file mode 100644
index 2018fbc..0000000
--- a/apps/content/src/browser/Browser.svelte
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-{#if currentTab}
-
-{/if}
-
-
-
-
-
-
diff --git a/apps/content/src/browser/BrowserWindow.svelte b/apps/content/src/browser/BrowserWindow.svelte
new file mode 100644
index 0000000..b29b6c4
--- /dev/null
+++ b/apps/content/src/browser/BrowserWindow.svelte
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+ {#each tabs as tab (tab.view.windowBrowserId)}
+
+ {/each}
+
+
+
+
diff --git a/apps/content/src/browser/browser.css b/apps/content/src/browser/browser.css
index 4c1e1bc..ba1defa 100644
--- a/apps/content/src/browser/browser.css
+++ b/apps/content/src/browser/browser.css
@@ -2,7 +2,22 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+* {
+ box-sizing: border-box;
+}
+
+:root {
+ /* These are google's default theme colors, but I like them */
+ --theme-fg: oklch(90% 0.006 270);
+ --theme-bg: oklch(25% 0.006 270);
+ --theme-active: oklch(30% 0.006 270);
+}
+
body {
height: 100vh;
- overflow: hidden;
+ max-height: 100vh;
+ margin: 0;
+
+ display: flex;
+ flex-direction: column;
}
diff --git a/apps/content/src/browser/browser.js b/apps/content/src/browser/browser.js
new file mode 100644
index 0000000..a42b5bd
--- /dev/null
+++ b/apps/content/src/browser/browser.js
@@ -0,0 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+import BrowserWindow from './BrowserWindow.svelte'
+import './browser.css'
+import { registerEventBus } from './windowApi/eventBus.js'
+
+registerEventBus()
+
+new BrowserWindow({ target: document.body })
diff --git a/apps/content/src/browser/browser.ts b/apps/content/src/browser/browser.ts
deleted file mode 100644
index 2550675..0000000
--- a/apps/content/src/browser/browser.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-///
-import 'remixicon/fonts/remixicon.css'
-
-import '@shared/styles/window.css'
-
-import App from './Browser.svelte'
-import './browser.css'
-import { initializeShortcuts } from './lib/shortcuts'
-import { initializeWindow } from './lib/window'
-import './lib/window/api'
-
-// TODO: WTF is this and do we care
-// This needs setting up before we create the first remote browser.
-// window.docShell.treeOwner
-// .QueryInterface(Ci.nsIInterfaceRequestor)
-// .getInterface(Ci.nsIAppWindow).XULBrowserWindow = window.XULBrowserWindow
-//window.browserDOMWindow = new nsBrowserAccess()
-
-initializeWindow(window.arguments && window.arguments[0])
-
-new App({
- target: document.body,
-})
-
-setTimeout(() => {
- initializeShortcuts()
-}, 1)
diff --git a/apps/content/src/browser/lib/resources.ts b/apps/content/src/browser/browserImports.js
similarity index 61%
rename from apps/content/src/browser/lib/resources.ts
rename to apps/content/src/browser/browserImports.js
index af87056..9bc0499 100644
--- a/apps/content/src/browser/lib/resources.ts
+++ b/apps/content/src/browser/browserImports.js
@@ -1,15 +1,13 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { lazyESModuleGetters } from '../../shared/TypedImportUtilities'
+// @ts-check
+import { lazyESModuleGetters } from '../shared/lazy.js'
-/*eslint sort-keys: "error"*/
-
-export const resource = lazyESModuleGetters({
+export const browserImports = lazyESModuleGetters({
+ AppConstants: 'resource://gre/modules/AppConstants.sys.mjs',
E10SUtils: 'resource://gre/modules/E10SUtils.sys.mjs',
EPageActions: 'resource://app/modules/EPageActions.sys.mjs',
NetUtil: 'resource://gre/modules/NetUtil.sys.mjs',
PageThumbs: 'resource://gre/modules/PageThumbs.sys.mjs',
- WindowTracker: 'resource://app/modules/BrowserWindowTracker.sys.mjs',
- ZoomStore: 'resource://app/modules/ZoomStore.sys.mjs',
})
diff --git a/apps/content/src/browser/components/Browser.svelte b/apps/content/src/browser/components/Browser.svelte
deleted file mode 100644
index ca5ecd6..0000000
--- a/apps/content/src/browser/components/Browser.svelte
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/browser/components/HamburgurMenu.svelte b/apps/content/src/browser/components/HamburgurMenu.svelte
new file mode 100644
index 0000000..155ba5d
--- /dev/null
+++ b/apps/content/src/browser/components/HamburgurMenu.svelte
@@ -0,0 +1,76 @@
+
+
+
+
+
+
(dropdownVisible = !dropdownVisible)}>
+
+
+
+
+ close(lazy.BrowserToolboxLauncher.init())}
+ >Open devtools
+ close(window.location.reload())}>Reload
+
+
+
+
diff --git a/apps/content/src/browser/components/PageAction.svelte b/apps/content/src/browser/components/PageAction.svelte
new file mode 100644
index 0000000..1cc455e
--- /dev/null
+++ b/apps/content/src/browser/components/PageAction.svelte
@@ -0,0 +1,68 @@
+
+
+
+
+
+ {#if $icons}
+
+ {:else}
+
+ {/if}
+
+
+{#if pageAction.popupUrl}
+
+{/if}
+
+
diff --git a/apps/content/src/browser/components/Tab.svelte b/apps/content/src/browser/components/Tab.svelte
new file mode 100644
index 0000000..87acbe7
--- /dev/null
+++ b/apps/content/src/browser/components/Tab.svelte
@@ -0,0 +1,267 @@
+
+
+
+
+
+ {
+ if (event.ctrlKey) {
+ addSelectedTabs([view.windowBrowserId])
+ return
+ }
+
+ if (event.shiftKey) {
+ const thisIndex = $windowTabs.findIndex(
+ (tab) => tab.view.windowBrowserId === view.windowBrowserId,
+ )
+ const activeIndex = $windowTabs.findIndex(
+ (tab) => tab.view.windowBrowserId === $activeTabId,
+ )
+
+ const tabsToSelect = $windowTabs
+ .filter(
+ (_, index) =>
+ (thisIndex >= index && index >= activeIndex) ||
+ (thisIndex <= index && index <= activeIndex),
+ )
+ .map((tab) => tab.view.windowBrowserId)
+ addSelectedTabs(tabsToSelect)
+ return
+ }
+
+ if ($activeTabId == view.windowBrowserId) {
+ return
+ }
+
+ if ($selectedTabIds.includes(view.windowBrowserId)) {
+ const oldActiveId = $activeTabId
+ activeTabId.set(view.windowBrowserId)
+ selectedTabIds.set([...$selectedTabIds, oldActiveId])
+ return
+ }
+
+ selectedTabIds.set([])
+ activeTabId.set(view.windowBrowserId)
+ }}
+ on:keydown={(e) => {
+ const tabs = windowTabs()
+ const tabIndex = tabs.findIndex(
+ (value) => value.view.windowBrowserId === view.windowBrowserId,
+ )
+ let nextIndex = tabIndex
+
+ if (e.key == 'Backspace' || e.key == 'Backspace') {
+ nextIndex = closeSelected()
+ }
+
+ if (e.key == 'ArrowDown' || e.key == 'ArrowRight') {
+ nextIndex = nextTab(nextIndex, tabs)
+ }
+
+ if (e.key == 'ArrowUp' || e.key == 'ArrowLeft') {
+ nextIndex = prevTab(nextIndex, tabs)
+ }
+
+ if (nextIndex != tabIndex) {
+ document.getElementById(`tab-${nextIndex}`)?.focus()
+ }
+ }}
+ >
+
+ {$pageTitle}
+
+
+
+ closeSelected()}
+ >
+
+
+
+
diff --git a/apps/content/src/browser/components/Tabs.svelte b/apps/content/src/browser/components/Tabs.svelte
new file mode 100644
index 0000000..309ce66
--- /dev/null
+++ b/apps/content/src/browser/components/Tabs.svelte
@@ -0,0 +1,68 @@
+
+
+
+
+
+ {#each $windowTabs as tab, index (tab.view.windowBrowserId)}
+
+ {/each}
+
+
+ {
+ const newTab = {
+ kind: 'website',
+ view: WebsiteViewApi.create(
+ browserImports.NetUtil.newURI('https://google.com'),
+ ),
+ }
+
+ windowTabs.update((tabs) => [...tabs, newTab])
+ activeTabId.set(newTab.view.windowBrowserId)
+ }}>New Tab
+
+
+
diff --git a/apps/content/src/browser/components/ToolbarButton.svelte b/apps/content/src/browser/components/ToolbarButton.svelte
new file mode 100644
index 0000000..aa8aa81
--- /dev/null
+++ b/apps/content/src/browser/components/ToolbarButton.svelte
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/Browser.svelte b/apps/content/src/browser/components/ToolbarSpacer.svelte
similarity index 71%
rename from apps/content/src/settings/components/pref/CustomizableUI/Components/Browser.svelte
rename to apps/content/src/browser/components/ToolbarSpacer.svelte
index 34222da..a73f688 100644
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/Browser.svelte
+++ b/apps/content/src/browser/components/ToolbarSpacer.svelte
@@ -2,10 +2,10 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-Browser Content
+
diff --git a/apps/content/src/browser/components/UrlBox.svelte b/apps/content/src/browser/components/UrlBox.svelte
new file mode 100644
index 0000000..ff95e3a
--- /dev/null
+++ b/apps/content/src/browser/components/UrlBox.svelte
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+ {#if $humanSecurity.has('broken')}
+
+ {:else if $humanSecurity.has('insecure')}
+
+ {:else if $humanSecurity.has('secure')}
+
+ {:else}
+
+ {/if}
+
+
+
(inputFocused = true)}
+ on:blur={() => (inputFocused = false)}
+ on:input={() => userValue.set(input?.value || '')}
+ on:keydown={(e) => {
+ if (e.key === 'ArrowDown') {
+ e.preventDefault()
+ return (activeIndex += 1)
+ }
+ if (e.key === 'ArrowUp') {
+ e.preventDefault()
+ return (activeIndex -= 1)
+ }
+ if (e.key === 'Home') {
+ e.preventDefault()
+ return (activeIndex = 0)
+ }
+ if (e.key === 'End') {
+ e.preventDefault()
+ return (activeIndex =
+ fastAutocomplete.length + $slowAutocomplete.length - 1)
+ }
+ if (e.key === 'Enter') {
+ e.preventDefault()
+ selectCompletion(
+ fastAutocomplete[activeIndex] ||
+ $slowAutocomplete[activeIndex - fastAutocomplete.length],
+ )
+ return
+ }
+ }}
+ aria-autocomplete="list"
+ aria-controls="completions"
+ />
+
+ {#each $pageActions as [_, pageAction]}
+
+ {/each}
+
+
+ {#each fastAutocomplete as result, index}
+
+ {result.display}
+
+ {/each}
+
+ {#if $slowAutocomplete.length != 0}
+
Suggestions
+ {/if}
+
+ {#each $slowAutocomplete as result, index}
+ {@const itemIndex = index + fastAutocomplete.length}
+
+
+ {result.display}
+
+ {/each}
+
+
+
+
diff --git a/apps/content/src/browser/components/UrlBoxButton.svelte b/apps/content/src/browser/components/UrlBoxButton.svelte
new file mode 100644
index 0000000..4836a8d
--- /dev/null
+++ b/apps/content/src/browser/components/UrlBoxButton.svelte
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
diff --git a/apps/content/src/browser/components/WebsiteView.svelte b/apps/content/src/browser/components/WebsiteView.svelte
new file mode 100644
index 0000000..51f013b
--- /dev/null
+++ b/apps/content/src/browser/components/WebsiteView.svelte
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+ view.browser.goBack()}
+ disabled={!$canGoBack}
+ >
+
+
+ view.browser.reload()}>
+
+
+ view.browser.goForward()}
+ disabled={!$canGoForward}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/content/src/browser/components/customizableUI/Block.svelte b/apps/content/src/browser/components/customizableUI/Block.svelte
deleted file mode 100644
index fb6e50a..0000000
--- a/apps/content/src/browser/components/customizableUI/Block.svelte
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
- {#each component.content as child}
-
- {/each}
-
diff --git a/apps/content/src/browser/components/customizableUI/BrowserView.svelte b/apps/content/src/browser/components/customizableUI/BrowserView.svelte
deleted file mode 100644
index 4448e5c..0000000
--- a/apps/content/src/browser/components/customizableUI/BrowserView.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
- {#each sortedBrowers as tab (tab.getId())}
-
- {/each}
-
diff --git a/apps/content/src/browser/components/customizableUI/CustomizableUI.svelte b/apps/content/src/browser/components/customizableUI/CustomizableUI.svelte
deleted file mode 100644
index 55882ae..0000000
--- a/apps/content/src/browser/components/customizableUI/CustomizableUI.svelte
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-{#if component.type === 'block'}
-
-{:else if component.type === 'icon'}
-
-{:else if component.type === 'spacer'}
-
-{:else if component.type === 'browser'}
-
-{:else if component.type === 'omnibox'}
-
-{:else if component.type === 'tabs'}
-
-{/if}
diff --git a/apps/content/src/browser/components/customizableUI/IconButton.svelte b/apps/content/src/browser/components/customizableUI/IconButton.svelte
deleted file mode 100644
index d0186ea..0000000
--- a/apps/content/src/browser/components/customizableUI/IconButton.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
- component.action(tab, button)}
- >
-
-
-
diff --git a/apps/content/src/browser/components/customizableUI/OmniboxContainer.svelte b/apps/content/src/browser/components/customizableUI/OmniboxContainer.svelte
deleted file mode 100644
index 50c9dd2..0000000
--- a/apps/content/src/browser/components/customizableUI/OmniboxContainer.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/browser/components/customizableUI/Spacer.svelte b/apps/content/src/browser/components/customizableUI/Spacer.svelte
deleted file mode 100644
index 61810fb..0000000
--- a/apps/content/src/browser/components/customizableUI/Spacer.svelte
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
diff --git a/apps/content/src/browser/components/customizableUI/Tabs.svelte b/apps/content/src/browser/components/customizableUI/Tabs.svelte
deleted file mode 100644
index e759cde..0000000
--- a/apps/content/src/browser/components/customizableUI/Tabs.svelte
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-
-
- e.preventDefault()}>
-
- {#each $tabs as tab (tab.getId())}
-
- {/each}
-
- {#if !overflow}
- openTab()}>
-
-
- {/if}
-
-
- {#if overflow}
- openTab()}>
-
-
- {/if}
-
-
-
diff --git a/apps/content/src/browser/components/customizableUI/UIItemBase.svelte b/apps/content/src/browser/components/customizableUI/UIItemBase.svelte
deleted file mode 100644
index 72700a1..0000000
--- a/apps/content/src/browser/components/customizableUI/UIItemBase.svelte
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/content/src/browser/components/keybindings/Keybinding.svelte b/apps/content/src/browser/components/keybindings/Keybinding.svelte
deleted file mode 100644
index bf02194..0000000
--- a/apps/content/src/browser/components/keybindings/Keybinding.svelte
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
diff --git a/apps/content/src/browser/components/keybindings/Keybindings.svelte b/apps/content/src/browser/components/keybindings/Keybindings.svelte
deleted file mode 100644
index c84f07a..0000000
--- a/apps/content/src/browser/components/keybindings/Keybindings.svelte
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
- initDevTools()}
- />
- window.location.reload()}
- />
-
-
- window.windowApi.window.new()}
- />
- openTab()} />
- runOnCurrentTab(closeTab)}
- />
- runOnCurrentTab((tab) => tab.reload())}
- />
- setCurrentTabIndex(getCurrentTabIndex() + 1)}
- />
- setCurrentTabIndex(getCurrentTabIndex() - 1)}
- />
-
-
- runOnCurrentTab((tab) => tab.zoom.update((zoom) => zoom + 0.1))}
- />
-
- runOnCurrentTab((tab) => tab.zoom.update((zoom) => zoom - 0.1))}
- />
- runOnCurrentTab((tab) => tab.zoom.set(1))}
- />
-
- {#each [1, 2, 3, 4, 5, 6, 7, 8] as tabNum}
- setCurrentTabIndex(tabNum - 1)}
- />
- {/each}
- runOnCurrentTab((tab) => tab.showFindBar())}
- />
-
diff --git a/apps/content/src/browser/components/menus/BrowserContextMenu.svelte b/apps/content/src/browser/components/menus/BrowserContextMenu.svelte
deleted file mode 100644
index c15d16a..0000000
--- a/apps/content/src/browser/components/menus/BrowserContextMenu.svelte
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/browser/components/menus/HamburgerMenu/HamburgerMenu.svelte b/apps/content/src/browser/components/menus/HamburgerMenu/HamburgerMenu.svelte
deleted file mode 100644
index 59c638b..0000000
--- a/apps/content/src/browser/components/menus/HamburgerMenu/HamburgerMenu.svelte
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/browser/components/menus/HamburgerMenu/HamburgerMenuItem.svelte b/apps/content/src/browser/components/menus/HamburgerMenu/HamburgerMenuItem.svelte
deleted file mode 100644
index 51d2773..0000000
--- a/apps/content/src/browser/components/menus/HamburgerMenu/HamburgerMenuItem.svelte
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/browser/components/menus/index.ts b/apps/content/src/browser/components/menus/index.ts
deleted file mode 100644
index 09cc653..0000000
--- a/apps/content/src/browser/components/menus/index.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import BrowserContextMenu from './BrowserContextMenu.svelte'
-import HamburgerMenu from './HamburgerMenu/HamburgerMenu.svelte'
-
-/**
- * @param target The target element to open at
- * @param anchor Information about the anchor point {@link https://udn.realityripple.com/docs/Archive/Mozilla/XUL/PopupGuide/Positioning}
- */
-export const openHamburgerMenu = (target: HTMLElement, anchor: string) =>
- (document.getElementById('hamburgerMenu') as XULPanel | null)?.openPopup(
- target,
- anchor,
- )
-
-export { BrowserContextMenu, HamburgerMenu }
diff --git a/apps/content/src/browser/components/omnibox/Bookmarks.svelte b/apps/content/src/browser/components/omnibox/Bookmarks.svelte
deleted file mode 100644
index e9f9271..0000000
--- a/apps/content/src/browser/components/omnibox/Bookmarks.svelte
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
Add bookmark
-
-
Name
-
-
Tags
-
-
- {#if $bookmarkInfo}
- Delete
- Update
- {:else}
- panel.hidePopup()}>
- Cancel
-
- Create
- {/if}
-
-
-
-
-
diff --git a/apps/content/src/browser/components/omnibox/Omnibox.svelte b/apps/content/src/browser/components/omnibox/Omnibox.svelte
deleted file mode 100644
index 8cce5b6..0000000
--- a/apps/content/src/browser/components/omnibox/Omnibox.svelte
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
-
-
-
-
-
- {#each suggestions as suggestion, index}
-
-
{
- tab.goToUri(resource.NetUtil.newURI(suggestion.url))
- focusedOmnibox.set(false)
- }}
- >
- {suggestion.title}
-
- {/each}
-
-
-
-
-
diff --git a/apps/content/src/browser/components/omnibox/PageAction.svelte b/apps/content/src/browser/components/omnibox/PageAction.svelte
deleted file mode 100644
index beb3673..0000000
--- a/apps/content/src/browser/components/omnibox/PageAction.svelte
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
- {#if $icons}
-
- {:else}
-
- {/if}
-
-
-{#if pageAction.popupUrl}
-
-{/if}
-
-
diff --git a/apps/content/src/browser/components/omnibox/ZoomDisplay.svelte b/apps/content/src/browser/components/omnibox/ZoomDisplay.svelte
deleted file mode 100644
index 07c8deb..0000000
--- a/apps/content/src/browser/components/omnibox/ZoomDisplay.svelte
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-{#if zoom != 1}
-
- {Math.round(zoom * 100)}%
-
-{/if}
-
-
diff --git a/apps/content/src/browser/components/pageAction.js b/apps/content/src/browser/components/pageAction.js
new file mode 100644
index 0000000..311233c
--- /dev/null
+++ b/apps/content/src/browser/components/pageAction.js
@@ -0,0 +1,243 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+import { writable } from '@amadeus-it-group/tansu'
+import { readable } from 'svelte/store'
+
+import { browserImports } from '../browserImports.js'
+import { createBrowser } from '../utils/browserElement.js'
+
+/**
+ * @typedef {object} PageActionUiInternals
+ * @property {import('resource://app/modules/EPageActions.sys.mjs').PageActionImpl} pageAction
+ * @property {XULBrowserElement | null} browser
+ * @property {MessageReceiver} [messageReceiver]
+ * @property {import('@amadeus-it-group/tansu').WritableSignal} panel
+ * @property {import('@amadeus-it-group/tansu').WritableSignal} trigger
+ */
+
+/**
+ * @param {import('resource://app/modules/EPageActions.sys.mjs').PageActionImpl} pageAction
+ * @returns {PageActionUiInternals}
+ */
+export function setup(pageAction) {
+ const view = {
+ pageAction,
+ browser: null,
+
+ panel: writable(undefined),
+ trigger: writable(undefined),
+ }
+
+ view.messageReceiver = new MessageReceiver(view)
+
+ return view
+}
+
+/**
+ * @param {PageActionUiInternals} view
+ */
+export function getIcons(view) {
+ return readable(
+ view.pageAction.icons,
+ /** @type {import('svelte/store').StartStopNotifier | undefined>} */ (
+ set,
+ ) => {
+ view.pageAction.events.on('updateIcon', set)
+ return () => view.pageAction.events.off('updateIcon', set)
+ },
+ )
+}
+
+/**
+ * @param {PageActionUiInternals} view
+ */
+export function handleClick(view) {
+ /**
+ * @param {MouseEvent} event
+ */
+ return async (event) => {
+ // Send the event to the extension
+ view.pageAction.events.emit('click', {
+ clickData: {
+ modifiers: clickModifiersFromEvent(event),
+ button: event.button,
+ },
+ })
+
+ await buildPanelBrowser(view)
+ // Panel may not exist if there is no popupUrl
+ const panel = view.panel()
+ if (view.panel()) {
+ panel.openPopup(view.trigger(), 'bottomright topright')
+ }
+ }
+}
+
+/**
+ * @param {PageActionUiInternals} view
+ */
+export function cleanup(view) {
+ if (view.browser && view.messageReceiver) {
+ view.browser.messageManager.removeMessageListener(
+ 'Extension:BrowserResized',
+ view.messageReceiver,
+ )
+ view.browser.remove()
+ }
+}
+
+/**
+ * @param {PageActionUiInternals} view
+ */
+function setupBrowser(view) {
+ const { browser, messageReceiver } = view
+ if (!browser) {
+ console.error(
+ 'Tried setting up browser for pageAction view without a browser',
+ view,
+ )
+ return
+ }
+
+ if (!messageReceiver) {
+ console.error(
+ "For some reason pageAction view's messageReceiver was not initialzied??????",
+ view,
+ )
+ return
+ }
+
+ browser.messageManager.addMessageListener(
+ 'Extension:BrowserResized',
+ messageReceiver,
+ )
+
+ browser.messageManager.loadFrameScript(
+ 'chrome://extensions/content/ext-browser-content.js',
+ false,
+ true,
+ )
+
+ browser.messageManager.sendAsyncMessage('Extension:InitBrowser', {
+ allowScriptsToClose: true,
+ maxWidth: 800,
+ maxHeight: 600,
+ })
+}
+
+const spinLock = (/** @type {() => any} */ predicate) => {
+ if (predicate()) return
+
+ return new Promise((res) => {
+ const interval = setInterval(() => {
+ if (predicate()) {
+ clearInterval(interval)
+ res(null)
+ }
+ }, 1)
+ })
+}
+
+/**
+ * @param {PageActionUiInternals} view
+ */
+function initialized(view) {
+ view.browser?.docShell
+ return spinLock(() => view.browser?.mInitialized)
+}
+
+/**
+ * @param {PageActionUiInternals} view
+ */
+async function buildPanelBrowser(view) {
+ if (view.browser) {
+ view.browser.remove()
+ }
+
+ if (!view.pageAction.popupUrl) return
+ const uri = browserImports.NetUtil.newURI(view.pageAction.popupUrl)
+
+ const browser = createBrowser(uri, {
+ disableglobalhistory: 'true',
+ messagemanagergroup: 'webext-browsers',
+ 'webextension-view-type': 'popup',
+ })
+
+ await spinLock(() => view.panel())
+ view.panel()?.appendChild(browser)
+ view.browser = browser
+ if (!view.browser) {
+ return
+ }
+
+ view.browser.style.borderRadius = 'inherit'
+ setupBrowser(view)
+ view.browser.addEventListener('DidChangeBrowserRemoteness', () =>
+ setupBrowser(view),
+ )
+
+ await spinLock(() => browser.mInitialized)
+ await initialized(view)
+
+ view.browser.source = uri.spec
+ try {
+ view.browser.loadURI(uri, {
+ triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+ })
+ } catch (e) {
+ console.debug('Debug info for changing url')
+ console.debug(view, uri)
+ console.error(e)
+ }
+}
+
+/**
+ * @param {MouseEvent} event
+ */
+function clickModifiersFromEvent(event) {
+ const map = {
+ shiftKey: 'Shift',
+ altKey: 'Alt',
+ metaKey: 'Command',
+ ctrlKey: 'Ctrl',
+ }
+
+ const modifiers = Object.keys(map)
+ .filter((key) => event[key])
+ .map((key) => map[key])
+
+ if (event.ctrlKey && browserImports.AppConstants.platform === 'macosx') {
+ modifiers.push('MacCtrl')
+ }
+
+ return modifiers
+}
+
+/**
+ * @implements {MessageListener}
+ */
+class MessageReceiver {
+ /**
+ * @param {PageActionUiInternals} view
+ */
+ constructor(view) {
+ this.view = view
+ }
+
+ /**
+ * @param {ReceiveMessageArgument} data
+ */
+ receiveMessage(data) {
+ if (data.name === 'Extension:BrowserResized') {
+ const { width, height } = data.data
+ if (this.view.browser) {
+ this.view.browser.style.width = `${width}px`
+ this.view.browser.style.height = `${height}px`
+ }
+
+ return
+ }
+ }
+}
diff --git a/apps/content/src/browser/components/tabs/Tab.svelte b/apps/content/src/browser/components/tabs/Tab.svelte
deleted file mode 100644
index d8f7bf8..0000000
--- a/apps/content/src/browser/components/tabs/Tab.svelte
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
-
-
-{#if !$hidden}
-
-
-
- (selectedTab = tab.getId())}
- on:mouseup={(e) => {
- // When the middle mouse button is clicked, close this tab
- if (e.button == 1) closeTab(tab)
- }}
- class="tab"
- role="tab"
- tabindex={tab.getId()}
- aria-selected={selected}
- >
- {#if $loading}
-
-
-
- {:else if $icon}
-
- {/if}
-
{$title || $uri.asciiSpec}
-
-
-
-
closeTab(tab)}
- on:keydown={(e) => e.key === 'Enter' && closeTab(tab)}
- >
-
-
-
-
-
-{/if}
-
-
diff --git a/apps/content/src/browser/components/tabs/tabDrag.ts b/apps/content/src/browser/components/tabs/tabDrag.ts
deleted file mode 100644
index 280b4f4..0000000
--- a/apps/content/src/browser/components/tabs/tabDrag.ts
+++ /dev/null
@@ -1,202 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { waitForEvent } from '@experiment/shared'
-import type { Action } from 'svelte/action'
-import { type Readable, type Writable, get, writable } from 'svelte/store'
-
-import { resource } from '@browser/lib/resources'
-import { spinLock } from '@browser/lib/spinlock'
-import type { Tab } from '@browser/lib/window/tab'
-import {
- ABOUT_BLANK,
- moveTabAfter,
- moveTabBefore,
- openTab,
-} from '@browser/lib/window/tabs'
-import { getWindowById } from '@browser/lib/window/window'
-
-/* eslint listeners/no-missing-remove-event-listener: 'error' */
-
-export const TAB_DATA_TYPE = 'experiment/tab'
-
-const dragOver = (
- tab: Tab,
- dropBefore: Writable,
- dropAfter: Writable,
-) => {
- let lastDragIsBefore: boolean | undefined
-
- return (event: DragEvent) => {
- const currentTarget = event.currentTarget as HTMLDivElement
- const rawDragRepresentation = event.dataTransfer?.getData(TAB_DATA_TYPE)
-
- if (!currentTarget.classList.contains('tab')) return
- if (!rawDragRepresentation) {
- console.warn('No drag representation')
- return
- }
-
- const { windowId, tabId } = JSON.parse(rawDragRepresentation) as ReturnType<
- Tab['getDragRepresentation']
- >
- const sameWindow = windowId === window.windowApi.id
-
- const boundingRect = currentTarget.getBoundingClientRect()
- const xMiddle = boundingRect.x + boundingRect.width / 2
- const isBefore = event.x <= xMiddle
-
- if ((tabId == tab.getId() && sameWindow) || lastDragIsBefore === isBefore)
- return
- lastDragIsBefore = isBefore
-
- // Trigger the drop handler
- if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'
- event.preventDefault()
- event.stopPropagation()
-
- if (!sameWindow) {
- dropBefore.set(isBefore)
- dropAfter.set(!isBefore)
-
- return
- }
-
- dropBefore.set(false)
- dropAfter.set(false)
-
- if (isBefore) moveTabBefore(tabId, tab.getId())
- else moveTabAfter(tabId, tab.getId())
- }
-}
-
-const drop = async (event: DragEvent) => {
- const currentTarget = event.currentTarget as HTMLDivElement
- const rawDragRepresentation = event.dataTransfer?.getData(TAB_DATA_TYPE)
-
- if (!currentTarget.classList.contains('tab')) return
- if (!rawDragRepresentation) {
- console.warn('No drag representation')
- return
- }
-
- const { windowId, tabId } = JSON.parse(rawDragRepresentation) as ReturnType<
- Tab['getDragRepresentation']
- >
- const sameWindow = windowId === window.windowApi.id
-
- if (sameWindow) return
-
- event.preventDefault()
- event.stopPropagation()
-
- const toMoveWindow = getWindowById(windowId)
- if (!toMoveWindow) {
- console.warn('Window not found')
- return
- }
-
- const tabToMove = toMoveWindow.windowApi.tabs.getTabById(tabId)
- if (!tabToMove) {
- console.warn('Tab not found')
- return
- }
-
- // We need to do the following to change a tab between windows:
- // 1. Create a donor tab in our current window
- // 2. Wait for teh donor tab to finish initializing
- // 3. Perform a docshell swap with the donor tab
- // 4. Destroy the tab to move
- // 5. Show the donor tab
-
- const donorTab = openTab(ABOUT_BLANK)
- donorTab.hidden.set(true)
- await donorTab.goToUri(ABOUT_BLANK)
- await spinLock(() => !get(donorTab.loading))
-
- donorTab.swapWithTab(tabToMove)
- donorTab.hidden.set(false)
-
- toMoveWindow.windowApi.tabs.closeTab(tabToMove)
-}
-
-const dragEnd = (tabToMove: Tab) => async (event: DragEvent) => {
- if (event.dataTransfer?.dropEffect != 'none') return
-
- // The next window that is created is going to be for the new tab
- const newWindowPromise = waitForEvent(
- resource.WindowTracker.events,
- 'windowCreated',
- )
-
- // Create the new window
- window.windowApi.window.new({
- initialUrl: 'about:blank',
- })
-
- const newWindow = await newWindowPromise
- const donorTab = newWindow.windowApi.tabs.tabs[0]
- donorTab.hidden.set(true)
- await donorTab.goToUri(ABOUT_BLANK)
- await spinLock(() => !get(donorTab.loading))
-
- donorTab.swapWithTab(tabToMove)
- donorTab.hidden.set(false)
-
- window.windowApi.tabs.closeTab(tabToMove)
-}
-
-export function createTabDrag(tab: Tab) {
- const dropBefore = writable(false)
- const dropAfter = writable(false)
-
- const dragOverEvent = dragOver(tab, dropBefore, dropAfter)
- const setDataTransferEvent = async (event: DragEvent) => {
- event.dataTransfer?.setData(
- TAB_DATA_TYPE,
- JSON.stringify(tab.getDragRepresentation()),
- )
- const canvas = await tab.captureTabToCanvas()
- if (canvas) event.dataTransfer?.setDragImage(canvas, 0, 0)
- }
- const dragLeaveEvent = () => {
- dropBefore.set(false)
- dropAfter.set(false)
- }
- const preventDefault = (event: DragEvent) => event.preventDefault()
- const onDrop = drop
- const onDragEnd = dragEnd(tab)
-
- const tabDrag: Action = (node) => {
- const initialDraggable = node.draggable
- node.draggable = true
-
- node.addEventListener('dragstart', setDataTransferEvent)
- node.addEventListener('dragover', dragOverEvent)
- node.addEventListener('dragleave', dragLeaveEvent)
- node.addEventListener('drop', preventDefault)
- node.addEventListener('drop', onDrop)
- node.addEventListener('dragend', onDragEnd)
-
- return {
- destroy() {
- node.draggable = initialDraggable
-
- node.removeEventListener('dragstart', setDataTransferEvent)
- node.removeEventListener('dragover', dragOverEvent)
- node.removeEventListener('dragleave', dragLeaveEvent)
- node.removeEventListener('drop', preventDefault)
- node.removeEventListener('drop', onDrop)
- node.removeEventListener('dragend', onDragEnd)
- },
- }
- }
-
- return {
- tabDrag,
- drop: {
- before: dropBefore satisfies Readable,
- after: dropAfter satisfies Readable,
- },
- }
-}
diff --git a/apps/content/src/browser/components/tabs__drag.js b/apps/content/src/browser/components/tabs__drag.js
new file mode 100644
index 0000000..b7a3a48
--- /dev/null
+++ b/apps/content/src/browser/components/tabs__drag.js
@@ -0,0 +1,240 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @ts-check
+import { writable } from '@amadeus-it-group/tansu'
+
+import { browserImports } from '../browserImports.js'
+import {
+ activeTabId,
+ selectedTabIds,
+ windowTabs,
+} from '../windowApi/WindowTabs.js'
+
+const WINDOW_ID_TYPE = 'text/x-fushra-window-id'
+const WINDOW_BROWSER_IDS_TYPE = 'text/x-fushra-window-browser-ids'
+
+/** @type {import('@amadeus-it-group/tansu').WritableSignal} */
+export let dragTabIds = writable([])
+export let dragTabsTranslation = writable(0)
+
+let startEventRelativeY = 0
+let lastScreenY = 0
+let startingIndex = 0
+let expectedIndex = 0
+/** @type {HTMLCanvasElement | null} */
+let dndCanvas = null
+/** @type {XULPanel | null} */
+let linuxDragPanel = null
+
+/**
+ * @param {DragEvent} event
+ */
+export function dragStart(event) {
+ const activeId = activeTabId()
+ const active = windowTabs().find(
+ (tab) => tab.view.windowBrowserId == activeId,
+ )
+ const selectedIds = selectedTabIds()
+
+ dragTabIds.set([activeId, ...selectedIds])
+
+ if (event.dataTransfer) {
+ // TODO: Multiwindow
+ event.dataTransfer.setData(WINDOW_ID_TYPE, '0')
+ event.dataTransfer.setData(WINDOW_BROWSER_IDS_TYPE, dragTabIds().join(','))
+ }
+
+ {
+ /** @type {HTMLButtonElement} */
+ const target = event.target
+ const rect = target.getBoundingClientRect()
+
+ startEventRelativeY = event.screenY - rect.y
+ startingIndex = Number(target.dataset.index)
+ }
+
+ if (dragTabIds().length != 1) {
+ groupDraggedTabs()
+ }
+
+ if (active) {
+ const scale = window.devicePixelRatio
+
+ if (!dndCanvas) {
+ dndCanvas = document.createElement('canvas')
+ dndCanvas.style.width = '100%'
+ dndCanvas.style.height = '100%'
+ dndCanvas.mozOpaque = true
+ }
+
+ dndCanvas.width = 180 * scale
+ dndCanvas.height = 90 * scale
+
+ var context = dndCanvas.getContext('2d')
+ context.fillStyle = 'white'
+ context.fillRect(0, 0, dndCanvas.width, dndCanvas.height)
+
+ /** @type {HTMLElement} */
+ let toDrag = dndCanvas
+ let handleUpdate = () =>
+ event.dataTransfer?.updateDragImage(dndCanvas, -16, -16)
+
+ // The GTK backend does not have support for updateDragImage?? Mozilla's hack is to use a panel
+ // to have the drag image contained, which I don't really like
+ if (browserImports.AppConstants.platform == 'linux') {
+ if (!linuxDragPanel) {
+ linuxDragPanel =
+ /** @type {XULPanel} */ document.createXULElement('panel')
+ linuxDragPanel.className = 'dragfeedback-tab'
+ linuxDragPanel.setAttribute('type', 'drag')
+ linuxDragPanel?.append(dndCanvas)
+ document.documentElement.append(linuxDragPanel)
+ }
+
+ toDrag = linuxDragPanel
+ handleUpdate = () => {}
+ }
+
+ event.dataTransfer?.setDragImage(toDrag, -16, -16)
+
+ browserImports.PageThumbs.captureToCanvas(
+ active.view.browser,
+ dndCanvas,
+ undefined,
+ )
+ .then(handleUpdate)
+ .catch(console.error)
+ }
+}
+
+/**
+ * @param {DragEvent} event
+ */
+export function dragOver(event) {
+ event.preventDefault()
+ event.stopPropagation()
+
+ animateTabMove(event)
+}
+
+/**
+ */
+export function dragEnd() {
+ windowTabs.update((tabs) => {
+ if (dragTabIds().length == 0) {
+ return tabs
+ }
+
+ const targetBrowserId =
+ tabs[Math.min(expectedIndex, tabs.length - 1)].view.windowBrowserId
+ if (dragTabIds()[0] == targetBrowserId) {
+ return tabs
+ }
+
+ const draggingTabs = tabs.filter((tab) =>
+ dragTabIds().includes(tab.view.windowBrowserId),
+ )
+ return tabs
+ .filter((tab) => !dragTabIds().includes(tab.view.windowBrowserId))
+ .flatMap((tab) => {
+ if (tab.view.windowBrowserId == targetBrowserId) {
+ if (expectedIndex < startingIndex) {
+ return [...draggingTabs, tab]
+ }
+
+ return [tab, ...draggingTabs]
+ }
+
+ return tab
+ })
+ })
+
+ dragTabIds.set([])
+ dragTabsTranslation.set(0)
+
+ startEventRelativeY = 0
+ lastScreenY = 0
+
+ document
+ .querySelectorAll("button[role='tab']")
+ .forEach(
+ (/** @type {HTMLButtonElement} */ tab) => void (tab.style.transform = ''),
+ )
+}
+
+function groupDraggedTabs() {
+ if (dragTabIds().length == 0) {
+ console.warn('Tab drag improperly initialized')
+ return
+ }
+
+ windowTabs.update((tabs) => {
+ if (dragTabIds().length == 0) {
+ return tabs
+ }
+
+ const headId = dragTabIds()[0]
+ const rest = tabs.filter(
+ (tab) =>
+ dragTabIds().includes(tab.view.windowBrowserId) &&
+ tab.view.windowBrowserId != headId,
+ )
+
+ // TODO: Drag animations of some sort
+ return tabs
+ .filter(
+ (tab) =>
+ !dragTabIds().includes(tab.view.windowBrowserId) ||
+ tab.view.windowBrowserId == headId,
+ )
+ .flatMap((tab) => {
+ if (tab.view.windowBrowserId == headId) {
+ return [tab, ...rest]
+ }
+
+ return tab
+ })
+ })
+}
+
+/**
+ * @param {DragEvent} event
+ */
+function animateTabMove(event) {
+ if (!event.dataTransfer) {
+ console.warn("Tab drag events didn't have a dataTransfer property")
+ return
+ }
+
+ if (lastScreenY == event.screenY) {
+ return
+ }
+
+ /** @type {HTMLButtonElement} */
+ const firstDraggingTab = document.getElementById(`tab-${dragTabIds()[0]}`)
+ /** @type {HTMLLIElement} */
+ const firstPresentation = firstDraggingTab?.parentElement
+ const presentationBox = firstPresentation.getBoundingClientRect()
+
+ dragTabsTranslation.set(
+ event.screenY - presentationBox.y - startEventRelativeY,
+ )
+
+ expectedIndex = Math.floor(event.screenY / presentationBox.height)
+ const translateAmount = presentationBox.height * dragTabIds().length
+
+ document
+ .querySelectorAll("button[role='tab'][data-dragging='false']")
+ .forEach((/** @type {HTMLButtonElement} */ tab) => {
+ const index = Number(tab.dataset.index)
+ if (index <= expectedIndex && index >= startingIndex) {
+ tab.style.transform = `translateY(-${translateAmount}px)`
+ } else if (index >= expectedIndex && index <= startingIndex) {
+ tab.style.transform = `translateY(${translateAmount}px)`
+ } else {
+ tab.style.transform = ''
+ }
+ })
+}
diff --git a/apps/content/src/browser/components/urlBox.js b/apps/content/src/browser/components/urlBox.js
new file mode 100644
index 0000000..46760cc
--- /dev/null
+++ b/apps/content/src/browser/components/urlBox.js
@@ -0,0 +1,282 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+import { derived } from 'svelte/store'
+
+import tld from '../data/tld.txt'
+
+/**
+ * @typedef {object} AutocompleteResult
+ * @property {string} display
+ * @property {string} url
+ */
+
+/**
+ * @typedef {'insecure' | 'broken' | 'secure' | 'blocked-mixed-active' | 'loaded-mixed-active' | 'blocked-mixed-display' | 'loaded-mixed-display' | 'ssl-3' | 'week-cert' | 'user-overridden'} SecurityState
+ */
+
+/**
+ * @param {import('svelte/store').Readable} store
+ */
+export function humanSecurityInfo(store) {
+ return derived(store, (store) => {
+ /** @type {Set} */
+ const status = new Set()
+
+ if (store & Ci.nsIWebProgressListener.STATE_IS_INSECURE) {
+ status.add('insecure')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_IS_BROKEN) {
+ status.add('broken')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_IS_SECURE) {
+ status.add('secure')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT) {
+ status.add('blocked-mixed-active')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT) {
+ status.add('loaded-mixed-active')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_DISPLAY_CONTENT) {
+ status.add('blocked-mixed-display')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT) {
+ status.add('loaded-mixed-display')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_USES_SSL_3) {
+ status.add('ssl-3')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_USES_WEAK_CRYPTO) {
+ status.add('week-cert')
+ }
+ if (store & Ci.nsIWebProgressListener.STATE_CERT_USER_OVERRIDDEN) {
+ status.add('user-overridden')
+ }
+
+ return status
+ })
+}
+
+/**
+ * Autocomplete that should take under a milisecond to evaluate. There will be
+ * no debouncing on the user's input
+ *
+ * @param {string} input
+ */
+export function getFastAutocomplete(input) {
+ if (input == '') return []
+
+ return [...getUrlResults(input), ...getFastSearchResults(input)]
+}
+
+/**
+ * @param {import('svelte/store').Readable} input
+ * @returns {import('svelte/store').Readable}
+ */
+export function debouncedSlowAutocomplete(input) {
+ let timeout
+ return derived(
+ input,
+ (input, set) => {
+ if (input == '') {
+ return set([])
+ }
+
+ if (timeout) {
+ clearTimeout(timeout)
+ }
+
+ timeout = setTimeout(async () => {
+ let /** @type {AutocompleteResult[]} */ output = []
+
+ slowAutocomplete(input).map((completions) =>
+ completions.then((completions) => {
+ output.push(...completions)
+ set(output)
+ }),
+ )
+ }, 100)
+ },
+ [],
+ )
+}
+
+/**
+ * @param {string} input
+ * @returns {Promise[]}
+ */
+function slowAutocomplete(input) {
+ return [duckduckgoAutocomplete(input)]
+}
+
+/**
+ * Uses `nsIEditor` to reduce the emphisis of schema and path
+ * bits and bobs. Heavily based on mozilla's code. I did not
+ * come up with these shenanagans
+ *
+ * @param {HTMLInputElement?} inputElement
+ */
+export function performCursedUrlStyling(inputElement) {
+ /**
+ * Manual currying!
+ */
+ return () => {
+ try {
+ if (!inputElement) return
+
+ // @ts-expect-error - shenanagans !== type checking :(
+ const /** @type {nsIEditorType} */ editor = inputElement.editor
+ const /** @type {nsISelectionControllerType} */ controller =
+ editor?.selectionController
+
+ if (!editor || !controller) {
+ console.debug('Editor and selection controller not available :(')
+ return
+ }
+
+ const textNode = editor.rootElement.firstChild
+ let startIndex = 0,
+ currentIndex = 0
+
+ const strikeOut = controller.getSelection(
+ controller.SELECTION_URLSTRIKEOUT,
+ )
+ const secondary = controller.getSelection(
+ controller.SELECTION_URLSECONDARY,
+ )
+
+ if (!textNode) {
+ return
+ }
+
+ // Consume the url scheme. No, that doesn't consume the third strike
+ // of resource:///, because the third strike has semantic meaning!
+ if (!inputElement.value.includes('://')) {
+ return
+ }
+ {
+ const isHttp = inputElement.value.startsWith('http://')
+
+ while (inputElement.value[currentIndex] != ':') {
+ currentIndex += 1
+ }
+
+ currentIndex += 3
+
+ const range = document.createRange()
+ range.setStart(textNode, startIndex)
+ range.setEnd(textNode, currentIndex)
+ secondary.addRange(range)
+
+ if (isHttp) {
+ const range = document.createRange()
+ range.setStart(textNode, startIndex)
+ range.setEnd(textNode, currentIndex - 3)
+ strikeOut.addRange(range)
+ }
+
+ startIndex = currentIndex
+ }
+
+ if (!inputElement.value.includes('://www.')) {
+ return
+ }
+ {
+ currentIndex += 4
+
+ const range = document.createRange()
+ range.setStart(textNode, startIndex)
+ range.setEnd(textNode, currentIndex)
+
+ secondary.addRange(range)
+ startIndex = currentIndex
+ }
+
+ // Consume path
+ if (!inputElement.value.substring(startIndex).includes('/')) {
+ return
+ }
+ {
+ while (inputElement.value[startIndex] != '/') {
+ startIndex += 1
+ }
+
+ const range = document.createRange()
+ range.setStart(textNode, startIndex)
+ range.setEnd(textNode, inputElement.value.length)
+ secondary.addRange(range)
+ }
+ } catch (e) {
+ console.debug('Error performing url styling', e)
+ }
+ }
+}
+
+/**
+ * @param {string} input
+ * @returns {Promise}
+ */
+async function duckduckgoAutocomplete(input) {
+ const response = await fetch(
+ `https://ac.duckduckgo.com/ac/?q=${input}&type=list&callback=jsonCallback`,
+ )
+ const /** @type {[string, string[]]} */ json = await response.json()
+ const completions = json[1]
+
+ if (!completions) {
+ console.warn('DuckDuckGo completions did not return correctly', json)
+ return []
+ }
+
+ return completions
+ .filter((comp) => comp != input)
+ .map((comp) => ({
+ display: comp,
+ url: `https://duckduckgo.com/?q=${comp}`,
+ }))
+}
+
+const HTTPS_REGEX =
+ /^(?https?:\/\/)?(?(\w+\.)+(?\w+))(?\/.*)?$/m
+const EXTENSION_REGEX = /^moz-extension:\/\/.+$/m
+const CHROME_REGEX = /^chrome:\/\/.+$/m
+const ABOUT_REGEX = /^about:.+$/m
+const tlds = tld
+ .split('\n')
+ .filter((/** @type {string} */ tld) => tld.length > 0 && !tld.startsWith('#'))
+
+/**
+ * @param {string} input
+ * @returns {AutocompleteResult[]}
+ */
+function getUrlResults(input) {
+ // If it is an exact match against an internal url
+ if (
+ EXTENSION_REGEX.test(input) ||
+ CHROME_REGEX.test(input) ||
+ ABOUT_REGEX.test(input)
+ ) {
+ return [{ display: input, url: input }]
+ }
+
+ const match = HTTPS_REGEX.exec(input)
+ if (match === null) return []
+
+ const { protocol, domain, tld, path } = match.groups || {}
+ const uri = `${protocol || 'https://'}${domain}${path || ''}`
+
+ // If it is not a valid tld, don't show it
+ if (!tlds.includes(tld.toUpperCase())) return []
+
+ return [{ display: uri, url: uri }]
+}
+
+/**
+ * @param {string} input
+ * @returns {AutocompleteResult[]}
+ */
+function getFastSearchResults(input) {
+ return [{ display: input, url: `https://duckduckgo.com/?q=${input}` }]
+}
diff --git a/apps/content/src/shared/search/providers/data/tld.txt b/apps/content/src/browser/data/tld.txt
similarity index 98%
rename from apps/content/src/shared/search/providers/data/tld.txt
rename to apps/content/src/browser/data/tld.txt
index 225b529..31b7abe 100644
--- a/apps/content/src/shared/search/providers/data/tld.txt
+++ b/apps/content/src/browser/data/tld.txt
@@ -1,4 +1,4 @@
-# Version 2023123101, Last Updated Mon Jan 1 07:07:01 2024 UTC
+# Version 2024031700, Last Updated Sun Mar 17 07:07:02 2024 UTC
AAA
AARP
ABB
@@ -96,7 +96,6 @@ BA
BABY
BAIDU
BANAMEX
-BANANAREPUBLIC
BAND
BANK
BAR
@@ -261,7 +260,6 @@ COFFEE
COLLEGE
COLOGNE
COM
-COMCAST
COMMBANK
COMMUNITY
COMPANY
@@ -512,7 +510,6 @@ GROUP
GS
GT
GU
-GUARDIAN
GUCCI
GUGE
GUIDE
@@ -855,7 +852,6 @@ OFFICE
OKINAWA
OLAYAN
OLAYANGROUP
-OLDNAVY
OLLO
OM
OMEGA
@@ -1276,7 +1272,6 @@ WTC
WTF
XBOX
XEROX
-XFINITY
XIHUAN
XIN
XN--11B4C3D
diff --git a/apps/content/src/browser/lib/binaryEnums.ts b/apps/content/src/browser/lib/binaryEnums.ts
deleted file mode 100644
index 304bbc1..0000000
--- a/apps/content/src/browser/lib/binaryEnums.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { curry } from 'fnts'
-
-export const isBitSet = curry((bit: number, num: number) => (num & bit) !== 0)
-export const isBitSetFast = curry((bit: number, num: number) => num & bit)
diff --git a/apps/content/src/browser/lib/devtools.ts b/apps/content/src/browser/lib/devtools.ts
deleted file mode 100644
index 7b6eb6e..0000000
--- a/apps/content/src/browser/lib/devtools.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/* eslint-disable @typescript-eslint/no-explicit-any */
-
-const lazy: any = {}
-;(ChromeUtils as any).defineESModuleGetters(lazy, {
- BrowserToolboxLauncher:
- 'resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs',
-})
-
-export const initDevTools = lazy.BrowserToolboxLauncher.init
diff --git a/apps/content/src/browser/lib/fp.ts b/apps/content/src/browser/lib/fp.ts
deleted file mode 100644
index 1503470..0000000
--- a/apps/content/src/browser/lib/fp.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-type ResultInner =
- | { _type: 'value'; inner: Value }
- | { _type: 'error'; inner: Error }
-export class Result {
- inner: ResultInner
-
- private constructor(inner: ResultInner) {
- this.inner = inner
- }
-
- static ok(value: V): Result {
- return new Result({ _type: 'value', inner: value })
- }
-
- static err(error: E): Result {
- return new Result({ _type: 'error', inner: error })
- }
-
- /**
- * Returns the value or throws the error if it exists. You should only use this in testing code
- * @deprecated
- */
- unwrap(): Value {
- if (this.inner._type === 'error') {
- throw this.inner.inner
- }
-
- return this.inner.inner
- }
-}
diff --git a/apps/content/src/browser/lib/keybinds.ts b/apps/content/src/browser/lib/keybinds.ts
deleted file mode 100644
index 1a4c3dc..0000000
--- a/apps/content/src/browser/lib/keybinds.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { Result } from './fp'
-
-export type ModifierType = (typeof modifiers)[number]
-const modifiers = ['shift', 'control', 'alt', 'meta', 'accel'] as const
-
-export type KeyCodeType = (typeof keycodes)[number]
-const keycodes = [
- 'VK_CANCEL',
- 'VK_BACK',
- 'VK_TAB',
- 'VK_CLEAR',
- 'VK_RETURN',
- 'VK_ENTER',
- 'VK_SHIFT',
- 'VK_CONTROL',
- 'VK_ALT',
- 'VK_PAUSE',
- 'VK_CAPS_LOCK',
- 'VK_ESCAPE',
- 'VK_SPACE',
- 'VK_PAGE_UP',
- 'VK_PAGE_DOWN',
- 'VK_END',
- 'VK_HOME',
- 'VK_LEFT',
- 'VK_UP',
- 'VK_RIGHT',
- 'VK_DOWN',
- 'VK_PRINTSCREEN',
- 'VK_INSERT',
- 'VK_DELETE',
- 'VK_0',
- 'VK_1',
- 'VK_2',
- 'VK_3',
- 'VK_4',
- 'VK_5',
- 'VK_6',
- 'VK_7',
- 'VK_8',
- 'VK_9',
- 'VK_SEMICOLON',
- 'VK_EQUALS',
- 'VK_A',
- 'VK_B',
- 'VK_C',
- 'VK_D',
- 'VK_E',
- 'VK_F',
- 'VK_G',
- 'VK_H',
- 'VK_I',
- 'VK_J',
- 'VK_K',
- 'VK_L',
- 'VK_M',
- 'VK_N',
- 'VK_O',
- 'VK_P',
- 'VK_Q',
- 'VK_R',
- 'VK_S',
- 'VK_T',
- 'VK_U',
- 'VK_V',
- 'VK_W',
- 'VK_X',
- 'VK_Y',
- 'VK_Z',
- 'VK_NUMPAD0',
- 'VK_NUMPAD1',
- 'VK_NUMPAD2',
- 'VK_NUMPAD3',
- 'VK_NUMPAD4',
- 'VK_NUMPAD5',
- 'VK_NUMPAD6',
- 'VK_NUMPAD7',
- 'VK_NUMPAD8',
- 'VK_NUMPAD9',
- 'VK_MULTIPLY',
- 'VK_ADD',
- 'VK_SEPARATOR',
- 'VK_SUBTRACT',
- 'VK_DECIMAL',
- 'VK_DIVIDE',
- 'VK_F1',
- 'VK_F2',
- 'VK_F3',
- 'VK_F4',
- 'VK_F5',
- 'VK_F6',
- 'VK_F7',
- 'VK_F8',
- 'VK_F9',
- 'VK_F10',
- 'VK_F11',
- 'VK_F12',
- 'VK_F13',
- 'VK_F14',
- 'VK_F15',
- 'VK_F16',
- 'VK_F17',
- 'VK_F18',
- 'VK_F19',
- 'VK_F20',
- 'VK_F21',
- 'VK_F22',
- 'VK_F23',
- 'VK_F24',
- 'VK_NUM_LOCK',
- 'VK_SCROLL_LOCK',
- 'VK_COMMA',
- 'VK_PERIOD',
- 'VK_SLASH',
- 'VK_BACK_QUOTE',
- 'VK_OPEN_BRACKET',
- 'VK_BACK_SLASH',
- 'VK_CLOSE_BRACKET',
- 'VK_QUOTE',
- 'VK_HELP',
-] as const
-
-export interface Keybind {
- modifiers: ModifierType[]
- key?: string
- keycode?: KeyCodeType
-}
-
-export type KeybindingParsingErrors = { error: 'invlidModifier'; value: string }
-
-export const keybindFromString = (
- str: string,
-): Result => {
- const items = str.split('+')
-
- const key = items.pop()
- const isKeyCode = keycodes.includes(key as KeyCodeType)
-
- // Validate all of the modifiers
- for (const modifier of items) {
- if (!modifiers.includes(modifier as ModifierType))
- return Result.err({ error: 'invlidModifier', value: modifier })
- }
-
- if (isKeyCode) {
- return Result.ok({
- modifiers: items as ModifierType[],
- keycode: key as KeyCodeType,
- })
- } else {
- return Result.ok({
- modifiers: items as ModifierType[],
- key,
- })
- }
-}
diff --git a/apps/content/src/browser/lib/modules/EPageActionsBindings.ts b/apps/content/src/browser/lib/modules/EPageActionsBindings.ts
deleted file mode 100644
index ff22c67..0000000
--- a/apps/content/src/browser/lib/modules/EPageActionsBindings.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { readable } from 'svelte/store'
-
-import type { PageActionImpl } from 'resource://app/modules/EPageActions.sys.mjs'
-
-import { resource } from '../resources'
-
-/**
- * @todo lazy loading store
- */
-export const pageActions = readable(
- [...resource.EPageActions.pageActions.entries()],
- (set) => {
- const update = () => set([...resource.EPageActions.pageActions.entries()])
- resource.EPageActions.events.on('*', update)
- return () => resource.EPageActions.events.off('*', update)
- },
-)
-
-export const pageActionIcons = (pageAction: PageActionImpl) =>
- readable | undefined>(pageAction.icons, (set) =>
- pageAction.events.on('updateIcon', set),
- )
-
-export function getIconUrlForPreferredSize(
- icon: Record,
- preferredSize: number,
-) {
- let bestSize
-
- if (icon[preferredSize]) {
- bestSize = preferredSize
- } else if (icon[preferredSize * 2]) {
- bestSize = preferredSize * 2
- } else {
- const sizes = Object.keys(icon)
- .map((key) => parseInt(key, 10))
- .sort((a, b) => a - b)
- bestSize =
- sizes.find((candidate) => candidate > preferredSize) || sizes.pop()!
- }
-
- return icon[bestSize]
-}
diff --git a/apps/content/src/browser/lib/shortcuts.ts b/apps/content/src/browser/lib/shortcuts.ts
deleted file mode 100644
index 2fd74a3..0000000
--- a/apps/content/src/browser/lib/shortcuts.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { runOnCurrentTab } from './window/tabs'
-
-interface AppCommandEvent extends Event {
- command:
- | 'Back'
- | 'Forward'
- | 'Reload'
- | 'Stop'
- | 'Search'
- | 'Bookmarks'
- | 'Home'
- | 'New'
- | 'Close'
- | 'Find'
- | 'Help'
- | 'Open'
- | 'Print'
- | 'Save'
- | 'SendMail'
-}
-
-export function initializeShortcuts() {
- document.addEventListener('AppCommand', (untypedEvent) => {
- const event = untypedEvent as AppCommandEvent
- switch (event.command) {
- case 'Back':
- runOnCurrentTab((tab) => tab.goBack())
- break
- case 'Forward':
- runOnCurrentTab((tab) => tab.goForward())
- break
- default:
- console.warn('Unknown event', event)
- }
- })
-}
diff --git a/apps/content/src/browser/lib/spinlock.ts b/apps/content/src/browser/lib/spinlock.ts
deleted file mode 100644
index d805fc0..0000000
--- a/apps/content/src/browser/lib/spinlock.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export function sleep(duration: number): Promise {
- return new Promise((res) => setTimeout(res, duration))
-}
-
-export async function spinLock(predicate: () => boolean): Promise {
- while (!predicate()) {
- await sleep(1)
- }
-}
diff --git a/apps/content/src/browser/lib/window/api.ts b/apps/content/src/browser/lib/window/api.ts
deleted file mode 100644
index db784dd..0000000
--- a/apps/content/src/browser/lib/window/api.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import mitt from 'mitt'
-
-import type { WindowArguments } from '.'
-import {
- browserContextMenuInfo,
- setContextMenuParentActor,
-} from './contextMenu'
-import {
- closeTab,
- getCurrentTab,
- getTabById,
- openTab,
- runOnCurrentTab,
- setCurrentTab,
- tabs,
-} from './tabs'
-import { id, setId } from './window'
-
-export const windowApi: WindowApi = {
- id,
-
- setId,
-
- windowTriggers: mitt(),
- window: {
- /**
- * @todo Move this into BrowserWindowTracker
- */
- new: (args?: WindowArguments) =>
- Services.ww.openWindow(
- // @ts-expect-error Incorrect type generation
- null,
- Services.prefs.getStringPref('app.content'),
- '_blank',
- 'chrome,dialog=no,all',
- args,
- ),
- },
- tabs: {
- closeTab,
- openTab,
- runOnCurrentTab,
- setCurrentTab,
- getCurrentTab,
- getTabById,
- get tabs() {
- return tabs.readOnce()
- },
- setIcon: (browser: XULBrowserElement, iconURL: string) =>
- tabs
- .readOnce()
- .find((tab) => tab.getTabId() == browser.browserId)
- ?.icon.set(iconURL),
- },
- contextMenu: {
- showContextMenu: (
- menuInfo: ContextMenuInfo,
- actor: JSWindowActorParent,
- ) => {
- browserContextMenuInfo.set(menuInfo)
- setContextMenuParentActor(actor)
-
- requestAnimationFrame(() => {
- const contextMenu = document.getElementById(
- 'browser_context_menu',
- ) as XULMenuPopup
- contextMenu.openPopupAtScreen(
- menuInfo.position.screenX,
- menuInfo.position.screenY,
- true,
- )
- })
- },
- },
-}
-
-window.windowApi = windowApi
diff --git a/apps/content/src/browser/lib/window/arguments.ts b/apps/content/src/browser/lib/window/arguments.ts
deleted file mode 100644
index 0c0fa4d..0000000
--- a/apps/content/src/browser/lib/window/arguments.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-const defaultWindowConfiguration: WindowConfiguration = {
- initialUrl: Services.prefs.getStringPref(
- 'browser.newwindow.default',
- 'about:blank',
- ),
-}
-
-/**
- * These are the arguments that we want to pass between windows.
- */
-export type WindowArguments = Partial
-
-export function getFullWindowConfiguration(
- args: WindowArguments,
-): WindowConfiguration {
- return {
- ...defaultWindowConfiguration,
- ...args,
- }
-}
-
-export function nsISupportsWinArgs(
- args: WindowArguments,
-): WindowArguments & nsISupportsType {
- return args as unknown as WindowArguments & nsISupportsType
-}
diff --git a/apps/content/src/browser/lib/window/contextMenu.ts b/apps/content/src/browser/lib/window/contextMenu.ts
deleted file mode 100644
index 67ae667..0000000
--- a/apps/content/src/browser/lib/window/contextMenu.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { writable } from 'svelte/store'
-
-export let contextMenuParentActor: JSWindowActorParent
-export const browserContextMenuInfo = writable({
- position: { screenX: 0, screenY: 0, inputSource: 0 },
- context: {},
-})
-
-export function setContextMenuParentActor(actor: JSWindowActorParent) {
- contextMenuParentActor = actor
-}
diff --git a/apps/content/src/browser/lib/window/index.ts b/apps/content/src/browser/lib/window/index.ts
deleted file mode 100644
index 025bc9a..0000000
--- a/apps/content/src/browser/lib/window/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export * from './arguments'
-export * from './initialize'
diff --git a/apps/content/src/browser/lib/window/initialize.ts b/apps/content/src/browser/lib/window/initialize.ts
deleted file mode 100644
index 2ddbfc5..0000000
--- a/apps/content/src/browser/lib/window/initialize.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { resource } from '../resources'
-import { type WindowArguments, getFullWindowConfiguration } from './arguments'
-import { openTab } from './tabs'
-import {
- initializeWindowDragOverHandler,
- registerWithWindowTracker,
-} from './window'
-
-export function initializeWindow(args: WindowArguments | undefined) {
- // When opened via nsIWindowWatcher.openWindow, the arguments are
- // passed through C++, and they arrive to us wrapped as an XPCOM
- // object. We use wrappedJSObject to get at the underlying JS
- // object.
- // @ts-expect-error Incorrect type generation
- if (args instanceof Ci.nsISupports) {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- args = (args as any).wrappedJSObject as WindowArguments
- }
-
- const configuration = getFullWindowConfiguration(args || {})
-
- // Setup tabs
- openTab(resource.NetUtil.newURI(configuration.initialUrl))
-
- initializeWindowDragOverHandler()
- registerWithWindowTracker()
-}
diff --git a/apps/content/src/browser/lib/window/tab.ts b/apps/content/src/browser/lib/window/tab.ts
deleted file mode 100644
index 8906a8a..0000000
--- a/apps/content/src/browser/lib/window/tab.ts
+++ /dev/null
@@ -1,465 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { type ViewableWritable, viewableWritable } from '@experiment/shared'
-import mitt from 'mitt'
-import { type Writable, get, writable } from 'svelte/store'
-
-import type { ZoomStoreEvents } from 'resource://app/modules/ZoomStore.sys.mjs'
-
-import { type BookmarkTreeNode, search } from '@shared/ExtBookmarkAPI'
-
-import { resource } from '../resources'
-import { spinLock } from '../spinlock'
-import { createBrowser, getBrowserRemoteType, setURI } from '../xul/browser'
-import { domContentLoaded } from '../xul/domevents'
-
-export const lastTabAction = { id: -1, before: false }
-
-let localTabId = 0
-
-/**
- * This provides a consistent internal representation of a tab, including the
- * browser elements it contains & information derived from listeners about its current state
- */
-export class Tab {
- private _id: number = ++localTabId
- private tabId: number | undefined
-
- private browserElement: XULBrowserElement
- private progressListener = new TabProgressListener()
-
- // Publicly available data. Even though these are writable, updating them will not change
- // the state of the browser element
- public title = writable('')
- public icon: ViewableWritable = viewableWritable(null)
- public uri: ViewableWritable
- public bookmarkInfo: Writable = writable(null)
-
- public findbar: ViewableWritable =
- viewableWritable(undefined)
-
- public canGoBack = writable(false)
- public canGoForward = writable(false)
-
- public loading = writable(false)
- public loadingProgress = writable(0)
-
- public zoom = writable(1)
-
- public focusedOmnibox = writable(true)
- public hidden = writable(false)
-
- constructor(uri: nsIURIType) {
- this.browserElement = createBrowser({
- remoteType: getBrowserRemoteType(uri),
- })
-
- this.uri = viewableWritable(uri)
- this.goToUri(uri)
- this.title.set(uri.asciiHost)
-
- this.zoom.subscribe((newZoom) => {
- if (
- !this.browserElement.browsingContext ||
- this.browserElement.fullZoom === newZoom
- ) {
- return
- }
-
- this.browserElement.fullZoom = newZoom
- resource.ZoomStore.setZoomForUri(this.uri.readOnce(), newZoom)
- })
- this.uri.subscribe(async (uri) =>
- this.bookmarkInfo.set(
- await search({ url: uri.spec }).then((r) =>
- r.length > 0 ? (r[0] as BookmarkTreeNode) : null,
- ),
- ),
- )
-
- // Remember to unsubscribe from any listeners you register here!
- resource.ZoomStore.events.on('setZoom', this.zoomChange)
- }
-
- public getId(): number {
- return this._id
- }
-
- /**
- * Gecko's internal tab/browser id. Note that this is not always ready on first render, so
- * you should use {@link this.getId()} for keys etc
- */
- public getTabId(): number {
- return this.tabId || 0
- }
-
- public getBrowserElement() {
- return this.browserElement
- }
-
- public getDragRepresentation() {
- return {
- windowId: window.windowApi.id,
- tabId: this.getId(),
- }
- }
-
- _initialized: Promise | undefined
- public get initialized() {
- if (this._initialized) return this._initialized
- // Force fetching the docshell
- this.browserElement.docShell
- return (this._initialized = spinLock(
- () => this.browserElement.mInitialized,
- ))
- }
-
- // ===========================================================================
- // Event listeners
-
- protected useEventListeners() {
- this.browserElement.addEventListener(
- 'pagetitlechanged',
- this.onPageTitleChanged.bind(this),
- )
-
- this.browserElement.addEventListener(
- 'DidChangeBrowserRemoteness',
- this.onDidChangeBrowserRemoteness.bind(this),
- )
-
- // Set up progress notifications. These are used for listening on location change etc
- this.progressListener.setup(this.browserElement)
- this.useProgressListener()
- }
-
- protected removeEventListeners() {
- this.browserElement.removeEventListener(
- 'pagetitlechanged',
- this.onPageTitleChanged.bind(this),
- )
- this.browserElement.removeEventListener(
- 'DidChangeBrowserRemoteness',
- this.onDidChangeBrowserRemoteness.bind(this),
- )
- }
-
- protected onPageTitleChanged() {
- this.title.set(this.browserElement.contentTitle)
- }
-
- protected onDidChangeBrowserRemoteness(e: Event) {
- const browser = e.target as XULBrowserElement
- // TODO: Does this leak memory?
- this.progressListener.remove(browser)
- this.progressListener = new TabProgressListener()
- this.progressListener.setup(browser)
- this.useProgressListener()
- }
-
- zoomChange = (event: ZoomStoreEvents['setZoom']) => {
- if (this.uri.readOnce().asciiHost != event.host) return
- this.zoom.set(event.zoom)
- }
-
- protected useProgressListener() {
- this.progressListener.events.on('locationChange', (event) => {
- if (!event.aWebProgress.isTopLevel) return
-
- const sameLocation =
- event.aFlags & 0x01 /* LOCATION_CHANGE_SAME_DOCUMENT */
- if (!sameLocation) {
- this.icon.set(null)
- }
-
- this.uri.set(event.aLocation)
- this.canGoBack.set(this.browserElement.canGoBack)
- this.canGoForward.set(this.browserElement.canGoForward)
-
- this.zoom.set(resource.ZoomStore.getZoomForUri(event.aLocation))
- })
-
- this.progressListener.events.on('progressPercent', this.loadingProgress.set)
- this.progressListener.events.on('loadingChange', this.loading.set)
- }
-
- public async setContainer(container: HTMLElement) {
- container.appendChild(this.browserElement)
- this.tabId = this.browserElement.browserId
-
- this.useEventListeners()
- }
-
- public async goToUri(uri: nsIURIType) {
- // Load the URI once we are sure that the dom has fully loaded
- await domContentLoaded.promise
- // Wait for browser to initialize
- await this.initialized
- setURI(this.browserElement, uri)
- }
-
- public destroy() {
- resource.ZoomStore.events.off('setZoom', this.zoomChange)
- this.browserElement.remove()
- }
-
- public goBack() {
- this.browserElement.goBack()
- }
-
- public goForward() {
- this.browserElement.goForward()
- }
-
- public reload() {
- this.browserElement.reload()
- }
-
- public showFindBar() {
- if (!this.browserElement) {
- throw new Error('Browser not initialized when adding findbar')
- }
-
- const findbar = this.findbar.readOnce()
- if (findbar) {
- findbar.onFindCommand()
- return
- }
-
- this.findbar.update(() => document.createXULElement('findbar'))
- }
-
- public async setupFindbar(
- container: HTMLElement,
- findbar: XULFindBarElement,
- ) {
- container.append(findbar)
-
- await new Promise((r) => requestAnimationFrame(r))
- findbar.browser = this.browserElement
- this.showFindBar()
- }
-
- public swapWithTab(tab: Tab) {
- this.removeEventListeners()
- tab.removeEventListeners()
-
- this.browserElement.swapDocShells(tab.browserElement)
-
- this.useEventListeners()
- tab.useEventListeners()
-
- if (this.browserElement.id) this.tabId = this.browserElement.browserId
- if (tab.browserElement.id) tab.tabId = tab.browserElement.browserId
-
- const otherTitle = get(tab.title)
- const otherIcon = get(tab.icon)
- const otherUri = get(tab.uri)
- const otherBookmarkInfo = get(tab.bookmarkInfo)
-
- tab.title.set(get(this.title))
- tab.icon.set(get(this.icon))
- tab.uri.set(get(this.uri))
- tab.bookmarkInfo.set(get(this.bookmarkInfo))
-
- this.title.set(otherTitle)
- this.icon.set(otherIcon)
- this.uri.set(otherUri)
- this.bookmarkInfo.set(otherBookmarkInfo)
-
- const thisFindbar = get(this.findbar)
- thisFindbar?.remove()
- this.findbar.set(undefined)
-
- const otherFindbar = get(tab.findbar)
- otherFindbar?.remove()
- tab.findbar.set(undefined)
- }
-
- public async captureTabToCanvas(
- canvas: HTMLCanvasElement | null = resource.PageThumbs.createCanvas(window),
- ) {
- try {
- await resource.PageThumbs.captureToCanvas(
- this.browserElement,
- canvas,
- undefined,
- )
- } catch (e) {
- console.error(e)
- canvas = null
- }
-
- return canvas
- }
-}
-
-type TabProgressListenerEventDefaults = {
- aWebProgress: nsIWebProgressType
- aRequest: nsIRequestType
- id: number
-}
-
-type TabProgressListenerEvent = {
- locationChange: {
- aLocation: nsIURIType
- aFlags: number
- } & TabProgressListenerEventDefaults
- progressPercent: number
- loadingChange: boolean
-}
-
-/* eslint-disable @typescript-eslint/no-unused-vars */
-
-let progressListenerCounter = 0
-class TabProgressListener
- implements
- Partial,
- Partial
-{
- id = progressListenerCounter++
-
- events = mitt()
- browser: XULBrowserElement | undefined
-
- filter: (nsIWebProgressListenerType & nsIWebProgressType) | undefined
-
- setup(browser: XULBrowserElement) {
- this.browser = browser
-
- this.filter = Cc[
- '@mozilla.org/appshell/component/browser-status-filter;1'
- ].createInstance(Ci.nsIWebProgress) as nsIWebProgressListenerType &
- nsIWebProgressType
- this.filter.addProgressListener(
- this as unknown as nsIWebProgressListenerType,
- Ci.nsIWebProgress.NOTIFY_ALL,
- )
- browser.webProgress.addProgressListener(
- this.filter,
- Ci.nsIWebProgress.NOTIFY_ALL,
- )
- }
-
- remove(browser: XULBrowserElement) {
- browser.webProgress.removeProgressListener(
- this.filter as nsIWebProgressListenerType,
- )
- // @ts-expect-error Incorrect type generation
- this.filter?.removeProgressListener(this)
-
- this.filter = undefined
- }
-
- /**
- * This request is identical to {@link onProgressChange64}. The only
- * difference is that the c++ impl uses `long long`s instead of `long`s
- */
- onProgressChange64(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aCurSelfProgress: number,
- aMaxSelfProgress: number,
- aCurTotalProgress: number,
- aMaxTotalProgress: number,
- ): void {
- return this.onProgressChange(
- aWebProgress,
- aRequest,
- aCurSelfProgress,
- aMaxSelfProgress,
- aCurTotalProgress,
- aMaxTotalProgress,
- )
- }
-
- onRefreshAttempted(
- _aWebProgress: nsIWebProgressType,
- _aRefreshURI: nsIURIType,
- _aMillis: number,
- _aSameURI: boolean,
- ): boolean {
- // TODO: There is special functionality that should probibly go here
- return true
- }
- onStateChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aStateFlags: number,
- aStatus: number,
- ): void {
- if (!aWebProgress.isTopLevel) return
- if (
- aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
- aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK
- ) {
- this.events.emit('loadingChange', true)
- }
-
- if (
- aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
- aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK
- ) {
- this.events.emit('loadingChange', false)
- }
- }
-
- onProgressChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aCurSelfProgress: number,
- aMaxSelfProgress: number,
- aCurTotalProgress: number,
- aMaxTotalProgress: number,
- ): void {
- if (!aWebProgress || !aWebProgress.isTopLevel) return
- this.events.emit(
- 'progressPercent',
- aMaxTotalProgress !== 0 ? aCurTotalProgress / aMaxTotalProgress : 0,
- )
- }
-
- onLocationChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aLocation: nsIURIType,
- aFlags: number,
- ): void {
- this.events.emit('locationChange', {
- aWebProgress,
- aRequest,
- aLocation,
- aFlags,
- id: this.id,
- })
- }
- onStatusChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aStatus: number,
- aMessage: string,
- ): void {
- // console.log('onStatusChange')
- }
- onSecurityChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aState: number,
- ): void {
- // console.log('onSecurityChange')
- }
- onContentBlockingEvent(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aEvent: number,
- ): void {
- // console.log('onContentBlockingEvent')
- }
-
- QueryInterface = ChromeUtils.generateQI([
- 'nsIWebProgressListener',
- 'nsIWebProgressListener2',
- 'nsISupportsWeakReference',
- ])
-}
diff --git a/apps/content/src/browser/lib/window/tabs.ts b/apps/content/src/browser/lib/window/tabs.ts
deleted file mode 100644
index de8b9d7..0000000
--- a/apps/content/src/browser/lib/window/tabs.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { Ring, not, viewableWritable } from '@experiment/shared'
-
-import { resource } from '../resources'
-import { Tab } from './tab'
-
-const tabHistory = new Ring(10)
-export const selectedTabId = viewableWritable(-1)
-selectedTabId.subscribe((id) => tabHistory.next(id))
-
-const uriPref = (pref: string) => (): nsIURIType =>
- resource.NetUtil.newURI(Services.prefs.getStringPref(pref, 'about:blank'))
-const newTabUri = uriPref('browser.newtab.default')
-export const ABOUT_BLANK = resource.NetUtil.newURI('about:blank')
-
-export const tabs = viewableWritable([])
-
-const matchTab = (id: number) => (tab: Tab) => tab.getId() === id
-
-export function openTab(uri: nsIURIType = newTabUri()) {
- const newTab = new Tab(uri)
-
- // We only want to focus the omnibox on new tab pages
- if (uri.asciiSpec != newTabUri().asciiSpec) {
- newTab.focusedOmnibox.set(false)
- }
-
- tabs.update((tabs) => {
- selectedTabId.set(newTab.getId())
- return [...tabs, newTab]
- })
- return newTab
-}
-
-export function closeTab(tab: Tab) {
- tabs.update((tabs) => {
- const tabIndex = tabs.findIndex(matchTab(tab.getId()))
- const filtered = tabs.filter(not(matchTab(tab.getId())))
-
- if (filtered.length == 0) {
- window.close()
- return []
- }
-
- const lastTabId = tabHistory.prev()
- const hasLastTab = filtered.some(matchTab(lastTabId))
- if (hasLastTab) {
- selectedTabId.set(lastTabId)
- } else {
- if (filtered[tabIndex]) {
- selectedTabId.set(filtered[tabIndex].getId())
- } else {
- selectedTabId.set(filtered[tabIndex - 1].getId())
- }
- }
-
- tab.destroy()
- return filtered
- })
-}
-
-export function getTabById(id: number): Tab | undefined {
- return tabs.readOnce().find(matchTab(id))
-}
-
-export function getCurrentTab(): Tab | undefined {
- return getTabById(selectedTabId.readOnce())
-}
-
-export function setCurrentTab(tab: Tab) {
- const index = tabs.readOnce().findIndex(matchTab(tab.getId()))
- setCurrentTabIndex(index)
-}
-
-export function runOnCurrentTab(method: (tab: Tab) => R): R | undefined {
- const currentTab = getCurrentTab()
- if (currentTab) return method(currentTab)
-}
-
-export function getCurrentTabIndex(): number {
- return tabs.readOnce().findIndex(matchTab(selectedTabId.readOnce()))
-}
-
-export function setCurrentTabIndex(index: number) {
- const allTabs = tabs.readOnce()
-
- // Wrap the index
- if (index < 0) index = allTabs.length - 1
- if (index >= allTabs.length) index = 0
-
- const tabId = allTabs[index].getId()
- selectedTabId.set(tabId)
-}
-
-export function moveTabBefore(toMoveId: number, targetId: number) {
- tabs.update((tabs) => {
- const toMoveIndex = tabs.findIndex(matchTab(toMoveId))
- const targetIndex = Math.max(tabs.findIndex(matchTab(targetId)) - 1, 0)
-
- // If we do in-place modifications with tabs, svelte won't notice the
- // change
- const newTabs = [...tabs]
- insertAndShift(newTabs, toMoveIndex, targetIndex)
- return newTabs
- })
-}
-
-export function moveTabAfter(toMoveId: number, targetId: number) {
- tabs.update((tabs) => {
- const toMoveIndex = tabs.findIndex(matchTab(toMoveId))
- const targetIndex = tabs.findIndex(matchTab(targetId))
-
- // If we do in-place modifications with tabs, svelte won't notice the
- // change
- const newTabs = [...tabs]
- insertAndShift(newTabs, toMoveIndex, targetIndex)
- return newTabs
- })
-}
-
-function insertAndShift(arr: T[], from: number, to: number) {
- const cutOut = arr.splice(from, 1)[0]
- arr.splice(to, 0, cutOut)
-}
diff --git a/apps/content/src/browser/lib/window/window.ts b/apps/content/src/browser/lib/window/window.ts
deleted file mode 100644
index fe69bf9..0000000
--- a/apps/content/src/browser/lib/window/window.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { TAB_DATA_TYPE } from '@browser/components/tabs/tabDrag'
-
-import { resource } from '../resources'
-
-export let id = -1
-export const setId = (newId: number) => (id = newId)
-
-export const getWindowById = (id: number) =>
- resource.WindowTracker.getWindowById(id)
-
-/**
- * If we want to detect drops outside of the window, we need to ensure that all
- * drops **within** a browser window are handled.
- *
- * This listens for all events with a type equivalent to {@link TAB_DATA_TYPE}
- * and makes sure they have an attached drop type.
- */
-export function initializeWindowDragOverHandler() {
- const handleDragEvent = (event: DragEvent) => {
- const rawDragRepresentation = event.dataTransfer?.getData(TAB_DATA_TYPE)
- if (!rawDragRepresentation) return
-
- // Set this to some drop event other than 'none' so we can detect drops
- // outside of the window in the tab's drag handler
- if (event.dataTransfer) event.dataTransfer.dropEffect = 'link'
- event.preventDefault()
- }
-
- window.addEventListener('dragover', handleDragEvent)
- window.addEventListener('drop', handleDragEvent)
-}
-
-/**
- * Ensures that the window tracker is aware of this window & that when it is
- * closed, the correct cleanup is performed.
- */
-export function registerWithWindowTracker() {
- resource.WindowTracker.registerWindow(window)
- window.addEventListener('unload', () =>
- resource.WindowTracker.removeWindow(window),
- )
-
- window.addEventListener('focus', () => resource.WindowTracker.focusWindow(id))
-}
diff --git a/apps/content/src/browser/lib/xul/NSBrowserAccess.ts b/apps/content/src/browser/lib/xul/NSBrowserAccess.ts
deleted file mode 100644
index 201f9e1..0000000
--- a/apps/content/src/browser/lib/xul/NSBrowserAccess.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/* eslint-disable @typescript-eslint/no-unused-vars */
-
-export enum OpenWhere {
- DefaultWindow = 0,
- CurrentWindow = 1,
- NewWindow = 2,
- NewTab = 3,
- PrintBrowser = 4,
-}
-
-export enum OpenFlags {
- New = 0x0,
- /** Open was triggered by a thirdparty application */
- External = 0x1,
- NoOpener = 0x4,
- NoReferer = 0x8,
-}
-
-export class NSBrowserAccess {
- createContentWindow(
- aURI: nsIURIType,
- aOpenWindowInfo: nsIOpenWindowInfoType,
- aWhere: number,
- aFlags: number,
- aTriggeringPrincipal: nsIPrincipalType,
- aCsp: nsIContentSecurityPolicyType,
- ) {
- throw new Error('Method not implemented.')
- }
-
- createContentWindowInFrame(
- aURI: nsIURIType,
- params: nsIOpenURIInFrameParamsType,
- aWhere: number,
- ): Element | null {
- if (aWhere !== OpenWhere.NewTab) {
- console.warn('NSBrowserAccess: Only OpenWhere.NewTab is supported')
- return null
- }
-
- // TODO: Handle params
- // TODO: Handle unhandled arguments (see nsIBrowserDOMWindow)
- const tab = window.windowApi.tabs.openTab(aURI)
- const browser = tab.getBrowserElement()
- return browser
- }
-
- openURI(
- aURI: nsIURIType,
- aOpenWindowInfo: nsIOpenWindowInfoType,
- aWhere: number,
- aFlags: number,
- aTriggeringPrincipal: nsIPrincipalType,
- aCsp: nsIContentSecurityPolicyType,
- ) {
- throw new Error('Method not implemented.')
- }
- openURIInFrame(
- aURI: nsIURIType,
- params: nsIOpenURIInFrameParamsType,
- aWhere: number,
- aFlags: number,
- aName: string,
- ): Element {
- throw new Error('Method not implemented.')
- }
- canClose(): boolean {
- // TODO: Logic
- return true
- }
- tabCount: number = 0
-
- QueryInterface = ChromeUtils.generateQI(['nsIBrowserDOMWindow'])
-}
diff --git a/apps/content/src/browser/lib/xul/XULBrowserWindow.ts b/apps/content/src/browser/lib/xul/XULBrowserWindow.ts
deleted file mode 100644
index 30c87d1..0000000
--- a/apps/content/src/browser/lib/xul/XULBrowserWindow.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/* eslint-disable @typescript-eslint/no-unused-vars */
-
-export class XULBrowserWindow {
- QueryInterface = ChromeUtils.generateQI([
- 'nsIWebProgressListener',
- 'nsIWebProgressListener2',
- 'nsISupportsWeakReference',
- 'nsIXULBrowserWindow',
- ])
-
- setOverLink(link: string): void {
- // TODO: Do something with information about link hover
- }
- onBeforeLinkTraversal(
- originalTarget: string,
- linkURI: nsIURIType,
- linkNode: Node,
- isAppTab: boolean,
- ): string {
- throw new Error('Method not implemented.')
- }
- showTooltip(
- x: number,
- y: number,
- tooltip: string,
- direction: string,
- browser: Element,
- ): void {
- // TODO: Implement link tooltips
- }
- hideTooltip(): void {
- // TODO: Implment link tooltips
- }
- getTabCount() {
- throw new Error('Method not implemented.')
- }
- onProgressChange64(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aCurSelfProgress: number,
- aMaxSelfProgress: number,
- aCurTotalProgress: number,
- aMaxTotalProgress: number,
- ): void {
- throw new Error('Method not implemented.')
- }
- onRefreshAttempted(
- aWebProgress: nsIWebProgressType,
- aRefreshURI: nsIURIType,
- aMillis: number,
- aSameURI: boolean,
- ): boolean {
- throw new Error('Method not implemented.')
- }
- onStateChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aStateFlags: number,
- aStatus: number,
- ): void {
- throw new Error('Method not implemented.')
- }
- onProgressChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aCurSelfProgress: number,
- aMaxSelfProgress: number,
- aCurTotalProgress: number,
- aMaxTotalProgress: number,
- ): void {
- throw new Error('Method not implemented.')
- }
- onLocationChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aLocation: nsIURIType,
- aFlags: number,
- ): void {
- throw new Error('Method not implemented.')
- }
- onStatusChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aStatus: number,
- aMessage: string,
- ): void {
- throw new Error('Method not implemented.')
- }
- onSecurityChange(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aState: number,
- ): void {
- throw new Error('Method not implemented.')
- }
- onContentBlockingEvent(
- aWebProgress: nsIWebProgressType,
- aRequest: nsIRequestType,
- aEvent: number,
- ): void {
- throw new Error('Method not implemented.')
- }
-}
-
-export const globalXULBrowserWindow = new XULBrowserWindow()
diff --git a/apps/content/src/browser/lib/xul/browser.ts b/apps/content/src/browser/lib/xul/browser.ts
deleted file mode 100644
index d2b05f0..0000000
--- a/apps/content/src/browser/lib/xul/browser.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { resource } from '../resources'
-
-const { useRemoteTabs, useRemoteSubframe } = window.docShell.QueryInterface(
- Ci.nsILoadContext,
-)
-
-const DEFAULT_BROWSER_ATTRIBUTES = {
- message: 'true',
- messagemanagergroup: 'browsers',
- type: 'content',
- contextmenu: 'browser_context_menu',
-} as const
-
-export function setURI(browser: XULBrowserElement, uri: nsIURIType) {
- browser.source = uri.spec
- try {
- browser.loadURI(uri, {
- triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
- // remoteTypeOverride: getBrowserRemoteType(uri),
- })
- } catch (e) {
- console.log(browser, uri)
- console.error(e)
- }
-}
-
-export function getBrowserRemoteType(uri: nsIURIType) {
- const oa = resource.E10SUtils.predictOriginAttributes({ window })
- return resource.E10SUtils.getRemoteTypeForURI(
- uri.spec,
- useRemoteTabs,
- useRemoteSubframe,
- resource.E10SUtils.DEFAULT_REMOTE_TYPE,
- uri,
- oa,
- )
-}
-
-export function createBrowser({
- remoteType,
- attributes,
-}: {
- remoteType?: string
- attributes?: {
- disableglobalhistory?: string
- messagemanagergroup?: string
- ['webextension-view-type']?: string
- }
-} = {}): XULBrowserElement {
- const browser = document.createXULElement('browser')
- if (remoteType) {
- browser.setAttribute('remoteType', remoteType)
- browser.setAttribute('remote', true)
- }
-
- const mergedAttributes = {
- ...DEFAULT_BROWSER_ATTRIBUTES,
- ...(attributes || {}),
- }
-
- for (const attribute in mergedAttributes)
- browser.setAttribute(
- attribute,
- mergedAttributes[attribute as keyof typeof mergedAttributes],
- )
-
- if (useRemoteTabs) browser.setAttribute('maychangeremoteness', 'true')
-
- return browser
-}
diff --git a/apps/content/src/browser/lib/xul/ccWrapper.ts b/apps/content/src/browser/lib/xul/ccWrapper.ts
deleted file mode 100644
index 242f348..0000000
--- a/apps/content/src/browser/lib/xul/ccWrapper.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/* eslint-disable @typescript-eslint/no-explicit-any */
-
-export function getClipboardHelper(): nsIClipboardHelperType {
- return (Cc['@mozilla.org/widget/clipboardhelper;1'] as any).getService(
- Ci.nsIClipboardHelper,
- )
-}
diff --git a/apps/content/src/browser/lib/xul/domevents.ts b/apps/content/src/browser/lib/xul/domevents.ts
deleted file mode 100644
index 9ac030b..0000000
--- a/apps/content/src/browser/lib/xul/domevents.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { Deferred } from '@experiment/shared'
-
-import { NSBrowserAccess } from './NSBrowserAccess'
-import { globalXULBrowserWindow } from './XULBrowserWindow'
-
-export const domContentLoaded: Deferred = new Deferred()
-window.addEventListener(
- 'load',
- () => {
- // This code needs to be run before the first remote browser is created
- window.docShell.treeOwner
- .QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIAppWindow).XULBrowserWindow = globalXULBrowserWindow
- window.browserDOMWindow =
- new NSBrowserAccess() as unknown as nsIBrowserDOMWindowType
-
- domContentLoaded.resolve && domContentLoaded.resolve(null)
- },
- {
- once: true,
- },
-)
diff --git a/apps/content/src/browser/utils/browserElement.js b/apps/content/src/browser/utils/browserElement.js
new file mode 100644
index 0000000..eb1d125
--- /dev/null
+++ b/apps/content/src/browser/utils/browserElement.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+import { browserImports } from '../browserImports.js'
+
+const { useRemoteTabs, useRemoteSubframe } = window.docShell.QueryInterface(
+ Ci.nsILoadContext,
+)
+
+const DEFAULT_BROWSER_ATTRIBUTES = {
+ message: 'true',
+ messagemanagergroup: 'browsers',
+ type: 'content',
+ contextmenu: 'browser_context_menu',
+}
+
+/**
+ * @param {nsIURIType} uri
+ * @param {Record} [attributes={}]
+ */
+export function createBrowser(uri, attributes = {}) {
+ let originAttributes = browserImports.E10SUtils.predictOriginAttributes({
+ window,
+ })
+ const remoteType = browserImports.E10SUtils.getRemoteTypeForURI(
+ uri.spec,
+ useRemoteTabs,
+ useRemoteSubframe,
+ browserImports.E10SUtils.DEFAULT_REMOTE_TYPE,
+ uri,
+ originAttributes,
+ )
+
+ const browser = document.createXULElement('browser')
+ if (remoteType) {
+ browser.setAttribute('remoteType', remoteType)
+ browser.setAttribute('remote', true)
+ }
+
+ for (const attribute in DEFAULT_BROWSER_ATTRIBUTES) {
+ browser.setAttribute(attribute, DEFAULT_BROWSER_ATTRIBUTES[attribute])
+ }
+
+ for (const attribute in attributes) {
+ browser.setAttribute(attribute, attributes[attribute])
+ }
+
+ if (useRemoteTabs) {
+ browser.setAttribute('maychangeremoteness', 'true')
+ }
+
+ return browser
+}
diff --git a/apps/content/src/browser/windowApi/WebsiteTheme.js b/apps/content/src/browser/windowApi/WebsiteTheme.js
new file mode 100644
index 0000000..f8bc568
--- /dev/null
+++ b/apps/content/src/browser/windowApi/WebsiteTheme.js
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+import Color from 'colorjs.io'
+
+import { eventBus } from './eventBus.js'
+
+/**
+ * @param {WebsiteView} view
+ */
+export function registerViewThemeListener(view) {
+ eventBus.on('themeUpdate', (theme) => {
+ if (theme.browserId != view.browserId) {
+ return
+ }
+
+ applyTheme(view, theme)
+ })
+}
+
+/**
+ * @param {WebsiteView} view
+ * @param {import('@browser/event-bus').ThemeUpdate} theme
+ */
+export function applyTheme(view, theme) {
+ const themeColor = theme.meta || theme.body
+
+ if (!themeColor) {
+ return
+ }
+
+ try {
+ const colorObject = new Color(themeColor)
+ let hue = colorObject.oklch[2]
+ let lightness = colorObject.oklch[0] * 100
+ let chroma = colorObject.oklch[1]
+
+ if (Number.isNaN(hue)) {
+ hue = 0
+ chroma = 0
+ }
+
+ const isLight = lightness > 50
+ const withinSpec = isLight ? lightness >= 75 : lightness <= 25
+
+ if (!withinSpec) {
+ lightness = isLight ? 75 : 25
+ if (chroma === 0) {
+ chroma = 0
+ } else {
+ chroma = isLight ? 0.12 : 0.04
+ }
+ }
+
+ const activeLightness = lightness + (isLight ? -5 : 5)
+ const foregroundLightness = isLight ? 10 : 90
+
+ const background = { lightness, chroma }
+ const active = { lightness: activeLightness, chroma }
+ const foreground = {
+ lightness: foregroundLightness,
+ chroma,
+ }
+
+ view.theme = { hue, background, foreground, active }
+ view.events.emit('themeChange', view.theme)
+ } catch (e) {
+ console.warn('Theme generation failed', e)
+ }
+}
diff --git a/apps/content/src/browser/windowApi/WebsiteView.js b/apps/content/src/browser/windowApi/WebsiteView.js
new file mode 100644
index 0000000..8ca47aa
--- /dev/null
+++ b/apps/content/src/browser/windowApi/WebsiteView.js
@@ -0,0 +1,344 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+///
+///
+import mitt from 'mitt'
+import { readable } from 'svelte/store'
+
+import { createBrowser } from '../utils/browserElement.js'
+import { eventBus } from './eventBus.js'
+
+let nextWindowBrowserId = 0
+
+/**
+ * @param {() => boolean} predicate
+ * @param {number} [timing=10]
+ */
+async function spinlock(predicate, timing = 10) {
+ while (!predicate()) {
+ await new Promise((res) => setTimeout(res, timing))
+ }
+}
+
+/**
+ * @param {nsIURIType} uri
+ * @returns {WebsiteView}
+ */
+export function create(uri) {
+ /** @type {WebsiteView} */
+ const view = {
+ windowBrowserId: nextWindowBrowserId++,
+ browser: createBrowser(uri),
+
+ /** @type {import('mitt').Emitter} */
+ events: mitt(),
+ tabProgressListener: null,
+ }
+
+ goTo(view, uri)
+
+ queueMicrotask(async () => {
+ await initialized(view)
+ view.browserId = view.browser.browserId
+ registerListeners(view)
+ })
+ queueMicrotask(async () => {
+ const { registerViewThemeListener } = await import('./WebsiteTheme.js')
+ registerViewThemeListener(view)
+ })
+
+ eventBus.on('iconUpdate', ({ browserId, iconUrl }) => {
+ if (view.browser.browserId === browserId) {
+ view.iconUrl = iconUrl
+ view.events.emit('changeIcon', iconUrl)
+ }
+ })
+
+ return view
+}
+
+/**
+ * @param {WebsiteView} view
+ */
+function initialized(view) {
+ view.browser.docShell
+ return spinlock(() => view.browser.mInitialized)
+}
+
+/**
+ * @todo
+ */
+//function cleanup() {
+// TODO: Cleanup listeners created in WebsiteTheme.js
+// TODO: Cleanup icon listener
+//}
+
+/**
+ * @param {WebsiteView} view
+ * @param {nsIURIType} uri
+ */
+export async function goTo(view, uri) {
+ await initialized(view)
+
+ view.browser.source = uri.spec
+ try {
+ view.browser.loadURI(uri, {
+ triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+ })
+ } catch (e) {
+ console.debug('Debug info for changing url')
+ console.debug(view, uri)
+ console.error(e)
+ }
+}
+
+/**
+ * @template T
+ * @param {WebsiteView} view
+ * @param {(browser: XULBrowserElement, event: WebsiteViewLocationChangeProperties) => T} getter
+ * @param {T} defaultValue
+ */
+export function locationProperty(view, getter, defaultValue) {
+ return readable(defaultValue, (set) => {
+ const updater = (
+ /** @type {WebsiteViewLocationChangeProperties} */ event,
+ ) => event.aWebProgress.isTopLevel && set(getter(view.browser, event))
+
+ view.events.on('locationChange', updater)
+ return () => view.events.off('locationChange', updater)
+ })
+}
+
+// ==========================================================================
+// Handle wacky event registration
+
+/**
+ * @param {WebsiteView} view
+ */
+function registerListeners(view) {
+ view.browser.addEventListener(
+ 'DidChangeBrowserRemoteness',
+ didChangeBrowserRemoteness.bind(view),
+ )
+ view.browser.addEventListener('pagetitlechanged', () => {
+ view.title = view.browser.contentTitle
+ view.events.emit('changeTitle', view.title)
+ })
+
+ registerTabProgressListener(view)
+}
+
+/**
+ * @param {WebsiteView} view
+ */
+function registerTabProgressListener(view) {
+ if (view.tabProgressListener) {
+ view.tabProgressListener.remove(view.browser)
+ view.tabProgressListener = null
+ }
+
+ view.tabProgressListener = new TabProgressListener(view)
+}
+
+/**
+ * @this {WebsiteView}
+ */
+function didChangeBrowserRemoteness() {
+ registerTabProgressListener(this)
+}
+
+// =======================================================================
+// Horrible class incoming!
+//
+/* eslint-disable no-unused-vars */
+
+let progressListenerCounter = 0
+class TabProgressListener {
+ id = progressListenerCounter++
+
+ /** @type {WebsiteView} */
+ view
+
+ /**
+ * @type {nsIWebProgressListenerType & nsIWebProgressType} filter
+ */
+ filter
+
+ /**
+ * @param {WebsiteView} view
+ */
+ constructor(view) {
+ this.view = view
+
+ this.filter = Cc[
+ '@mozilla.org/appshell/component/browser-status-filter;1'
+ ].createInstance(Ci.nsIWebProgress)
+ this.filter.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_ALL)
+ view.browser.webProgress.addProgressListener(
+ this.filter,
+ Ci.nsIWebProgress.NOTIFY_ALL,
+ )
+ }
+
+ /**
+ * @param {XULBrowserElement} browser
+ */
+ remove(browser) {
+ browser.webProgress.removeProgressListener(this.filter)
+ // @ts-expect-error Incorrect type generation
+ this.filter?.removeProgressListener(this)
+
+ this.filter = undefined
+ }
+
+ /**
+ * This request is identical to {@link onProgressChange64}. The only
+ * difference is that the c++ impl uses `long long`s instead of `long`s
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {number} aCurSelfProgress - The current self progress
+ * @param {number} aMaxSelfProgress - The maximum self progress
+ * @param {number} aCurTotalProgress - The current total progress
+ * @param {number} aMaxTotalProgress - The maximum total progress
+ * @returns {void}
+ */
+ onProgressChange64(
+ aWebProgress,
+ aRequest,
+ aCurSelfProgress,
+ aMaxSelfProgress,
+ aCurTotalProgress,
+ aMaxTotalProgress,
+ ) {
+ return this.onProgressChange(
+ aWebProgress,
+ aRequest,
+ aCurSelfProgress,
+ aMaxSelfProgress,
+ aCurTotalProgress,
+ aMaxTotalProgress,
+ )
+ }
+
+ /**
+ * Handles the event when a refresh is attempted.
+ * @param {nsIWebProgressType} _aWebProgress - The web progress type
+ * @param {nsIURIType} _aRefreshURI - The URI to refresh
+ * @param {number} _aMillis - The number of milliseconds to wait before refreshing
+ * @param {boolean} _aSameURI - Whether the refresh URI is the same as the current URI
+ * @returns {boolean} - Returns true
+ */
+ onRefreshAttempted(_aWebProgress, _aRefreshURI, _aMillis, _aSameURI) {
+ // TODO: There is special functionality that should probably go here
+ return true
+ }
+ /**
+ * Handles the state change event.
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {number} aStateFlags - The state flags
+ * @param {number} aStatus - The status
+ * @returns {void}
+ */
+ onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
+ if (!aWebProgress.isTopLevel) return
+ if (
+ aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
+ aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK
+ ) {
+ this.view.events.emit('loadingChange', true)
+ }
+
+ if (
+ aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
+ aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK
+ ) {
+ this.view.events.emit('loadingChange', false)
+ }
+ }
+
+ /**
+ * Handles the progress change event.
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {number} aCurSelfProgress - The current self progress
+ * @param {number} aMaxSelfProgress - The maximum self progress
+ * @param {number} aCurTotalProgress - The current total progress
+ * @param {number} aMaxTotalProgress - The maximum total progress
+ * @returns {void}
+ */
+ onProgressChange(
+ aWebProgress,
+ aRequest,
+ aCurSelfProgress,
+ aMaxSelfProgress,
+ aCurTotalProgress,
+ aMaxTotalProgress,
+ ) {
+ if (!aWebProgress || !aWebProgress.isTopLevel) return
+ this.view.events.emit(
+ 'progressPercent',
+ aMaxTotalProgress !== 0 ? aCurTotalProgress / aMaxTotalProgress : 0,
+ )
+ }
+
+ /**
+ * Handles the location change event.
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {nsIURIType} aLocation - The location URI
+ * @param {number} aFlags - The flags
+ * @returns {void}
+ */
+ onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
+ this.view.events.emit('locationChange', {
+ aWebProgress,
+ aRequest,
+ aLocation,
+ aFlags,
+ id: this.id,
+ })
+ }
+
+ /**
+ * Handles the status change event.
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {number} aStatus - The status
+ * @param {string} aMessage - The message
+ * @returns {void}
+ */
+ onStatusChange(aWebProgress, aRequest, aStatus, aMessage) {
+ // console.log('onStatusChange')
+ }
+
+ /**
+ * Handles the security change event.
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {number} aState - The state
+ * @returns {void}
+ */
+ onSecurityChange(aWebProgress, aRequest, aState) {
+ this.view.events.emit('securityChange', aState)
+ }
+
+ /**
+ * Handles the content blocking event.
+ * @param {nsIWebProgressType} aWebProgress - The web progress type
+ * @param {nsIRequestType} aRequest - The request type
+ * @param {number} aEvent - The event
+ * @returns {void}
+ */
+ onContentBlockingEvent(aWebProgress, aRequest, aEvent) {
+ // console.log('onContentBlockingEvent')
+ }
+
+ QueryInterface = ChromeUtils.generateQI([
+ 'nsIWebProgressListener',
+ 'nsIWebProgressListener2',
+ 'nsISupportsWeakReference',
+ ])
+}
diff --git a/apps/content/src/browser/windowApi/WindowTabs.js b/apps/content/src/browser/windowApi/WindowTabs.js
new file mode 100644
index 0000000..ca204f0
--- /dev/null
+++ b/apps/content/src/browser/windowApi/WindowTabs.js
@@ -0,0 +1,79 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+// @ts-check
+import { writable } from '@amadeus-it-group/tansu'
+import { derived } from 'svelte/store'
+
+import { browserImports } from '../browserImports.js'
+import * as WebsiteViewApi from './WebsiteView.js'
+
+/**
+ * @typedef {object} WebsiteTab
+ * @property {'website'} kind
+ * @property {WebsiteView} view
+ */
+
+export const activeTabId = writable(0)
+
+/**
+ * This is an an array of "selected" tabs. The tab that is in {@link activeTabId} should never be in this variable. There is an subscriber responsible for handling that
+ *
+ * @type {import('@amadeus-it-group/tansu').WritableSignal}
+ */
+export const selectedTabIds = writable([])
+
+/**
+ * @param {number[]} ids
+ */
+export function addSelectedTabs(ids) {
+ selectedTabIds.update((selected) => {
+ for (const id of ids) {
+ if (!selected.includes(id)) {
+ selected = [...selected, id]
+ }
+ }
+
+ return selected
+ })
+}
+
+selectedTabIds.subscribe((ids) => {
+ const activeId = activeTabId()
+ if (ids.includes(activeId)) {
+ selectedTabIds.set(ids.filter((id) => id != activeId))
+ }
+})
+
+activeTabId.subscribe((activeId) => {
+ const ids = selectedTabIds()
+ if (ids.includes(activeId)) {
+ selectedTabIds.set(ids.filter((id) => id != activeId))
+ }
+})
+
+/**
+ * @type {import('@amadeus-it-group/tansu').WritableSignal}
+ */
+export const windowTabs = writable([
+ {
+ kind: 'website',
+ view: WebsiteViewApi.create(
+ browserImports.NetUtil.newURI('https://google.com'),
+ ),
+ },
+ {
+ kind: 'website',
+ view: WebsiteViewApi.create(
+ browserImports.NetUtil.newURI('https://svelte.dev'),
+ ),
+ },
+])
+
+export const activeTab = derived(
+ [activeTabId, windowTabs],
+ ([$activeTabId, $windowTabs]) =>
+ $windowTabs.find((tab) => tab.view.windowBrowserId === $activeTabId),
+)
+
+activeTabId.set(windowTabs()[0].view.windowBrowserId)
diff --git a/apps/content/src/browser/windowApi/eventBus.js b/apps/content/src/browser/windowApi/eventBus.js
new file mode 100644
index 0000000..060ff86
--- /dev/null
+++ b/apps/content/src/browser/windowApi/eventBus.js
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @ts-check
+import mitt from 'mitt'
+
+/**
+ * @type {import('@browser/event-bus').EventBus}
+ */
+export const eventBus = mitt()
+eventBus.on('*', console.debug)
+
+export function registerEventBus() {
+ window.eventBus = eventBus
+}
diff --git a/apps/content/src/credits/credits.ts b/apps/content/src/credits/credits.js
similarity index 88%
rename from apps/content/src/credits/credits.ts
rename to apps/content/src/credits/credits.js
index cf28646..9b19a18 100644
--- a/apps/content/src/credits/credits.ts
+++ b/apps/content/src/credits/credits.js
@@ -1,8 +1,6 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import '@shared/styles/global.css'
-
import Credits from './Credits.svelte'
new Credits({ target: document.body })
diff --git a/apps/content/src/history/History.svelte b/apps/content/src/history/History.svelte
deleted file mode 100644
index 5faef98..0000000
--- a/apps/content/src/history/History.svelte
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
- {#if $model.root}
-
- {#each children as child}
-
- {/each}
-
- {/if}
-
-
-
diff --git a/apps/content/src/history/component/Entry.svelte b/apps/content/src/history/component/Entry.svelte
deleted file mode 100644
index 03f31d7..0000000
--- a/apps/content/src/history/component/Entry.svelte
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {title}
-
-
-
diff --git a/apps/content/src/history/component/HistoryContainerNode.svelte b/apps/content/src/history/component/HistoryContainerNode.svelte
deleted file mode 100644
index 6f71ff2..0000000
--- a/apps/content/src/history/component/HistoryContainerNode.svelte
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
- {#if open}
-
- {:else}
-
- {/if}
-
-
-
- {#if open}
- {#each children as node}
-
- {/each}
- {/if}
-
-
-
-
diff --git a/apps/content/src/history/component/HistoryItemNode.svelte b/apps/content/src/history/component/HistoryItemNode.svelte
deleted file mode 100644
index e240430..0000000
--- a/apps/content/src/history/component/HistoryItemNode.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/history/component/HistoryNode.svelte b/apps/content/src/history/component/HistoryNode.svelte
deleted file mode 100644
index f04f6a0..0000000
--- a/apps/content/src/history/component/HistoryNode.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-{#if isContainer}
-
-{:else}
-
-{/if}
diff --git a/apps/content/src/bookmarks/bookmarks.css b/apps/content/src/history/history.js
similarity index 88%
rename from apps/content/src/bookmarks/bookmarks.css
rename to apps/content/src/history/history.js
index 0b0c756..e003224 100644
--- a/apps/content/src/bookmarks/bookmarks.css
+++ b/apps/content/src/history/history.js
@@ -1,7 +1,3 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-body {
- height: 100vh;
-}
diff --git a/apps/content/src/history/history.ts b/apps/content/src/history/history.ts
deleted file mode 100644
index ccf360b..0000000
--- a/apps/content/src/history/history.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import 'remixicon/fonts/remixicon.css'
-
-import '@shared/styles/window.css'
-
-import History from './History.svelte'
-
-new History({
- target: document.body,
-})
diff --git a/apps/content/src/settings/Settings.svelte b/apps/content/src/settings/Settings.svelte
deleted file mode 100644
index 549c11a..0000000
--- a/apps/content/src/settings/Settings.svelte
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
- Window page
- New tab page
-
-
-
-
-
- {#await searchEngines then searchEngines}
- ({
- value: engine._extensionID,
- label: engine._name,
- icon: engine.iconURI.spec,
- }))}
- pref={SEARCH_ENGINE_PREF}
- defaultValue={DEFAULT_SEARCH_ENGINE}>Default search engine
- {/await}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Open browser toolbox
-
-
- Reload browser chrome
-
-
-
-
- New Window
- New Tab
- Refresh Tab
- Close Active Tab
- Next tab
- Previous Tab
-
- Zoom in
- Zoom out
- Reset Zoom
-
- {#each [1, 2, 3, 4, 5, 6, 7, 8] as tabNum}
- Jump to tab {tabNum}
- {/each}
- Find In Page
-
-
-
-
-
-
-
-
diff --git a/apps/content/src/settings/components/Category.svelte b/apps/content/src/settings/components/Category.svelte
deleted file mode 100644
index d4fbafc..0000000
--- a/apps/content/src/settings/components/Category.svelte
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
{title}
-
-
-
-
diff --git a/apps/content/src/settings/components/SubCategory.svelte b/apps/content/src/settings/components/SubCategory.svelte
deleted file mode 100644
index ac2689f..0000000
--- a/apps/content/src/settings/components/SubCategory.svelte
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-{title}
-
-
-
-
-
diff --git a/apps/content/src/settings/components/pref/ContextMenuPref/ContextMenuPref.svelte b/apps/content/src/settings/components/pref/ContextMenuPref/ContextMenuPref.svelte
deleted file mode 100644
index 783b9f8..0000000
--- a/apps/content/src/settings/components/pref/ContextMenuPref/ContextMenuPref.svelte
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
- {
- e.preventDefault()
- const [_, existingIndex] =
- e.dataTransfer?.getData('text/plain')?.split(':') ?? []
- if (!existingIndex) return
- value.update((items) => {
- const oldIndex = parseInt(existingIndex)
- const newItems = [...items]
- newItems.splice(oldIndex, 1)
- return newItems
- })
- }}
->
-
-
Available Items
-
- {#each availableItems as item}
-
- {/each}
-
-
-
-
-
-
diff --git a/apps/content/src/settings/components/pref/ContextMenuPref/ContextMenuPreview.svelte b/apps/content/src/settings/components/pref/ContextMenuPref/ContextMenuPreview.svelte
deleted file mode 100644
index f61e5f8..0000000
--- a/apps/content/src/settings/components/pref/ContextMenuPref/ContextMenuPreview.svelte
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
- {#each $items as item, index}
-
- {/each}
-
-
-
-
diff --git a/apps/content/src/settings/components/pref/ContextMenuPref/InsertItem.svelte b/apps/content/src/settings/components/pref/ContextMenuPref/InsertItem.svelte
deleted file mode 100644
index e8df6f6..0000000
--- a/apps/content/src/settings/components/pref/ContextMenuPref/InsertItem.svelte
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
- {
- e.dataTransfer?.setData(
- 'text/plain',
- item.type === 'separator' ? 'separator' : item.id,
- )
- if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'
- dragging = true
- }}
- on:dragend={(e) => {
- dragging = false
- }}
->
- {item.type === 'separator' ? 'Separator' : item.title}
-
-
-
diff --git a/apps/content/src/settings/components/pref/ContextMenuPref/PreviewItem.svelte b/apps/content/src/settings/components/pref/ContextMenuPref/PreviewItem.svelte
deleted file mode 100644
index 5a59778..0000000
--- a/apps/content/src/settings/components/pref/ContextMenuPref/PreviewItem.svelte
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
- {
- e.dataTransfer?.setData(
- 'text/plain',
- (item.type === 'separator' ? 'separator' : item.id) + ':' + index,
- )
- if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'
- dragging = true
- }}
- on:dragend={(e) => {
- dragging = false
- }}
- on:dragover={(e) => {
- if (dragging) return
-
- const boundingRect = e.currentTarget.getBoundingClientRect()
- const yMiddle = boundingRect.y + boundingRect.height / 2
- const isBefore = e.y <= yMiddle
- drop = isBefore ? 'start' : 'end'
- }}
- on:dragleave={(e) => {
- if (dragging) return
- drop = false
- }}
- on:dragover={(e) => {
- if (dragging) return
- e.preventDefault()
- if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'
- }}
- on:drop|preventDefault|stopPropagation={(e) => {
- items.update((items) => {
- if (dragging) return items
-
- const [newItemId, existingIndex] =
- e.dataTransfer?.getData('text/plain')?.split(':') ?? []
-
- const newItems = [...items]
-
- let newItem
- let wasBefore = false
- if (existingIndex) {
- const oldIndex = parseInt(existingIndex)
- newItem = newItems.splice(oldIndex, 1)[0]
- wasBefore = oldIndex < index
- } else {
- newItem = fromId(newItemId)
- }
-
- const newIndex = index + (drop === 'start' ? 0 : 1) - (wasBefore ? 1 : 0)
- newItems.splice(newIndex, 0, newItem)
-
- return newItems
- })
- drop = false
- }}
->
- {#if item.type === 'separator'}
-
- {:else}
- {item.title}
- {/if}
-
-
-
diff --git a/apps/content/src/settings/components/pref/ContextMenuPref/index.ts b/apps/content/src/settings/components/pref/ContextMenuPref/index.ts
deleted file mode 100644
index f47c7be..0000000
--- a/apps/content/src/settings/components/pref/ContextMenuPref/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import ContextMenuPref from './ContextMenuPref.svelte'
-
-export { ContextMenuPref }
diff --git a/apps/content/src/settings/components/pref/ContextMenuPref/prefWrapper.ts b/apps/content/src/settings/components/pref/ContextMenuPref/prefWrapper.ts
deleted file mode 100644
index 5f12630..0000000
--- a/apps/content/src/settings/components/pref/ContextMenuPref/prefWrapper.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import { writable } from 'svelte/store'
-
-import { type MenuItem, fromIdString, toIdString } from '@shared/contextMenus'
-
-export function contextMenuPrefWrapper(pref: string) {
- const store = writable([])
-
- {
- const prefValue = Services.prefs.getStringPref(pref, '')
- store.set(fromIdString(prefValue))
- }
-
- store.subscribe((value) => {
- Services.prefs.setStringPref(pref, toIdString(value))
- })
-
- return store
-}
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Component.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Component.svelte
deleted file mode 100644
index 29f5707..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Component.svelte
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
-
-
-{#if !isRoot}
-
-{/if}
-
-
-
- {
- if (!canDrag) return
- e.stopPropagation()
- if (hover) return
- listener.emit('clearHover')
- hover = true
- }}
- on:click={(e) => {
- if (!draggable || component.type === 'temp-drop-target') return
- e.stopPropagation()
- selectedId = component.id
- }}
- on:dragstart={(e) => {
- if (!canDrag) return
- e.stopPropagation()
- e.dataTransfer?.setData('component', JSON.stringify(component))
- if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'
- }}
- on:dragover={(e) => {
- e.stopPropagation()
- e.preventDefault()
-
- const data = JSON.parse(e.dataTransfer?.getData('component') ?? 'false')
- if (!data) return
- if (data.id === component.id) return
-
- if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'
- dropTarget = calculateDropTargetRel(parentOrientation, e)
- }}
- on:dragleave|stopPropagation={() => (dropTarget = null)}
- on:drop|preventDefault|stopPropagation={(e) => {
- const data = JSON.parse(e.dataTransfer?.getData('component') ?? 'false')
- if (!data || !dropTarget || isParent(data, component)) {
- dropTarget = null
- return
- }
- applyDrop(root, data, component, dropTarget)
-
- // Force an update
- root.id = nanoid()
- dropTarget = null
- }}
->
- {#if component.type === 'block'}
-
- {:else if component.type === 'icon'}
-
- {:else if component.type === 'spacer'}
-
- {:else if component.type === 'browser'}
-
- {:else if component.type === 'omnibox'}
-
- {:else if component.type === 'tabs'}
-
- {:else if component.type === 'temp-drop-target'}
-
- {/if}
-
-
-{#if !isRoot}
-
-{/if}
-
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/Block.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Components/Block.svelte
deleted file mode 100644
index c7efd76..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/Block.svelte
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-{#each component.content as child}
-
-{:else}
-
-{/each}
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/IconButton.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Components/IconButton.svelte
deleted file mode 100644
index f1215d4..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/IconButton.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/Omnibox.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Components/Omnibox.svelte
deleted file mode 100644
index 83a65c9..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/Omnibox.svelte
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Omnibox
-
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/Spacer.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Components/Spacer.svelte
deleted file mode 100644
index 34f8f6d..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/Spacer.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-{#if verbose}
- Spacer
-{:else}
-
-{/if}
-
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/Tabs.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Components/Tabs.svelte
deleted file mode 100644
index 1152267..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/Tabs.svelte
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-{#if verbose}
- Tabs
-{:else}
- Tab 1
- Tab 2
-{/if}
-
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/TempDropTarget.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Components/TempDropTarget.svelte
deleted file mode 100644
index 02143e3..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/TempDropTarget.svelte
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
- {#if verbose}
- Block
- {/if}
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Components/index.ts b/apps/content/src/settings/components/pref/CustomizableUI/Components/index.ts
deleted file mode 100644
index 8e9cd19..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Components/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import Block from './Block.svelte'
-import Browser from './Browser.svelte'
-import IconButton from './IconButton.svelte'
-import Omnibox from './Omnibox.svelte'
-import Spacer from './Spacer.svelte'
-import Tabs from './Tabs.svelte'
-import TempDropTarget from './TempDropTarget.svelte'
-
-export { Block, Browser, IconButton, Omnibox, Spacer, Tabs, TempDropTarget }
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/Configure.svelte b/apps/content/src/settings/components/pref/CustomizableUI/Configure.svelte
deleted file mode 100644
index c26bb54..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/Configure.svelte
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-{#if selectedComponent && selectedPrefs}
- {#each selectedPrefs as pref}
-
- {pref.key}
-
- {#if pref.type === 'string'}
- {#if pref.options}
-
- (root = update((c) => {
- c[pref.key] = e.target.value
- return c
- }))}
- >
- {#each pref.options as option}
- {option}
- {/each}
-
- {:else}
-
- (root = update((c) => {
- c[pref.key] = e.target.value
- return c
- }))}
- />
- {/if}
- {/if}
-
- {#if pref.type === 'number'}
-
- (root = update((c) => {
- c[pref.key] = Number(e.target.value)
- return c
- }))}
- />
- {/if}
-
- {#if pref.type === 'block-size'}
-
- (root = update((c) => {
- c[pref.key].type = e.target.value
- return c
- }))}
- >
- Grow
- Fixed
- Content
-
-
- {#if selectedComponent[pref.key].type !== 'content'}
-
- (root = update((c) => {
- c[pref.key].value = Number(e.target.value)
- return c
- }))}
- />
- {/if}
- {/if}
-
- {:else}
- Selected item does not have any prefs
- {/each}
-{/if}
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/CustomizableUIPref.svelte b/apps/content/src/settings/components/pref/CustomizableUI/CustomizableUIPref.svelte
deleted file mode 100644
index 4a21fbb..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/CustomizableUIPref.svelte
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
- Warning: Editing this layout will likely unload all of your tabs!
- Proceed with caution
-
-
-
-
-
Items
-
- {#each cuiPreviewItems as item}
-
- {/each}
-
-
-
-
-
-
-
-
Configure item
-
- {#if selectedId}
-
-
- {#if selectedId !== component.id}
- (component = removeChildById(selectedId, component))}
- >Remove
- {/if}
- {/if}
-
-
-
-
diff --git a/apps/content/src/settings/components/pref/CustomizableUI/index.ts b/apps/content/src/settings/components/pref/CustomizableUI/index.ts
deleted file mode 100644
index 925ef56..0000000
--- a/apps/content/src/settings/components/pref/CustomizableUI/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import CustomizableUiPref from './CustomizableUIPref.svelte'
-
-export { CustomizableUiPref }
diff --git a/apps/content/src/settings/components/pref/SelectPref.svelte b/apps/content/src/settings/components/pref/SelectPref.svelte
deleted file mode 100644
index b55c49f..0000000
--- a/apps/content/src/settings/components/pref/SelectPref.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/settings/components/pref/StringPref.svelte b/apps/content/src/settings/components/pref/StringPref.svelte
deleted file mode 100644
index 1146786..0000000
--- a/apps/content/src/settings/components/pref/StringPref.svelte
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
-
Services.prefs.setStringPref(pref, value)}
- />
-
-
-
diff --git a/apps/content/src/settings/components/pref/index.ts b/apps/content/src/settings/components/pref/index.ts
deleted file mode 100644
index 20e0020..0000000
--- a/apps/content/src/settings/components/pref/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import SelectPref from './SelectPref.svelte'
-import StringPref from './StringPref.svelte'
-
-export * from './ContextMenuPref'
-export * from './CustomizableUI'
-
-export { StringPref, SelectPref }
diff --git a/apps/content/src/settings/components/sidebar/Sidebar.svelte b/apps/content/src/settings/components/sidebar/Sidebar.svelte
deleted file mode 100644
index 4a1d8cd..0000000
--- a/apps/content/src/settings/components/sidebar/Sidebar.svelte
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/settings/components/sidebar/index.ts b/apps/content/src/settings/components/sidebar/index.ts
deleted file mode 100644
index b3650e5..0000000
--- a/apps/content/src/settings/components/sidebar/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import Sidebar from './Sidebar.svelte'
-
-export * from './sidebar'
-export { Sidebar }
diff --git a/apps/content/src/settings/components/sidebar/sidebar.ts b/apps/content/src/settings/components/sidebar/sidebar.ts
deleted file mode 100644
index b7511ed..0000000
--- a/apps/content/src/settings/components/sidebar/sidebar.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-let sidebarItemCounter = 0
-
-export class SidebarItemData {
- counter = sidebarItemCounter++
-
- container: HTMLDivElement
- title: string
- id: string
-
- hasObserver = false
-
- constructor(container: HTMLDivElement, title: string) {
- this.container = container
- this.title = title
-
- this.id = this.title.replace(/\s/g, '_')
- this.container.setAttribute('id', this.id)
- }
-
- addObserver(observer: IntersectionObserver | undefined) {
- if (this.hasObserver || !observer) return
- observer.observe(this.container)
- this.hasObserver = true
- }
-}
diff --git a/apps/content/src/settings/settings.css b/apps/content/src/settings/settings.js
similarity index 84%
rename from apps/content/src/settings/settings.css
rename to apps/content/src/settings/settings.js
index d20f0d3..e003224 100644
--- a/apps/content/src/settings/settings.css
+++ b/apps/content/src/settings/settings.js
@@ -1,7 +1,3 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-html {
- scroll-behavior: smooth;
-}
diff --git a/apps/content/src/settings/settings.ts b/apps/content/src/settings/settings.ts
deleted file mode 100644
index 750dc07..0000000
--- a/apps/content/src/settings/settings.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import 'remixicon/fonts/remixicon.css'
-
-import '@shared/styles/global.css'
-
-import Settings from './Settings.svelte'
-import './settings.css'
-
-new Settings({
- target: document.body,
-})
diff --git a/apps/content/src/shared/ExtBookmarkAPI.ts b/apps/content/src/shared/ExtBookmarkAPI.ts
deleted file mode 100644
index 762c964..0000000
--- a/apps/content/src/shared/ExtBookmarkAPI.ts
+++ /dev/null
@@ -1,197 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { lazy } from '@experiment/shared'
-
-/**
- * @fileoverview
- * A helper for interacting with bookmarks with a similar target API to the webextention
- * api
- */
-
-const { TYPE_BOOKMARK, TYPE_FOLDER, TYPE_SEPARATOR } = lazy.Bookmarks
-
-const BOOKMARK_SEPERATOR_URL = 'data:' as const
-const BOOKMARKS_TYPES_TO_API_TYPES_MAP = new Map([
- [TYPE_BOOKMARK, 'bookmark'],
- [TYPE_FOLDER, 'folder'],
- [TYPE_SEPARATOR, 'separator'],
-])
-
-const API_TYPES_TO_BOOKMARKS_TYPES_MAP = new Map(
- [...BOOKMARKS_TYPES_TO_API_TYPES_MAP.entries()].map(([k, v]) => [v, k]),
-)
-
-export type BookmarkType = 'bookmark' | 'folder' | 'separator'
-
-interface TreeNodeBase {
- id: string
-
- title: string
- index: number
- dateAdded: number
-}
-
-export interface BookmarkTreeNode extends TreeNodeBase {
- type: 'bookmark'
- parentId: string
- url: string
-}
-
-export interface FolderTreeNode extends TreeNodeBase {
- type: 'folder'
- parentId?: string
- children?: TreeNode[]
- dateGroupModified: number
-}
-
-export interface SeparatorTreeNode extends TreeNodeBase {
- type: 'separator'
- parentId: string
- url: typeof BOOKMARK_SEPERATOR_URL
-}
-
-export type TreeNode = BookmarkTreeNode | FolderTreeNode | SeparatorTreeNode
-
-export async function getTree(
- rootGuid: string,
- onlyChildren: boolean,
-): Promise {
- const convert =
- (parent: PlacesBookmarkTreeNode | null) =>
- (node: PlacesBookmarkTreeNode): TreeNode => {
- const bookmark = convertBookmarks(node)
-
- if (parent) bookmark.parentId = parent.guid
- if (bookmark.type === 'folder' && !onlyChildren)
- bookmark.children = node.children?.map(convert(node)) || []
-
- return bookmark
- }
-
- const root = await lazy.PlacesUtils.promiseBookmarksTree(rootGuid, undefined)
-
- if (onlyChildren) {
- const children = root.children || []
- return children.map(convert(root))
- }
-
- const treenode = convert(null)(root)
- treenode.parentId = root.parentGuid
- return [treenode]
-}
-
-const convertBookmarks = (result: PlacesBookmarkTreeNode): TreeNode => {
- const type = BOOKMARKS_TYPES_TO_API_TYPES_MAP.get(
- result.typeCode || result.type || TYPE_BOOKMARK,
- )
- const treeNode: TreeNodeBase = {
- id: result.guid,
- title: lazy.Bookmarks.getLocalizedTitle(result) || '',
- index: result.index,
- dateAdded: result.dateAdded / 1000,
- }
-
- if (!type) {
- throw new Error('Invalid bookmark type')
- }
-
- if (type == 'bookmark') {
- const bookmark: BookmarkTreeNode = {
- ...treeNode,
- type: 'bookmark',
- parentId: result.parentGuid as string,
- url: result.url ? result.url.href : result.uri || '',
- }
- return bookmark
- }
-
- if (type == 'folder') {
- const folder: FolderTreeNode = {
- ...treeNode,
- type: 'folder',
- parentId: result.parentGuid,
- dateGroupModified: result.lastModified / 1000,
- }
- return folder
- }
-
- const separator: SeparatorTreeNode = {
- ...treeNode,
- type: 'separator',
- parentId: result.parentGuid!,
- url: 'data:',
- }
- return separator
-}
-
-export async function getChildren(rootGuid: string): Promise {
- const [treenode] = await getTree(rootGuid, false)
- return (treenode as FolderTreeNode).children || []
-}
-
-export const getFullTree = () => getChildren(lazy.Bookmarks.rootGuid)
-
-export const search = (
- query: string | Partial<{ query: string; url: string; title: string }>,
-) =>
- (lazy.Bookmarks.search(query) as Promise).then(
- (results) => results.map(convertBookmarks),
- )
-
-export interface CreateDetails {
- index: number
- parentId: string
- title: string
- type: BookmarkType
- url: string
-}
-
-export const ensureNotRoot = (id: string): string => {
- if (id === lazy.Bookmarks.rootGuid)
- throw new Error('The root bookmark cannot be modified')
-
- return id
-}
-
-export function create(options: Partial): Promise {
- const info: Partial = {
- title: options.title,
- index: options.index,
- parentGuid: options.parentId
- ? ensureNotRoot(options.parentId)
- : lazy.Bookmarks.unfiledGuid,
- type: options.type
- ? API_TYPES_TO_BOOKMARKS_TYPES_MAP.get(options.type)
- : options.url
- ? TYPE_BOOKMARK
- : TYPE_FOLDER,
- }
-
- if (info.type === TYPE_BOOKMARK) info.url = new URL(options.url || '')
-
- return lazy.Bookmarks.insert(info).then(convertBookmarks)
-}
-
-export function get(id: string): Promise {
- return lazy.Bookmarks.fetch(id).then(convertBookmarks)
-}
-
-export const update = (
- id: string,
- changes: Partial<{ title: string; url: string }>,
-): Promise =>
- lazy.Bookmarks.update({
- guid: ensureNotRoot(id),
- title: changes.title,
- url: changes.url,
- }).then(convertBookmarks)
-
-export const remove = (
- id: string,
- removeNonEmptyFolders = false,
-): Promise =>
- lazy.Bookmarks.remove(
- { guid: ensureNotRoot(id) },
- { preventRemovalOfNonEmptyFolders: !removeNonEmptyFolders },
- )
diff --git a/apps/content/src/shared/ExtHistoryAPI.ts b/apps/content/src/shared/ExtHistoryAPI.ts
deleted file mode 100644
index 4339fa1..0000000
--- a/apps/content/src/shared/ExtHistoryAPI.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { lazy } from '@experiment/shared'
-
-const DAY_MS = 24 * 60 * 60 * 1000
-
-/**
- * @linkcode https://searchfox.org/mozilla-central/source/browser/components/extensions/parent/ext-history.js#253
- */
-const executeAsyncQuery = (
- historyQuery: nsINavHistoryQueryType,
- options: nsINavHistoryQueryOptionsType,
- resultConvertor: (result: mozIStorageRowType) => T,
-): Promise =>
- new Promise((resolve, reject) => {
- const results: T[] = []
- lazy.PlacesUtils.history.asyncExecuteLegacyQuery(historyQuery, options, {
- handleResult: (result: mozIStorageResultSetType) => {
- let row
- while ((row = result.getNextRow())) results.push(resultConvertor(row))
- },
- handleError: (error: mozIStorageErrorType) =>
- reject(
- new Error(
- `Async execution error (${error.result}): ${error.message}`,
- ),
- ),
- handleCompletion: () => resolve(results),
- // The generated types still include constants in the definition of this
- // interface, which we don't need to include here
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- } as any)
- })
-
-/*
- * Converts a mozIStorageRow into a HistoryItem
- */
-const convertRowToHistoryItem = (row: mozIStorageRowType): HistoryItem => ({
- id: row.getResultByName('guid'),
- url: row.getResultByName('url'),
- title: row.getResultByName('page_title'),
- lastVisitTime: lazy.PlacesUtils.toDate(
- row.getResultByName('last_visit_date'),
- ).getTime(),
- visitCount: row.getResultByName('visit_count'),
-})
-
-export function search({
- text,
- startTime = Date.now() - DAY_MS,
- endTime = Number.MAX_SAFE_INTEGER,
- maxResults = 100,
-}: {
- text?: string
- startTime?: number
- endTime?: number
- maxResults?: number
-}): Promise {
- if (startTime > endTime) {
- throw new Error('startTime cannot be greater than endTime')
- }
-
- // Converts to PRTime (microseconds since epoch)
- const beginTimePR = lazy.PlacesUtils.toPRTime(startTime)
- const endTimePR = lazy.PlacesUtils.toPRTime(endTime)
-
- const options = lazy.PlacesUtils.history.getNewQueryOptions()
- options.includeHidden = true
- options.maxResults = maxResults
- options.sortingMode = options.SORT_BY_DATE_DESCENDING
-
- const query = lazy.PlacesUtils.history.getNewQuery()
- if (text) query.searchTerms = text
- query.beginTime = beginTimePR
- query.endTime = endTimePR
-
- return executeAsyncQuery(query, options, convertRowToHistoryItem)
-}
-
-export function getVisits() {}
-
-export function addUrl() {}
-
-export function deleteUrl() {}
-
-export function deleteRange() {}
-
-export function deleteAll() {}
-
-export const onTitleChanged = null
-export const onVisited = null
-export const onVisitRemoved = null
-
-// =============================================================================
-// Extension types
-
-/**
- * @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history/TransitionType}
- */
-export type TransitionType =
- | 'link'
- | 'typed'
- | 'auto_bookmark'
- | 'auto_subframe'
- | 'manual_subframe'
- | 'generated'
- | 'auto_toplevel'
- | 'form_submit'
- | 'reload'
- | 'keyword'
- | 'keyword_generated'
-
-/**
- * @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history/HistoryItem}
- */
-export interface HistoryItem {
- id: string
- url?: string
- title?: string
- lastVisitTime?: number
- visitCount?: number
- /** @deprecated - unimplemented in Gecko */
- typedCount?: number
-}
-
-/**
- * @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history/VisitItem}
- */
-export interface VisitItem {
- /**
- * This is the identifier of {@link HistoryItem}
- */
- id: string
- visitId: string
- visitTime?: number
- referringVisitId: string
- transition: TransitionType
-}
-
-// =============================================================================
-// Gecko types
-
-// interface GeckoVisitInfo {
-// date: Date
-// transition: number
-// referrer?: URL | nsIURIType | string
-// }
-
-// interface GeckoPageInfo {
-// guid: string
-// url: URL | nsIURIType | string
-// title?: string
-// description?: string
-// previewImageURL?: URL | nsIURIType | string
-// frequency?: number
-// visits?: GeckoVisitInfo[]
-// annotations?: Map
-// }
diff --git a/apps/content/src/shared/TypedImportUtilities.ts b/apps/content/src/shared/TypedImportUtilities.ts
deleted file mode 100644
index 466f173..0000000
--- a/apps/content/src/shared/TypedImportUtilities.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
- * @deprecated You should add your lazy imports to file://./lazy.ts
- */
-export function lazyESModuleGetters>(
- modules: Modules,
- // @ts-expect-error - Cannot guarantee overlapping key type
-): { [Key in keyof Modules]: MozESMExportType[Key] } {
- // @ts-expect-error - Cannot guarantee overlapping key type
- const lazy = {} as { [Key in keyof Modules]: MozESMExportType[Key] }
-
- ChromeUtils.defineESModuleGetters(lazy, modules)
-
- return lazy
-}
diff --git a/apps/content/src/shared/components/Button.svelte b/apps/content/src/shared/components/Button.svelte
deleted file mode 100644
index 1084b5e..0000000
--- a/apps/content/src/shared/components/Button.svelte
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/shared/components/FancySelect.svelte b/apps/content/src/shared/components/FancySelect.svelte
deleted file mode 100644
index 4e96850..0000000
--- a/apps/content/src/shared/components/FancySelect.svelte
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/shared/components/Spinner.svelte b/apps/content/src/shared/components/Spinner.svelte
deleted file mode 100644
index a54743b..0000000
--- a/apps/content/src/shared/components/Spinner.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
diff --git a/apps/content/src/shared/components/TextInput.svelte b/apps/content/src/shared/components/TextInput.svelte
deleted file mode 100644
index e6aae83..0000000
--- a/apps/content/src/shared/components/TextInput.svelte
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/content/src/shared/components/ToolbarButton.svelte b/apps/content/src/shared/components/ToolbarButton.svelte
deleted file mode 100644
index 0480df5..0000000
--- a/apps/content/src/shared/components/ToolbarButton.svelte
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/apps/content/src/shared/components/Tree/TreeView.svelte b/apps/content/src/shared/components/Tree/TreeView.svelte
deleted file mode 100644
index 5e407a1..0000000
--- a/apps/content/src/shared/components/Tree/TreeView.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
diff --git a/apps/content/src/shared/components/Tree/index.ts b/apps/content/src/shared/components/Tree/index.ts
deleted file mode 100644
index f427141..0000000
--- a/apps/content/src/shared/components/Tree/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import TreeView from './TreeView.svelte'
-
-export { TreeView }
diff --git a/apps/content/src/shared/components/index.ts b/apps/content/src/shared/components/index.ts
deleted file mode 100644
index 2dd71b2..0000000
--- a/apps/content/src/shared/components/index.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import Button from './Button.svelte'
-import FancySelect from './FancySelect.svelte'
-import Spinner from './Spinner.svelte'
-import TextInput from './TextInput.svelte'
-import ToolbarButton from './ToolbarButton.svelte'
-
-export type ButtonKind = 'primary' | 'secondary'
-
-export { Button, FancySelect, Spinner, TextInput, ToolbarButton }
diff --git a/apps/content/src/shared/contextMenus/MenuItem.ts b/apps/content/src/shared/contextMenus/MenuItem.ts
deleted file mode 100644
index 6a5df26..0000000
--- a/apps/content/src/shared/contextMenus/MenuItem.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { dynamicStringPref } from '@experiment/shared'
-
-import { MENU_ITEM_ACTIONS } from './menuItems'
-
-/**
- * All of the valid menu item IDs. Note that it must not include 'separator'
- */
-export const MENU_ITEM_ACTION_IDS = [
- 'selection__copy',
- 'link__copy',
- 'link__new-tab',
- 'link__new-window',
- 'navigation__back',
- 'navigation__forward',
- 'navigation__reload',
- 'navigation__bookmark',
- 'image__copy',
- 'image__copy-link',
- 'image__new-tab',
- 'image__save',
-] as const
-
-interface MenuItemBase {}
-
-export interface MenuItemSeparator extends MenuItemBase {
- type: 'separator'
-}
-
-export type VisibilityCheck = (info: ContextMenuInfo) => boolean
-export interface MenuItemAction extends MenuItemBase {
- type: 'action'
- id: (typeof MENU_ITEM_ACTION_IDS)[number]
- title: string
- icon?: string
-
- visible: VisibilityCheck
- action: (info: ContextMenuInfo) => void
-}
-
-export type MenuItem = MenuItemSeparator | MenuItemAction
-
-export function fromId(id: string): MenuItem {
- if (id == 'separator') return { type: 'separator' } as const
- return MENU_ITEM_ACTIONS.find((item) => item.id == id)!
-}
-
-export const toIdString = (items: MenuItem[]): string =>
- items
- .map((item) => (item.type === 'separator' ? 'separator' : item.id))
- .join(',')
-
-export const fromIdString = (idString: string): MenuItem[] =>
- idString.split(',').map(fromId).filter(Boolean)
-
-export const getFromPref = (pref: string): MenuItem[] =>
- fromIdString(Services.prefs.getStringPref(pref, ''))
-
-export const getMenuItemsDynamicPref = dynamicStringPref(fromIdString)
diff --git a/apps/content/src/shared/contextMenus/index.ts b/apps/content/src/shared/contextMenus/index.ts
deleted file mode 100644
index 2777035..0000000
--- a/apps/content/src/shared/contextMenus/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export * from './MenuItem'
-export * from './menuItems'
diff --git a/apps/content/src/shared/contextMenus/menuItems.ts b/apps/content/src/shared/contextMenus/menuItems.ts
deleted file mode 100644
index 6b460a9..0000000
--- a/apps/content/src/shared/contextMenus/menuItems.ts
+++ /dev/null
@@ -1,166 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import curry from 'fnts/curry'
-
-import { resource } from '@browser/lib/resources'
-import { contextMenuParentActor } from '@browser/lib/window/contextMenu'
-import { getClipboardHelper } from '@browser/lib/xul/ccWrapper'
-
-import type { MenuItemAction, VisibilityCheck } from '.'
-
-const ALWAYS = () => true
-const HAS_TEXT_SELECTION: VisibilityCheck = (info) =>
- typeof info.textSelection == 'string'
-const HAS_HREF: VisibilityCheck = (info) => typeof info.href == 'string'
-const HAS_IMAGE_SRC: VisibilityCheck = (info) =>
- typeof info.imageSrc == 'string'
-
-const onStringValue = curry(
- (
- method: (value: string, info: ContextMenuInfo) => void,
- prop: keyof ContextMenuInfo,
- info: ContextMenuInfo,
- ) => {
- const value = info[prop]
- if (typeof value == 'string') method(value, info)
- },
-)
-
-const copyProp = onStringValue((value) => {
- const clipboardHelper = getClipboardHelper()
- clipboardHelper.copyString(value, 0)
-})
-
-const openInNewTab = onStringValue((value) => {
- const tab = window.windowApi.tabs.openTab(resource.NetUtil.newURI(value))
- if (Services.prefs.getBoolPref('browser.tabs.newTabFocus')) {
- queueMicrotask(() => window.windowApi.tabs.setCurrentTab(tab))
- }
-})
-
-const openInNewWindow = onStringValue((initialUrl) =>
- window.windowApi.window.new({
- initialUrl: initialUrl,
- }),
-)
-
-const saveImageUrl = onStringValue((value, info) => {
- if (!info.context.principal)
- throw new Error('Expected context menu info to have a principal')
- urlSecurityCheck(value, info.context.principal)
- const wgp = contextMenuParentActor.manager
-
- internalSave(
- value,
- null,
- null,
- null,
- info.mediaInfo?.contentType || null,
- info.mediaInfo?.contentDisposition || null,
- false,
- 'SaveImageTitle',
- null,
- (info.context.referrerInfo &&
- resource.E10SUtils.deserializeReferrerInfo(info.context.referrerInfo)) ||
- null,
- wgp?.cookieJarSettings,
- null,
- false,
- null,
- false,
- info.context.principal,
- )
-})
-
-export const MENU_ITEM_ACTIONS: MenuItemAction[] = (
- [
- {
- id: 'selection__copy',
- title: 'Copy',
-
- visible: HAS_TEXT_SELECTION,
- action: copyProp('textSelection'),
- },
- {
- id: 'link__copy',
- title: 'Copy Link',
-
- visible: HAS_HREF,
- action: copyProp('textSelection'),
- },
- {
- id: 'link__new-tab',
- title: 'Open Link in New Tab',
-
- visible: HAS_HREF,
- action: openInNewTab('href'),
- },
- {
- id: 'link__new-window',
- title: 'Open Link in New Window',
-
- visible: HAS_HREF,
- action: openInNewWindow('href'),
- },
- {
- id: 'navigation__back',
- title: 'Back',
-
- visible: ALWAYS,
- action: () =>
- window.windowApi.tabs.runOnCurrentTab((tab) => tab.goBack()),
- },
- {
- id: 'navigation__forward',
- title: 'Forward',
-
- visible: ALWAYS,
- action: () =>
- window.windowApi.tabs.runOnCurrentTab((tab) => tab.goForward()),
- },
- {
- id: 'navigation__reload',
- title: 'Reload',
-
- visible: ALWAYS,
- action: () =>
- window.windowApi.tabs.runOnCurrentTab((tab) => tab.reload()),
- },
- {
- id: 'navigation__bookmark',
- title: 'Bookmark This Page',
-
- visible: ALWAYS,
- action: () => window.windowApi.windowTriggers.emit('bookmarkCurrentPage'),
- },
- {
- id: 'image__copy',
- title: 'Copy Image',
-
- visible: HAS_IMAGE_SRC,
- action: () => goDoCommand('cmd_copyImage'),
- },
- {
- id: 'image__copy-link',
- title: 'Copy Image Link',
-
- visible: HAS_IMAGE_SRC,
- action: copyProp('imageSrc'),
- },
- {
- id: 'image__new-tab',
- title: 'Open Image in New Tab',
-
- visible: HAS_IMAGE_SRC,
- action: openInNewTab('imageSrc'),
- },
- {
- id: 'image__save',
- title: 'Save Image As...',
-
- visible: HAS_IMAGE_SRC,
- action: saveImageUrl('imageSrc'),
- },
- ] as const
-).map((item) => ({ ...item, type: 'action' }) satisfies MenuItemAction)
diff --git a/apps/content/src/shared/customizableUI/helpers.ts b/apps/content/src/shared/customizableUI/helpers.ts
deleted file mode 100644
index 9969cfa..0000000
--- a/apps/content/src/shared/customizableUI/helpers.ts
+++ /dev/null
@@ -1,294 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { dynamicStringPref } from '@experiment/shared'
-import curry from 'fnts/curry'
-import { nanoid } from 'nanoid'
-import { type Readable, readable } from 'svelte/store'
-
-import {
- type BlockComponent,
- type BlockDirection,
- type BlockSize,
- type BrowserComponent,
- type Component,
- type ComponentId,
- type ExportComponent,
- type IconComponent,
- type SpacerComponent,
- type TempDropTargetComponent,
- cuiPreviewItems,
-} from '.'
-import type { Tab } from '../../browser/lib/window/tab'
-
-export const createBlock = (
- direction: BlockDirection = 'horizontal',
- content: Component[] = [],
- size: BlockSize = { type: 'content' },
-): ComponentId & BlockComponent => ({
- id: nanoid(),
- type: 'block',
- direction,
- content,
- size,
- color: 'base',
-})
-
-export const createIcon = (
- icon: string,
- action: (tab: Tab) => void = () => {},
- enabled: (tab: Tab) => Readable = () => readable(true),
-): ComponentId & IconComponent => ({
- id: nanoid(),
- type: 'icon',
- icon,
- enabled,
- action,
-})
-
-export const tempDropTarget = (
- parent: string,
-): ComponentId & TempDropTargetComponent => ({
- id: nanoid(),
- type: 'temp-drop-target',
- parent,
-})
-
-export const createSpacer = (grow = 1): ComponentId & SpacerComponent => ({
- id: nanoid(),
- type: 'spacer',
- grow,
-})
-
-export const createBrowser = (): ComponentId & BrowserComponent => ({
- id: nanoid(),
- type: 'browser',
-})
-
-export function findChildWithId(
- component: Component,
- id: string,
-): Component | null {
- if (component.id === id) {
- return component
- }
-
- if (component.type === 'block') {
- return component.content.reduce(
- (acc, item) => acc ?? findChildWithId(item, id),
- null,
- )
- }
-
- return null
-}
-
-export function getParent(
- root: Component,
- self: Component,
-): BlockComponent | null {
- if (root === self) {
- return null
- }
-
- if (root.type === 'block') {
- if (self.type === 'temp-drop-target')
- return findChildWithId(root, self.parent) as BlockComponent | null
-
- if (root.content.some((item) => item.id === self.id)) {
- return root
- }
-
- return root.content.reduce(
- (acc, item) => acc ?? getParent(item, self),
- null,
- )
- }
-
- return null
-}
-
-export function getParentOrientation(
- root: Component,
- self: Component,
-): BlockDirection {
- return getParent(root, self)?.direction ?? 'horizontal'
-}
-
-export function calculateDropTargetRel(
- parentOrientation: BlockDirection,
- dragEvent: DragEvent & { currentTarget: HTMLDivElement & EventTarget },
-): 'before' | 'after' | null {
- const boundingRect = dragEvent.currentTarget.getBoundingClientRect()
- const x = dragEvent.x
- const y = dragEvent.y
-
- if (parentOrientation === 'horizontal') {
- const middle = boundingRect.x + boundingRect.width / 2
- return x < middle ? 'before' : 'after'
- }
-
- const middle = boundingRect.y + boundingRect.height / 2
- return y < middle ? 'before' : 'after'
-}
-
-export function applyDrop(
- root: BlockComponent & ComponentId,
- toMove: Component,
- dropTarget: Component,
- rel: 'before' | 'after',
-) {
- const isRootDrop = dropTarget.id === root.id
- let dropTargetParent = getParent(root, dropTarget)
- const toMoveParent = getParent(root, toMove)
-
- if (isRootDrop) dropTargetParent = root
-
- // Remote from old parent
- if (toMoveParent && !isRootDrop) {
- const toMoveIndex = toMoveParent.content.findIndex(
- (item) => item.id === toMove.id,
- )
- toMoveParent.content.splice(toMoveIndex, 1)
- }
-
- // Add to new parent
- if (dropTargetParent) {
- let dropIndex =
- dropTargetParent.content.findIndex((item) => item.id === dropTarget.id) +
- (rel === 'before' ? 0 : 1)
- if (dropIndex == -1) dropIndex = 0 // Void drop indexes
- dropTargetParent.content.splice(dropIndex, 0, toMove)
- }
-}
-
-export function isParent(parent: Component, child: Component): boolean {
- if (parent.id === child.id) {
- return true
- }
-
- if (parent.type === 'block') {
- return parent.content.some((item) => isParent(item, child))
- }
-
- return false
-}
-
-export const countChildrenWithType = curry(
- (type: Component['type'], root: Component): number => {
- let childrenCount = (root.type === 'block' ? root.content : [])
- .map(countChildrenWithType(type))
- .reduce((acc, count) => acc + count, 0)
-
- if (root.type === type) childrenCount++
-
- return childrenCount
- },
-)
-
-export const updateComponentById = curry(
- (
- root: Component,
- id: string,
- updater: (component: Component) => Component,
- ): Component => {
- if (root.id === id) {
- return updater(root)
- }
-
- if (root.type === 'block') {
- return {
- ...root,
- content: root.content.map((item) =>
- updateComponentById(item, id, updater),
- ),
- }
- }
-
- return root
- },
-)
-
-export const removeChildById = curry(
- (id: string, root: Component): Component => {
- if (root.type === 'block') {
- return {
- ...root,
- content: root.content
- .filter((item) => item.id !== id)
- .map(removeChildById(id)),
- }
- }
-
- return root
- },
-)
-
-export function toExportType(component: Component): ExportComponent {
- const output = { ...component } as ExportComponent & { id?: string }
- delete output.id
-
- if (output.type === 'block') {
- return {
- ...output,
- // @ts-expect-error The types here are not perfectly setup
- content: output.content.map(toExportType),
- }
- }
-
- return output
-}
-
-export function fromExportType(component: ExportComponent): Component {
- if (!component.type)
- return createBlock('vertical', [], { type: 'grow', value: 1 })
-
- const output = { ...component, id: nanoid() } as Component
-
- if (output.type === 'block')
- output.content = output.content.map(fromExportType)
-
- return output
-}
-
-const fromExportTypeStableInternal =
- (parentId: string) =>
- (component: ExportComponent, index: number): Component => {
- if (!component.type)
- return createBlock('vertical', [], { type: 'grow', value: 1 })
-
- const id = `${parentId}-${index}`
- const output = { ...component, id } as Component
-
- if (output.type === 'block')
- output.content = output.content.map(fromExportTypeStableInternal(id))
-
- // Icons have non-serializable properties that need to be loaded in
- if (output.type === 'icon') {
- const predefinedItem = cuiPreviewItems.find(
- (existingItem) =>
- existingItem.component.type === 'icon' &&
- existingItem.component.icon === output.icon,
- )?.component as IconComponent | undefined
-
- output.action = predefinedItem?.action ?? (() => {})
- output.enabled = predefinedItem?.enabled ?? (() => readable(false))
- }
-
- return output
- }
-
-/**
- * A variant of {@link fromExportType} that uses index based IDs instead of
- * random ids
- *
- * It also performs extra initialization steps that are required for use in the
- * browser
- */
-export const fromExportTypeStable = (component: ExportComponent) =>
- fromExportTypeStableInternal('root')(component, 0)
-
-export const customizableUIDynamicPref = dynamicStringPref((json) => {
- console.log('test', json)
- return fromExportTypeStable(JSON.parse(json) as ExportComponent)
-})
diff --git a/apps/content/src/shared/customizableUI/index.ts b/apps/content/src/shared/customizableUI/index.ts
deleted file mode 100644
index a25e18b..0000000
--- a/apps/content/src/shared/customizableUI/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export * from './helpers'
-export * from './items'
-export * from './style'
-export * from './types'
diff --git a/apps/content/src/shared/customizableUI/items.ts b/apps/content/src/shared/customizableUI/items.ts
deleted file mode 100644
index eec468a..0000000
--- a/apps/content/src/shared/customizableUI/items.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { readable } from 'svelte/store'
-
-import type { Component, ExportComponent } from '.'
-import { countChildrenWithType } from './helpers'
-
-export interface CUIPreviewItem {
- component: ExportComponent
- canAdd: (root: Component) => boolean
-}
-
-const ALWAYS_ADD = () => true
-const ALWAYS_ENABLE = () => readable(true)
-
-export const cuiPreviewItems: CUIPreviewItem[] = [
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'block',
- direction: 'horizontal',
- size: { type: 'content' },
- content: [],
- color: 'base',
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: { type: 'spacer', grow: 1 },
- },
- {
- canAdd: (root) => countChildrenWithType('browser', root) === 0,
- component: { type: 'browser' },
- },
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'icon',
- icon: 'arrow-left-line',
- enabled: (tab) => tab.canGoBack,
- action: (tab) => tab.goBack(),
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'icon',
- icon: 'arrow-right-line',
- enabled: (tab) => tab.canGoForward,
- action: (tab) => tab.goForward(),
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'icon',
- icon: 'refresh-line',
- enabled: ALWAYS_ENABLE,
- action: (tab) => tab.reload(),
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'icon',
- icon: 'add-line',
- enabled: ALWAYS_ENABLE,
- action: () => window.windowApi.tabs.openTab(),
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'icon',
- icon: 'menu-line',
- enabled: ALWAYS_ENABLE,
- action: async (_, button) => {
- const { openHamburgerMenu } = await import('@browser/components/menus')
- openHamburgerMenu(button, 'after_start')
- },
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: {
- type: 'omnibox',
- },
- },
- {
- canAdd: ALWAYS_ADD,
- component: { type: 'tabs' },
- },
-]
diff --git a/apps/content/src/shared/customizableUI/style.ts b/apps/content/src/shared/customizableUI/style.ts
deleted file mode 100644
index b32d2f3..0000000
--- a/apps/content/src/shared/customizableUI/style.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import type {
- BlockComponent,
- BlockDirection,
- ExportComponent,
- SpacerComponent,
-} from '.'
-
-function getBlockStyle(block: BlockComponent): string {
- let style = `
- display: flex;
- flex-direction: ${block.direction === 'horizontal' ? 'row' : 'column'};
- background-color: var(--${block.color});
- border-color: var(--${block.color});
- `
-
- if (block.size.type === 'fixed') {
- style += `${block.direction === 'horizontal' ? 'height' : 'width'}: ${
- block.size.value
- }rem;`
- }
-
- if (block.size.type === 'grow') {
- style += `flex-grow: ${block.size.value};`
- }
-
- return style
-}
-
-function getBrowserStyle(): string {
- return `
- flex-grow: 1;
-
- display: flex;
- justify-content: center;
- align-items: center;
- `
-}
-
-function getSpacer(
- spacer: SpacerComponent,
- parentOrientation: BlockDirection,
-): string {
- return `
- flex-grow: ${spacer.grow};
- display: flex;
- flex-direction: ${parentOrientation === 'horizontal' ? 'row' : 'column'};
- `
-}
-
-function getOmniboxStyle(
- parentOrientation: BlockDirection,
- preview: boolean,
-): string {
- return `
- flex-grow: ${parentOrientation === 'horizontal' ? 1 : 0};
-
- ${
- preview
- ? `
- display: flex;
- justify-content: center;
- align-items: center;
- `
- : ''
- }
- `
-}
-
-function getIconButtonStyle(): string {
- return `
- display: flex;
- align-items: center;
- `
-}
-
-export function getComponentStyle(
- component: ExportComponent,
- parentOrientation: BlockDirection,
- preview = true,
-): string {
- switch (component.type) {
- case 'block':
- return getBlockStyle(component)
- case 'browser':
- return getBrowserStyle()
- case 'spacer':
- return getSpacer(component, parentOrientation)
- case 'omnibox':
- return getOmniboxStyle(parentOrientation, preview)
- case 'icon':
- return getIconButtonStyle()
- default:
- return ''
- }
-}
diff --git a/apps/content/src/shared/customizableUI/types.ts b/apps/content/src/shared/customizableUI/types.ts
deleted file mode 100644
index f8ffbb7..0000000
--- a/apps/content/src/shared/customizableUI/types.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import type { Readable } from 'svelte/store'
-
-import type { Tab } from '../../browser/lib/window/tab'
-
-export type BlockSize =
- | { type: 'grow'; value: number }
- | { type: 'fixed'; value: number }
- | { type: 'content' }
-export const surfaceColors = [
- 'crust',
- 'mantle',
- 'base',
- 'surface-0',
- 'surface-1',
- 'surface-2',
-] as const
-export type SurfaceColors = (typeof surfaceColors)[number]
-export type BlockDirection = 'horizontal' | 'vertical'
-export interface BlockComponent {
- type: 'block'
- direction: BlockDirection
- content: Component[]
- size: BlockSize
- color: SurfaceColors
-}
-
-export interface IconComponent {
- type: 'icon'
- icon: string
- enabled: (tab: Tab) => Readable
- action: (tab: Tab, button: HTMLElement) => void
-}
-
-export interface TempDropTargetComponent {
- type: 'temp-drop-target'
- parent: string
-}
-
-export interface SpacerComponent {
- type: 'spacer'
- grow: number
-}
-
-export interface BrowserComponent {
- type: 'browser'
-}
-
-export interface OmniboxComponent {
- type: 'omnibox'
-}
-
-export interface TabsComponent {
- type: 'tabs'
-}
-
-export interface ExportComponentMap {
- block: BlockComponent
- icon: IconComponent
- 'temp-drop-target': TempDropTargetComponent
- spacer: SpacerComponent
- browser: BrowserComponent
- omnibox: OmniboxComponent
- tabs: TabsComponent
-}
-
-export type ComponentMapKeys = keyof ExportComponentMap
-export type ExportComponent = ExportComponentMap[ComponentMapKeys]
-
-export type ComponentId = { id: string }
-export type Component = ComponentId & ExportComponentMap[ComponentMapKeys]
-
-export type PrefType =
- | { type: 'string'; options?: readonly string[] }
- | { type: 'number'; range?: [number, number]; steps?: number }
- | { type: 'block-size' }
-export const prefs: {
- [k in ExportComponent['type']]: ({
- key: keyof Omit
- } & PrefType)[]
-} = {
- block: [
- { key: 'direction', type: 'string', options: ['horizontal', 'vertical'] },
- { key: 'size', type: 'block-size' },
- { key: 'color', type: 'string', options: surfaceColors },
- ],
- icon: [],
- 'temp-drop-target': [],
- spacer: [{ key: 'grow', type: 'number' }],
- browser: [],
- omnibox: [],
- tabs: [],
-}
diff --git a/apps/content/src/shared/domUtils.ts b/apps/content/src/shared/domUtils.ts
deleted file mode 100644
index 8738b5f..0000000
--- a/apps/content/src/shared/domUtils.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { lazy } from '@experiment/shared'
-
-export type ClickModifiers = 'Shift' | 'Alt' | 'Command' | 'Ctrl' | 'MacCtrl'
-export const clickModifiersFromEvent = (
- event: MouseEvent,
-): ClickModifiers[] => {
- const map = {
- shiftKey: 'Shift',
- altKey: 'Alt',
- metaKey: 'Command',
- ctrlKey: 'Ctrl',
- } as const
-
- const modifiers: ClickModifiers[] = (Object.keys(map) as (keyof typeof map)[])
- .filter((key) => event[key])
- .map((key) => map[key])
-
- if (event.ctrlKey && lazy.AppConstants.platform === 'macosx') {
- modifiers.push('MacCtrl')
- }
-
- return modifiers
-}
diff --git a/apps/content/src/shared/lazy.js b/apps/content/src/shared/lazy.js
new file mode 100644
index 0000000..9c5f2b0
--- /dev/null
+++ b/apps/content/src/shared/lazy.js
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @ts-check
+
+/**
+ * Allows you to lazy-import in a type safe way
+ *
+ * !!! WARNING !!!
+ * You can only import each module once each bundle, otherwise
+ * gecko gives up and behaves strangly
+ *
+ * @template {Partial} Modules
+ * @param {Modules} modules the modules you want to import
+ * @returns {{[Key in keyof Modules]: MozESMExportType[Key]}}
+ */
+export function lazyESModuleGetters(modules) {
+ const lazy = {}
+ ChromeUtils.defineESModuleGetters(lazy, modules)
+ // @ts-expect-error Typescript doesn't properly understand magic
+ return lazy
+}
diff --git a/apps/content/src/shared/search/constants.ts b/apps/content/src/shared/search/constants.ts
deleted file mode 100644
index 10e8de7..0000000
--- a/apps/content/src/shared/search/constants.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export const DEFAULT_SEARCH_ENGINE: (typeof SEARCH_ENGINE_IDS)[number] =
- 'google@search.fushra.com'
-export const SEARCH_ENGINE_PREF = 'browser.search.engine.default'
-
-export const SEARCH_ENGINE_IDS = [
- 'ddg@search.fushra.com',
- 'google@search.fushra.com',
-] as const
diff --git a/apps/content/src/shared/search/engine.ts b/apps/content/src/shared/search/engine.ts
deleted file mode 100644
index 570546e..0000000
--- a/apps/content/src/shared/search/engine.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { Deferred } from '@experiment/shared'
-
-import type { AddonSearchEngine } from 'resource://gre/modules/AddonSearchEngine.sys.mjs'
-
-import {
- DEFAULT_SEARCH_ENGINE,
- SEARCH_ENGINE_IDS,
- SEARCH_ENGINE_PREF,
-} from './constants'
-import { searchResources } from './resources'
-
-const lazy = searchResources
-
-class SearchEngineService {
- private initPromise: Deferred | undefined
-
- private searchEngines: Deferred = new Deferred()
- private defaultEngine: Deferred = new Deferred()
-
- constructor() {}
-
- /**
- * Assorted fixups for mozilla APIs that are hard coded to use mozilla.org etc
- */
- private fixup() {
- const generalSearchEngines = lazy.SearchUtils
- .GENERAL_SEARCH_ENGINE_IDS as Set
- const values = [...generalSearchEngines.values()]
- for (const value of values) {
- generalSearchEngines.delete(value)
- generalSearchEngines.add(
- value.replace(/@search\.mozilla\.org$/, '@search.fushra.com'),
- )
- }
- }
-
- public async reinit() {
- this.initPromise = undefined
- this.searchEngines = new Deferred()
- this.defaultEngine = new Deferred()
-
- await this.init()
- }
-
- private async init() {
- if (this.initPromise) return await this.initPromise.promise
- this.initPromise = new Deferred()
-
- this.fixup()
-
- const locale = lazy.SearchUtils.DEFAULT_TAG
- const engines: AddonSearchEngine[] = []
- for (const extensionID of SEARCH_ENGINE_IDS) {
- const engine = new lazy.AddonSearchEngine({
- isAppProvided: true,
- details: { extensionID, locale },
- })
- // For some reason, mozilla's implementation does not include `engine`
- // when initing. Hence, we don't here even though the types require it
- // https://searchfox.org/mozilla-central/source/toolkit/components/search/SearchService.sys.mjs#3610
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- await engine.init({ locale } as any)
-
- engines.push(engine)
- }
- this.searchEngines.resolve(engines)
-
- const defaultEngineId = Services.prefs.getStringPref(
- SEARCH_ENGINE_PREF,
- DEFAULT_SEARCH_ENGINE,
- )
- const defaultEngine = engines.find(
- (engine) => engine._extensionID === defaultEngineId,
- )!
- this.defaultEngine.resolve(defaultEngine)
-
- this.initPromise.resolve()
- }
-
- async getSearchEngines() {
- await this.init()
- return await this.searchEngines.promise
- }
-
- async getDefaultEngine() {
- await this.init()
- return await this.defaultEngine.promise
- }
-}
-
-export const searchEngineService = new SearchEngineService()
diff --git a/apps/content/src/shared/search/provider.ts b/apps/content/src/shared/search/provider.ts
deleted file mode 100644
index 8d269c4..0000000
--- a/apps/content/src/shared/search/provider.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-/**
- * How far in the list the priority should appear
- */
-export enum ResultPriority {
- /**
- * The result that should, no matter what, appear at the top of the list.
- * Each provider should only every return a single entry with this result.
- */
- CRITICAL = 0,
- HIGH = 1,
- MEDIUM = 2,
- LOW = 3,
-}
-
-export interface ProviderResult {
- title: string
- icon?: string
- url: string
- priority: ResultPriority
-}
-
-export abstract class Provider {
- /**
- * How important is this provider compared to others? The lower the number,
- * the higher the priority. As a rule of thumb:
- *
- * - 0: Nearly guaranteed correct result (if any). e.g. user entered url
- * - 1: Based on user entered data, e.g. bookmarks
- * - 2: Based on user behavior, e.g. history
- * - 3: Based on third party data, e.g. search engines
- */
- public abstract providerPriority: number
-
- /**
- * Should return results that do not require network queries. Your highest
- * priority results should be returned from this method
- */
- public abstract getFastResults(
- query: string,
- ): Promise | ProviderResult[]
-
- public abstract getResults(query: string): Promise
-}
diff --git a/apps/content/src/shared/search/providers/EngineProvider.ts b/apps/content/src/shared/search/providers/EngineProvider.ts
deleted file mode 100644
index a493a4a..0000000
--- a/apps/content/src/shared/search/providers/EngineProvider.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { Deferred } from '@experiment/shared'
-
-import type { AddonSearchEngine } from 'resource://gre/modules/AddonSearchEngine.sys.mjs'
-
-import { isUrlLike } from '.'
-import { searchEngineService } from '../engine'
-import { Provider, type ProviderResult, ResultPriority } from '../provider'
-import { searchResources } from '../resources'
-
-export class EngineProvider extends Provider {
- public providerPriority = 3
-
- private engine: Deferred = new Deferred()
-
- constructor() {
- super()
- this.init()
- }
-
- private async init() {
- this.engine.resolve(await searchEngineService.getDefaultEngine())
- }
-
- private getSearchUri(engine: AddonSearchEngine, query: string): nsIURIType {
- const submission = engine.getSubmission(query)
- return submission.uri
- }
-
- async getFastResults(query: string) {
- if (query == '' || isUrlLike(query)) return []
-
- const engine = await this.engine.promise
- const defaultSearchResult: ProviderResult = {
- title: query,
- url: this.getSearchUri(engine, query).spec,
- priority: ResultPriority.HIGH,
- }
-
- return [defaultSearchResult]
- }
-
- async getResults(query: string): Promise {
- if (query == '' || isUrlLike(query)) return []
-
- const engine = await this.engine.promise
- const submission = engine.getSubmission(
- query,
- searchResources.SearchUtils.URL_TYPE.SUGGEST_JSON,
- )
-
- const request = fetch(submission.uri.spec, {
- method: submission.postData ? 'POST' : 'GET',
- body: submission.postData,
- })
-
- const response = await request
- const body = await response.text()
-
- if (response.status != 200) {
- console.error(
- `Search engine ${engine.name} returned status ${response.status}`,
- )
- return []
- }
-
- try {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- const json = JSON.parse(body) as any
- const results = json[1].map((result: string) => {
- return {
- title: result,
- url: this.getSearchUri(engine, result).spec,
- priority: ResultPriority.LOW,
- }
- })
- return [...results]
- } catch (e) {
- console.error(
- `Search engine ${engine.name} returned invalid JSON: ${body}`,
- )
- return []
- }
- }
-}
diff --git a/apps/content/src/shared/search/providers/URLProvider.ts b/apps/content/src/shared/search/providers/URLProvider.ts
deleted file mode 100644
index 8e37982..0000000
--- a/apps/content/src/shared/search/providers/URLProvider.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { Provider, type ProviderResult, ResultPriority } from '../provider'
-import tld from './data/tld.txt'
-
-const HTTPS_REGEX =
- /^(?https?:\/\/)?(?(\w+\.)+(?\w+))(?\/.*)?$/m
-const EXTENSION_REGEX = /^moz-extension:\/\/.+$/m
-const CHROME_REGEX = /^chrome:\/\/.+$/m
-const ABOUT_REGEX = /^about:.+$/m
-const tlds = tld
- .split('\n')
- .filter((tld) => tld.length > 0 && !tld.startsWith('#'))
-
-/**
- * Checks if a query would match against the URL checker. For use with other
- * providers
- * @param query The query to check
- * @returns If the query is a url or not
- */
-export function isUrlLike(query: string): boolean {
- if (
- ABOUT_REGEX.test(query) ||
- CHROME_REGEX.test(query) ||
- EXTENSION_REGEX.test(query)
- )
- return true
- const match = HTTPS_REGEX.exec(query)
- if (match === null) return false
-
- const { tld } = match.groups || {}
-
- // If it is not a valid tld, don't show it
- if (!tlds.includes(tld.toUpperCase())) return false
- return true
-}
-
-export class URLProvider extends Provider {
- public providerPriority = 0
-
- /* eslint @typescript-eslint/no-unused-vars: 0 */
- public async getResults(_query: string) {
- return []
- }
-
- public getFastResults(query: string): ProviderResult[] {
- // Check against chrome urls
- if (
- CHROME_REGEX.test(query) ||
- ABOUT_REGEX.test(query) ||
- EXTENSION_REGEX.test(query)
- )
- return [
- {
- title: query,
- url: query,
- icon: `chrome://branding/content/icon32.png`,
- priority: ResultPriority.CRITICAL,
- },
- ]
-
- const match = HTTPS_REGEX.exec(query)
- if (match === null) return []
-
- const { protocol, domain, tld, path } = match.groups || {}
- const uri = `${protocol || 'https://'}${domain}${path || ''}`
-
- // If it is not a valid tld, don't show it
- if (!tlds.includes(tld.toUpperCase())) return []
-
- return [
- {
- title: uri,
- url: uri,
- icon: `chrome://branding/content/icon32.png`,
- priority: ResultPriority.CRITICAL,
- },
- ]
- }
-}
diff --git a/apps/content/src/shared/search/providers/index.ts b/apps/content/src/shared/search/providers/index.ts
deleted file mode 100644
index 80a8cf5..0000000
--- a/apps/content/src/shared/search/providers/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export * from './EngineProvider'
-export * from './URLProvider'
diff --git a/apps/content/src/shared/search/resources.ts b/apps/content/src/shared/search/resources.ts
deleted file mode 100644
index d08f6c7..0000000
--- a/apps/content/src/shared/search/resources.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { lazyESModuleGetters } from '@shared/TypedImportUtilities'
-
-export const searchResources = lazyESModuleGetters({
- AddonSearchEngine: 'resource://gre/modules/AddonSearchEngine.sys.mjs',
- SearchUtils: 'resource://gre/modules/SearchUtils.sys.mjs',
-})
diff --git a/apps/content/src/shared/search/suggestions.ts b/apps/content/src/shared/search/suggestions.ts
deleted file mode 100644
index bffd777..0000000
--- a/apps/content/src/shared/search/suggestions.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import type { Provider, ProviderResult } from './provider'
-import { EngineProvider, URLProvider } from './providers'
-
-/**
- * All providers that should be used for suggestions. Already sorted by priority.
- */
-const PROVIDERS: Provider[] = [new URLProvider(), new EngineProvider()].sort(
- (a, b) => a.providerPriority - b.providerPriority,
-)
-
-export interface Suggestion {
- title: string
- icon?: string
- url: string
-}
-
-const take =
- (n: number) =>
- (_: T, i: number) =>
- i < n
-
-function processResults(providerResults: ProviderResult[][]): Suggestion[] {
- return providerResults
- .flat()
- .sort((a, b) => a.priority - b.priority)
- .filter(take(5))
- .map(({ title, icon, url }) => ({ title, icon, url }))
-}
-
-/**
- * Generates a list of autocomplete suggestions for the user's input
- * @param query The user's input to perform prediction on
- * @returns The suggestions for the user's input
- */
-export function suggestions(query: string): {
- fast: Promise
- full: Promise
-} {
- const fastResultsPromise = Promise.all(
- PROVIDERS.map((provider) => provider.getFastResults(query)),
- )
- const fullResultsPromise = Promise.all(
- PROVIDERS.map((provider) => provider.getResults(query)),
- )
-
- const fastSuggestions = fastResultsPromise.then(processResults)
- const fullSuggestions = fullResultsPromise.then(async (results) =>
- processResults([...(await fastResultsPromise), ...results]),
- )
-
- return { fast: fastSuggestions, full: fullSuggestions }
-}
diff --git a/apps/content/src/shared/styles/global.css b/apps/content/src/shared/styles/global.css
deleted file mode 100644
index c090131..0000000
--- a/apps/content/src/shared/styles/global.css
+++ /dev/null
@@ -1,40 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-@import '@catppuccin/palette/css/catppuccin.css';
-
-/**
- * Note that CSS color naming follows the same conventions that catppuccin uses
- * https://github.com/catppuccin/catppuccin/blob/main/docs/style-guide.md
- */
-:root {
- --crust: var(--ctp-frappe-crust);
- --mantle: var(--ctp-frappe-mantle);
- --base: var(--ctp-frappe-base);
- --surface: var(--surface-0);
- --surface-0: var(--ctp-frappe-surface0);
- --surface-1: var(--ctp-frappe-surface1);
- --surface-2: var(--ctp-frappe-surface2);
-
- --text: var(--ctp-frappe-text);
- --subtext: var(--subtext-0);
- --subtext-0: var(--ctp-frappe-subtext1);
- --subtext-2: var(--ctp-frappe-subtext0);
-
- --active: var(--active-border);
- --active-border: var(--ctp-frappe-lavender);
-}
-
-body {
- background: var(--base);
- color: var(--text);
-}
-
-body {
- margin: 0;
-}
-
-input:focus {
- outline: solid var(--active-border);
-}
diff --git a/apps/content/src/tests/browser/index.ts b/apps/content/src/tests/browser/index.ts
deleted file mode 100644
index e323dec..0000000
--- a/apps/content/src/tests/browser/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import pageactions from './pageactions'
-
-export default async function () {
- await pageactions()
-}
diff --git a/apps/content/src/tests/browser/pageactions.ts b/apps/content/src/tests/browser/pageactions.ts
deleted file mode 100644
index 823e694..0000000
--- a/apps/content/src/tests/browser/pageactions.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export default async function () {}
diff --git a/apps/content/src/tests/manager.ts b/apps/content/src/tests/manager.js
similarity index 51%
rename from apps/content/src/tests/manager.ts
rename to apps/content/src/tests/manager.js
index 17e0888..371dfdd 100644
--- a/apps/content/src/tests/manager.ts
+++ b/apps/content/src/tests/manager.js
@@ -1,27 +1,28 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import {
- type IAssert,
- type ISpecFunction,
- createTAPReporter,
- hold,
- report,
-} from 'zora'
+// @ts-check
+import { createTAPReporter, hold, report } from 'zora'
const TEST_PORT = 3948
const TEST_OUTPUT = document.createElement('pre')
document.body.appendChild(TEST_OUTPUT)
-export async function manageTests(
- tests: () => Promise,
-): Promise<(tests: () => Promise) => Promise> {
- const config = (await fetch(`http://localhost:${TEST_PORT}/config`).then(
- (r) => r.json(),
- )) as { shouldWatch: boolean }
+/**
+ * @param {() => Promise} tests
+ * @returns {Promise<(tests: () => Promise) => Promise>}
+ */
+export async function manageTests(tests) {
+ /** @type {{ shouldWatch: boolean }} */
+ const config = await fetch(`http://localhost:${TEST_PORT}/config`).then((r) =>
+ r.json(),
+ )
- async function performTests(tests: () => Promise) {
+ /**
+ * @param {() => Promise} tests
+ */
+ async function performTests(tests) {
hold()
await tests()
@@ -52,21 +53,25 @@ export async function manageTests(
return performTests
}
-interface IAssertionResult {
- pass: boolean
- actual: unknown
- expected: T
- description: string
- operator: string
- at?: string
-}
+/**
+ * @template T
+ * @typedef {Object} IAssertionResult
+ * @property {boolean} pass
+ * @property {unknown} actual
+ * @property {T} expected
+ * @property {string} description
+ * @property {string} operator
+ * @property {string} [at]
+ */
-export async function then(
- t: IAssert,
- result: IAssertionResult,
- description: string,
- fn: ISpecFunction,
-) {
+/**
+ * @template T
+ * @param {import('zora').IAssert} t
+ * @param {IAssertionResult} result
+ * @param {string} description
+ * @param {import('zora').ISpecFunction} fn
+ */
+export async function then(t, result, description, fn) {
const restFn = result.pass ? t.test : t.skip
restFn(description, fn)
}
diff --git a/apps/content/src/tests/shared/ExtHistoryAPI.ts b/apps/content/src/tests/shared/ExtHistoryAPI.ts
deleted file mode 100644
index 4c81345..0000000
--- a/apps/content/src/tests/shared/ExtHistoryAPI.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { test } from 'zora'
-
-import { search } from '@shared/ExtHistoryAPI'
-
-export default async function () {
- await test('ExtHistoryApi: Search, default options', async (t) => {
- const result = await search({})
- t.ok(Array.isArray(result), 'Search should be an array')
- })
-}
diff --git a/apps/content/src/tests/shared/contextMenus/MenuItem.ts b/apps/content/src/tests/shared/contextMenus/MenuItem.ts
deleted file mode 100644
index a094d79..0000000
--- a/apps/content/src/tests/shared/contextMenus/MenuItem.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { test } from 'zora'
-
-import {
- MENU_ITEM_ACTIONS,
- fromIdString,
- toIdString,
-} from '@shared/contextMenus'
-
-export default async function () {
- await test('toIdString', (t) => {
- t.eq(
- toIdString([
- ...MENU_ITEM_ACTIONS.filter((_, i) => i < 3),
- { type: 'separator' },
- ]),
- 'selection__copy,link__copy,link__new-tab,separator',
- )
- })
-
- await test('fromIdString', (t) => {
- t.eq(fromIdString('link__copy,link__new-tab,separator,selection__copy'), [
- MENU_ITEM_ACTIONS[1],
- MENU_ITEM_ACTIONS[2],
- { type: 'separator' },
- MENU_ITEM_ACTIONS[0],
- ])
- })
-}
diff --git a/apps/content/src/tests/shared/index.ts b/apps/content/src/tests/shared/index.ts
deleted file mode 100644
index 8f8bec9..0000000
--- a/apps/content/src/tests/shared/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import ExtHistoryAPI from './ExtHistoryAPI'
-import contextMenus from './contextMenus'
-import search from './search'
-
-export default async function () {
- await contextMenus()
- await search()
-
- await ExtHistoryAPI()
-}
diff --git a/apps/content/src/tests/shared/search/index.ts b/apps/content/src/tests/shared/search/index.ts
deleted file mode 100644
index c110d0b..0000000
--- a/apps/content/src/tests/shared/search/index.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import providers from './providers'
-import suggestions from './suggestions'
-
-export default async function () {
- await providers()
-
- await suggestions()
-}
diff --git a/apps/content/src/tests/shared/search/providers/EngineProvider.ts b/apps/content/src/tests/shared/search/providers/EngineProvider.ts
deleted file mode 100644
index c383b24..0000000
--- a/apps/content/src/tests/shared/search/providers/EngineProvider.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { test } from 'zora'
-
-import { SEARCH_ENGINE_IDS, SEARCH_ENGINE_PREF } from '@shared/search/constants'
-import { searchEngineService } from '@shared/search/engine'
-import { ResultPriority } from '@shared/search/provider'
-import { EngineProvider } from '@shared/search/providers'
-
-import { then } from '../../../manager'
-
-export default async function () {
- await test('EngineProvider: ignore URL like', async (t) => {
- const provider = new EngineProvider()
- {
- const results = await provider.getResults('http://google.com')
- t.eq(results, [], 'Should ignore full URLs')
- }
- {
- const results = await provider.getResults('google.com')
- t.eq(results, [], 'Should ignore domains')
- }
- {
- const results = await provider.getResults(
- 'chrome://browser/content/tests/index.html',
- )
- t.eq(results, [], 'Should ignore chrome URLs')
- }
- })
-
- await test('EngineProvider: query with no recommendations', async (t) => {
- const provider = new EngineProvider()
- const results = await provider.getResults(
- 'cc4ce6fc-c166-4501-b34f-bda93579efc2',
- )
- t.eq(results.length, 0, 'Should have a single result')
- })
-
- await test('EngineProvider: fast recommendations', async (t) => {
- const provider = new EngineProvider()
- const results = await provider.getFastResults('tes')
-
- then(
- t,
- t.equals(results.length, 1, 'should have a single result'),
-
- 'validate results',
- (t) => {
- t.equals(
- results[0].priority,
- ResultPriority.HIGH,
- 'should have a high priority',
- )
- t.equals(results[0].title, 'tes', 'should have the same title')
- },
- )
- })
-
- await test('EngineProvider: fast recomendations ignore URL like', async (t) => {
- const provider = new EngineProvider()
- {
- const results = await provider.getFastResults('http://google.com')
- t.eq(results, [], 'Should ignore full URLs')
- }
- {
- const results = await provider.getFastResults('google.com')
- t.eq(results, [], 'Should ignore domains')
- }
- {
- const results = await provider.getFastResults(
- 'chrome://browser/content/tests/index.html',
- )
- t.eq(results, [], 'Should ignore chrome URLs')
- }
- })
-
- for (const engine of SEARCH_ENGINE_IDS) {
- await testProvider(engine)
- }
-}
-
-async function testProvider(providerExtensionId: string) {
- Services.prefs.setStringPref(SEARCH_ENGINE_PREF, providerExtensionId)
- await searchEngineService.reinit()
-
- const provider = new EngineProvider()
-
- await test(`EngineProvider [${providerExtensionId}]: tes`, async (t) => {
- const results = await provider.getResults('tes')
- t.ok(results.length > 0, 'Should return suggestions')
- t.truthy(results[0].url, 'Should have a url')
- })
-
- await test(`EngineProvider [${providerExtensionId}]: empty str`, async (t) => {
- const result = await provider.getResults('')
- t.eq(result, [], "Shouldn't try and find results")
- })
-}
diff --git a/apps/content/src/tests/shared/search/providers/URLProvider.ts b/apps/content/src/tests/shared/search/providers/URLProvider.ts
deleted file mode 100644
index cb2cb33..0000000
--- a/apps/content/src/tests/shared/search/providers/URLProvider.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { test } from 'zora'
-
-import { URLProvider } from '@shared/search/providers/URLProvider'
-
-export default async function () {
- const urlProvider = new URLProvider()
-
- await test('URLProvider: google.com', async (t) => {
- const result = urlProvider.getFastResults('google.com')
- t.ok(result, 'result exists')
- t.ok(result.length > 0, 'result has length')
- if (!result.length) return
- t.equal(result[0].title, 'https://google.com', 'title is correct')
- t.equal(result[0].url, 'https://google.com', 'url is correct')
- })
-
- await test('URLProvider: https://google.com', async (t) => {
- const result = urlProvider.getFastResults('https://google.com')
- t.ok(result, 'result exists')
- t.ok(result.length > 0, 'result has length')
- if (!result.length) return
- t.equal(result[0].title, 'https://google.com', 'title is correct')
- t.equal(result[0].url, 'https://google.com', 'url is correct')
- })
-
- await test('URLProvider: google.com/test', async (t) => {
- const result = urlProvider.getFastResults('google.com/test')
- t.ok(result, 'result exists')
- t.ok(result.length > 0, 'result has length')
- if (!result.length) return
- t.equal(result[0].title, 'https://google.com/test', 'title is correct')
- t.equal(result[0].url, 'https://google.com/test', 'url is correct')
- })
-
- await test('URLProvider: https://google.com/test', async (t) => {
- const result = urlProvider.getFastResults('https://google.com/test')
- t.ok(result, 'result exists')
- t.ok(result.length > 0, 'result has length')
- if (!result.length) return
- t.equal(result[0].title, 'https://google.com/test', 'title is correct')
- t.equal(result[0].url, 'https://google.com/test', 'url is correct')
- })
-
- await test('URLProvider: chrome://browser/content/tests/index.html', async (t) => {
- const result = urlProvider.getFastResults(
- 'chrome://browser/content/tests/index.html',
- )
- t.ok(result, 'result exists')
- t.ok(result.length > 0, 'result has length')
- if (!result.length) return
- t.equal(
- result[0].title,
- 'chrome://browser/content/tests/index.html',
- 'title is correct',
- )
- t.equal(
- result[0].url,
- 'chrome://browser/content/tests/index.html',
- 'url is correct',
- )
- })
-
- await test('URLProvider: https://abc.notarealurl', async (t) => {
- const result = urlProvider.getFastResults('https://abc.notarealurl')
- t.ok(result, 'result exists')
- t.equal(result.length, 0, 'result has length')
- })
-
- await test('URLProvider: https://abc.notarealurl/test', async (t) => {
- const result = urlProvider.getFastResults('https://abc.notarealurl/test')
- t.ok(result, 'result exists')
- t.equal(result.length, 0, 'result has length')
- })
-
- await test('URLProvider: text', async (t) => {
- const result = urlProvider.getFastResults('text')
- t.ok(result, 'result exists')
- t.equal(result.length, 0, 'result has length')
- })
-
- await test('URLProvider: about:blank', async (t) => {
- const result = urlProvider.getFastResults('about:blank')
- t.eq(result.length, 1, 'There should be a result')
- t.eq(result[0].title, 'about:blank', 'The title should be correct')
- t.eq(result[0].url, 'about:blank', 'The url should be correct')
- })
-}
diff --git a/apps/content/src/tests/shared/search/providers/index.ts b/apps/content/src/tests/shared/search/providers/index.ts
deleted file mode 100644
index 587e439..0000000
--- a/apps/content/src/tests/shared/search/providers/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import EngineProvider from './EngineProvider'
-import URLProvider from './URLProvider'
-
-export default async function () {
- await URLProvider()
- await EngineProvider()
-}
diff --git a/apps/content/src/tests/shared/search/suggestions.ts b/apps/content/src/tests/shared/search/suggestions.ts
deleted file mode 100644
index b4d723b..0000000
--- a/apps/content/src/tests/shared/search/suggestions.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import { test } from 'zora'
-
-import { suggestions } from '@shared/search/suggestions'
-
-export default async function () {
- await test('suggestions: google.com', async (t) => {
- const { fast: fastP, full: fullP } = suggestions('google.com')
- const fast = await fastP
- const full = await fullP
-
- t.ok(fast.length > 0, 'fast should return results')
- t.ok(full.length > 0, 'full should return results')
- t.eq(
- fast[0].url,
- 'https://google.com',
- 'Highest priority fast result should be url prediction',
- )
- t.eq(
- full[0].url,
- 'https://google.com',
- 'Highest priority full result should be url prediction',
- )
- })
-
- await test('suggestions: tes', async (t) => {
- const { fast: fastP, full: fullP } = suggestions('tes')
- const fast = await fastP
- const full = await fullP
-
- t.ok(fast.length > 0, 'should return results')
- t.truthy(fast[0].url, 'should have a url')
- t.truthy(
- fast.length <= full.length,
- 'full should have the same or more results than fast',
- )
- })
-}
diff --git a/apps/content/src/tests/shared/contextMenus/index.ts b/apps/content/src/tests/tests.js
similarity index 56%
rename from apps/content/src/tests/shared/contextMenus/index.ts
rename to apps/content/src/tests/tests.js
index d50b48e..7b219a2 100644
--- a/apps/content/src/tests/shared/contextMenus/index.ts
+++ b/apps/content/src/tests/tests.js
@@ -1,9 +1,11 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+import { manageTests } from './manager.js'
+import { urlBox } from './tests/urlBox.test.js'
-import MenuItem from './MenuItem'
-
-export default async function () {
- await MenuItem()
+async function tests() {
+ await urlBox()
}
+
+await manageTests(tests)
diff --git a/apps/content/src/tests/tests.ts b/apps/content/src/tests/tests.ts
deleted file mode 100644
index 5fc3fdd..0000000
--- a/apps/content/src/tests/tests.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import browser from './browser'
-import { manageTests } from './manager'
-import shared from './shared'
-
-async function tests() {
- await shared()
- await browser()
-}
-
-await manageTests(tests)
-
-if (module.hot) {
- module.hot.dispose(() => window.location.reload())
-}
diff --git a/apps/content/src/tests/tests/urlBox.test.js b/apps/content/src/tests/tests/urlBox.test.js
new file mode 100644
index 0000000..89a5010
--- /dev/null
+++ b/apps/content/src/tests/tests/urlBox.test.js
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import { test } from 'zora'
+
+import { getFastAutocomplete } from '../../browser/components/urlBox.js'
+
+export async function urlBox() {
+ test('Fast autocomplete', (test) => {
+ test.test('URL: google.com', (test) => {
+ const result = getFastAutocomplete('google.com')
+ test.ok(result, 'result exists')
+ test.ok(result.length > 0, 'result has length')
+ test.equal(result[0]?.display, 'https://google.com', 'title is correct')
+ test.equal(result[0]?.url, 'https://google.com', 'url is correct')
+ test.equal(result[1]?.display, 'google.com', 'title is correct')
+ test.equal(
+ result[1]?.url,
+ 'https://duckduckgo.com/?q=google.com',
+ 'url is correct',
+ )
+ })
+
+ test.test('URL: https://google.com', (test) => {
+ const result = getFastAutocomplete('https://google.com')
+ test.ok(result, 'result exists')
+ test.ok(result.length > 0, 'result has length')
+ test.equal(result[0]?.display, 'https://google.com', 'title is correct')
+ test.equal(result[0]?.url, 'https://google.com', 'url is correct')
+ test.equal(result[1]?.display, 'https://google.com', 'title is correct')
+ test.equal(
+ result[1]?.url,
+ 'https://duckduckgo.com/?q=https://google.com',
+ 'url is correct',
+ )
+ })
+
+ test.test('URL: google.com/test', (test) => {
+ const result = getFastAutocomplete('google.com/test')
+ test.ok(result, 'result exists')
+ test.ok(result.length > 0, 'result has length')
+ test.equal(
+ result[0]?.display,
+ 'https://google.com/test',
+ 'title is correct',
+ )
+ test.equal(result[0]?.url, 'https://google.com/test', 'url is correct')
+ test.equal(result[1]?.display, 'google.com/test', 'title is correct')
+ test.equal(
+ result[1]?.url,
+ 'https://duckduckgo.com/?q=google.com/test',
+ 'url is correct',
+ )
+ })
+
+ test.test('URLProvider: https://abc.notarealurl/test', (test) => {
+ const result = getFastAutocomplete('https://abc.notarealurl/test')
+ test.ok(result, 'result exists')
+ test.equal(result.length, 1, 'result has length')
+ test.equal(
+ result[0]?.display,
+ 'https://abc.notarealurl/test',
+ 'title is correct',
+ )
+ test.equal(
+ result[0]?.url,
+ 'https://duckduckgo.com/?q=https://abc.notarealurl/test',
+ 'url is correct',
+ )
+ })
+
+ test.test('URLProvider: about:blank', (test) => {
+ const result = getFastAutocomplete('about:blank')
+ test.eq(result.length, 2, 'There should be 2 result')
+ test.eq(result[0]?.display, 'about:blank', 'The title should be correct')
+ test.eq(result[0]?.url, 'about:blank', 'The url should be correct')
+ test.eq(result[1]?.display, 'about:blank', 'The title should be correct')
+ test.eq(
+ result[1]?.url,
+ 'https://duckduckgo.com/?q=about:blank',
+ 'The url should be correct',
+ )
+ })
+ })
+}
diff --git a/apps/content/src/types.d.ts b/apps/content/src/types.d.ts
index 6c9ac30..d99b571 100644
--- a/apps/content/src/types.d.ts
+++ b/apps/content/src/types.d.ts
@@ -8,6 +8,8 @@
///
///
+///
+
declare module '*.txt' {
const contents: string
export = contents
diff --git a/apps/content/tsconfig.json b/apps/content/tsconfig.json
index 8f2d3b9..f8e260b 100644
--- a/apps/content/tsconfig.json
+++ b/apps/content/tsconfig.json
@@ -3,10 +3,7 @@
"compilerOptions": {
"target": "es2022",
"allowArbitraryExtensions": true,
- "paths": {
- "@shared/*": ["./src/shared/*"],
- "@browser/*": ["./src/browser/*"]
- },
+ "paths": {},
"skipLibCheck": true
},
"include": ["src/**/*"],
diff --git a/apps/content/webpack.config.js b/apps/content/webpack.config.js
index 6e79dd4..0de0d69 100644
--- a/apps/content/webpack.config.js
+++ b/apps/content/webpack.config.js
@@ -2,13 +2,11 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// @ts-check
-import { preprocessMeltUI } from '@melt-ui/pp'
import CopyWebpackPlugin from 'copy-webpack-plugin'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import { join, resolve } from 'node:path'
import preprocess from 'svelte-preprocess'
-import sequence from 'svelte-sequential-preprocessor'
import WebpackLicensePlugin from 'webpack-license-plugin'
const HTML_TEMPLATE_FILE = './src/index.html'
@@ -42,7 +40,7 @@ export default (env, argv) => {
* Generates a webpack config
* @param {ContentFile[]} contentFiles The generated files
* @param {boolean} dev If the application is in development mode
- * @returns The weback config
+ * @returns {import('webpack').Configuration} The weback config
*/
const sharedSettings = (contentFiles, dev) => {
const srcDir = './src'
@@ -52,7 +50,7 @@ const sharedSettings = (contentFiles, dev) => {
for (const contentFile of contentFiles) {
entry[contentFile.folder] =
- './' + join(srcDir, contentFile.folder, contentFile.folder + '.ts')
+ './' + join(srcDir, contentFile.folder, contentFile.folder + '.js')
}
return {
@@ -70,6 +68,8 @@ const sharedSettings = (contentFiles, dev) => {
'@shared': resolve('src/shared'),
'@browser': resolve('src/browser'),
},
+ mainFields: ['svelte', 'browser', 'module', 'main'],
+ conditionNames: ['svelte', 'browser', 'import'],
},
resolveLoader: {
modules: ['node_modules'],
@@ -94,6 +94,7 @@ const sharedSettings = (contentFiles, dev) => {
chunks: 'all',
},
},
+ stats: 'minimal',
module: {
rules: [
@@ -107,7 +108,7 @@ const sharedSettings = (contentFiles, dev) => {
},
emitCss: !dev,
hotReload: dev,
- preprocess: sequence([preprocess(), preprocessMeltUI()]),
+ preprocess: preprocess(),
},
},
},
diff --git a/apps/misc/static/defaults/pref/prefs.js b/apps/misc/static/defaults/pref/prefs.js
index 447d4c8..b189140 100644
--- a/apps/misc/static/defaults/pref/prefs.js
+++ b/apps/misc/static/defaults/pref/prefs.js
@@ -49,6 +49,9 @@ pref('browser.keybinds.findInPage', 'accel+F');
// Misc. prefs
pref('browser.tabs.newTabFocus', false);
+// TODO:
+pref('app.support.baseURL', 'https://example.com/');
+
// =======================================================
// Gecko prefs
@@ -127,3 +130,13 @@ pref('browser.tabs.remote.separatePrivilegedMozillaWebContentProcess', true);
pref('extensions.webextensions.remote', true);
pref('extensions.webextensions.protocol.remote', true);
+
+// ==============================================================================
+// Gecko experiments
+pref('network.cookie.sameSite.noneRequiresSecure', false);
+pref('layout.css.grid-template-masonry-value.enabled', true);
+pref('devtools.debugger.features.windowless-service-workers', true);
+pref('image.jxl.enabled', true);
+pref('browser.urlbar.keepPanelOpenDuringImeComposition', false);
+pref('dom.webgpu.enabled', true);
+pref('privacy.webrtc.globalMuteToggles', false);
diff --git a/apps/modules/lib/BrowserGlue.sys.mjs b/apps/modules/lib/BrowserGlue.sys.mjs
index b28cb8b..58e98e3 100644
--- a/apps/modules/lib/BrowserGlue.sys.mjs
+++ b/apps/modules/lib/BrowserGlue.sys.mjs
@@ -1,7 +1,6 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
/// @ts-check
///
import { lazyESModuleGetters } from 'resource://app/modules/TypedImportUtils.sys.mjs'
@@ -58,6 +57,21 @@ const JS_WINDOW_ACTORS = {
},
messageManagerGroups: ['browsers'],
},
+
+ ThemeMeta: {
+ parent: {
+ esModuleURI: 'resource://app/actors/ThemeMetaParent.sys.mjs',
+ },
+ child: {
+ esModuleURI: 'resource://app/actors/ThemeMetaChild.sys.mjs',
+ events: {
+ DOMMetaAdded: {},
+ DOMMetaChanged: {},
+ pageshow: {},
+ },
+ },
+ messageManagerGroups: ['browsers'],
+ },
}
export class BrowserGlue {
diff --git a/apps/modules/lib/FaviconLoader.sys.mjs b/apps/modules/lib/FaviconLoader.sys.mjs
index b19aead..8ecf2ed 100644
--- a/apps/modules/lib/FaviconLoader.sys.mjs
+++ b/apps/modules/lib/FaviconLoader.sys.mjs
@@ -156,7 +156,7 @@ class FaviconLoad {
}
load() {
- this._deferred = lazy.PromiseUtils.defer()
+ this._deferred = Promise.withResolvers()
// Clear the references when we succeed or fail.
let cleanup = () => {
diff --git a/apps/modules/lib/sessionstore/SessionStore.sys.mjs b/apps/modules/lib/sessionstore/SessionStore.sys.mjs
index e003224..28b4e9e 100644
--- a/apps/modules/lib/sessionstore/SessionStore.sys.mjs
+++ b/apps/modules/lib/sessionstore/SessionStore.sys.mjs
@@ -1,3 +1,12 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * From thunderbird
+ * @source https://searchfox.org/comm-central/source/mail/modules/SessionStore.sys.mjs
+ */
+export const SessionStore = {
+ updateSessionStoreFromTablistener(aBrowser, aBrowsingContext, aData) {},
+ maybeExitCrashedState() {},
+}
diff --git a/libs/link/package.json b/libs/link/package.json
index 0c27634..b8f5316 100644
--- a/libs/link/package.json
+++ b/libs/link/package.json
@@ -8,11 +8,12 @@
"license": "ISC",
"dependencies": {
"@types/firefox-webext-browser": "^120.0.0",
- "gecko-types": "github:quark-platform/gecko-types",
"gecko-types@latest": "link:quark-platform/gecko-types@latest",
"mitt": "^3.0.1"
},
"devDependencies": {
+ "@amadeus-it-group/tansu": "^1.0.0",
+ "gecko-types": "github:quark-platform/gecko-types",
"zora": "^5.2.0"
}
}
diff --git a/libs/link/types/_link.d.ts b/libs/link/types/_link.d.ts
index 6fc1fca..a0cf9a9 100644
--- a/libs/link/types/_link.d.ts
+++ b/libs/link/types/_link.d.ts
@@ -29,3 +29,7 @@
///
///
///
+
+///
+///
+///
diff --git a/libs/link/types/globals/Elements.d.ts b/libs/link/types/globals/Elements.d.ts
index f68c010..a9cf852 100644
--- a/libs/link/types/globals/Elements.d.ts
+++ b/libs/link/types/globals/Elements.d.ts
@@ -18,12 +18,26 @@ declare type DOMLinkAddedEvent = Event & {
target: HTMLLinkElement
type: 'DOMLinkAdded'
}
+declare type DOMMetaAddedEvent = Event & {
+ target: HTMLMetaElement
+ type: 'DOMMetaAdded'
+}
+declare type DOMMetaChangedEvent = Event & {
+ target: HTMLMetaElement
+ type: 'DOMMetaChanged'
+}
declare type DOMHeadParsedEvent = Event & {
target: HTMLHeadElement
type: 'DOMHeadElementParsed'
}
-declare type PageShowEvent = PageTransitionEvent & { type: 'pageshow' }
-declare type PageHideEvent = PageTransitionEvent & { type: 'pagehide' }
+declare type PageShowEvent = PageTransitionEvent & {
+ type: 'pageshow'
+ target: Document
+}
+declare type PageHideEvent = PageTransitionEvent & {
+ type: 'pagehide'
+ target: Document
+}
declare interface LoadURIOptions {
triggeringPrincipal?: Principal
@@ -52,7 +66,7 @@ declare interface XULBrowserElement extends HTMLElement {
goForward()
reload()
fullZoom: number
- browsingContext?: unknown
+ browsingContext?: unknown & { currentURI: nsIURIType }
loadURI(uri: nsIURIType, params?: LoadURIOptions)
browserId: number
mInitialized: boolean
diff --git a/libs/link/types/globals/WindowApi.d.ts b/libs/link/types/globals/WindowApi.d.ts
index d90c9f0..5772acb 100644
--- a/libs/link/types/globals/WindowApi.d.ts
+++ b/libs/link/types/globals/WindowApi.d.ts
@@ -2,53 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-type WindowTriggers = {
- bookmarkCurrentPage: undefined
-}
-
-declare interface WindowConfiguration {
- /**
- * The initial page to show when the window is opened
- */
- initialUrl: string
-}
-
-declare type WindowApi = {
- /**
- * Identify which window this is. This should be used for actions like tab
- * moving that go across windows
- *
- * Note: You need to wait for the window watcher to register this window
- * before you get a valid id
- */
- id: number
- /**
- * Sets the window ID. You should only use this if you are the WindowWatcher
- */
- setId: (id: number) => void
-
- windowTriggers: import('mitt').Emitter
-
- window: {
- new: (args?: WindowArguments) => unknown
- }
-
- tabs: {
- closeTab(tab: Tab): void
- openTab(url?: nsIURIType): Tab
- runOnCurrentTab(callback: (tab: Tab) => R): R | undefined
- setCurrentTab(tab: Tab): void
- getCurrentTab(): Tab | undefined
- getTabById(id: number): Tab | undefined
- tabs: Tab[]
- setIcon(browser: XULBrowserElement, iconURL: string): void
- }
-
- contextMenu: {
- showContextMenu(menuInfo: ContextMenuInfo, actor: JSWindowActorParent): void
- }
-}
-
declare interface Window {
- windowApi: WindowApi
+ eventBus: import('@browser/event-bus').EventBus
}
diff --git a/libs/link/types/windowApi/WebsiteView.d.ts b/libs/link/types/windowApi/WebsiteView.d.ts
new file mode 100644
index 0000000..1eb2c6c
--- /dev/null
+++ b/libs/link/types/windowApi/WebsiteView.d.ts
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+declare type WebsiteViewLocationChangeProperties = {
+ aWebProgress: nsIWebProgressType
+ aRequest: nsIRequestType
+ aLocation: nsIURIType
+ aFlags: number
+ id: number
+}
+
+declare type OklchThemeVariant = { lightness: number; chroma: number }
+
+declare type OklchTheme = {
+ hue: number
+ foreground: OklchThemeVariant
+ background: OklchThemeVariant
+ active: OklchThemeVariant
+}
+
+declare type WebsiteViewEvents = {
+ loadingChange: boolean
+ progressPercent: number
+ changeIcon: string
+ changeTitle: string
+ locationChange: WebsiteViewLocationChangeProperties
+ themeChange: OklchTheme
+ securityChange: number
+}
+
+declare type WebsiteView = {
+ windowBrowserId: number
+ theme?: OklchTheme
+ iconUrl?: string
+ title?: string
+
+ browser: XULBrowserElement
+ browserId?: number
+
+ events: import('mitt').Emitter
+
+ tabProgressListener: null | TabProgressListenerCleanup
+}
+
+declare interface TabProgressListenerCleanup {
+ remove(browser: XULBrowserElement): void
+}
diff --git a/apps/content/src/shared/styles/window.css b/libs/link/types/windowApi/WindowTabs.d.ts
similarity index 54%
rename from apps/content/src/shared/styles/window.css
rename to libs/link/types/windowApi/WindowTabs.d.ts
index d8341d4..ba08371 100644
--- a/apps/content/src/shared/styles/window.css
+++ b/libs/link/types/windowApi/WindowTabs.d.ts
@@ -2,13 +2,9 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-@import url('./global.css');
+///
-html {
- min-height: 20rem;
- min-width: 40rem;
-}
-
-body {
- height: 100vh;
+declare module '@browser/tabs' {
+ export type WindowTab = { kind: 'tab'; view: WebsiteView }
+ export type WindowTabs = WindowTabs[]
}
diff --git a/libs/link/types/windowApi/eventBus.d.ts b/libs/link/types/windowApi/eventBus.d.ts
new file mode 100644
index 0000000..d861162
--- /dev/null
+++ b/libs/link/types/windowApi/eventBus.d.ts
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+declare module '@browser/event-bus' {
+ import { Emitter } from 'mitt'
+
+ export type ThemeUpdate = {
+ browserId: number
+ meta?: string
+ body?: string
+ }
+
+ export type IconUpdate = {
+ browserId: number
+ iconUrl: string
+ }
+
+ export type EventBus = Emitter<{
+ themeUpdate: ThemeUpdate
+ iconUpdate: IconUpdate
+ }>
+}
diff --git a/libs/shared/package.json b/libs/shared/package.json
deleted file mode 100644
index 080fc1a..0000000
--- a/libs/shared/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "@experiment/shared",
- "version": "1.0.0",
- "description": "",
- "type": "module",
- "source": "src/index.ts",
- "main": "./dist/shared.modern.js",
- "typings": "./dist/index.d.ts",
- "exports": {
- "module": "./dist/shared.modern.js",
- "import": "./dist/shared.modern.js",
- "types": "./dist/index.d.ts",
- "default": "./dist/shared.modern.js"
- },
- "scripts": {
- "build": "microbundle --external=none --format=modern --pkg-main false",
- "dev": "microbundle watch --external=none --format=modern --pkg-main false"
- },
- "devDependencies": {
- "@browser/link": "workspace:*",
- "microbundle": "^0.15.1"
- },
- "keywords": [],
- "author": "",
- "license": "ISC",
- "dependencies": {
- "mitt": "^3.0.1",
- "svelte": "^4.2.8"
- }
-}
diff --git a/libs/shared/src/index.ts b/libs/shared/src/index.ts
deleted file mode 100644
index ee5f786..0000000
--- a/libs/shared/src/index.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-///
-
-export * from './utilities/index.js'
-export * from './xul/index.js'
-
-export * from './lazy.js'
diff --git a/libs/shared/src/lazy.ts b/libs/shared/src/lazy.ts
deleted file mode 100644
index a0804fd..0000000
--- a/libs/shared/src/lazy.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export function lazyESModuleGetters>(
- modules: Modules,
- // @ts-expect-error - Cannot guarantee overlapping key type
-): { [Key in keyof Modules]: MozESMExportType[Key] } {
- // @ts-expect-error - Cannot guarantee overlapping key type
- const lazy = {} as { [Key in keyof Modules]: MozESMExportType[Key] }
-
- ChromeUtils.defineESModuleGetters(lazy, modules)
-
- return lazy
-}
-
-export const lazy = lazyESModuleGetters({
- AppConstants: 'resource://gre/modules/AppConstants.sys.mjs',
- PlacesUtils: 'resource://gre/modules/PlacesUtils.sys.mjs',
- Bookmarks: 'resource://gre/modules/Bookmarks.sys.mjs',
- History: 'resource://gre/modules/History.sys.mjs',
-})
diff --git a/libs/shared/src/utilities/deferred.ts b/libs/shared/src/utilities/deferred.ts
deleted file mode 100644
index 7d1145f..0000000
--- a/libs/shared/src/utilities/deferred.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-///
-
-/**
- * The definition of Deferred object which is returned by PromiseUtils.defer(),
- * It contains a Promise and methods to resolve/reject it.
- */
-export class Deferred implements GenericDeferred {
- /* A method to resolve the associated Promise with the value passed.
- * If the promise is already settled it does nothing.
- *
- * @param value This value is used to resolve the promise
- * If the value is a Promise then the associated promise assumes the state
- * of Promise passed as value.
- */
- resolve!: (val: T) => void
-
- /* A method to reject the assocaited Promise with the value passed.
- * If the promise is already settled it does nothing.
- *
- * @param reason The reason for the rejection of the Promise.
- * Generally its an Error object. If however a Promise is passed, then the Promise
- * itself will be the reason for rejection no matter the state of the Promise.
- */
- reject!: (err: E) => void
-
- /* A newly created Pomise object.
- * Initially in pending state.
- */
- promise: Promise = new Promise((resolve, reject) => {
- this.resolve = resolve
- this.reject = reject
- })
-}
diff --git a/libs/shared/src/utilities/fn.ts b/libs/shared/src/utilities/fn.ts
deleted file mode 100644
index 0700602..0000000
--- a/libs/shared/src/utilities/fn.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export const not =
- >(fn: (...args: T) => boolean) =>
- (...args: T) =>
- !fn(...args)
diff --git a/libs/shared/src/utilities/index.ts b/libs/shared/src/utilities/index.ts
deleted file mode 100644
index 0303dbc..0000000
--- a/libs/shared/src/utilities/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export * from './deferred.js'
-export * from './fn.js'
-export * from './mitt.js'
-export * from './ring.js'
-export * from './svelte.js'
diff --git a/libs/shared/src/utilities/mitt.ts b/libs/shared/src/utilities/mitt.ts
deleted file mode 100644
index bd71b33..0000000
--- a/libs/shared/src/utilities/mitt.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-import type { Emitter, EventType } from 'mitt'
-
-export const waitForEvent = <
- Events extends Record,
- Key extends keyof Events,
->(
- emitter: Emitter,
- event: Key,
-) =>
- new Promise((resolve) => {
- const handler = (value: Events[Key]) => {
- emitter.off(event, handler)
- resolve(value)
- }
-
- emitter.on(event, handler)
- })
diff --git a/libs/shared/src/utilities/ring.ts b/libs/shared/src/utilities/ring.ts
deleted file mode 100644
index 957c4ae..0000000
--- a/libs/shared/src/utilities/ring.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export class Ring {
- private values: T[]
- private index = -1
-
- constructor(count = 5) {
- this.values = Array(count)
- }
-
- public next(value: T) {
- this.index += 1
- if (this.index >= this.values.length) this.index = 0
- this.values[this.index] = value
- }
-
- public prev(): T {
- this.index -= 1
- if (this.index <= -1) this.index = this.values.length - 1
- return this.values[this.index]
- }
-}
diff --git a/libs/shared/src/utilities/svelte.license.md b/libs/shared/src/utilities/svelte.license.md
deleted file mode 100644
index 872373a..0000000
--- a/libs/shared/src/utilities/svelte.license.md
+++ /dev/null
@@ -1,9 +0,0 @@
-This license is for the `viewableWritable` function:
-
-Copyright (c) 2016-23 [these people](https://github.com/sveltejs/svelte/graphs/contributors)
-
-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.
diff --git a/libs/shared/src/utilities/svelte.ts b/libs/shared/src/utilities/svelte.ts
deleted file mode 100644
index d11a303..0000000
--- a/libs/shared/src/utilities/svelte.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import {
- type Invalidator,
- type Readable,
- type StartStopNotifier,
- type Subscriber,
- type Unsubscriber,
- type Updater,
- type Writable,
- get,
- readable,
-} from 'svelte/store'
-
-import { observable } from '../xul/index.js'
-
-type SubInvTuple = [Subscriber, Invalidator]
-
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-const subscriber_queue: (SubInvTuple | any)[] = []
-const noop = () => {}
-
-export function safe_not_equal(a: T, b: T): boolean {
- return a != a
- ? b == b
- : a !== b || (a && typeof a === 'object') || typeof a === 'function'
-}
-
-export interface ViewableWritable extends Writable {
- readOnce(): T
-}
-
-/**
- * Create a `Writable` store that allows both updating and reading by subscription.
- * This variant allows for reading outside of a subscription
- *
- * https://svelte.dev/docs/svelte-store#writable
- *
- * @license MIT The following code was taken directly from svelte. For the license
- * see svelteUtils.svelte.license.md
- */
-export function viewableWritable(
- value: T,
- start: StartStopNotifier = noop,
-): ViewableWritable {
- let stop: Unsubscriber | null = null
- const subscribers: Set<[Subscriber, Invalidator]> = new Set()
-
- function set(new_value: T): void {
- if (safe_not_equal(value, new_value)) {
- value = new_value
- if (stop) {
- // store is ready
- const run_queue = !subscriber_queue.length
- for (const subscriber of subscribers) {
- subscriber[1]()
- subscriber_queue.push(subscriber, value)
- }
- if (run_queue) {
- for (let i = 0; i < subscriber_queue.length; i += 2) {
- subscriber_queue[i][0](subscriber_queue[i + 1])
- }
- subscriber_queue.length = 0
- }
- }
- }
- }
-
- function update(fn: Updater): void {
- set(fn(value))
- }
-
- function subscribe(
- run: Subscriber,
- invalidate: Invalidator = noop,
- ): Unsubscriber {
- const subscriber: SubInvTuple = [run, invalidate]
- subscribers.add(subscriber)
- if (subscribers.size === 1) {
- stop = start(set, update) || noop
- }
- run(value)
- return () => {
- subscribers.delete(subscriber)
- if (subscribers.size === 0 && stop) {
- stop()
- stop = null
- }
- }
- }
-
- function readOnce(): T {
- return value
- }
-
- return { set, update, subscribe, readOnce }
-}
-
-export function resolverStore(
- intermediate: T,
- toResolve: Promise>,
-): Readable {
- return readable(intermediate, (set) => {
- toResolve.then((resolved) => {
- set(get(resolved))
- resolved.subscribe(set)
- })
- })
-}
-
-// NOTE: Autocurrying doesn't infer T correctly
-export const dynamicStringPref =
- (processor: (value: string) => T) =>
- (pref: string): Readable => {
- return readable(
- processor(Services.prefs.getStringPref(pref, '')),
- (set) => {
- const observer = observable(() =>
- set(processor(Services.prefs.getStringPref(pref, ''))),
- )
- Services.prefs.addObserver(pref, observer)
- return () => Services.prefs.removeObserver(pref, observer)
- },
- )
- }
diff --git a/libs/shared/src/xul/PlacesModel.ts b/libs/shared/src/xul/PlacesModel.ts
deleted file mode 100644
index 5a471ae..0000000
--- a/libs/shared/src/xul/PlacesModel.ts
+++ /dev/null
@@ -1,199 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-import mitt from 'mitt'
-import { type Readable, get, readable } from 'svelte/store'
-
-import { lazy } from '../lazy.js'
-
-/**
- * Based on the values defined inside of `historySidebar.js` inside of Firefox
- * @see {@link https://searchfox.org/mozilla-central/source/browser/components/places/content/historySidebar.js#104}
- */
-export enum HistoryGroupType {
- /**
- * An item list with the most visited items up the top. There are no folders.
- */
- MostVisited = 'mostVisited',
- /** An item list with no folders & the last visited item first */
- LastVisited = 'lastVisited',
- /**
- * Similar to {@link HistoryGroupType.LastVisited}, except everything is
- * grouped into date subfolders
- */
- GroupByDate = 'groupByDate',
- /**
- * Similar to {@link HistoryGroupType.LastVisited}, except everything is
- * grouped into site subfolders
- */
- GroupBySite = 'groupBySite',
- /**
- * Similar to {@link HistoryGroupType.LastVisited}, except everything is
- * grouped into date subfolders at the top level, then site subfolders under
- * that
- */
- GroupBySiteAndDate = 'groupBySiteAndDate',
-}
-
-function getQuerySortingOptions(groupType: HistoryGroupType): {
- sortingMode: number | null
- resultType: number | null
-} {
- const NHQO = Ci.nsINavHistoryQueryOptions
-
- let sortingMode: number | null = null
- let resultType: number | null = null
-
- switch (groupType) {
- case HistoryGroupType.MostVisited:
- resultType = NHQO.RESULTS_AS_URI
- sortingMode = NHQO.SORT_BY_VISITCOUNT_DESCENDING
- break
- case HistoryGroupType.LastVisited:
- resultType = NHQO.RESULTS_AS_URI
- sortingMode = NHQO.SORT_BY_DATE_DESCENDING
- break
- case HistoryGroupType.GroupByDate:
- resultType = NHQO.RESULTS_AS_DATE_QUERY
- sortingMode = NHQO.SORT_BY_DATE_DESCENDING
- break
- case HistoryGroupType.GroupBySite:
- resultType = NHQO.RESULTS_AS_SITE_QUERY
- sortingMode = NHQO.SORT_BY_DATE_DESCENDING
- break
- case HistoryGroupType.GroupBySiteAndDate:
- resultType = NHQO.RESULTS_AS_DATE_SITE_QUERY
- sortingMode = NHQO.SORT_BY_DATE_DESCENDING
- break
- }
-
- return { sortingMode, resultType }
-}
-
-export function setNodeOpened(
- node: nsINavHistoryContainerResultNodeType,
- opened = true,
-) {
- node.containerOpen = opened
-}
-
-export function openAll(node: nsINavHistoryResultNodeType) {
- // @ts-expect-error Ci is not correctly typed
- if (node instanceof Ci.nsINavHistoryContainerResultNode) {
- const containerNode = node as nsINavHistoryContainerResultNodeType
- containerNode.containerOpen = true
-
- const nodes = containerNode.childCount
- for (let i = 0; i < nodes; i++) {
- openAll(containerNode.getChild(i))
- }
- }
-}
-
-export const searchableHistoryModel = (
- searchTerms: Readable,
- groupType: Readable,
-) => {
- const controller = new PlacesController()
-
- const callLoad = (searchTerms: string, groupType: HistoryGroupType) => {
- const hasSearchTerm = searchTerms != ''
-
- const query = lazy.PlacesUtils.history.getNewQuery()
- if (hasSearchTerm) query.searchTerms = searchTerms
-
- const options = lazy.PlacesUtils.history.getNewQueryOptions()
-
- const { sortingMode, resultType } = getQuerySortingOptions(groupType)
- if (sortingMode) options.sortingMode = sortingMode
- if (resultType) options.resultType = resultType
- options.includeHidden = hasSearchTerm
-
- controller.load(query, options)
- }
-
- return readable<{ root: nsINavHistoryContainerResultNodeType | null }>(
- { root: null },
- (set) => {
- controller.events.on('newResult', (result) => set({ root: result.root }))
- searchTerms.subscribe((searchTerms) =>
- callLoad(searchTerms, get(groupType)),
- )
- groupType.subscribe((groupType) => callLoad(get(searchTerms), groupType))
-
- callLoad(get(searchTerms), get(groupType))
- },
- )
-}
-
-export type PlacesSharedEvents = {
- newResult: nsINavHistoryResultType
-}
-
-/**
- * Similar in concept to Firefox's places tree view
- * @see {@link https://searchfox.org/mozilla-central/source/browser/components/places/content/treeView.js}
- */
-class PlacesController {
- events = mitt()
- observer?: PlacesObserver
-
- load(query: nsINavHistoryQueryType, options: nsINavHistoryQueryOptionsType) {
- const observer = new PlacesObserver()
- observer.events.on('*', (event, ...args) =>
- this.events.emit(event, ...args),
- )
-
- const result = lazy.PlacesUtils.history.executeQuery(query, options)
- result.addObserver(observer)
-
- if (this.observer) this.observer.uninit()
- this.observer = observer
- }
-}
-
-class PlacesObserver implements nsINavHistoryResultObserverType {
- QueryInterface = ChromeUtils.generateQI([
- 'nsINavHistoryResultObserver',
- 'nsISupportsWeakReference',
- ])
-
- private _result: nsINavHistoryResultType | null = null
- events = mitt()
- skipHistoryDetailsNotifications = false
-
- get result(): nsINavHistoryResultType {
- return this._result!
- }
-
- set result(result: nsINavHistoryResultType) {
- if (this._result) {
- this._result.removeObserver(this)
- }
-
- this._result = result
- this.events.emit('newResult', result)
- }
-
- uninit() {
- if (this._result) this._result.removeObserver(this)
- }
-
- // Generated interface garbage
-
- nodeInserted(): void {}
- nodeRemoved(): void {}
- nodeMoved(): void {}
- nodeTitleChanged(): void {}
- nodeURIChanged(): void {}
- nodeIconChanged(): void {}
- nodeHistoryDetailsChanged(): void {}
- nodeTagsChanged(): void {}
- nodeKeywordChanged(): void {}
- nodeDateAddedChanged(): void {}
- nodeLastModifiedChanged(): void {}
- containerStateChanged(): void {}
- invalidateContainer(): void {}
- sortingChanged(): void {}
- batching(): void {}
-}
diff --git a/libs/shared/src/xul/index.ts b/libs/shared/src/xul/index.ts
deleted file mode 100644
index 7a6dadd..0000000
--- a/libs/shared/src/xul/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export * from './messageReceiver.js'
-export * from './observable.js'
-export * from './PlacesModel.js'
diff --git a/libs/shared/src/xul/messageReceiver.ts b/libs/shared/src/xul/messageReceiver.ts
deleted file mode 100644
index d1a3ec8..0000000
--- a/libs/shared/src/xul/messageReceiver.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export class MessageReviver<
- Cb extends (argument: ReceiveMessageArgument) => unknown,
-> implements MessageListener
-{
- receiveMessage: Cb
-
- constructor(callback: Cb) {
- this.receiveMessage = callback
- }
-}
diff --git a/libs/shared/src/xul/observable.ts b/libs/shared/src/xul/observable.ts
deleted file mode 100644
index 825c142..0000000
--- a/libs/shared/src/xul/observable.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-export type ObservableCallback = (
- subject: nsISupportsType,
- topic: string,
- data: string,
-) => void
-
-class ObservableImpl implements nsIObserverType {
- QueryInterface = ChromeUtils.generateQI(['nsIObserver'])
- observe: ObservableCallback
-
- constructor(cb: ObservableCallback) {
- this.observe = cb
- }
-}
-
-export function observable(callback: ObservableCallback): nsIObserverType {
- return new ObservableImpl(callback)
-}
diff --git a/libs/shared/tsconfig.json b/libs/shared/tsconfig.json
deleted file mode 100644
index df4849b..0000000
--- a/libs/shared/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "module": "NodeNext",
- "target": "ESNext",
- "moduleResolution": "NodeNext"
- },
- "include": ["src/**/*"]
-}
diff --git a/package.json b/package.json
index 44d8350..508b793 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"lint": "eslint .",
"format": "pnpm lint && pnpm script:license-check --fix && prettier . --write --plugin prettier-plugin-svelte",
"data": "concurrently -c auto pnpm:data:*",
- "data:tld": "wget https://data.iana.org/TLD/tlds-alpha-by-domain.txt -O ./apps/content/src/shared/search/providers/data/tld.txt"
+ "data:tld": "wget https://data.iana.org/TLD/tlds-alpha-by-domain.txt -O ./apps/content/src/browser/data/tld.txt"
},
"keywords": [],
"author": "",
@@ -28,8 +28,6 @@
"@total-typescript/ts-reset": "^0.5.1",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/node": "^20.8.4",
- "@typescript-eslint/eslint-plugin": "^6.11.0",
- "@typescript-eslint/parser": "^6.11.0",
"concurrently": "^8.2.1",
"eslint": "^8.53.0",
"eslint-plugin-listeners": "^1.4.0",
@@ -46,9 +44,8 @@
},
"pnpm": {
"patchedDependencies": {
- "svelte@4.2.8": "apps/content/patches/svelte@4.2.1.patch",
- "webpack-license-plugin@4.4.2": "apps/content/patches/webpack-license-plugin@4.4.2.patch",
- "@melt-ui/svelte@0.67.0": "apps/content/patches/@melt-ui__svelte@0.64.5.patch"
+ "svelte@4.2.12": "apps/content/patches/svelte@4.2.1.patch",
+ "webpack-license-plugin@4.4.2": "apps/content/patches/webpack-license-plugin@4.4.2.patch"
}
},
"prettier": {
@@ -83,20 +80,16 @@
"node": true
},
"extends": [
- "eslint:recommended",
- "plugin:@typescript-eslint/recommended"
+ "eslint:recommended"
],
- "parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
- "@typescript-eslint",
"listeners"
],
"rules": {
- "@typescript-eslint/triple-slash-reference": "off",
"no-extra-semi": "off",
"no-console": "warn",
"no-undef": "off"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d199c3d..548cdf7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,10 +5,7 @@ settings:
excludeLinksFromLockfile: false
patchedDependencies:
- '@melt-ui/svelte@0.67.0':
- hash: aeypykqddydgtdgxoo44wxfeey
- path: apps/content/patches/@melt-ui__svelte@0.64.5.patch
- svelte@4.2.8:
+ svelte@4.2.12:
hash: cm43hmf4gczhssi3isoosy53r4
path: apps/content/patches/svelte@4.2.1.patch
webpack-license-plugin@4.4.2:
@@ -31,12 +28,6 @@ importers:
'@types/node':
specifier: ^20.8.4
version: 20.8.4
- '@typescript-eslint/eslint-plugin':
- specifier: ^6.11.0
- version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2)
- '@typescript-eslint/parser':
- specifier: ^6.11.0
- version: 6.11.0(eslint@8.53.0)(typescript@5.2.2)
concurrently:
specifier: ^8.2.1
version: 8.2.1
@@ -66,7 +57,7 @@ importers:
version: 3.2.3(prettier@3.0.3)(typescript@5.2.2)
prettier-plugin-svelte:
specifier: ^3.0.3
- version: 3.0.3(prettier@3.0.3)(svelte@4.2.8)
+ version: 3.0.3(prettier@3.0.3)(svelte@4.2.12)
tap-spec:
specifier: ^5.0.0
version: 5.0.0
@@ -85,15 +76,15 @@ importers:
apps/content:
dependencies:
+ '@amadeus-it-group/tansu':
+ specifier: ^1.0.0
+ version: 1.0.0
'@catppuccin/palette':
specifier: ^1.0.1
version: 1.0.1
- '@experiment/shared':
- specifier: workspace:*
- version: link:../../libs/shared
- '@melt-ui/svelte':
- specifier: ^0.67.0
- version: 0.67.0(patch_hash=aeypykqddydgtdgxoo44wxfeey)(svelte@4.2.8)
+ colorjs.io:
+ specifier: ^0.5.0
+ version: 0.5.0
fnts:
specifier: ^2.1.0
version: 2.1.0(typescript@5.3.3)
@@ -109,6 +100,9 @@ importers:
snarkdown:
specifier: ^2.0.0
version: 2.0.0
+ svelte-remixicon:
+ specifier: ^2.4.0
+ version: 2.4.0(svelte@4.2.12)
zora:
specifier: ^5.2.0
version: 5.2.0
@@ -116,9 +110,6 @@ importers:
'@browser/link':
specifier: workspace:*
version: link:../../libs/link
- '@melt-ui/pp':
- specifier: ^0.3.0
- version: 0.3.0(@melt-ui/svelte@0.67.0)(svelte@4.2.8)
'@total-typescript/ts-reset':
specifier: ^0.5.1
version: 0.5.1
@@ -131,6 +122,9 @@ importers:
css-loader:
specifier: ^6.8.1
version: 6.8.1(webpack@5.89.0)
+ gecko-types:
+ specifier: github:quark-platform/gecko-types
+ version: github.com/quark-platform/gecko-types/4e238b774e4415cbf0ad14b79060f39dd059bd29
html-webpack-plugin:
specifier: ^5.6.0
version: 5.6.0(webpack@5.89.0)
@@ -144,14 +138,14 @@ importers:
specifier: ^3.3.3
version: 3.3.3(webpack@5.89.0)
svelte:
- specifier: ^4.2.8
- version: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ specifier: ^4.2.12
+ version: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
svelte-loader:
- specifier: ^3.1.9
- version: 3.1.9(svelte@4.2.8)
+ specifier: ^3.2.0
+ version: 3.2.0(svelte@4.2.12)
svelte-preprocess:
specifier: ^5.1.3
- version: 5.1.3(postcss@8.4.31)(svelte@4.2.8)(typescript@5.3.3)
+ version: 5.1.3(postcss@8.4.31)(svelte@4.2.12)(typescript@5.3.3)
svelte-sequential-preprocessor:
specifier: ^2.0.1
version: 2.0.1
@@ -199,9 +193,6 @@ importers:
'@types/firefox-webext-browser':
specifier: ^120.0.0
version: 120.0.0
- gecko-types:
- specifier: github:quark-platform/gecko-types
- version: github.com/quark-platform/gecko-types/015f4eddb9a02d5f60ef82bf04e7b78bbb15ffd6
gecko-types@latest:
specifier: link:quark-platform/gecko-types@latest
version: link:quark-platform/gecko-types@latest
@@ -209,26 +200,16 @@ importers:
specifier: ^3.0.1
version: 3.0.1
devDependencies:
+ '@amadeus-it-group/tansu':
+ specifier: ^1.0.0
+ version: 1.0.0
+ gecko-types:
+ specifier: github:quark-platform/gecko-types
+ version: github.com/quark-platform/gecko-types/4e238b774e4415cbf0ad14b79060f39dd059bd29
zora:
specifier: ^5.2.0
version: 5.2.0
- libs/shared:
- dependencies:
- mitt:
- specifier: ^3.0.1
- version: 3.0.1
- svelte:
- specifier: ^4.2.8
- version: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
- devDependencies:
- '@browser/link':
- specifier: workspace:*
- version: link:../link
- microbundle:
- specifier: ^0.15.1
- version: 0.15.1
-
packages:
/@aashutoshrathi/word-wrap@1.2.6:
@@ -236,6 +217,9 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /@amadeus-it-group/tansu@1.0.0:
+ resolution: {integrity: sha512-JXR89NVtWT8rn7prB9j7/x/n/IxiWJEXhRWztyocrzb+M9hEhvIESeIE3mpSbrWRmDTyWvdpDCnOvKJ5/W8APQ==}
+
/@ampproject/remapping@2.2.1:
resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
engines: {node: '>=6.0.0'}
@@ -251,42 +235,6 @@ packages:
chalk: 2.4.2
dev: true
- /@babel/code-frame@7.23.5:
- resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/highlight': 7.23.4
- chalk: 2.4.2
- dev: true
-
- /@babel/compat-data@7.23.5:
- resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==}
- engines: {node: '>=6.9.0'}
- dev: true
-
- /@babel/core@7.23.7:
- resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@ampproject/remapping': 2.2.1
- '@babel/code-frame': 7.23.5
- '@babel/generator': 7.23.6
- '@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
- '@babel/helpers': 7.23.7
- '@babel/parser': 7.23.6
- '@babel/template': 7.22.15
- '@babel/traverse': 7.23.7
- '@babel/types': 7.23.6
- convert-source-map: 2.0.0
- debug: 4.3.4
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@babel/generator@7.17.7:
resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==}
engines: {node: '>=6.9.0'}
@@ -306,86 +254,6 @@ packages:
jsesc: 2.5.2
dev: true
- /@babel/generator@7.23.6:
- resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- '@jridgewell/gen-mapping': 0.3.3
- '@jridgewell/trace-mapping': 0.3.19
- jsesc: 2.5.2
- dev: true
-
- /@babel/helper-annotate-as-pure@7.22.5:
- resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15:
- resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helper-compilation-targets@7.23.6:
- resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/compat-data': 7.23.5
- '@babel/helper-validator-option': 7.23.5
- browserslist: 4.22.2
- lru-cache: 5.1.1
- semver: 6.3.1
- dev: true
-
- /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7):
- resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-member-expression-to-functions': 7.23.0
- '@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7)
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- semver: 6.3.1
- dev: true
-
- /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7):
- resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- regexpu-core: 5.3.2
- semver: 6.3.1
- dev: true
-
- /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-plugin-utils': 7.22.5
- debug: 4.3.4
- lodash.debounce: 4.0.8
- resolve: 1.22.8
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@babel/helper-environment-visitor@7.22.20:
resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
engines: {node: '>=6.9.0'}
@@ -406,84 +274,6 @@ packages:
'@babel/types': 7.23.3
dev: true
- /@babel/helper-member-expression-to-functions@7.23.0:
- resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helper-module-imports@7.22.15:
- resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-module-imports': 7.22.15
- '@babel/helper-simple-access': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/helper-validator-identifier': 7.22.20
- dev: true
-
- /@babel/helper-optimise-call-expression@7.22.5:
- resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helper-plugin-utils@7.22.5:
- resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==}
- engines: {node: '>=6.9.0'}
- dev: true
-
- /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7):
- resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-wrap-function': 7.22.20
- dev: true
-
- /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7):
- resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-member-expression-to-functions': 7.23.0
- '@babel/helper-optimise-call-expression': 7.22.5
- dev: true
-
- /@babel/helper-simple-access@7.22.5:
- resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helper-skip-transparent-expression-wrappers@7.22.5:
- resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
/@babel/helper-split-export-declaration@7.22.6:
resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
engines: {node: '>=6.9.0'}
@@ -496,41 +286,11 @@ packages:
engines: {node: '>=6.9.0'}
dev: true
- /@babel/helper-string-parser@7.23.4:
- resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
- engines: {node: '>=6.9.0'}
- dev: true
-
/@babel/helper-validator-identifier@7.22.20:
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
engines: {node: '>=6.9.0'}
dev: true
- /@babel/helper-validator-option@7.23.5:
- resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
- engines: {node: '>=6.9.0'}
- dev: true
-
- /@babel/helper-wrap-function@7.22.20:
- resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-function-name': 7.23.0
- '@babel/template': 7.22.15
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/helpers@7.23.7:
- resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/template': 7.22.15
- '@babel/traverse': 7.23.7
- '@babel/types': 7.23.6
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@babel/highlight@7.22.20:
resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==}
engines: {node: '>=6.9.0'}
@@ -540,15 +300,6 @@ packages:
js-tokens: 4.0.0
dev: true
- /@babel/highlight@7.23.4:
- resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.22.20
- chalk: 2.4.2
- js-tokens: 4.0.0
- dev: true
-
/@babel/parser@7.23.3:
resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==}
engines: {node: '>=6.0.0'}
@@ -557,1144 +308,126 @@ packages:
'@babel/types': 7.17.0
dev: true
- /@babel/parser@7.23.6:
- resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==}
- engines: {node: '>=6.0.0'}
- hasBin: true
- dependencies:
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==}
+ /@babel/runtime@7.23.2:
+ resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ regenerator-runtime: 0.14.0
dev: true
- /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==}
+ /@babel/template@7.22.15:
+ resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.13.0
dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7)
+ '@babel/code-frame': 7.22.13
+ '@babel/parser': 7.23.3
+ '@babel/types': 7.23.3
dev: true
- /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7):
- resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==}
+ /@babel/traverse@7.23.2:
+ resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
dependencies:
- '@babel/core': 7.23.7
+ '@babel/code-frame': 7.22.13
+ '@babel/generator': 7.23.3
'@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-hoist-variables': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/parser': 7.23.3
+ '@babel/types': 7.23.3
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
dev: true
- /@babel/plugin-proposal-class-properties@7.12.1(@babel/core@7.23.7):
- resolution: {integrity: sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==}
- deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@babel/types@7.17.0:
+ resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==}
+ engines: {node: '>=6.9.0'}
dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
dev: true
- /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7):
- resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ /@babel/types@7.23.3:
+ resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==}
engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
dependencies:
- '@babel/core': 7.23.7
+ '@babel/helper-string-parser': 7.22.5
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
dev: true
- /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
+ /@catppuccin/palette@1.0.1:
+ resolution: {integrity: sha512-aCVFn6j2HnN6M/yk4co67rF/EWrXhZO2qpJUJd6Xsz8t1BF6PbmftM8Gz3wFHPfUdTogU0dUiKs+YsW19hJ8mQ==}
+ dev: false
- /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7):
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ /@discoveryjs/json-ext@0.5.7:
+ resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
+ engines: {node: '>=10.0.0'}
dev: true
- /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7):
- resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
- engines: {node: '>=6.9.0'}
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
- '@babel/core': ^7.0.0-0
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ eslint: 8.53.0
+ eslint-visitor-keys: 3.4.3
dev: true
- /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ /@eslint-community/regexpp@4.10.0:
+ resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
dev: true
- /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@eslint/eslintrc@2.1.3:
+ resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.6.1
+ globals: 13.23.0
+ ignore: 5.2.4
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
dev: true
- /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ /@eslint/js@8.53.0:
+ resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
+ /@humanwhocodes/config-array@0.11.13:
+ resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
+ engines: {node: '>=10.10.0'}
dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ '@humanwhocodes/object-schema': 2.0.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
dev: true
- /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
dev: true
- /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
+ /@humanwhocodes/object-schema@2.0.1:
+ resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
dev: true
- /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7):
- resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7):
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7):
- resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7):
- resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-module-imports': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.12.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.7):
- resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-optimise-call-expression': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7)
- '@babel/helper-split-export-declaration': 7.22.6
- globals: 11.12.0
- dev: true
-
- /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/template': 7.22.15
- dev: true
-
- /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7):
- resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- dev: true
-
- /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-simple-access': 7.22.5
- dev: true
-
- /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-identifier': 7.22.20
- dev: true
-
- /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7):
- resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/compat-data': 7.23.5
- '@babel/core': 7.23.7
- '@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.7):
- resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7)
- dev: true
-
- /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-module-imports': 7.22.15
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7)
- '@babel/types': 7.23.6
- dev: true
-
- /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-annotate-as-pure': 7.22.5
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- regenerator-transform: 0.15.2
- dev: true
-
- /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
- dev: true
-
- /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7)
- '@babel/helper-plugin-utils': 7.22.5
- dev: true
-
- /@babel/preset-env@7.23.7(@babel/core@7.23.7):
- resolution: {integrity: sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/compat-data': 7.23.5
- '@babel/core': 7.23.7
- '@babel/helper-compilation-targets': 7.23.6
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-option': 7.23.5
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.7)
- '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7)
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7)
- '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.7)
- '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.23.7)
- '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.7)
- '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.7)
- '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.7)
- '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.7)
- '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.7)
- babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7)
- babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7)
- babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7)
- core-js-compat: 3.35.0
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@babel/preset-flow@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-option': 7.23.5
- '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7):
- resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/types': 7.23.6
- esutils: 2.0.3
- dev: true
-
- /@babel/preset-react@7.23.3(@babel/core@7.23.7):
- resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-plugin-utils': 7.22.5
- '@babel/helper-validator-option': 7.23.5
- '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.7)
- '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.7)
- dev: true
-
- /@babel/regjsgen@0.8.0:
- resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
- dev: true
-
- /@babel/runtime@7.23.2:
- resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.14.0
- dev: true
-
- /@babel/template@7.22.15:
- resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.13
- '@babel/parser': 7.23.3
- '@babel/types': 7.23.3
- dev: true
-
- /@babel/traverse@7.23.2:
- resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.22.13
- '@babel/generator': 7.23.3
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/parser': 7.23.3
- '@babel/types': 7.23.3
- debug: 4.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@babel/traverse@7.23.7:
- resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/code-frame': 7.23.5
- '@babel/generator': 7.23.6
- '@babel/helper-environment-visitor': 7.22.20
- '@babel/helper-function-name': 7.23.0
- '@babel/helper-hoist-variables': 7.22.5
- '@babel/helper-split-export-declaration': 7.22.6
- '@babel/parser': 7.23.6
- '@babel/types': 7.23.6
- debug: 4.3.4
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@babel/types@7.17.0:
- resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
- dev: true
-
- /@babel/types@7.23.3:
- resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.22.5
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
- dev: true
-
- /@babel/types@7.23.6:
- resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==}
- engines: {node: '>=6.9.0'}
- dependencies:
- '@babel/helper-string-parser': 7.23.4
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
- dev: true
-
- /@catppuccin/palette@1.0.1:
- resolution: {integrity: sha512-aCVFn6j2HnN6M/yk4co67rF/EWrXhZO2qpJUJd6Xsz8t1BF6PbmftM8Gz3wFHPfUdTogU0dUiKs+YsW19hJ8mQ==}
- dev: false
-
- /@discoveryjs/json-ext@0.5.7:
- resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
- engines: {node: '>=10.0.0'}
- dev: true
-
- /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0):
- resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- dependencies:
- eslint: 8.53.0
- eslint-visitor-keys: 3.4.3
- dev: true
-
- /@eslint-community/regexpp@4.10.0:
- resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- dev: true
-
- /@eslint/eslintrc@2.1.3:
- resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- ajv: 6.12.6
- debug: 4.3.4
- espree: 9.6.1
- globals: 13.23.0
- ignore: 5.2.4
- import-fresh: 3.3.0
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@eslint/js@8.53.0:
- resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dev: true
-
- /@floating-ui/core@1.5.2:
- resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==}
- dependencies:
- '@floating-ui/utils': 0.1.6
-
- /@floating-ui/dom@1.5.3:
- resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==}
- dependencies:
- '@floating-ui/core': 1.5.2
- '@floating-ui/utils': 0.1.6
-
- /@floating-ui/utils@0.1.6:
- resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==}
-
- /@humanwhocodes/config-array@0.11.13:
- resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
- engines: {node: '>=10.10.0'}
- dependencies:
- '@humanwhocodes/object-schema': 2.0.1
- debug: 4.3.4
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@humanwhocodes/module-importer@1.0.1:
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
- dev: true
-
- /@humanwhocodes/object-schema@2.0.1:
- resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==}
- dev: true
-
- /@internationalized/date@3.5.0:
- resolution: {integrity: sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==}
- dependencies:
- '@swc/helpers': 0.5.3
-
- /@jridgewell/gen-mapping@0.3.3:
- resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
- engines: {node: '>=6.0.0'}
+ /@jridgewell/gen-mapping@0.3.3:
+ resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+ engines: {node: '>=6.0.0'}
dependencies:
'@jridgewell/set-array': 1.1.2
'@jridgewell/sourcemap-codec': 1.4.15
@@ -1725,35 +458,8 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.15
/@leichtgewicht/ip-codec@2.0.4:
- resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==}
- dev: true
-
- /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.67.0)(svelte@4.2.8):
- resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==}
- engines: {pnpm: '>=8.6.3'}
- peerDependencies:
- '@melt-ui/svelte': '>= 0.29.0'
- svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1
- dependencies:
- '@melt-ui/svelte': 0.67.0(patch_hash=aeypykqddydgtdgxoo44wxfeey)(svelte@4.2.8)
- estree-walker: 3.0.3
- magic-string: 0.30.5
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
- dev: true
-
- /@melt-ui/svelte@0.67.0(patch_hash=aeypykqddydgtdgxoo44wxfeey)(svelte@4.2.8):
- resolution: {integrity: sha512-fd9PsDE6sKbeyExagqH0nOpZEnDqyr2efbkjfmCRRYXVW5vlDEOPaSB+mg4Tjch121102sFH1Od+MlXwmeHy3A==}
- peerDependencies:
- svelte: '>=3 <5'
- dependencies:
- '@floating-ui/core': 1.5.2
- '@floating-ui/dom': 1.5.3
- '@internationalized/date': 3.5.0
- dequal: 2.0.3
- focus-trap: 7.5.4
- nanoid: 4.0.2
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
- patched: true
+ resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==}
+ dev: true
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -1776,107 +482,6 @@ packages:
fastq: 1.15.0
dev: true
- /@rollup/plugin-alias@3.1.9(rollup@2.79.1):
- resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==}
- engines: {node: '>=8.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
- dependencies:
- rollup: 2.79.1
- slash: 3.0.0
- dev: true
-
- /@rollup/plugin-babel@5.3.1(@babel/core@7.23.7)(rollup@2.79.1):
- resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==}
- engines: {node: '>= 10.0.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
- '@types/babel__core': ^7.1.9
- rollup: ^1.20.0||^2.0.0
- peerDependenciesMeta:
- '@types/babel__core':
- optional: true
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-module-imports': 7.22.15
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- rollup: 2.79.1
- dev: true
-
- /@rollup/plugin-commonjs@17.1.0(rollup@2.79.1):
- resolution: {integrity: sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==}
- engines: {node: '>= 8.0.0'}
- peerDependencies:
- rollup: ^2.30.0
- dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- commondir: 1.0.1
- estree-walker: 2.0.2
- glob: 7.2.3
- is-reference: 1.2.1
- magic-string: 0.25.9
- resolve: 1.22.8
- rollup: 2.79.1
- dev: true
-
- /@rollup/plugin-json@4.1.0(rollup@2.79.1):
- resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==}
- peerDependencies:
- rollup: ^1.20.0 || ^2.0.0
- dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- rollup: 2.79.1
- dev: true
-
- /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1):
- resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==}
- engines: {node: '>= 10.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
- dependencies:
- '@rollup/pluginutils': 3.1.0(rollup@2.79.1)
- '@types/resolve': 1.17.1
- builtin-modules: 3.3.0
- deepmerge: 4.3.1
- is-module: 1.0.0
- resolve: 1.22.8
- rollup: 2.79.1
- dev: true
-
- /@rollup/pluginutils@3.1.0(rollup@2.79.1):
- resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
- engines: {node: '>= 8.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0
- dependencies:
- '@types/estree': 0.0.39
- estree-walker: 1.0.1
- picomatch: 2.3.1
- rollup: 2.79.1
- dev: true
-
- /@rollup/pluginutils@4.2.1:
- resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
- engines: {node: '>= 8.0.0'}
- dependencies:
- estree-walker: 2.0.2
- picomatch: 2.3.1
- dev: true
-
- /@surma/rollup-plugin-off-main-thread@2.2.3:
- resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
- dependencies:
- ejs: 3.1.9
- json5: 2.2.3
- magic-string: 0.25.9
- string.prototype.matchall: 4.0.10
- dev: true
-
- /@swc/helpers@0.5.3:
- resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==}
- dependencies:
- tslib: 2.6.2
-
/@tinyhttp/accepts@2.2.0:
resolution: {integrity: sha512-Jz60vPt9eQDXtFNaTHGhVsFNEFoQxHldGhB0a6L1oS4MvGJNs6pX5Ibntgth2/DcdtR+PFtbOhKVsZf8kveDLw==}
engines: {node: '>=12.20.0'}
@@ -2022,11 +627,6 @@ packages:
- supports-color
dev: true
- /@trysound/sax@0.2.0:
- resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
- engines: {node: '>=10.13.0'}
- dev: true
-
/@tsconfig/svelte@5.0.2:
resolution: {integrity: sha512-BRbo1fOtyVbhfLyuCWw6wAWp+U8UQle+ZXu84MYYWzYSEB28dyfnRBIE99eoG+qdAC0po6L2ScIEivcT07UaMA==}
dev: true
@@ -2071,10 +671,6 @@ packages:
'@types/json-schema': 7.0.13
dev: true
- /@types/estree@0.0.39:
- resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
- dev: true
-
/@types/estree@1.0.2:
resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==}
@@ -2132,10 +728,6 @@ packages:
undici-types: 5.25.3
dev: true
- /@types/parse-json@4.0.2:
- resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
- dev: true
-
/@types/pug@2.0.7:
resolution: {integrity: sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==}
dev: true
@@ -2148,20 +740,10 @@ packages:
resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==}
dev: true
- /@types/resolve@1.17.1:
- resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
- dependencies:
- '@types/node': 20.8.4
- dev: true
-
/@types/retry@0.12.0:
resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
dev: true
- /@types/semver@7.5.5:
- resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==}
- dev: true
-
/@types/send@0.17.2:
resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==}
dependencies:
@@ -2195,137 +777,6 @@ packages:
'@types/node': 20.8.4
dev: true
- /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2):
- resolution: {integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@eslint-community/regexpp': 4.10.0
- '@typescript-eslint/parser': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
- '@typescript-eslint/scope-manager': 6.11.0
- '@typescript-eslint/type-utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
- '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
- '@typescript-eslint/visitor-keys': 6.11.0
- debug: 4.3.4
- eslint: 8.53.0
- graphemer: 1.4.0
- ignore: 5.2.4
- natural-compare: 1.4.0
- semver: 7.5.4
- ts-api-utils: 1.0.3(typescript@5.2.2)
- typescript: 5.2.2
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2):
- resolution: {integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/scope-manager': 6.11.0
- '@typescript-eslint/types': 6.11.0
- '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
- '@typescript-eslint/visitor-keys': 6.11.0
- debug: 4.3.4
- eslint: 8.53.0
- typescript: 5.2.2
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/scope-manager@6.11.0:
- resolution: {integrity: sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dependencies:
- '@typescript-eslint/types': 6.11.0
- '@typescript-eslint/visitor-keys': 6.11.0
- dev: true
-
- /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2):
- resolution: {integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
- '@typescript-eslint/utils': 6.11.0(eslint@8.53.0)(typescript@5.2.2)
- debug: 4.3.4
- eslint: 8.53.0
- ts-api-utils: 1.0.3(typescript@5.2.2)
- typescript: 5.2.2
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/types@6.11.0:
- resolution: {integrity: sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dev: true
-
- /@typescript-eslint/typescript-estree@6.11.0(typescript@5.2.2):
- resolution: {integrity: sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/types': 6.11.0
- '@typescript-eslint/visitor-keys': 6.11.0
- debug: 4.3.4
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.5.4
- ts-api-utils: 1.0.3(typescript@5.2.2)
- typescript: 5.2.2
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2):
- resolution: {integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0)
- '@types/json-schema': 7.0.13
- '@types/semver': 7.5.5
- '@typescript-eslint/scope-manager': 6.11.0
- '@typescript-eslint/types': 6.11.0
- '@typescript-eslint/typescript-estree': 6.11.0(typescript@5.2.2)
- eslint: 8.53.0
- semver: 7.5.4
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
-
- /@typescript-eslint/visitor-keys@6.11.0:
- resolution: {integrity: sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- dependencies:
- '@typescript-eslint/types': 6.11.0
- eslint-visitor-keys: 3.4.3
- dev: true
-
/@ungap/structured-clone@1.2.0:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true
@@ -2618,13 +1069,6 @@ packages:
dependencies:
dequal: 2.0.3
- /array-buffer-byte-length@1.0.0:
- resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
- dependencies:
- call-bind: 1.0.5
- is-array-buffer: 3.0.2
- dev: true
-
/array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
dev: true
@@ -2633,116 +1077,11 @@ packages:
resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==}
dev: true
- /array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
- dev: true
-
- /arraybuffer.prototype.slice@1.0.2:
- resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
- engines: {node: '>= 0.4'}
- dependencies:
- array-buffer-byte-length: 1.0.0
- call-bind: 1.0.5
- define-properties: 1.2.1
- es-abstract: 1.22.3
- get-intrinsic: 1.2.2
- is-array-buffer: 3.0.2
- is-shared-array-buffer: 1.0.2
- dev: true
-
- /async@3.2.5:
- resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==}
- dev: true
-
- /asyncro@3.0.0:
- resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==}
- dev: true
-
- /autoprefixer@10.4.16(postcss@8.4.31):
- resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
- peerDependencies:
- postcss: ^8.1.0
- dependencies:
- browserslist: 4.22.2
- caniuse-lite: 1.0.30001572
- fraction.js: 4.3.7
- normalize-range: 0.1.2
- picocolors: 1.0.0
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /available-typed-arrays@1.0.5:
- resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /axobject-query@3.2.1:
- resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
+ /axobject-query@4.0.0:
+ resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==}
dependencies:
dequal: 2.0.3
- /babel-plugin-macros@3.1.0:
- resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
- engines: {node: '>=10', npm: '>=6'}
- dependencies:
- '@babel/runtime': 7.23.2
- cosmiconfig: 7.1.0
- resolve: 1.22.8
- dev: true
-
- /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.7):
- resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/compat-data': 7.23.5
- '@babel/core': 7.23.7
- '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7)
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7):
- resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7)
- core-js-compat: 3.35.0
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.7):
- resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==}
- peerDependencies:
- '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7)
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /babel-plugin-transform-async-to-promises@0.8.18:
- resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==}
- dev: true
-
- /babel-plugin-transform-replace-expressions@0.2.0(@babel/core@7.23.7):
- resolution: {integrity: sha512-Eh1rRd9hWEYgkgoA3D0kGp7xJ/wgVshgsqmq60iC4HVWD+Lux+fNHSHBa2v1Hsv+dHflShC71qKhiH40OiPtDA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
- dependencies:
- '@babel/core': 7.23.7
- '@babel/parser': 7.23.6
- dev: true
-
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
@@ -2800,12 +1139,6 @@ packages:
concat-map: 0.0.1
dev: true
- /brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
- dependencies:
- balanced-match: 1.0.2
- dev: true
-
/braces@3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
engines: {node: '>=8'}
@@ -2813,13 +1146,6 @@ packages:
fill-range: 7.0.1
dev: true
- /brotli-size@4.0.0:
- resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==}
- engines: {node: '>= 10.16.0'}
- dependencies:
- duplexer: 0.1.1
- dev: true
-
/browserslist@4.22.1:
resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -2831,17 +1157,6 @@ packages:
update-browserslist-db: 1.0.13(browserslist@4.22.1)
dev: true
- /browserslist@4.22.2:
- resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
- dependencies:
- caniuse-lite: 1.0.30001572
- electron-to-chromium: 1.4.616
- node-releases: 2.0.14
- update-browserslist-db: 1.0.13(browserslist@4.22.2)
- dev: true
-
/buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
dev: true
@@ -2854,11 +1169,6 @@ packages:
resolution: {integrity: sha512-Zy8ZXMyxIT6RMTeY7OP/bDndfj6bwCan7SS98CEndS6deHwWPpseeHlwarNcBim+etXnF9HBc1non5JgDaJU1g==}
dev: true
- /builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
- dev: true
-
/bytes@3.0.0:
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
engines: {node: '>= 0.8'}
@@ -2876,14 +1186,6 @@ packages:
get-intrinsic: 1.2.1
dev: true
- /call-bind@1.0.5:
- resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
- dependencies:
- function-bind: 1.1.2
- get-intrinsic: 1.2.2
- set-function-length: 1.1.1
- dev: true
-
/callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@@ -2896,28 +1198,10 @@ packages:
tslib: 2.6.2
dev: true
- /camelcase@6.3.0:
- resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
- engines: {node: '>=10'}
- dev: true
-
- /caniuse-api@3.0.0:
- resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
- dependencies:
- browserslist: 4.22.2
- caniuse-lite: 1.0.30001572
- lodash.memoize: 4.1.2
- lodash.uniq: 4.5.0
- dev: true
-
/caniuse-lite@1.0.30001547:
resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==}
dev: true
- /caniuse-lite@1.0.30001572:
- resolution: {integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==}
- dev: true
-
/chalk@1.1.3:
resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
engines: {node: '>=0.10.0'}
@@ -3026,14 +1310,14 @@ packages:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
dev: true
- /colord@2.9.3:
- resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
- dev: true
-
/colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
dev: true
+ /colorjs.io@0.5.0:
+ resolution: {integrity: sha512-qekjTiBLM3F/sXKks/ih5aWaHIGu+Ftel0yKEvmpbKvmxpNOhojKgha5uiWEUOqEpRjC1Tq3nJRT7WgdBOxIGg==}
+ dev: false
+
/commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
@@ -3043,20 +1327,11 @@ packages:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: true
- /commander@7.2.0:
- resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
- engines: {node: '>= 10'}
- dev: true
-
/commander@8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
engines: {node: '>= 12'}
dev: true
- /commondir@1.0.1:
- resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
- dev: true
-
/compressible@2.0.18:
resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
engines: {node: '>= 0.6'}
@@ -3083,12 +1358,6 @@ packages:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
- /concat-with-sourcemaps@1.1.0:
- resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==}
- dependencies:
- source-map: 0.6.1
- dev: true
-
/concurrently@8.2.1:
resolution: {integrity: sha512-nVraf3aXOpIcNud5pB9M82p1tynmZkrSGQ1p6X/VY8cJ+2LMVqAgXsJxYYefACSHbTYlm92O1xuhdGTjwoEvbQ==}
engines: {node: ^14.13.0 || >=16.0.0}
@@ -3122,10 +1391,6 @@ packages:
engines: {node: '>= 0.6'}
dev: true
- /convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- dev: true
-
/cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
dev: true
@@ -3150,27 +1415,10 @@ packages:
webpack: 5.89.0(webpack-cli@5.1.4)
dev: true
- /core-js-compat@3.35.0:
- resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==}
- dependencies:
- browserslist: 4.22.2
- dev: true
-
/core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
- /cosmiconfig@7.1.0:
- resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
- engines: {node: '>=10'}
- dependencies:
- '@types/parse-json': 4.0.2
- import-fresh: 3.3.0
- parse-json: 5.2.0
- path-type: 4.0.0
- yaml: 1.10.2
- dev: true
-
/cosmiconfig@8.3.6(typescript@5.3.3):
resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
engines: {node: '>=14'}
@@ -3196,15 +1444,6 @@ packages:
which: 2.0.2
dev: true
- /css-declaration-sorter@6.4.1(postcss@8.4.31):
- resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==}
- engines: {node: ^10 || ^12 || >=14}
- peerDependencies:
- postcss: ^8.0.9
- dependencies:
- postcss: 8.4.31
- dev: true
-
/css-loader@6.8.1(webpack@5.89.0):
resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==}
engines: {node: '>= 12.13.0'}
@@ -3227,17 +1466,9 @@ packages:
dependencies:
boolbase: 1.0.0
css-what: 6.1.0
- domhandler: 4.3.1
- domutils: 2.8.0
- nth-check: 2.1.1
- dev: true
-
- /css-tree@1.1.3:
- resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
- engines: {node: '>=8.0.0'}
- dependencies:
- mdn-data: 2.0.14
- source-map: 0.6.1
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.1.1
dev: true
/css-tree@2.3.1:
@@ -3258,72 +1489,6 @@ packages:
hasBin: true
dev: true
- /cssnano-preset-default@5.2.14(postcss@8.4.31):
- resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- css-declaration-sorter: 6.4.1(postcss@8.4.31)
- cssnano-utils: 3.1.0(postcss@8.4.31)
- postcss: 8.4.31
- postcss-calc: 8.2.4(postcss@8.4.31)
- postcss-colormin: 5.3.1(postcss@8.4.31)
- postcss-convert-values: 5.1.3(postcss@8.4.31)
- postcss-discard-comments: 5.1.2(postcss@8.4.31)
- postcss-discard-duplicates: 5.1.0(postcss@8.4.31)
- postcss-discard-empty: 5.1.1(postcss@8.4.31)
- postcss-discard-overridden: 5.1.0(postcss@8.4.31)
- postcss-merge-longhand: 5.1.7(postcss@8.4.31)
- postcss-merge-rules: 5.1.4(postcss@8.4.31)
- postcss-minify-font-values: 5.1.0(postcss@8.4.31)
- postcss-minify-gradients: 5.1.1(postcss@8.4.31)
- postcss-minify-params: 5.1.4(postcss@8.4.31)
- postcss-minify-selectors: 5.2.1(postcss@8.4.31)
- postcss-normalize-charset: 5.1.0(postcss@8.4.31)
- postcss-normalize-display-values: 5.1.0(postcss@8.4.31)
- postcss-normalize-positions: 5.1.1(postcss@8.4.31)
- postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31)
- postcss-normalize-string: 5.1.0(postcss@8.4.31)
- postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31)
- postcss-normalize-unicode: 5.1.1(postcss@8.4.31)
- postcss-normalize-url: 5.1.0(postcss@8.4.31)
- postcss-normalize-whitespace: 5.1.1(postcss@8.4.31)
- postcss-ordered-values: 5.1.3(postcss@8.4.31)
- postcss-reduce-initial: 5.1.2(postcss@8.4.31)
- postcss-reduce-transforms: 5.1.0(postcss@8.4.31)
- postcss-svgo: 5.1.0(postcss@8.4.31)
- postcss-unique-selectors: 5.1.1(postcss@8.4.31)
- dev: true
-
- /cssnano-utils@3.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /cssnano@5.1.15(postcss@8.4.31):
- resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- cssnano-preset-default: 5.2.14(postcss@8.4.31)
- lilconfig: 2.1.0
- postcss: 8.4.31
- yaml: 1.10.2
- dev: true
-
- /csso@4.2.0:
- resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
- engines: {node: '>=8.0.0'}
- dependencies:
- css-tree: 1.1.3
- dev: true
-
/date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
engines: {node: '>=0.11'}
@@ -3369,11 +1534,6 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
- /deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
- dev: true
-
/default-gateway@6.0.3:
resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
engines: {node: '>= 10'}
@@ -3381,29 +1541,11 @@ packages:
execa: 5.1.1
dev: true
- /define-data-property@1.1.1:
- resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.2.2
- gopd: 1.0.1
- has-property-descriptors: 1.0.1
- dev: true
-
/define-lazy-prop@2.0.0:
resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
engines: {node: '>=8'}
dev: true
- /define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
- dependencies:
- define-data-property: 1.1.1
- has-property-descriptors: 1.0.1
- object-keys: 1.1.1
- dev: true
-
/depd@1.1.2:
resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
engines: {node: '>= 0.6'}
@@ -3497,10 +1639,6 @@ packages:
tslib: 2.6.2
dev: true
- /duplexer@0.1.1:
- resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==}
- dev: true
-
/duplexer@0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
dev: true
@@ -3509,22 +1647,10 @@ packages:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
dev: true
- /ejs@3.1.9:
- resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
- engines: {node: '>=0.10.0'}
- hasBin: true
- dependencies:
- jake: 10.8.7
- dev: true
-
/electron-to-chromium@1.4.551:
resolution: {integrity: sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==}
dev: true
- /electron-to-chromium@1.4.616:
- resolution: {integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==}
- dev: true
-
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: true
@@ -3563,51 +1689,6 @@ packages:
is-arrayish: 0.2.1
dev: true
- /es-abstract@1.22.3:
- resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==}
- engines: {node: '>= 0.4'}
- dependencies:
- array-buffer-byte-length: 1.0.0
- arraybuffer.prototype.slice: 1.0.2
- available-typed-arrays: 1.0.5
- call-bind: 1.0.5
- es-set-tostringtag: 2.0.2
- es-to-primitive: 1.2.1
- function.prototype.name: 1.1.6
- get-intrinsic: 1.2.2
- get-symbol-description: 1.0.0
- globalthis: 1.0.3
- gopd: 1.0.1
- has-property-descriptors: 1.0.1
- has-proto: 1.0.1
- has-symbols: 1.0.3
- hasown: 2.0.0
- internal-slot: 1.0.6
- is-array-buffer: 3.0.2
- is-callable: 1.2.7
- is-negative-zero: 2.0.2
- is-regex: 1.1.4
- is-shared-array-buffer: 1.0.2
- is-string: 1.0.7
- is-typed-array: 1.1.12
- is-weakref: 1.0.2
- object-inspect: 1.13.1
- object-keys: 1.1.1
- object.assign: 4.1.5
- regexp.prototype.flags: 1.5.1
- safe-array-concat: 1.0.1
- safe-regex-test: 1.0.0
- string.prototype.trim: 1.2.8
- string.prototype.trimend: 1.0.7
- string.prototype.trimstart: 1.0.7
- typed-array-buffer: 1.0.0
- typed-array-byte-length: 1.0.0
- typed-array-byte-offset: 1.0.0
- typed-array-length: 1.0.4
- unbox-primitive: 1.0.2
- which-typed-array: 1.1.13
- dev: true
-
/es-escape-html@0.1.1:
resolution: {integrity: sha512-yUx1o+8RsG7UlszmYPtks+dm6Lho2m8lgHMOsLJQsFI0R8XwUJwiMhM1M4E/S8QLeGyf6MkDV/pWgjQ0tdTSyQ==}
engines: {node: '>=12.x'}
@@ -3617,24 +1698,6 @@ packages:
resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==}
dev: true
- /es-set-tostringtag@2.0.2:
- resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.2.2
- has-tostringtag: 1.0.0
- hasown: 2.0.0
- dev: true
-
- /es-to-primitive@1.2.1:
- resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
- engines: {node: '>= 0.4'}
- dependencies:
- is-callable: 1.2.7
- is-date-object: 1.0.5
- is-symbol: 1.0.4
- dev: true
-
/es6-promise@3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
dev: true
@@ -3768,18 +1831,6 @@ packages:
engines: {node: '>=4.0'}
dev: true
- /estree-walker@0.6.1:
- resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
- dev: true
-
- /estree-walker@1.0.1:
- resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
- dev: true
-
- /estree-walker@2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
- dev: true
-
/estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
dependencies:
@@ -3929,17 +1980,6 @@ packages:
flat-cache: 3.2.0
dev: true
- /filelist@1.0.4:
- resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
- dependencies:
- minimatch: 5.1.6
- dev: true
-
- /filesize@6.4.0:
- resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==}
- engines: {node: '>= 0.4.0'}
- dev: true
-
/fill-range@7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
engines: {node: '>=8'}
@@ -3962,15 +2002,6 @@ packages:
- supports-color
dev: true
- /find-cache-dir@3.3.2:
- resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
- engines: {node: '>=8'}
- dependencies:
- commondir: 1.0.1
- make-dir: 3.1.0
- pkg-dir: 4.2.0
- dev: true
-
/find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
@@ -4011,11 +2042,6 @@ packages:
typescript: 5.3.3
dev: false
- /focus-trap@7.5.4:
- resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==}
- dependencies:
- tabbable: 6.2.0
-
/follow-redirects@1.15.3:
resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==}
engines: {node: '>=4.0'}
@@ -4026,35 +2052,16 @@ packages:
optional: true
dev: true
- /for-each@0.3.3:
- resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
- dependencies:
- is-callable: 1.2.7
- dev: true
-
/forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
dev: true
- /fraction.js@4.3.7:
- resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
- dev: true
-
/fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
dev: true
- /fs-extra@10.1.0:
- resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
- engines: {node: '>=12'}
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 6.1.0
- universalify: 2.0.1
- dev: true
-
/fs-monkey@1.0.5:
resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==}
dev: true
@@ -4075,35 +2082,6 @@ packages:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
- /function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- dev: true
-
- /function.prototype.name@1.1.6:
- resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- es-abstract: 1.22.3
- functions-have-names: 1.2.3
- dev: true
-
- /functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- dev: true
-
- /generic-names@4.0.0:
- resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==}
- dependencies:
- loader-utils: 3.2.1
- dev: true
-
- /gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
- dev: true
-
/get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -4118,15 +2096,6 @@ packages:
has-symbols: 1.0.3
dev: true
- /get-intrinsic@1.2.2:
- resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
- dependencies:
- function-bind: 1.1.2
- has-proto: 1.0.1
- has-symbols: 1.0.3
- hasown: 2.0.0
- dev: true
-
/get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@@ -4137,14 +2106,6 @@ packages:
engines: {node: '>=16'}
dev: true
- /get-symbol-description@1.0.0:
- resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- get-intrinsic: 1.2.2
- dev: true
-
/glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -4186,29 +2147,6 @@ packages:
type-fest: 0.20.2
dev: true
- /globalthis@1.0.3:
- resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
- engines: {node: '>= 0.4'}
- dependencies:
- define-properties: 1.2.1
- dev: true
-
- /globalyzer@0.1.0:
- resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
- dev: true
-
- /globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
- dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.1
- ignore: 5.2.4
- merge2: 1.4.1
- slash: 3.0.0
- dev: true
-
/globby@13.2.2:
resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -4220,16 +2158,6 @@ packages:
slash: 4.0.0
dev: true
- /globrex@0.1.2:
- resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
- dev: true
-
- /gopd@1.0.1:
- resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
- dependencies:
- get-intrinsic: 1.2.2
- dev: true
-
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
dev: true
@@ -4238,20 +2166,6 @@ packages:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
dev: true
- /gzip-size@3.0.0:
- resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==}
- engines: {node: '>=0.12.0'}
- dependencies:
- duplexer: 0.1.2
- dev: true
-
- /gzip-size@6.0.0:
- resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
- engines: {node: '>=10'}
- dependencies:
- duplexer: 0.1.2
- dev: true
-
/handle-thing@2.0.1:
resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
dev: true
@@ -4263,10 +2177,6 @@ packages:
ansi-regex: 2.1.1
dev: true
- /has-bigints@1.0.2:
- resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- dev: true
-
/has-flag@3.0.0:
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
engines: {node: '>=4'}
@@ -4277,12 +2187,6 @@ packages:
engines: {node: '>=8'}
dev: true
- /has-property-descriptors@1.0.1:
- resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==}
- dependencies:
- get-intrinsic: 1.2.2
- dev: true
-
/has-proto@1.0.1:
resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
engines: {node: '>= 0.4'}
@@ -4293,25 +2197,11 @@ packages:
engines: {node: '>= 0.4'}
dev: true
- /has-tostringtag@1.0.0:
- resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
/has@1.0.4:
resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
engines: {node: '>= 0.4.0'}
dev: true
- /hasown@2.0.0:
- resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
- engines: {node: '>= 0.4'}
- dependencies:
- function-bind: 1.1.2
- dev: true
-
/he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
@@ -4471,10 +2361,6 @@ packages:
safer-buffer: 2.1.2
dev: true
- /icss-replace-symbols@1.1.0:
- resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==}
- dev: true
-
/icss-utils@5.1.0(postcss@8.4.31):
resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
engines: {node: ^10 || ^12 || >= 14}
@@ -4489,13 +2375,6 @@ packages:
engines: {node: '>= 4'}
dev: true
- /import-cwd@3.0.0:
- resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==}
- engines: {node: '>=8'}
- dependencies:
- import-from: 3.0.0
- dev: true
-
/import-fresh@3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
@@ -4504,13 +2383,6 @@ packages:
resolve-from: 4.0.0
dev: true
- /import-from@3.0.0:
- resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==}
- engines: {node: '>=8'}
- dependencies:
- resolve-from: 5.0.0
- dev: true
-
/import-local@3.1.0:
resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
engines: {node: '>=8'}
@@ -4540,15 +2412,6 @@ packages:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
dev: true
- /internal-slot@1.0.6:
- resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==}
- engines: {node: '>= 0.4'}
- dependencies:
- get-intrinsic: 1.2.2
- hasown: 2.0.0
- side-channel: 1.0.4
- dev: true
-
/interpret@3.1.1:
resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==}
engines: {node: '>=10.13.0'}
@@ -4564,24 +2427,10 @@ packages:
engines: {node: '>= 10'}
dev: true
- /is-array-buffer@3.0.2:
- resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
- dependencies:
- call-bind: 1.0.5
- get-intrinsic: 1.2.2
- is-typed-array: 1.1.12
- dev: true
-
/is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
dev: true
- /is-bigint@1.0.4:
- resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
- dependencies:
- has-bigints: 1.0.2
- dev: true
-
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
@@ -4589,32 +2438,12 @@ packages:
binary-extensions: 2.2.0
dev: true
- /is-boolean-object@1.1.2:
- resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- has-tostringtag: 1.0.0
- dev: true
-
- /is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
- dev: true
-
/is-core-module@2.13.0:
resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
dependencies:
has: 1.0.4
dev: true
- /is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
/is-docker@2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'}
@@ -4643,22 +2472,6 @@ packages:
is-extglob: 2.1.1
dev: true
- /is-module@1.0.0:
- resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
- dev: true
-
- /is-negative-zero@2.0.2:
- resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /is-number-object@1.0.7:
- resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
/is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@@ -4681,31 +2494,11 @@ packages:
isobject: 3.0.1
dev: true
- /is-reference@1.2.1:
- resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
- dependencies:
- '@types/estree': 1.0.2
- dev: true
-
/is-reference@3.0.2:
resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
dependencies:
'@types/estree': 1.0.2
- /is-regex@1.1.4:
- resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- has-tostringtag: 1.0.0
- dev: true
-
- /is-shared-array-buffer@1.0.2:
- resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
- dependencies:
- call-bind: 1.0.5
- dev: true
-
/is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
@@ -4716,33 +2509,6 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: true
- /is-string@1.0.7:
- resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-tostringtag: 1.0.0
- dev: true
-
- /is-symbol@1.0.4:
- resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
- engines: {node: '>= 0.4'}
- dependencies:
- has-symbols: 1.0.3
- dev: true
-
- /is-typed-array@1.1.12:
- resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
- engines: {node: '>= 0.4'}
- dependencies:
- which-typed-array: 1.1.13
- dev: true
-
- /is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
- dependencies:
- call-bind: 1.0.5
- dev: true
-
/is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
@@ -4754,10 +2520,6 @@ packages:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
dev: true
- /isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- dev: true
-
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
@@ -4767,30 +2529,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /jake@10.8.7:
- resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
- engines: {node: '>=10'}
- hasBin: true
- dependencies:
- async: 3.2.5
- chalk: 4.1.2
- filelist: 1.0.4
- minimatch: 3.1.2
- dev: true
-
/javascript-natural-sort@0.7.1:
resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==}
dev: true
- /jest-worker@26.6.2:
- resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
- engines: {node: '>= 10.13.0'}
- dependencies:
- '@types/node': 20.8.4
- merge-stream: 2.0.0
- supports-color: 7.2.0
- dev: true
-
/jest-worker@27.5.1:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
@@ -4816,11 +2558,6 @@ packages:
argparse: 2.0.1
dev: true
- /jsesc@0.5.0:
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
- hasBin: true
- dev: true
-
/jsesc@2.5.2:
resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
engines: {node: '>=4'}
@@ -4853,14 +2590,6 @@ packages:
hasBin: true
dev: true
- /jsonfile@6.1.0:
- resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
- dependencies:
- universalify: 2.0.1
- optionalDependencies:
- graceful-fs: 4.2.11
- dev: true
-
/keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
dependencies:
@@ -4892,11 +2621,6 @@ packages:
type-check: 0.4.0
dev: true
- /lilconfig@2.1.0:
- resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
- engines: {node: '>=10'}
- dev: true
-
/lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
dev: true
@@ -4915,11 +2639,6 @@ packages:
json5: 2.2.3
dev: true
- /loader-utils@3.2.1:
- resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==}
- engines: {node: '>= 12.13.0'}
- dev: true
-
/locate-character@3.0.0:
resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
@@ -4937,26 +2656,10 @@ packages:
p-locate: 5.0.0
dev: true
- /lodash.camelcase@4.3.0:
- resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
- dev: true
-
- /lodash.debounce@4.0.8:
- resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
- dev: true
-
- /lodash.memoize@4.1.2:
- resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
- dev: true
-
/lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
dev: true
- /lodash.uniq@4.5.0:
- resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
- dev: true
-
/lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true
@@ -4967,12 +2670,6 @@ packages:
tslib: 2.6.2
dev: true
- /lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- dependencies:
- yallist: 3.1.1
- dev: true
-
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
@@ -4980,39 +2677,12 @@ packages:
yallist: 4.0.0
dev: true
- /magic-string@0.25.9:
- resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
- dependencies:
- sourcemap-codec: 1.4.8
- dev: true
-
/magic-string@0.30.5:
resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
- /make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
- dependencies:
- semver: 6.3.1
- dev: true
-
- /maxmin@2.1.0:
- resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==}
- engines: {node: '>=0.12'}
- dependencies:
- chalk: 1.1.3
- figures: 1.7.0
- gzip-size: 3.0.0
- pretty-bytes: 3.0.1
- dev: true
-
- /mdn-data@2.0.14:
- resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
- dev: true
-
/mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
@@ -5046,58 +2716,6 @@ packages:
engines: {node: '>= 0.6'}
dev: true
- /microbundle@0.15.1:
- resolution: {integrity: sha512-aAF+nwFbkSIJGfrJk+HyzmJOq3KFaimH6OIFBU6J2DPjQeg1jXIYlIyEv81Gyisb9moUkudn+wj7zLNYMOv75Q==}
- hasBin: true
- dependencies:
- '@babel/core': 7.23.7
- '@babel/plugin-proposal-class-properties': 7.12.1(@babel/core@7.23.7)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7)
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.7)
- '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7)
- '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.7)
- '@babel/preset-env': 7.23.7(@babel/core@7.23.7)
- '@babel/preset-flow': 7.23.3(@babel/core@7.23.7)
- '@babel/preset-react': 7.23.3(@babel/core@7.23.7)
- '@rollup/plugin-alias': 3.1.9(rollup@2.79.1)
- '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.7)(rollup@2.79.1)
- '@rollup/plugin-commonjs': 17.1.0(rollup@2.79.1)
- '@rollup/plugin-json': 4.1.0(rollup@2.79.1)
- '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1)
- '@surma/rollup-plugin-off-main-thread': 2.2.3
- asyncro: 3.0.0
- autoprefixer: 10.4.16(postcss@8.4.31)
- babel-plugin-macros: 3.1.0
- babel-plugin-transform-async-to-promises: 0.8.18
- babel-plugin-transform-replace-expressions: 0.2.0(@babel/core@7.23.7)
- brotli-size: 4.0.0
- builtin-modules: 3.3.0
- camelcase: 6.3.0
- escape-string-regexp: 4.0.0
- filesize: 6.4.0
- gzip-size: 6.0.0
- kleur: 4.1.5
- lodash.merge: 4.6.2
- postcss: 8.4.31
- pretty-bytes: 5.6.0
- rollup: 2.79.1
- rollup-plugin-bundle-size: 1.0.3
- rollup-plugin-postcss: 4.0.2(postcss@8.4.31)
- rollup-plugin-terser: 7.0.2(rollup@2.79.1)
- rollup-plugin-typescript2: 0.32.1(rollup@2.79.1)(typescript@4.9.5)
- rollup-plugin-visualizer: 5.12.0(rollup@2.79.1)
- sade: 1.8.1
- terser: 5.21.0
- tiny-glob: 0.2.9
- tslib: 2.6.2
- typescript: 4.9.5
- transitivePeerDependencies:
- - '@types/babel__core'
- - supports-color
- - ts-node
- dev: true
-
/micromatch@4.0.5:
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
engines: {node: '>=8.6'}
@@ -5165,13 +2783,6 @@ packages:
brace-expansion: 1.1.11
dev: true
- /minimatch@5.1.6:
- resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
- engines: {node: '>=10'}
- dependencies:
- brace-expansion: 2.0.1
- dev: true
-
/minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
dev: true
@@ -5187,11 +2798,6 @@ packages:
minimist: 1.2.8
dev: true
- /mri@1.2.0:
- resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
- engines: {node: '>=4'}
- dev: true
-
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
dev: true
@@ -5218,11 +2824,6 @@ packages:
hasBin: true
dev: true
- /nanoid@4.0.2:
- resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==}
- engines: {node: ^14 || ^16 || >=18}
- hasBin: true
-
/nanoid@5.0.4:
resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==}
engines: {node: ^18 || >=20}
@@ -5270,10 +2871,6 @@ packages:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
dev: true
- /node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
- dev: true
-
/nodejs-file-downloader@4.12.1:
resolution: {integrity: sha512-LpfCTNhh805AlLnJnzt1PuEj+RmbrccbAQZ6hBRw2e6QPVR0Qntuo6qqyvPHG5s77/0w0IEKgRAD4nbSnr/X4w==}
dependencies:
@@ -5291,16 +2888,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /normalize-range@0.1.2:
- resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
- engines: {node: '>=0.10.0'}
- dev: true
-
- /normalize-url@6.1.0:
- resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
- engines: {node: '>=10'}
- dev: true
-
/npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
@@ -5321,11 +2908,6 @@ packages:
boolbase: 1.0.0
dev: true
- /number-is-nan@1.0.1:
- resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==}
- engines: {node: '>=0.10.0'}
- dev: true
-
/object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -5335,25 +2917,6 @@ packages:
resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
dev: true
- /object-inspect@1.13.1:
- resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
- dev: true
-
- /object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
- dev: true
-
- /object.assign@4.1.5:
- resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- has-symbols: 1.0.3
- object-keys: 1.1.1
- dev: true
-
/obuf@1.1.2:
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
dev: true
@@ -5411,11 +2974,6 @@ packages:
type-check: 0.4.0
dev: true
- /p-finally@1.0.0:
- resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
- engines: {node: '>=4'}
- dev: true
-
/p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
@@ -5444,14 +3002,6 @@ packages:
p-limit: 3.1.0
dev: true
- /p-queue@6.6.2:
- resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==}
- engines: {node: '>=8'}
- dependencies:
- eventemitter3: 4.0.7
- p-timeout: 3.2.0
- dev: true
-
/p-retry@4.6.2:
resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
engines: {node: '>=8'}
@@ -5460,13 +3010,6 @@ packages:
retry: 0.13.1
dev: true
- /p-timeout@3.2.0:
- resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==}
- engines: {node: '>=8'}
- dependencies:
- p-finally: 1.0.0
- dev: true
-
/p-try@2.2.0:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
@@ -5562,11 +3105,6 @@ packages:
engines: {node: '>=8.6'}
dev: true
- /pify@5.0.0:
- resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==}
- engines: {node: '>=10'}
- dev: true
-
/pkg-dir@4.2.0:
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
engines: {node: '>=8'}
@@ -5579,93 +3117,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /postcss-calc@8.2.4(postcss@8.4.31):
- resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==}
- peerDependencies:
- postcss: ^8.2.2
- dependencies:
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-colormin@5.3.1(postcss@8.4.31):
- resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- browserslist: 4.22.2
- caniuse-api: 3.0.0
- colord: 2.9.3
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-convert-values@5.1.3(postcss@8.4.31):
- resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- browserslist: 4.22.2
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-discard-comments@5.1.2(postcss@8.4.31):
- resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /postcss-discard-duplicates@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /postcss-discard-empty@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /postcss-discard-overridden@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /postcss-load-config@3.1.4(postcss@8.4.31):
- resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
- engines: {node: '>= 10'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
- dependencies:
- lilconfig: 2.1.0
- postcss: 8.4.31
- yaml: 1.10.2
- dev: true
-
/postcss-loader@7.3.4(postcss@8.4.31)(typescript@5.3.3)(webpack@5.89.0):
resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==}
engines: {node: '>= 14.15.0'}
@@ -5679,255 +3130,48 @@ packages:
semver: 7.5.4
webpack: 5.89.0(webpack-cli@5.1.4)
transitivePeerDependencies:
- - typescript
- dev: true
-
- /postcss-merge-longhand@5.1.7(postcss@8.4.31):
- resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- stylehacks: 5.1.1(postcss@8.4.31)
- dev: true
-
- /postcss-merge-rules@5.1.4(postcss@8.4.31):
- resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- browserslist: 4.22.2
- caniuse-api: 3.0.0
- cssnano-utils: 3.1.0(postcss@8.4.31)
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- dev: true
-
- /postcss-minify-font-values@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-minify-gradients@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- colord: 2.9.3
- cssnano-utils: 3.1.0(postcss@8.4.31)
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-minify-params@5.1.4(postcss@8.4.31):
- resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- browserslist: 4.22.2
- cssnano-utils: 3.1.0(postcss@8.4.31)
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-minify-selectors@5.2.1(postcss@8.4.31):
- resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- dev: true
-
- /postcss-modules-extract-imports@3.0.0(postcss@8.4.31):
- resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==}
- engines: {node: ^10 || ^12 || >= 14}
- peerDependencies:
- postcss: ^8.1.0
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /postcss-modules-local-by-default@4.0.3(postcss@8.4.31):
- resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==}
- engines: {node: ^10 || ^12 || >= 14}
- peerDependencies:
- postcss: ^8.1.0
- dependencies:
- icss-utils: 5.1.0(postcss@8.4.31)
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-modules-scope@3.0.0(postcss@8.4.31):
- resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==}
- engines: {node: ^10 || ^12 || >= 14}
- peerDependencies:
- postcss: ^8.1.0
- dependencies:
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- dev: true
-
- /postcss-modules-values@4.0.0(postcss@8.4.31):
- resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
- engines: {node: ^10 || ^12 || >= 14}
- peerDependencies:
- postcss: ^8.1.0
- dependencies:
- icss-utils: 5.1.0(postcss@8.4.31)
- postcss: 8.4.31
- dev: true
-
- /postcss-modules@4.3.1(postcss@8.4.31):
- resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==}
- peerDependencies:
- postcss: ^8.0.0
- dependencies:
- generic-names: 4.0.0
- icss-replace-symbols: 1.1.0
- lodash.camelcase: 4.3.0
- postcss: 8.4.31
- postcss-modules-extract-imports: 3.0.0(postcss@8.4.31)
- postcss-modules-local-by-default: 4.0.3(postcss@8.4.31)
- postcss-modules-scope: 3.0.0(postcss@8.4.31)
- postcss-modules-values: 4.0.0(postcss@8.4.31)
- string-hash: 1.1.3
- dev: true
-
- /postcss-normalize-charset@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- dev: true
-
- /postcss-normalize-display-values@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-normalize-positions@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-normalize-repeat-style@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-normalize-string@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-normalize-timing-functions@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-normalize-unicode@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- browserslist: 4.22.2
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- dev: true
-
- /postcss-normalize-url@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- normalize-url: 6.1.0
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
+ - typescript
dev: true
- /postcss-normalize-whitespace@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==}
- engines: {node: ^10 || ^12 || >=14.0}
+ /postcss-modules-extract-imports@3.0.0(postcss@8.4.31):
+ resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==}
+ engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.2.15
+ postcss: ^8.1.0
dependencies:
postcss: 8.4.31
- postcss-value-parser: 4.2.0
dev: true
- /postcss-ordered-values@5.1.3(postcss@8.4.31):
- resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==}
- engines: {node: ^10 || ^12 || >=14.0}
+ /postcss-modules-local-by-default@4.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==}
+ engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.2.15
+ postcss: ^8.1.0
dependencies:
- cssnano-utils: 3.1.0(postcss@8.4.31)
+ icss-utils: 5.1.0(postcss@8.4.31)
postcss: 8.4.31
+ postcss-selector-parser: 6.0.13
postcss-value-parser: 4.2.0
dev: true
- /postcss-reduce-initial@5.1.2(postcss@8.4.31):
- resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==}
- engines: {node: ^10 || ^12 || >=14.0}
+ /postcss-modules-scope@3.0.0(postcss@8.4.31):
+ resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==}
+ engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.2.15
+ postcss: ^8.1.0
dependencies:
- browserslist: 4.22.2
- caniuse-api: 3.0.0
postcss: 8.4.31
+ postcss-selector-parser: 6.0.13
dev: true
- /postcss-reduce-transforms@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==}
- engines: {node: ^10 || ^12 || >=14.0}
+ /postcss-modules-values@4.0.0(postcss@8.4.31):
+ resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+ engines: {node: ^10 || ^12 || >= 14}
peerDependencies:
- postcss: ^8.2.15
+ postcss: ^8.1.0
dependencies:
+ icss-utils: 5.1.0(postcss@8.4.31)
postcss: 8.4.31
- postcss-value-parser: 4.2.0
dev: true
/postcss-selector-parser@6.0.13:
@@ -5938,27 +3182,6 @@ packages:
util-deprecate: 1.0.2
dev: true
- /postcss-svgo@5.1.0(postcss@8.4.31):
- resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-value-parser: 4.2.0
- svgo: 2.8.0
- dev: true
-
- /postcss-unique-selectors@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- dev: true
-
/postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
dev: true
@@ -5994,14 +3217,14 @@ packages:
typescript: 5.2.2
dev: true
- /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.8):
+ /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.12):
resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==}
peerDependencies:
prettier: ^3.0.0
svelte: ^3.2.0 || ^4.0.0-next.0
dependencies:
prettier: 3.0.3
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ svelte: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
dev: true
/prettier@3.0.3:
@@ -6010,18 +3233,6 @@ packages:
hasBin: true
dev: true
- /pretty-bytes@3.0.1:
- resolution: {integrity: sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==}
- engines: {node: '>=0.10.0'}
- dependencies:
- number-is-nan: 1.0.1
- dev: true
-
- /pretty-bytes@5.6.0:
- resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
- engines: {node: '>=6'}
- dev: true
-
/pretty-error@4.0.0:
resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
dependencies:
@@ -6046,11 +3257,6 @@ packages:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
- /promise.series@0.2.0:
- resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==}
- engines: {node: '>=0.12'}
- dev: true
-
/proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
@@ -6147,60 +3353,15 @@ packages:
resolve: 1.22.8
dev: true
- /regenerate-unicode-properties@10.1.1:
- resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==}
- engines: {node: '>=4'}
- dependencies:
- regenerate: 1.4.2
- dev: true
-
- /regenerate@1.4.2:
- resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
- dev: true
-
/regenerator-runtime@0.14.0:
resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
dev: true
- /regenerator-transform@0.15.2:
- resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
- dependencies:
- '@babel/runtime': 7.23.2
- dev: true
-
- /regexp.prototype.flags@1.5.1:
- resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- set-function-name: 2.0.1
- dev: true
-
/regexparam@2.0.1:
resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==}
engines: {node: '>=8'}
dev: true
- /regexpu-core@5.3.2:
- resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
- engines: {node: '>=4'}
- dependencies:
- '@babel/regjsgen': 0.8.0
- regenerate: 1.4.2
- regenerate-unicode-properties: 10.1.1
- regjsparser: 0.9.1
- unicode-match-property-ecmascript: 2.0.0
- unicode-match-property-value-ecmascript: 2.1.0
- dev: true
-
- /regjsparser@0.9.1:
- resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
- hasBin: true
- dependencies:
- jsesc: 0.5.0
- dev: true
-
/relateurl@0.2.7:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
@@ -6289,96 +3450,6 @@ packages:
glob: 7.2.3
dev: true
- /rollup-plugin-bundle-size@1.0.3:
- resolution: {integrity: sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ==}
- dependencies:
- chalk: 1.1.3
- maxmin: 2.1.0
- dev: true
-
- /rollup-plugin-postcss@4.0.2(postcss@8.4.31):
- resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==}
- engines: {node: '>=10'}
- peerDependencies:
- postcss: 8.x
- dependencies:
- chalk: 4.1.2
- concat-with-sourcemaps: 1.1.0
- cssnano: 5.1.15(postcss@8.4.31)
- import-cwd: 3.0.0
- p-queue: 6.6.2
- pify: 5.0.0
- postcss: 8.4.31
- postcss-load-config: 3.1.4(postcss@8.4.31)
- postcss-modules: 4.3.1(postcss@8.4.31)
- promise.series: 0.2.0
- resolve: 1.22.8
- rollup-pluginutils: 2.8.2
- safe-identifier: 0.4.2
- style-inject: 0.3.0
- transitivePeerDependencies:
- - ts-node
- dev: true
-
- /rollup-plugin-terser@7.0.2(rollup@2.79.1):
- resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
- deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
- peerDependencies:
- rollup: ^2.0.0
- dependencies:
- '@babel/code-frame': 7.23.5
- jest-worker: 26.6.2
- rollup: 2.79.1
- serialize-javascript: 4.0.0
- terser: 5.21.0
- dev: true
-
- /rollup-plugin-typescript2@0.32.1(rollup@2.79.1)(typescript@4.9.5):
- resolution: {integrity: sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==}
- peerDependencies:
- rollup: '>=1.26.3'
- typescript: '>=2.4.0'
- dependencies:
- '@rollup/pluginutils': 4.2.1
- find-cache-dir: 3.3.2
- fs-extra: 10.1.0
- resolve: 1.22.8
- rollup: 2.79.1
- tslib: 2.6.2
- typescript: 4.9.5
- dev: true
-
- /rollup-plugin-visualizer@5.12.0(rollup@2.79.1):
- resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==}
- engines: {node: '>=14'}
- hasBin: true
- peerDependencies:
- rollup: 2.x || 3.x || 4.x
- peerDependenciesMeta:
- rollup:
- optional: true
- dependencies:
- open: 8.4.2
- picomatch: 2.3.1
- rollup: 2.79.1
- source-map: 0.7.4
- yargs: 17.7.2
- dev: true
-
- /rollup-pluginutils@2.8.2:
- resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
- dependencies:
- estree-walker: 0.6.1
- dev: true
-
- /rollup@2.79.1:
- resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==}
- engines: {node: '>=10.0.0'}
- hasBin: true
- optionalDependencies:
- fsevents: 2.3.3
- dev: true
-
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
@@ -6391,23 +3462,6 @@ packages:
tslib: 2.6.2
dev: true
- /sade@1.8.1:
- resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
- engines: {node: '>=6'}
- dependencies:
- mri: 1.2.0
- dev: true
-
- /safe-array-concat@1.0.1:
- resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
- engines: {node: '>=0.4'}
- dependencies:
- call-bind: 1.0.5
- get-intrinsic: 1.2.2
- has-symbols: 1.0.3
- isarray: 2.0.5
- dev: true
-
/safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
dev: true
@@ -6416,18 +3470,6 @@ packages:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: true
- /safe-identifier@0.4.2:
- resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==}
- dev: true
-
- /safe-regex-test@1.0.0:
- resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
- dependencies:
- call-bind: 1.0.5
- get-intrinsic: 1.2.2
- is-regex: 1.1.4
- dev: true
-
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
@@ -6481,11 +3523,6 @@ packages:
node-forge: 1.3.1
dev: true
- /semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
- dev: true
-
/semver@7.5.4:
resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
engines: {node: '>=10'}
@@ -6515,12 +3552,6 @@ packages:
- supports-color
dev: true
- /serialize-javascript@4.0.0:
- resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
- dependencies:
- randombytes: 2.1.0
- dev: true
-
/serialize-javascript@6.0.1:
resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==}
dependencies:
@@ -6554,25 +3585,6 @@ packages:
- supports-color
dev: true
- /set-function-length@1.1.1:
- resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- define-data-property: 1.1.1
- get-intrinsic: 1.2.2
- gopd: 1.0.1
- has-property-descriptors: 1.0.1
- dev: true
-
- /set-function-name@2.0.1:
- resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
- engines: {node: '>= 0.4'}
- dependencies:
- define-data-property: 1.1.1
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.1
- dev: true
-
/setprototypeof@1.1.0:
resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
dev: true
@@ -6621,11 +3633,6 @@ packages:
engines: {node: '>=14'}
dev: true
- /slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
- dev: true
-
/slash@4.0.0:
resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
engines: {node: '>=12'}
@@ -6679,11 +3686,6 @@ packages:
engines: {node: '>= 8'}
dev: true
- /sourcemap-codec@1.4.8:
- resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
- deprecated: Please use @jridgewell/sourcemap-codec instead
- dev: true
-
/spawn-command@0.0.2:
resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==}
dev: true
@@ -6741,11 +3743,6 @@ packages:
through: 2.3.8
dev: true
- /stable@0.1.8:
- resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
- deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
- dev: true
-
/statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
@@ -6756,10 +3753,6 @@ packages:
engines: {node: '>= 0.8'}
dev: true
- /string-hash@1.1.3:
- resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==}
- dev: true
-
/string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -6769,45 +3762,6 @@ packages:
strip-ansi: 6.0.1
dev: true
- /string.prototype.matchall@4.0.10:
- resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- es-abstract: 1.22.3
- get-intrinsic: 1.2.2
- has-symbols: 1.0.3
- internal-slot: 1.0.6
- regexp.prototype.flags: 1.5.1
- set-function-name: 2.0.1
- side-channel: 1.0.4
- dev: true
-
- /string.prototype.trim@1.2.8:
- resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- es-abstract: 1.22.3
- dev: true
-
- /string.prototype.trimend@1.0.7:
- resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- es-abstract: 1.22.3
- dev: true
-
- /string.prototype.trimstart@1.0.7:
- resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
- dependencies:
- call-bind: 1.0.5
- define-properties: 1.2.1
- es-abstract: 1.22.3
- dev: true
-
/string_decoder@1.0.3:
resolution: {integrity: sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==}
dependencies:
@@ -6862,10 +3816,6 @@ packages:
engines: {node: '>=8'}
dev: true
- /style-inject@0.3.0:
- resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==}
- dev: true
-
/style-loader@3.3.3(webpack@5.89.0):
resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==}
engines: {node: '>= 12.13.0'}
@@ -6875,17 +3825,6 @@ packages:
webpack: 5.89.0(webpack-cli@5.1.4)
dev: true
- /stylehacks@5.1.1(postcss@8.4.31):
- resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==}
- engines: {node: ^10 || ^12 || >=14.0}
- peerDependencies:
- postcss: ^8.2.15
- dependencies:
- browserslist: 4.22.2
- postcss: 8.4.31
- postcss-selector-parser: 6.0.13
- dev: true
-
/supports-color@2.0.0:
resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
engines: {node: '>=0.8.0'}
@@ -6921,27 +3860,27 @@ packages:
resolution: {integrity: sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ==}
dev: true
- /svelte-hmr@0.14.12(svelte@4.2.8):
+ /svelte-hmr@0.14.12(svelte@4.2.12):
resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==}
engines: {node: ^12.20 || ^14.13.1 || >= 16}
peerDependencies:
svelte: '>=3.19.0'
dependencies:
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ svelte: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
dev: true
- /svelte-loader@3.1.9(svelte@4.2.8):
- resolution: {integrity: sha512-RITPqze3TppOhaZF8SEFTDTwFHov17k3UkOjpxyL/No/YVrvckKmXWOEj7QEpsZZZSNQPb28tMZbHEI2xLhJMQ==}
+ /svelte-loader@3.2.0(svelte@4.2.12):
+ resolution: {integrity: sha512-pxsNMC/1JHdQ63M0Zw5cS8dN299nvMiU2ze8yWPLlov/xBNXElEEM22so2q/vJDUyP0ZCrCVMV1d/tlWwxMRLA==}
peerDependencies:
- svelte: ^3.0.0 || ^4.0.0-next.0
+ svelte: ^3.0.0 || ^4.0.0-next.0 || ^5.0.0-next.1
dependencies:
loader-utils: 2.0.4
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ svelte: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
svelte-dev-helper: 1.1.9
- svelte-hmr: 0.14.12(svelte@4.2.8)
+ svelte-hmr: 0.14.12(svelte@4.2.12)
dev: true
- /svelte-preprocess@5.1.3(postcss@8.4.31)(svelte@4.2.8)(typescript@5.3.3):
+ /svelte-preprocess@5.1.3(postcss@8.4.31)(svelte@4.2.12)(typescript@5.3.3):
resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==}
engines: {node: '>= 16.0.0', pnpm: ^8.0.0}
requiresBuild: true
@@ -6985,28 +3924,37 @@ packages:
postcss: 8.4.31
sorcery: 0.11.0
strip-indent: 3.0.0
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ svelte: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
typescript: 5.3.3
dev: true
+ /svelte-remixicon@2.4.0(svelte@4.2.12):
+ resolution: {integrity: sha512-EdceJ3n/89B0NNi1gDsIuMwI17sj12cxINMDHVyqO8+azeOe+UNhigU6wEmQTALPFWxgh3x42851etHrpWv/dA==}
+ peerDependencies:
+ svelte: ^3.54.0 || ^4.0.0
+ dependencies:
+ svelte: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ dev: false
+
/svelte-sequential-preprocessor@2.0.1:
resolution: {integrity: sha512-N5JqlBni6BzElxmuFrOPxOJnjsxh1cFDACLEVKs8OHBcx8ZNRO1p5SxuQex1m3qbLzAC8G99EHeWcxGkjyKjLQ==}
engines: {node: '>=16'}
dependencies:
- svelte: 4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4)
+ svelte: 4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4)
tslib: 2.6.2
dev: true
- /svelte@4.2.8(patch_hash=cm43hmf4gczhssi3isoosy53r4):
- resolution: {integrity: sha512-hU6dh1MPl8gh6klQZwK/n73GiAHiR95IkFsesLPbMeEZi36ydaXL/ZAb4g9sayT0MXzpxyZjR28yderJHxcmYA==}
+ /svelte@4.2.12(patch_hash=cm43hmf4gczhssi3isoosy53r4):
+ resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==}
engines: {node: '>=16'}
dependencies:
'@ampproject/remapping': 2.2.1
'@jridgewell/sourcemap-codec': 1.4.15
'@jridgewell/trace-mapping': 0.3.19
+ '@types/estree': 1.0.2
acorn: 8.10.0
aria-query: 5.3.0
- axobject-query: 3.2.1
+ axobject-query: 4.0.0
code-red: 1.0.4
css-tree: 2.3.1
estree-walker: 3.0.3
@@ -7016,23 +3964,6 @@ packages:
periscopic: 3.1.0
patched: true
- /svgo@2.8.0:
- resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
- engines: {node: '>=10.13.0'}
- hasBin: true
- dependencies:
- '@trysound/sax': 0.2.0
- commander: 7.2.0
- css-select: 4.3.0
- css-tree: 1.1.3
- csso: 4.2.0
- picocolors: 1.0.0
- stable: 0.1.8
- dev: true
-
- /tabbable@6.2.0:
- resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
-
/tap-out@2.1.0:
resolution: {integrity: sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==}
hasBin: true
@@ -7116,13 +4047,6 @@ packages:
resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==}
dev: true
- /tiny-glob@0.2.9:
- resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
- dependencies:
- globalyzer: 0.1.0
- globrex: 0.1.2
- dev: true
-
/to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
@@ -7156,15 +4080,6 @@ packages:
utf8-byte-length: 1.0.4
dev: true
- /ts-api-utils@1.0.3(typescript@5.2.2):
- resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==}
- engines: {node: '>=16.13.0'}
- peerDependencies:
- typescript: '>=4.2.0'
- dependencies:
- typescript: 5.2.2
- dev: true
-
/ts-loader@9.5.1(typescript@5.3.3)(webpack@5.89.0):
resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==}
engines: {node: '>=12.0.0'}
@@ -7183,6 +4098,7 @@ packages:
/tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ dev: true
/turbo-darwin-64@1.11.2:
resolution: {integrity: sha512-toFmRG/adriZY3hOps7nYCfqHAS+Ci6xqgX3fbo82kkLpC6OBzcXnleSwuPqjHVAaRNhVoB83L5njcE9Qwi2og==}
@@ -7264,50 +4180,6 @@ packages:
mime-types: 2.1.35
dev: true
- /typed-array-buffer@1.0.0:
- resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- get-intrinsic: 1.2.2
- is-typed-array: 1.1.12
- dev: true
-
- /typed-array-byte-length@1.0.0:
- resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.5
- for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
- dev: true
-
- /typed-array-byte-offset@1.0.0:
- resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
- engines: {node: '>= 0.4'}
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.5
- for-each: 0.3.3
- has-proto: 1.0.1
- is-typed-array: 1.1.12
- dev: true
-
- /typed-array-length@1.0.4:
- resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
- dependencies:
- call-bind: 1.0.5
- for-each: 0.3.3
- is-typed-array: 1.1.12
- dev: true
-
- /typescript@4.9.5:
- resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
- engines: {node: '>=4.2.0'}
- hasBin: true
- dev: true
-
/typescript@5.2.2:
resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
engines: {node: '>=14.17'}
@@ -7319,47 +4191,10 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
- /unbox-primitive@1.0.2:
- resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
- dependencies:
- call-bind: 1.0.5
- has-bigints: 1.0.2
- has-symbols: 1.0.3
- which-boxed-primitive: 1.0.2
- dev: true
-
/undici-types@5.25.3:
resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==}
dev: true
- /unicode-canonical-property-names-ecmascript@2.0.0:
- resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
- engines: {node: '>=4'}
- dev: true
-
- /unicode-match-property-ecmascript@2.0.0:
- resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
- engines: {node: '>=4'}
- dependencies:
- unicode-canonical-property-names-ecmascript: 2.0.0
- unicode-property-aliases-ecmascript: 2.1.0
- dev: true
-
- /unicode-match-property-value-ecmascript@2.1.0:
- resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
- engines: {node: '>=4'}
- dev: true
-
- /unicode-property-aliases-ecmascript@2.1.0:
- resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
- engines: {node: '>=4'}
- dev: true
-
- /universalify@2.0.1:
- resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
- engines: {node: '>= 10.0.0'}
- dev: true
-
/unpipe@1.0.0:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
@@ -7376,17 +4211,6 @@ packages:
picocolors: 1.0.0
dev: true
- /update-browserslist-db@1.0.13(browserslist@4.22.2):
- resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
- dependencies:
- browserslist: 4.22.2
- escalade: 3.1.1
- picocolors: 1.0.0
- dev: true
-
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
@@ -7619,27 +4443,6 @@ packages:
engines: {node: '>=0.8.0'}
dev: true
- /which-boxed-primitive@1.0.2:
- resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
- dependencies:
- is-bigint: 1.0.4
- is-boolean-object: 1.1.2
- is-number-object: 1.0.7
- is-string: 1.0.7
- is-symbol: 1.0.4
- dev: true
-
- /which-typed-array@1.1.13:
- resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==}
- engines: {node: '>= 0.4'}
- dependencies:
- available-typed-arrays: 1.0.5
- call-bind: 1.0.5
- for-each: 0.3.3
- gopd: 1.0.1
- has-tostringtag: 1.0.0
- dev: true
-
/which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@@ -7688,19 +4491,10 @@ packages:
engines: {node: '>=10'}
dev: true
- /yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
- dev: true
-
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
- /yaml@1.10.2:
- resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
- engines: {node: '>= 6'}
- dev: true
-
/yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
@@ -7727,11 +4521,11 @@ packages:
/zora@5.2.0:
resolution: {integrity: sha512-FSZOvfJVfMWhk/poictNsDBCXq/Z+2Zu2peWs6d8OhWWb9nY++czw95D47hdw06L/kfjasLevwrbUtnXyWLAJw==}
- github.com/quark-platform/gecko-types/015f4eddb9a02d5f60ef82bf04e7b78bbb15ffd6:
- resolution: {tarball: https://codeload.github.com/quark-platform/gecko-types/tar.gz/015f4eddb9a02d5f60ef82bf04e7b78bbb15ffd6}
+ github.com/quark-platform/gecko-types/4e238b774e4415cbf0ad14b79060f39dd059bd29:
+ resolution: {tarball: https://codeload.github.com/quark-platform/gecko-types/tar.gz/4e238b774e4415cbf0ad14b79060f39dd059bd29}
name: gecko-types
version: 1.0.0
- dev: false
+ dev: true
github.com/quark-platform/gecko-types/e4efe38ce26c3617d7a3ecb13491bca2004e0377:
resolution: {tarball: https://codeload.github.com/quark-platform/gecko-types/tar.gz/e4efe38ce26c3617d7a3ecb13491bca2004e0377}