Use Prettier for code formatting instead of ESLint (#123)

This commit is contained in:
Konrad Szwarc 2022-12-08 15:34:11 +01:00 committed by GitHub
parent ec12e57ff5
commit 62d771e412
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
43 changed files with 387 additions and 438 deletions

View file

@ -1,27 +1,26 @@
{ {
"root": true, "root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json",
"extraFileExtensions": [".astro"]
},
"settings": {
"import/resolver": {
"typescript": { "project": "./tsconfig.eslint.json" }
}
},
"overrides": [ "overrides": [
{ {
// Files containing TypeScript code.
"files": ["*.ts", "*.tsx", "*.astro"], "files": ["*.ts", "*.tsx", "*.astro"],
"extends": ["plugin:@typescript-eslint/recommended"], "extends": ["plugin:@typescript-eslint/recommended"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.eslint.json",
"extraFileExtensions": [".astro"]
},
"settings": {
"import/resolver": {
"typescript": { "project": "./tsconfig.eslint.json" }
}
},
"rules": { "rules": {
// Create empty interface only when it extends other interface. // Create empty interface only when it extends other interface.
"@typescript-eslint/no-empty-interface": [2, { "allowSingleExtends": true }] "@typescript-eslint/no-empty-interface": [2, { "allowSingleExtends": true }]
} }
}, },
{ {
"files": ["*.tsx"], "files": ["*.ts", "*.tsx"],
"extends": [ "extends": [
"airbnb", "airbnb",
"airbnb-typescript", "airbnb-typescript",
@ -43,20 +42,17 @@
"react/require-default-props": [2, { "functions": "defaultArguments" }] "react/require-default-props": [2, { "functions": "defaultArguments" }]
} }
}, },
{
"files": ["*.ts"],
"extends": [
"airbnb/base",
"airbnb-typescript/base",
"plugin:@typescript-eslint/recommended-requiring-type-checking"
]
},
{ {
"files": ["*.astro"], "files": ["*.astro"],
"globals": { "globals": {
"astroHTML": true "astroHTML": true
}, },
"extends": ["airbnb/base", "airbnb-typescript/base", "plugin:astro/all", "plugin:astro/jsx-a11y-strict"], "extends": [
"airbnb/base",
"airbnb-typescript/base",
"plugin:astro/recommended",
"plugin:astro/jsx-a11y-recommended"
],
"parser": "astro-eslint-parser", "parser": "astro-eslint-parser",
"parserOptions": { "parserOptions": {
"parser": "@typescript-eslint/parser" "parser": "@typescript-eslint/parser"
@ -70,10 +66,9 @@
"extends": ["airbnb/base"] "extends": ["airbnb/base"]
}, },
{ {
// All linted files.
"files": ["*.ts", "*.tsx", "*.astro", "*.cjs"], "files": ["*.ts", "*.tsx", "*.astro", "*.cjs"],
"plugins": ["file-progress", "simple-import-sort"], "plugins": ["file-progress", "simple-import-sort"],
"extends": ["plugin:eslint-comments/recommended", "plugin:prettier/recommended"], "extends": ["plugin:eslint-comments/recommended", "prettier"],
"rules": { "rules": {
// Shows information about currently processing file in the console. // Shows information about currently processing file in the console.
"file-progress/activate": 1, "file-progress/activate": 1,
@ -88,25 +83,9 @@
"import/no-extraneous-dependencies": [2, { "devDependencies": ["astro.config.ts", "tailwind.config.cjs"] }], "import/no-extraneous-dependencies": [2, { "devDependencies": ["astro.config.ts", "tailwind.config.cjs"] }],
// Imports and exports order. // Imports and exports order.
"simple-import-sort/imports": [ "simple-import-sort/imports": 2,
2,
{
"groups": [
["^\\u0000"], // Side effects
["^@?\\w"], // Packages
["^"], // Absolute imports
["^\\."] // Relative imports
]
}
],
"simple-import-sort/exports": 2 "simple-import-sort/exports": 2
} }
},
{
"files": ["**/constants/*.ts"],
"rules": {
"import/prefer-default-export": 0
}
} }
] ]
} }

View file

@ -8,18 +8,32 @@ on:
jobs: jobs:
eslint: eslint:
name: Run ESlint name: Run ESlint check
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
with: with:
node-version: 16 node-version: 16
cache: "npm" cache: 'npm'
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: Run ESLint - name: Run ESLint
run: npm run lint run: npm run eslint:check
prettier:
name: Run Prettier check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run prettier:check
typescript: typescript:
name: Check TypeScript types name: Check TypeScript types
@ -29,11 +43,11 @@ jobs:
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
with: with:
node-version: 16 node-version: 16
cache: "npm" cache: 'npm'
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: Run TypeScript types check - name: Run TypeScript types check
run: npm run lint:ts run: npm run ts:check
build: build:
name: Build project name: Build project
@ -43,8 +57,8 @@ jobs:
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
with: with:
node-version: 16 node-version: 16
cache: "npm" cache: 'npm'
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
- name: Run TypeScript types check - name: Run Astro build command
run: npm run build run: npm run build

View file

@ -2,4 +2,9 @@
# See: https://prettier.io/docs/en/configuration.html#editorconfig # See: https://prettier.io/docs/en/configuration.html#editorconfig
singleQuote: true singleQuote: true
endOfLine: auto endOfLine: 'auto'
pluginSearchDirs: false
plugins:
- 'prettier-plugin-astro'
- 'prettier-plugin-tailwindcss'

11
.vscode/settings.json vendored
View file

@ -8,11 +8,10 @@
"tailwindCSS.classAttributes": ["class", "className", "class:list"], "tailwindCSS.classAttributes": ["class", "className", "class:list"],
"typescript.tsdk": "node_modules/typescript/lib", "typescript.tsdk": "node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true, "typescript.enablePromptUseWorkspaceTsdk": true,
"[astro]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, "[astro]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, "[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[javascript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, "[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[typescript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint" }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"[typescriptreact]": { "[typescriptreact]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
"editor.defaultFormatter": "dbaeumer.vscode-eslint" "prettier.documentSelectors": ["**/*.astro"]
}
} }

View file

@ -2,8 +2,8 @@
Template for creating a comprehensive virtual CV for developers. Template for creating a comprehensive virtual CV for developers.
## 🚀 How to use ## 🚀 How to use
Just click this button 👇 Just click this button 👇
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/KonradSzwarc/devscard#NODE_VERSION=16) [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/KonradSzwarc/devscard#NODE_VERSION=16)
@ -22,4 +22,3 @@ All commands are run from the root of the project, from a terminal:
| `npm run preview` | Preview your build locally, before deploying | | `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` | | `npm run astro ...` | Run CLI commands like `astro add`, `astro preview` |
| `npm run astro --help` | Get help using the Astro CLI | | `npm run astro --help` | Get help using the Astro CLI |

364
package-lock.json generated
View file

@ -12,7 +12,6 @@
"@iconify-icon/react": "1.0.2", "@iconify-icon/react": "1.0.2",
"@tippyjs/react": "4.2.6", "@tippyjs/react": "4.2.6",
"clsx": "1.2.1", "clsx": "1.2.1",
"prettier-plugin-astro": "0.7.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-use": "17.4.0" "react-use": "17.4.0"
@ -22,8 +21,8 @@
"@astrojs/tailwind": "2.1.3", "@astrojs/tailwind": "2.1.3",
"@types/react": "18.0.26", "@types/react": "18.0.26",
"@types/react-dom": "18.0.9", "@types/react-dom": "18.0.9",
"@typescript-eslint/eslint-plugin": "5.45.1", "@typescript-eslint/eslint-plugin": "5.46.0",
"@typescript-eslint/parser": "5.45.1", "@typescript-eslint/parser": "5.46.0",
"astro": "1.6.12", "astro": "1.6.12",
"eslint": "8.29.0", "eslint": "8.29.0",
"eslint-config-airbnb": "19.0.4", "eslint-config-airbnb": "19.0.4",
@ -35,16 +34,17 @@
"eslint-plugin-file-progress": "1.3.0", "eslint-plugin-file-progress": "1.3.0",
"eslint-plugin-import": "2.26.0", "eslint-plugin-import": "2.26.0",
"eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.31.11", "eslint-plugin-react": "7.31.11",
"eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-simple-import-sort": "8.0.0", "eslint-plugin-simple-import-sort": "8.0.0",
"iconify-icon-names": "1.1.0", "iconify-icon-names": "1.1.0",
"locales-ts": "1.0.0", "locales-ts": "1.0.0",
"postcss": "8.4.19", "postcss": "8.4.19",
"prettier": "2.8.0", "prettier": "2.8.1",
"prettier-plugin-astro": "0.7.0",
"prettier-plugin-tailwindcss": "0.2.0",
"tailwindcss": "3.2.4", "tailwindcss": "3.2.4",
"typescript": "4.9.3" "typescript": "4.9.4"
}, },
"engines": { "engines": {
"node": ">=14", "node": ">=14",
@ -74,7 +74,8 @@
"node_modules/@astrojs/compiler": { "node_modules/@astrojs/compiler": {
"version": "0.29.16", "version": "0.29.16",
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.29.16.tgz", "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.29.16.tgz",
"integrity": "sha512-1CCf+dktc8IQCdmsNNSIor3rcJE5OIirFnFtQWp1VUxqCacefqRRlsl9lH7JcKKpRvz1taL43yHYJP8dxNfVww==" "integrity": "sha512-1CCf+dktc8IQCdmsNNSIor3rcJE5OIirFnFtQWp1VUxqCacefqRRlsl9lH7JcKKpRvz1taL43yHYJP8dxNfVww==",
"dev": true
}, },
"node_modules/@astrojs/image": { "node_modules/@astrojs/image": {
"version": "0.12.0", "version": "0.12.0",
@ -864,6 +865,7 @@
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
"integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
"dev": true,
"dependencies": { "dependencies": {
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -1127,14 +1129,14 @@
"dev": true "dev": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz",
"integrity": "sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==", "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/scope-manager": "5.46.0",
"@typescript-eslint/type-utils": "5.45.1", "@typescript-eslint/type-utils": "5.46.0",
"@typescript-eslint/utils": "5.45.1", "@typescript-eslint/utils": "5.46.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0", "natural-compare-lite": "^1.4.0",
@ -1175,14 +1177,14 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz",
"integrity": "sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==", "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/scope-manager": "5.46.0",
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/typescript-estree": "5.46.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -1202,13 +1204,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz",
"integrity": "sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==", "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/visitor-keys": "5.45.1" "@typescript-eslint/visitor-keys": "5.46.0"
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1219,13 +1221,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz",
"integrity": "sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==", "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/typescript-estree": "5.46.0",
"@typescript-eslint/utils": "5.45.1", "@typescript-eslint/utils": "5.46.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"tsutils": "^3.21.0" "tsutils": "^3.21.0"
}, },
@ -1246,9 +1248,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz",
"integrity": "sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==", "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1259,13 +1261,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz",
"integrity": "sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==", "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/visitor-keys": "5.45.1", "@typescript-eslint/visitor-keys": "5.46.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -1301,16 +1303,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz",
"integrity": "sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==", "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/scope-manager": "5.46.0",
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/typescript-estree": "5.46.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
@ -1342,12 +1344,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz",
"integrity": "sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==", "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
}, },
"engines": { "engines": {
@ -2460,6 +2462,7 @@
"version": "7.0.3", "version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"dependencies": { "dependencies": {
"path-key": "^3.1.0", "path-key": "^3.1.0",
"shebang-command": "^2.0.0", "shebang-command": "^2.0.0",
@ -2623,6 +2626,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -3837,27 +3841,6 @@
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
} }
}, },
"node_modules/eslint-plugin-prettier": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
"integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
"dev": true,
"dependencies": {
"prettier-linter-helpers": "^1.0.0"
},
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"eslint": ">=7.28.0",
"prettier": ">=2.0.0"
},
"peerDependenciesMeta": {
"eslint-config-prettier": {
"optional": true
}
}
},
"node_modules/eslint-plugin-react": { "node_modules/eslint-plugin-react": {
"version": "7.31.11", "version": "7.31.11",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz",
@ -4287,12 +4270,6 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
}, },
"node_modules/fast-diff": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true
},
"node_modules/fast-glob": { "node_modules/fast-glob": {
"version": "3.2.12", "version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -4693,7 +4670,8 @@
"node_modules/globalyzer": { "node_modules/globalyzer": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
"integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
"dev": true
}, },
"node_modules/globby": { "node_modules/globby": {
"version": "11.1.0", "version": "11.1.0",
@ -4727,7 +4705,8 @@
"node_modules/globrex": { "node_modules/globrex": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
"dev": true
}, },
"node_modules/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.10", "version": "4.2.10",
@ -5372,6 +5351,7 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -5389,6 +5369,7 @@
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"dependencies": { "dependencies": {
"is-extglob": "^2.1.1" "is-extglob": "^2.1.1"
}, },
@ -5573,6 +5554,7 @@
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"dev": true,
"dependencies": { "dependencies": {
"is-docker": "^2.0.0" "is-docker": "^2.0.0"
}, },
@ -5584,6 +5566,7 @@
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true,
"bin": { "bin": {
"is-docker": "cli.js" "is-docker": "cli.js"
}, },
@ -5597,7 +5580,8 @@
"node_modules/isexe": { "node_modules/isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
}, },
"node_modules/isobject": { "node_modules/isobject": {
"version": "3.0.1", "version": "3.0.1",
@ -7288,6 +7272,7 @@
"version": "8.4.0", "version": "8.4.0",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
"dev": true,
"dependencies": { "dependencies": {
"define-lazy-prop": "^2.0.0", "define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1", "is-docker": "^2.1.1",
@ -7304,6 +7289,7 @@
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true,
"bin": { "bin": {
"is-docker": "cli.js" "is-docker": "cli.js"
}, },
@ -7486,6 +7472,7 @@
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -7514,7 +7501,8 @@
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -7780,9 +7768,10 @@
} }
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "2.8.0", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
"integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
"dev": true,
"bin": { "bin": {
"prettier": "bin-prettier.js" "prettier": "bin-prettier.js"
}, },
@ -7793,22 +7782,11 @@
"url": "https://github.com/prettier/prettier?sponsor=1" "url": "https://github.com/prettier/prettier?sponsor=1"
} }
}, },
"node_modules/prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"dependencies": {
"fast-diff": "^1.1.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/prettier-plugin-astro": { "node_modules/prettier-plugin-astro": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.7.0.tgz", "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.7.0.tgz",
"integrity": "sha512-ehCUx7MqHWvkHwUmxxAWLsL35pFaCTM5YXQ8xjG/1W6dY2yBhvEks+2aCfjeI5zmMrZNCXkiMQtpznSlLSLrxw==", "integrity": "sha512-ehCUx7MqHWvkHwUmxxAWLsL35pFaCTM5YXQ8xjG/1W6dY2yBhvEks+2aCfjeI5zmMrZNCXkiMQtpznSlLSLrxw==",
"dev": true,
"dependencies": { "dependencies": {
"@astrojs/compiler": "^0.29.3", "@astrojs/compiler": "^0.29.3",
"prettier": "^2.7.1", "prettier": "^2.7.1",
@ -7820,6 +7798,18 @@
"npm": ">=6.14.0" "npm": ">=6.14.0"
} }
}, },
"node_modules/prettier-plugin-tailwindcss": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.0.tgz",
"integrity": "sha512-Ruqig/mdWCSpqdq9WK44nrmqM4BFWTzBPhPGwC5NK3coV9eZntEQPB84MGZbjAg0XQU02jVRHXNRPREBzxvM+A==",
"dev": true,
"engines": {
"node": ">=12.17.0"
},
"peerDependencies": {
"prettier": ">=2.2.0"
}
},
"node_modules/prismjs": { "node_modules/prismjs": {
"version": "1.29.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
@ -8494,7 +8484,8 @@
"node_modules/s.color": { "node_modules/s.color": {
"version": "0.0.15", "version": "0.0.15",
"resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz",
"integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==" "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==",
"dev": true
}, },
"node_modules/sade": { "node_modules/sade": {
"version": "1.8.1", "version": "1.8.1",
@ -8532,6 +8523,7 @@
"version": "0.7.5", "version": "0.7.5",
"resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.5.tgz", "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.5.tgz",
"integrity": "sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==", "integrity": "sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==",
"dev": true,
"dependencies": { "dependencies": {
"suf-log": "^2.5.3" "suf-log": "^2.5.3"
} }
@ -8662,6 +8654,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"dependencies": { "dependencies": {
"shebang-regex": "^3.0.0" "shebang-regex": "^3.0.0"
}, },
@ -8673,6 +8666,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -9063,6 +9057,7 @@
"version": "2.5.3", "version": "2.5.3",
"resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz",
"integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==",
"dev": true,
"dependencies": { "dependencies": {
"s.color": "0.0.15" "s.color": "0.0.15"
} }
@ -9104,6 +9099,7 @@
"version": "0.8.4", "version": "0.8.4",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz",
"integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==",
"dev": true,
"dependencies": { "dependencies": {
"@pkgr/utils": "^2.3.1", "@pkgr/utils": "^2.3.1",
"tslib": "^2.4.0" "tslib": "^2.4.0"
@ -9256,6 +9252,7 @@
"version": "0.2.9", "version": "0.2.9",
"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
"integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
"dev": true,
"dependencies": { "dependencies": {
"globalyzer": "0.1.0", "globalyzer": "0.1.0",
"globrex": "^0.1.2" "globrex": "^0.1.2"
@ -9476,9 +9473,9 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "4.9.3", "version": "4.9.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
"integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
"dev": true, "dev": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
@ -10344,6 +10341,7 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"dependencies": { "dependencies": {
"isexe": "^2.0.0" "isexe": "^2.0.0"
}, },
@ -10535,7 +10533,8 @@
"@astrojs/compiler": { "@astrojs/compiler": {
"version": "0.29.16", "version": "0.29.16",
"resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.29.16.tgz", "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-0.29.16.tgz",
"integrity": "sha512-1CCf+dktc8IQCdmsNNSIor3rcJE5OIirFnFtQWp1VUxqCacefqRRlsl9lH7JcKKpRvz1taL43yHYJP8dxNfVww==" "integrity": "sha512-1CCf+dktc8IQCdmsNNSIor3rcJE5OIirFnFtQWp1VUxqCacefqRRlsl9lH7JcKKpRvz1taL43yHYJP8dxNfVww==",
"dev": true
}, },
"@astrojs/image": { "@astrojs/image": {
"version": "0.12.0", "version": "0.12.0",
@ -11136,6 +11135,7 @@
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
"integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
"dev": true,
"requires": { "requires": {
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -11382,14 +11382,14 @@
"dev": true "dev": true
}, },
"@typescript-eslint/eslint-plugin": { "@typescript-eslint/eslint-plugin": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz",
"integrity": "sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==", "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/scope-manager": "5.46.0",
"@typescript-eslint/type-utils": "5.45.1", "@typescript-eslint/type-utils": "5.46.0",
"@typescript-eslint/utils": "5.45.1", "@typescript-eslint/utils": "5.46.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0", "natural-compare-lite": "^1.4.0",
@ -11410,53 +11410,53 @@
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz",
"integrity": "sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==", "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/scope-manager": "5.46.0",
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/typescript-estree": "5.46.0",
"debug": "^4.3.4" "debug": "^4.3.4"
} }
}, },
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz",
"integrity": "sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==", "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/visitor-keys": "5.45.1" "@typescript-eslint/visitor-keys": "5.46.0"
} }
}, },
"@typescript-eslint/type-utils": { "@typescript-eslint/type-utils": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz",
"integrity": "sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==", "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/typescript-estree": "5.46.0",
"@typescript-eslint/utils": "5.45.1", "@typescript-eslint/utils": "5.46.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"tsutils": "^3.21.0" "tsutils": "^3.21.0"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz",
"integrity": "sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==", "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz",
"integrity": "sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==", "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/visitor-keys": "5.45.1", "@typescript-eslint/visitor-keys": "5.46.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -11476,16 +11476,16 @@
} }
}, },
"@typescript-eslint/utils": { "@typescript-eslint/utils": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz",
"integrity": "sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==", "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/json-schema": "^7.0.9", "@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12", "@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/scope-manager": "5.46.0",
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/typescript-estree": "5.46.0",
"eslint-scope": "^5.1.1", "eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"semver": "^7.3.7" "semver": "^7.3.7"
@ -11503,12 +11503,12 @@
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "5.45.1", "version": "5.46.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz",
"integrity": "sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==", "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.45.1", "@typescript-eslint/types": "5.46.0",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
} }
}, },
@ -12313,6 +12313,7 @@
"version": "7.0.3", "version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": { "requires": {
"path-key": "^3.1.0", "path-key": "^3.1.0",
"shebang-command": "^2.0.0", "shebang-command": "^2.0.0",
@ -12432,7 +12433,8 @@
"define-lazy-prop": { "define-lazy-prop": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
"integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
"dev": true
}, },
"define-properties": { "define-properties": {
"version": "1.1.4", "version": "1.1.4",
@ -13333,15 +13335,6 @@
"semver": "^6.3.0" "semver": "^6.3.0"
} }
}, },
"eslint-plugin-prettier": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
"integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
"dev": true,
"requires": {
"prettier-linter-helpers": "^1.0.0"
}
},
"eslint-plugin-react": { "eslint-plugin-react": {
"version": "7.31.11", "version": "7.31.11",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz",
@ -13555,12 +13548,6 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
}, },
"fast-diff": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
"integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
"dev": true
},
"fast-glob": { "fast-glob": {
"version": "3.2.12", "version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -13857,7 +13844,8 @@
"globalyzer": { "globalyzer": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz",
"integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
"dev": true
}, },
"globby": { "globby": {
"version": "11.1.0", "version": "11.1.0",
@ -13884,7 +13872,8 @@
"globrex": { "globrex": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
"dev": true
}, },
"graceful-fs": { "graceful-fs": {
"version": "4.2.10", "version": "4.2.10",
@ -14344,7 +14333,8 @@
"is-extglob": { "is-extglob": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
}, },
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "3.0.0", "version": "3.0.0",
@ -14356,6 +14346,7 @@
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"requires": { "requires": {
"is-extglob": "^2.1.1" "is-extglob": "^2.1.1"
} }
@ -14467,6 +14458,7 @@
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"dev": true,
"requires": { "requires": {
"is-docker": "^2.0.0" "is-docker": "^2.0.0"
}, },
@ -14474,14 +14466,16 @@
"is-docker": { "is-docker": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true
} }
} }
}, },
"isexe": { "isexe": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
}, },
"isobject": { "isobject": {
"version": "3.0.1", "version": "3.0.1",
@ -15633,6 +15627,7 @@
"version": "8.4.0", "version": "8.4.0",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
"integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
"dev": true,
"requires": { "requires": {
"define-lazy-prop": "^2.0.0", "define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1", "is-docker": "^2.1.1",
@ -15642,7 +15637,8 @@
"is-docker": { "is-docker": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true
} }
} }
}, },
@ -15772,7 +15768,8 @@
"path-key": { "path-key": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
}, },
"path-parse": { "path-parse": {
"version": "1.0.7", "version": "1.0.7",
@ -15795,7 +15792,8 @@
"picocolors": { "picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"dev": true
}, },
"picomatch": { "picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -15963,23 +15961,16 @@
"dev": true "dev": true
}, },
"prettier": { "prettier": {
"version": "2.8.0", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
"integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==" "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
}, "dev": true
"prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"requires": {
"fast-diff": "^1.1.2"
}
}, },
"prettier-plugin-astro": { "prettier-plugin-astro": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.7.0.tgz", "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.7.0.tgz",
"integrity": "sha512-ehCUx7MqHWvkHwUmxxAWLsL35pFaCTM5YXQ8xjG/1W6dY2yBhvEks+2aCfjeI5zmMrZNCXkiMQtpznSlLSLrxw==", "integrity": "sha512-ehCUx7MqHWvkHwUmxxAWLsL35pFaCTM5YXQ8xjG/1W6dY2yBhvEks+2aCfjeI5zmMrZNCXkiMQtpznSlLSLrxw==",
"dev": true,
"requires": { "requires": {
"@astrojs/compiler": "^0.29.3", "@astrojs/compiler": "^0.29.3",
"prettier": "^2.7.1", "prettier": "^2.7.1",
@ -15987,6 +15978,13 @@
"synckit": "^0.8.4" "synckit": "^0.8.4"
} }
}, },
"prettier-plugin-tailwindcss": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.0.tgz",
"integrity": "sha512-Ruqig/mdWCSpqdq9WK44nrmqM4BFWTzBPhPGwC5NK3coV9eZntEQPB84MGZbjAg0XQU02jVRHXNRPREBzxvM+A==",
"dev": true,
"requires": {}
},
"prismjs": { "prismjs": {
"version": "1.29.0", "version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
@ -16484,7 +16482,8 @@
"s.color": { "s.color": {
"version": "0.0.15", "version": "0.0.15",
"resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz",
"integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==" "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==",
"dev": true
}, },
"sade": { "sade": {
"version": "1.8.1", "version": "1.8.1",
@ -16516,6 +16515,7 @@
"version": "0.7.5", "version": "0.7.5",
"resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.5.tgz", "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.5.tgz",
"integrity": "sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==", "integrity": "sha512-NKFP8ddjhUYi6A/iD1cEtzkEs91U61kzqe3lY9SVNuvX7LGc88xnEN0mmsWL7Ol//YTi2GL/ol7b9XZ2+hgXuA==",
"dev": true,
"requires": { "requires": {
"suf-log": "^2.5.3" "suf-log": "^2.5.3"
} }
@ -16610,6 +16610,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": { "requires": {
"shebang-regex": "^3.0.0" "shebang-regex": "^3.0.0"
} }
@ -16617,7 +16618,8 @@
"shebang-regex": { "shebang-regex": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
}, },
"shiki": { "shiki": {
"version": "0.11.1", "version": "0.11.1",
@ -16901,6 +16903,7 @@
"version": "2.5.3", "version": "2.5.3",
"resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz",
"integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==",
"dev": true,
"requires": { "requires": {
"s.color": "0.0.15" "s.color": "0.0.15"
} }
@ -16933,6 +16936,7 @@
"version": "0.8.4", "version": "0.8.4",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz",
"integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==",
"dev": true,
"requires": { "requires": {
"@pkgr/utils": "^2.3.1", "@pkgr/utils": "^2.3.1",
"tslib": "^2.4.0" "tslib": "^2.4.0"
@ -17050,6 +17054,7 @@
"version": "0.2.9", "version": "0.2.9",
"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
"integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
"dev": true,
"requires": { "requires": {
"globalyzer": "0.1.0", "globalyzer": "0.1.0",
"globrex": "^0.1.2" "globrex": "^0.1.2"
@ -17220,9 +17225,9 @@
"dev": true "dev": true
}, },
"typescript": { "typescript": {
"version": "4.9.3", "version": "4.9.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
"integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==",
"dev": true "dev": true
}, },
"unbox-primitive": { "unbox-primitive": {
@ -17738,6 +17743,7 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": { "requires": {
"isexe": "^2.0.0" "isexe": "^2.0.0"
} }

View file

@ -13,17 +13,17 @@
"dev": "astro dev", "dev": "astro dev",
"build": "astro build", "build": "astro build",
"preview": "astro preview", "preview": "astro preview",
"astro": "astro", "eslint:check": "eslint . --ext .cjs,.ts,.tsx,.astro --ignore-path .gitignore",
"lint": "eslint . --ext .cjs,.ts,.tsx,.astro --ignore-path .gitignore", "eslint:write": "npm run eslint:check -- --fix",
"lint:fix": "eslint . --ext .cjs,.ts,.tsx,.astro --ignore-path .gitignore --fix", "prettier:check": "prettier --check --ignore-path .gitignore .",
"lint:ts": "tsc --jsx preserve --skipLibCheck" "prettier:write": "prettier --write --ignore-path .gitignore .",
"ts:check": "tsc --jsx preserve --skipLibCheck"
}, },
"dependencies": { "dependencies": {
"@astrojs/image": "0.12.0", "@astrojs/image": "0.12.0",
"@iconify-icon/react": "1.0.2", "@iconify-icon/react": "1.0.2",
"@tippyjs/react": "4.2.6", "@tippyjs/react": "4.2.6",
"clsx": "1.2.1", "clsx": "1.2.1",
"prettier-plugin-astro": "0.7.0",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-use": "17.4.0" "react-use": "17.4.0"
@ -33,8 +33,8 @@
"@astrojs/tailwind": "2.1.3", "@astrojs/tailwind": "2.1.3",
"@types/react": "18.0.26", "@types/react": "18.0.26",
"@types/react-dom": "18.0.9", "@types/react-dom": "18.0.9",
"@typescript-eslint/eslint-plugin": "5.45.1", "@typescript-eslint/eslint-plugin": "5.46.0",
"@typescript-eslint/parser": "5.45.1", "@typescript-eslint/parser": "5.46.0",
"astro": "1.6.12", "astro": "1.6.12",
"eslint": "8.29.0", "eslint": "8.29.0",
"eslint-config-airbnb": "19.0.4", "eslint-config-airbnb": "19.0.4",
@ -46,15 +46,16 @@
"eslint-plugin-file-progress": "1.3.0", "eslint-plugin-file-progress": "1.3.0",
"eslint-plugin-import": "2.26.0", "eslint-plugin-import": "2.26.0",
"eslint-plugin-jsx-a11y": "6.6.1", "eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-react": "7.31.11", "eslint-plugin-react": "7.31.11",
"eslint-plugin-react-hooks": "4.6.0", "eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-simple-import-sort": "8.0.0", "eslint-plugin-simple-import-sort": "8.0.0",
"iconify-icon-names": "1.1.0", "iconify-icon-names": "1.1.0",
"locales-ts": "1.0.0", "locales-ts": "1.0.0",
"postcss": "8.4.19", "postcss": "8.4.19",
"prettier": "2.8.0", "prettier": "2.8.1",
"prettier-plugin-astro": "0.7.0",
"prettier-plugin-tailwindcss": "0.2.0",
"tailwindcss": "3.2.4", "tailwindcss": "3.2.4",
"typescript": "4.9.3" "typescript": "4.9.4"
} }
} }

View file

@ -4,20 +4,16 @@ import { Image } from '@astrojs/image/components';
import Typography from '@/atoms/typography.astro'; import Typography from '@/atoms/typography.astro';
import type { Book } from '@/types/favorites-section'; import type { Book } from '@/types/favorites-section';
export interface Props extends astroHTML.JSX.HTMLAttributes { export interface Props {
value: Book; value: Book;
} }
const { value, ...props } = Astro.props; const { value } = Astro.props;
const BookTile = 'a';
--- ---
<BookTile <a href={value.url} class="flex w-full flex-col gap-3 transition duration-300 hover:translate-y-2">
href={value.url}
class:list={['flex', 'flex-col', 'gap-3', 'transition', 'duration-300', 'hover:translate-y-2', 'w-full', props.class]}
>
<Image <Image
class:list={['rounded-lg', 'shadow-md', 'aspect-[3/4]', 'object-cover']} class="rounded-lg shadow-md aspect-[3/4] object-cover"
format="webp" format="webp"
fit={'cover'} fit={'cover'}
aspectRatio={3 / 4} aspectRatio={3 / 4}
@ -25,12 +21,12 @@ const BookTile = 'a';
src={value.cover} src={value.cover}
alt={value.title} alt={value.title}
/> />
<div class:list={['tile-content', 'gap-1', 'w-full']}> <div class="tile-content w-full gap-1">
<Typography class:list={['leading-5', 'hover:text-gray-900']} variant="tile-title"> <Typography class="leading-5, hover:text-gray-900" variant="tile-title">
{value.title} {value.title}
</Typography> </Typography>
<Typography variant="tile-subtitle"> <Typography variant="tile-subtitle">
{value.author} {value.author}
</Typography> </Typography>
</div> </div>
</BookTile> </a>

View file

@ -14,6 +14,6 @@ const classes = {
}; };
--- ---
<a href={href} class:list={[classes.main, classes.hover, classes.active, classes.focus]} download={download} <a href={href} class:list={[classes.main, classes.hover, classes.active, classes.focus]} download={download}>
><slot /> <slot />
</a> </a>

