-
Notifications
You must be signed in to change notification settings - Fork 1
feat: add social share buttons to footer #149
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
dd2a812
a0c596f
d071b43
d37f497
1911cc5
1e0da12
ff96067
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -55,3 +55,17 @@ | ||||||||||||||||||||||||||||
| cache: 'npm' | |||||||||||||||||||||||||||||
| - run: npm ci | |||||||||||||||||||||||||||||
| - run: npm run build | |||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
| e2e: | |||||||||||||||||||||||||||||
| name: E2E Tests | |||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | |||||||||||||||||||||||||||||
| needs: [build] | |||||||||||||||||||||||||||||
| steps: | |||||||||||||||||||||||||||||
| - uses: actions/checkout@v4 | |||||||||||||||||||||||||||||
| - uses: actions/setup-node@v4 | |||||||||||||||||||||||||||||
| with: | |||||||||||||||||||||||||||||
| node-version: '20' | |||||||||||||||||||||||||||||
| cache: 'npm' | |||||||||||||||||||||||||||||
| - run: npm ci | |||||||||||||||||||||||||||||
| - run: npx playwright install --with-deps | |||||||||||||||||||||||||||||
| - run: npm run e2e | |||||||||||||||||||||||||||||
|
Comment on lines
+60
to
+71
Check warningCode scanning / CodeQL Workflow does not contain permissions Medium
Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
Copilot AutofixAI 3 months ago In general, the fix is to add an explicit The best fix with no functional change is: in Concretely: edit permissions:
contents: readat the top workflow level (aligned with
Suggested changeset
1
.github/workflows/ci.yml
Copilot is powered by AI and may make mistakes. Always verify output.
Refresh and try again.
Comment on lines
+59
to
+71
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add explicit permissions to limit The CodeQL analysis correctly flags that this job lacks a permissions block. Adding minimal permissions improves security posture. 🛡️ Proposed fix e2e:
name: E2E Tests
runs-on: ubuntu-latest
needs: [build]
+ permissions:
+ contents: read
steps:🧰 Tools🪛 GitHub Check: CodeQL[warning] 60-71: Workflow does not contain permissions 🤖 Prompt for AI Agents
Comment on lines
+69
to
+71
|
|||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,2 +1,5 @@ | ||
| node_modules/ | ||
| dist/ | ||
|
|
||
| *storybook.log | ||
| storybook-static |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| import type { StorybookConfig } from '@storybook/react-vite'; | ||
|
|
||
| const config: StorybookConfig = { | ||
| "stories": [ | ||
| "../src/**/*.mdx", | ||
| "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)" | ||
| ], | ||
| "addons": [ | ||
| "@chromatic-com/storybook", | ||
| "@storybook/addon-vitest", | ||
| "@storybook/addon-a11y", | ||
| "@storybook/addon-docs", | ||
| "@storybook/addon-onboarding" | ||
| ], | ||
| "framework": "@storybook/react-vite" | ||
| }; | ||
| export default config; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| import type { Preview } from '@storybook/react-vite'; | ||
|
|
||
| const preview: Preview = { | ||
| parameters: { | ||
| controls: { | ||
| matchers: { | ||
| color: /(background|color)$/i, | ||
| date: /Date$/i, | ||
| }, | ||
| }, | ||
|
|
||
| a11y: { | ||
| // 'todo' - show a11y violations in the test UI only | ||
| // 'error' - fail CI on a11y violations | ||
| // 'off' - skip a11y checks entirely | ||
| test: 'todo', | ||
| }, | ||
| }, | ||
| }; | ||
|
|
||
| export default preview; |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,86 +1,83 @@ | ||||||||||||||||||||||||||||||||||
| // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format | ||||||||||||||||||||||||||||||||||
| import storybook from "eslint-plugin-storybook"; | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| import js from '@eslint/js'; | ||||||||||||||||||||||||||||||||||
| import typescript from '@typescript-eslint/eslint-plugin'; | ||||||||||||||||||||||||||||||||||
| import typescriptParser from '@typescript-eslint/parser'; | ||||||||||||||||||||||||||||||||||
| import reactRefresh from 'eslint-plugin-react-refresh'; | ||||||||||||||||||||||||||||||||||
| import globals from 'globals'; | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| export default [ | ||||||||||||||||||||||||||||||||||
| js.configs.recommended, | ||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||
| ignores: ['dist/', 'node_modules/', 'vite.config.js'], | ||||||||||||||||||||||||||||||||||
| export default [js.configs.recommended, { | ||||||||||||||||||||||||||||||||||
| ignores: ['dist/', 'node_modules/', 'vite.config.js'], | ||||||||||||||||||||||||||||||||||
| }, { | ||||||||||||||||||||||||||||||||||
| files: ['*.config.ts', '*.config.js'], | ||||||||||||||||||||||||||||||||||
| languageOptions: { | ||||||||||||||||||||||||||||||||||
| parser: typescriptParser, | ||||||||||||||||||||||||||||||||||
| parserOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaVersion: 'latest', | ||||||||||||||||||||||||||||||||||
| sourceType: 'module', | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| globals: { | ||||||||||||||||||||||||||||||||||
| ...globals.node, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||
| files: ['*.config.ts', '*.config.js'], | ||||||||||||||||||||||||||||||||||
| languageOptions: { | ||||||||||||||||||||||||||||||||||
| parser: typescriptParser, | ||||||||||||||||||||||||||||||||||
| parserOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaVersion: 'latest', | ||||||||||||||||||||||||||||||||||
| sourceType: 'module', | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| globals: { | ||||||||||||||||||||||||||||||||||
| ...globals.node, | ||||||||||||||||||||||||||||||||||
| }, { | ||||||||||||||||||||||||||||||||||
| files: ['**/*.{js,jsx}'], | ||||||||||||||||||||||||||||||||||
| languageOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaVersion: 'latest', | ||||||||||||||||||||||||||||||||||
| sourceType: 'module', | ||||||||||||||||||||||||||||||||||
| parserOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaFeatures: { | ||||||||||||||||||||||||||||||||||
| jsx: true, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| globals: { | ||||||||||||||||||||||||||||||||||
| window: 'readonly', | ||||||||||||||||||||||||||||||||||
| document: 'readonly', | ||||||||||||||||||||||||||||||||||
| console: 'readonly', | ||||||||||||||||||||||||||||||||||
| localStorage: 'readonly', | ||||||||||||||||||||||||||||||||||
| navigator: 'readonly', | ||||||||||||||||||||||||||||||||||
| setTimeout: 'readonly', | ||||||||||||||||||||||||||||||||||
| File: 'readonly', | ||||||||||||||||||||||||||||||||||
| Element: 'readonly', | ||||||||||||||||||||||||||||||||||
| HTMLInputElement: 'readonly', | ||||||||||||||||||||||||||||||||||
| React: 'readonly', | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
|
Comment on lines
+34
to
+45
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial Use The ♻️ Proposed fix globals: {
- window: 'readonly',
- document: 'readonly',
- console: 'readonly',
- localStorage: 'readonly',
- navigator: 'readonly',
- setTimeout: 'readonly',
- File: 'readonly',
- Element: 'readonly',
- HTMLInputElement: 'readonly',
- React: 'readonly',
+ ...globals.browser,
},Apply the same change to the 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| rules: { | ||||||||||||||||||||||||||||||||||
| 'no-unused-vars': 'warn', | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||
| files: ['**/*.{js,jsx}'], | ||||||||||||||||||||||||||||||||||
| languageOptions: { | ||||||||||||||||||||||||||||||||||
| }, { | ||||||||||||||||||||||||||||||||||
| files: ['**/*.{ts,tsx}'], | ||||||||||||||||||||||||||||||||||
| languageOptions: { | ||||||||||||||||||||||||||||||||||
| parser: typescriptParser, | ||||||||||||||||||||||||||||||||||
| parserOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaVersion: 'latest', | ||||||||||||||||||||||||||||||||||
| sourceType: 'module', | ||||||||||||||||||||||||||||||||||
| parserOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaFeatures: { | ||||||||||||||||||||||||||||||||||
| jsx: true, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| globals: { | ||||||||||||||||||||||||||||||||||
| window: 'readonly', | ||||||||||||||||||||||||||||||||||
| document: 'readonly', | ||||||||||||||||||||||||||||||||||
| console: 'readonly', | ||||||||||||||||||||||||||||||||||
| localStorage: 'readonly', | ||||||||||||||||||||||||||||||||||
| navigator: 'readonly', | ||||||||||||||||||||||||||||||||||
| setTimeout: 'readonly', | ||||||||||||||||||||||||||||||||||
| File: 'readonly', | ||||||||||||||||||||||||||||||||||
| Element: 'readonly', | ||||||||||||||||||||||||||||||||||
| HTMLInputElement: 'readonly', | ||||||||||||||||||||||||||||||||||
| React: 'readonly', | ||||||||||||||||||||||||||||||||||
| ecmaFeatures: { | ||||||||||||||||||||||||||||||||||
| jsx: true, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| rules: { | ||||||||||||||||||||||||||||||||||
| 'no-unused-vars': 'warn', | ||||||||||||||||||||||||||||||||||
| globals: { | ||||||||||||||||||||||||||||||||||
| window: 'readonly', | ||||||||||||||||||||||||||||||||||
| document: 'readonly', | ||||||||||||||||||||||||||||||||||
| console: 'readonly', | ||||||||||||||||||||||||||||||||||
| localStorage: 'readonly', | ||||||||||||||||||||||||||||||||||
| navigator: 'readonly', | ||||||||||||||||||||||||||||||||||
| setTimeout: 'readonly', | ||||||||||||||||||||||||||||||||||
| File: 'readonly', | ||||||||||||||||||||||||||||||||||
| Element: 'readonly', | ||||||||||||||||||||||||||||||||||
| HTMLInputElement: 'readonly', | ||||||||||||||||||||||||||||||||||
| React: 'readonly', | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||
| files: ['**/*.{ts,tsx}'], | ||||||||||||||||||||||||||||||||||
| languageOptions: { | ||||||||||||||||||||||||||||||||||
| parser: typescriptParser, | ||||||||||||||||||||||||||||||||||
| parserOptions: { | ||||||||||||||||||||||||||||||||||
| ecmaVersion: 'latest', | ||||||||||||||||||||||||||||||||||
| sourceType: 'module', | ||||||||||||||||||||||||||||||||||
| ecmaFeatures: { | ||||||||||||||||||||||||||||||||||
| jsx: true, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| globals: { | ||||||||||||||||||||||||||||||||||
| window: 'readonly', | ||||||||||||||||||||||||||||||||||
| document: 'readonly', | ||||||||||||||||||||||||||||||||||
| console: 'readonly', | ||||||||||||||||||||||||||||||||||
| localStorage: 'readonly', | ||||||||||||||||||||||||||||||||||
| navigator: 'readonly', | ||||||||||||||||||||||||||||||||||
| setTimeout: 'readonly', | ||||||||||||||||||||||||||||||||||
| File: 'readonly', | ||||||||||||||||||||||||||||||||||
| Element: 'readonly', | ||||||||||||||||||||||||||||||||||
| HTMLInputElement: 'readonly', | ||||||||||||||||||||||||||||||||||
| React: 'readonly', | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| plugins: { | ||||||||||||||||||||||||||||||||||
| '@typescript-eslint': typescript, | ||||||||||||||||||||||||||||||||||
| 'react-refresh': reactRefresh, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| rules: { | ||||||||||||||||||||||||||||||||||
| ...typescript.configs.recommended.rules, | ||||||||||||||||||||||||||||||||||
| '@typescript-eslint/no-unused-vars': 'warn', | ||||||||||||||||||||||||||||||||||
| 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| plugins: { | ||||||||||||||||||||||||||||||||||
| '@typescript-eslint': typescript, | ||||||||||||||||||||||||||||||||||
| 'react-refresh': reactRefresh, | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| rules: { | ||||||||||||||||||||||||||||||||||
| ...typescript.configs.recommended.rules, | ||||||||||||||||||||||||||||||||||
| '@typescript-eslint/no-unused-vars': 'warn', | ||||||||||||||||||||||||||||||||||
| 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], | ||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||
| ]; | ||||||||||||||||||||||||||||||||||
| }, ...storybook.configs["flat/recommended"]]; | ||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
needs: [build]is misleading—e2e tests don't use build artifacts.Per
playwright.config.ts, the e2e tests runnpm run dev(port 5173), starting their own development server. The build job's artifacts are not consumed. Consider either:needs: [build]and run e2e in parallel with build, orvite previewagainstdist/so e2e actually tests the production build.Option 2 is generally preferred for CI since it validates the actual build output.
🤖 Prompt for AI Agents