From e86c9bdb8865b71178836b2fe70c85e38e9b8679 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Mon, 8 Jun 2026 11:27:37 -0700 Subject: [PATCH] Updates and Fix Scrolling --- .github/FUNDING.yml | 1 + .github/actionlint.yaml | 7 ++ .github/workflows/issue.yaml | 16 +-- .github/workflows/lint.yaml | 25 ++--- .github/workflows/pages.yaml | 9 +- .github/workflows/preview.yaml | 5 +- .github/yamllint.yaml | 5 +- .prettierignore | 8 +- AGENTS.md | 57 ++++------ package-lock.json | 190 ++++++++++++++++----------------- package.json | 8 +- src/config/apps.ts | 150 +++++++++++++++----------- src/main.ts | 4 +- src/router/index.ts | 14 +-- 14 files changed, 257 insertions(+), 242 deletions(-) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..f72beb8 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +ko_fi: cssnr diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index 447aaa1..cd68a23 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -4,3 +4,10 @@ paths: - '"inputs" section is alias node but mapping node is expected' - '"paths" section must be sequence node but got alias node with "" tag' - '"paths-ignore" section must be sequence node but got alias node with "" tag' + .github/workflows/issue.yaml: + ignore: + - 'missing input "app-id" which is required by action "actions/create-github-app-token@v3"' + - 'input "client-id" is not defined in action "actions/create-github-app-token@v3"' + .github/workflows/test.yaml: + ignore: + - 'property ".+" is not defined in object type' diff --git a/.github/workflows/issue.yaml b/.github/workflows/issue.yaml index 211ab58..65daffc 100644 --- a/.github/workflows/issue.yaml +++ b/.github/workflows/issue.yaml @@ -1,4 +1,4 @@ -name: "Issue" +name: "AI Issue" on: issues: @@ -9,10 +9,12 @@ jobs: name: "Issue" if: ${{ !github.event.issue.type || github.event.issue.type.name == 'Bug' }} runs-on: ubuntu-latest - timeout-minutes: 5 + timeout-minutes: 15 + permissions: contents: write issues: write + steps: - name: "Checkout" uses: actions/checkout@v6 @@ -21,22 +23,22 @@ jobs: id: app uses: actions/create-github-app-token@v3 with: - app-id: 146360 + client-id: ${{ vars.APP_CLIENT_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} - name: "AI Issue" - uses: smashedr/ai-issue-action@master + uses: cssnr/ai-issue-action@v1 env: GOOGLE_GENERATIVE_AI_API_KEY: ${{ secrets.GOOGLE_GENERATIVE_AI_API_KEY }} with: token: ${{ steps.app.outputs.token }} model: gemini-2.5-flash + tail: | + _Response generated by the [AI Issue Action](https://github.com/cssnr/ai-issue-action)._ instructions: | You are a helpful assistant responding to a GitHub Issue created by user @${{ github.actor }} in the repository ${{ github.server_url }}/${{ github.repository }} Provide initial triage and troubleshooting steps, then gather any additional information needed to proceed. Respond using your general knowledge and the following knowledge files: - file: | + path: | README.md - tail: | - _Response generated by the [AI Issue Action](https://github.com/smashedr/ai-issue-action)._ diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 98b3827..e036f21 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -3,9 +3,9 @@ name: "Lint" on: workflow_dispatch: push: - branches: [master] + branches: [master, main] pull_request: - branches: [master] + branches: [master, main] concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -14,9 +14,9 @@ concurrency: jobs: lint: name: "Lint" - if: ${{ !contains(github.event.head_commit.message, '#nolint') }} runs-on: ubuntu-latest timeout-minutes: 5 + if: ${{ !contains(github.event.head_commit.message, '#nolint') }} steps: - name: "Checkout" @@ -31,29 +31,26 @@ jobs: GITHUB_CTX: ${{ toJSON(github) }} run: echo "$GITHUB_CTX" - - name: "Setup Node 24" + - name: "Setup Node" uses: actions/setup-node@v6 with: node-version: 24 - name: "Install" - run: | - npm ci + id: install + run: npm ci - - name: "Build" - if: ${{ !cancelled() }} - run: | - npm run build + - name: "Debug" + continue-on-error: true + run: ls -lahR dist - name: "eslint" if: ${{ !cancelled() }} - run: | - npm run lint:check + run: npm run lint - name: "prettier" if: ${{ !cancelled() }} - run: | - npm run prettier:check + run: npm run prettier:check - name: "yamllint" if: ${{ !cancelled() }} diff --git a/.github/workflows/pages.yaml b/.github/workflows/pages.yaml index 1608a85..7f22540 100644 --- a/.github/workflows/pages.yaml +++ b/.github/workflows/pages.yaml @@ -3,7 +3,7 @@ name: "Pages" on: workflow_dispatch: push: - branches: [master] + branches: [master, main] paths: - ".github/workflows/pages.yaml" - "public/**" @@ -24,7 +24,7 @@ concurrency: jobs: build: name: "Build" - if: ${{ !contains(github.event.head_commit.message, '#nodeploy') || github.actor != 'dependabot[bot]' }} + if: ${{ !contains(github.event.head_commit.message, '#nodeploy') }} uses: cssnr/workflows/.github/workflows/npm-build.yaml@master permissions: contents: read @@ -32,8 +32,7 @@ jobs: build: "npm run build" path: "dist" pages: true - secrets: - webhook: ${{ secrets.DISCORD_WEBHOOK }} + secrets: inherit deploy: name: "Deploy" @@ -54,7 +53,7 @@ jobs: id: deployment uses: actions/deploy-pages@v5 - - name: "Send Discord Notification" + - name: "Send Deploy Notification" if: ${{ !cancelled() }} continue-on-error: true uses: sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0 diff --git a/.github/workflows/preview.yaml b/.github/workflows/preview.yaml index 76ddc13..13437a8 100644 --- a/.github/workflows/preview.yaml +++ b/.github/workflows/preview.yaml @@ -3,7 +3,7 @@ name: "Preview" on: workflow_dispatch: push: - branches-ignore: [master] + branches-ignore: [master, legacy] paths: - ".github/workflows/preview.yaml" - "public/**" @@ -27,8 +27,7 @@ jobs: with: build: "npm run build" path: "dist" - secrets: - webhook: ${{ secrets.DISCORD_WEBHOOK }} + secrets: inherit deploy: name: "Deploy" diff --git a/.github/yamllint.yaml b/.github/yamllint.yaml index 964f421..ccf5e5e 100644 --- a/.github/yamllint.yaml +++ b/.github/yamllint.yaml @@ -1,8 +1,7 @@ extends: relaxed -ignore: - - "node_modules/" +ignore-from-file: .gitignore rules: line-length: - max: 119 + max: 120 diff --git a/.prettierignore b/.prettierignore index 04994ff..db2d326 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,8 @@ -.github/pull_request_template.md +# Tools +dist/ package-lock.json + +# Files +.github/disabled/ +.github/PULL_REQUEST_TEMPLATE/ +.github/pull_request_template.md diff --git a/AGENTS.md b/AGENTS.md index 5510d24..831d3ad 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,54 +1,37 @@ # Agents - cssnr-vue (cssnr.github.io) +Before answering any question that involves facts about ANYTHING, you MUST output at least one Read, WebFetch, or WebSearch tool call. +If your first output is text instead of a tool call, you have failed. + Vue 3 SPA — GitHub Pages org site showcasing CSSNR projects. Production Site: https://cssnr.github.io/ ## Commands -| Command | Action | -| ------------------------ | ---------------------------------- | -| `npm run dev` | Dev server at localhost:5173 | -| `npm run tsc` | TypeScript check `vue-tsc --build` | -| `npm run build` | `tsc` then `vite-ssg build` | -| `npm run lint` | ESLint Write `--cache --fix` | -| `npm run lint:check` | ESLint Check | -| `npm run prettier` | Prettier Write | -| `npm run prettier:check` | Prettier Check | - -Run `lint` before `tsc` before `build`. No test framework exists. - -## Config & formatting - -- ESLint: flat config at `eslint.config.ts` (ESLint 10) -- Prettier: `.prettierrc.json` — no semis, single quotes, `.vue` printWidth 120, `.js` tabWidth 4 -- Lint CI checks: `lint:check` + `prettier:check` + yamllint + actionlint -- Path alias `@/` → `src/` - -| Script | Command | -| ---------- | ------------------------------------- | -| yamllint | `yamllint -c .github/yamllint.yaml .` | -| actionlint | `actionlint` | +| Command | Action | +| -------------------- | ---------------------------------- | +| `npm run dev` | Dev server at localhost:5173 | +| `npm run tsc` | TypeScript check `vue-tsc --build` | +| `npm run build` | `tsc` then `vite-ssg build` | +| `npm run lint` | ESLint Write `--cache --fix` | +| `npm run lint:check` | ESLint Check | +| `npm run prettier` | ALWAYS RUN AFTER EDITING FILES | ## Architecture - `src/config/apps.ts` — list of apps - `src/router/index.ts` — vue router +- `src/components` - Vue Components +- `src/views` - Main Views (Pages) -## Environment - -Copy `.env` from the template (not committed). Vars are `VITE_TITLE`, `VITE_*_URL`, etc. Injected via `%VITE_TITLE%` in `index.html` and `import.meta.env.VITE_*` in code. - -## CI +## Frameworks -Workflows in: `.github/workflows` +- Bootstrap 5.3 +- Fontawesome +- Animate.css +- AOS (Animate On Scroll) -- `pages.yaml`: push to `master` → npm build → deploy to GitHub Pages -- `preview.yaml`: push non-master → npm build → deploy to `https://dev-static.cssnr.com/` -- `lint.yaml`: push/PR to master → lint check - -## Notes +## Environment -- Node: `^20.19.0 || >=22.12.0`, package manager: npm -- `src/config/**` marked `linguist-vendored` in `.gitattributes` -- `vite.config.ts` sets `server.allowedHosts: true` and `base` is unset (default `/` for GitHub Pages) +Copy `.env` from the template (not committed). Vars are `VITE_TITLE`, `VITE_*_URL`, etc. Injected via `%VITE_TITLE%` in `index.html` and `import.meta.env.VITE_*` in code. diff --git a/package-lock.json b/package-lock.json index 0b531b1..d755622 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,19 +19,19 @@ "@tsconfig/node24": "^24.0.4", "@types/aos": "^3.0.8", "@types/bootstrap": "^5.2.11", - "@types/node": "^25.9.1", + "@types/node": "^25.9.2", "@vitejs/plugin-vue": "^6.0.7", "@vue/eslint-config-prettier": "^10.2.0", - "@vue/eslint-config-typescript": "^14.7.0", + "@vue/eslint-config-typescript": "^14.8.0", "@vue/tsconfig": "^0.9.1", "eslint": "^10.4.1", - "eslint-plugin-vue": "~10.9.1", + "eslint-plugin-vue": "~10.9.2", "jiti": "^2.7.0", "prettier": "3.8.3", "typescript": "^6.0.3", "vite": "^8.0.16", "vite-ssg": "^28.3.0", - "vue-tsc": "^3.3.3" + "vue-tsc": "^3.3.4" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -310,9 +310,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.4.tgz", - "integrity": "sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", "dev": true, "funding": [ { @@ -1046,9 +1046,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", - "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "version": "25.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1056,17 +1056,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", - "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.1.tgz", + "integrity": "sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/type-utils": "8.60.0", - "@typescript-eslint/utils": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/type-utils": "8.60.1", + "@typescript-eslint/utils": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1079,7 +1079,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.60.0", + "@typescript-eslint/parser": "^8.60.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -1095,16 +1095,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", - "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.1.tgz", + "integrity": "sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3" }, "engines": { @@ -1120,14 +1120,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", - "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.1.tgz", + "integrity": "sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.60.0", - "@typescript-eslint/types": "^8.60.0", + "@typescript-eslint/tsconfig-utils": "^8.60.1", + "@typescript-eslint/types": "^8.60.1", "debug": "^4.4.3" }, "engines": { @@ -1142,14 +1142,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", - "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.1.tgz", + "integrity": "sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0" + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1160,9 +1160,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", - "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.1.tgz", + "integrity": "sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==", "dev": true, "license": "MIT", "engines": { @@ -1177,15 +1177,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", - "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.60.1.tgz", + "integrity": "sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1202,9 +1202,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", - "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.1.tgz", + "integrity": "sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==", "dev": true, "license": "MIT", "engines": { @@ -1216,16 +1216,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", - "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.1.tgz", + "integrity": "sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.60.0", - "@typescript-eslint/tsconfig-utils": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/project-service": "8.60.1", + "@typescript-eslint/tsconfig-utils": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/visitor-keys": "8.60.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1244,16 +1244,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.0.tgz", - "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.60.1.tgz", + "integrity": "sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0" + "@typescript-eslint/scope-manager": "8.60.1", + "@typescript-eslint/types": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1268,13 +1268,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", - "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.1.tgz", + "integrity": "sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/types": "8.60.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1512,15 +1512,15 @@ } }, "node_modules/@vue/eslint-config-typescript": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.7.0.tgz", - "integrity": "sha512-iegbMINVc+seZ/QxtzWiOBozctrHiF2WvGedruu2EbLujg9VuU0FQiNcN2z1ycuaoKKpF4m2qzB5HDEMKbxtIg==", + "version": "14.8.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.8.0.tgz", + "integrity": "sha512-yIquzhXH7ZsrwSSm+rYvoGCRY6wcuF4qBi76e0l7hHLq7YU0f9aC+RcR5fL+XJNfmBZxgX5cVl4sppt4x7ZCBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.56.0", + "@typescript-eslint/utils": "^8.60.0", "fast-glob": "^3.3.3", - "typescript-eslint": "^8.56.0", + "typescript-eslint": "^8.60.0", "vue-eslint-parser": "^10.4.0" }, "engines": { @@ -1538,9 +1538,9 @@ } }, "node_modules/@vue/language-core": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.3.tgz", - "integrity": "sha512-X6p+7nfY7vVT6dQwUJ+v0Jfq/lwIfhL2jMi91dQ3ln4hnlGXlxsDu/FNkeyHYgvYtyQy18ZX76IZy7X4diDbiQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.4.tgz", + "integrity": "sha512-IuHqQ5zGGOE7CXP72VX6A42IVeIzYv4WAhO6arej11TRNqtdZfGyH8Yr2FOCaDX0dSQG+JwULLoFHGY1igYVjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2171,9 +2171,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.1.tgz", - "integrity": "sha512-cHB0Tf4Duvzwecwd/AqWzZvF/QszE13BhjVUpVXWCy9AeMR5GjkAjP3i85vqgLgOuTmkHR1OJ5oMeqLHtuw8zg==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.2.tgz", + "integrity": "sha512-4g7ZP3pYcuqd7Zp0pzUKcos0W+RkjBz4EGdhJ92FcYk6v03Ti/GK5NwjgsjxHK+98eXDbHeK7VtX1az7/8doZA==", "dev": true, "license": "MIT", "dependencies": { @@ -3678,9 +3678,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", + "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", "dev": true, "license": "ISC", "bin": { @@ -3944,16 +3944,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.0.tgz", - "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "version": "8.60.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.60.1.tgz", + "integrity": "sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.60.0", - "@typescript-eslint/parser": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/utils": "8.60.0" + "@typescript-eslint/eslint-plugin": "8.60.1", + "@typescript-eslint/parser": "8.60.1", + "@typescript-eslint/typescript-estree": "8.60.1", + "@typescript-eslint/utils": "8.60.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3974,9 +3974,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.0.tgz", - "integrity": "sha512-+t2Z/GwkZQDtu00813aP66ygViGtPHKhhoFZpQKpKrE+9jIgES+Zw+mFNaDWOVRKiuJjuqKHzD3B1sfGg8+ZOQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", "dev": true, "license": "MIT", "engines": { @@ -4237,9 +4237,9 @@ } }, "node_modules/vue-eslint-parser": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", - "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.1.tgz", + "integrity": "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==", "dev": true, "license": "MIT", "dependencies": { @@ -4335,14 +4335,14 @@ } }, "node_modules/vue-tsc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.3.tgz", - "integrity": "sha512-SWUEG7YRUeDJHT7Xsuhf02elYX2gxPzzAII7OxDAh4KNOr4QHQ0Lls0YfnaO5GNd560CwVa2HTfdqmA5MqvRqQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.4.tgz", + "integrity": "sha512-XA/JqmQwS2GZmfgpjOEGdrKwaTSEuPwxpHa7/t6f4yiGrJb3gVHTPb9wBfByMNZwQ+xDXs41b8gaS2DKsOozUw==", "dev": true, "license": "MIT", "dependencies": { "@volar/typescript": "2.4.28", - "@vue/language-core": "3.3.3" + "@vue/language-core": "3.3.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" diff --git a/package.json b/package.json index d428c8c..058a0a8 100644 --- a/package.json +++ b/package.json @@ -29,19 +29,19 @@ "@tsconfig/node24": "^24.0.4", "@types/aos": "^3.0.8", "@types/bootstrap": "^5.2.11", - "@types/node": "^25.9.1", + "@types/node": "^25.9.2", "@vitejs/plugin-vue": "^6.0.7", "@vue/eslint-config-prettier": "^10.2.0", - "@vue/eslint-config-typescript": "^14.7.0", + "@vue/eslint-config-typescript": "^14.8.0", "@vue/tsconfig": "^0.9.1", "eslint": "^10.4.1", - "eslint-plugin-vue": "~10.9.1", + "eslint-plugin-vue": "~10.9.2", "jiti": "^2.7.0", "prettier": "3.8.3", "typescript": "^6.0.3", "vite": "^8.0.16", "vite-ssg": "^28.3.0", - "vue-tsc": "^3.3.3" + "vue-tsc": "^3.3.4" }, "engines": { "node": "^20.19.0 || >=22.12.0" diff --git a/src/config/apps.ts b/src/config/apps.ts index 9468722..370b045 100644 --- a/src/config/apps.ts +++ b/src/config/apps.ts @@ -494,6 +494,50 @@ const pyPackages: Application[] = [ }, ] +const npmPackages: Application[] = [ + { + name: 'VitePress Chat', + github: 'cssnr/vitepress-chat', + url: 'https://cssnr.github.io/vitepress-chat/', + icon: 'https://cssnr.github.io/vitepress-chat/images/logo.svg', + description: 'AI Chat with Trained on Your Documentation.', + badges: { Github: npmDownBadge('vitepress-swiper') }, + links: { NPM: 'https://www.npmjs.com/package/vitepress-swiper' }, + fa: 'npm', + }, + { + name: 'VitePress Swiper', + github: 'cssnr/vitepress-swiper', + url: 'https://vitepress-swiper.cssnr.com/', + icon: 'https://vitepress-swiper.cssnr.com/images/logo.png', + description: 'A VitePress Plugin to add a SwiperJS Photo Gallery.', + badges: { Github: npmDownBadge('cssnr/vitepress-swiper') }, + links: { NPM: 'https://www.npmjs.com/package/@cssnr/vitepress-swiper' }, + fa: 'npm', + }, + { + name: 'VitePress Contributors', + github: 'cssnr/vitepress-plugin-contributors', + url: 'https://vitepress-contributors.cssnr.com/', + icon: 'https://vitepress-contributors.cssnr.com/images/logo.png', + description: 'A VitePress Plugin to generate and display GitHub Contributors.', + badges: { Github: npmDownBadge('cssnr/vitepress-plugin-contributors') }, + links: { NPM: 'https://www.npmjs.com/package/@cssnr/vitepress-plugin-contributors' }, + fa: 'npm', + }, + { + name: 'VitePress CopyButton', + github: 'cssnr/vitepress-plugin-copybutton', + url: 'https://vitepress-copybutton.cssnr.com/', + icon: 'https://vitepress-copybutton.cssnr.com/images/logo.png', + description: + 'A VitePress Plugin to easily add a Copy Button with automatic text detection.', + badges: { Github: npmDownBadge('cssnr/vitepress-plugin-copybutton') }, + links: { NPM: 'https://www.npmjs.com/package/@cssnr/vitepress-plugin-copybutton' }, + fa: 'npm', + }, +] + const mcpServers: Application[] = [ { name: 'FlightAware MCP', @@ -549,40 +593,6 @@ const mcpServers: Application[] = [ }, ] -const npmPackages: Application[] = [ - { - name: 'VitePress Swiper', - github: 'cssnr/vitepress-swiper', - url: 'https://vitepress-swiper.cssnr.com/', - icon: 'https://vitepress-swiper.cssnr.com/images/logo.png', - description: 'A VitePress Plugin to add a SwiperJS Photo Gallery.', - badges: { Github: npmDownBadge('cssnr/vitepress-swiper') }, - links: { NPM: 'https://www.npmjs.com/package/@cssnr/vitepress-swiper' }, - fa: 'npm', - }, - { - name: 'VitePress Contributors', - github: 'cssnr/vitepress-plugin-contributors', - url: 'https://vitepress-contributors.cssnr.com/', - icon: 'https://vitepress-contributors.cssnr.com/images/logo.png', - description: 'A VitePress Plugin to generate and display GitHub Contributors.', - badges: { Github: npmDownBadge('cssnr/vitepress-plugin-contributors') }, - links: { NPM: 'https://www.npmjs.com/package/@cssnr/vitepress-plugin-contributors' }, - fa: 'npm', - }, - { - name: 'VitePress CopyButton', - github: 'cssnr/vitepress-plugin-copybutton', - url: 'https://vitepress-copybutton.cssnr.com/', - icon: 'https://vitepress-copybutton.cssnr.com/images/logo.png', - description: - 'A VitePress Plugin to easily add a Copy Button with automatic text detection.', - badges: { Github: npmDownBadge('cssnr/vitepress-plugin-copybutton') }, - links: { NPM: 'https://www.npmjs.com/package/@cssnr/vitepress-plugin-copybutton' }, - fa: 'npm', - }, -] - const goApps: Application[] = [ { name: 'Back UP', @@ -712,6 +722,16 @@ const dockerImages: Application[] = [ ] const githubActions: Application[] = [ + { + name: 'AI Issue Action', + github: 'cssnr/ai-issue-action', + url: 'https://github.com/cssnr/ai-issue-action', + icon: 'https://raw.githubusercontent.com/cssnr/ai-issue-action/refs/heads/master/.github/assets/logo.svg', + description: 'Automatic AI Issue Triage Action.', + badges: { UsedBy: usedByBadge('cssnr/ai-issue') }, + // links: {}, + fa: 'typescript', + }, { name: 'Web Store Publish', github: 'cssnr/webstore-publish-action', @@ -781,6 +801,26 @@ const githubActions: Application[] = [ }, fa: 'javascript', }, + { + name: 'Zensical Action', + github: 'cssnr/zensical-action', + url: 'https://zensical-action.cssnr.com/', + icon: 'https://raw.githubusercontent.com/smashedr/repo-images/refs/heads/master/zensical-action/logo160.png', + description: 'Checkout, build, upload, and deploy Zensical Docs to GitHub Pages.', + badges: { UsedBy: usedByBadge('cssnr/zensical-action') }, + links: { Actions: 'https://github.com/marketplace/actions/zensical-action' }, + fa: 'javascript', + }, + { + name: 'Homebrew Action', + github: 'cssnr/homebrew-action', + url: 'https://github.com/cssnr/homebrew-action', + icon: 'https://raw.githubusercontent.com/cssnr/homebrew-action/refs/heads/master/.github/assets/logo.svg', + description: 'Homebrew Action to Update Formula url, version and sha256.', + badges: { UsedBy: usedByBadge('cssnr/homebrew-action') }, + links: { Actions: 'https://github.com/marketplace/actions/homebrew-action' }, + fa: 'javascript', + }, { name: 'Mirror Repository Action', github: 'cssnr/mirror-repository-action', @@ -840,26 +880,6 @@ const githubActions: Application[] = [ links: { Actions: 'https://github.com/marketplace/actions/rhysd-actionlint-action' }, fa: 'javascript', }, - { - name: 'Zensical Action', - github: 'cssnr/zensical-action', - url: 'https://zensical-action.cssnr.com/', - icon: 'https://raw.githubusercontent.com/smashedr/repo-images/refs/heads/master/zensical-action/logo160.png', - description: 'Checkout, build, upload, and deploy Zensical Docs to GitHub Pages.', - badges: { UsedBy: usedByBadge('cssnr/zensical-action') }, - links: { Actions: 'https://github.com/marketplace/actions/zensical-action' }, - fa: 'javascript', - }, - { - name: 'Homebrew Action', - github: 'cssnr/homebrew-action', - url: 'https://github.com/cssnr/homebrew-action', - icon: 'https://raw.githubusercontent.com/cssnr/homebrew-action/refs/heads/master/.github/assets/logo.svg', - description: 'Homebrew Action to Update Formula url, version and sha256.', - badges: { UsedBy: usedByBadge('cssnr/homebrew-action') }, - links: { Actions: 'https://github.com/marketplace/actions/homebrew-action' }, - fa: 'javascript', - }, { name: 'Package Changelog Action', github: 'cssnr/package-changelog-action', @@ -1032,16 +1052,6 @@ const githubActions: Application[] = [ // links: {}, fa: 'powershell', }, - { - name: 'AI Issue Action', - github: 'smashedr/ai-issue-action', - url: 'https://github.com/smashedr/ai-issue-action', - icon: 'https://raw.githubusercontent.com/smashedr/ai-issue-action/refs/heads/master/.github/assets/logo.svg', - description: 'Automatic AI Issue Triage Action.', - badges: { UsedBy: usedByBadge('smashedr/ai-issue') }, - // links: {}, - fa: 'typescript', - }, { name: 'JavaScript Template Action', github: 'smashedr/javascript-action', @@ -1095,6 +1105,16 @@ const githubActions: Application[] = [ ] const otherSoftware: Application[] = [ + { + name: 'Chat Server', + github: 'cssnr/vitepress-chat', + url: 'https://cssnr.github.io/vitepress-chat/', + icon: 'https://cssnr.github.io/vitepress-chat/images/logo.svg', + description: 'AI Chat Server Designed to work with VitePress Chat.', + badges: { Size: imageSizeBadge('cssnr/chat-server', 'chat-server') }, + links: { 'VitePress Plugin': 'https://cssnr.github.io/vitepress-chat/' }, + fa: 'javascript', + }, { name: "Carl's Cogs", github: 'smashedr/carl-cogs', @@ -1148,8 +1168,8 @@ const categories: Category[] = [ { name: 'Web Extensions', id: 'webExtensions', apps: webExtensions }, { name: 'Mobile Applications', id: 'mobileApplications', apps: mobileApplications }, { name: 'Python Packages', id: 'pyPackages', apps: pyPackages }, - { name: 'MCP Servers', id: 'mcpServers', apps: mcpServers }, { name: 'NPM Packages', id: 'npmPackages', apps: npmPackages }, + { name: 'MCP Servers', id: 'mcpServers', apps: mcpServers }, { name: 'Go Apps', id: 'goApps', apps: goApps }, { name: 'Web Applications', id: 'webApplications', apps: webApplications }, { name: 'GitHub Actions', id: 'githubActions', apps: githubActions }, diff --git a/src/main.ts b/src/main.ts index 5b10081..b603bed 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,7 +8,7 @@ import 'bootstrap' import { ViteSSG } from 'vite-ssg' import App from '@/App.vue' -import { routes } from '@/router' +import { routes, scrollBehavior } from '@/router' // noinspection JSUnusedGlobalSymbols -export const createApp = ViteSSG(App, { routes }) +export const createApp = ViteSSG(App, { routes, scrollBehavior }) diff --git a/src/router/index.ts b/src/router/index.ts index 8ad8f2e..1cb403b 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,4 +1,4 @@ -import { createRouter, createWebHistory } from 'vue-router' +import { createRouter, createWebHistory, type RouterScrollBehavior } from 'vue-router' import HomeView from '../views/HomeView.vue' import NotFoundView from '../views/NotFoundView.vue' @@ -26,13 +26,15 @@ export const routes = [ }, ] +export const scrollBehavior: RouterScrollBehavior = (to, from, savedPosition) => { + if (to.hash) return { el: to.hash, behavior: 'smooth' } + if (savedPosition) return savedPosition + return { top: 0, behavior: 'smooth' } +} + const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), - scrollBehavior(to, from, savedPosition) { - if (to.hash) return { el: to.hash, behavior: 'smooth' } - if (savedPosition) return savedPosition - return { top: 0, behavior: 'smooth' } - }, + scrollBehavior, routes, })