View file

@ -1,3 +1,3 @@
<div class:list={['flex', 'flex-col', 'gap-8']}> <div class="flex flex-col gap-8">
<slot /> <slot />
</div> </div>

View file

@ -1 +1 @@
<div class="w-full h-px bg-gray-200 dark:bg-gray-600"></div> <div class="h-px w-full bg-gray-200 dark:bg-gray-600"></div>

View file

@ -18,28 +18,14 @@ const sizeMap: Record<IconButtonSize, string> = {
}; };
const { icon, href, target, size, ...rest } = Astro.props; const { icon, href, target, size, ...rest } = Astro.props;
const classes = {
main: 'flex items-center justify-center rounded text-gray-400 bg-gray-100 dark:bg-gray-600 dark:text-gray-200',
active: 'active:translate-y-px',
focus: 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500',
};
--- ---
<a <a href={href} target={target} class:list={[classes.main, classes.active, classes.focus, sizeMap[size]]} {...rest}>
href={href}
target={target}
class:list={[
'flex',
'items-center',
'justify-center',
'rounded',
'text-gray-400',
'bg-gray-100',
'active:translate-y-px',
'focus:outline-none',
'focus:ring-2',
'focus:ring-offset-2',
'focus:ring-primary-500',
'dark:bg-gray-600',
'dark:text-gray-200',
sizeMap[size],
]}
{...rest}
>
<Icon client:load name={icon} size={16} /> <Icon client:load name={icon} size={16} />
</a> </a>

