a homebrewed DnD campaign based in the Honkai: Star Rail universe
hsr honkaistarrail dnd

app/fonts: switch out sans serif font, use fontsource

+95 -184
+1 -1
.oxfmtrc.json
··· 4 4 "semi": false, 5 5 "singleQuote": true, 6 6 "trailingComma": "all", 7 - "ignorePatterns": ["app/src/generated/**", "app/src/utilities.css"], 7 + "ignorePatterns": ["app/src/generated/**", "app/src/app.html", "app/src/utilities.css"], 8 8 "experimentalTailwindcss": { 9 9 "stylesheet": "./app/src/app.css", 10 10 "attributes": ["class", "className"],
+2
app/package.json
··· 23 23 "supabase-types-local": "supabase gen types typescript --local > src/generated/database.types.ts && pnpm run fmt" 24 24 }, 25 25 "dependencies": { 26 + "@fontsource-variable/fraunces": "catalog:app", 27 + "@fontsource-variable/suse": "catalog:app", 26 28 "@lucide/svelte": "catalog:svelte", 27 29 "@starlight/icons": "workspace:../packages/icons", 28 30 "@starlight/tokenizer": "workspace:../packages/tokenizer",
+3 -15
app/src/app.css
··· 1 1 @import 'tailwindcss'; 2 2 @import 'tw-animate-css'; 3 + @import './fonts.css'; 3 4 @import './utilities.css'; 4 5 @import './shadcn-svelte.css'; 5 6 @source './../../node_modules/@starlight/icons'; ··· 9 10 @theme { 10 11 --color-hsr-gold: #9f7755; 11 12 --color-hsr-dark: #151512; 12 - 13 - --font-sans: 14 - 'DIN Pro', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 15 - 'Segoe UI Symbol', 'Noto Color Emoji'; 16 - --font-script: 'Hsr _ Jariloivhertaspacestation', sans-serif; 17 - --font-serif: 'Fraunces', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; 18 13 } 19 14 20 - @utility bg-diagonal-lines { 21 - background-image: repeating-linear-gradient( 22 - -45deg, 23 - currentColor 0, 24 - currentColor 1px, 25 - transparent 0, 26 - transparent 50% 27 - ); 28 - background-size: 10px 10px; 15 + body { 16 + font-feature-settings: 'zero' off; 29 17 }
+6 -78
app/src/app.html
··· 9 9 as="font" 10 10 href="%sveltekit.assets%/fonts/Hsr-Universal-Script.otf" 11 11 /> 12 - <link 13 - rel="prefetch" 14 - type="font/otf" 15 - as="font" 16 - href="%sveltekit.assets%/fonts/DinPro/DinPro.otf" 17 - /> 18 - <link 19 - rel="prefetch" 20 - type="font/otf" 21 - as="font" 22 - href="%sveltekit.assets%/fonts/DinPro/DinPro-Italic.otf" 23 - /> 24 - <link 25 - rel="prefetch" 26 - type="font/otf" 27 - as="font" 28 - href="%sveltekit.assets%/fonts/DinPro/DinPro-Medium.otf" 29 - /> 30 - <link 31 - rel="prefetch" 32 - type="font/otf" 33 - as="font" 34 - href="%sveltekit.assets%/fonts/DinPro/DinPro-Medium-Italic.otf" 35 - /> 36 - <link 37 - rel="prefetch" 38 - type="font/otf" 39 - as="font" 40 - href="%sveltekit.assets%/fonts/DinPro/DinPro-Bold.otf" 41 - /> 42 - <link 43 - rel="prefetch" 44 - type="font/otf" 45 - as="font" 46 - href="%sveltekit.assets%/fonts/DinPro/DinPro-Bold-Italic.otf" 47 - /> 48 12 <link rel="icon" href="%sveltekit.assets%/favicons/favicon.svg" /> 49 13 <link rel="icon" href="%sveltekit.assets%/favicons/favicon.ico" /> 50 - <link 51 - type="image/png" 52 - sizes="16x16" 53 - rel="icon" 54 - href="%sveltekit.assets%/favicons/favicon-16x16.png" 55 - /> 56 - <link 57 - type="image/png" 58 - sizes="32x32" 59 - rel="icon" 60 - href="%sveltekit.assets%/favicons/favicon-32x32.png" 61 - /> 62 - <link 63 - type="image/png" 64 - sizes="192x192" 65 - rel="icon" 66 - href="%sveltekit.assets%/favicons/android-chrome-192x192.png" 67 - /> 68 - <link 69 - type="image/png" 70 - sizes="512x512" 71 - rel="icon" 72 - href="%sveltekit.assets%/favicons/android-chrome-512x512.png" 73 - /> 74 - <link 75 - type="image/png" 76 - sizes="180x180" 77 - rel="apple-touch-icon" 78 - href="%sveltekit.assets%/favicons/apple-touch-icon.png" 79 - /> 80 - <link 81 - type="image/png" 82 - sizes="180x180" 83 - rel="apple-touch-icon-precomposed" 84 - href="%sveltekit.assets%/favicons/apple-touch-icon-precomposed.png" 85 - /> 86 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 87 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="" /> 88 - <link 89 - rel="stylesheet" 90 - href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,100..900;1,9..144,100..900&display=swap" 91 - /> 14 + <link type="image/png" sizes="16x16" rel="icon" href="%sveltekit.assets%/favicons/favicon-16x16.png" /> 15 + <link type="image/png" sizes="32x32" rel="icon" href="%sveltekit.assets%/favicons/favicon-32x32.png" /> 16 + <link type="image/png" sizes="192x192" rel="icon" href="%sveltekit.assets%/favicons/android-chrome-192x192.png" /> 17 + <link type="image/png" sizes="512x512" rel="icon" href="%sveltekit.assets%/favicons/android-chrome-512x512.png" /> 18 + <link type="image/png" sizes="180x180" rel="apple-touch-icon" href="%sveltekit.assets%/favicons/apple-touch-icon.png" /> 19 + <link type="image/png" sizes="180x180" rel="apple-touch-icon-precomposed" href="%sveltekit.assets%/favicons/apple-touch-icon-precomposed.png" /> 92 20 %sveltekit.head% 93 21 </head> 94 22 <body data-sveltekit-preload-data="hover">
+8 -55
app/src/fonts.css
··· 1 - /** Fonts */ 1 + @theme { 2 + --font-sans: 3 + 'SUSE Variable', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 4 + 'Segoe UI Symbol', 'Noto Color Emoji'; 5 + --font-script: 'Hsr _ Jariloivhertaspacestation', sans-serif; 6 + --font-serif: 'Fraunces Variable', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; 7 + } 8 + 2 9 @font-face { 3 10 font-family: 'Hsr _ Jariloivhertaspacestation'; 4 11 font-style: normal; ··· 8 15 url('/fonts/Hsr-Universal-Script.otf') format('opentype'); 9 16 font-display: swap; 10 17 } 11 - 12 - @font-face { 13 - font-family: 'DIN Pro'; 14 - font-style: normal; 15 - src: 16 - local('DIN Pro'), 17 - url('/fonts/DinPro/DinPro.otf') format('opentype'); 18 - font-weight: 400; 19 - } 20 - 21 - @font-face { 22 - font-family: 'DIN Pro'; 23 - font-style: normal; 24 - src: 25 - local('DIN Pro'), 26 - url('/fonts/DinPro/DinPro-Medium.otf') format('opentype'); 27 - font-weight: 500; 28 - } 29 - 30 - @font-face { 31 - font-family: 'DIN Pro'; 32 - font-style: normal; 33 - src: 34 - local('DIN Pro'), 35 - url('/fonts/DinPro/DinPro-Bold.otf') format('opentype'); 36 - font-weight: 700; 37 - } 38 - 39 - @font-face { 40 - font-family: 'DIN Pro'; 41 - font-style: italic; 42 - src: 43 - local('DIN Pro'), 44 - url('/fonts/DinPro/DinPro-Italic.otf') format('opentype'); 45 - font-weight: 400; 46 - } 47 - 48 - @font-face { 49 - font-family: 'DIN Pro'; 50 - font-style: italic; 51 - src: 52 - local('DIN Pro'), 53 - url('/fonts/DinPro/DinPro-Medium-Italic.otf') format('opentype'); 54 - font-weight: 500; 55 - } 56 - 57 - @font-face { 58 - font-family: 'DIN Pro'; 59 - font-style: italic; 60 - src: 61 - local('DIN Pro'), 62 - url('/fonts/DinPro/DinPro-Bold-Italic.otf') format('opentype'); 63 - font-weight: 700; 64 - }
+4 -1
app/src/routes/+layout.svelte
··· 16 16 import { Separator } from '$ui/Separator' 17 17 import type { LayoutProps } from './$types' 18 18 import './../app.css' 19 - import './../fonts.css' 19 + import '@fontsource-variable/suse' 20 + import '@fontsource-variable/suse/wght-italic.css' 21 + import '@fontsource-variable/fraunces' 22 + import '@fontsource-variable/fraunces/wght-italic.css' 20 23 21 24 type Props = WithChildren<LayoutProps> 22 25 let { data, children }: Props = $props()
+13
app/src/utilities.css
··· 1 + /** typography */ 1 2 @utility small-caps { font-variant-caps: small-caps; } 2 3 @utility max-w-10ch { max-width: 10ch; } 3 4 @utility max-w-15ch { max-width: 15ch; } ··· 12 13 @utility max-w-100ch { max-width: 100ch; } 13 14 @utility max-w-110ch { max-width: 110ch; } 14 15 @utility max-w-120ch { max-width: 120ch; } 16 + 17 + /** background */ 18 + @utility bg-diagonal-lines { 19 + background-image: repeating-linear-gradient( 20 + -45deg, 21 + currentColor 0, 22 + currentColor 1px, 23 + transparent 0, 24 + transparent 50% 25 + ); 26 + background-size: 10px 10px; 27 + }
app/static/fonts/DinPro/DinPro-Black-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Black.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Bold-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Bold.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Black-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Black.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Bold-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Bold.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Light-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Light.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Medium-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Medium.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Condensed-Regular.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Light-Italic.ttf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Light.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Medium-Italic.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro-Medium.otf

This is a binary file and will not be displayed.

app/static/fonts/DinPro/DinPro.otf

This is a binary file and will not be displayed.

+55 -33
pnpm-lock.yaml
··· 6 6 7 7 catalogs: 8 8 app: 9 + '@fontsource-variable/fraunces': 10 + specifier: ^5.2.9 11 + version: 5.2.9 12 + '@fontsource-variable/suse': 13 + specifier: ^5.2.9 14 + version: 5.2.9 9 15 '@supabase/ssr': 10 16 specifier: ^0.8.0 11 17 version: 0.8.0 ··· 153 159 specifier: ^1.41.0 154 160 version: 1.41.0 155 161 oxlint-tsgolint: 156 - specifier: ^0.10.1 157 - version: 0.10.1 162 + specifier: ^0.11.1 163 + version: 0.11.1 158 164 playwright: 159 165 specifier: ^1.57.0 160 166 version: 1.57.0 ··· 223 229 version: 0.26.0 224 230 oxlint: 225 231 specifier: catalog:voidzero 226 - version: 1.41.0(oxlint-tsgolint@0.10.1) 232 + version: 1.41.0(oxlint-tsgolint@0.11.1) 227 233 oxlint-tsgolint: 228 234 specifier: catalog:voidzero 229 - version: 0.10.1 235 + version: 0.11.1 230 236 publint: 231 237 specifier: catalog:voidzero 232 238 version: 0.3.16 ··· 257 263 258 264 app: 259 265 dependencies: 266 + '@fontsource-variable/fraunces': 267 + specifier: catalog:app 268 + version: 5.2.9 269 + '@fontsource-variable/suse': 270 + specifier: catalog:app 271 + version: 5.2.9 260 272 '@lucide/svelte': 261 273 specifier: catalog:svelte 262 274 version: 0.562.0(svelte@5.47.0) ··· 893 905 '@floating-ui/utils@0.2.10': 894 906 resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} 895 907 908 + '@fontsource-variable/fraunces@5.2.9': 909 + resolution: {integrity: sha512-Y6IjunlN9Ni723np+GIgAaKzCDBrPRrqNi01TZxHs5wtHYROWFM9W6yiT+/gGwSjWIRD18oX17kD/BRWekc/Lw==} 910 + 911 + '@fontsource-variable/suse@5.2.9': 912 + resolution: {integrity: sha512-xoLO+j2DqmSqdvB9b8/60wrgXdwWIhCKOSXzX+GDrFCb5Ab6XoEhpOos2ZDXDjr7/Th2kTvhWsa8/M35OpJ6qA==} 913 + 896 914 '@hapi/hoek@9.3.0': 897 915 resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} 898 916 ··· 1109 1127 cpu: [x64] 1110 1128 os: [win32] 1111 1129 1112 - '@oxlint-tsgolint/darwin-arm64@0.10.1': 1113 - resolution: {integrity: sha512-KGC4++BeEqrIcmDHiJt/e6/860PWJmUJjjp0mE+smpBmRXMjmOFFjrPmN+ZyCyVgf1WdmhPkQXsRSPeTR+2omw==} 1130 + '@oxlint-tsgolint/darwin-arm64@0.11.1': 1131 + resolution: {integrity: sha512-UJIOFeJZpFTJIGS+bMdFXcvjslvnXBEouMvzynfQD7RTazcFIRLbokYgEbhrN2P6B352Ut1TUtvR0CLAp/9QfA==} 1114 1132 cpu: [arm64] 1115 1133 os: [darwin] 1116 1134 1117 - '@oxlint-tsgolint/darwin-x64@0.10.1': 1118 - resolution: {integrity: sha512-tvmrDgj3Q0tdc+zMWfCVLVq8EQDEUqasm1zaWgSMYIszpID6qdgqbT+OpWWXV9fLZgtvrkoXGwxkHAUJzdVZXQ==} 1135 + '@oxlint-tsgolint/darwin-x64@0.11.1': 1136 + resolution: {integrity: sha512-68O8YvexIm+ISZKl2vBFII1dMfLrteDyPcuCIecDuiBIj2tV0KYq13zpSCMz4dvJUWJW6RmOOGZKrkkvOAy6uQ==} 1119 1137 cpu: [x64] 1120 1138 os: [darwin] 1121 1139 1122 - '@oxlint-tsgolint/linux-arm64@0.10.1': 1123 - resolution: {integrity: sha512-7kD28z6/ykGx8WetKTPRZt30pd+ziassxg/8cM24lhjUI+hNXyRHVtHes73dh9D6glJKno+1ut+3amUdZBZcpQ==} 1140 + '@oxlint-tsgolint/linux-arm64@0.11.1': 1141 + resolution: {integrity: sha512-hXBInrFxPNbPPbPQYozo8YpSsFFYdtHBWRUiLMxul71vTy1CdSA7H5Qq2KbrKomr/ASmhvIDVAQZxh9hIJNHMA==} 1124 1142 cpu: [arm64] 1125 1143 os: [linux] 1126 1144 1127 - '@oxlint-tsgolint/linux-x64@0.10.1': 1128 - resolution: {integrity: sha512-NmJmiqdzYUTHIxteSTyX6IFFgnIsOAjRWXfrS6Jbo5xlB3g39WHniSF3asB/khLJNtwSg4InUS34NprYM7zrEw==} 1145 + '@oxlint-tsgolint/linux-x64@0.11.1': 1146 + resolution: {integrity: sha512-aMaGctlwrJhaIQPOdVJR+AGHZGPm4D1pJ457l0SqZt4dLXAhuUt2ene6cUUGF+864R7bDyFVGZqbZHODYpENyA==} 1129 1147 cpu: [x64] 1130 1148 os: [linux] 1131 1149 1132 - '@oxlint-tsgolint/win32-arm64@0.10.1': 1133 - resolution: {integrity: sha512-3KrT80vl3nXUkjuJI/z8dF6xWsKx0t9Tz4ZQHgQw3fYw+CoihBRWGklrdlmCz+EGfMyVaQLqBV9PZckhSqLe2A==} 1150 + '@oxlint-tsgolint/win32-arm64@0.11.1': 1151 + resolution: {integrity: sha512-ipOs6kKo8fz5n5LSHvcbyZFmEpEIsh2m7+B03RW3jGjBEPMiXb4PfKNuxnusFYTtJM9WaR3bCVm5UxeJTA8r3w==} 1134 1152 cpu: [arm64] 1135 1153 os: [win32] 1136 1154 1137 - '@oxlint-tsgolint/win32-x64@0.10.1': 1138 - resolution: {integrity: sha512-hW1fSJZVxG51sLdGq1sQjOzb1tsQ23z/BquJfUwL7CqBobxr7TJvGmoINL+9KryOJt0jCoaiMfWe4yoYw5XfIA==} 1155 + '@oxlint-tsgolint/win32-x64@0.11.1': 1156 + resolution: {integrity: sha512-m2apsAXg6qU3ulQG45W/qshyEpOjoL+uaQyXJG5dBoDoa66XPtCaSkBlKltD0EwGu0aoB8lM4I5I3OzQ6raNhw==} 1139 1157 cpu: [x64] 1140 1158 os: [win32] 1141 1159 ··· 2853 2871 engines: {node: ^20.19.0 || >=22.12.0} 2854 2872 hasBin: true 2855 2873 2856 - oxlint-tsgolint@0.10.1: 2857 - resolution: {integrity: sha512-EEHNdo5cW2w1xwYdBQ7d3IXDqWAtMkfVFrh+9gQ4kYbYJwygY4QXSh1eH80/xVipZdVKujAwBgg/nNNHk56kxQ==} 2874 + oxlint-tsgolint@0.11.1: 2875 + resolution: {integrity: sha512-WulCp+0/6RvpM4zPv+dAXybf03QvRA8ATxaBlmj4XMIQqTs5jeq3cUTk48WCt4CpLwKhyyGZPHmjLl1KHQ/cvA==} 2858 2876 hasBin: true 2859 2877 2860 2878 oxlint@1.41.0: ··· 4073 4091 4074 4092 '@floating-ui/utils@0.2.10': {} 4075 4093 4094 + '@fontsource-variable/fraunces@5.2.9': {} 4095 + 4096 + '@fontsource-variable/suse@5.2.9': {} 4097 + 4076 4098 '@hapi/hoek@9.3.0': 4077 4099 optional: true 4078 4100 ··· 4246 4268 '@oxfmt/win32-x64@0.26.0': 4247 4269 optional: true 4248 4270 4249 - '@oxlint-tsgolint/darwin-arm64@0.10.1': 4271 + '@oxlint-tsgolint/darwin-arm64@0.11.1': 4250 4272 optional: true 4251 4273 4252 - '@oxlint-tsgolint/darwin-x64@0.10.1': 4274 + '@oxlint-tsgolint/darwin-x64@0.11.1': 4253 4275 optional: true 4254 4276 4255 - '@oxlint-tsgolint/linux-arm64@0.10.1': 4277 + '@oxlint-tsgolint/linux-arm64@0.11.1': 4256 4278 optional: true 4257 4279 4258 - '@oxlint-tsgolint/linux-x64@0.10.1': 4280 + '@oxlint-tsgolint/linux-x64@0.11.1': 4259 4281 optional: true 4260 4282 4261 - '@oxlint-tsgolint/win32-arm64@0.10.1': 4283 + '@oxlint-tsgolint/win32-arm64@0.11.1': 4262 4284 optional: true 4263 4285 4264 - '@oxlint-tsgolint/win32-x64@0.10.1': 4286 + '@oxlint-tsgolint/win32-x64@0.11.1': 4265 4287 optional: true 4266 4288 4267 4289 '@oxlint/darwin-arm64@1.41.0': ··· 5952 5974 '@oxfmt/win32-arm64': 0.26.0 5953 5975 '@oxfmt/win32-x64': 0.26.0 5954 5976 5955 - oxlint-tsgolint@0.10.1: 5977 + oxlint-tsgolint@0.11.1: 5956 5978 optionalDependencies: 5957 - '@oxlint-tsgolint/darwin-arm64': 0.10.1 5958 - '@oxlint-tsgolint/darwin-x64': 0.10.1 5959 - '@oxlint-tsgolint/linux-arm64': 0.10.1 5960 - '@oxlint-tsgolint/linux-x64': 0.10.1 5961 - '@oxlint-tsgolint/win32-arm64': 0.10.1 5962 - '@oxlint-tsgolint/win32-x64': 0.10.1 5979 + '@oxlint-tsgolint/darwin-arm64': 0.11.1 5980 + '@oxlint-tsgolint/darwin-x64': 0.11.1 5981 + '@oxlint-tsgolint/linux-arm64': 0.11.1 5982 + '@oxlint-tsgolint/linux-x64': 0.11.1 5983 + '@oxlint-tsgolint/win32-arm64': 0.11.1 5984 + '@oxlint-tsgolint/win32-x64': 0.11.1 5963 5985 5964 - oxlint@1.41.0(oxlint-tsgolint@0.10.1): 5986 + oxlint@1.41.0(oxlint-tsgolint@0.11.1): 5965 5987 optionalDependencies: 5966 5988 '@oxlint/darwin-arm64': 1.41.0 5967 5989 '@oxlint/darwin-x64': 1.41.0 ··· 5971 5993 '@oxlint/linux-x64-musl': 1.41.0 5972 5994 '@oxlint/win32-arm64': 1.41.0 5973 5995 '@oxlint/win32-x64': 1.41.0 5974 - oxlint-tsgolint: 0.10.1 5996 + oxlint-tsgolint: 0.11.1 5975 5997 5976 5998 p-limit@3.1.0: 5977 5999 dependencies:
+3 -1
pnpm-workspace.yaml
··· 4 4 5 5 catalogs: 6 6 app: 7 + '@fontsource-variable/suse': ^5.2.9 8 + '@fontsource-variable/fraunces': ^5.2.9 7 9 '@supabase/ssr': ^0.8.0 8 10 '@supabase/supabase-js': ^2.89.0 9 11 lorem-ipsum: ^2.0.8 ··· 56 58 lightningcss: ^1.30.2 57 59 oxfmt: ^0.26.0 58 60 oxlint: ^1.41.0 59 - oxlint-tsgolint: ^0.10.1 61 + oxlint-tsgolint: ^0.11.1 60 62 playwright: ^1.57.0 61 63 publint: ^0.3.16 62 64 tsdown: ^0.18.4