Use a formula for text size for better performance

This commit is contained in:
Evan Fiordeliso 2025-07-07 09:47:47 -04:00
parent 349fcd903e
commit 36e346a849
5 changed files with 202 additions and 243 deletions

View File

@ -19,18 +19,15 @@
"@popperjs/core": "^2.11.8",
"@types/chroma-js": "^3.1.1",
"@types/node": "^24.0.6",
"@types/textfit": "^2.4.5",
"@typescript-eslint/eslint-plugin": "5.29.0",
"@typescript-eslint/parser": "5.29.0",
"builtin-modules": "3.3.0",
"dotenv": "^17.0.0",
"dotenv-expand": "^12.0.2",
"esbuild": "0.17.3",
"esbuild": "0.25.5",
"esbuild-svelte": "^0.9.3",
"eslint": "^9.30.0",
"globals": "^16.2.0",
"handlebars": "^4.7.8",
"lucide-svelte": "^0.525.0",
"moment": "^2.30.1",
"npm-run-all": "^4.1.5",
"obsidian": "latest",
@ -44,14 +41,12 @@
"typescript": "5.0.4"
},
"dependencies": {
"@humanspeak/svelte-virtual-list": "^0.2.6",
"@leveluptuts/svelte-fit": "^1.0.3",
"chart.js": "^4.5.0",
"chroma-js": "^3.1.2",
"esbuild-sass-plugin": "^3.3.1",
"fitty": "^2.4.2",
"handlebars": "^4.7.8",
"just-memoize": "^2.2.0",
"textfit": "^2.4.0",
"lucide-svelte": "^0.525.0",
"uuid": "^11.1.0",
"yaml": "^2.8.0",
"zod": "^3.25.67"

View File

@ -8,12 +8,6 @@ importers:
.:
dependencies:
'@humanspeak/svelte-virtual-list':
specifier: ^0.2.6
version: 0.2.6(svelte@5.34.8)
'@leveluptuts/svelte-fit':
specifier: ^1.0.3
version: 1.0.3
chart.js:
specifier: ^4.5.0
version: 4.5.0
@ -22,16 +16,16 @@ importers:
version: 3.1.2
esbuild-sass-plugin:
specifier: ^3.3.1
version: 3.3.1(esbuild@0.17.3)(sass-embedded@1.89.2)
fitty:
specifier: ^2.4.2
version: 2.4.2
version: 3.3.1(esbuild@0.25.5)(sass-embedded@1.89.2)
handlebars:
specifier: ^4.7.8
version: 4.7.8
just-memoize:
specifier: ^2.2.0
version: 2.2.0
textfit:
specifier: ^2.4.0
version: 2.4.0
lucide-svelte:
specifier: ^0.525.0
version: 0.525.0(svelte@5.34.8)
uuid:
specifier: ^11.1.0
version: 11.1.0
@ -57,9 +51,6 @@ importers:
'@types/node':
specifier: ^24.0.6
version: 24.0.6
'@types/textfit':
specifier: ^2.4.5
version: 2.4.5
'@typescript-eslint/eslint-plugin':
specifier: 5.29.0
version: 5.29.0(@typescript-eslint/parser@5.29.0(eslint@9.30.0)(typescript@5.0.4))(eslint@9.30.0)(typescript@5.0.4)
@ -76,23 +67,17 @@ importers:
specifier: ^12.0.2
version: 12.0.2
esbuild:
specifier: 0.17.3
version: 0.17.3
specifier: 0.25.5
version: 0.25.5
esbuild-svelte:
specifier: ^0.9.3
version: 0.9.3(esbuild@0.17.3)(svelte@5.34.8)
version: 0.9.3(esbuild@0.25.5)(svelte@5.34.8)
eslint:
specifier: ^9.30.0
version: 9.30.0
globals:
specifier: ^16.2.0
version: 16.2.0
handlebars:
specifier: ^4.7.8
version: 4.7.8
lucide-svelte:
specifier: ^0.525.0
version: 0.525.0(svelte@5.34.8)
moment:
specifier: ^2.30.1
version: 2.30.1
@ -142,135 +127,153 @@ packages:
'@codemirror/view@6.37.2':
resolution: {integrity: sha512-XD3LdgQpxQs5jhOOZ2HRVT+Rj59O4Suc7g2ULvZ+Yi8eCkickrkZ5JFuoDhs2ST1mNI5zSsNYgR3NGa4OUrbnw==}
'@esbuild/android-arm64@0.17.3':
resolution: {integrity: sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==}
engines: {node: '>=12'}
'@esbuild/aix-ppc64@0.25.5':
resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.25.5':
resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.17.3':
resolution: {integrity: sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==}
engines: {node: '>=12'}
'@esbuild/android-arm@0.25.5':
resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.17.3':
resolution: {integrity: sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==}
engines: {node: '>=12'}
'@esbuild/android-x64@0.25.5':
resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.17.3':
resolution: {integrity: sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==}
engines: {node: '>=12'}
'@esbuild/darwin-arm64@0.25.5':
resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.17.3':
resolution: {integrity: sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==}
engines: {node: '>=12'}
'@esbuild/darwin-x64@0.25.5':
resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.17.3':
resolution: {integrity: sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==}
engines: {node: '>=12'}
'@esbuild/freebsd-arm64@0.25.5':
resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.17.3':
resolution: {integrity: sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==}
engines: {node: '>=12'}
'@esbuild/freebsd-x64@0.25.5':
resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.17.3':
resolution: {integrity: sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==}
engines: {node: '>=12'}
'@esbuild/linux-arm64@0.25.5':
resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.17.3':
resolution: {integrity: sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==}
engines: {node: '>=12'}
'@esbuild/linux-arm@0.25.5':
resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.17.3':
resolution: {integrity: sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==}
engines: {node: '>=12'}
'@esbuild/linux-ia32@0.25.5':
resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.17.3':
resolution: {integrity: sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==}
engines: {node: '>=12'}
'@esbuild/linux-loong64@0.25.5':
resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.17.3':
resolution: {integrity: sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==}
engines: {node: '>=12'}
'@esbuild/linux-mips64el@0.25.5':
resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.17.3':
resolution: {integrity: sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==}
engines: {node: '>=12'}
'@esbuild/linux-ppc64@0.25.5':
resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.17.3':
resolution: {integrity: sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==}
engines: {node: '>=12'}
'@esbuild/linux-riscv64@0.25.5':
resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.17.3':
resolution: {integrity: sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==}
engines: {node: '>=12'}
'@esbuild/linux-s390x@0.25.5':
resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.17.3':
resolution: {integrity: sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==}
engines: {node: '>=12'}
'@esbuild/linux-x64@0.25.5':
resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-x64@0.17.3':
resolution: {integrity: sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==}
engines: {node: '>=12'}
'@esbuild/netbsd-arm64@0.25.5':
resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.25.5':
resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-x64@0.17.3':
resolution: {integrity: sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==}
engines: {node: '>=12'}
'@esbuild/openbsd-arm64@0.25.5':
resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.25.5':
resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/sunos-x64@0.17.3':
resolution: {integrity: sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==}
engines: {node: '>=12'}
'@esbuild/sunos-x64@0.25.5':
resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.17.3':
resolution: {integrity: sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==}
engines: {node: '>=12'}
'@esbuild/win32-arm64@0.25.5':
resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.17.3':
resolution: {integrity: sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==}
engines: {node: '>=12'}
'@esbuild/win32-ia32@0.25.5':
resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.17.3':
resolution: {integrity: sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==}
engines: {node: '>=12'}
'@esbuild/win32-x64@0.25.5':
resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@ -324,11 +327,6 @@ packages:
resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
engines: {node: '>=18.18.0'}
'@humanspeak/svelte-virtual-list@0.2.6':
resolution: {integrity: sha512-nfD81b4LQw2bTSFYV/M0ky/pnUkfI0KYr5qCVJHZe6h3dUtXoNIhoxypI6JGBcpW3D8jN5Y53NOkfDggJNb5nA==}
peerDependencies:
svelte: ^5.0.0
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
@ -362,9 +360,6 @@ packages:
'@kurkle/color@0.3.4':
resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==}
'@leveluptuts/svelte-fit@1.0.3':
resolution: {integrity: sha512-Hg8Xz06Mf1pwI92cY60LdFKDjXUkix0KcNP5orgGjtV7ecfK4zZ8gwPHOSDioZt73/7Muj1O43QzvtK2oPwEfA==}
'@marijn/find-cluster-break@1.0.2':
resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
@ -479,24 +474,15 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/jquery@3.5.32':
resolution: {integrity: sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@24.0.6':
resolution: {integrity: sha512-ZOyn+gOs749xU7ovp+Ibj0g1o3dFRqsfPnT22C2t5JzcRvgsEDpGawPbCISGKLudJk9Y0wiu9sYd6kUh0pc9TA==}
'@types/sizzle@2.3.9':
resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==}
'@types/tern@0.23.9':
resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==}
'@types/textfit@2.4.5':
resolution: {integrity: sha512-C/1i+vGFD7xi1UZPePa6pNdoR0eGFCOe7QrZlTuPGPF+Y4JnFcp9cSJGZko+6tW8GmdDdKt7S9W6sCf3ncvk5g==}
'@typescript-eslint/eslint-plugin@5.29.0':
resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -790,9 +776,9 @@ packages:
esbuild: '>=0.17.0'
svelte: '>=4.2.1 <6'
esbuild@0.17.3:
resolution: {integrity: sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==}
engines: {node: '>=12'}
esbuild@0.25.5:
resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
engines: {node: '>=18'}
hasBin: true
escape-string-regexp@1.0.5:
@ -905,9 +891,6 @@ packages:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
fitty@2.4.2:
resolution: {integrity: sha512-GNhWgImK4+wEkgEZjBkQMyu5NLSmmryg/CaRP7zYby+TWzCrUou6BHL+iqbjKzJRXMyzuJkH+LBB1+lh4oO77g==}
flat-cache@4.0.1:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
@ -1717,9 +1700,6 @@ packages:
resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==}
engines: {node: '>=16.0.0'}
textfit@2.4.0:
resolution: {integrity: sha512-/x4aoY5+/tJmu+iwpBH1yw75TFp86M6X15SvaaY/Eep7YySQYtqdOifEtfvVyMwzl7SZ+G4RQw00FD9g5R6i1Q==}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@ -1856,70 +1836,79 @@ snapshots:
style-mod: 4.1.2
w3c-keyname: 2.2.8
'@esbuild/android-arm64@0.17.3':
'@esbuild/aix-ppc64@0.25.5':
optional: true
'@esbuild/android-arm@0.17.3':
'@esbuild/android-arm64@0.25.5':
optional: true
'@esbuild/android-x64@0.17.3':
'@esbuild/android-arm@0.25.5':
optional: true
'@esbuild/darwin-arm64@0.17.3':
'@esbuild/android-x64@0.25.5':
optional: true
'@esbuild/darwin-x64@0.17.3':
'@esbuild/darwin-arm64@0.25.5':
optional: true
'@esbuild/freebsd-arm64@0.17.3':
'@esbuild/darwin-x64@0.25.5':
optional: true
'@esbuild/freebsd-x64@0.17.3':
'@esbuild/freebsd-arm64@0.25.5':
optional: true
'@esbuild/linux-arm64@0.17.3':
'@esbuild/freebsd-x64@0.25.5':
optional: true
'@esbuild/linux-arm@0.17.3':
'@esbuild/linux-arm64@0.25.5':
optional: true
'@esbuild/linux-ia32@0.17.3':
'@esbuild/linux-arm@0.25.5':
optional: true
'@esbuild/linux-loong64@0.17.3':
'@esbuild/linux-ia32@0.25.5':
optional: true
'@esbuild/linux-mips64el@0.17.3':
'@esbuild/linux-loong64@0.25.5':
optional: true
'@esbuild/linux-ppc64@0.17.3':
'@esbuild/linux-mips64el@0.25.5':
optional: true
'@esbuild/linux-riscv64@0.17.3':
'@esbuild/linux-ppc64@0.25.5':
optional: true
'@esbuild/linux-s390x@0.17.3':
'@esbuild/linux-riscv64@0.25.5':
optional: true
'@esbuild/linux-x64@0.17.3':
'@esbuild/linux-s390x@0.25.5':
optional: true
'@esbuild/netbsd-x64@0.17.3':
'@esbuild/linux-x64@0.25.5':
optional: true
'@esbuild/openbsd-x64@0.17.3':
'@esbuild/netbsd-arm64@0.25.5':
optional: true
'@esbuild/sunos-x64@0.17.3':
'@esbuild/netbsd-x64@0.25.5':
optional: true
'@esbuild/win32-arm64@0.17.3':
'@esbuild/openbsd-arm64@0.25.5':
optional: true
'@esbuild/win32-ia32@0.17.3':
'@esbuild/openbsd-x64@0.25.5':
optional: true
'@esbuild/win32-x64@0.17.3':
'@esbuild/sunos-x64@0.25.5':
optional: true
'@esbuild/win32-arm64@0.25.5':
optional: true
'@esbuild/win32-ia32@0.25.5':
optional: true
'@esbuild/win32-x64@0.25.5':
optional: true
'@eslint-community/eslint-utils@4.7.0(eslint@9.30.0)':
@ -1977,11 +1966,6 @@ snapshots:
'@humanfs/core': 0.19.1
'@humanwhocodes/retry': 0.3.1
'@humanspeak/svelte-virtual-list@0.2.6(svelte@5.34.8)':
dependencies:
esm-env: 1.2.2
svelte: 5.34.8
'@humanwhocodes/module-importer@1.0.1': {}
'@humanwhocodes/retry@0.3.1': {}
@ -2007,8 +1991,6 @@ snapshots:
'@kurkle/color@0.3.4': {}
'@leveluptuts/svelte-fit@1.0.3': {}
'@marijn/find-cluster-break@1.0.2': {}
'@nodelib/fs.scandir@2.1.5':
@ -2098,26 +2080,16 @@ snapshots:
'@types/estree@1.0.8': {}
'@types/jquery@3.5.32':
dependencies:
'@types/sizzle': 2.3.9
'@types/json-schema@7.0.15': {}
'@types/node@24.0.6':
dependencies:
undici-types: 7.8.0
'@types/sizzle@2.3.9': {}
'@types/tern@0.23.9':
dependencies:
'@types/estree': 1.0.8
'@types/textfit@2.4.5':
dependencies:
'@types/jquery': 3.5.32
'@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0(eslint@9.30.0)(typescript@5.0.4))(eslint@9.30.0)(typescript@5.0.4)':
dependencies:
'@typescript-eslint/parser': 5.29.0(eslint@9.30.0)(typescript@5.0.4)
@ -2476,44 +2448,47 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
esbuild-sass-plugin@3.3.1(esbuild@0.17.3)(sass-embedded@1.89.2):
esbuild-sass-plugin@3.3.1(esbuild@0.25.5)(sass-embedded@1.89.2):
dependencies:
esbuild: 0.17.3
esbuild: 0.25.5
resolve: 1.22.10
safe-identifier: 0.4.2
sass: 1.89.2
sass-embedded: 1.89.2
esbuild-svelte@0.9.3(esbuild@0.17.3)(svelte@5.34.8):
esbuild-svelte@0.9.3(esbuild@0.25.5)(svelte@5.34.8):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
esbuild: 0.17.3
esbuild: 0.25.5
svelte: 5.34.8
esbuild@0.17.3:
esbuild@0.25.5:
optionalDependencies:
'@esbuild/android-arm': 0.17.3
'@esbuild/android-arm64': 0.17.3
'@esbuild/android-x64': 0.17.3
'@esbuild/darwin-arm64': 0.17.3
'@esbuild/darwin-x64': 0.17.3
'@esbuild/freebsd-arm64': 0.17.3
'@esbuild/freebsd-x64': 0.17.3
'@esbuild/linux-arm': 0.17.3
'@esbuild/linux-arm64': 0.17.3
'@esbuild/linux-ia32': 0.17.3
'@esbuild/linux-loong64': 0.17.3
'@esbuild/linux-mips64el': 0.17.3
'@esbuild/linux-ppc64': 0.17.3
'@esbuild/linux-riscv64': 0.17.3
'@esbuild/linux-s390x': 0.17.3
'@esbuild/linux-x64': 0.17.3
'@esbuild/netbsd-x64': 0.17.3
'@esbuild/openbsd-x64': 0.17.3
'@esbuild/sunos-x64': 0.17.3
'@esbuild/win32-arm64': 0.17.3
'@esbuild/win32-ia32': 0.17.3
'@esbuild/win32-x64': 0.17.3
'@esbuild/aix-ppc64': 0.25.5
'@esbuild/android-arm': 0.25.5
'@esbuild/android-arm64': 0.25.5
'@esbuild/android-x64': 0.25.5
'@esbuild/darwin-arm64': 0.25.5
'@esbuild/darwin-x64': 0.25.5
'@esbuild/freebsd-arm64': 0.25.5
'@esbuild/freebsd-x64': 0.25.5
'@esbuild/linux-arm': 0.25.5
'@esbuild/linux-arm64': 0.25.5
'@esbuild/linux-ia32': 0.25.5
'@esbuild/linux-loong64': 0.25.5
'@esbuild/linux-mips64el': 0.25.5
'@esbuild/linux-ppc64': 0.25.5
'@esbuild/linux-riscv64': 0.25.5
'@esbuild/linux-s390x': 0.25.5
'@esbuild/linux-x64': 0.25.5
'@esbuild/netbsd-arm64': 0.25.5
'@esbuild/netbsd-x64': 0.25.5
'@esbuild/openbsd-arm64': 0.25.5
'@esbuild/openbsd-x64': 0.25.5
'@esbuild/sunos-x64': 0.25.5
'@esbuild/win32-arm64': 0.25.5
'@esbuild/win32-ia32': 0.25.5
'@esbuild/win32-x64': 0.25.5
escape-string-regexp@1.0.5: {}
@ -2641,8 +2616,6 @@ snapshots:
locate-path: 6.0.0
path-exists: 4.0.0
fitty@2.4.2: {}
flat-cache@4.0.1:
dependencies:
flatted: 3.3.3
@ -3439,8 +3412,6 @@ snapshots:
sync-message-port@1.1.3: {}
textfit@2.4.0: {}
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0