View file

@ -4,33 +4,29 @@ import { Image } from '@astrojs/image/components';
import Typography from '@/atoms/typography.astro'; import Typography from '@/atoms/typography.astro';
import type { Media } from '@/types/favorites-section'; import type { Media } from '@/types/favorites-section';
export interface Props extends astroHTML.JSX.HTMLAttributes { export interface Props {
value: Media; value: Media;
} }
const { value, ...props } = Astro.props; const { value } = Astro.props;
const MediaTile = 'a';
--- ---
<MediaTile <a href={value.url} class="flex w-full flex-col gap-3 transition duration-300 hover:translate-y-2">
href={value.url}
class:list={['flex', 'flex-col', 'gap-3', 'transition', 'duration-300', 'hover:translate-y-2', 'w-full', props.class]}
>
<Image <Image
class:list={['rounded-lg', 'shadow-md', 'aspect-square', 'object-cover']} class="rounded-lg shadow-md aspect-square object-cover"
fit={'cover'} fit="cover"
format="webp" format="webp"
aspectRatio={1 / 1} aspectRatio={1}
quality={100} quality={100}
src={value.image} src={value.image}
alt={value.title} alt={value.title}
/> />
<div class:list={['tile-content', 'gap-1']}> <div class="tile-content gap-1">
<Typography class:list={['leading-5', 'hover:text-gray-900']} variant="tile-title"> <Typography class="leading-5 hover:text-gray-900" variant="tile-title">
{value.title} {value.title}
</Typography> </Typography>
<Typography variant="tile-subtitle"> <Typography variant="tile-subtitle">
{value.type} {value.type}
</Typography> </Typography>
</div> </div>
</MediaTile> </a>

