Skip to content

Commit e2323cf

Browse files
committed
Merge branch 'feat/atproto-blog-fe' into announcement-post
2 parents 5131781 + ae47eb9 commit e2323cf

131 files changed

Lines changed: 6142 additions & 1473 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/autofix.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ jobs:
3232
- name: 📦 Install dependencies
3333
run: pnpm install
3434

35+
- name: 🎨 Check for non-RTL CSS classes
36+
run: pnpm rtl:check
37+
3538
- name: 🌐 Compare translations
3639
run: pnpm i18n:check
3740

.github/workflows/ci.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,12 @@ jobs:
117117
- name: 🧪 Component tests
118118
run: pnpm test:nuxt run --coverage --reporter=junit --outputFile=test-report.junit.xml
119119

120-
- name: ⬆︎ Upload test results to Codecov
121-
if: ${{ !cancelled() }}
122-
uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3 # v1
120+
- name: ⬆︎ Upload coverage reports to Codecov
121+
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5
123122
with:
124-
token: ${{ secrets.CODECOV_TOKEN }}
123+
report_type: test_results
124+
env:
125+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
125126

126127
- name: ⬆︎ Upload coverage reports to Codecov
127128
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5

.oxlintrc.json

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://unpkg.com/oxlint/configuration_schema.json",
33
"plugins": ["unicorn", "typescript", "oxc", "vue", "vitest"],
4-
"jsPlugins": ["@e18e/eslint-plugin"],
4+
"jsPlugins": ["@e18e/eslint-plugin", "eslint-plugin-regexp"],
55
"categories": {
66
"correctness": "error",
77
"suspicious": "warn",
@@ -17,7 +17,72 @@
1717
"e18e/prefer-timer-args": "error",
1818
"e18e/prefer-date-now": "error",
1919
"e18e/prefer-regex-test": "error",
20-
"e18e/prefer-array-some": "error"
20+
"e18e/prefer-array-some": "error",
21+
// RegExp - Possible Errors (most critical)
22+
"regexp/no-contradiction-with-assertion": "error",
23+
"regexp/no-dupe-disjunctions": "error",
24+
"regexp/no-empty-alternative": "error",
25+
"regexp/no-empty-capturing-group": "error",
26+
"regexp/no-empty-character-class": "error",
27+
"regexp/no-empty-group": "error",
28+
"regexp/no-empty-lookarounds-assertion": "error",
29+
"regexp/no-escape-backspace": "error",
30+
"regexp/no-invalid-regexp": "error",
31+
"regexp/no-lazy-ends": "error",
32+
"regexp/no-misleading-capturing-group": "error",
33+
"regexp/no-misleading-unicode-character": "error",
34+
"regexp/no-missing-g-flag": "error",
35+
"regexp/no-optional-assertion": "error",
36+
"regexp/no-potentially-useless-backreference": "error",
37+
"regexp/no-super-linear-backtracking": "error",
38+
"regexp/no-useless-assertions": "error",
39+
"regexp/no-useless-backreference": "error",
40+
"regexp/no-useless-dollar-replacements": "error",
41+
"regexp/strict": "error",
42+
// RegExp - Best Practices
43+
"regexp/confusing-quantifier": "warn",
44+
"regexp/control-character-escape": "error",
45+
"regexp/negation": "error",
46+
"regexp/no-dupe-characters-character-class": "error",
47+
"regexp/no-empty-string-literal": "error",
48+
"regexp/no-extra-lookaround-assertions": "error",
49+
"regexp/no-invisible-character": "error",
50+
"regexp/no-legacy-features": "error",
51+
"regexp/no-non-standard-flag": "error",
52+
"regexp/no-obscure-range": "error",
53+
"regexp/no-octal": "error",
54+
"regexp/no-standalone-backslash": "error",
55+
"regexp/no-trivially-nested-assertion": "error",
56+
"regexp/no-trivially-nested-quantifier": "error",
57+
"regexp/no-unused-capturing-group": "warn",
58+
"regexp/no-useless-character-class": "error",
59+
"regexp/no-useless-flag": "error",
60+
"regexp/no-useless-lazy": "error",
61+
"regexp/no-useless-quantifier": "error",
62+
"regexp/no-useless-range": "error",
63+
"regexp/no-useless-set-operand": "error",
64+
"regexp/no-useless-string-literal": "error",
65+
"regexp/no-useless-two-nums-quantifier": "error",
66+
"regexp/no-zero-quantifier": "error",
67+
"regexp/optimal-lookaround-quantifier": "warn",
68+
"regexp/optimal-quantifier-concatenation": "error",
69+
"regexp/prefer-predefined-assertion": "error",
70+
"regexp/prefer-range": "error",
71+
"regexp/prefer-set-operation": "error",
72+
"regexp/simplify-set-operations": "error",
73+
"regexp/use-ignore-case": "error",
74+
// RegExp - Stylistic Issues (less critical, focused on consistency)
75+
"regexp/match-any": "warn",
76+
"regexp/no-useless-escape": "warn",
77+
"regexp/no-useless-non-capturing-group": "warn",
78+
"regexp/prefer-character-class": "warn",
79+
"regexp/prefer-d": "warn",
80+
"regexp/prefer-plus-quantifier": "warn",
81+
"regexp/prefer-question-quantifier": "warn",
82+
"regexp/prefer-star-quantifier": "warn",
83+
"regexp/prefer-unicode-codepoint-escapes": "warn",
84+
"regexp/prefer-w": "warn",
85+
"regexp/sort-flags": "warn"
2186
},
2287
"overrides": [
2388
{

.vscode/settings.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{
2+
"editor.defaultFormatter": "oxc.oxc-vscode",
3+
"editor.formatOnSave": true,
4+
"i18n-ally.keystyle": "nested",
25
"i18n-ally.localesPaths": ["./i18n/locales"],
3-
"i18n-ally.keystyle": "nested"
6+
"typescript.tsdk": "node_modules/typescript/lib"
47
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ We welcome contributions – please do feel free to explore the project and
157157
- [npkg.lorypelli.dev](https://npkg.lorypelli.dev/) – An alternative frontend to npm made with as little client-side JavaScript as possible
158158
- [vscode-npmx](https://github.com/npmx-dev/vscode-npmx) – VSCode extension for npmx
159159
- [nxjt](https://nxjt.netlify.app) – npmx Jump To: Quickly navigate to npmx common webpages.
160+
- [npmx-weekly](https://npmx-weekly.trueberryless.org/) – A weekly newsletter for the npmx ecosystem. Add your own content via suggestions in the weekly PR on [GitHub](https://github.com/trueberryless-org/npmx-weekly/pulls?q=is%3Aopen+is%3Apr+label%3A%22%F0%9F%95%94+weekly+post%22).
160161
- [npmx-digest](https://npmx-digest.trueberryless.org/) – An automated news aggregation website that summarizes npmx activity from GitHub and Bluesky every 8 hours.
161162

162163
If you're building something cool, let us know! 🙏

app/app.vue

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ if (import.meta.client) {
121121
<template>
122122
<div class="min-h-screen flex flex-col bg-bg text-fg">
123123
<NuxtPwaAssets />
124-
<a href="#main-content" class="skip-link font-mono">{{ $t('common.skip_link') }}</a>
124+
<LinkBase to="#main-content" variant="button-primary" class="skip-link">{{
125+
$t('common.skip_link')
126+
}}</LinkBase>
125127

126128
<AppHeader :show-logo="!isHomepage" />
127129

@@ -140,19 +142,9 @@ if (import.meta.client) {
140142
.skip-link {
141143
position: fixed;
142144
top: -100%;
143-
inset-inline-start: 0;
144-
padding: 0.5rem 1rem;
145-
background: var(--fg);
146-
color: var(--bg);
147-
font-size: 0.875rem;
148145
z-index: 100;
149-
transition: top 0.2s ease;
150146
}
151147
152-
.skip-link:hover {
153-
color: var(--bg);
154-
text-decoration: underline;
155-
}
156148
.skip-link:focus {
157149
top: 0;
158150
}

app/assets/main.css

Lines changed: 43 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,19 @@
55
box-sizing: border-box;
66
}
77

8+
:root:not([data-theme='light']),
89
:root[data-theme='dark'] {
910
/* background colors */
10-
--bg: var(--bg-color, oklch(0.145 0 0));
11-
--bg-subtle: var(--bg-subtle-color, oklch(0.178 0 0));
11+
--bg: var(--bg-color, oklch(0.171 0 0));
12+
--bg-subtle: var(--bg-subtle-color, oklch(0.198 0 0));
13+
--bg-muted: var(--bg-muted-color, oklch(0.236 0 0));
14+
--bg-elevated: var(--bg-elevated-color, oklch(0.266 0 0));
1215
--bg-blog: oklch(0.195 0 0);
13-
--bg-muted: var(--bg-muted-color, oklch(0.218 0 0));
14-
--bg-elevated: var(--bg-elevated-color, oklch(0.252 0 0));
1516

1617
/* text colors */
17-
--fg: oklch(0.985 0 0);
18-
--fg-muted: oklch(0.709 0 0);
19-
--fg-subtle: oklch(0.633 0 0);
18+
--fg: oklch(0.982 0 0);
19+
--fg-muted: oklch(0.749 0 0);
20+
--fg-subtle: oklch(0.673 0 0);
2021

2122
/* border, separator colors */
2223
--border: oklch(0.269 0 0);
@@ -45,24 +46,24 @@
4546
}
4647

4748
:root[data-theme='dark'][data-bg-theme='slate'] {
48-
--bg: oklch(0.129 0.012 264.695);
49-
--bg-subtle: oklch(0.159 0.022 262.421);
50-
--bg-muted: oklch(0.204 0.033 261.234);
51-
--bg-elevated: oklch(0.259 0.041 260.031);
49+
--bg: oklch(0.151 0.018 264.695);
50+
--bg-subtle: oklch(0.179 0.015 262.421);
51+
--bg-muted: oklch(0.214 0.018 261.234);
52+
--bg-elevated: oklch(0.259 0.021 260.031);
5253
}
5354

5455
:root[data-theme='dark'][data-bg-theme='zinc'] {
55-
--bg: oklch(0.141 0.005 285.823);
56-
--bg-subtle: oklch(0.168 0.005 285.894);
57-
--bg-muted: oklch(0.209 0.005 285.929);
56+
--bg: oklch(0.158 0.005 285.823);
57+
--bg-subtle: oklch(0.188 0.005 285.894);
58+
--bg-muted: oklch(0.219 0.005 285.929);
5859
--bg-elevated: oklch(0.256 0.006 286.033);
5960
}
6061

6162
:root[data-theme='dark'][data-bg-theme='stone'] {
62-
--bg: oklch(0.147 0.004 49.25);
63-
--bg-subtle: oklch(0.178 0.004 49.321);
64-
--bg-muted: oklch(0.218 0.004 49.386);
65-
--bg-elevated: oklch(0.252 0.007 34.298);
63+
--bg: oklch(0.164 0.004 89.25);
64+
--bg-subtle: oklch(0.198 0.008 89.321);
65+
--bg-muted: oklch(0.228 0.015 89.386);
66+
--bg-elevated: oklch(0.252 0.018 84.298);
6667
}
6768

6869
:root[data-theme='dark'][data-bg-theme='black'] {
@@ -75,12 +76,12 @@
7576
:root[data-theme='light'] {
7677
--bg: var(--bg-color, oklch(1 0 0));
7778
--bg-subtle: var(--bg-subtle-color, oklch(0.979 0.001 286.375));
78-
--bg-muted: var(--bg-muted-color, oklch(0.955 0 0));
79-
--bg-elevated: var(--bg-elevated-color, oklch(0.94 0 0));
79+
--bg-muted: var(--bg-muted-color, oklch(0.955 0.001 286.76));
80+
--bg-elevated: var(--bg-elevated-color, oklch(0.94 0.002 287.29));
8081

81-
--fg: oklch(0.145 0 0);
82-
--fg-muted: oklch(0.439 0 0);
83-
--fg-subtle: oklch(0.52 0 0);
82+
--fg: oklch(0.146 0 0);
83+
--fg-muted: oklch(0.398 0 0);
84+
--fg-subtle: oklch(0.48 0 0);
8485

8586
--border: oklch(0.8514 0 0);
8687
--border-subtle: oklch(0.922 0 0);
@@ -106,9 +107,9 @@
106107

107108
:root[data-theme='light'][data-bg-theme='slate'] {
108109
--bg: oklch(1 0 0);
109-
--bg-subtle: oklch(0.982 0.006 264.62);
110-
--bg-muted: oklch(0.96 0.041 261.234);
111-
--bg-elevated: oklch(0.943 0.013 255.52);
110+
--bg-subtle: oklch(0.982 0.008 269.62);
111+
--bg-muted: oklch(0.96 0.008 261.234);
112+
--bg-elevated: oklch(0.943 0.012 255.52);
112113
}
113114

114115
:root[data-theme='light'][data-bg-theme='zinc'] {
@@ -120,9 +121,13 @@
120121

121122
:root[data-theme='light'][data-bg-theme='stone'] {
122123
--bg: oklch(1 0 0);
123-
--bg-subtle: oklch(0.979 0.005 48.762);
124-
--bg-muted: oklch(0.958 0.005 48.743);
125-
--bg-elevated: oklch(0.943 0.005 48.731);
124+
--bg-subtle: oklch(0.979 0.004 88.762);
125+
--bg-muted: oklch(0.958 0.005 88.743);
126+
--bg-elevated: oklch(0.943 0.005 88.731);
127+
}
128+
129+
:root[data-theme='light'][data-bg-theme='black'] {
130+
--bg-subtle: var(--bg-subtle-color, oklch(0.979 0 0));
126131
}
127132

128133
@media (prefers-contrast: more) {
@@ -155,7 +160,8 @@ html {
155160
-webkit-font-smoothing: antialiased;
156161
-moz-osx-font-smoothing: grayscale;
157162
text-rendering: optimizeLegibility;
158-
scroll-padding-top: 5rem; /* Offset for fixed header - otherwise anchor headers are cutted */
163+
/* Offset for fixed header - otherwise anchor headers are cutted */
164+
scroll-padding-top: 5rem;
159165
scrollbar-gutter: stable;
160166
}
161167

@@ -181,26 +187,13 @@ body {
181187
line-height: 1.6;
182188
}
183189

184-
/* Default link styling for accessibility on dark background */
185-
a {
186-
color: var(--fg);
187-
text-decoration: underline;
188-
text-underline-offset: 3px;
189-
text-decoration-color: var(--fg-subtle);
190-
transition:
191-
color 0.2s ease,
192-
text-decoration-color 0.2s ease;
193-
}
194-
195-
a:hover {
196-
color: var(--accent);
197-
text-decoration-color: var(--accent);
198-
}
199-
200-
a:focus-visible {
201-
outline: 2px solid var(--accent);
202-
outline-offset: 2px;
203-
border-radius: 4px;
190+
:focus-visible,
191+
:-moz-focusring {
192+
/* weird Firefox behavior makes it necessary to add `!important`
193+
or otherwise the selector would need to be more specific,
194+
which it explicitly should not be. */
195+
outline: 2px solid var(--accent) !important;
196+
outline-offset: 2px !important;
204197
}
205198

206199
/* Reset dd margin (browser default is margin-left: 40px) */
@@ -210,18 +203,7 @@ dd {
210203

211204
/* Reset button styles */
212205
button {
213-
background: transparent;
214-
border: none;
215206
cursor: pointer;
216-
font: inherit;
217-
padding: 0;
218-
}
219-
220-
button:focus-visible,
221-
select:focus-visible {
222-
outline: 2px solid var(--accent);
223-
outline-offset: 2px;
224-
border-radius: 4px;
225207
}
226208

227209
/* Selection */

0 commit comments

Comments
 (0)