diff --git a/astro-i18next.config.ts b/astro-i18next.config.ts index 2b3e6b322..a118d1132 100644 --- a/astro-i18next.config.ts +++ b/astro-i18next.config.ts @@ -2,6 +2,6 @@ export default { defaultLocale: "en", showDefaultLocale: true, - locales: ["en", "zh", "es"], + locales: ["en", "es"], load: ["server", "client"], } diff --git a/astro.config.ts b/astro.config.ts index 61447a66c..00e9a466b 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from "astro/config" import preact from "@astrojs/preact" import react from "@astrojs/react" +import svgr from "vite-plugin-svgr" import astroI18next from "astro-i18next" import { astroCallouts, asideAutoImport } from "./integrations/astro-callouts" import { solidityRemixCode, codeSampleAutoImport } from "./integrations/solidity-remix" @@ -32,6 +33,7 @@ export default defineConfig({ preact({ compat: true, }), + sitemap({ changefreq: "daily", }), @@ -47,6 +49,9 @@ export default defineConfig({ }), astroI18next(), ], + vite: { + plugins: [svgr()], + }, markdown: { drafts: true, remarkPlugins: [remarkMath, remarkGfm], diff --git a/integrations/utils/makeComponentNode.ts b/integrations/utils/makeComponentNode.ts index c624d909f..04b9b10d8 100644 --- a/integrations/utils/makeComponentNode.ts +++ b/integrations/utils/makeComponentNode.ts @@ -21,7 +21,7 @@ export function makeComponentNode( type: "mdxJsxFlowElement", name, attributes: Object.entries(attributes) - // Filter out non-truthy attributes to avoid empty attrs being parsed as `true`. + // Filter out non-truthy attributes to avoid empty attributes being parsed as `true`. .filter(([_k, v]) => v !== false && Boolean(v)) .map(([name, value]) => ({ type: "mdxJsxAttribute", diff --git a/package-lock.json b/package-lock.json index df6108cac..199b0e142 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "rehype-mermaidjs": "^1.0.1", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", + "squirrel-gill": "^1.0.5", "tailwindcss": "^3.2.4", "to-querystring": "^1.1.1", "turndown": "^7.1.2" @@ -75,7 +76,8 @@ "solhint-plugin-prettier": "^0.0.5", "tsconfig-paths": "^4.1.0", "typescript": "^4.8.4", - "unist-util-remove": "^3.1.0" + "unist-util-remove": "^3.1.0", + "vite-plugin-svgr": "^4.2.0" } }, "node_modules/@algolia/cache-browser-local-storage": { @@ -2887,6 +2889,34 @@ "@proload/core": "^0.3.2" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -3053,6 +3083,219 @@ "antlr4ts": "^0.5.0-alpha.4" } }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -7017,6 +7260,22 @@ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz", "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==" }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -12415,6 +12674,21 @@ "get-func-name": "^2.0.0" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", @@ -14096,6 +14370,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/node-abi": { "version": "3.40.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", @@ -17201,6 +17491,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snake-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/solc": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", @@ -18146,6 +18452,14 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/squirrel-gill": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/squirrel-gill/-/squirrel-gill-1.0.5.tgz", + "integrity": "sha512-Q28EimiXm9xyJkNPChWuf7pKE9UioMuhId1sSZ8arqElg1yt8NJGVasH+2myvFfjp22lO040VZ0Gv2fVcZWrgA==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -18513,6 +18827,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, "node_modules/sync-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", @@ -19940,6 +20260,20 @@ } } }, + "node_modules/vite-plugin-svgr": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz", + "integrity": "sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.5", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4 || 5" + } + }, "node_modules/vitefu": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", @@ -22403,6 +22737,25 @@ "tsm": "^2.1.4" } }, + "@rollup/pluginutils": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "dependencies": { + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + } + } + }, "@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -22529,6 +22882,113 @@ "antlr4ts": "^0.5.0-alpha.4" } }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + } + }, + "@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + } + }, + "@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "requires": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + } + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -25619,6 +26079,24 @@ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz", "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==" }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + } + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -29563,6 +30041,23 @@ "get-func-name": "^2.0.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + } + } + }, "lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", @@ -30733,6 +31228,24 @@ "@types/nlcst": "^1.0.0" } }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + } + } + }, "node-abi": { "version": "3.40.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", @@ -32979,6 +33492,24 @@ } } }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + } + } + }, "solc": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", @@ -33724,6 +34255,12 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "squirrel-gill": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/squirrel-gill/-/squirrel-gill-1.0.5.tgz", + "integrity": "sha512-Q28EimiXm9xyJkNPChWuf7pKE9UioMuhId1sSZ8arqElg1yt8NJGVasH+2myvFfjp22lO040VZ0Gv2fVcZWrgA==", + "requires": {} + }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -33987,6 +34524,12 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, "sync-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", @@ -35011,6 +35554,17 @@ "rollup": "^3.21.0" } }, + "vite-plugin-svgr": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz", + "integrity": "sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.5", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + } + }, "vitefu": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", diff --git a/package.json b/package.json index 5d4044955..85f1efc4a 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "rehype-mermaidjs": "^1.0.1", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", + "squirrel-gill": "^1.0.5", "tailwindcss": "^3.2.4", "to-querystring": "^1.1.1", "turndown": "^7.1.2" @@ -88,7 +89,8 @@ "solhint-plugin-prettier": "^0.0.5", "tsconfig-paths": "^4.1.0", "typescript": "^4.8.4", - "unist-util-remove": "^3.1.0" + "unist-util-remove": "^3.1.0", + "vite-plugin-svgr": "^4.2.0" }, "lint-staged": { "*.{css,md,yml,yaml,astro}": "prettier --write", diff --git a/public/assets/search-white.svg b/public/assets/search-white.svg new file mode 100644 index 000000000..45c606a1a --- /dev/null +++ b/public/assets/search-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index ad8a263e6..9f5c24610 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -48,9 +48,12 @@ } }, "NewsletterCTA": { - "title": "Stay updated on the latest Scroll news", - "placeholder": "Enter your email address", - "buttonText": "Sign up" + "title": "Stay up-to-date on the latest Scroll Developer news", + "text": "Roadmap updates, virtual and live events, ecosystem opportunities and more", + "placeholder": "your email address here", + "thankYouForSubscribing": "Thank you for subscribing!", + "correctEmail": "Please use a correct email address.", + "pleaseInsertEmail": "Please insert your email." } }, "sidebar": { @@ -152,6 +155,30 @@ "additionalResources": "Additional Resources" } }, + "footer": { + "aboutScroll": { + "title": "About Scroll", + "bugBounty": "Bug Bounty", + "joinUs": "Join Us", + "healthStatus": "Health Status", + "privacyPolicy": "Privacy Policy", + "termsAndConditions": "Terms and Conditions" + }, + "resources": { + "title": "Resources", + "scrollDocsURL": "https://docs.scroll.io/", + "blog": "Blog", + "documentation": "Documentation", + "brandKit": "Brand Kit" + }, + "followUs": { + "title": "Follow Us" + } + }, + "pageNotFound": { + "title": "Page not found", + "text": "We're sorry, but we couldn't find the page you were looking for." + }, "notTranslated": { "notTranslated": "This page has not been translated yet." } diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index e31da1785..c18552235 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -48,9 +48,12 @@ } }, "NewsletterCTA": { - "title": "Stay updated on the latest Scroll news", - "placeholder": "Enter your email address", - "buttonText": "Sign up" + "title": "Mantente actualizado con las más recientes noticias sobre el Desarrollo de Scroll", + "text": "Roadmap, actualizaciones, eventos virtuales y presenciales, oportunidades en el ecosistema y más", + "placeholder": "tu correo electrónico aquí", + "thankYouForSubscribing": "¡Gracias por suscribirte!", + "correctEmail": "Por favor usa un correo electrónico válido.", + "pleaseInsertEmail": "Por favor ingresa tu correo electrónico." } }, "sidebar": { @@ -152,7 +155,32 @@ "additionalResources": "Recursos Adicionales" } }, + "footer": { + "aboutScroll": { + "title": "Acerca de Scroll", + "bugBounty": "Cazarecompensas de bugs", + "joinUs": "Únete a nosotros", + "healthStatus": "Estado de servicios", + "privacyPolicy": "Políticas de privacidad", + "termsAndConditions": "Terminos y condiciones" + }, + "resources": { + "title": "Recursos", + "scrollDocsURL": "https://docs.scroll.io/es", + "blog": "Blog", + "documentation": "Documentación", + "brandKit": "Kit de Marca" + }, + "followUs": { + "title": "Síguenos" + } + }, + "pageNotFound": { + "title": "Página no encontrada", + "text": "Lo sentimos, pero no pudimos encontrar la página que buscas." + }, "notTranslated": { "notTranslated": "Esta página no ha sido traducida aún." - } + }, + "This email cannot be added to this list. Please enter a different email address.": "Este correo electrónico no puede ser añadido a la lista. Por favor ingresa uno diferente." } diff --git a/public/svgs/Foundry.svg b/public/svgs/Foundry.svg index e9bf9381a..40d265b8e 100644 --- a/public/svgs/Foundry.svg +++ b/public/svgs/Foundry.svg @@ -1,9 +1,9 @@ - + - + - + diff --git a/public/svgs/summary-icon-white.svg b/public/svgs/summary-icon-white.svg new file mode 100644 index 000000000..568ca9af4 --- /dev/null +++ b/public/svgs/summary-icon-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/svgs/summary-icon.svg b/public/svgs/summary-icon.svg new file mode 100644 index 000000000..93b84590a --- /dev/null +++ b/public/svgs/summary-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/images/footer/arrow-right.svg b/src/assets/svgs/footer/arrow-right.svg similarity index 80% rename from public/images/footer/arrow-right.svg rename to src/assets/svgs/footer/arrow-right.svg index a759efe4b..ef0c9aa02 100644 --- a/public/images/footer/arrow-right.svg +++ b/src/assets/svgs/footer/arrow-right.svg @@ -1,3 +1,3 @@ - + diff --git a/public/images/footer/subscribe.svg b/src/assets/svgs/footer/subscribe.svg similarity index 93% rename from public/images/footer/subscribe.svg rename to src/assets/svgs/footer/subscribe.svg index cc34dafd4..5f3b0e8ad 100644 --- a/public/images/footer/subscribe.svg +++ b/src/assets/svgs/footer/subscribe.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/assets/svgs/header/moon.svg b/src/assets/svgs/header/moon.svg new file mode 100644 index 000000000..a31ab8f1c --- /dev/null +++ b/src/assets/svgs/header/moon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/svgs/header/sun.svg b/src/assets/svgs/header/sun.svg new file mode 100644 index 000000000..33f100310 --- /dev/null +++ b/src/assets/svgs/header/sun.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/svgs/Contribute.svg b/src/assets/svgs/home/Contribute.svg similarity index 95% rename from public/svgs/Contribute.svg rename to src/assets/svgs/home/Contribute.svg index 800f46c24..3b8b155c4 100644 --- a/public/svgs/Contribute.svg +++ b/src/assets/svgs/home/Contribute.svg @@ -1,6 +1,6 @@ - + diff --git a/public/svgs/Discord.svg b/src/assets/svgs/home/Discord.svg similarity index 91% rename from public/svgs/Discord.svg rename to src/assets/svgs/home/Discord.svg index bacb0fa41..41c4a450d 100644 --- a/public/svgs/Discord.svg +++ b/src/assets/svgs/home/Discord.svg @@ -1,8 +1,8 @@ - - - - + + + + diff --git a/public/svgs/EthersJS.svg b/src/assets/svgs/home/EthersJS.svg similarity index 94% rename from public/svgs/EthersJS.svg rename to src/assets/svgs/home/EthersJS.svg index ce96f60b9..16876c770 100644 --- a/public/svgs/EthersJS.svg +++ b/src/assets/svgs/home/EthersJS.svg @@ -1,3 +1,3 @@ - + diff --git a/public/svgs/Forum.svg b/src/assets/svgs/home/Forum.svg similarity index 90% rename from public/svgs/Forum.svg rename to src/assets/svgs/home/Forum.svg index af16e21de..02f9f2c9a 100644 --- a/public/svgs/Forum.svg +++ b/src/assets/svgs/home/Forum.svg @@ -1,9 +1,9 @@ - - - - - + + + + + diff --git a/public/svgs/home-develop.svg b/src/assets/svgs/home/home-develop.svg similarity index 98% rename from public/svgs/home-develop.svg rename to src/assets/svgs/home/home-develop.svg index 4a3e57090..5e22bd9e2 100644 --- a/public/svgs/home-develop.svg +++ b/src/assets/svgs/home/home-develop.svg @@ -1,6 +1,6 @@ - - + + diff --git a/public/svgs/home-learn.svg b/src/assets/svgs/home/home-learn.svg similarity index 77% rename from public/svgs/home-learn.svg rename to src/assets/svgs/home/home-learn.svg index 005a03d7b..b2ed73cba 100644 --- a/public/svgs/home-learn.svg +++ b/src/assets/svgs/home/home-learn.svg @@ -1,9 +1,9 @@ - - - - - + + + + + diff --git a/public/svgs/home-link-arrow.svg b/src/assets/svgs/home/home-link-arrow.svg similarity index 83% rename from public/svgs/home-link-arrow.svg rename to src/assets/svgs/home/home-link-arrow.svg index e87c0359d..ca96bd3c0 100644 --- a/public/svgs/home-link-arrow.svg +++ b/src/assets/svgs/home/home-link-arrow.svg @@ -1,6 +1,6 @@ - + diff --git a/public/svgs/home-link.svg b/src/assets/svgs/home/home-link.svg similarity index 96% rename from public/svgs/home-link.svg rename to src/assets/svgs/home/home-link.svg index c6edbf8d2..1b7c31566 100644 --- a/public/svgs/home-link.svg +++ b/src/assets/svgs/home/home-link.svg @@ -1,6 +1,6 @@ - + diff --git a/public/svgs/home-start.svg b/src/assets/svgs/home/home-start.svg similarity index 96% rename from public/svgs/home-start.svg rename to src/assets/svgs/home/home-start.svg index ef7bbeaee..f99f76403 100644 --- a/public/svgs/home-start.svg +++ b/src/assets/svgs/home/home-start.svg @@ -1,3 +1,3 @@ - + diff --git a/public/svgs/home-technology.svg b/src/assets/svgs/home/home-technology.svg similarity index 98% rename from public/svgs/home-technology.svg rename to src/assets/svgs/home/home-technology.svg index fff50c2de..9187e8e33 100644 --- a/public/svgs/home-technology.svg +++ b/src/assets/svgs/home/home-technology.svg @@ -1,3 +1,3 @@ - + diff --git a/src/assets/svgs/main/next.svg b/src/assets/svgs/main/next.svg new file mode 100644 index 000000000..7e53e0d72 --- /dev/null +++ b/src/assets/svgs/main/next.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Alert/Assets/alert-icon.svg b/src/components/Alert/Assets/alert-icon.svg index 26f7b823a..40d67e11b 100644 --- a/src/components/Alert/Assets/alert-icon.svg +++ b/src/components/Alert/Assets/alert-icon.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/src/components/Alert/Assets/danger-icon.svg b/src/components/Alert/Assets/danger-icon.svg index 48e13858c..4e1a19d7a 100644 --- a/src/components/Alert/Assets/danger-icon.svg +++ b/src/components/Alert/Assets/danger-icon.svg @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/src/components/Alert/Assets/info-icon.svg b/src/components/Alert/Assets/info-icon.svg index 4dd820de3..fb34149d5 100644 --- a/src/components/Alert/Assets/info-icon.svg +++ b/src/components/Alert/Assets/info-icon.svg @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/src/components/Alert/Assets/tip-icon.svg b/src/components/Alert/Assets/tip-icon.svg index eb2e4c147..b6ddd4c17 100644 --- a/src/components/Alert/Assets/tip-icon.svg +++ b/src/components/Alert/Assets/tip-icon.svg @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/src/components/Aside.astro b/src/components/Aside.astro index 9a385a2d7..17c1f765f 100644 --- a/src/components/Aside.astro +++ b/src/components/Aside.astro @@ -1,8 +1,8 @@ --- -import alertIcon from "./Alert/Assets/alert-icon.svg" -import infoIcon from "./Alert/Assets/info-icon.svg" -import dangerIcon from "./Alert/Assets/danger-icon.svg" -import tipIcon from "./Alert/Assets/tip-icon.svg" +import alertIcon from "./Alert/Assets/alert-icon.svg?raw" +import infoIcon from "./Alert/Assets/info-icon.svg?raw" +import dangerIcon from "./Alert/Assets/danger-icon.svg?raw" +import tipIcon from "./Alert/Assets/tip-icon.svg?raw" export type Props = { type?: "note" | "tip" | "caution" | "danger" title?: string @@ -21,7 +21,9 @@ const icons = {
- {type} + + +
+ + +
diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx deleted file mode 100644 index 9c6b422b7..000000000 --- a/src/components/Footer/Footer.tsx +++ /dev/null @@ -1,15 +0,0 @@ -// import PureFooter from "./PureFooter" -import React, { useState, useCallback } from "react" -import Subscribe from "./Subscribe/Subscribe.tsx" -import PureFooter from "./PureFooter/PureFooter.tsx" - -const Footer = () => { - return ( - <> - - - - ) -} - -export default Footer diff --git a/src/components/Footer/PureFooter/PureFooter.tsx b/src/components/Footer/PureFooter/PureFooter.tsx index ee126d83f..6ce32e8b2 100644 --- a/src/components/Footer/PureFooter/PureFooter.tsx +++ b/src/components/Footer/PureFooter/PureFooter.tsx @@ -1,6 +1,7 @@ import { useState, useEffect } from "preact/hooks" import { aboutList, mediaList, resourceList } from "../helper.tsx" import styles from "./PureFooter.module.css" +import { t } from "i18next" const Footer = () => { return ( @@ -9,28 +10,28 @@ const Footer = () => {
-

About Scroll

+

{ t("footer.aboutScroll.title") }

-

Resources

+

{ t("footer.resources.title") }

-

Follow Us

+

{ t("footer.followUs.title") }

{mediaList.map((item) => ( @@ -39,8 +40,6 @@ const Footer = () => { ))}
- -

© Version 1.0.0 Scroll Ltd 2023

) } diff --git a/src/components/Footer/Subscribe/EmailInput.module.css b/src/components/Footer/Subscribe/EmailInput.module.css index 5cb898d2b..107b40bc4 100644 --- a/src/components/Footer/Subscribe/EmailInput.module.css +++ b/src/components/Footer/Subscribe/EmailInput.module.css @@ -11,7 +11,6 @@ width: 48px; height: 100%; position: absolute; - background-color: #1f1f1f; border-radius: 10px; z-index: 1; top: 0; @@ -19,12 +18,12 @@ transition: width 0.5s ease; overflow: hidden; cursor: default; + @apply bg-black; } .iconButton { width: 54px; height: 100%; - color: #fff; display: inline-flex; align-items: center; justify-content: center; @@ -47,6 +46,7 @@ border-radius: 50%; overflow: visible; transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + @apply text-white; } .iconButton img { @@ -57,13 +57,12 @@ .success { font-size: 16px; font-weight: 600; - color: #fff; - background-color: #1f1f1f; border-radius: 10px; border-left: none; text-align: center; flex: 1; line-height: 54px; + @apply text-white bg-black; } .inputBase { @@ -71,16 +70,11 @@ font-weight: 600; height: 100%; width: 100%; - color: #000; - background-color: #fff; border-radius: 10px; border: 1px solid #000; border-left: none; text-align: center; -} - -.inputBase::placeholder { - color: #dcdcdc; + @apply text-black bg-pure-white border-black; } @media (min-width: 50em) { diff --git a/src/components/Footer/Subscribe/EmailInput.tsx b/src/components/Footer/Subscribe/EmailInput.tsx index b3e586002..b177f6914 100644 --- a/src/components/Footer/Subscribe/EmailInput.tsx +++ b/src/components/Footer/Subscribe/EmailInput.tsx @@ -1,5 +1,8 @@ -import React, { useState } from "react" +import React from "react" import styles from "./EmailInput.module.css" +import ArrowSvg from "~/assets/svgs/footer/arrow-right.svg?react" +import { clsx } from "~/lib" +import { t } from "i18next" const EmailInput = (props) => { const { end, onClick, onEnter, ...restProps } = props @@ -13,21 +16,29 @@ const EmailInput = (props) => { return (
- -
Thank you for subscribing!
+
{ t("landing.NewsletterCTA.thankYouForSubscribing") }
) diff --git a/src/components/Footer/Subscribe/Subscribe.tsx b/src/components/Footer/Subscribe/Subscribe.tsx index 3ec79e912..b3ff1e221 100644 --- a/src/components/Footer/Subscribe/Subscribe.tsx +++ b/src/components/Footer/Subscribe/Subscribe.tsx @@ -1,5 +1,9 @@ +// import React from "react" import { useState, useEffect } from "preact/hooks" import MailchimpSubscribe from "react-mailchimp-subscribe" +import SubscribeSvg from "~/assets/svgs/footer/subscribe.svg?react" +import { clsx } from "~/lib" +import i18next, { changeLanguage, t } from "i18next" import EmailInput from "./EmailInput.tsx" import styles from "./Subscribe.module.css" @@ -7,15 +11,17 @@ import styles from "./Subscribe.module.css" const url = "https://gmail.us14.list-manage.com/subscribe/post?u=3b1d822eb27b2fa64d82d430b&id=0b4603244e" const isValidEmail = (email: string): boolean => { - const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ + const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ return emailRegex.test(email) } -export default function Subscribe() { +export default function Subscribe(props) { const [email, setEmail] = useState("") const [customMessage, setCustomMessage] = useState("") const [emailValid, setEmailValid] = useState(false) + i18next.changeLanguage(props.lang) + useEffect(() => { setCustomMessage("") setEmailValid(isValidEmail(email)) @@ -23,9 +29,9 @@ export default function Subscribe() { const handleSubmit = (subscribe) => { if (!email) { - setCustomMessage("Please insert your email.") + setCustomMessage(t("landing.NewsletterCTA.pleaseInsertEmail")) } else if (!emailValid) { - setCustomMessage("Please use a correct email address.") + setCustomMessage(t("landing.NewsletterCTA.correctEmail")) } else { subscribe({ EMAIL: email }) setEmail("") @@ -37,12 +43,17 @@ export default function Subscribe() { } return ( -
+
- + + + +
-
Stay up-to-date on the latest Scroll Developer news
-
Roadmap updates, virtual and live events, ecosystem opportunities and more
+
{ t("landing.NewsletterCTA.title") }
+
+ { t("landing.NewsletterCTA.text") } +
handleSubmit(subscribe)} onEnter={() => handleSubmit(subscribe)} - placeholder="your email address here" + placeholder= { t("landing.NewsletterCTA.placeholder") } end={status === "success"} /> {customMessage &&
{customMessage}
} - {status === "error" &&
{message}
} + {status === "error" &&
{t(message)}
}
)} /> diff --git a/src/components/Footer/helper.tsx b/src/components/Footer/helper.tsx index c195d7dac..3a1b714a8 100644 --- a/src/components/Footer/helper.tsx +++ b/src/components/Footer/helper.tsx @@ -23,38 +23,38 @@ const TwitterIcon: React.FC> = (props) => ( export const aboutList = [ { - name: "Bug Bounty", + name: "footer.aboutScroll.bugBounty", href: "https://immunefi.com/bounty/scroll/", }, { - name: "Join Us", - href: "https://jobs.lever.co/ScrollFoundation", + name: "footer.aboutScroll.joinUs", + href: "https://scroll.io/join-us", }, { - name: "Health Status", + name: "footer.aboutScroll.healthStatus", href: "https://status.scroll.io/", }, { - name: "Privacy Policy", + name: "footer.aboutScroll.privacyPolicy", href: "https://scroll.io/privacy-policy", }, { - name: "Terms and Conditions", + name: "footer.aboutScroll.termsAndConditions", href: "https://scroll.io/terms-and-conditions", }, ] export const resourceList = [ { - name: "Blog", + name: "footer.resources.blog", href: "https://scroll.io/blog", }, { - name: "Documentation", + name: "footer.resources.documentation", href: "https://docs.scroll.io/", }, { - name: "Press Kit", + name: "footer.resources.brandKit", href: "https://scrollzkp.notion.site/Scroll-Rebrand-Assets-5bb83465f56f40989c4f772b39ed3a06", }, ] diff --git a/src/components/Header/Header.astro b/src/components/Header/Header.astro index 580473af1..0433515cd 100644 --- a/src/components/Header/Header.astro +++ b/src/components/Header/Header.astro @@ -4,6 +4,8 @@ import { Frontmatter, MENU } from "../../config/index" import SkipToContent from "./SkipToContent.astro" import SidebarToggle from "./SidebarToggle.tsx" import Search from "./Search/Search.tsx" +import ThemeModeToggle from "./ThemeModeToggle" +import GithubSvg from "~/assets/svgs/header/github.svg?raw" // import LanguageSelector from "./LanguageSelector/index.tsx" import LanguageSelector from "./LanguageSelector/LanguageSelector.astro" @@ -11,6 +13,7 @@ import { localizePath } from "astro-i18next" import i18next from "i18next" import NotificationBanner from "~/features/notifications/components/NotificationBanner.astro" +import { clsx } from "~/lib" export type Props = { frontmatter?: Frontmatter @@ -18,9 +21,9 @@ export type Props = { } const { frontmatter, dark } = Astro.props -const backgroundColor = dark ? "#101010" : "#ffffff" +const backgroundColor = dark ? "#101010" : "" -const textColor = dark ? "#FFF8F3" : "#101010" +const textColor = dark ? "#FFF8F3" : "" const section = frontmatter?.section ?? "" --- @@ -33,23 +36,26 @@ const section = frontmatter?.section ?? "" +
+ diff --git a/src/components/Header/LanguageSelector/LanguageSelector.astro b/src/components/Header/LanguageSelector/LanguageSelector.astro index e2fc38268..c34f94314 100644 --- a/src/components/Header/LanguageSelector/LanguageSelector.astro +++ b/src/components/Header/LanguageSelector/LanguageSelector.astro @@ -3,93 +3,136 @@ import i18next from "i18next" import { localizePath } from "astro-i18next" import localeEmoji from "locale-emoji" import ISO6991 from "iso-639-1" +import { clsx } from "~/lib" const supportedLanguages = i18next.languages -const currentLanguage = i18next.language const { pathname } = Astro.url -const { showFlag = false, languageMapping, ...attributes } = Astro.props ---- +const { showFlag = false, languageMapping } = Astro.props +const { dark } = Astro.props + +const getLabel = (language) => { + const flag = showFlag ? localeEmoji(language) + " " : "" + let nativeName = "" + if (languageMapping && languageMapping.hasOwnProperty(language)) { + nativeName = languageMapping[language] + } else { + nativeName = ISO6991.getNativeName(language) + } -
-
    - { - supportedLanguages.map((supportedLanguage) => { - let value = localizePath(pathname, supportedLanguage) - const flag = showFlag ? localeEmoji(supportedLanguage) + " " : "" - let nativeName = "" - if (languageMapping && languageMapping.hasOwnProperty(supportedLanguage)) { - nativeName = languageMapping[supportedLanguage] - } else { - nativeName = ISO6991.getNativeName(supportedLanguage) - } + return flag + nativeName +} +--- - const label = flag + nativeName +
    +
    + + + + {getLabel(supportedLanguages[0])} +
    +
    +
      + { + supportedLanguages.map((supportedLanguage, idx) => { + let value = localizePath(pathname, supportedLanguage) + const label = getLabel(supportedLanguage) - return ( -
    • - {label} -
    • - ) - }) - } -
    + return ( +
  • + {idx === 0 ? ( + + + + + ) : ( + + + + )} + {label} +
  • + ) + }) + } +
+
diff --git a/src/components/Header/ScrollLogo.tsx b/src/components/Header/ScrollLogo.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/components/Header/Search/Search.module.css b/src/components/Header/Search/Search.module.css index 49570f7df..59cb45200 100644 --- a/src/components/Header/Search/Search.module.css +++ b/src/components/Header/Search/Search.module.css @@ -1,12 +1,11 @@ /** Style Algolia */ #searchModal.mini { - background: #ffffff; position: fixed; top: 65px; left: 0; right: 0; - height: 100vh; + height: calc(100vh - 65px); padding-top: 60px; border-radius: 0; } @@ -14,8 +13,6 @@ #searchModal.large { top: 0; height: fit-content; - max-height: 80vh; - background: #fff; position: absolute; border-radius: 24px; padding-top: 0; @@ -24,7 +21,7 @@ .resultsWrapper { padding: 20px 20px 1rem; - overflow: overlay; + height: calc(100% - 50px); } .searchInput { @@ -40,12 +37,12 @@ outline: 0; cursor: pointer; align-items: center; - width: 346px; + width: 100%; height: 35px; border-radius: 40px; font-style: italic; - background: #f6f6f6; - @apply border-divider text-placeholder gap-2; + + @apply border-divider text-black gap-2 bg-[#f6f6f6]; } .searchInputMobile { @@ -61,7 +58,7 @@ .searchInput:hover, .searchInput:focus { - @apply text-text border-light; + @apply text-black border-light; } .searchInput::placeholder, @@ -119,7 +116,6 @@ .closeButtonMobile { display: block; - background-color: #ffffff; border: 3px solid #ffffff; padding: 0; font-size: 16px; @@ -127,11 +123,8 @@ position: relative; right: -43px; box-sizing: content-box; -} -.hitWrapper { - max-height: 40vh; - overflow: overlay; + @apply bg-pure-white; } .hitWrapper ol { @@ -141,12 +134,15 @@ .hit { line-height: 32px; display: block; - @apply text-primary mb-2; + @apply mb-2 text-black; } .queryResults { display: grid; grid-template-columns: 1fr; + grid-auto-rows: max-content; + height: 100%; + overflow-y: auto; } .queryResults h6 { @@ -177,6 +173,7 @@ .hitList mark { background-color: transparent; font-weight: bold; + @apply text-inherit; } .hideSm { @@ -198,16 +195,17 @@ .container { position: relative; + width: 100%; } #searchModal.mini { top: 0; height: fit-content; max-height: 80vh; - background: #f6f6f6; position: absolute; border-radius: 17.5px; padding-top: 0; + @apply bg-[#f6f6f6]; } #searchModal.large { @@ -224,8 +222,8 @@ } .hitWrapper { - max-height: calc(80vh - 100px); - overflow: auto; + max-height: calc(80vh - 150px); + overflow-y: auto; } .hitList li { @@ -246,9 +244,9 @@ } @media (max-width: 72em) and (min-width: 50em) { - :global(.right-box .tools) { + /* :global(.right-box .tools) { display: none; - } + } */ .queryResults { grid-template-columns: 1fr !important; @@ -259,4 +257,9 @@ .resultsWrapper * { padding-left: 0 !important; } + + .queryResults.large { + max-height: calc(80vh - 48px); + height: max-content; + } } diff --git a/src/components/Header/Search/Search.tsx b/src/components/Header/Search/Search.tsx index fa6d0ff3e..9f7af0010 100644 --- a/src/components/Header/Search/Search.tsx +++ b/src/components/Header/Search/Search.tsx @@ -3,6 +3,7 @@ import styles from "./Search.module.css" import { useKeyPress } from "~/hooks/useKeyPress" import { SearchModal } from "./SearchModal" +import { clsx } from "~/lib" export default function Search() { const [isOpen, setIsOpen] = useState(false) @@ -15,8 +16,14 @@ export default function Search() { const body = document.body if (isOpen) { body.classList.add("global-search-toggle") + if (window.matchMedia("(max-width: 50em)").matches) { + document.querySelector("#themeModeToggle").style.right = "-43px" + } } else { body.classList.remove("global-search-toggle") + if (window.matchMedia("(max-width: 50em)").matches) { + document.querySelector("#themeModeToggle").style.right = 0 + } } }, [isOpen]) @@ -34,13 +41,22 @@ export default function Search() { return (
-
+
@@ -52,21 +68,21 @@ export default function Search() { height="18" viewBox="0 0 18 18" fill="none" - className={styles.closeButtonMobile} + className={clsx(styles.closeButtonMobile, "dark:border-black dark:bg-black")} onClick={onClose} > ) : ( )}
diff --git a/src/components/Header/Search/SearchInput.module.css b/src/components/Header/Search/SearchInput.module.css index 87ab4a215..17c8ab48b 100644 --- a/src/components/Header/Search/SearchInput.module.css +++ b/src/components/Header/Search/SearchInput.module.css @@ -9,7 +9,6 @@ overflow: hidden; padding: 0 20px; border-radius: 0; - @apply bg-white; } .wrapper.large { @@ -21,7 +20,6 @@ margin: 0; font-size: 16px; width: 100%; - color: rgb(12, 22, 44); outline: none; display: block; appearance: none; @@ -34,6 +32,8 @@ border-radius: 0; height: 50px; line-height: 45px; + + @apply text-black border-black; } .input.large { height: 48px; @@ -77,7 +77,7 @@ .input { font-size: 16px; line-height: 15px; - background: #f6f6f6 url(/assets/search.svg) left 12px top 50% / 17px no-repeat; + background: url(/assets/search.svg) left 12px top 50% / 17px no-repeat; border: none; height: 35px; line-height: 35px; @@ -90,6 +90,7 @@ background: transparent url(/svgs/search.svg) left 22px center no-repeat; padding-left: 60px; padding-right: 22px; + background-size: 22px auto; } .input:focus { diff --git a/src/components/Header/Search/SearchInput.tsx b/src/components/Header/Search/SearchInput.tsx index c02a8a979..1c6ae4564 100644 --- a/src/components/Header/Search/SearchInput.tsx +++ b/src/components/Header/Search/SearchInput.tsx @@ -24,9 +24,24 @@ export const SearchInput = ({ size, onClose }: { onClose: () => void }) => { }, [debouncedValue]) return ( -
+
+
Recommended articles
@@ -46,7 +47,7 @@ function EmptyQueryBoundary({ children, fallback }) { {article.title} @@ -66,7 +67,7 @@ function EmptyQueryBoundary({ children, fallback }) { {article.title} @@ -108,6 +109,7 @@ function NoResultsBoundary({ children }) { function CustomHits({ title, hitClassName, ...props }: UseHitsProps & { title: string; hitClassName?: string }) { const { hits, results } = useHits(props) + console.log(hits, "hits") if (hits.length === 0) return null return (
@@ -119,7 +121,7 @@ function CustomHits({ title, hitClassName, ...props }: UseHitsProps & { title: s +
- + -
+
= ({ dark }) => { type="button" aria-pressed={sidebarShown ? "true" : "false"} id="menu-toggle" - className={clsx(styles.button, dark && styles.dark)} + className={clsx(styles.button, "text-black", dark && "text-white", "dark:text-white")} onClick={() => setSidebarShown(!sidebarShown)} > {sidebarShown ? ( diff --git a/src/components/Header/ThemeModeToggle.tsx b/src/components/Header/ThemeModeToggle.tsx new file mode 100644 index 000000000..5dab23c86 --- /dev/null +++ b/src/components/Header/ThemeModeToggle.tsx @@ -0,0 +1,58 @@ +import { useEffect, useState } from "preact/hooks" +import useStorage from "squirrel-gill" +import MoonSvg from "~/assets/svgs/header/moon.svg?react" +import SunSvg from "~/assets/svgs/header/sun.svg?react" +import { clsx } from "~/lib" + +const ThemeModeToggle = (props) => { + const { dark } = props + const [themeMode, setThemeMode] = useStorage(localStorage, "THEME_MODE", "light") + const [isDarkMode, setIsDarkMode] = useState(false) + + useEffect(() => { + const toggleThemeMode = (e) => { + if (e.matches) { + setThemeMode("dark") + } else [setThemeMode("light")] + } + + window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", toggleThemeMode) + + return () => { + window.matchMedia("(prefers-color-scheme: dark)").removeEventListener("change", toggleThemeMode) + } + }, []) + + useEffect(() => { + if (themeMode === "dark") { + setIsDarkMode(true) + document.documentElement.classList.add("dark") + } else { + setIsDarkMode(false) + document.documentElement.classList.remove("dark") + } + }, [themeMode]) + + const handleToggleThemeMode = () => { + if (isDarkMode) { + setThemeMode("light") + } else { + setThemeMode("dark") + } + } + + return ( + + ) +} + +export default ThemeModeToggle diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro index 86e9dda68..c81ccff34 100644 --- a/src/components/LeftSidebar/LeftSidebar.astro +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -76,7 +76,7 @@ const currentPageMatch = removeSlashes(currentPage.slice(1)) @@ -135,7 +135,7 @@ const currentPageMatch = removeSlashes(currentPage.slice(1)) .menu-separator { width: calc(100vw - 40px); - @apply border-0 border-t-[1px] border-t-divider border-solid; + @apply border-0 border-t-[1px] border-solid border-black dark:border-white; } .sidebar-nav-groups.nav-groups > :first-child { @apply pt-[15px]; diff --git a/src/components/NavCard.astro b/src/components/NavCard.astro index dfcd8e10f..f91594a62 100644 --- a/src/components/NavCard.astro +++ b/src/components/NavCard.astro @@ -1,5 +1,6 @@ --- import i18next, { t } from "i18next" +import LinkSvg from "~/assets/svgs/home/home-link.svg?raw" export type Props = { icon: string name: string @@ -14,12 +15,16 @@ const { icon, name, content, link } = Astro.props as Props --- @@ -33,10 +38,13 @@ const { icon, name, content, link } = Astro.props as Props } .navs-item-icon { - display: inline-block; + display: inline-flex; width: 35px; height: 35px; + align-items: center; + @apply text-black dark:text-white; } + .navs-item-title { font-size: 22px; font-weight: 600; @@ -56,19 +64,17 @@ const { icon, name, content, link } = Astro.props as Props font-size: 16px; text-decoration: 1px underline; text-underline-offset: 2px; - color: #c58d49; - background-color: #fff0dd; + @apply bg-normal dark:bg-dark-normal; } .navs-item-link:hover { - background-color: #ffdeb5; + @apply bg-highlight dark:bg-dark-highlight; } .link-icon { - display: inline-block; + display: inline-flex; width: 8px; height: 8px; margin-left: 2px; - background: url(/svgs/home-link.svg) center no-repeat; } @media screen and (max-width: 50em) { diff --git a/src/components/PageContent/Feedback.tsx b/src/components/PageContent/Feedback.tsx index 1909ec905..b5f538837 100644 --- a/src/components/PageContent/Feedback.tsx +++ b/src/components/PageContent/Feedback.tsx @@ -5,8 +5,8 @@ const star = ( @@ -15,8 +15,8 @@ const starOutline = ( @@ -36,6 +36,13 @@ export const Feedback = () => { return } setRating(selectedNumber + 1) + setTimeout(() => { + const scollElement = document.querySelector(".sidebar-nav-inner") + scollElement.scrollTo({ + top: scollElement.scrollHeight, + behavior: "smooth", + }) + }, 0) setIsSent(false) const path = "https://hviedclg.api.lncldglobal.com/1.1/classes/Feedback" const data = { @@ -91,6 +98,7 @@ export const Feedback = () => { style={{ cursor: "pointer", marginRight: "10px", + fontSize: 0, }} > {rating >= i + 1 ? star : starOutline} @@ -99,32 +107,44 @@ export const Feedback = () => {
{!!rating && (
{isSent ? ( -
+
We appreciate your feedback! 🤎
) : ( -
+ -
+