View File

@ -22,7 +22,6 @@
import Rating from "@ui/components/Rating.svelte";
import { v4 as uuidv4 } from "uuid";
import memoize from "just-memoize";
import VirtualList from "@humanspeak/svelte-virtual-list";
interface Props {
plugin: BookTrackerPlugin;

View File

@ -3,7 +3,6 @@
import BookshelfItem from "./BookshelfItem.svelte";
import { Color, type ColorName } from "@utils/color";
import type { HTMLAttributes } from "svelte/elements";
import { fit } from "@leveluptuts/svelte-fit";
interface Props {
children?: Snippet;
@ -45,6 +44,23 @@
const color = $derived(Color.fromName(colorName));
const backgroundColor = $derived(color.chroma.css());
const textColor = $derived(color.contrastColor.chroma.css());
const titleFontSize = $derived(
orientation === "front"
? 16
: Math.min(
16,
Math.max(8, (width + 120 - (title?.length ?? 0)) / 10),
),
);
const subtitleFontSize = $derived(
orientation === "front"
? 12
: Math.min(
14,
Math.max(6, (width + 60 - (subtitle?.length ?? 0)) / 10),
),
);
</script>
<BookshelfItem>
@ -75,13 +91,16 @@
{/if}
<div class="book-inner">
{#if title}
<h2 class="book-title">
<h2 class="book-title" style:font-size="{titleFontSize}px">
{title}
</h2>
{#if subtitle}
<h3 class="book-subtitle">
<p
class="book-subtitle"
style:font-size="{subtitleFontSize}px"
>
{subtitle}
</h3>
</p>
{/if}
{/if}
{#if authors && orientation === "front"}
@ -160,18 +179,14 @@
}
.book-title {
font-size: 16px;
height: $content-height;
font-weight: var(--bold-weight);
max-height: $content-height;
width: var(--book-content-width);
&:has(+ .book-subtitle) {
height: calc(#{$content-height} / 2);
}
}
.book-subtitle {
font-size: 12px;
height: calc(#{$content-height} / 2);
font-weight: var(--font-weight);
max-height: calc(#{$content-height} / 2);
width: var(--book-content-width);
align-items: start;
}
@ -249,14 +264,25 @@
padding-left: $padding-left;
.book-title {
height: calc(var(--book-height) / 4);
max-height: unset;
height: calc(var(--book-height) / 2);
&:has(+ .book-subtitle) {
height: calc(var(--book-height) / 3);
}
}
.book-subtitle {
height: calc(var(--book-height) / 4);
max-height: unset;
height: calc(var(--book-height) / 3);
& + .book-authors {
height: calc(var(--book-height) / 3);
}
}
.book-authors {
max-height: unset;
height: calc(var(--book-height) / 2);
}
}

View File

@ -1,45 +1,13 @@
<script lang="ts">
import { type Snippet } from "svelte";
import type { ActionReturn } from "svelte/action";
import textFit from "textfit";
interface Props {
children?: Snippet;
}
let { children }: Props = $props();
const fitAllText = (el: HTMLDivElement): ActionReturn => {
const observer = new MutationObserver(() => {
requestAnimationFrame(() => {
textFit(el.getElementsByClassName("book-title"), {
minFontSize: 8,
maxFontSize: 16,
multiLine: true,
});
textFit(el.getElementsByClassName("book-subtitle"), {
minFontSize: 6,
maxFontSize: 14,
multiLine: true,
});
});
});
observer.observe(el, {
childList: true,
subtree: true,
});
return {
destroy() {
observer.disconnect();
},
};
};
</script>
<div class="bookshelf" use:fitAllText>
<div class="bookshelf">
{@render children?.()}
</div>