View file

@ -4,30 +4,26 @@ import { Image } from '@astrojs/image/components';
import Typography from '@/atoms/typography.astro'; import Typography from '@/atoms/typography.astro';
import type { Person } from '@/types/favorites-section'; import type { Person } from '@/types/favorites-section';
export interface Props extends astroHTML.JSX.HTMLAttributes { export interface Props {
value: Person; value: Person;
} }
const { value, ...props } = Astro.props; const { value } = Astro.props;
const PersonTile = 'a';
--- ---
<PersonTile <a href={value.url} class="flex w-full flex-col gap-3 transition duration-300 hover:translate-y-2">
href={value.url}
class:list={['flex', 'flex-col', 'gap-3', 'transition', 'duration-300', 'hover:translate-y-2', 'w-full', props.class]}
>
<Image <Image
class:list={['rounded-lg', 'shadow-md', 'transition', 'duration-300', 'aspect-square', 'object-cover']} class="rounded-lg shadow-md transition duration-300 aspect-square object-cover"
format="webp" format="webp"
fit={'cover'} fit="cover"
quality={100} quality={100}
aspectRatio={1 / 1} aspectRatio={1}
src={value.image} src={value.image}
alt={value.name} alt={value.name}
/> />
<div class:list={['tile-content', 'gap-1']}> <div class="tile-content gap-1">
<Typography class:list={['leading-5', 'hover:text-gray-900']} variant="tile-title"> <Typography class="leading-5 hover:text-gray-900" variant="tile-title">
{value.name} {value.name}
</Typography> </Typography>
</div> </div>
</PersonTile> </a>

