diff --git a/phenoxtract-ui/.postcssrc.json b/phenoxtract-ui/.postcssrc.json new file mode 100644 index 00000000..72f908df --- /dev/null +++ b/phenoxtract-ui/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} \ No newline at end of file diff --git a/phenoxtract-ui/package.json b/phenoxtract-ui/package.json index 87a9fca5..e3a42589 100644 --- a/phenoxtract-ui/package.json +++ b/phenoxtract-ui/package.json @@ -21,6 +21,7 @@ "@angular/platform-browser": "^20.1.4", "@angular/router": "^20.1.4", "@primeuix/themes": "^2.0.3", + "@tailwindcss/postcss": "^4.3.2", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "^2.7.1", "@tauri-apps/plugin-opener": "^2", @@ -41,10 +42,13 @@ "@eslint/js": "^10.0.1", "@tauri-apps/cli": "^2", "angular-eslint": "^22.0.0", + "autoprefixer": "^10.5.2", "eslint": "^10.6.0", "eslint-config-prettier": "^10.1.8", "jsdom": "^29.1.1", + "postcss": "^8.5.16", "prettier": "^3.9.4", + "tailwindcss": "^4.3.2", "typescript": "~5.8.3", "typescript-eslint": "^8.62.1", "vite": "^8.1.3", diff --git a/phenoxtract-ui/pnpm-lock.yaml b/phenoxtract-ui/pnpm-lock.yaml index a1c72eba..229a4145 100644 --- a/phenoxtract-ui/pnpm-lock.yaml +++ b/phenoxtract-ui/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: '@primeuix/themes': specifier: ^2.0.3 version: 2.0.3 + '@tailwindcss/postcss': + specifier: ^4.3.2 + version: 4.3.2 '@tauri-apps/api': specifier: ^2 version: 2.11.1 @@ -53,16 +56,16 @@ importers: devDependencies: '@analogjs/platform': specifier: ^2.6.2 - version: 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(marked-gfm-heading-id@4.1.4(marked@15.0.12))(marked-mangle@1.1.13(marked@15.0.12))(marked@15.0.12)(oxc-parser@0.121.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rolldown@1.1.4)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) + version: 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(marked-gfm-heading-id@4.1.4(marked@15.0.12))(marked-mangle@1.1.13(marked@15.0.12))(marked@15.0.12)(oxc-parser@0.121.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rolldown@1.1.4)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) '@analogjs/vite-plugin-angular': specifier: ^2.6.2 - version: 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) + version: 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) '@analogjs/vitest-angular': specifier: ^2.6.2 - version: 2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)))(@angular-devkit/architect@0.2200.5(chokidar@5.0.0))(@angular-devkit/schematics@22.0.5(chokidar@5.0.0))(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0))(zone.js@0.15.1) + version: 2.6.2(9099b0b89e4626ac556a3af7d3180f8b) '@angular/build': specifier: ^20.1.4 - version: 20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)) + version: 20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)) '@angular/cli': specifier: ^20.1.4 version: 20.3.31(chokidar@4.0.3) @@ -81,6 +84,9 @@ importers: angular-eslint: specifier: ^22.0.0 version: 22.0.0(@angular/cli@20.3.31(chokidar@4.0.3))(chokidar@5.0.0)(eslint@10.6.0(jiti@2.7.0))(typescript-eslint@8.62.1(eslint@10.6.0(jiti@2.7.0))(typescript@5.8.3))(typescript@5.8.3) + autoprefixer: + specifier: ^10.5.2 + version: 10.5.2(postcss@8.5.16) eslint: specifier: ^10.6.0 version: 10.6.0(jiti@2.7.0) @@ -90,9 +96,15 @@ importers: jsdom: specifier: ^29.1.1 version: 29.1.1 + postcss: + specifier: ^8.5.16 + version: 8.5.16 prettier: specifier: ^3.9.4 version: 3.9.4 + tailwindcss: + specifier: ^4.3.2 + version: 4.3.2 typescript: specifier: ~5.8.3 version: 5.8.3 @@ -164,6 +176,10 @@ packages: resolution: {integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==} engines: {node: '>= 14.0.0'} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -2164,6 +2180,98 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@tailwindcss/node@4.3.2': + resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==} + + '@tailwindcss/oxide-android-arm64@4.3.2': + resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.2': + resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.2': + resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.2': + resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': + resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': + resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': + resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': + resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.2': + resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.2': + resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': + resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': + resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.2': + resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.3.2': + resolution: {integrity: sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==} + '@tauri-apps/api@2.11.1': resolution: {integrity: sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA==} @@ -2499,6 +2607,13 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + autoprefixer@10.5.2: + resolution: {integrity: sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -2936,6 +3051,10 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enhanced-resolve@5.21.6: + resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3168,6 +3287,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -4048,6 +4170,9 @@ packages: postcss-media-query-parser@0.2.3: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.16: resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} @@ -4450,6 +4575,13 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + tailwindcss@4.3.2: + resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar-stream@3.2.0: resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} @@ -5087,14 +5219,16 @@ snapshots: dependencies: '@algolia/client-common': 5.35.0 + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/platform@2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(marked-gfm-heading-id@4.1.4(marked@15.0.12))(marked-mangle@1.1.13(marked@15.0.12))(marked@15.0.12)(oxc-parser@0.121.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rolldown@1.1.4)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0))': + '@analogjs/platform@2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(marked-gfm-heading-id@4.1.4(marked@15.0.12))(marked-mangle@1.1.13(marked@15.0.12))(marked@15.0.12)(oxc-parser@0.121.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rolldown@1.1.4)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0))': dependencies: - '@analogjs/vite-plugin-angular': 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) + '@analogjs/vite-plugin-angular': 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) '@analogjs/vite-plugin-nitro': 2.6.2(oxc-parser@0.121.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1))(rolldown@1.1.4)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) marked: 15.0.12 marked-gfm-heading-id: 4.1.4(marked@15.0.12) @@ -5144,7 +5278,7 @@ snapshots: - webpack - xml2js - '@analogjs/vite-plugin-angular@2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0))': + '@analogjs/vite-plugin-angular@2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0))': dependencies: magic-string: 0.30.21 obug: 2.1.3 @@ -5152,7 +5286,7 @@ snapshots: tinyglobby: 0.2.17 ts-morph: 21.0.1 optionalDependencies: - '@angular/build': 20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)) + '@angular/build': 20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)) vite: 8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0) transitivePeerDependencies: - '@emnapi/core' @@ -5204,9 +5338,9 @@ snapshots: - webpack - xml2js - '@analogjs/vitest-angular@2.6.2(@analogjs/vite-plugin-angular@2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)))(@angular-devkit/architect@0.2200.5(chokidar@5.0.0))(@angular-devkit/schematics@22.0.5(chokidar@5.0.0))(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0))(zone.js@0.15.1)': + '@analogjs/vitest-angular@2.6.2(9099b0b89e4626ac556a3af7d3180f8b)': dependencies: - '@analogjs/vite-plugin-angular': 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) + '@analogjs/vite-plugin-angular': 2.6.2(@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0)))(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)(sass@1.90.0)(terser@5.48.0)) '@angular-devkit/architect': 0.2200.5(chokidar@5.0.0) '@angular-devkit/schematics': 22.0.5(chokidar@5.0.0) vitest: 4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0) @@ -5362,7 +5496,7 @@ snapshots: eslint: 10.6.0(jiti@2.7.0) typescript: 5.8.3 - '@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0))': + '@angular/build@20.3.31(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.8.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(chokidar@4.0.3)(jiti@2.7.0)(lightningcss@1.32.0)(postcss@8.5.16)(tailwindcss@4.3.2)(terser@5.48.0)(tslib@2.8.1)(typescript@5.8.3)(vitest@4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0))': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2003.31(chokidar@4.0.3) @@ -5399,6 +5533,7 @@ snapshots: '@angular/platform-browser': 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) lmdb: 3.4.2 postcss: 8.5.16 + tailwindcss: 4.3.2 vitest: 4.0.4(jiti@2.7.0)(jsdom@29.1.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.48.0) transitivePeerDependencies: - '@types/node' @@ -6791,6 +6926,75 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@tailwindcss/node@4.3.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.6 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.2 + + '@tailwindcss/oxide-android-arm64@4.3.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.2': + optional: true + + '@tailwindcss/oxide@4.3.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-arm64': 4.3.2 + '@tailwindcss/oxide-darwin-x64': 4.3.2 + '@tailwindcss/oxide-freebsd-x64': 4.3.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.2 + '@tailwindcss/oxide-linux-x64-musl': 4.3.2 + '@tailwindcss/oxide-wasm32-wasi': 4.3.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.2 + + '@tailwindcss/postcss@4.3.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.3.2 + '@tailwindcss/oxide': 4.3.2 + postcss: 8.5.16 + tailwindcss: 4.3.2 + '@tauri-apps/api@2.11.1': {} '@tauri-apps/cli-darwin-arm64@2.11.4': @@ -7182,6 +7386,15 @@ snapshots: async@3.2.6: {} + autoprefixer@10.5.2(postcss@8.5.16): + dependencies: + browserslist: 4.28.4 + caniuse-lite: 1.0.30001800 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + axobject-query@4.1.0: {} b4a@1.8.1: {} @@ -7561,6 +7774,11 @@ snapshots: encodeurl@2.0.0: {} + enhanced-resolve@5.21.6: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + entities@4.5.0: {} entities@6.0.1: {} @@ -7857,6 +8075,8 @@ snapshots: forwarded@0.2.0: {} + fraction.js@5.3.4: {} + fresh@2.0.0: {} fs-minipass@3.0.3: @@ -8890,6 +9110,8 @@ snapshots: postcss-media-query-parser@0.2.3: {} + postcss-value-parser@4.2.0: {} + postcss@8.5.16: dependencies: nanoid: 3.3.15 @@ -9364,6 +9586,10 @@ snapshots: tagged-tag@1.0.0: {} + tailwindcss@4.3.2: {} + + tapable@2.3.3: {} + tar-stream@3.2.0: dependencies: b4a: 1.8.1 diff --git a/phenoxtract-ui/src/app/app.component.css b/phenoxtract-ui/src/app/app.component.css index c68d181f..4a12655f 100644 --- a/phenoxtract-ui/src/app/app.component.css +++ b/phenoxtract-ui/src/app/app.component.css @@ -1,112 +1,10 @@ -.logo.angular:hover { - filter: drop-shadow(0 0 2em #e32727); +.app-container { + display: flex; + height: 100vh; + width: 100vw; + overflow: hidden; } -:root { - font-family: Inter, Avenir, Helvetica, Arial, sans-serif; - font-size: 16px; - line-height: 24px; - font-weight: 400; - color: #0f0f0f; - background-color: #f6f6f6; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -.container { - margin: 0; - padding-top: 10vh; - display: flex; - flex-direction: column; - justify-content: center; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: 0.75s; -} - -.logo.tauri:hover { - filter: drop-shadow(0 0 2em #24c8db); -} - -.row { - display: flex; - justify-content: center; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -h1 { - text-align: center; -} - -input, -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - color: #0f0f0f; - background-color: #ffffff; - transition: border-color 0.25s; - box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); -} - -button { - cursor: pointer; -} - -button:hover { - border-color: #396cd8; -} -button:active { - border-color: #396cd8; - background-color: #e8e8e8; -} - -input, -button { - outline: none; -} - -#greet-input { - margin-right: 5px; -} - -@media (prefers-color-scheme: dark) { - :root { - color: #f6f6f6; - background-color: #2f2f2f; - } - - a:hover { - color: #24c8db; - } - - input, - button { - color: #ffffff; - background-color: #0f0f0f98; - } - button:active { - background-color: #0f0f0f69; - } -} +.icon-color { + color: var(--p-primary-color); +} \ No newline at end of file diff --git a/phenoxtract-ui/src/app/app.component.html b/phenoxtract-ui/src/app/app.component.html index d99e6525..6b2fd880 100644 --- a/phenoxtract-ui/src/app/app.component.html +++ b/phenoxtract-ui/src/app/app.component.html @@ -1,3 +1,66 @@ -
- -
+
+ + + + + + +
+ + + + + +
+
+ + + + + + + + + + + + +
+
+ diff --git a/phenoxtract-ui/src/app/app.component.ts b/phenoxtract-ui/src/app/app.component.ts index 4bd82262..0dab1f49 100644 --- a/phenoxtract-ui/src/app/app.component.ts +++ b/phenoxtract-ui/src/app/app.component.ts @@ -2,10 +2,14 @@ import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; import { FormsModule } from '@angular/forms'; +import { ButtonModule } from 'primeng/button'; +import { Sidebar } from './shared/components/sidebar/sidebar.component'; +import { BrandComponent } from './shared/components/brand/brand.component'; + @Component({ selector: 'app-root', standalone: true, - imports: [RouterOutlet, FormsModule], + imports: [RouterOutlet, FormsModule, ButtonModule, Sidebar, BrandComponent], templateUrl: './app.component.html', styleUrl: './app.component.css', }) diff --git a/phenoxtract-ui/src/app/app.config.ts b/phenoxtract-ui/src/app/app.config.ts index b10c09cc..7fe25414 100644 --- a/phenoxtract-ui/src/app/app.config.ts +++ b/phenoxtract-ui/src/app/app.config.ts @@ -17,6 +17,12 @@ export const appConfig: ApplicationConfig = { providePrimeNG({ theme: { preset: Nora, + options: { + cssLayer: { + name: 'primeng', + order: 'theme, base, primeng', + }, + }, }, }), ], diff --git a/phenoxtract-ui/src/app/shared/components/brand/brand.component.ts b/phenoxtract-ui/src/app/shared/components/brand/brand.component.ts new file mode 100644 index 00000000..23db1de6 --- /dev/null +++ b/phenoxtract-ui/src/app/shared/components/brand/brand.component.ts @@ -0,0 +1,57 @@ +import { Component, OnInit, signal } from '@angular/core'; +import { invoke } from '@tauri-apps/api/core'; + +@Component({ + selector: 'app-brand', + standalone: true, + template: ` +
+ +
+

Phenoxtract

+ {{ version() }} +
+
+ `, + styles: [ + ` + .brand-text h1 { + font-size: 1.35rem; + margin: 0; + font-weight: normal; + font-family: var(--highlight-font), sans-serif; + color: black; + } + + .brand-text span { + font-size: 0.75rem; + color: #c1c1c1; + font-family: var(--global-font), sans-serif; + } + + .logo { + height: 3.5em; + will-change: filter; + transition: 0.75s; + } + + .brand-container { + display: flex; + align-items: center; + gap: 1rem; + } + `, + ], +}) +export class BrandComponent implements OnInit { + version = signal(''); + + async ngOnInit(): Promise { + try { + this.version.set(await invoke('get_version')); + } catch (error) { + console.error('Failed to get app version:', error); + this.version.set('Unknown'); + } + } +} diff --git a/phenoxtract-ui/src/app/shared/components/sidebar/sidebar.component.ts b/phenoxtract-ui/src/app/shared/components/sidebar/sidebar.component.ts new file mode 100644 index 00000000..2d617770 --- /dev/null +++ b/phenoxtract-ui/src/app/shared/components/sidebar/sidebar.component.ts @@ -0,0 +1,86 @@ +import { + Component, + ContentChildren, + QueryList, + TemplateRef, + AfterContentInit, +} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { PrimeTemplate } from 'primeng/api'; + +@Component({ + selector: 'app-sidebar', + standalone: true, + imports: [CommonModule], + template: ` + + `, + styles: [ + ` + footer { + display: flex; + padding: 1rem; + background: var(--bg-color); + margin-top: auto; + justify-content: space-evenly; + gap: 0.5rem; + } + + .sidebar { + width: 250px; + border-right: 1px solid #6a7282; + display: flex; + flex-direction: column; + padding-top: 1rem; + background-color: var(--bg-color); + height: 100%; + } + + .top { + display: flex; + align-items: center; + padding: 0 1.5rem 2rem 1.5rem; + gap: 0.75rem; + } + `, + ], +}) +export class Sidebar implements AfterContentInit { + @ContentChildren(PrimeTemplate) templates!: QueryList; + + headerTemplate: TemplateRef | null = null; + bodyTemplate: TemplateRef | null = null; + footerTemplate: TemplateRef | null = null; + + ngAfterContentInit() { + this.templates.forEach((item) => { + switch (item.getType()) { + case 'header': + this.headerTemplate = item.template; + break; + case 'body': + this.bodyTemplate = item.template; + break; + case 'footer': + this.footerTemplate = item.template; + break; + } + }); + } +} diff --git a/phenoxtract-ui/src/assets/icons/px-logo-2.png b/phenoxtract-ui/src/assets/icons/px-logo-2.png new file mode 100644 index 00000000..a06d8973 Binary files /dev/null and b/phenoxtract-ui/src/assets/icons/px-logo-2.png differ diff --git a/phenoxtract-ui/src/assets/icons/px-logo-3.png b/phenoxtract-ui/src/assets/icons/px-logo-3.png new file mode 100644 index 00000000..0e0158ba Binary files /dev/null and b/phenoxtract-ui/src/assets/icons/px-logo-3.png differ diff --git a/phenoxtract-ui/src/assets/icons/px-logo.png b/phenoxtract-ui/src/assets/icons/px-logo.png new file mode 100644 index 00000000..55b3cacf Binary files /dev/null and b/phenoxtract-ui/src/assets/icons/px-logo.png differ diff --git a/phenoxtract-ui/src/styles.css b/phenoxtract-ui/src/styles.css index c9acede2..c4764ab2 100644 --- a/phenoxtract-ui/src/styles.css +++ b/phenoxtract-ui/src/styles.css @@ -1,10 +1,13 @@ /* You can add global styles to this file, and also import other style files */ +@layer theme, base, primeng, components, utilities; + @import "bootstrap-icons/font/bootstrap-icons.css"; +@import 'tailwindcss'; @font-face { font-family: 'RussoOne-Regular'; - src: url('assets/fonts/RussoOne-Regular.ttf') format('tf'); + src: url('assets/fonts/RussoOne-Regular.ttf') format('truetype'); font-weight: 400; font-style: normal; font-display: swap; @@ -12,7 +15,7 @@ @font-face { font-family: 'Coda-Regular'; - src: url('assets/fonts/Coda-Regular.ttf') format('tf'); + src: url('assets/fonts/Coda-Regular.ttf') format('truetype'); font-weight: 400; font-style: normal; font-display: swap; @@ -23,6 +26,6 @@ --highlight-font: 'RussoOne-Regular'; } -body { +/*body { font-family: var(--global-font), sans-serif; -} \ No newline at end of file +}*/ \ No newline at end of file