+
+
+ testing
+
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index d224503c..5a3335d5 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -11,6 +11,9 @@ importers:
'@headlessui/vue':
specifier: ^1.7.23
version: 1.7.23(vue@3.4.8(typescript@5.6.2))
+ '@nuxtjs/color-mode':
+ specifier: ^3.5.2
+ version: 3.5.2(magicast@0.3.5)(rollup@4.29.1)
'@nuxtjs/tailwindcss':
specifier: ^6.12.2
version: 6.12.2(magicast@0.3.5)(rollup@4.29.1)
@@ -32,6 +35,9 @@ importers:
'@vuepic/vue-datepicker':
specifier: ^8.8.1
version: 8.8.1(vue@3.4.8(typescript@5.6.2))
+ '@vueuse/core':
+ specifier: ^12.5.0
+ version: 12.5.0(typescript@5.6.2)
'@vueuse/nuxt':
specifier: ^10.11.1
version: 10.11.1(magicast@0.3.5)(nuxt@3.12.4(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(eslint@8.57.1)(ioredis@5.4.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.29.1)(terser@5.37.0)(typescript@5.6.2)(vite@5.4.11(@types/node@22.10.5)(terser@5.37.0))(vue-tsc@2.1.6(typescript@5.6.2)))(rollup@4.29.1)(vue@3.4.8(typescript@5.6.2))
@@ -41,6 +47,12 @@ importers:
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.49)
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
daisyui:
specifier: ^2.52.0
version: 2.52.0(autoprefixer@10.4.20(postcss@8.4.49))(postcss@8.4.49)
@@ -56,6 +68,9 @@ importers:
http-proxy:
specifier: ^1.18.1
version: 1.18.1
+ lucide-vue-next:
+ specifier: ^0.474.0
+ version: 0.474.0(vue@3.4.8(typescript@5.6.2))
lunr:
specifier: ^2.3.9
version: 2.3.9
@@ -68,12 +83,21 @@ importers:
postcss:
specifier: ^8.4.49
version: 8.4.49
+ radix-vue:
+ specifier: ^1.9.12
+ version: 1.9.12(vue@3.4.8(typescript@5.6.2))
semver:
specifier: ^7.6.3
version: 7.6.3
+ tailwind-merge:
+ specifier: ^2.6.0
+ version: 2.6.0
tailwindcss:
specifier: ^3.4.17
version: 3.4.17
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.17)
vue:
specifier: 3.4.8
version: 3.4.8(typescript@5.6.2)
@@ -135,6 +159,9 @@ importers:
prettier:
specifier: ^3.4.2
version: 3.4.2
+ shadcn-nuxt:
+ specifier: 0.11.3
+ version: 0.11.3(magicast@0.3.5)(rollup@4.29.1)
typescript:
specifier: 5.6.2
version: 5.6.2
@@ -1173,6 +1200,18 @@ packages:
resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'}
+ '@floating-ui/core@1.6.9':
+ resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+
+ '@floating-ui/dom@1.6.13':
+ resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+
+ '@floating-ui/utils@0.2.9':
+ resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+ '@floating-ui/vue@1.1.6':
+ resolution: {integrity: sha512-XFlUzGHGv12zbgHNk5FN2mUB7ROul3oG2ENdTpWdE+qMFxyNxWSRmsoyhiEnpmabNm6WnUvR1OvJfUfN4ojC1A==}
+
'@formatjs/ecma402-abstract@2.3.2':
resolution: {integrity: sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==}
@@ -1216,6 +1255,12 @@ packages:
'@iconify/utils@2.2.1':
resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==}
+ '@internationalized/date@3.7.0':
+ resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==}
+
+ '@internationalized/number@3.6.0':
+ resolution: {integrity: sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==}
+
'@intlify/bundle-utils@8.0.0':
resolution: {integrity: sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==}
engines: {node: '>= 14.16'}
@@ -1383,6 +1428,9 @@ packages:
peerDependencies:
vue: ^3.3.4
+ '@nuxtjs/color-mode@3.5.2':
+ resolution: {integrity: sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==}
+
'@nuxtjs/eslint-config-typescript@12.1.0':
resolution: {integrity: sha512-l2fLouDYwdAvCZEEw7wGxOBj+i8TQcHFu3zMPTLqKuv1qu6WcZIr0uztkbaa8ND1uKZ9YPqKx6UlSOjM4Le69Q==}
peerDependencies:
@@ -1396,6 +1444,9 @@ packages:
'@nuxtjs/tailwindcss@6.12.2':
resolution: {integrity: sha512-qPJiFH67CkTj/2kBGBzqXihOD1rQXMsbVS4vdQvfBxOBLPfGhU1yw7AATdhPl2BBjO2krjJLuZj39t7dnDYOwg==}
+ '@oxc-parser/wasm@0.29.0':
+ resolution: {integrity: sha512-Ks5yFtJHypJZUdSNLImwtfkDt0/8ll9CDPyfmldhudtKB/1o6F/WQGWA4Oo+bCskDIp2MPKc3HfHccN3ALhtSg==}
+
'@parcel/watcher-android-arm64@2.5.0':
resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==}
engines: {node: '>= 10.0.0'}
@@ -1723,6 +1774,9 @@ packages:
'@surma/rollup-plugin-off-main-thread@2.2.3':
resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
'@tailwindcss/aspect-ratio@0.4.2':
resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==}
peerDependencies:
@@ -2041,9 +2095,15 @@ packages:
'@vueuse/core@10.11.1':
resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
+ '@vueuse/core@12.5.0':
+ resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==}
+
'@vueuse/metadata@10.11.1':
resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==}
+ '@vueuse/metadata@12.5.0':
+ resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==}
+
'@vueuse/nuxt@10.11.1':
resolution: {integrity: sha512-UiaYSIwOkmUVn8Gl1AqtLWYR12flO+8sEu9X0Y1fNjSR7EWy9jMuiCvOGqwtoeTsqfHrivl0d5HfMzr11GFnMA==}
peerDependencies:
@@ -2057,6 +2117,9 @@ packages:
'@vueuse/shared@10.11.1':
resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==}
+ '@vueuse/shared@12.5.0':
+ resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==}
+
abbrev@2.0.0:
resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -2152,6 +2215,10 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ aria-hidden@1.2.4:
+ resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
+ engines: {node: '>=10'}
+
array-buffer-byte-length@1.0.2:
resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
engines: {node: '>= 0.4'}
@@ -2381,6 +2448,9 @@ packages:
citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
clean-regexp@1.0.0:
resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
engines: {node: '>=4'}
@@ -2396,6 +2466,10 @@ packages:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
cluster-key-slot@1.1.2:
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
engines: {node: '>=0.10.0'}
@@ -3896,6 +3970,11 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ lucide-vue-next@0.474.0:
+ resolution: {integrity: sha512-bQaSBjfJ33xiPQCxCf4JD3rcUgZFgWZzxSY8SScNa4Mcq2vWGlbvQx6icTL1UXRqsxzfoT13RXawePSmgg4iWw==}
+ peerDependencies:
+ vue: '>=3.0.1'
+
lunr@2.3.9:
resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
@@ -4659,6 +4738,11 @@ packages:
queue-tick@1.0.1:
resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
+ radix-vue@1.9.12:
+ resolution: {integrity: sha512-zkr66Jqxbej4+oR6O/pZRzyM/VZi66ndbyIBZQjJKAXa1lIoYReZJse6W1EEDZKXknD7rXhpS+jM9Sr23lIqfg==}
+ peerDependencies:
+ vue: '>= 3.2.0'
+
radix3@1.1.2:
resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
@@ -4903,6 +4987,9 @@ packages:
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ shadcn-nuxt@0.11.3:
+ resolution: {integrity: sha512-Q0OxqTEbTmtbm/4wV9jd/7DTQYn65AGHkVJZjjHQdHGHTHCwhAbZ2jlCPnMuzJ8kgSsJyXFGNcImAphDCjjV5w==}
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -5146,6 +5233,14 @@ packages:
peerDependencies:
tailwindcss: 1 || 2 || 2.0.1-compat || 3
+ tailwind-merge@2.6.0:
+ resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
+
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
tailwindcss@3.4.17:
resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
engines: {node: '>=14.0.0'}
@@ -5307,6 +5402,11 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
@@ -6869,6 +6969,26 @@ snapshots:
'@faker-js/faker@8.4.1': {}
+ '@floating-ui/core@1.6.9':
+ dependencies:
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/dom@1.6.13':
+ dependencies:
+ '@floating-ui/core': 1.6.9
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/utils@0.2.9': {}
+
+ '@floating-ui/vue@1.1.6(vue@3.4.8(typescript@5.6.2))':
+ dependencies:
+ '@floating-ui/dom': 1.6.13
+ '@floating-ui/utils': 0.2.9
+ vue-demi: 0.14.10(vue@3.4.8(typescript@5.6.2))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
'@formatjs/ecma402-abstract@2.3.2':
dependencies:
'@formatjs/fast-memoize': 2.2.6
@@ -6931,6 +7051,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@internationalized/date@3.7.0':
+ dependencies:
+ '@swc/helpers': 0.5.15
+
+ '@internationalized/number@3.6.0':
+ dependencies:
+ '@swc/helpers': 0.5.15
+
'@intlify/bundle-utils@8.0.0(vue-i18n@9.14.2(vue@3.4.8(typescript@5.6.2)))':
dependencies:
'@intlify/message-compiler': 9.14.2
@@ -7326,9 +7454,20 @@ snapshots:
- vti
- vue-tsc
+ '@nuxtjs/color-mode@3.5.2(magicast@0.3.5)(rollup@4.29.1)':
+ dependencies:
+ '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.29.1)
+ pathe: 1.1.2
+ pkg-types: 1.3.0
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - magicast
+ - rollup
+ - supports-color
+
'@nuxtjs/eslint-config-typescript@12.1.0(eslint@8.57.1)(typescript@5.6.2)':
dependencies:
- '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)
+ '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)
'@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.2)
eslint: 8.57.1
@@ -7341,10 +7480,10 @@ snapshots:
- supports-color
- typescript
- '@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)':
+ '@nuxtjs/eslint-config@12.0.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)':
dependencies:
eslint: 8.57.1
- eslint-config-standard: 17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)
+ eslint-config-standard: 17.1.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
eslint-plugin-n: 15.7.0(eslint@8.57.1)
eslint-plugin-node: 11.1.0(eslint@8.57.1)
@@ -7379,6 +7518,8 @@ snapshots:
- supports-color
- ts-node
+ '@oxc-parser/wasm@0.29.0': {}
+
'@parcel/watcher-android-arm64@2.5.0':
optional: true
@@ -7681,6 +7822,10 @@ snapshots:
magic-string: 0.25.9
string.prototype.matchall: 4.0.12
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
'@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.17)':
dependencies:
tailwindcss: 3.4.17
@@ -8168,8 +8313,19 @@ snapshots:
- '@vue/composition-api'
- vue
+ '@vueuse/core@12.5.0(typescript@5.6.2)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.20
+ '@vueuse/metadata': 12.5.0
+ '@vueuse/shared': 12.5.0(typescript@5.6.2)
+ vue: 3.5.13(typescript@5.6.2)
+ transitivePeerDependencies:
+ - typescript
+
'@vueuse/metadata@10.11.1': {}
+ '@vueuse/metadata@12.5.0': {}
+
'@vueuse/nuxt@10.11.1(magicast@0.3.5)(nuxt@3.12.4(@parcel/watcher@2.5.0)(@types/node@22.10.5)(db0@0.2.1)(eslint@8.57.1)(ioredis@5.4.2)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.29.1)(terser@5.37.0)(typescript@5.6.2)(vite@5.4.11(@types/node@22.10.5)(terser@5.37.0))(vue-tsc@2.1.6(typescript@5.6.2)))(rollup@4.29.1)(vue@3.4.8(typescript@5.6.2))':
dependencies:
'@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.29.1)
@@ -8201,6 +8357,12 @@ snapshots:
- '@vue/composition-api'
- vue
+ '@vueuse/shared@12.5.0(typescript@5.6.2)':
+ dependencies:
+ vue: 3.5.13(typescript@5.6.2)
+ transitivePeerDependencies:
+ - typescript
+
abbrev@2.0.0: {}
abort-controller@3.0.0:
@@ -8293,6 +8455,10 @@ snapshots:
argparse@2.0.1: {}
+ aria-hidden@1.2.4:
+ dependencies:
+ tslib: 2.8.1
+
array-buffer-byte-length@1.0.2:
dependencies:
call-bound: 1.0.3
@@ -8580,6 +8746,10 @@ snapshots:
dependencies:
consola: 3.3.3
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
clean-regexp@1.0.0:
dependencies:
escape-string-regexp: 1.0.5
@@ -8598,6 +8768,8 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
+ clsx@2.1.1: {}
+
cluster-key-slot@1.1.2: {}
co@4.6.0: {}
@@ -9160,7 +9332,7 @@ snapshots:
dependencies:
eslint: 8.57.1
- eslint-config-standard@17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1):
+ eslint-config-standard@17.1.0(eslint-plugin-import@2.31.0)(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1):
dependencies:
eslint: 8.57.1
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
@@ -9191,7 +9363,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -9225,7 +9397,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -10259,6 +10431,10 @@ snapshots:
dependencies:
yallist: 3.1.1
+ lucide-vue-next@0.474.0(vue@3.4.8(typescript@5.6.2)):
+ dependencies:
+ vue: 3.4.8(typescript@5.6.2)
+
lunr@2.3.9: {}
magic-string-ast@0.6.3:
@@ -10596,7 +10772,7 @@ snapshots:
unenv: 1.10.0
unimport: 3.14.5(rollup@4.29.1)
unplugin: 1.16.0
- unplugin-vue-router: 0.10.9(rollup@4.29.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.2)))(vue@3.5.13(typescript@5.6.2))
+ unplugin-vue-router: 0.10.9(rollup@4.29.1)(vue-router@4.5.0(vue@3.4.8(typescript@5.6.2)))(vue@3.5.13(typescript@5.6.2))
unstorage: 1.14.4(db0@0.2.1)(ioredis@5.4.2)
untyped: 1.5.2
vue: 3.5.13(typescript@5.6.2)
@@ -11144,6 +11320,23 @@ snapshots:
queue-tick@1.0.1: {}
+ radix-vue@1.9.12(vue@3.4.8(typescript@5.6.2)):
+ dependencies:
+ '@floating-ui/dom': 1.6.13
+ '@floating-ui/vue': 1.1.6(vue@3.4.8(typescript@5.6.2))
+ '@internationalized/date': 3.7.0
+ '@internationalized/number': 3.6.0
+ '@tanstack/vue-virtual': 3.11.2(vue@3.4.8(typescript@5.6.2))
+ '@vueuse/core': 10.11.1(vue@3.4.8(typescript@5.6.2))
+ '@vueuse/shared': 10.11.1(vue@3.4.8(typescript@5.6.2))
+ aria-hidden: 1.2.4
+ defu: 6.1.4
+ fast-deep-equal: 3.1.3
+ nanoid: 5.0.9
+ vue: 3.4.8(typescript@5.6.2)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+
radix3@1.1.2: {}
randombytes@2.1.0:
@@ -11442,6 +11635,16 @@ snapshots:
setprototypeof@1.2.0: {}
+ shadcn-nuxt@0.11.3(magicast@0.3.5)(rollup@4.29.1):
+ dependencies:
+ '@nuxt/kit': 3.15.0(magicast@0.3.5)(rollup@4.29.1)
+ '@oxc-parser/wasm': 0.29.0
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - magicast
+ - rollup
+ - supports-color
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
@@ -11715,6 +11918,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ tailwind-merge@2.6.0: {}
+
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.17):
+ dependencies:
+ tailwindcss: 3.4.17
+
tailwindcss@3.4.17:
dependencies:
'@alloc/quick-lru': 5.2.0
@@ -11902,6 +12111,8 @@ snapshots:
typescript@5.6.2: {}
+ typescript@5.7.3: {}
+
uc.micro@2.1.0: {}
ufo@1.5.4: {}
@@ -11993,7 +12204,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- unplugin-vue-router@0.10.9(rollup@4.29.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.6.2)))(vue@3.5.13(typescript@5.6.2)):
+ unplugin-vue-router@0.10.9(rollup@4.29.1)(vue-router@4.5.0(vue@3.4.8(typescript@5.6.2)))(vue@3.5.13(typescript@5.6.2)):
dependencies:
'@babel/types': 7.26.3
'@rollup/pluginutils': 5.1.4(rollup@4.29.1)
@@ -12010,7 +12221,7 @@ snapshots:
unplugin: 2.0.0-beta.1
yaml: 2.7.0
optionalDependencies:
- vue-router: 4.5.0(vue@3.5.13(typescript@5.6.2))
+ vue-router: 4.5.0(vue@3.4.8(typescript@5.6.2))
transitivePeerDependencies:
- rollup
- vue
diff --git a/frontend/public/set-theme.js b/frontend/public/set-theme.js
index 7ea5ebbc..088bcba4 100644
--- a/frontend/public/set-theme.js
+++ b/frontend/public/set-theme.js
@@ -3,7 +3,10 @@ try {
const theme = JSON.parse(
localStorage.getItem('homebox/preferences/location')
).theme;
- if (theme) document.documentElement.setAttribute('data-theme', theme);
+ if (theme) {
+ document.documentElement.setAttribute('data-theme', theme);
+ document.documentElement.classList.add('theme-' + theme);
+ }
} catch (e) {
console.error('Failed to set theme', e);
}
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js
index acb95bb3..5dfc12a7 100644
--- a/frontend/tailwind.config.js
+++ b/frontend/tailwind.config.js
@@ -1,8 +1,128 @@
+import { config } from "dotenv";
+config();
+
+// check if DISABLE_DAISYUI is set to true in the environment
+const isDisabled = process.env.DISABLE_DAISYUI === "true";
+
+if (isDisabled) {
+ console.log("DAISYUI DISABLED");
+}
+
+/** @type {import('tailwindcss').Config} */
module.exports = {
- content: ["./app.vue", "./{components,pages,layouts}/**/*.{vue,js,ts,jsx,tsx}"],
- darkMode: "class", // or 'media' or 'class'
+ darkMode: ["class"],
+ safelist: [
+ "dark",
+ "theme-aqua",
+ "theme-black",
+ "theme-bumblebee",
+ "theme-cmyk",
+ "theme-corporate",
+ "theme-cupcake",
+ "theme-cyberpunk",
+ "theme-dark",
+ "theme-dracula",
+ "theme-emerald",
+ "theme-fantasy",
+ "theme-forest",
+ "theme-garden",
+ "theme-halloween",
+ "theme-light",
+ "theme-lofi",
+ "theme-luxury",
+ "theme-pastel",
+ "theme-retro",
+ "theme-synthwave",
+ "theme-valentine",
+ "theme-wireframe",
+ "theme-autumn",
+ "theme-business",
+ "theme-acid",
+ "theme-lemonade",
+ "theme-night",
+ "theme-coffee",
+ "theme-winter",
+ "theme-dim",
+ "theme-nord",
+ "theme-sunset",
+ ],
+ prefix: "",
+
theme: {
- extend: {},
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ },
+ borderRadius: {
+ xl: "calc(var(--radius) + 4px)",
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: 0 },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: 0 },
+ },
+ "collapsible-down": {
+ from: { height: 0 },
+ to: { height: "var(--radix-collapsible-content-height)" },
+ },
+ "collapsible-up": {
+ from: { height: "var(--radix-collapsible-content-height)" },
+ to: { height: 0 },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ "collapsible-down": "collapsible-down 0.2s ease-in-out",
+ "collapsible-up": "collapsible-up 0.2s ease-in-out",
+ },
+ },
},
daisyui: {
themes: [
@@ -50,8 +170,12 @@ module.exports = {
"winter",
],
},
- variants: {
- extend: {},
- },
- plugins: [require("@tailwindcss/aspect-ratio"), require("@tailwindcss/typography"), require("daisyui")],
+ plugins: isDisabled
+ ? [require("@tailwindcss/aspect-ratio"), require("@tailwindcss/typography"), require("tailwindcss-animate")]
+ : [
+ require("@tailwindcss/aspect-ratio"),
+ require("@tailwindcss/typography"),
+ require("daisyui"),
+ require("tailwindcss-animate"),
+ ],
};