View file

@ -11,7 +11,7 @@ export interface Props {
const { section, title } = Astro.props; const { section, title } = Astro.props;
--- ---
<div id={section} class="p-8 bg-white dark:bg-gray-800 rounded-2xl shadow-md flex flex-col gap-6"> <div id={section} class="flex flex-col gap-6 rounded-2xl bg-white p-8 shadow-md dark:bg-gray-800">
{ {
title && ( title && (
<Typography variant="section-title" id={`${section}-heading`}> <Typography variant="section-title" id={`${section}-heading`}>

View file

@ -1,7 +1,6 @@
import { useLocation } from 'react-use'; import { useLocation } from 'react-use';
import Icon from '@/atoms/icon'; import Icon from '@/atoms/icon';
import { MAIN_SECTION } from '@/constants/section';
import type { Section } from '@/types/data'; import type { Section } from '@/types/data';
import type { IconName } from '@/types/icon'; import type { IconName } from '@/types/icon';
@ -13,6 +12,8 @@ export interface SidebarItemProps {
title?: string; title?: string;
} }
export const MAIN_SECTION: Section = 'main';
const SidebarItem = ({ section, icon, title = '' }: SidebarItemProps) => { const SidebarItem = ({ section, icon, title = '' }: SidebarItemProps) => {
const { hash } = useLocation(); const { hash } = useLocation();
const href = `#${section}`; const href = `#${section}`;
@ -23,11 +24,11 @@ const SidebarItem = ({ section, icon, title = '' }: SidebarItemProps) => {
<Tooltip content={`${title || section.charAt(0).toUpperCase() + section.slice(1)} section`} placement="left"> <Tooltip content={`${title || section.charAt(0).toUpperCase() + section.slice(1)} section`} placement="left">
<a <a
href={href} href={href}
className={`inline-flex justify-center items-center h-10 w-10 rounded-lg transition className={`inline-flex h-10 w-10 items-center justify-center rounded-lg transition
${ ${
active active
? 'bg-primary-600 text-white' ? 'bg-primary-600 text-white'
: 'bg-white text-gray-400 dark:bg-gray-800 dark:text-gray-200 hover:bg-primary-600 hover:text-white' : 'bg-white text-gray-400 hover:bg-primary-600 hover:text-white dark:bg-gray-800 dark:text-gray-200'
} }
`} `}
aria-current={active ? 'page' : undefined} aria-current={active ? 'page' : undefined}

View file

@ -7,17 +7,8 @@ export interface Props {
const { skillLevel, tileLevel } = Astro.props; const { skillLevel, tileLevel } = Astro.props;
const isFilled = skillLevel >= tileLevel; const isFilled = skillLevel >= tileLevel;
const filledClass = isFilled ? 'bg-gray-500 dark:bg-gray-300' : 'bg-gray-200 dark:bg-gray-500';
--- ---
<div <div class={`w-9 h-2 last:rounded-l-none last:rounded-r-sm first:rounded-l-sm first:rounded-r-none ${filledClass}`}>
class:list={[
'w-9',
'h-2',
'last:rounded-l-none',
'last:rounded-r-sm',
'first:rounded-l-sm',
'first:rounded-r-none',
{ 'dark:bg-gray-300': isFilled, 'dark:bg-gray-500': !isFilled, 'bg-gray-200': !isFilled, 'bg-gray-500': isFilled },
]}
>
</div> </div>

View file

@ -11,7 +11,7 @@ const { name, color } = Astro.props;
--- ---
<div <div
class="flex items-center w-fit h-6 px-2.5 rounded text-sm font-medium tracking-wide text-gray-700 dark:text-gray-100 bg-gray-100 dark:bg-gray-700 gap-x-1.5" class="flex h-6 w-fit items-center gap-x-1.5 rounded bg-gray-100 px-2.5 text-sm font-medium tracking-wide text-gray-700 dark:bg-gray-700 dark:text-gray-100"
> >
<Icon client:load name={name} color={color} size={16} /> <Icon client:load name={name} color={color} size={16} />
<slot /> <slot />

View file

@ -39,7 +39,7 @@ const ThemeToggle = () => {
<button <button
onClick={handleClick} onClick={handleClick}
type="button" type="button"
className="text-gray-400 bg-gray-100 focus:ring-primary-500 dark:bg-gray-600 dark:text-gray-200 inline-flex justify-center items-center h-10 w-10 transition fixed bottom-3 left-3 shadow-xl rounded-lg z-10" className="fixed bottom-3 left-3 z-10 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-gray-100 text-gray-400 shadow-xl transition focus:ring-primary-500 dark:bg-gray-600 dark:text-gray-200"
> >
<Icon name={theme === DARK_THEME_KEY ? 'ri:moon-fill' : 'ri:sun-line'} size={20} /> <Icon name={theme === DARK_THEME_KEY ? 'ri:moon-fill' : 'ri:sun-line'} size={20} />
</button> </button>

View file

@ -1,17 +1,17 @@
--- ---
import Typography from '@/atoms/typography.astro'; import Typography from '@/atoms/typography.astro';
export interface Props extends astroHTML.JSX.HTMLAttributes { export interface Props {
startDate: Date; startDate: Date;
endDate: Date | null; endDate: Date | null;
locale: string; locale: string;
translationForNow: string; translationForNow: string;
} }
const { startDate, endDate, locale, translationForNow, ...props } = Astro.props; const { startDate, endDate, locale, translationForNow } = Astro.props;
const getFormattedDate = (date: Date): string => const getFormattedDate = (date: Date): string =>
new Intl.DateTimeFormat(locale, { month: 'long' }).format(date).concat(' ', date.getFullYear().toString()); new Intl.DateTimeFormat(locale, { month: 'long' }).format(date).concat(' ', date.getFullYear().toString());
--- ---
<Typography variant="item-subtitle" class:list={[props.class]}> <Typography variant="item-subtitle">
{getFormattedDate(startDate).concat(' - ', endDate ? getFormattedDate(endDate) : translationForNow)} {getFormattedDate(startDate).concat(' - ', endDate ? getFormattedDate(endDate) : translationForNow)}
</Typography> </Typography>

View file

@ -7,22 +7,20 @@ export interface TooltipProps {
placement?: TippyProps['placement']; placement?: TippyProps['placement'];
} }
const Tooltip = ({ children, content, placement = 'top' }: TooltipProps) => { const Tooltip = ({ children, content, placement = 'top' }: TooltipProps) => (
return ( <Tippy
<Tippy render={(attrs) => (
render={(attrs) => ( <div
<div {...attrs}
{...attrs} className="max-w-[95%] rounded-lg bg-gray-700 px-2 py-1.5 text-white dark:bg-gray-100 dark:text-gray-800 sm:max-w-xs"
className="bg-gray-700 dark:bg-gray-100 dark:text-gray-800 rounded-lg px-2 py-1.5 text-white max-w-[95%] sm:max-w-xs" >
> {content}
{content} </div>
</div> )}
)} placement={placement}
placement={placement} >
> {children}
{children} </Tippy>
</Tippy> );
);
};
export default Tooltip; export default Tooltip;

View file

@ -4,35 +4,30 @@ import { Image } from '@astrojs/image/components';
import Typography from '@/atoms/typography.astro'; import Typography from '@/atoms/typography.astro';
import type { Video } from '@/types/favorites-section'; import type { Video } from '@/types/favorites-section';
export interface Props extends astroHTML.JSX.HTMLAttributes { export interface Props {
value: Video; value: Video;
} }
const { const {
value: { title, url }, value: { title, url },
...props
} = Astro.props; } = Astro.props;
const VideoTile = 'a';
const id = url.split('/').pop(); const id = url.split('/').pop();
const thumbnail = `https://img.youtube.com/vi/${id}/0.jpg`; const thumbnail = `https://img.youtube.com/vi/${id}/0.jpg`;
--- ---
<VideoTile <a href={url} class="flex w-full flex-col gap-3 transition duration-300 hover:translate-y-2">
href={url}
class:list={['flex', 'flex-col', 'gap-3', 'transition', 'duration-300', 'hover:translate-y-2', 'w-full', props.class]}
>
<Image <Image
class:list={['rounded-lg', 'shadow-md', 'aspect-video', 'object-cover']} class="rounded-lg shadow-md aspect-video object-cover"
format="webp" format="webp"
width={240} width={240}
height={180} height={180}
src={thumbnail} src={thumbnail}
alt={title} alt={title}
/> />
<div class:list={['tile-content', 'gap-1']}> <div class="tile-content gap-1">
<Typography class:list={['leading-5', 'hover:text-gray-900']} variant="tile-title"> <Typography class="leading-5 hover:text-gray-900" variant="tile-title">
{title} {title}
</Typography> </Typography>
</div> </div>
</VideoTile> </a>

View file

@ -10,6 +10,6 @@ export interface Props {
const { skills } = Astro.props; const { skills } = Astro.props;
--- ---
<div class:list={['flex', 'flex-wrap', 'gap-8']}> <div class="flex flex-wrap gap-8">
{skills.map((skill) => <Skill {...skill} />)} {skills.map((skill) => <Skill {...skill} />)}
</div> </div>

View file

@ -20,22 +20,22 @@ const { description, details, endDate, name, socials, startDate, tags, image } =
// the missing alt attribute on the Image component. // the missing alt attribute on the Image component.
const { alt, ...sharedImageProps } = { const { alt, ...sharedImageProps } = {
src: image, src: image,
aspectRatio: '1/1', aspectRatio: 1,
alt: `Thumbnail for ${name} project`, alt: `Thumbnail for ${name} project`,
format: 'webp', format: 'webp',
} as const; } as const;
--- ---
<div class:list={['flex', 'flex-col', 'gap-6']}> <div class="flex flex-col gap-6">
<div class:list={['flex', 'flex-col', 'gap-4']}> <div class="flex flex-col gap-4">
<div class:list={['flex', 'gap-6']}> <div class="flex gap-6">
<Image <Image
class:list={['rounded-lg', 'object-cover', 'max-w-[120px]', 'overflow-hidden', 'sm:block', 'hidden']} class="rounded-lg object-cover max-w-[120px] overflow-hidden sm:block hidden"
{...sharedImageProps} {...sharedImageProps}
alt={alt} alt={alt}
/> />
<div class:list={['flex', 'flex-col', 'gap-4', 'w-full']}> <div class="flex w-full flex-col gap-4">
<div class:list={['flex', 'justify-between']}> <div class="flex justify-between">
<div> <div>
<Typography variant="item-title">{name}</Typography> <Typography variant="item-title">{name}</Typography>
<Timestamp <Timestamp
@ -45,7 +45,7 @@ const { alt, ...sharedImageProps } = {
translationForNow={i18n.translations.now} translationForNow={i18n.translations.now}
/> />
</div> </div>
<div class:list={['flex', 'gap-2']}> <div class="flex gap-2">
{ {
socials?.map(({ icon, url, name: socialName }) => ( socials?.map(({ icon, url, name: socialName }) => (
<IconButton icon={icon} href={url} target="_blank" size="small" aria-label={socialName} /> <IconButton icon={icon} href={url} target="_blank" size="small" aria-label={socialName} />
@ -53,12 +53,8 @@ const { alt, ...sharedImageProps } = {
} }
</div> </div>
</div> </div>
<Image <Image class="rounded-lg object-cover max-w-[120px] sm:hidden" {...sharedImageProps} alt={alt} />
class:list={['rounded-lg', 'object-cover', 'max-w-[120px]', 'sm:block', 'sm:hidden']} <div class="inline-grid w-full xl:grid-cols-[auto_auto]">
{...sharedImageProps}
alt={alt}
/>
<div class:list={['inline-grid', 'xl:grid-cols-[auto_auto]', 'w-full']}>
{ {
details.map(({ label: detailLabel, value: detailValue }) => ( details.map(({ label: detailLabel, value: detailValue }) => (
<LabelledValue <LabelledValue
@ -70,14 +66,14 @@ const { alt, ...sharedImageProps } = {
</div> </div>
</div> </div>
</div> </div>
<div class:list={['col-start-1 col-span-3']}> <div class="col-span-3 col-start-1">
<Typography variant="paragraph">{description}</Typography> <Typography variant="paragraph">{description}</Typography>
</div> </div>
</div> </div>
<div class:list={['flex', 'gap-3', 'flex-wrap']}> <div class="flex flex-wrap gap-3">
{ {
tags.map(({ name: tagName, icon, iconColor, url }) => { tags.map(({ name: tagName, icon, iconColor, url }) =>
return url ? ( url ? (
<a href={url} target="_blank" rel="noopener noreferrer"> <a href={url} target="_blank" rel="noopener noreferrer">
<Tag name={icon} color={iconColor}> <Tag name={icon} color={iconColor}>
{tagName} {tagName}
@ -87,8 +83,8 @@ const { alt, ...sharedImageProps } = {
<Tag name={icon} color={iconColor}> <Tag name={icon} color={iconColor}>
{tagName} {tagName}
</Tag> </Tag>
); )
}) )
} }
</div> </div>
</div> </div>

View file

@ -10,6 +10,6 @@ const { skillLevel } = Astro.props;
const levels = [1, 2, 3, 4, 5]; const levels = [1, 2, 3, 4, 5];
--- ---
<div class:list={['flex', 'gap-1']}> <div class="flex gap-1">
{levels.map((tileLevel) => <SkillLevelTile tileLevel={tileLevel} skillLevel={skillLevel} />)} {levels.map((tileLevel) => <SkillLevelTile tileLevel={tileLevel} skillLevel={skillLevel} />)}
</div> </div>

View file

@ -22,7 +22,7 @@ const isLevelledSkillSection = (skillsSectionData: Tag[] | LevelledSkill[]): ski
}; };
--- ---
<div class:list={['flex', 'flex-col', 'gap-3']}> <div class="flex flex-col gap-3">
<Typography variant="section-subtitle">{title}</Typography> <Typography variant="section-subtitle">{title}</Typography>
{ {
isLevelledSkillSection(skills) ? ( isLevelledSkillSection(skills) ? (

View file

@ -14,15 +14,12 @@ const { url, icon, iconColor, name, level, description } = Astro.props;
const IconWrapper = url ? 'a' : 'div'; const IconWrapper = url ? 'a' : 'div';
--- ---
<div class:list={['flex', 'flex-col', 'gap-2']}> <div class="flex flex-col gap-2">
<div class:list={['flex', 'items-center', 'justify-between', 'h-5']}> <div class="flex h-5 items-center justify-between">
<IconWrapper <IconWrapper class="flex gap-2 h-5" {...(url && { href: url, target: '_blank', rel: 'noopener noreferrer' })}>
class:list={['flex', 'gap-2', 'h-5']}
{...(url && { href: url, target: "_blank", rel: "noopener noreferrer" })}
>
<Icon client:load name={icon} color={iconColor} size={20} /> <Icon client:load name={icon} color={iconColor} size={20} />
<Typography variant="tile-subtitle"> <Typography variant="tile-subtitle">
<span class:list={['text-gray-700', 'dark:text-gray-300']}>{name}</span> <span class="text-gray-700 dark:text-gray-300">{name}</span>
</Typography> </Typography>
</IconWrapper> </IconWrapper>
{ {

View file

@ -9,7 +9,7 @@ export interface Props {
const { skills } = Astro.props; const { skills } = Astro.props;
--- ---
<div class:list={['flex', 'flex-wrap', 'gap-3', 'items-center']}> <div class="flex flex-wrap items-center gap-3">
{ {
skills.map(({ name, icon, iconColor, url }) => skills.map(({ name, icon, iconColor, url }) =>
url ? ( url ? (

View file

@ -14,10 +14,10 @@ const {
} = Astro.props; } = Astro.props;
--- ---
<div class:list={['w-full', 'flex', 'flex-col', 'gap-4']}> <div class="flex w-full flex-col gap-4">
<div class:list={['flex', 'justify-between']}> <div class="flex justify-between">
<div class:list={['flex', 'gap-4', 'flex-col', 'sm:flex-row']}> <div class="flex flex-col gap-4 sm:flex-row">
<Image src={image} alt={author} format="webp" class:list={['w-14', 'h-14', 'rounded-lg']} /> <Image src={image} alt={author} format="webp" class="w-14 h-14 rounded-lg" />
<div> <div>
<Typography variant="item-title">{author}</Typography> <Typography variant="item-title">{author}</Typography>
<Typography variant="item-subtitle">{relation}</Typography> <Typography variant="item-subtitle">{relation}</Typography>
@ -25,7 +25,7 @@ const {
</div> </div>
{ {
socials && ( socials && (
<div class:list={['flex', 'gap-3']}> <div class="flex gap-3">
{socials.map(({ icon, url, name }) => ( {socials.map(({ icon, url, name }) => (
<IconButton icon={icon} href={url} target="_blank" size="small" aria-label={name} /> <IconButton icon={icon} href={url} target="_blank" size="small" aria-label={name} />
))} ))}

View file

@ -6,21 +6,21 @@ import Typography from '@/atoms/typography.astro';
import type { Job } from '@/types/experience-section'; import type { Job } from '@/types/experience-section';
import type { I18n } from '@/types/i18n'; import type { I18n } from '@/types/i18n';
export interface Props extends astroHTML.JSX.HTMLAttributes { export interface Props {
job: Job; job: Job;
i18n: I18n; i18n: I18n;
} }
const { job, i18n, ...props } = Astro.props; const { job, i18n } = Astro.props;
--- ---
<div class:list={['flex', 'flex-col', 'gap-2', 'md:gap-0', props.class]}> <div class="flex flex-col gap-2 md:gap-0">
<div class:list={['flex', 'flex-row', 'justify-between', 'w-full']}> <div class="flex w-full flex-row justify-between">
<div> <div>
<Typography variant="item-title" <Typography variant="item-title"
>{job.role} <span class="font-medium"> &#8212;&nbsp;{job.company}</span> >{job.role} <span class="font-medium"> &#8212;&nbsp;{job.company}</span>
</Typography> </Typography>
</div> </div>
<div class:list={['flex', 'flex-wrap', 'gap-2']}> <div class="flex flex-wrap gap-2">
{ {
job.socials?.map(({ icon, url, name }) => ( job.socials?.map(({ icon, url, name }) => (
<IconButton icon={icon} href={url} target="_blank" size="small" aria-label={name} /> <IconButton icon={icon} href={url} target="_blank" size="small" aria-label={name} />
@ -34,7 +34,7 @@ const { job, i18n, ...props } = Astro.props;
locale={i18n.locale} locale={i18n.locale}
translationForNow={i18n.translations.now} translationForNow={i18n.translations.now}
/> />
<ul class:list={['my-3']}> <ul class="my-3">
{ {
Array.isArray(job.description) ? ( Array.isArray(job.description) ? (
job.description.map((d) => ( job.description.map((d) => (
@ -49,10 +49,10 @@ const { job, i18n, ...props } = Astro.props;
) )
} }
</ul> </ul>
<div class:list={['flex', 'gap-3', 'flex-wrap', 'mt-3']}> <div class="mt-3 flex flex-wrap gap-3">
{ {
job.tags.map(({ icon, iconColor, name, url }) => { job.tags.map(({ icon, iconColor, name, url }) =>
return url ? ( url ? (
<a href={url} target="_blank" rel="noopener noreferrer"> <a href={url} target="_blank" rel="noopener noreferrer">
<Tag name={icon} color={iconColor}> <Tag name={icon} color={iconColor}>
{name} {name}
@ -62,8 +62,8 @@ const { job, i18n, ...props } = Astro.props;
<Tag name={icon} color={iconColor}> <Tag name={icon} color={iconColor}>
{name} {name}
</Tag> </Tag>
); )
}) )
} }
</div> </div>
</div> </div>

View file

@ -67,14 +67,14 @@ const section: Section = 'favorites';
--- ---
<SectionCard section={section} title={title}> <SectionCard section={section} title={title}>
<div class:list={['flex', 'flex-col', 'gap-16']}> <div class="flex flex-col gap-16">
{ {
subsections.map(({ Component, data, name, columnsLayout, title: subsectionTitle }) => ( subsections.map(({ Component, data, name, columnsLayout, title: subsectionTitle }) => (
<div class:list={['flex', 'flex-col', 'gap-6']}> <div class="flex flex-col gap-6">
<Typography variant="section-subtitle" id={`${section}-${name}-heading`}> <Typography variant="section-subtitle" id={`${section}-${name}-heading`}>
{subsectionTitle} {subsectionTitle}
</Typography> </Typography>
<div class:list={['grid', 'gap-8', columnsLayout]}> <div class={`grid gap-8 ${columnsLayout}`}>
{data.map((value) => ( {data.map((value) => (
<Component value={value} /> <Component value={value} />
))} ))}

View file

@ -26,26 +26,26 @@ const section: Section = 'main';
--- ---
<SectionCard section={section}> <SectionCard section={section}>
<div class:list={['flex', 'gap-6', 'flex-col', 'sm:flex-row', 'items-start']}> <div class="flex flex-col items-start gap-6 sm:flex-row">
<div class:list={['flex', 'sm:flex-col', 'gap-4', 'items-center']}> <div class="flex items-center gap-4 sm:flex-col">
<Image <Image
src={image} src={image}
alt={fullName} alt={fullName}
class:list={['w-24', 'h-24', 'sm:w-36', 'sm:h-36', 'md:w-52', 'md:h-52', 'rounded-lg', 'max-w-none']} class="w-24 h-24 sm:w-36 sm:h-36 md:w-52 md:h-52 rounded-lg max-w-none"
format="webp" format="webp"
aspectRatio="1/1" aspectRatio={1}
/> />
<Button href={url} download={downloadedFileName}>{label}</Button> <Button href={url} download={downloadedFileName}>{label}</Button>
</div> </div>
<div class:list={['w-full', 'flex', 'flex-col', 'gap-5']}> <div class="flex w-full flex-col gap-5">
<div class:list={['w-full', 'flex', 'flex-col', 'sm:flex-row', 'justify-between', 'gap-2']}> <div class="flex w-full flex-col justify-between gap-2 sm:flex-row">
<div class:list={['w-full']}> <div class="w-full">
<Typography variant="main-title" id={`${section}-heading`}>{fullName}</Typography> <Typography variant="main-title" id={`${section}-heading`}>{fullName}</Typography>
<Typography variant="main-subtitle">{role}</Typography> <Typography variant="main-subtitle">{role}</Typography>
</div> </div>
{ {
socials.length > 0 && ( socials.length > 0 && (
<div class:list={['flex', 'gap-3', 'flex-wrap', 'sm:flex-nowrap']}> <div class="flex flex-wrap gap-3 sm:flex-nowrap">
{socials.map(({ icon, url: iconUrl, name }) => ( {socials.map(({ icon, url: iconUrl, name }) => (
<IconButton href={iconUrl} icon={icon} size="small" target="_blank" aria-label={name} /> <IconButton href={iconUrl} icon={icon} size="small" target="_blank" aria-label={name} />
))} ))}
@ -53,22 +53,22 @@ const section: Section = 'main';
) )
} }
</div> </div>
<div class:list={['flex', 'flex-col', 'gap-6']}> <div class="flex flex-col gap-6">
<div class:list={['inline-grid', 'xl:grid-cols-[auto_auto]']}> <div class="inline-grid xl:grid-cols-[auto_auto]">
{ {
details.map(({ label: detailLabel, value }) => ( details.map(({ label: detailLabel, value }) => (
<div class="w-fit"> <div class="w-fit">
<Typography variant="paragraph"> <Typography variant="paragraph">
<span class:list={['text-gray-700', 'dark:text-gray-300']}>{detailLabel}: </span> <span class="text-gray-700 dark:text-gray-300">{detailLabel}: </span>
<span class:list={['break-all', 'dark:text-gray-400']}>{value}</span> <span class="break-all dark:text-gray-400">{value}</span>
</Typography> </Typography>
</div> </div>
)) ))
} }
</div> </div>
<div class:list={['flex', 'flex-col', 'gap-4']}> <div class="flex flex-col gap-4">
<Typography variant="paragraph">{description}</Typography> <Typography variant="paragraph">{description}</Typography>
<div class:list={['flex', 'flex-wrap', 'gap-3']}> <div class="flex flex-wrap gap-3">
{ {
tags.map(({ icon, iconColor, name, url: tagUrl }) => tags.map(({ icon, iconColor, name, url: tagUrl }) =>
tagUrl ? ( tagUrl ? (

View file

@ -15,7 +15,7 @@ const section: Section = 'skills';
--- ---
<SectionCard section={section} title={title}> <SectionCard section={section} title={title}>
<div class:list={['flex', 'flex-col', 'gap-10']}> <div class="flex flex-col gap-10">
{skillSets.map((skillSet) => <SkillSubsection skillSet={skillSet} />)} {skillSets.map((skillSet) => <SkillSubsection skillSet={skillSet} />)}
</div> </div>
</SectionCard> </SectionCard>

View file

@ -1,3 +0,0 @@
import type { Section } from '@/types/data';
export const MAIN_SECTION: Section = 'main';

View file

@ -2,7 +2,7 @@
import IconButton from '@/atoms/icon-button.astro'; import IconButton from '@/atoms/icon-button.astro';
--- ---
<div class:list={['p-5', 'flex', 'flex-col', 'gap-2']}> <div class="flex flex-col gap-2 p-5">
<IconButton icon="fa6-brands:facebook-f" size="small" href="#" /> <IconButton icon="fa6-brands:facebook-f" size="small" href="#" />
<IconButton icon="fa6-brands:github" size="small" href="#" /> <IconButton icon="fa6-brands:github" size="small" href="#" />
<IconButton icon="fa6-brands:linkedin-in" size="large" href="#" /> <IconButton icon="fa6-brands:linkedin-in" size="large" href="#" />

View file

@ -29,7 +29,7 @@ const mainSectionData: MainSectionData = {
--- ---
<body class="flex justify-center bg-gray-50"> <body class="flex justify-center bg-gray-50">
<div class="flex gap-8 w-full max-w-6xl px-2 py-3 sm:px-8 sm:py-12 lg:px-16 lg:py-20 lg:ml-22"> <div class="flex w-full max-w-6xl gap-8 px-2 py-3 sm:px-8 sm:py-12 lg:ml-22 lg:px-16 lg:py-20">
<main class="w-full space-y-4 sm:space-y-6 lg:space-y-8"> <main class="w-full space-y-4 sm:space-y-6 lg:space-y-8">
<MainSection {...mainSectionData} /> <MainSection {...mainSectionData} />
</main> </main>

View file

@ -152,7 +152,7 @@ const skills: SkillsSectionData = {
--- ---
<body class="flex justify-center bg-gray-50"> <body class="flex justify-center bg-gray-50">
<div class="flex gap-8 w-full max-w-6xl px-2 py-3 sm:px-8 sm:py-12 lg:px-16 lg:py-20 lg:ml-22"> <div class="flex w-full max-w-6xl gap-8 px-2 py-3 sm:px-8 sm:py-12 lg:ml-22 lg:px-16 lg:py-20">
<main class="w-full space-y-4 sm:space-y-6 lg:space-y-8"> <main class="w-full space-y-4 sm:space-y-6 lg:space-y-8">
<SkillsSection config={skills.config} skillSets={skills.skillSets} /> <SkillsSection config={skills.config} skillSets={skills.skillSets} />
</main> </main>

View file

@ -15,6 +15,6 @@ const testimonial: TestimonialData = {
}; };
--- ---
<div class:list={['flex', 'flex-col', 'gap-2', 'max-w-[896px]']}> <div class="flex max-w-[896px] flex-col gap-2">
<Testimonial testimonial={testimonial} /> <Testimonial testimonial={testimonial} />
</div> </div>

View file

@ -37,7 +37,7 @@ const testimonials: Testimonial[] = [
--- ---
<body class="flex justify-center bg-gray-50"> <body class="flex justify-center bg-gray-50">
<div class="flex gap-8 w-full max-w-6xl px-2 py-3 sm:px-8 sm:py-12 lg:px-16 lg:py-20 lg:ml-22"> <div class="flex w-full max-w-6xl gap-8 px-2 py-3 sm:px-8 sm:py-12 lg:ml-22 lg:px-16 lg:py-20">
<main class="w-full space-y-4 sm:space-y-6 lg:space-y-8"> <main class="w-full space-y-4 sm:space-y-6 lg:space-y-8">
<TestimonialsSection testimonials={testimonials} config={{ title: 'Testimonials', icon: 'fa6-solid:comment' }} /> <TestimonialsSection testimonials={testimonials} config={{ title: 'Testimonials', icon: 'fa6-solid:comment' }} />
</main> </main>

View file

@ -4,7 +4,7 @@ import Typography from '@/atoms/typography.astro';
const text = 'A quick brown fox jumps over the lazy dog'; const text = 'A quick brown fox jumps over the lazy dog';
--- ---
<div class="p-5 space-y-10"> <div class="space-y-10 p-5">
<div> <div>
<p class="mb-2 font-mono">paragraph (default)</p> <p class="mb-2 font-mono">paragraph (default)</p>
<Typography>{text}</Typography> <Typography>{text}</Typography>

View file

@ -31,8 +31,8 @@ const seoImage = seo.image ? seo.image : '/favicon.svg';
</head> </head>
<body class="flex justify-center bg-gray-50 dark:bg-gray-900"> <body class="flex justify-center bg-gray-50 dark:bg-gray-900">
<ThemeToggle client:only="react" /> <ThemeToggle client:only="react" />
<div class="flex relative transform-none gap-8 w-full max-w-5xl px-2 py-3 sm:px-8 sm:py-12 lg:py-20"> <div class="relative flex w-full max-w-5xl transform-none gap-8 px-2 py-3 sm:px-8 sm:py-12 lg:py-20">
<div class="absolute z-40 -right-2"> <div class="absolute -right-2 z-40">
<Sidebar className="hidden xl:flex fixed"> <Sidebar className="hidden xl:flex fixed">
{ {
getObjectKeys(dataWithoutSeoAndI18n).map((key) => { getObjectKeys(dataWithoutSeoAndI18n).map((key) => {
@ -51,7 +51,7 @@ const seoImage = seo.image ? seo.image : '/favicon.svg';
} }
</Sidebar> </Sidebar>
</div> </div>
<main class="w-full relative space-y-4 sm:space-y-6 lg:space-y-8"> <main class="relative w-full space-y-4 sm:space-y-6 lg:space-y-8">
<MainSection {...data.main} /> <MainSection {...data.main} />
{data.skills && <SkillsSection {...data.skills} />} {data.skills && <SkillsSection {...data.skills} />}
{ {

View file

@ -1,4 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["**/*.ts", "**/*.tsx", "**/*.cjs", "**/*.astro"]
}

View file

@ -40,5 +40,6 @@
"@/constants/*": ["src/constants/*"], "@/constants/*": ["src/constants/*"],
"@/utils/*": ["src/utils/*"] "@/utils/*": ["src/utils/*"]
} }
} },
"include": ["**/*.ts", "**/*.tsx", "**/*.cjs", "**/*.astro"]
} }