@vantagecompute/docusaurus-theme 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts ADDED
@@ -0,0 +1,35 @@
1
+ import path from 'path';
2
+ import type { Plugin } from '@docusaurus/types';
3
+
4
+ export default function themeVantage(): Plugin {
5
+ return {
6
+ name: '@vantagecompute/docusaurus-theme',
7
+
8
+ getThemePath() {
9
+ return path.resolve(__dirname, '../src/theme');
10
+ },
11
+
12
+ getPathsToWatch() {
13
+ return [path.resolve(__dirname, '../src/theme/**/*.{js,jsx,ts,tsx,css}')];
14
+ },
15
+
16
+ getClientModules() {
17
+ return [path.resolve(__dirname, '../src/css/custom.css')];
18
+ },
19
+ };
20
+ }
21
+
22
+ /**
23
+ * Returns the absolute path to this package's static directory.
24
+ * Add this to your `staticDirectories` in docusaurus.config.js:
25
+ *
26
+ * ```js
27
+ * const { staticDir } = require('@vantagecompute/docusaurus-theme');
28
+ * module.exports = {
29
+ * staticDirectories: ['static', staticDir],
30
+ * };
31
+ * ```
32
+ */
33
+ export const staticDir = path.resolve(__dirname, '../static');
34
+
35
+ export { default as rehypeTabsTransform } from './utils/rehypeTabsTransform';
@@ -0,0 +1,60 @@
1
+ import React from 'react'
2
+ import clsx from 'clsx'
3
+ import useIsBrowser from '@docusaurus/useIsBrowser'
4
+ import { translate } from '@docusaurus/Translate'
5
+
6
+ import styles from './styles.module.css'
7
+
8
+ import IconLightMode from '../../../static/img/icons/bx-sun.svg'
9
+ import IconDarkMode from '../../../static/img/icons/bx-moon.svg'
10
+
11
+ function ColorModeToggle({ className, buttonClassName, value, onChange }) {
12
+ const isBrowser = useIsBrowser()
13
+ const title = translate(
14
+ {
15
+ message: 'Switch between dark and light mode (currently {mode})',
16
+ id: 'theme.colorToggle.ariaLabel',
17
+ description: 'The ARIA label for the navbar color mode toggle',
18
+ },
19
+ {
20
+ mode:
21
+ value === 'dark'
22
+ ? translate({
23
+ message: 'dark mode',
24
+ id: 'theme.colorToggle.ariaLabel.mode.dark',
25
+ description: 'The name for the dark color mode',
26
+ })
27
+ : translate({
28
+ message: 'light mode',
29
+ id: 'theme.colorToggle.ariaLabel.mode.light',
30
+ description: 'The name for the light color mode',
31
+ }),
32
+ }
33
+ )
34
+ return (
35
+ <div className={clsx(styles.toggle, className)}>
36
+ <button
37
+ className={clsx(
38
+ 'clean-btn',
39
+ styles.toggleButton,
40
+ !isBrowser && styles.toggleButtonDisabled,
41
+ buttonClassName
42
+ )}
43
+ type='button'
44
+ onClick={() => onChange(value === 'dark' ? 'light' : 'dark')}
45
+ disabled={!isBrowser}
46
+ title={title}
47
+ aria-label={title}
48
+ aria-live='polite'
49
+ >
50
+ <IconLightMode
51
+ className={clsx(styles.toggleIcon, styles.lightToggleIcon)}
52
+ />
53
+ <IconDarkMode
54
+ className={clsx(styles.toggleIcon, styles.darkToggleIcon)}
55
+ />
56
+ </button>
57
+ </div>
58
+ )
59
+ }
60
+ export default React.memo(ColorModeToggle)
@@ -0,0 +1,40 @@
1
+ .toggle {
2
+ width: 36px;
3
+ height: 36px;
4
+ }
5
+
6
+ .toggleButton {
7
+ -webkit-tap-highlight-color: transparent;
8
+ align-items: center;
9
+ display: flex;
10
+ justify-content: center;
11
+ width: 100%;
12
+ height: 100%;
13
+ border: none;
14
+ border-radius: 0;
15
+ background: transparent;
16
+ color: rgba(255, 255, 255, 0.85);
17
+ transition: color 0.15s;
18
+ }
19
+
20
+ .toggleButton:hover {
21
+ color: rgba(255, 255, 255, 1) !important;
22
+ }
23
+
24
+ [data-theme='dark'] .toggleButton {
25
+ background: transparent;
26
+ color: rgba(255, 255, 255, 0.85);
27
+ }
28
+
29
+ [data-theme='dark'] .toggleButton:hover {
30
+ color: rgba(255, 255, 255, 1) !important;
31
+ }
32
+
33
+ [data-theme='light'] .lightToggleIcon,
34
+ [data-theme='dark'] .darkToggleIcon {
35
+ display: none;
36
+ }
37
+
38
+ .toggleButtonDisabled {
39
+ cursor: not-allowed;
40
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Custom DocBreadcrumbs component that ensures full path representation
3
+ * e.g., Home -> Platform -> <platform page>
4
+ */
5
+ import React from 'react';
6
+ import clsx from 'clsx';
7
+ import {ThemeClassNames} from '@docusaurus/theme-common';
8
+ import {useSidebarBreadcrumbs} from '@docusaurus/plugin-content-docs/client';
9
+ import {useHomePageRoute} from '@docusaurus/theme-common/internal';
10
+ import Link from '@docusaurus/Link';
11
+ import {translate} from '@docusaurus/Translate';
12
+ import HomeBreadcrumbItem from '@theme/DocBreadcrumbs/Items/Home';
13
+ import DocBreadcrumbsStructuredData from '@theme/DocBreadcrumbs/StructuredData';
14
+ import styles from './styles.module.css';
15
+
16
+ function BreadcrumbsItemLink({children, href, isLast}: {children: React.ReactNode, href?: string, isLast: boolean}) {
17
+ const className = 'breadcrumbs__link';
18
+ if (isLast) {
19
+ return <span className={className}>{children}</span>;
20
+ }
21
+ return href ? (
22
+ <Link className={className} href={href}>
23
+ <span>{children}</span>
24
+ </Link>
25
+ ) : (
26
+ <span className={className}>{children}</span>
27
+ );
28
+ }
29
+
30
+ function BreadcrumbsItem({children, active}: {children: React.ReactNode, active: boolean}) {
31
+ return (
32
+ <li
33
+ className={clsx('breadcrumbs__item', {
34
+ 'breadcrumbs__item--active': active,
35
+ })}>
36
+ {children}
37
+ </li>
38
+ );
39
+ }
40
+
41
+ export default function DocBreadcrumbs() {
42
+ const breadcrumbs = useSidebarBreadcrumbs();
43
+ const homePageRoute = useHomePageRoute();
44
+
45
+ if (!breadcrumbs) {
46
+ return null;
47
+ }
48
+
49
+ return (
50
+ <>
51
+ <DocBreadcrumbsStructuredData breadcrumbs={breadcrumbs} />
52
+ <nav
53
+ className={clsx(
54
+ ThemeClassNames.docs.docBreadcrumbs,
55
+ styles.breadcrumbsContainer,
56
+ )}
57
+ aria-label={translate({
58
+ id: 'theme.docs.breadcrumbs.navAriaLabel',
59
+ message: 'Breadcrumbs',
60
+ description: 'The ARIA label for the breadcrumbs',
61
+ })}>
62
+ <ul className="breadcrumbs">
63
+ {homePageRoute && <HomeBreadcrumbItem />}
64
+ {breadcrumbs.map((item, idx) => {
65
+ const isLast = idx === breadcrumbs.length - 1;
66
+ const href =
67
+ item.type === 'category' && item.linkUnlisted
68
+ ? undefined
69
+ : item.href;
70
+ return (
71
+ <BreadcrumbsItem key={idx} active={isLast}>
72
+ <BreadcrumbsItemLink href={href} isLast={isLast}>
73
+ {item.label}
74
+ </BreadcrumbsItemLink>
75
+ </BreadcrumbsItem>
76
+ );
77
+ })}
78
+ </ul>
79
+ </nav>
80
+ </>
81
+ );
82
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ .breadcrumbsContainer {
9
+ --ifm-breadcrumb-size-multiplier: 0.8;
10
+ margin-bottom: 0.8rem;
11
+ }
@@ -0,0 +1,14 @@
1
+ import Tabs from '@theme/Tabs';
2
+ import TabItem from '@theme/TabItem';
3
+ import MDXComponents from '@theme-original/MDXComponents';
4
+
5
+ // Global MDX components available to all MDX files
6
+ const CustomMDXComponents = {
7
+ // Import all the default components (including headings with anchor links)
8
+ ...MDXComponents,
9
+ // Add our custom components
10
+ Tabs,
11
+ TabItem,
12
+ };
13
+
14
+ export default CustomMDXComponents;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal';
3
+
4
+ export default function NavbarMobileSidebarSecondaryMenu() {
5
+ const secondaryMenu = useNavbarSecondaryMenu();
6
+ return <>{secondaryMenu.content}</>;
7
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Swizzled <Tabs> component.
3
+ *
4
+ * Why: Docusaurus 3.10.0's `useTabValues` calls `extractChildrenTabValues`
5
+ * on raw children, which crashes at `child.type.name` when whitespace text
6
+ * nodes (`\n`) sit between `<Tabs>` and `<TabItem>`. The upstream Tabs
7
+ * component sanitizes children only when rendering, not when extracting
8
+ * values - see node_modules/@docusaurus/theme-common/lib/utils/tabsUtils.js.
9
+ *
10
+ * Fix: sanitize children up front, then pass the cleaned list to BOTH
11
+ * `useTabsContextValue` (for value extraction) and the rendered
12
+ * `TabsContainer`.
13
+ */
14
+ import React from 'react';
15
+ import clsx from 'clsx';
16
+ import {ThemeClassNames} from '@docusaurus/theme-common';
17
+ import {
18
+ useScrollPositionBlocker,
19
+ useTabsContextValue,
20
+ useTabs,
21
+ sanitizeTabsChildren,
22
+ TabsProvider,
23
+ } from '@docusaurus/theme-common/internal';
24
+ import useIsBrowser from '@docusaurus/useIsBrowser';
25
+ import styles from './styles.module.css';
26
+
27
+ function TabList({className}) {
28
+ const {selectedValue, selectValue, tabValues, block} = useTabs();
29
+ const tabRefs = [];
30
+ const {blockElementScrollPositionUntilNextRender} =
31
+ useScrollPositionBlocker();
32
+ const handleTabChange = (event) => {
33
+ const newTab = event.currentTarget;
34
+ const newTabIndex = tabRefs.indexOf(newTab);
35
+ const newTabValue = tabValues[newTabIndex].value;
36
+ if (newTabValue !== selectedValue) {
37
+ blockElementScrollPositionUntilNextRender(newTab);
38
+ selectValue(newTabValue);
39
+ }
40
+ };
41
+ const handleKeydown = (event) => {
42
+ let focusElement = null;
43
+ switch (event.key) {
44
+ case 'Enter': {
45
+ handleTabChange(event);
46
+ break;
47
+ }
48
+ case 'ArrowRight': {
49
+ const nextTab = tabRefs.indexOf(event.currentTarget) + 1;
50
+ focusElement = tabRefs[nextTab] ?? tabRefs[0];
51
+ break;
52
+ }
53
+ case 'ArrowLeft': {
54
+ const prevTab = tabRefs.indexOf(event.currentTarget) - 1;
55
+ focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1];
56
+ break;
57
+ }
58
+ default:
59
+ break;
60
+ }
61
+ focusElement?.focus();
62
+ };
63
+ return (
64
+ <ul
65
+ role="tablist"
66
+ aria-orientation="horizontal"
67
+ className={clsx(
68
+ 'tabs',
69
+ {
70
+ 'tabs--block': block,
71
+ },
72
+ className,
73
+ )}>
74
+ {tabValues.map(({value, label, attributes}) => (
75
+ <li
76
+ role="tab"
77
+ tabIndex={selectedValue === value ? 0 : -1}
78
+ aria-selected={selectedValue === value}
79
+ key={value}
80
+ ref={(ref) => {
81
+ tabRefs.push(ref);
82
+ }}
83
+ onKeyDown={handleKeydown}
84
+ onClick={handleTabChange}
85
+ {...attributes}
86
+ className={clsx('tabs__item', styles.tabItem, attributes?.className, {
87
+ 'tabs__item--active': selectedValue === value,
88
+ })}>
89
+ {label ?? value}
90
+ </li>
91
+ ))}
92
+ </ul>
93
+ );
94
+ }
95
+
96
+ function TabContent({children}) {
97
+ return <div className="margin-top--md">{children}</div>;
98
+ }
99
+
100
+ function TabsContainer({className, children}) {
101
+ return (
102
+ <div
103
+ className={clsx(
104
+ ThemeClassNames.tabs.container,
105
+ 'tabs-container',
106
+ styles.tabList,
107
+ )}>
108
+ <TabList className={className} />
109
+ <TabContent>{children}</TabContent>
110
+ </div>
111
+ );
112
+ }
113
+
114
+ export default function Tabs(props) {
115
+ const isBrowser = useIsBrowser();
116
+ const sanitizedChildren = sanitizeTabsChildren(props.children);
117
+ const value = useTabsContextValue({...props, children: sanitizedChildren});
118
+ return (
119
+ <TabsProvider
120
+ value={value}
121
+ // Remount tabs after hydration - see facebook/docusaurus#5653
122
+ key={String(isBrowser)}>
123
+ <TabsContainer className={props.className}>
124
+ {sanitizedChildren}
125
+ </TabsContainer>
126
+ </TabsProvider>
127
+ );
128
+ }
@@ -0,0 +1,7 @@
1
+ .tabList {
2
+ margin-bottom: var(--ifm-leading);
3
+ }
4
+
5
+ .tabItem {
6
+ margin-top: 0 !important;
7
+ }
@@ -0,0 +1,16 @@
1
+ // Custom rehype plugin to transform lowercase tabs to React components
2
+ const { visit } = require('unist-util-visit');
3
+
4
+ function rehypeTabsTransform() {
5
+ return (tree) => {
6
+ visit(tree, 'element', (node) => {
7
+ if (node.tagName === 'tabs') {
8
+ node.tagName = 'Tabs';
9
+ } else if (node.tagName === 'tabitem') {
10
+ node.tagName = 'TabItem';
11
+ }
12
+ });
13
+ };
14
+ }
15
+
16
+ module.exports = rehypeTabsTransform;
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,4 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M8.66665 2L10.862 4.19533L6.19531 8.862L7.13798 9.80467L11.8046 5.138L14 7.33333V2H8.66665Z" fill="#7868DD"/>
3
+ <path d="M12.6667 12.6667H3.33333V3.33333H8L6.66667 2H3.33333C2.598 2 2 2.598 2 3.33333V12.6667C2 13.402 2.598 14 3.33333 14H12.6667C13.402 14 14 13.402 14 12.6667V9.33333L12.6667 8V12.6667Z" fill="#7868DD"/>
4
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M17.285 10.8708C16.7208 11.0208 16.1383 11.0967 15.5542 11.0967C13.775 11.0967 12.1042 10.405 10.8492 9.15C9.17583 7.47667 8.51666 5.01083 9.12916 2.71417C9.20583 2.42667 9.12333 2.12 8.91333 1.91C8.70333 1.7 8.39749 1.615 8.10833 1.695C6.68999 2.07417 5.39666 2.81833 4.36749 3.84667C1.11916 7.095 1.11916 12.3825 4.36749 15.6325C5.94166 17.2067 8.03499 18.0742 10.2608 18.0742C12.4867 18.0742 14.5792 17.2075 16.1525 15.6333C17.1825 14.6025 17.9275 13.3075 18.305 11.8908C18.3817 11.6033 18.2983 11.2967 18.0883 11.0867C17.8783 10.8758 17.5708 10.7925 17.285 10.8708ZM14.975 14.455C13.7158 15.7142 12.0417 16.4075 10.2617 16.4075C8.48083 16.4075 6.80666 15.7133 5.54666 14.4542C2.94833 11.855 2.94833 7.625 5.54666 5.02583C6.04833 4.52417 6.62833 4.1075 7.26333 3.79C7.07833 6.19417 7.94166 8.6 9.67166 10.33C11.395 12.0542 13.7775 12.93 16.2117 12.7392C15.8933 13.3717 15.4758 13.9525 14.975 14.455Z" fill="currentColor"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M6.66671 12C7.89737 12 9.02871 11.5767 9.93137 10.8747L12.862 13.8053L13.8047 12.8627L10.874 9.932C11.5767 9.02866 12 7.89733 12 6.66666C12 3.726 9.60737 1.33333 6.66671 1.33333C3.72604 1.33333 1.33337 3.726 1.33337 6.66666C1.33337 9.60733 3.72604 12 6.66671 12ZM6.66671 2.66666C8.87271 2.66666 10.6667 4.46066 10.6667 6.66666C10.6667 8.87266 8.87271 10.6667 6.66671 10.6667C4.46071 10.6667 2.66671 8.87266 2.66671 6.66666C2.66671 4.46066 4.46071 2.66666 6.66671 2.66666Z" fill="#CBD5E0"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M6.66667 12C7.89734 12 9.02867 11.5767 9.93134 10.8747L12.862 13.8053L13.8047 12.8627L10.874 9.932C11.5767 9.02866 12 7.89733 12 6.66666C12 3.726 9.60734 1.33333 6.66667 1.33333C3.726 1.33333 1.33334 3.726 1.33334 6.66666C1.33334 9.60733 3.726 12 6.66667 12ZM6.66667 2.66666C8.87267 2.66666 10.6667 4.46066 10.6667 6.66666C10.6667 8.87266 8.87267 10.6667 6.66667 10.6667C4.46067 10.6667 2.66667 8.87266 2.66667 6.66666C2.66667 4.46066 4.46067 2.66666 6.66667 2.66666Z" fill="#718096"/>
3
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M5.82754 10C5.82754 12.3008 7.69921 14.1725 10 14.1725C12.3009 14.1725 14.1725 12.3008 14.1725 10C14.1725 7.69917 12.3009 5.82751 10 5.82751C7.69921 5.82751 5.82754 7.69917 5.82754 10ZM10 7.49417C11.3817 7.49417 12.5059 8.61834 12.5059 10C12.5059 11.3817 11.3817 12.5058 10 12.5058C8.61837 12.5058 7.49421 11.3817 7.49421 10C7.49421 8.61834 8.61837 7.49417 10 7.49417ZM9.16504 15.8333H10.8317V18.3333H9.16504V15.8333ZM9.16504 1.66667H10.8317V4.16667H9.16504V1.66667ZM1.66504 9.16667H4.16504V10.8333H1.66504V9.16667ZM15.8317 9.16667H18.3317V10.8333H15.8317V9.16667Z" fill="currentColor"/>
3
+ <path d="M3.51587 15.3028L5.28311 13.5345L6.46197 14.7127L4.69473 16.481L3.51587 15.3028Z" fill="currentColor"/>
4
+ <path d="M13.5336 5.28632L15.3019 3.51793L16.4804 4.69642L14.7121 6.46481L13.5336 5.28632Z" fill="currentColor"/>
5
+ <path d="M5.28479 6.46548L3.51755 4.69719L4.69641 3.51903L6.46365 5.28732L5.28479 6.46548Z" fill="currentColor"/>
6
+ <path d="M16.4799 15.3029L15.3014 16.4815L13.533 14.7131L14.7115 13.5346L16.4799 15.3029Z" fill="currentColor"/>
7
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M10.0216 1.66667C5.43079 1.66667 1.70996 5.38751 1.70996 9.97834C1.70996 13.65 4.09079 16.7658 7.39413 17.8658C7.80996 17.9408 7.95996 17.685 7.95996 17.465C7.95996 17.2675 7.95329 16.7442 7.95079 16.0517C5.63829 16.5533 5.14996 14.9367 5.14996 14.9367C4.77329 13.9767 4.22746 13.7208 4.22746 13.7208C3.47329 13.205 4.28496 13.2167 4.28496 13.2167C5.11996 13.275 5.55746 14.0733 5.55746 14.0733C6.29913 15.3433 7.50413 14.9767 7.97579 14.7642C8.05163 14.2267 8.26829 13.86 8.50496 13.6525C6.65996 13.4433 4.71996 12.73 4.71996 9.54417C4.71996 8.63834 5.04413 7.895 5.57329 7.315C5.48913 7.10417 5.20163 6.25834 5.65579 5.11501C5.65579 5.11501 6.35329 4.89084 7.94079 5.96584C8.60579 5.78167 9.31496 5.68917 10.0208 5.68584C10.7283 5.68917 11.4383 5.78167 12.1008 5.96584C13.6891 4.89 14.3858 5.11501 14.3858 5.11501C14.84 6.25834 14.555 7.10417 14.4683 7.315C15.0016 7.895 15.3216 8.63751 15.3216 9.54417C15.3216 12.7383 13.38 13.44 11.5283 13.6458C11.8241 13.9025 12.0908 14.4092 12.0908 15.1842C12.0908 16.2958 12.0808 17.1925 12.0808 17.465C12.0808 17.6875 12.2291 17.9458 12.6533 17.8642C15.955 16.7625 18.3333 13.6492 18.3333 9.97834C18.3333 5.38751 14.6125 1.66667 10.0216 1.66667Z" fill="#CBD5E0"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M12 6.87903L4.939 13.939L7.061 16.061L12 11.121L16.939 16.061L19.061 13.939L12 6.87903Z" fill="#484848"/>
3
+ </svg>
@@ -0,0 +1,77 @@
1
+ <svg
2
+ width='137'
3
+ height='32'
4
+ viewBox='0 0 137 32'
5
+ fill='none'
6
+ xmlns='http://www.w3.org/2000/svg'
7
+ >
8
+ <path
9
+ d='M45.06 4.47018H37.0052C35.6968 4.47037 34.4158 4.84478 33.3132 5.54922C32.2106 6.25367 31.3326 7.25877 30.7826 8.44594L21.9177 28.136C21.7758 28.4439 21.7137 28.7825 21.737 29.1207C21.7602 29.4589 21.8682 29.7858 22.051 30.0713C22.2338 30.3568 22.4854 30.5918 22.7828 30.7546C23.0801 30.9173 23.4137 31.0027 23.7527 31.0028H30.5511C31.3551 31.0018 32.1419 30.77 32.818 30.3351C33.4942 29.9002 34.0314 29.2804 34.3657 28.5493L35.0173 27.1331L45.06 4.47018Z'
10
+ fill='url(#paint0_linear_181_1139)'
11
+ />
12
+ <path
13
+ d='M7.95977 0.997253H0L15.2335 28.5865C15.6387 29.3165 16.2317 29.925 16.9511 30.3488C17.6704 30.7727 18.49 30.9966 19.325 30.9973H30.5937C29.015 30.8388 27.4363 27.8384 27.4363 27.8384L14.8877 5.08873C14.2044 3.84947 13.2012 2.81617 11.9827 2.09654C10.7642 1.37691 9.37493 0.997295 7.95977 0.997253V0.997253Z'
14
+ fill='url(#paint1_linear_181_1139)'
15
+ />
16
+ <path
17
+ d='M49.4312 8.1167H52.8256L57.5838 20.1459L62.3916 8.1167H65.764L58.9972 24.2057H55.9555L49.4312 8.1167Z'
18
+ fill='white'
19
+ />
20
+ <path
21
+ d='M76.2764 24.2057H73.5212V23.2138C72.497 24.0747 71.2002 24.5434 69.8623 24.5363C66.6221 24.5363 64.0212 21.8913 64.0212 18.5864C64.0212 15.2816 66.6221 12.6352 69.8623 12.6352C71.2002 12.6281 72.497 13.0968 73.5212 13.9577V12.9658H76.2764V24.2057ZM70.237 21.8472C71.9783 21.8472 73.3669 20.4366 73.3669 18.5864C73.3669 16.7363 71.9783 15.3243 70.237 15.3243C68.4736 15.3243 67.085 16.7349 67.085 18.5864C67.085 20.4379 68.4736 21.8472 70.237 21.8472Z'
22
+ fill='white'
23
+ />
24
+ <path
25
+ d='M77.752 12.9658H80.4631V13.7593C81.1519 13.0099 82.2264 12.5911 83.5048 12.5911C86.1222 12.5911 87.9572 14.4426 87.9572 17.1097V24.2057H85.0477V17.5932C85.0477 16.2707 84.1661 15.2788 82.9097 15.2788C82.6154 15.2757 82.3235 15.331 82.0508 15.4415C81.778 15.552 81.5299 15.7156 81.3208 15.9226C81.1117 16.1297 80.9458 16.3761 80.8326 16.6478C80.7194 16.9194 80.6612 17.2108 80.6614 17.505V24.2043H77.752V12.9658Z'
26
+ fill='white'
27
+ />
28
+ <path
29
+ d='M96.9915 23.831C96.7034 24.0492 96.376 24.2101 96.0272 24.3049C95.604 24.4205 95.1667 24.4762 94.7281 24.4702C93.4497 24.4702 92.4468 24.1249 91.7194 23.4342C90.992 22.7436 90.6283 21.7889 90.6283 20.5702V15.462H89.3279V12.9217H90.6283V8.75726H93.6701V12.9217H95.3452L96.1566 15.462H93.6646L93.6425 20.4655C93.6425 21.3912 94.1568 21.8536 95.1854 21.8527C95.3712 21.8553 95.5566 21.8331 95.7365 21.7866C95.9176 21.734 96.0888 21.6521 96.2434 21.5441L96.9915 23.831Z'
30
+ fill='white'
31
+ />
32
+ <path
33
+ d='M109.886 24.2057H107.131V23.2138C106.106 24.0747 104.81 24.5434 103.472 24.5363C100.232 24.5363 97.6306 21.8913 97.6306 18.5864C97.6306 15.2816 100.232 12.6352 103.472 12.6352C104.81 12.6281 106.106 13.0968 107.131 13.9577V12.9658H109.886V24.2057ZM103.846 21.8472C105.588 21.8472 106.976 20.4366 106.976 18.5864C106.976 16.7363 105.588 15.3243 103.846 15.3243C102.083 15.3243 100.694 16.7349 100.694 18.5864C100.694 20.4379 102.08 21.8472 103.846 21.8472Z'
34
+ fill='white'
35
+ />
36
+ <path
37
+ d='M123.218 23.5899C123.218 27.2488 120.751 29.4971 116.761 29.4971C114.695 29.4971 112.766 28.8799 111.389 27.7999L112.755 25.2651C114.012 26.3451 115.312 26.808 116.789 26.808C119.147 26.808 120.469 25.5516 120.469 23.3475V23.1932C119.44 24.045 118.147 24.5126 116.811 24.5157C113.571 24.5157 110.97 21.8707 110.97 18.5658C110.97 15.2816 113.571 12.6421 116.811 12.6421C118.144 12.6374 119.438 13.0972 120.469 13.9426V12.9783H123.224L123.218 23.5899ZM117.18 21.8266C118.921 21.8266 120.31 20.4159 120.31 18.5878C120.31 16.7364 118.921 15.3257 117.18 15.3257C115.417 15.3257 114.028 16.7364 114.028 18.5878C114.028 20.4214 115.417 21.8252 117.18 21.8252V21.8266Z'
38
+ fill='white'
39
+ />
40
+ <path
41
+ d='M130.668 24.5363C127.009 24.5363 124.32 22.0236 124.32 18.6306C124.32 15.2375 126.965 12.6353 130.36 12.6353C133.666 12.6353 136.067 15.17 136.067 18.4983C136.065 18.8886 136.043 19.2785 136.001 19.6665H127.516C127.803 21.0317 128.927 21.9134 130.602 21.9134C131.748 21.9134 132.562 21.5001 133.378 20.5248L135.694 22.244C134.546 23.7277 132.761 24.5363 130.668 24.5363ZM132.959 17.3522C132.783 16.0737 131.769 15.2141 130.342 15.2141C128.865 15.2141 127.961 16.1178 127.609 17.3522H132.959Z'
42
+ fill='white'
43
+ />
44
+ <defs>
45
+ <linearGradient
46
+ id='paint0_linear_181_1139'
47
+ x1='27.7105'
48
+ y1='28.8179'
49
+ x2='37.3813'
50
+ y2='8.29991'
51
+ gradientUnits='userSpaceOnUse'
52
+ >
53
+ <stop stop-color='#372A56' />
54
+ <stop offset='0.04' stop-color='#3C2F67' />
55
+ <stop offset='0.16' stop-color='#483B90' />
56
+ <stop offset='0.28' stop-color='#5245B1' />
57
+ <stop offset='0.4' stop-color='#594CCC' />
58
+ <stop offset='0.52' stop-color='#5F52DE' />
59
+ <stop offset='0.65' stop-color='#6255E9' />
60
+ <stop offset='0.79' stop-color='#6356ED' />
61
+ </linearGradient>
62
+ <linearGradient
63
+ id='paint1_linear_181_1139'
64
+ x1='8.54939'
65
+ y1='3.00993'
66
+ x2='24.0019'
67
+ y2='32.7482'
68
+ gradientUnits='userSpaceOnUse'
69
+ >
70
+ <stop stop-color='#89EFEC' />
71
+ <stop offset='0.12' stop-color='#85E1EC' />
72
+ <stop offset='0.34' stop-color='#7CBDEB' />
73
+ <stop offset='0.64' stop-color='#6D83EB' />
74
+ <stop offset='0.87' stop-color='#6153EA' />
75
+ </linearGradient>
76
+ </defs>
77
+ </svg>
@@ -0,0 +1,57 @@
1
+ // Global error suppression for extension and other non-critical errors
2
+ (function() {
3
+ 'use strict';
4
+
5
+ // Suppress console errors from browser extensions
6
+ const originalConsoleError = console.error;
7
+ console.error = function(...args) {
8
+ // Check if error is from browser extension
9
+ const errorString = args.join(' ');
10
+ if (errorString.includes('chrome-extension://') ||
11
+ errorString.includes('moz-extension://') ||
12
+ errorString.includes('safari-extension://') ||
13
+ errorString.includes('Failed to initialize messaging') ||
14
+ errorString.includes('tx_attempts_exceeded') ||
15
+ errorString.includes('tx_ack_timeout')) {
16
+ // Silently ignore extension errors
17
+ return;
18
+ }
19
+
20
+ // Allow other errors to be logged normally
21
+ originalConsoleError.apply(console, args);
22
+ };
23
+
24
+ // Suppress unhandled promise rejections from extensions
25
+ window.addEventListener('unhandledrejection', function(event) {
26
+ const errorString = event.reason ? event.reason.toString() : '';
27
+ if (errorString.includes('chrome-extension://') ||
28
+ errorString.includes('moz-extension://') ||
29
+ errorString.includes('safari-extension://') ||
30
+ errorString.includes('Failed to initialize messaging') ||
31
+ errorString.includes('tx_attempts_exceeded') ||
32
+ errorString.includes('tx_ack_timeout')) {
33
+ // Prevent the error from being displayed
34
+ event.preventDefault();
35
+ return;
36
+ }
37
+ });
38
+
39
+ // Suppress global errors from extensions
40
+ window.addEventListener('error', function(event) {
41
+ const errorString = event.message || '';
42
+ const sourceString = event.filename || '';
43
+
44
+ if (sourceString.includes('chrome-extension://') ||
45
+ sourceString.includes('moz-extension://') ||
46
+ sourceString.includes('safari-extension://') ||
47
+ errorString.includes('Failed to initialize messaging') ||
48
+ errorString.includes('tx_attempts_exceeded') ||
49
+ errorString.includes('tx_ack_timeout')) {
50
+ // Prevent the error from being displayed
51
+ event.preventDefault();
52
+ return;
53
+ }
54
+ });
55
+
56
+ console.log('Error suppression initialized - extension errors will be silenced');
57
+ })();