detached ececade

Merge pull request #70 from kitpdr/chore/bump-deps-fix-warnings

chore: bump dependencies and fix svelte-check warnings
commit
ececadedccbec192c1946d7137bf46a45aa13bc2
author
KiT · · 2026-01-18 17:00 UTC
committer
GitHub · · 2026-01-18 17:00 UTC
merge of
8884c00 + 2901b24 · diff against the first parent
signature
GPG UnverifiedB5690EEEBB952194 The key is unknown
8 files · +1803 -1694
R static/_headers → _headers +0 -0 renamed, 100% similar

renamed, 100% similar

M package.json +35 -34
@@ -23,53 +23,54 @@
2323 "db:flush": "tsx utils/db-flush.ts"
2424 },
2525 "devDependencies": {
26- "@eslint/compat": "^1.4.1",
27- "@eslint/js": "^9.39.1",
28- "@sveltejs/adapter-cloudflare": "^5.1.0",
29- "@sveltejs/kit": "^2.49.0",
30- "@sveltejs/vite-plugin-svelte": "^5.1.1",
31- "@tailwindcss/cli": "^4.1.17",
32- "@tailwindcss/forms": "^0.5.10",
26+ "@eslint/compat": "^2.0.1",
27+ "@eslint/js": "^9.39.2",
28+ "@sveltejs/adapter-cloudflare": "^7.2.5",
29+ "@sveltejs/kit": "^2.50.0",
30+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
31+ "@tailwindcss/cli": "^4.1.18",
32+ "@tailwindcss/forms": "^0.5.11",
3333 "@tailwindcss/typography": "^0.5.19",
34- "@tailwindcss/vite": "^4.1.17",
35- "@types/node": "^24.10.1",
36- "autoprefixer": "^10.4.22",
37- "drizzle-kit": "^0.31.7",
38- "eslint": "^9.39.1",
34+ "@tailwindcss/vite": "^4.1.18",
35+ "@types/node": "^25.0.9",
36+ "autoprefixer": "^10.4.23",
37+ "drizzle-kit": "^0.31.8",
38+ "eslint": "^9.39.2",
3939 "eslint-config-prettier": "^10.1.8",
40- "eslint-plugin-svelte": "^3.13.0",
41- "globals": "^15.15.0",
42- "jsdom": "^26.1.0",
43- "prettier": "^3.6.2",
44- "prettier-plugin-svelte": "^3.4.0",
45- "prettier-plugin-tailwindcss": "^0.6.14",
46- "svelte": "^5.43.14",
47- "svelte-check": "^4.3.4",
48- "tailwindcss": "^4.1.17",
49- "terser": "^5.44.1",
50- "tsx": "^4.20.6",
40+ "eslint-plugin-svelte": "^3.14.0",
41+ "globals": "^17.0.0",
42+ "jsdom": "^27.4.0",
43+ "prettier": "^3.8.0",
44+ "prettier-plugin-svelte": "^3.4.1",
45+ "prettier-plugin-tailwindcss": "^0.7.2",
46+ "svelte": "^5.46.4",
47+ "svelte-check": "^4.3.5",
48+ "tailwindcss": "^4.1.18",
49+ "terser": "^5.46.0",
50+ "tsx": "^4.21.0",
5151 "tw-animate-css": "^1.4.0",
5252 "typescript": "^5.9.3",
53- "typescript-eslint": "^8.47.0",
54- "vite": "^6.4.1",
55- "vitest": "^3.2.4"
53+ "typescript-eslint": "^8.53.0",
54+ "vite": "^7.3.1",
55+ "vitest": "^4.0.17",
56+ "wrangler": "^4.59.2"
5657 },
5758 "dependencies": {
58- "@libsql/client": "^0.15.15",
59- "@lucide/svelte": "^0.561.0",
60- "dotenv": "^16.6.1",
61- "drizzle-orm": "^0.44.7",
62- "pino": "^9.14.0",
63- "pino-pretty": "^13.1.2",
59+ "@libsql/client": "^0.17.0",
60+ "@lucide/svelte": "^0.562.0",
61+ "dotenv": "^17.2.3",
62+ "drizzle-orm": "^0.45.1",
63+ "pino": "^10.2.0",
64+ "pino-pretty": "^13.1.3",
6465 "rehype": "^13.0.2",
6566 "rehype-sanitize": "^6.0.0",
6667 "rehype-stringify": "^10.0.1",
6768 "remark-parse": "^11.0.0",
6869 "remark-rehype": "^11.1.2",
6970 "unified": "^11.0.5",
70- "uuid": "^11.1.0",
71+ "uuid": "^13.0.0",
7172 "xp.css": "^0.2.6",
72- "zod": "^4.1.13"
73+ "zod": "^4.3.5"
7374 },
7475 "packageManager": "pnpm@10.25.0+sha512.5e82639027af37cf832061bcc6d639c219634488e0f2baebe785028a793de7b525ffcd3f7ff574f5e9860654e098fe852ba8ac5dd5cefe1767d23a020a92f501"
7576 }
@@ -23,53 +23,54 @@
23 "db:flush": "tsx utils/db-flush.ts"23 "db:flush": "tsx utils/db-flush.ts"
24 },24 },
25 "devDependencies": {25 "devDependencies": {
26- "@eslint/compat": "^1.4.1",26+ "@eslint/compat": "^2.0.1",
27- "@eslint/js": "^9.39.1",27+ "@eslint/js": "^9.39.2",
28- "@sveltejs/adapter-cloudflare": "^5.1.0",28+ "@sveltejs/adapter-cloudflare": "^7.2.5",
29- "@sveltejs/kit": "^2.49.0",29+ "@sveltejs/kit": "^2.50.0",
30- "@sveltejs/vite-plugin-svelte": "^5.1.1",30+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
31- "@tailwindcss/cli": "^4.1.17",31+ "@tailwindcss/cli": "^4.1.18",
32- "@tailwindcss/forms": "^0.5.10",32+ "@tailwindcss/forms": "^0.5.11",
33 "@tailwindcss/typography": "^0.5.19",33 "@tailwindcss/typography": "^0.5.19",
34- "@tailwindcss/vite": "^4.1.17",34+ "@tailwindcss/vite": "^4.1.18",
35- "@types/node": "^24.10.1",35+ "@types/node": "^25.0.9",
36- "autoprefixer": "^10.4.22",36+ "autoprefixer": "^10.4.23",
37- "drizzle-kit": "^0.31.7",37+ "drizzle-kit": "^0.31.8",
38- "eslint": "^9.39.1",38+ "eslint": "^9.39.2",
39 "eslint-config-prettier": "^10.1.8",39 "eslint-config-prettier": "^10.1.8",
40- "eslint-plugin-svelte": "^3.13.0",40+ "eslint-plugin-svelte": "^3.14.0",
41- "globals": "^15.15.0",41+ "globals": "^17.0.0",
42- "jsdom": "^26.1.0",42+ "jsdom": "^27.4.0",
43- "prettier": "^3.6.2",43+ "prettier": "^3.8.0",
44- "prettier-plugin-svelte": "^3.4.0",44+ "prettier-plugin-svelte": "^3.4.1",
45- "prettier-plugin-tailwindcss": "^0.6.14",45+ "prettier-plugin-tailwindcss": "^0.7.2",
46- "svelte": "^5.43.14",46+ "svelte": "^5.46.4",
47- "svelte-check": "^4.3.4",47+ "svelte-check": "^4.3.5",
48- "tailwindcss": "^4.1.17",48+ "tailwindcss": "^4.1.18",
49- "terser": "^5.44.1",49+ "terser": "^5.46.0",
50- "tsx": "^4.20.6",50+ "tsx": "^4.21.0",
51 "tw-animate-css": "^1.4.0",51 "tw-animate-css": "^1.4.0",
52 "typescript": "^5.9.3",52 "typescript": "^5.9.3",
53- "typescript-eslint": "^8.47.0",53+ "typescript-eslint": "^8.53.0",
54- "vite": "^6.4.1",54+ "vite": "^7.3.1",
55- "vitest": "^3.2.4"55+ "vitest": "^4.0.17",
56+ "wrangler": "^4.59.2"
56 },57 },
57 "dependencies": {58 "dependencies": {
58- "@libsql/client": "^0.15.15",59+ "@libsql/client": "^0.17.0",
59- "@lucide/svelte": "^0.561.0",60+ "@lucide/svelte": "^0.562.0",
60- "dotenv": "^16.6.1",61+ "dotenv": "^17.2.3",
61- "drizzle-orm": "^0.44.7",62+ "drizzle-orm": "^0.45.1",
62- "pino": "^9.14.0",63+ "pino": "^10.2.0",
63- "pino-pretty": "^13.1.2",64+ "pino-pretty": "^13.1.3",
64 "rehype": "^13.0.2",65 "rehype": "^13.0.2",
65 "rehype-sanitize": "^6.0.0",66 "rehype-sanitize": "^6.0.0",
66 "rehype-stringify": "^10.0.1",67 "rehype-stringify": "^10.0.1",
67 "remark-parse": "^11.0.0",68 "remark-parse": "^11.0.0",
68 "remark-rehype": "^11.1.2",69 "remark-rehype": "^11.1.2",
69 "unified": "^11.0.5",70 "unified": "^11.0.5",
70- "uuid": "^11.1.0",71+ "uuid": "^13.0.0",
71 "xp.css": "^0.2.6",72 "xp.css": "^0.2.6",
72- "zod": "^4.1.13"73+ "zod": "^4.3.5"
73 },74 },
74 "packageManager": "pnpm@10.25.0+sha512.5e82639027af37cf832061bcc6d639c219634488e0f2baebe785028a793de7b525ffcd3f7ff574f5e9860654e098fe852ba8ac5dd5cefe1767d23a020a92f501"75 "packageManager": "pnpm@10.25.0+sha512.5e82639027af37cf832061bcc6d639c219634488e0f2baebe785028a793de7b525ffcd3f7ff574f5e9860654e098fe852ba8ac5dd5cefe1767d23a020a92f501"
75 }76 }
M pnpm-lock.yaml +1743 -1631 generated file: collapsed
M src/lib/components/chat-room.svelte +2 -2
@@ -61,7 +61,7 @@
6161 let currentTextStyle = $state<TextStyle>({
6262 ...DEFAULT_TEXT_STYLE,
6363 ...initialTextStyle,
64- color: initialTextStyle.color || '#000000' // Ensure we always have a valid color
64+ color: initialTextStyle.color || '#000000'
6565 });
6666
6767 // Rate limiting state
@@ -703,7 +703,6 @@
703703 bind:style={currentTextStyle}
704704 compact={true}
705705 showFontSelector={true}
706- showGradients={true}
707706 />
708707 </div>
709708 {/if}
@@ -998,6 +997,7 @@
998997 /* Styled input - font is controlled by retro-font-* classes */
999998 .styled-input {
1000999 /* Font family is set by retro-font-* classes, don't override here */
1000+ font-style: inherit;
10011001 }
10021002
10031003 button {
@@ -61,7 +61,7 @@
61 let currentTextStyle = $state<TextStyle>({61 let currentTextStyle = $state<TextStyle>({
62 ...DEFAULT_TEXT_STYLE,62 ...DEFAULT_TEXT_STYLE,
63 ...initialTextStyle,63 ...initialTextStyle,
64- color: initialTextStyle.color || '#000000' // Ensure we always have a valid color64+ color: initialTextStyle.color || '#000000'
65 });65 });
66 66
67 // Rate limiting state67 // Rate limiting state
@@ -703,7 +703,6 @@
703 bind:style={currentTextStyle}703 bind:style={currentTextStyle}
704 compact={true}704 compact={true}
705 showFontSelector={true}705 showFontSelector={true}
706- showGradients={true}
707 />706 />
708 </div>707 </div>
709 {/if}708 {/if}
@@ -998,6 +997,7 @@
998 /* Styled input - font is controlled by retro-font-* classes */997 /* Styled input - font is controlled by retro-font-* classes */
999 .styled-input {998 .styled-input {
1000 /* Font family is set by retro-font-* classes, don't override here */999 /* Font family is set by retro-font-* classes, don't override here */
1000+ font-style: inherit;
1001 }1001 }
1002 1002
1003 button {1003 button {
M src/lib/components/color-picker-256.svelte +9 -4
@@ -6,16 +6,13 @@
66 selectedColor = $bindable('#000000'),
77 selectedGradient = $bindable(undefined),
88 onColorChange,
9- onGradientChange,
10- compact: _compact = true
9+ onGradientChange
1110 } = $props<{
1211 selectedColor?: string;
1312 selectedGradient?: string[];
1413 onColorChange?: (color: string) => void;
1514 onGradientChange?: (gradient: string[]) => void;
16- compact?: boolean;
1715 }>();
18- void _compact; // Reserved for future use
1916
2017 // State
2118 let showPicker = $state(false);
@@ -139,6 +136,7 @@
139136
140137 <!-- Color picker dropdown -->
141138 {#if showPicker}
139+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions -->
142140 <div class="picker-dropdown sunken-panel" onclick={(e) => e.stopPropagation()}>
143141 <!-- Gradient controls -->
144142 <div class="gradient-controls">
@@ -158,6 +156,13 @@
158156 e.stopPropagation();
159157 removeGradientColor(index);
160158 }}
159+ onkeydown={(e) => {
160+ if (e.key === 'Enter' || e.key === ' ') {
161+ e.preventDefault();
162+ e.stopPropagation();
163+ removeGradientColor(index);
164+ }
165+ }}
161166 title="Remove this color"
162167 role="button"
163168 tabindex="0">×</span
@@ -6,16 +6,13 @@
6 selectedColor = $bindable('#000000'),6 selectedColor = $bindable('#000000'),
7 selectedGradient = $bindable(undefined),7 selectedGradient = $bindable(undefined),
8 onColorChange,8 onColorChange,
9- onGradientChange,9+ onGradientChange
10- compact: _compact = true
11 } = $props<{10 } = $props<{
12 selectedColor?: string;11 selectedColor?: string;
13 selectedGradient?: string[];12 selectedGradient?: string[];
14 onColorChange?: (color: string) => void;13 onColorChange?: (color: string) => void;
15 onGradientChange?: (gradient: string[]) => void;14 onGradientChange?: (gradient: string[]) => void;
16- compact?: boolean;
17 }>();15 }>();
18- void _compact; // Reserved for future use
19 16
20 // State17 // State
21 let showPicker = $state(false);18 let showPicker = $state(false);
@@ -139,6 +136,7 @@
139 136
140 <!-- Color picker dropdown -->137 <!-- Color picker dropdown -->
141 {#if showPicker}138 {#if showPicker}
139+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions -->
142 <div class="picker-dropdown sunken-panel" onclick={(e) => e.stopPropagation()}>140 <div class="picker-dropdown sunken-panel" onclick={(e) => e.stopPropagation()}>
143 <!-- Gradient controls -->141 <!-- Gradient controls -->
144 <div class="gradient-controls">142 <div class="gradient-controls">
@@ -158,6 +156,13 @@
158 e.stopPropagation();156 e.stopPropagation();
159 removeGradientColor(index);157 removeGradientColor(index);
160 }}158 }}
159+ onkeydown={(e) => {
160+ if (e.key === 'Enter' || e.key === ' ') {
161+ e.preventDefault();
162+ e.stopPropagation();
163+ removeGradientColor(index);
164+ }
165+ }}
161 title="Remove this color"166 title="Remove this color"
162 role="button"167 role="button"
163 tabindex="0">×</span168 tabindex="0">×</span
M src/lib/components/text-formatting-toolbar.svelte +1 -8
@@ -10,19 +10,13 @@
1010 // Props
1111 let {
1212 style = $bindable(DEFAULT_TEXT_STYLE),
13- onPreviewText: _onPreviewText,
1413 compact = true,
15- showFontSelector = false,
16- showGradients: _showGradients = true
14+ showFontSelector = false
1715 } = $props<{
1816 style?: TextStyle;
19- onPreviewText?: (text: string) => void;
2017 compact?: boolean;
2118 showFontSelector?: boolean;
22- showGradients?: boolean;
2319 }>();
24- void _showGradients; // Reserved for future use
25- void _onPreviewText; // Reserved for future use
2620
2721 // State
2822 let currentColor = $state(style.color || '#000000');
@@ -145,7 +139,6 @@
145139 bind:selectedGradient={currentGradient}
146140 onColorChange={handleColorChange}
147141 onGradientChange={handleGradientChange}
148- {compact}
149142 />
150143 </div>
151144 </div>
@@ -10,19 +10,13 @@
10 // Props10 // Props
11 let {11 let {
12 style = $bindable(DEFAULT_TEXT_STYLE),12 style = $bindable(DEFAULT_TEXT_STYLE),
13- onPreviewText: _onPreviewText,
14 compact = true,13 compact = true,
15- showFontSelector = false,14+ showFontSelector = false
16- showGradients: _showGradients = true
17 } = $props<{15 } = $props<{
18 style?: TextStyle;16 style?: TextStyle;
19- onPreviewText?: (text: string) => void;
20 compact?: boolean;17 compact?: boolean;
21 showFontSelector?: boolean;18 showFontSelector?: boolean;
22- showGradients?: boolean;
23 }>();19 }>();
24- void _showGradients; // Reserved for future use
25- void _onPreviewText; // Reserved for future use
26 20
27 // State21 // State
28 let currentColor = $state(style.color || '#000000');22 let currentColor = $state(style.color || '#000000');
@@ -145,7 +139,6 @@
145 bind:selectedGradient={currentGradient}139 bind:selectedGradient={currentGradient}
146 onColorChange={handleColorChange}140 onColorChange={handleColorChange}
147 onGradientChange={handleGradientChange}141 onGradientChange={handleGradientChange}
148- {compact}
149 />142 />
150 </div>143 </div>
151 </div>144 </div>
M src/lib/components/text-style-selector.svelte +11 -14
@@ -100,8 +100,9 @@
100100 <div class="text-style-selector" class:compact>
101101 <!-- Font Family Selection -->
102102 <div class="style-group">
103- <label>Font:</label>
103+ <label for="font-family-select">Font:</label>
104104 <select
105+ id="font-family-select"
105106 bind:value={style.fontFamily}
106107 onchange={(e) => selectFont((e.target as HTMLSelectElement).value as FontFamily)}
107108 >
@@ -115,8 +116,9 @@
115116
116117 <!-- Font Size -->
117118 <div class="style-group">
118- <label>Size:</label>
119+ <label for="font-size-range">Size:</label>
119120 <input
121+ id="font-size-range"
120122 type="range"
121123 min="8"
122124 max="18"
@@ -164,14 +166,13 @@
164166
165167 <!-- Color & Gradient Selection -->
166168 <div class="style-group">
167- <label>Color:</label>
169+ <span class="label-text">Color:</span>
168170 <div class="color-controls">
169171 <ColorPicker256
170172 bind:selectedColor={currentColor}
171173 bind:selectedGradient={currentGradient}
172174 onColorChange={handleColorChange}
173175 onGradientChange={handleGradientChange}
174- compact={false}
175176 />
176177 </div>
177178 </div>
@@ -179,7 +180,7 @@
179180 <!-- Preview -->
180181 {#if showPreview}
181182 <div class="preview-section">
182- <label>Preview:</label>
183+ <span class="label-text">Preview:</span>
183184 <div class="preview-text" style={generateCSSStyle(style)}>
184185 {#if isProcessing}
185186 <span class="loading">Processing...</span>
@@ -212,7 +213,8 @@
212213 margin-bottom: 8px;
213214 }
214215
215- .style-group label {
216+ .style-group label,
217+ .style-group .label-text {
216218 font-weight: bold;
217219 min-width: 50px;
218220 }
@@ -271,7 +273,7 @@
271273 border-top: 1px solid #ccc;
272274 }
273275
274- .preview-section label {
276+ .preview-section .label-text {
275277 display: block;
276278 margin-bottom: 4px;
277279 font-weight: bold;
@@ -300,7 +302,8 @@
300302 margin-bottom: 4px;
301303 }
302304
303- .compact .style-group label {
305+ .compact .style-group label,
306+ .compact .style-group .label-text {
304307 min-width: 40px;
305308 font-size: 10px;
306309 }
@@ -310,10 +313,4 @@
310313 height: 20px;
311314 font-size: 10px;
312315 }
313-
314- .compact .color-button,
315- .compact .gradient-button {
316- font-size: 9px;
317- padding: 1px 4px;
318- }
319316 </style>
@@ -100,8 +100,9 @@
100 <div class="text-style-selector" class:compact>100 <div class="text-style-selector" class:compact>
101 <!-- Font Family Selection -->101 <!-- Font Family Selection -->
102 <div class="style-group">102 <div class="style-group">
103- <label>Font:</label>103+ <label for="font-family-select">Font:</label>
104 <select104 <select
105+ id="font-family-select"
105 bind:value={style.fontFamily}106 bind:value={style.fontFamily}
106 onchange={(e) => selectFont((e.target as HTMLSelectElement).value as FontFamily)}107 onchange={(e) => selectFont((e.target as HTMLSelectElement).value as FontFamily)}
107 >108 >
@@ -115,8 +116,9 @@
115 116
116 <!-- Font Size -->117 <!-- Font Size -->
117 <div class="style-group">118 <div class="style-group">
118- <label>Size:</label>119+ <label for="font-size-range">Size:</label>
119 <input120 <input
121+ id="font-size-range"
120 type="range"122 type="range"
121 min="8"123 min="8"
122 max="18"124 max="18"
@@ -164,14 +166,13 @@
164 166
165 <!-- Color & Gradient Selection -->167 <!-- Color & Gradient Selection -->
166 <div class="style-group">168 <div class="style-group">
167- <label>Color:</label>169+ <span class="label-text">Color:</span>
168 <div class="color-controls">170 <div class="color-controls">
169 <ColorPicker256171 <ColorPicker256
170 bind:selectedColor={currentColor}172 bind:selectedColor={currentColor}
171 bind:selectedGradient={currentGradient}173 bind:selectedGradient={currentGradient}
172 onColorChange={handleColorChange}174 onColorChange={handleColorChange}
173 onGradientChange={handleGradientChange}175 onGradientChange={handleGradientChange}
174- compact={false}
175 />176 />
176 </div>177 </div>
177 </div>178 </div>
@@ -179,7 +180,7 @@
179 <!-- Preview -->180 <!-- Preview -->
180 {#if showPreview}181 {#if showPreview}
181 <div class="preview-section">182 <div class="preview-section">
182- <label>Preview:</label>183+ <span class="label-text">Preview:</span>
183 <div class="preview-text" style={generateCSSStyle(style)}>184 <div class="preview-text" style={generateCSSStyle(style)}>
184 {#if isProcessing}185 {#if isProcessing}
185 <span class="loading">Processing...</span>186 <span class="loading">Processing...</span>
@@ -212,7 +213,8 @@
212 margin-bottom: 8px;213 margin-bottom: 8px;
213 }214 }
214 215
215- .style-group label {216+ .style-group label,
217+ .style-group .label-text {
216 font-weight: bold;218 font-weight: bold;
217 min-width: 50px;219 min-width: 50px;
218 }220 }
@@ -271,7 +273,7 @@
271 border-top: 1px solid #ccc;273 border-top: 1px solid #ccc;
272 }274 }
273 275
274- .preview-section label {276+ .preview-section .label-text {
275 display: block;277 display: block;
276 margin-bottom: 4px;278 margin-bottom: 4px;
277 font-weight: bold;279 font-weight: bold;
@@ -300,7 +302,8 @@
300 margin-bottom: 4px;302 margin-bottom: 4px;
301 }303 }
302 304
303- .compact .style-group label {305+ .compact .style-group label,
306+ .compact .style-group .label-text {
304 min-width: 40px;307 min-width: 40px;
305 font-size: 10px;308 font-size: 10px;
306 }309 }
@@ -310,10 +313,4 @@
310 height: 20px;313 height: 20px;
311 font-size: 10px;314 font-size: 10px;
312 }315 }
313-
314- .compact .color-button,
315- .compact .gradient-button {
316- font-size: 9px;
317- padding: 1px 4px;
318- }
319 </style>316 </style>
M src/lib/components/user-preferences-modal.svelte +2 -1
@@ -89,8 +89,9 @@
8989 role="dialog"
9090 aria-modal="true"
9191 aria-labelledby="preferences-title"
92+ tabindex="-1"
9293 >
93- <!-- Modal content -->
94+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions -->
9495 <div class="modal-window window" onclick={(e) => e.stopPropagation()}>
9596 <div class="title-bar">
9697 <div class="title-bar-text" id="preferences-title">Text Formatting Preferences</div>
@@ -89,8 +89,9 @@
89 role="dialog"89 role="dialog"
90 aria-modal="true"90 aria-modal="true"
91 aria-labelledby="preferences-title"91 aria-labelledby="preferences-title"
92+ tabindex="-1"
92 >93 >
93- <!-- Modal content -->94+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions -->
94 <div class="modal-window window" onclick={(e) => e.stopPropagation()}>95 <div class="modal-window window" onclick={(e) => e.stopPropagation()}>
95 <div class="title-bar">96 <div class="title-bar">
96 <div class="title-bar-text" id="preferences-title">Text Formatting Preferences</div>97 <div class="title-bar-text" id="preferences-title">Text Formatting Preferences</div>

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 3

Tags 8

↑↓ moveenter openesc close