diff --git a/.changeset/cool-coins-sin.md b/.changeset/cool-coins-sin.md new file mode 100644 index 0000000..f25dc82 --- /dev/null +++ b/.changeset/cool-coins-sin.md @@ -0,0 +1,5 @@ +--- +"@fleek-platform/login-button": patch +--- + +Adds reusable component AuthButton off-loading most of the logic, also includes an option for dropdown version diff --git a/.tailwind/fonts.ts b/.tailwind/fonts.ts new file mode 100644 index 0000000..6653859 --- /dev/null +++ b/.tailwind/fonts.ts @@ -0,0 +1,5 @@ +export const fontFamily = { + 'sans': ['AtypDisplay'], + 'plex-sans': ['IBM Plex Sans'], + 'plex-mono': ['IBM Plex Mono'], +}; diff --git a/.tailwind/gridLayout.ts b/.tailwind/gridLayout.ts new file mode 100644 index 0000000..3d307f8 --- /dev/null +++ b/.tailwind/gridLayout.ts @@ -0,0 +1,3 @@ +export const gridTemplateColumns = { + 32: 'repeat(32, minmax(0, 1fr))', +}; diff --git a/.tailwind/tailwind.config.utils.mjs b/.tailwind/tailwind.config.utils.mjs new file mode 100644 index 0000000..9a0d93e --- /dev/null +++ b/.tailwind/tailwind.config.utils.mjs @@ -0,0 +1,12 @@ +const baseFontSizePx = 10; +const unitToRem = (val) => `${val}rem`; +const pxToRem = (val) => val / baseFontSizePx; +const pxToRemUnit = (val) => unitToRem(pxToRem(val)); +const appendPx = (val) => `${val}px`; + +export { + unitToRem, + pxToRem, + pxToRemUnit, + appendPx, +}; diff --git a/.tailwind/tailwind.custom.config.mjs b/.tailwind/tailwind.custom.config.mjs new file mode 100644 index 0000000..a0db5d6 --- /dev/null +++ b/.tailwind/tailwind.custom.config.mjs @@ -0,0 +1,104 @@ +import createSpacingPlugin from "./tailwind.plugin.spacing"; +import gridPlugin from "./tailwind.plugin.grid"; +import safelist from "./tailwind.safelist"; +import aspectRatioPlugin from "@tailwindcss/aspect-ratio"; + +export default function (usePx) { + const { plugin: spacingPlugin } = createSpacingPlugin(usePx); + + const generateSizes = (noUnits) => { + const max = 128; + const sizes = {}; + for (let i = 1; i <= max; i++) { + if (noUnits) { + sizes[i] = i.toString(); + } else { + sizes[i] = usePx ? `${i}px` : `${i / 10}rem`; + } + } + return sizes; + }; + + const aspectRatioSizes = () => { + const max = 32; + const sizes = {}; + for (let i = 1; i <= max; i++) { + sizes[i] = i.toString(); + } + return sizes; + }; + + return { + safelist, + theme: { + container: { + center: true, + }, + fontFamily: { + sans: ["sans-serif"], + serif: ["serif"], + }, + aspectRatio: aspectRatioSizes(), + borderRadius: { + none: "0", + full: "9999px", + ...generateSizes(), + }, + borderWidth: { + DEFAULT: usePx ? "1px" : "0.1rem", + 0: "0", + ...generateSizes(), + }, + fontSize: { + ...generateSizes(), + }, + letterSpacing: { + ...generateSizes(), + }, + zIndex: { + ...generateSizes(true), + }, + extend: { + boxShadow: { + sm: "0px 1px 1px rgba(0, 0, 0, 0.1), 0px 2px 6px rgba(0, 0, 0, 0.12)", + soft: "0px 1px 1px rgba(0, 0, 0, 0.1), 0px 2px 6px rgba(0, 0, 0, 0.12)", + dark: "0px 2px 8px 0px rgba(26, 26, 26, 0.25)", + 'glow': '0 0 15px 5px rgba(255, 255, 255, 0.6)', + }, + lineHeight: generateSizes(), + keyframes: { + blur: { + "0%": { filter: "blur(20px)" }, + "100%": { filter: "blur(0)" }, + }, + rock: { + "0%": { + transform: "rotate(-9deg)", + }, + "50%": { + transform: "rotate(-8deg)", + }, + "100%": { + transform: "rotate(-9deg)", + }, + }, + 'fade-in': { + '0%': { opacity: 0 }, + '100%': { opacity: 1 }, + }, + 'fade-in-down': { + '0%': { transform: 'translateY(2%)', opacity: 0 }, + '100%': { transform: 'translateY(0)', opacity: 1 }, + }, + }, + animation: { + "blur-out": "blur 0.6s ease-out", + "rock": "rock 1.2s infinite", + 'fade-in': 'fade-in 100ms ease-out', + 'fade-in-down': 'fade-in-down 120ms ease-out', + }, + }, + }, + plugins: [gridPlugin, spacingPlugin, aspectRatioPlugin], + }; +} diff --git a/.tailwind/tailwind.plugin.grid.mjs b/.tailwind/tailwind.plugin.grid.mjs new file mode 100644 index 0000000..5874949 --- /dev/null +++ b/.tailwind/tailwind.plugin.grid.mjs @@ -0,0 +1,74 @@ +import plugin from "tailwindcss/plugin"; +/** + * Creates a custom css grid with 24 columns instead of 12 columns, which are Tailwind default + */ + +const columns = 24; +const generateGridTemplateColumns = () => { + const ret = {}; + for (let i = 1; i <= columns; i++) { + ret[i] = `repeat(${i}, minmax(0, 1fr))`; + } + return ret; +}; + +const generateGridColumn = () => { + const ret = {}; + for (let i = 1; i <= columns; i++) { + ret["span-" + i] = `span ${i} / span ${i}`; + } + return ret; +}; + +const generateGridColumnStart = () => { + const ret = {}; + for (let i = 1; i <= columns; i++) { + ret[`${i}`] = `${i}`; + } + return ret; +}; + +const generateGridColumnEnd = () => { + const ret = {}; + for (let i = 1; i <= columns; i++) { + ret[`${i}`] = `${i}`; + } + return ret; +}; + +const generateGapSizes = () => { + const ret = {}; + for (let i = 1; i <= 78; i++) { + ret[i] = `${i / 10}rem`; + } + return ret; +}; + +const grid = plugin(function () {}, { + theme: { + gridTemplateColumns: { + ...generateGridTemplateColumns(), + }, + gridColumn: { + ...generateGridColumn(), + }, + gridColumnStart: { + ...generateGridColumnStart(), + }, + gridColumnEnd: { + ...generateGridColumnEnd(), + }, + gap: { + ...generateGapSizes(), + }, + }, + // variants: { + // gridTemplateColumns: ["responsive"], + // gridColumn: ["responsive"], + // gridColumnStart: ["responsive"], + // gridColumnEnd: ["responsive"], + // gap: ["responsive"], + // }, +}); + +export default grid; diff --git a/.tailwind/tailwind.plugin.spacing.mjs b/.tailwind/tailwind.plugin.spacing.mjs new file mode 100644 index 0000000..608b664 --- /dev/null +++ b/.tailwind/tailwind.plugin.spacing.mjs @@ -0,0 +1,58 @@ +import plugin from "tailwindcss/plugin"; +import { pxToRemUnit } from "./tailwind.config.utils"; + +export default function(usePx) { + /** + * Creates a custom spacing scale, where the classname maps + * 1:1 to its pixel value. Uses px to rem conversion under the hood. + * + * iE `w-16 => width: 16px | 1.6rem;` + * + * ``` + * 1-32 = 1px steps. + * 32-64 = 2px steps. + * 64-128 = 4px steps. + * 128-256 = 8px steps. + * 256-512 = 16px steps. + * 512-1024 = 32px steps. + * ``` + */ + const createScale = ({ min = 0, max = 100, steps = 1, valFM, keyFM }) => { + const limit = Math.round((max - min) / steps); + const scale = [...new Array(limit + 1)].map((_, i) => min + i * steps); + + return scale.reduce((prev, curr) => { + const key = keyFM ? keyFM(curr) : curr; + const val = valFM && curr !== 0 ? valFM(curr) : curr; + + return { ...prev, [String(key)]: val }; + }, {}); + }; + + const valFM = usePx ? (val) => val : pxToRemUnit; + + const spacing = { + ...createScale({ max: 32, steps: 1, valFM }), + ...createScale({ min: 32, max: 64, steps: 2, valFM }), + ...createScale({ min: 64, max: 128, steps: 4, valFM }), + ...createScale({ min: 128, max: 256, steps: 8, valFM }), + ...createScale({ min: 256, max: 512, steps: 16, valFM }), + ...createScale({ min: 512, max: 1024, steps: 32, valFM }), + }; + + const spacings = plugin(function () {}, { + theme: { + spacing, + extend: { + minWidth: spacing, + minHeight: spacing, + gap: spacing, + }, + }, + }); + + return { + pxToRemUnit, + plugin: spacings, + }; +}; diff --git a/.tailwind/tailwind.plugin.typography.mjs b/.tailwind/tailwind.plugin.typography.mjs new file mode 100644 index 0000000..3d12950 --- /dev/null +++ b/.tailwind/tailwind.plugin.typography.mjs @@ -0,0 +1,101 @@ +import plugin from "tailwindcss/plugin"; + +// define typography here so intellisense completion works +export default plugin(({ addComponents }) => { + addComponents({ + ".typo-h1": { + "@apply font-sans text-[12rem] font-medium leading-[100%]": + {}, + }, + ".typo-h2": { + "@apply font-sans text-[9rem] font-medium leading-[100%]": + {}, + }, + ".typo-h4": { + "@apply font-sans text-[6.1rem] font-medium leading-[100%]": {}, + }, + ".typo-h5": { + "@apply font-sans text-39 font-medium leading-[100%]": {}, + }, + ".typo-l": { + "@apply font-plex-sans text-20 leading-[150%]": {}, + }, + ".typo-xl": { + "@apply font-plex-sans text-25 font-normal leading-[150%]": {}, + }, + ".typo-xl-bold": { + "@apply font-plex-sans text-25 font-bold leading-[150%]": {}, + }, + ".typo-m": { + "@apply font-plex-sans text-16 leading-[150%]": {}, + }, + ".typo-m-normal": { + "@apply font-plex-sans text-16 font-normal leading-[150%] text-gray-dark-12": {}, + }, + ".typo-m-strong": { + "@apply font-plex-sans text-16 font-medium leading-[150%]": {}, + }, + ".typo-s": { + "@apply font-plex-sans text-13 font-normal leading-[150%]": {}, + }, + ".typo-caption-l": { + "@apply font-plex-sans text-20 font-medium uppercase leading-[150%] tracking-[0.4rem]": + {}, + }, + ".typo-caption-m": { + "@apply font-plex-sans text-16 font-medium uppercase leading-[150%] tracking-[0.32rem]": + {}, + }, + ".typo-caption-s": { + "@apply font-plex-sans text-13 font-medium uppercase leading-[150%] tracking-[0.256rem]": + {}, + }, + ".typo-caption-s-normal": { + "@apply font-plex-sans text-15 leading-[150%] tracking-[0.256rem]": + {}, + }, + ".typo-caption-xs": { + "@apply font-plex-sans text-10 font-normal uppercase leading-[150%] tracking-[0.02725rem]": + {}, + }, + ".typo-caption-text": { + "@apply font-plex-sans text-13 font-medium leading-[150%]": {}, + }, + ".typo-nav-m": { + "@apply font-plex-sans text-16 uppercase leading-[150%] tracking-[0.064rem]": + {}, + }, + ".typo-btn-action": { + "@apply font-plex-sans text-16 font-medium uppercase leading-[150%] tracking-[0.09rem]": + {}, + }, + ".typo-btn-cap": { + "@apply font-plex-sans text-16 font-normal leading-[150%] tracking-[0.0rem]": + {}, + }, + ".typo-btn-xs": { + "@apply font-plex-sans text-13 font-normal uppercase leading-[150%] tracking-[0.032rem]": + {}, + }, + ".typo-btn-xxs": { + "@apply font-plex-sans text-13 font-thin leading-[150%] tracking-[0.032rem]": + {}, + }, + ".typo-btn-s": { + "@apply font-plex-sans text-13 font-normal uppercase leading-[150%] tracking-[0.096rem]": + {}, + }, + ".typo-btn-s-normal": { + "@apply font-plex-sans text-13 font-normal leading-[150%] tracking-[0.096rem]": + {}, + }, + ".typo-btn-l": { + "@apply font-plex-sans text-16 font-medium uppercase leading-[150%] tracking-[0.192rem]": + {}, + }, + ".typo-btn-l-mid": { + "@apply font-plex-sans text-16 font-medium leading-[150%] tracking-[0.192rem]": + {}, + }, + }); +}); diff --git a/.tailwind/tailwind.safelist.mjs b/.tailwind/tailwind.safelist.mjs new file mode 100644 index 0000000..a29c8a2 --- /dev/null +++ b/.tailwind/tailwind.safelist.mjs @@ -0,0 +1,10 @@ +export default [ + "bg-white", + "hover:bg-white-hover", + "text-white", + "lazyload", + "lazyloading", + "lazyloaded", + "swiper-pagination", + "swiper-pagination-bullet-active", +]; diff --git a/.tailwind/tokens.ts b/.tailwind/tokens.ts new file mode 100644 index 0000000..78b4317 --- /dev/null +++ b/.tailwind/tokens.ts @@ -0,0 +1,75 @@ +export const colors = { + 'elz-white': '#FFF', + 'elz-black': '#000', + + /* Neutral */ + 'elz-neutral-0': '#000000', + 'elz-neutral-1': '#111111', + 'elz-neutral-2': '#191919', + 'elz-neutral-3': '#222222', + 'elz-neutral-4': '#2A2A2A', + 'elz-neutral-5': '#313131', + 'elz-neutral-6': '#3A3A3A', + 'elz-neutral-7': '#484848', + 'elz-neutral-8': '#606060', + 'elz-neutral-9': '#6E6E6E', + 'elz-neutral-10': '#7B7B7B', + 'elz-neutral-11': '#B4B4B4', + 'elz-neutral-12': '#EEEEEE', + + /* Accent */ + 'elz-accent-1': '#14120B', + 'elz-accent-2': '#1B180F', + 'elz-accent-3': '#2D2305', + 'elz-accent-4': '#362B00', + 'elz-accent-5': '#433500', + 'elz-accent-6': '#524202', + 'elz-accent-7': '#665417', + 'elz-accent-8': '#836A21', + 'elz-accent-9': '#FFE629', + 'elz-accent-10': '#FFFF57', + 'elz-accent-11': '#F5E147', + 'elz-accent-12': '#F6EEB4', + + /* Success */ + 'elz-success-1': '#0E1512', + 'elz-success-2': '#121B17', + 'elz-success-3': '#132D21', + 'elz-success-4': '#113B29', + 'elz-success-5': '#174933', + 'elz-success-6': '#20573E', + 'elz-success-7': '#28684A', + 'elz-success-8': '#2F7C57', + 'elz-success-9': '#30A46C', + 'elz-success-10': '#33B074', + 'elz-success-11': '#3DD68C', + 'elz-success-12': '#B1F1CB', + + /* Warning */ + 'elz-warning-1': '#16120C', + 'elz-warning-2': '#1D180F', + 'elz-warning-3': '#302008', + 'elz-warning-4': '#3F2700', + 'elz-warning-5': '#4D3000', + 'elz-warning-6': '#5C3D05', + 'elz-warning-7': '#714F19', + 'elz-warning-8': '#8F6424', + 'elz-warning-9': '#FFC53D', + 'elz-warning-10': '#FFD60A', + 'elz-warning-11': '#FFCA16', + 'elz-warning-12': '#FFE7B3', + + /* Danger */ + 'elz-danger-1': '#191111', + 'elz-danger-2': '#201314', + 'elz-danger-3': '#3B1219', + 'elz-danger-4': '#500F1C', + 'elz-danger-5': '#611623', + 'elz-danger-6': '#72232D', + 'elz-danger-7': '#8C333A', + 'elz-danger-8': '#B54548', + 'elz-danger-9': '#E5484D', + 'elz-danger-10': '#EC5D5E', + 'elz-danger-11': '#FF9592', + 'elz-danger-12': '#FFD1D9', +}; diff --git a/package.json b/package.json index bd8595d..0d7d5dd 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,13 @@ ".": { "import": "./dist/bundle.js", "types": "./dist/index.d.ts" + }, + "./styles": { + "import": "./dist/styles/main.min.css" } }, "scripts": { - "build": "pnpm clean:dist && pnpm exec bun build.ts && pnpm run transpile", + "build": "pnpm clean:dist && pnpm exec bun build.ts && pnpm run transpile && pnpm tailwind:build", "changeset:add": "pnpm exec changeset", "changeset:status": "pnpm exec changeset status", "changeset:version": "pnpm exec changeset version", @@ -35,6 +38,7 @@ "generate:local_package": "pnpm build && .scripts/generate_npm_package", "lint": "pnpm exec biome lint --write --no-errors-on-unmatched ./src", "lint:check": "pnpm exec biome lint ./src", + "tailwind:build": "pnpm exec tailwindcss -i ./src/styles/globals.css -c tailwind.config.mjs -o dist/styles/main.min.css --minify", "transpile": "pnpm exec tsc -p tsconfig.json", "prepare": "husky" }, @@ -42,11 +46,19 @@ "@dynamic-labs/ethereum": "4.14.0", "@dynamic-labs/sdk-react-core": "4.14.0", "@fleek-platform/utils-token": "^0.2.2", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@tailwindcss/aspect-ratio": "^0.4.2", "@types/lodash-es": "^4.17.12", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "dotenv": "^16.4.7", "lodash-es": "^4.17.21", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-icons": "^5.5.0", + "tailwind-merge": "^3.0.2", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", "use-debounce": "^10.0.4", "viem": "^2.21.55", "zustand": "^5.0.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7921367..4cf712a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,9 +17,21 @@ importers: '@fleek-platform/utils-token': specifier: ^0.2.2 version: 0.2.3 + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.6 + version: 2.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tailwindcss/aspect-ratio': + specifier: ^0.4.2 + version: 0.4.2(tailwindcss@3.4.17) '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 dotenv: specifier: ^16.4.7 version: 16.4.7 @@ -32,6 +44,18 @@ importers: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.5.0 + version: 5.5.0(react@18.3.1) + tailwind-merge: + specifier: ^3.0.2 + version: 3.0.2 + tailwindcss: + specifier: ^3.4.17 + version: 3.4.17 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) use-debounce: specifier: ^10.0.4 version: 10.0.4(react@18.3.1) @@ -81,6 +105,10 @@ packages: '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1119,6 +1147,21 @@ packages: resolution: {integrity: sha512-GJNva0JzFnE4kZBm8/37ZhdlNUMGaoiyzdo45WoxhLhGK0DYoGxdwDGPmMcs7fALoE3EhvB/ZsbUuFiX/owBeg==} engines: {node: '>=18.18.2'} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -1256,6 +1299,10 @@ packages: cpu: [x64] os: [win32] + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@isaacs/ttlcache@1.4.1': resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} engines: {node: '>=12'} @@ -1500,6 +1547,267 @@ packages: resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'The package is now available as "qr": npm install qr' + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-arrow@1.1.2': + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.2': + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.5': + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.6': + resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.2': + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.6': + resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.2': + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.4': + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.2': + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.2': + resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.2': + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@react-native-community/cli-clean@13.6.4': resolution: {integrity: sha512-nS1BJ+2Z+aLmqePxB4AYgJ+C/bgQt02xAgSYtCUv+lneRBGhL2tHRrK8/Iolp0y+yQoUtHHf4txYi90zGXLVfw==} @@ -1647,6 +1955,11 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@tailwindcss/aspect-ratio@0.4.2': + resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==} + peerDependencies: + tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1' + '@thumbmarkjs/thumbmarkjs@0.16.0': resolution: {integrity: sha512-NKyqCvP6DZKlRf6aGfnKS6Kntn2gnuBxa/ztstjy+oo1t23EHzQ54shtli0yV5WAtygmK1tti/uL2C2p/kW3HQ==} @@ -1876,6 +2189,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1888,6 +2205,13 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1895,9 +2219,16 @@ packages: appdirsjs@1.2.7: resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1984,6 +2315,9 @@ packages: brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2054,6 +2388,10 @@ packages: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -2062,8 +2400,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001699: - resolution: {integrity: sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==} + caniuse-lite@1.0.30001707: + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -2088,6 +2426,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -2115,6 +2456,10 @@ packages: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2147,6 +2492,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -2206,6 +2555,11 @@ packages: crossws@0.3.4: resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2299,6 +2653,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -2306,6 +2663,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -2317,6 +2677,9 @@ packages: duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eciesjs@0.4.14: resolution: {integrity: sha512-eJAgf9pdv214Hn98FlUzclRMYWF7WfoLlkS9nWMTm1qcCwn6Ad4EGD9lr9HXMBfSrZhYQujRE+p0adPRkctC6A==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} @@ -2333,6 +2696,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} @@ -2532,6 +2898,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + formik@2.2.9: resolution: {integrity: sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==} peerDependencies: @@ -2572,6 +2942,10 @@ packages: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2584,6 +2958,14 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -2832,6 +3214,9 @@ packages: peerDependencies: ws: '*' + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2860,6 +3245,10 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} @@ -2932,6 +3321,13 @@ packages: lighthouse-logger@1.4.2: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lit-element@3.3.3: resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} @@ -3110,9 +3506,17 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -3138,6 +3542,9 @@ packages: multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoclone@0.2.1: resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} @@ -3223,6 +3630,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} @@ -3314,6 +3725,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.9: resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} @@ -3344,6 +3758,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3355,6 +3773,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -3396,6 +3818,47 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + preact@10.25.4: resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==} @@ -3510,6 +3973,11 @@ packages: react-native: optional: true + react-icons@5.5.0: + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} + peerDependencies: + react: '*' + react-international-phone@4.2.5: resolution: {integrity: sha512-jXxeEG5jvwivwSb/ImIIwIH1lSGD6VSy4W2CaInBiXo2PWnDj2BTzC0sAyZzNJarT7NX9kPdUHyGyyfziS5Rpw==} peerDependencies: @@ -3550,15 +4018,48 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-shallow-renderer@16.15.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -3776,6 +4277,10 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -3835,6 +4340,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -3849,6 +4358,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3864,6 +4377,11 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + sudo-prompt@9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -3880,6 +4398,19 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -3897,6 +4428,13 @@ packages: engines: {node: '>=10'} hasBin: true + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@0.15.2: resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} @@ -3937,6 +4475,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -4201,6 +4742,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -4326,6 +4871,8 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -5703,12 +6250,29 @@ snapshots: dependencies: nanoid: 3.3.8 - '@fleek-platform/utils-token@0.2.3': - dependencies: - '@fleek-platform/errors': 2.8.0 - jose: 4.11.2 - jscrypto: 1.0.3 - nanoid: 3.3.8 + '@fleek-platform/utils-token@0.2.3': + dependencies: + '@fleek-platform/errors': 2.8.0 + jose: 4.11.2 + jscrypto: 1.0.3 + nanoid: 3.3.8 + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.9': {} '@hapi/hoek@9.3.0': {} @@ -5820,6 +6384,15 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/ttlcache@1.4.1': {} '@jest/create-cache-key-function@29.7.0': @@ -6153,6 +6726,241 @@ snapshots: '@paulmillr/qr@0.2.1': {} + '@pkgjs/parseargs@0.11.0': + optional: true + + '@radix-ui/primitive@1.1.1': {} + + '@radix-ui/react-arrow@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-menu': 2.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-menu@2.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-popper@1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-portal@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/rect@1.1.0': {} + '@react-native-community/cli-clean@13.6.4': dependencies: '@react-native-community/cli-tools': 13.6.4 @@ -6504,6 +7312,10 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.17)': + dependencies: + tailwindcss: 3.4.17 + '@thumbmarkjs/thumbmarkjs@0.16.0': {} '@turnkey/api-key-stamper@0.4.3': @@ -7061,6 +7873,8 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -7071,6 +7885,10 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -7078,10 +7896,16 @@ snapshots: appdirsjs@1.2.7: {} + arg@5.0.2: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + array-union@2.1.0: {} asap@2.0.6: {} @@ -7171,6 +7995,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -7179,7 +8007,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001699 + caniuse-lite: 1.0.30001707 electron-to-chromium: 1.5.97 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -7260,11 +8088,13 @@ snapshots: callsites@2.0.0: {} + camelcase-css@2.0.1: {} + camelcase@5.3.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001699: {} + caniuse-lite@1.0.30001707: {} chalk@4.1.2: dependencies: @@ -7298,6 +8128,10 @@ snapshots: ci-info@3.9.0: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -7326,6 +8160,8 @@ snapshots: clsx@1.2.1: {} + clsx@2.1.1: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -7356,6 +8192,8 @@ snapshots: commander@2.20.3: {} + commander@4.1.1: {} + commander@9.5.0: {} commondir@1.0.1: {} @@ -7430,6 +8268,8 @@ snapshots: dependencies: uncrypto: 0.1.3 + cssesc@3.0.0: {} + csstype@3.1.3: {} date-fns@2.30.0: @@ -7488,12 +8328,16 @@ snapshots: detect-node-es@1.1.0: {} + didyoumean@1.2.2: {} + dijkstrajs@1.0.3: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + dlv@1.1.3: {} + dotenv@16.4.7: {} dunder-proto@1.0.1: @@ -7509,6 +8353,8 @@ snapshots: readable-stream: 3.6.2 stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} + eciesjs@0.4.14: dependencies: '@ecies/ciphers': 0.2.3(@noble/ciphers@1.2.1) @@ -7532,6 +8378,8 @@ snapshots: emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + encode-utf8@1.0.3: {} encodeurl@1.0.2: {} @@ -7754,6 +8602,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + formik@2.2.9(react@18.3.1): dependencies: deepmerge: 2.2.1 @@ -7803,6 +8656,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -7814,6 +8669,19 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -8052,6 +8920,12 @@ snapshots: dependencies: ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -8106,6 +8980,8 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jiti@1.21.7: {} + joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -8183,6 +9059,10 @@ snapshots: transitivePeerDependencies: - supports-color + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + lit-element@3.3.3: dependencies: '@lit-labs/ssr-dom-shim': 1.3.0 @@ -8469,8 +9349,14 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.1.2: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -8494,6 +9380,12 @@ snapshots: multiformats@9.9.0: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoclone@0.2.1: {} nanoid@3.3.8: {} @@ -8550,6 +9442,8 @@ snapshots: object-assign@4.1.1: {} + object-hash@3.0.0: {} + ofetch@1.4.1: dependencies: destr: 2.0.3 @@ -8647,6 +9541,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.9: {} parse-json@4.0.0: @@ -8666,12 +9562,19 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-type@4.0.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} + pify@2.3.0: {} + pify@4.0.1: {} pino-abstract-transport@0.5.0: @@ -8727,6 +9630,43 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-import@15.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.5.3): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + postcss-load-config@4.0.2(postcss@8.5.3): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.5.3 + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact@10.25.4: {} prettier@2.8.8: {} @@ -8850,6 +9790,10 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-native: 0.74.0(@babel/core@7.26.8)(@babel/preset-env@7.26.8(@babel/core@7.26.8))(@types/react@18.3.18)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10) + react-icons@5.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + react-international-phone@4.2.5(react@18.3.1): dependencies: react: 18.3.1 @@ -8923,16 +9867,47 @@ snapshots: react-refresh@0.14.2: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.18 + react-shallow-renderer@16.15.0(react@18.3.1): dependencies: object-assign: 4.1.1 react: 18.3.1 react-is: 18.3.1 + react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + react@18.3.1: dependencies: loose-envify: 1.4.0 + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -9194,6 +10169,8 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -9240,6 +10217,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -9256,6 +10239,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-bom@3.0.0: {} strip-final-newline@2.0.0: {} @@ -9264,6 +10251,16 @@ snapshots: strnum@1.0.5: {} + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + sudo-prompt@9.2.1: {} supports-color@7.2.0: @@ -9276,6 +10273,39 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tailwind-merge@3.0.2: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + dependencies: + tailwindcss: 3.4.17 + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + temp-dir@2.0.0: {} temp@0.8.4: @@ -9291,6 +10321,14 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + thread-stream@0.15.2: dependencies: real-require: 0.1.0 @@ -9326,6 +10364,8 @@ snapshots: tr46@0.0.3: {} + ts-interface-checker@0.1.13: {} + tslib@1.14.1: {} tslib@2.4.1: {} @@ -9527,6 +10567,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@2.4.3: diff --git a/src/components/AuthButton/AuthDropdown.tsx b/src/components/AuthButton/AuthDropdown.tsx new file mode 100644 index 0000000..eb401d1 --- /dev/null +++ b/src/components/AuthButton/AuthDropdown.tsx @@ -0,0 +1,34 @@ +import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu'; + +import { Root } from '@radix-ui/react-dropdown-menu'; +import { FiLogOut } from 'react-icons/fi'; +import { AvatarMarble } from '../../ui/AvatarMarble'; +import { Content, Item } from '../../ui/Dropdown'; +import { useAuthStore } from '../../store/authStore'; +import type { LoginProviderChildrenProps } from '../../providers/LoginProvider'; + +type AuthDropdownProps = React.PropsWithChildren>; + +export const AuthDropdown = ({ children, ...props }: AuthDropdownProps) => { + const { logout } = props; + const { userProfile } = useAuthStore(); + + return ( + + + {userProfile?.avatar ? ( + Your avatar + ) : ( + + )} + + + {children} + +
Disconnect
+ +
+
+
+ ); +}; diff --git a/src/components/AuthButton/index.tsx b/src/components/AuthButton/index.tsx new file mode 100644 index 0000000..b0784a8 --- /dev/null +++ b/src/components/AuthButton/index.tsx @@ -0,0 +1,55 @@ +import type { ElementType, ComponentPropsWithoutRef, ReactNode } from 'react'; +import type { LoginProviderChildrenProps } from '../../providers/LoginProvider'; +import { AuthDropdown } from './AuthDropdown'; + +export interface AuthButtonProps extends LoginProviderChildrenProps { + text?: { + default?: string; + loading?: string; + error?: string; + loggedIn?: string; + }; + ButtonComponent?: T; + dropdown?: boolean; + children?: ReactNode; +} + +export const AuthButton = ({ + accessToken, + isLoading, + error, + login, + logout, + text, + ButtonComponent, + dropdown, + children, + ...props +}: AuthButtonProps & ComponentPropsWithoutRef) => { + const Button = ButtonComponent || 'button'; + + const handleClick = () => (accessToken ? logout() : login()); + + if (dropdown && accessToken) { + return {children}; + } + + // Default button texts + const defaultText = text?.default || 'Login'; + const loadingText = text?.loading || 'Loading...'; + const errorText = text?.error || 'Login failed'; + const loggedInText = text?.loggedIn || 'Log out'; + + // Determine the displayed text + let buttonText = defaultText; + if (isLoading) buttonText = loadingText; + if (error) buttonText = errorText; + if (accessToken) buttonText = loggedInText; + + // If not authenticated, render the simple button + return ( + + ); +}; diff --git a/src/defined.ts b/src/defined.ts index c0147dd..61853bc 100644 --- a/src/defined.ts +++ b/src/defined.ts @@ -1,11 +1,15 @@ export type Defined = { PUBLIC_GRAPHQL_API_URL?: string; PUBLIC_DYNAMIC_ENVIRONMENT_ID?: string; + PUBLIC_APP_HOSTING_URL?: string; + PUBLIC_APP_AGENTS_URL?: string; }; export const defined: Defined = { PUBLIC_GRAPHQL_API_URL: process.env.PUBLIC_GRAPHQL_API_URL, PUBLIC_DYNAMIC_ENVIRONMENT_ID: process.env.PUBLIC_DYNAMIC_ENVIRONMENT_ID, + PUBLIC_APP_HOSTING_URL: process.env.PUBLIC_APP_HOSTING_URL, + PUBLIC_APP_AGENTS_URL: process.env.PUBLIC_APP_AGENTS_URL, }; export const getDefined = (key: keyof typeof defined): string => { @@ -21,3 +25,9 @@ export const getDefined = (key: keyof typeof defined): string => { return value; }; + +// Use to override `defined` +export const setDefined = (settings: Partial) => { + const override = { ...defined, ...settings }; + Object.assign(defined, override); +}; diff --git a/src/index.ts b/src/index.ts index a22fb12..418ef87 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,3 +10,8 @@ export { cookies } from './utils/cookies'; export type { AuthStore } from './store/authStore'; export type { ConfigStore } from './store/configStore'; +export { AuthButton } from './components/AuthButton'; + +export { ProductDropdown, type Product } from './ui/ProductDropdown'; + +export { setDefined } from './defined'; diff --git a/src/providers/DynamicProvider.tsx b/src/providers/DynamicProvider.tsx index 2d9898d..dee2b0b 100644 --- a/src/providers/DynamicProvider.tsx +++ b/src/providers/DynamicProvider.tsx @@ -14,12 +14,11 @@ import { generateUserSessionDetails, me, project } from '../api/graphql-client'; import { type TriggerLoginModal, type TriggerLogout, useAuthStore, type ReinitializeSdk, type UserProfile } from '../store/authStore'; import { cookies } from '../utils/cookies'; import type { LoginProviderChildrenProps } from './LoginProvider'; -import { clearUserSessionKeys, isTouchDevice } from '../utils/browser'; import { decodeAccessToken, truncateMiddle, isTokenExpired } from '../utils/token'; -import cssOverrides from '../css/index.css'; +import { clearUserSessionKeys, isTouchDevice } from '../utils/browser'; import { hasLocalStorageItems } from '../utils/store'; -import { debounce } from 'lodash-es'; import { useDebouncedCallback } from 'use-debounce'; +import cssOverrides from '../styles/dynamicOverrides.css'; type HasDataCommonError = { error: { @@ -46,9 +45,7 @@ const DynamicUtils = ({ onLogout, setReinitializeSdk, }: DynamicUtilsProps) => { - const { - updateAccessTokenByProjectId, - } = useAuthStore(); + const { updateAccessTokenByProjectId } = useAuthStore(); const { sdkHasLoaded, setShowAuthFlow, handleLogOut } = useDynamicContext(); const reinitializeSdk = useReinitialize(); @@ -106,15 +103,12 @@ const DynamicUtils = ({ if (!accessToken) return; const check = async () => { - const { exp, projectId } = decodeAccessToken(accessToken); + const { exp, projectId } = decodeAccessToken(accessToken); // TODO: The expiration Offset is used for debugging // can be removed in the future - const expirationOffset = cookies.get('expirationOffset') - const computedExpiration = - expirationOffset - ? exp - Number(expirationOffset) - : exp; - + const expirationOffset = cookies.get('expirationOffset'); + const computedExpiration = expirationOffset ? exp - Number(expirationOffset) : exp; + const hasExpiredToken = isTokenExpired(computedExpiration); if (hasExpiredToken) { @@ -137,7 +131,7 @@ const DynamicUtils = ({ }; check(); - }, [accessToken]); + }, [accessToken, graphqlApiUrl, onLogout, updateAccessTokenByProjectId]); return null; }; @@ -299,7 +293,7 @@ export const DynamicProvider: FC = ({ children, graphqlApi const onAuthInit = () => setAuthenticating(true); - // The following to mitigate an issue reported in ticket + // The following to mitigate an issue reported in ticket // https://linear.app/fleekxyz/issue/PLAT-2777 // e.g. on wallet signup can't type email. // The following is a temporary solution @@ -315,7 +309,7 @@ export const DynamicProvider: FC = ({ children, graphqlApi } typeof triggerLoginModal === 'function' && triggerLoginModal(true); - } + }; // TODO: Remove useCallback to inspect re-triggers const onAuthSuccess = useCallback( @@ -410,7 +404,7 @@ export const DynamicProvider: FC = ({ children, graphqlApi /> {/* Warning: The following is a quick solution for https://linear.app/fleekxyz/issue/PLAT-2777; It's not a long term solution; See customLogin() patched implementation */}
- +
{children({ accessToken, diff --git a/src/css/index.css b/src/styles/dynamicOverrides.css similarity index 98% rename from src/css/index.css rename to src/styles/dynamicOverrides.css index 4989d1f..a0ab7e3 100644 --- a/src/css/index.css +++ b/src/styles/dynamicOverrides.css @@ -109,7 +109,7 @@ .modal form .typography-button__content { height: 2.5em; - justify-content: center; + justify-content: center; } @media (max-width: 640px) { diff --git a/src/styles/globals.css b/src/styles/globals.css new file mode 100644 index 0000000..a62e6ef --- /dev/null +++ b/src/styles/globals.css @@ -0,0 +1,20 @@ +@import "./typography.css"; + +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + /* Font antialising */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + font-size: 62.5%; + color-scheme: dark; + } + + body { + font-feature-settings: "ss01" 1; + } +} diff --git a/src/styles/typography.css b/src/styles/typography.css new file mode 100644 index 0000000..4a7dc1d --- /dev/null +++ b/src/styles/typography.css @@ -0,0 +1,113 @@ +/* TODO: Fallback to host fonts instead of exporting, e.g. fleek.xyz/fonts/atyp; Once the design system is put in place this can be dismissed */ +@layer base { + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-LightItalic.woff2") format("woff"); + font-weight: 300; + font-style: italic; + font-display: block; + } + + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-Regular.woff2") format("woff"); + font-weight: 400; + font-style: normal; + font-display: block; + } + + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-Medium.woff2") format("woff"); + font-weight: 500; + font-style: normal; + font-display: block; + } + + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-Semibold.woff2") format("woff"); + font-weight: 600; + font-style: normal; + font-display: block; + } + + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-SemiboldItalic.woff2") format("woff"); + font-weight: 600; + font-style: italic; + font-display: block; + } + + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-Bold.woff2") format("woff"); + font-weight: 800; + font-style: normal; + font-display: block; + } + + @font-face { + font-family: AtypDisplay; + src: url("/fonts/atyp/AtypDisplay-BoldItalic.woff2") format("woff"); + font-weight: 700; + font-style: italic; + font-display: block; + } + + @font-face { + font-family: "IBM Plex Mono"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("/fonts/ibm-plex-mono/IBMPlexMono-Regular.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + @font-face { + font-family: "IBM Plex Mono"; + font-style: normal; + font-weight: 500; + font-display: block; + src: url("/fonts/ibm-plex-mono/IBMPlexMono-Medium.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + @font-face { + font-family: "IBM Plex Mono"; + font-style: normal; + font-weight: 700; + font-display: block; + src: url("/fonts/ibm-plex-mono/IBMPlexMono-Bold.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + @font-face { + font-family: "IBM Plex Sans"; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("/fonts/ibm-plex-sans/IBMPlexSans-Regular.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + @font-face { + font-family: "IBM Plex Sans"; + font-style: normal; + font-weight: 500; + font-display: block; + src: url("/fonts/ibm-plex-sans/IBMPlexSans-Medium.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + @font-face { + font-family: "IBM Plex Sans"; + font-style: normal; + font-weight: 700; + font-display: block; + src: url("/fonts/ibm-plex-sans/IBMPlexSans-Bold.woff2") format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, + U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } +} diff --git a/src/ui/AvatarMarble.tsx b/src/ui/AvatarMarble.tsx new file mode 100644 index 0000000..b85e754 --- /dev/null +++ b/src/ui/AvatarMarble.tsx @@ -0,0 +1,55 @@ +import { generateColors } from '../utils/avatarColor'; +import { uuid } from '../utils/uuid'; +import type { ComponentProps } from 'react'; + +const AVATAR_SIZE = 80; + +type AvatarMarbleProps = ComponentProps<'svg'> & { + name?: string; +}; + +const colors = ['#FFFF57', '#7B7B7B', '#5ADBFF', '#FE9000', '#FFCAE9']; + +export const AvatarMarble: React.FC = ({ name = '', ...props }) => { + const properties = generateColors({ name, colors }); + const maskID = uuid(); + const filterID = `filter-${uuid()}`; + + return ( + + {name}'s avatar + + + + + + {Array.from({ length: 3 }).map((_, idx) => { + const id = idx + 1; + const isOverlay = id !== 1; + const basePath = 'M32.414 59.35L50.376 70.5H72.5v-71H33.728L26.5 13.381l19.057 27.08L32.414 59.35z'; + const overlayPath = 'M22.216 24L0 46.75l14.108 38.129L78 86l-3.081-59.276-22.378 4.005 12.972 20.186-23.35 27.395L22.215 24z'; + + return ( + + ); + })} + + + + + + + + + + ); +}; diff --git a/src/ui/Box.tsx b/src/ui/Box.tsx new file mode 100644 index 0000000..8173ce4 --- /dev/null +++ b/src/ui/Box.tsx @@ -0,0 +1,21 @@ +import { cn } from '../utils/cn'; +import { cva, type VariantProps } from 'class-variance-authority'; +import React, { type PropsWithChildren } from 'react'; + +export const boxVariants = cva('flex flex-col', { + variants: { + variant: { + container: 'bg-elz-neutral-1 p-16 gap-16 rounded-12 border border-elz-neutral-6 overflow-hidden', + }, + }, +}); + +export type BoxProps = PropsWithChildren & React.HTMLAttributes & VariantProps; + +export const Box = React.forwardRef(({ children, variant, className, ...props }, ref) => { + return ( +
+ {children} +
+ ); +}); diff --git a/src/ui/Button.tsx b/src/ui/Button.tsx new file mode 100644 index 0000000..6af8e87 --- /dev/null +++ b/src/ui/Button.tsx @@ -0,0 +1,78 @@ +import { forwardRef, type Ref, type PropsWithChildren } from 'react'; +import { type VariantProps, cva } from 'class-variance-authority'; +import { cn } from '../utils/cn'; +import type { Target } from './Link'; +import Link from './Link'; + +export const buttonVariants = cva( + 'flex min-w-fit font-medium no-underline gap-4 select-none font-elz-plex-sans cursor-pointer items-center justify-center transition-all ring-0 outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:bg-elz-neutral-3 disabled:text-elz-neutral-8', + { + variants: { + variant: { + neutral: 'text-elz-neutral-11 bg-elz-neutral-3 hover:bg-elz-neutral-4 active:bg-elz-neutral-5 focus-visible:ring-elz-neutral-8', + accent: 'text-elz-accent-11 bg-elz-accent-3 hover:bg-elz-accent-4 active:bg-elz-accent-5 focus-visible:ring-elz-accent-8', + success: 'text-elz-success-11 bg-elz-success-3 hover:bg-elz-success-4 active:bg-elz-success-5 focus-visible:ring-elz-success-8', + warning: 'text-elz-warning-11 bg-elz-warning-3 hover:bg-elz-warning-4 active:bg-elz-warning-5 focus-visible:ring-elz-warning-8', + danger: 'text-elz-danger-11 bg-elz-danger-3 hover:bg-elz-danger-4 active:bg-elz-danger-5 focus-visible:ring-elz-danger-8', + ghost: + 'text-elz-neutral-11 bg-transparent hover:bg-elz-neutral-4 active:bg-elz-neutral-5 disabled:bg-transparent focus-visible:ring-elz-neutral-8', + 'ghost-bordered': + 'text-elz-neutral-11 bg-transparent hover:bg-elz-neutral-4 active:bg-elz-neutral-5 disabled:bg-transparent focus-visible:ring-elz-neutral-8 border border-elz-neutral-6', + primary: + 'bg-elz-accent-9 hover:bg-elz-accent-10 active:bg-elz-accent-9 text-elz-accent-1 ring-elz-accent-8 disabled:bg-elz-neutral-3 disabled:text-elz-neutral-8 disabled:ring-elz-neutral-3 disabled:cursor-not-allowed', + outline: + 'text-elz-neutral-11 bg-transparent hover:bg-elz-neutral-4 active:bg-elz-neutral-5 disabled:bg-transparent focus-visible:ring-elz-neutral-8 border border-elz-neutral-8', + }, + size: { + xs: 'h-24 gap-4 px-8 rounded-8 text-[1.4rem]', + sm: 'h-32 gap-4 px-8 rounded-8 text-[1.4rem]', + md: 'h-40 gap-8 px-16 rounded-12 text-[1.6rem]', + lg: 'h-44 gap-8 px-16 rounded-12 text-[1.6rem]', + }, + }, + defaultVariants: { + variant: 'accent', + size: 'sm', + }, + }, +); + +export type ButtonProps = PropsWithChildren & + VariantProps & { + id?: string; + href?: string; + className?: string; + target?: Target; + rel?: string; + onClick?: (e?: React.MouseEvent) => void; + } & React.ButtonHTMLAttributes; + +export const Button = forwardRef( + ({ id, children, href, target, rel, onClick, variant, size, className, ...props }, ref) => { + if (href) + return ( + } + id={id} + href={href} + target={target} + rel={rel} + className={cn(buttonVariants({ variant, size }), className)} + > + {children} + + ); + + return ( + + ); + }, +); diff --git a/src/ui/Dropdown.tsx b/src/ui/Dropdown.tsx new file mode 100644 index 0000000..927ec8e --- /dev/null +++ b/src/ui/Dropdown.tsx @@ -0,0 +1,46 @@ +import { + Item as BaseItem, + Content as BaseContent, + type DropdownMenuContentProps, + type DropdownMenuItemProps, + Root as DropDownRoot, +} from '@radix-ui/react-dropdown-menu'; +import { cn } from '../utils/cn'; + +const Root = DropDownRoot; + +export const Content: React.FC = ({ children, className, ...props }) => { + return ( + + {children} + + ); +}; + +export const Item: React.FC = ({ children, className, ...props }) => { + return ( + + {children} + + ); +}; + +export const Dropdown = { + Root, + Content, + Item, +}; diff --git a/src/ui/Link.tsx b/src/ui/Link.tsx new file mode 100644 index 0000000..767f7ee --- /dev/null +++ b/src/ui/Link.tsx @@ -0,0 +1,20 @@ +import type React from 'react'; +import { forwardRef } from 'react'; +import type { PropsWithChildren } from 'react'; + +export enum Target { + Blank = '_blank', + Self = '_self', + Parent = '_parent', + Top = '_top', +} + +const Link = forwardRef>>( + ({ children, ...props }, ref) => ( + + {children} + + ), +); + +export default Link; diff --git a/src/ui/ProductDropdown.tsx b/src/ui/ProductDropdown.tsx new file mode 100644 index 0000000..efed50a --- /dev/null +++ b/src/ui/ProductDropdown.tsx @@ -0,0 +1,119 @@ +import { Dropdown } from './Dropdown'; +import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu'; +import { Text } from './Text'; +import { Box } from './Box'; +import { IoApps, IoBrowsers } from 'react-icons/io5'; +import { Button } from './Button'; +import { RiRobot2Line } from 'react-icons/ri'; +import { cn } from '../utils/cn'; +import { type ReactElement, cloneElement, useState } from 'react'; +import { getDefined } from '../defined'; + +export type Product = { + name: string; + description: string; + icon: ReactElement; + disabled?: boolean; +}; + +const products: Product[] = [ + { + name: 'Agents', + description: 'Create and manage AI agents', + icon: , + }, + { + name: 'Dashboard', + description: 'Hosting and storage solutions', + icon: , + }, +]; + +export type ProductDropdownProps = { + onClick: (product: Product) => void; +}; + +export const ProductDropdown = ({ + defaultSelectedProductName, +}: { + defaultSelectedProductName?: string; +}) => { + const [selectedProduct, setSelecterdProduct] = useState(defaultSelectedProductName); + + const onClick = (product: Product) => { + let url = '#'; + + if (product.name === 'Agents') { + url = getDefined('PUBLIC_APP_AGENTS_URL'); + } else if (product.name === 'Dashboard') { + url = getDefined('PUBLIC_APP_HOSTING_URL'); + } else { + console.error('Unknown product!'); + } + + setSelecterdProduct(product.name); + + window.location.href = url; + }; + + return ( + + + + + + {products.map((product) => { + return ( + onClick(product)} + /> + ); + })} + + + ); +}; + +type ProductDropdownItemProps = { + product: Product; + isActive?: boolean; + onClick: () => void; +}; + +const ProductDropdownItem = ({ product, isActive = false, onClick }: ProductDropdownItemProps) => { + const Icon = () => { + const { className, ...props } = product.icon.props; + return cloneElement(product.icon, { + className: cn('size-16 flex-shrink-0', className), + ...props, + }); + }; + return ( + + + + + + + {product.name} + + + {product.description} + + + + ); +}; diff --git a/src/ui/Text.tsx b/src/ui/Text.tsx new file mode 100644 index 0000000..c6d8e29 --- /dev/null +++ b/src/ui/Text.tsx @@ -0,0 +1,59 @@ +import { cn } from '../utils/cn'; +import { cva, type VariantProps } from 'class-variance-authority'; +import { createElement, forwardRef, type PropsWithChildren } from 'react'; + +const textVariants = cva('font-elz-plex-sans', { + variants: { + variant: { + title: 'text-balance text-[3.6rem] font-semibold text-elz-neutral-12', + description: 'text-[1.6rem] font-medium text-elz-neutral-11', + subtitle: 'text-[1.6rem] text-elz-neutral-12 font-semibold', + feature: 'text-[1.2rem] font-medium uppercase tracking-[0.256rem] text-elz-neutral-11', + primary: 'text-elz-neutral-12', + secondary: 'text-elz-neutral-11', + }, + size: { + '2xs': 'text-[1rem]', + xs: 'text-[1.2rem]', + sm: 'text-[1.4rem]', + md: 'text-[1.6rem]', + lg: 'text-[1.8rem]', + xl: 'text-[2.0rem]', + '2xl': 'text-[2.6rem]', + '3xl': 'text-[3.4rem]', + '4xl': 'text-[5.8rem]', + }, + weight: { + 400: 'font-normal', + 500: 'font-medium', + 700: 'font-bold', + }, + }, + defaultVariants: { + variant: 'title', + }, +}); + +export const validTextElement = ['p', 'span', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const; + +type ValidTextElement = (typeof validTextElement)[number]; + +export type TextProps = PropsWithChildren & + React.HTMLAttributes & + VariantProps & { + as?: ValidTextElement; + }; + +export const Text = forwardRef( + ({ children, as = 'p', variant, size, weight, className, ...props }, ref) => { + return createElement( + as, + { + ref, + className: cn(textVariants({ variant, size, weight }), className), + ...props, + }, + children, + ); + }, +); diff --git a/src/utils/avatarColor.ts b/src/utils/avatarColor.ts new file mode 100644 index 0000000..d4e19ea --- /dev/null +++ b/src/utils/avatarColor.ts @@ -0,0 +1,52 @@ +const AVATAR_SIZE = 24; + +const hashCode = (name: string) => { + let hash = 0; + + for (let i = 0; i < name.length; i++) { + const character = name.charCodeAt(i); + hash = (hash << 5) - hash + character; + hash = hash & hash; // Convert to 32bit integer + } + + return Math.abs(hash); +}; + +const getRandomColor = (number: number, colors: string[], range: number) => { + return colors[number % range]; +}; + +const getDigit = (number: number, ntn: number) => { + return Math.floor((number / 10 ** ntn) % 10); +}; + +const getUnit = (number: number, range: number, index?: number) => { + const value = number % range; + + if (index && getDigit(number, index) % 2 === 0) { + return -value; + } + return value; +}; + +const ELEMENTS = 4; + +type GenerateColorsArgs = { + name: string; + colors: string[]; +}; + +export const generateColors = ({ name, colors }: GenerateColorsArgs) => { + const numFromName = hashCode(name); + const range = colors?.length; + + const elementsProperties = Array.from({ length: ELEMENTS }, (_, i) => ({ + color: getRandomColor(numFromName + i, colors, range), + translateX: getUnit(numFromName * (i + 1), AVATAR_SIZE / 10, 1), + translateY: getUnit(numFromName * (i + 1), AVATAR_SIZE / 10, 2), + scale: 1.2 + getUnit(numFromName * (i + 1), AVATAR_SIZE / 20) / 10, + rotate: getUnit(numFromName * (i + 1), 360, 1), + })); + + return elementsProperties; +}; diff --git a/src/utils/browser.ts b/src/utils/browser.ts index ca26c61..34437b8 100644 --- a/src/utils/browser.ts +++ b/src/utils/browser.ts @@ -35,9 +35,5 @@ export const clearUserSessionKeys = () => { }; export const isTouchDevice = () => { - return ( - ('ontouchstart' in window) || - (navigator.maxTouchPoints > 0) || - (navigator.maxTouchPoints > 0) - ); -} + return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.maxTouchPoints > 0; +}; diff --git a/src/utils/cn.ts b/src/utils/cn.ts new file mode 100644 index 0000000..91bbff2 --- /dev/null +++ b/src/utils/cn.ts @@ -0,0 +1,4 @@ +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs)); diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts new file mode 100644 index 0000000..d6e1bbe --- /dev/null +++ b/src/utils/uuid.ts @@ -0,0 +1 @@ +export const uuid = () => crypto.randomUUID(); diff --git a/tailwind.config.mjs b/tailwind.config.mjs new file mode 100644 index 0000000..9aadc38 --- /dev/null +++ b/tailwind.config.mjs @@ -0,0 +1,21 @@ +import tailwindCustomConfig from "./.tailwind/tailwind.custom.config"; +import tailwindAnimate from "tailwindcss-animate"; + +import { colors } from "./.tailwind/tokens"; +import { fontFamily } from "./.tailwind/fonts"; +import { gridTemplateColumns } from "./.tailwind/gridLayout"; + +export default { + mode: "jit", + important: ".login-button", + presets: [tailwindCustomConfig], + content: ["./src/**/*.{ts,tsx}"], + theme: { + extend: { + fontFamily, + colors, + gridTemplateColumns, + }, + }, + plugins: [tailwindAnimate], +};