From b33f5f1858360c8b42b3c45221352e5adca8d4bb Mon Sep 17 00:00:00 2001 From: GrahamSH Date: Mon, 11 May 2026 19:39:49 -0400 Subject: [PATCH 01/52] increment --- photon-client/package.json | 3 + photon-client/pnpm-lock.yaml | 518 ++++++++++++++++-- photon-client/pnpm-workspace.yaml | 1 + photon-client/src/assets/styles/main.css | 41 ++ .../components/app/photon-3d-visualizer.vue | 26 +- .../app/photon-calibration-visualizer.vue | 21 +- .../src/components/app/photon-log-view.vue | 25 +- .../cameras/CameraCalibrationCard.vue | 55 +- .../cameras/CameraCalibrationInfoCard.vue | 62 +-- .../components/cameras/CameraControlCard.vue | 37 +- .../components/cameras/CameraSettingsCard.vue | 69 +-- .../src/components/cameras/CamerasView.vue | 184 ++----- .../src/components/common/pv-button.vue | 89 +++ .../src/components/common/pv-delete-modal.vue | 31 +- .../src/components/common/pv-dialog.vue | 55 ++ .../src/components/common/pv-range-slider.vue | 98 ++-- .../src/components/common/pv-select.vue | 81 ++- .../src/components/common/pv-slider.vue | 93 +++- .../src/components/common/pv-switch.vue | 33 +- .../src/components/common/pv-tabs.vue | 32 ++ .../src/components/common/pv-toggle-group.vue | 65 +++ .../components/common/pv-tooltipped-label.vue | 41 +- .../dashboard/CameraAndPipelineSelectCard.vue | 44 +- .../components/dashboard/ConfigOptions.vue | 32 +- .../components/dashboard/StreamConfigCard.vue | 108 ++-- .../components/dashboard/tabs/OutputTab.vue | 58 +- .../components/dashboard/tabs/TargetsTab.vue | 14 +- .../dashboard/tabs/ThresholdTab.vue | 52 +- .../src/components/settings/DeviceCard.vue | 106 +--- .../settings/GlobalSettingsCard.vue | 39 +- .../settings/ObjectDetectionCard.vue | 138 ++--- photon-client/src/main.ts | 1 + photon-client/src/plugins/vuetify.ts | 1 - .../src/views/CameraMatchingView.vue | 113 ++-- photon-client/src/views/DashboardView.vue | 6 +- photon-client/vite.config.ts | 2 + 36 files changed, 1393 insertions(+), 981 deletions(-) create mode 100644 photon-client/src/assets/styles/main.css create mode 100644 photon-client/src/components/common/pv-button.vue create mode 100644 photon-client/src/components/common/pv-dialog.vue create mode 100644 photon-client/src/components/common/pv-tabs.vue create mode 100644 photon-client/src/components/common/pv-toggle-group.vue diff --git a/photon-client/package.json b/photon-client/package.json index 303bf53f96..c82c285d76 100644 --- a/photon-client/package.json +++ b/photon-client/package.json @@ -29,7 +29,9 @@ "echarts": "^6.0.0", "jspdf": "^3.0.1", "pinia": "^3.0.2", + "reka-ui": "^2.9.7", "three": "^0.178.0", + "tailwindcss": "^4.3.0", "vue": "^3.5.13", "vue-router": "^4.5.1", "vue3-virtual-scroll-list": "^0.2.1", @@ -40,6 +42,7 @@ "@playwright/test": "^1.61.1", "@types/node": "^24.0.0", "@types/three": "^0.178.0", + "@tailwindcss/vite": "^4.1.11", "@vitejs/plugin-vue": "^6.0.6", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.5.0", diff --git a/photon-client/pnpm-lock.yaml b/photon-client/pnpm-lock.yaml index c566b46785..73ec249043 100644 --- a/photon-client/pnpm-lock.yaml +++ b/photon-client/pnpm-lock.yaml @@ -32,6 +32,12 @@ importers: pinia: specifier: ^3.0.2 version: 3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) + reka-ui: + specifier: ^2.9.7 + version: 2.9.7(vue@3.5.13(typescript@5.8.3)) + tailwindcss: + specifier: ^4.3.0 + version: 4.3.0 three: specifier: ^0.178.0 version: 0.178.0 @@ -52,8 +58,11 @@ importers: specifier: ^9.31.0 version: 9.31.0 '@playwright/test': - specifier: ^1.61.1 - version: 1.61.1 + specifier: ^1.56.1 + version: 1.56.1 + '@tailwindcss/vite': + specifier: ^4.1.11 + version: 4.3.0(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2)) '@types/node': specifier: ^24.0.0 version: 24.12.2 @@ -62,22 +71,22 @@ importers: version: 0.178.1 '@vitejs/plugin-vue': specifier: ^6.0.6 - version: 6.0.6(vite@8.0.10(@types/node@24.12.2)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3)) + version: 6.0.6(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 - version: 10.2.0(eslint@9.31.0)(prettier@3.6.2) + version: 10.2.0(eslint@9.31.0(jiti@2.7.0))(prettier@3.6.2) '@vue/eslint-config-typescript': specifier: ^14.5.0 - version: 14.5.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(vue-eslint-parser@10.1.3(eslint@9.31.0)))(eslint@9.31.0)(typescript@5.8.3) + version: 14.5.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(vue-eslint-parser@10.1.3(eslint@9.31.0(jiti@2.7.0))))(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) '@vue/tsconfig': specifier: ^0.7.0 version: 0.7.0(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) eslint: specifier: ^9.31.0 - version: 9.31.0 + version: 9.31.0(jiti@2.7.0) eslint-plugin-vue: specifier: ^10.7.0 - version: 10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(vue-eslint-parser@10.1.3(eslint@9.31.0)) + version: 10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(vue-eslint-parser@10.1.3(eslint@9.31.0(jiti@2.7.0))) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -89,10 +98,10 @@ importers: version: 5.8.3 vite: specifier: ^8.0.10 - version: 8.0.10(@types/node@24.12.2)(sass@1.89.2) + version: 8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2) vite-plugin-vuetify: specifier: ^2.1.1 - version: 2.1.1(vite@8.0.10(@types/node@24.12.2)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3) + version: 2.1.1(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3) vue-tsc: specifier: ^3.2.5 version: 3.2.5(typescript@5.8.3) @@ -174,6 +183,18 @@ packages: resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@floating-ui/vue@1.1.11': + resolution: {integrity: sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==} + '@fontsource/prompt@5.2.6': resolution: {integrity: sha512-GsGEdD7SP7D3JDWWdw0YdLbG6LSIOf6EFvqoETs2TrRQqbzqT3kDaNPa5ET50yzjmX2TVbFXf+7WuwR7PWf3Uw==} @@ -197,9 +218,31 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@internationalized/date@3.12.1': + resolution: {integrity: sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==} + + '@internationalized/number@3.6.6': + resolution: {integrity: sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mdi/font@7.4.47': resolution: {integrity: sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==} @@ -426,6 +469,111 @@ packages: '@rolldown/pluginutils@1.0.0-rc.17': resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + 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.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/virtual-core@3.14.0': + resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} + + '@tanstack/vue-virtual@3.13.24': + resolution: {integrity: sha512-A0k2qF0zFSUStXSZkGXABouXr2Tw2Ztl/cVIYG9qy84uR8W7UNjAcX3DvzBS3YnDcwvLxab8v7dbmYBZ39itDA==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@tweenjs/tween.js@23.1.3': resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==} @@ -453,6 +601,9 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/webxr@0.5.22': resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} @@ -597,6 +748,19 @@ packages: vue: ^3.0.0 vuetify: ^3.0.0 + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + '@webgpu/types@0.1.60': resolution: {integrity: sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==} @@ -628,6 +792,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -735,6 +903,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -758,6 +929,10 @@ packages: echarts@6.0.0: resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} + enhanced-resolve@5.21.2: + resolution: {integrity: sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -973,6 +1148,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -1033,6 +1211,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1143,6 +1325,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1196,6 +1381,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1304,6 +1492,11 @@ packages: regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + reka-ui@2.9.7: + resolution: {integrity: sha512-aX7foYYR20v4+majO58OJJdBNfLMm0eJb448l9N4JVy8JB7GXOr4H/S4a+J1pkcoxZH8Cb7YHpJ855+miAm7sA==} + peerDependencies: + vue: '>= 3.4.0' + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1377,6 +1570,13 @@ packages: resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} engines: {node: ^14.18.0 || >=16.0.0} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + text-segmentation@1.0.3: resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} @@ -1489,6 +1689,17 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue-eslint-parser@10.1.3: resolution: {integrity: sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1592,9 +1803,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.7.0))': dependencies: - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -1636,6 +1847,26 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@floating-ui/vue@1.1.11(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@fontsource/prompt@5.2.6': {} '@humanfs/core@0.19.1': {} @@ -1651,8 +1882,35 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@internationalized/date@3.12.1': + dependencies: + '@swc/helpers': 0.5.21 + + '@internationalized/number@3.6.6': + dependencies: + '@swc/helpers': 0.5.21 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@mdi/font@7.4.47': {} '@msgpack/msgpack@3.1.2': {} @@ -1798,6 +2056,85 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.17': {} + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.21.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2) + + '@tanstack/virtual-core@3.14.0': {} + + '@tanstack/vue-virtual@3.13.24(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@tanstack/virtual-core': 3.14.0 + vue: 3.5.13(typescript@5.8.3) + '@tweenjs/tween.js@23.1.3': {} '@tybys/wasm-util@0.10.1': @@ -1831,17 +2168,19 @@ snapshots: '@types/trusted-types@2.0.7': optional: true + '@types/web-bluetooth@0.0.21': {} + '@types/webxr@0.5.22': {} - '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/type-utils': 8.32.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.0 - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -1850,14 +2189,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.32.0 '@typescript-eslint/types': 8.32.0 '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.0 debug: 4.4.0 - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -1867,12 +2206,12 @@ snapshots: '@typescript-eslint/types': 8.32.0 '@typescript-eslint/visitor-keys': 8.32.0 - '@typescript-eslint/type-utils@8.32.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) debug: 4.4.0 - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -1894,13 +2233,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.0(eslint@9.31.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.32.0 '@typescript-eslint/types': 8.32.0 '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.8.3) - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -1910,10 +2249,10 @@ snapshots: '@typescript-eslint/types': 8.32.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@6.0.6(vite@8.0.10(@types/node@24.12.2)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))': + '@vitejs/plugin-vue@6.0.6(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.13 - vite: 8.0.10(@types/node@24.12.2)(sass@1.89.2) + vite: 8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2) vue: 3.5.13(typescript@5.8.3) '@volar/language-core@2.4.28': @@ -1978,23 +2317,23 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/eslint-config-prettier@10.2.0(eslint@9.31.0)(prettier@3.6.2)': + '@vue/eslint-config-prettier@10.2.0(eslint@9.31.0(jiti@2.7.0))(prettier@3.6.2)': dependencies: - eslint: 9.31.0 - eslint-config-prettier: 10.1.2(eslint@9.31.0) - eslint-plugin-prettier: 5.4.0(eslint-config-prettier@10.1.2(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2) + eslint: 9.31.0(jiti@2.7.0) + eslint-config-prettier: 10.1.2(eslint@9.31.0(jiti@2.7.0)) + eslint-plugin-prettier: 5.4.0(eslint-config-prettier@10.1.2(eslint@9.31.0(jiti@2.7.0)))(eslint@9.31.0(jiti@2.7.0))(prettier@3.6.2) prettier: 3.6.2 transitivePeerDependencies: - '@types/eslint' - '@vue/eslint-config-typescript@14.5.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(vue-eslint-parser@10.1.3(eslint@9.31.0)))(eslint@9.31.0)(typescript@5.8.3)': + '@vue/eslint-config-typescript@14.5.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(vue-eslint-parser@10.1.3(eslint@9.31.0(jiti@2.7.0))))(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.32.0(eslint@9.31.0)(typescript@5.8.3) - eslint: 9.31.0 - eslint-plugin-vue: 10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(vue-eslint-parser@10.1.3(eslint@9.31.0)) + '@typescript-eslint/utils': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.7.0) + eslint-plugin-vue: 10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(vue-eslint-parser@10.1.3(eslint@9.31.0(jiti@2.7.0))) fast-glob: 3.3.3 - typescript-eslint: 8.32.0(eslint@9.31.0)(typescript@5.8.3) - vue-eslint-parser: 10.1.3(eslint@9.31.0) + typescript-eslint: 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) + vue-eslint-parser: 10.1.3(eslint@9.31.0(jiti@2.7.0)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -2045,6 +2384,19 @@ snapshots: vue: 3.5.13(typescript@5.8.3) vuetify: 3.8.3(typescript@5.8.3)(vite-plugin-vuetify@2.1.1)(vue@3.5.13(typescript@5.8.3)) + '@vueuse/core@14.3.0(vue@3.5.13(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.13(typescript@5.8.3)) + vue: 3.5.13(typescript@5.8.3) + + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.3.0(vue@3.5.13(typescript@5.8.3))': + dependencies: + vue: 3.5.13(typescript@5.8.3) + '@webgpu/types@0.1.60': {} acorn-jsx@5.3.2(acorn@8.14.1): @@ -2074,6 +2426,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + asynckit@0.4.0: {} atob@2.1.2: {} @@ -2178,6 +2534,8 @@ snapshots: deep-is@0.1.4: {} + defu@6.1.7: {} + delayed-stream@1.0.0: {} detect-libc@1.0.3: @@ -2201,6 +2559,11 @@ snapshots: tslib: 2.3.0 zrender: 6.0.0 + enhanced-resolve@5.21.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + entities@4.5.0: {} es-define-property@1.0.1: {} @@ -2220,31 +2583,31 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.2(eslint@9.31.0): + eslint-config-prettier@10.1.2(eslint@9.31.0(jiti@2.7.0)): dependencies: - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) - eslint-plugin-prettier@5.4.0(eslint-config-prettier@10.1.2(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2): + eslint-plugin-prettier@5.4.0(eslint-config-prettier@10.1.2(eslint@9.31.0(jiti@2.7.0)))(eslint@9.31.0(jiti@2.7.0))(prettier@3.6.2): dependencies: - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.4 optionalDependencies: - eslint-config-prettier: 10.1.2(eslint@9.31.0) + eslint-config-prettier: 10.1.2(eslint@9.31.0(jiti@2.7.0)) - eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(vue-eslint-parser@10.1.3(eslint@9.31.0)): + eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(vue-eslint-parser@10.1.3(eslint@9.31.0(jiti@2.7.0))): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) - eslint: 9.31.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.7.0)) + eslint: 9.31.0(jiti@2.7.0) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 7.1.1 semver: 7.7.1 - vue-eslint-parser: 10.1.3(eslint@9.31.0) + vue-eslint-parser: 10.1.3(eslint@9.31.0(jiti@2.7.0)) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.32.0(eslint@9.31.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) eslint-scope@8.3.0: dependencies: @@ -2262,9 +2625,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.31.0: + eslint@9.31.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 @@ -2299,6 +2662,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -2422,6 +2787,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.11: {} + graphemer@1.4.0: {} has-flag@4.0.0: {} @@ -2467,6 +2834,8 @@ snapshots: isexe@2.0.0: {} + jiti@2.7.0: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -2559,6 +2928,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + math-intrinsics@1.1.0: {} merge2@1.4.1: {} @@ -2601,6 +2974,8 @@ snapshots: dependencies: boolbase: 1.0.0 + ohash@2.0.11: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2695,6 +3070,22 @@ snapshots: regenerator-runtime@0.13.11: optional: true + reka-ui@2.9.7(vue@3.5.13(typescript@5.8.3)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.5.13(typescript@5.8.3)) + '@internationalized/date': 3.12.1 + '@internationalized/number': 3.6.6 + '@tanstack/vue-virtual': 3.13.24(vue@3.5.13(typescript@5.8.3)) + '@vueuse/core': 14.3.0(vue@3.5.13(typescript@5.8.3)) + '@vueuse/shared': 14.3.0(vue@3.5.13(typescript@5.8.3)) + aria-hidden: 1.2.6 + defu: 6.1.7 + ohash: 2.0.11 + vue: 3.5.13(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + resolve-from@4.0.0: {} reusify@1.1.0: {} @@ -2770,6 +3161,10 @@ snapshots: '@pkgr/core': 0.2.4 tslib: 2.8.1 + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + text-segmentation@1.0.3: dependencies: utrie: 1.0.2 @@ -2798,12 +3193,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.32.0(eslint@9.31.0)(typescript@5.8.3): + typescript-eslint@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.32.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.0(eslint@9.31.0)(typescript@5.8.3) - eslint: 9.31.0 + '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3))(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.0(eslint@9.31.0(jiti@2.7.0))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.7.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -2825,18 +3220,18 @@ snapshots: base64-arraybuffer: 1.0.2 optional: true - vite-plugin-vuetify@2.1.1(vite@8.0.10(@types/node@24.12.2)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3): + vite-plugin-vuetify@2.1.1(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3): dependencies: '@vuetify/loader-shared': 2.1.0(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3) debug: 4.4.0 upath: 2.0.1 - vite: 8.0.10(@types/node@24.12.2)(sass@1.89.2) + vite: 8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2) vue: 3.5.13(typescript@5.8.3) vuetify: 3.8.3(typescript@5.8.3)(vite-plugin-vuetify@2.1.1)(vue@3.5.13(typescript@5.8.3)) transitivePeerDependencies: - supports-color - vite@8.0.10(@types/node@24.12.2)(sass@1.89.2): + vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -2846,14 +3241,19 @@ snapshots: optionalDependencies: '@types/node': 24.12.2 fsevents: 2.3.3 + jiti: 2.7.0 sass: 1.89.2 vscode-uri@3.1.0: {} - vue-eslint-parser@10.1.3(eslint@9.31.0): + vue-demi@0.14.10(vue@3.5.13(typescript@5.8.3)): + dependencies: + vue: 3.5.13(typescript@5.8.3) + + vue-eslint-parser@10.1.3(eslint@9.31.0(jiti@2.7.0)): dependencies: debug: 4.4.0 - eslint: 9.31.0 + eslint: 9.31.0(jiti@2.7.0) eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 @@ -2893,7 +3293,7 @@ snapshots: vue: 3.5.13(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 - vite-plugin-vuetify: 2.1.1(vite@8.0.10(@types/node@24.12.2)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3) + vite-plugin-vuetify: 2.1.1(vite@8.0.10(@types/node@24.12.2)(jiti@2.7.0)(sass@1.89.2))(vue@3.5.13(typescript@5.8.3))(vuetify@3.8.3) which@2.0.2: dependencies: diff --git a/photon-client/pnpm-workspace.yaml b/photon-client/pnpm-workspace.yaml index 10a61b78ed..b9ffda3c04 100644 --- a/photon-client/pnpm-workspace.yaml +++ b/photon-client/pnpm-workspace.yaml @@ -1,3 +1,4 @@ allowBuilds: '@parcel/watcher': true core-js: true + vue-demi: true diff --git a/photon-client/src/assets/styles/main.css b/photon-client/src/assets/styles/main.css new file mode 100644 index 0000000000..4b1c32af10 --- /dev/null +++ b/photon-client/src/assets/styles/main.css @@ -0,0 +1,41 @@ +@layer theme, base, vuetify, components, utilities; +@import 'vuetify/styles' layer(vuetify); + +@import "tailwindcss"; + +@theme { + --font-sans: "Prompt", sans-serif; + --font-long-text: sans-serif; + --color-pv-background: rgb(var(--v-theme-background)); + --color-pv-surface: rgb(var(--v-theme-surface)); + --color-pv-surface-variant: rgb(var(--v-theme-surface-variant)); + --color-pv-primary: rgb(var(--v-theme-primary)); + --color-pv-secondary: rgb(var(--v-theme-secondary)); + --color-pv-accent: rgb(var(--v-theme-accent)); + --color-pv-error: rgb(var(--v-theme-error)); + --color-pv-info: rgb(var(--v-theme-info)); + --color-pv-success: rgb(var(--v-theme-success)); + --color-pv-warning: rgb(var(--v-theme-warning)); + --color-pv-button-active: rgb(var(--v-theme-buttonActive)); + --color-pv-button-passive: rgb(var(--v-theme-buttonPassive)); +} +@custom-variant data-on (&[data-state~="on"]); + + +@layer base { + html { + font-family: var(--font-sans); + background-color: rgb(var(--v-theme-background)); + color: white; + } + + body { + min-height: 100vh; + background-color: rgb(var(--v-theme-background)); + color: white; + } + + button:not(:disabled) { + cursor: pointer; + } +} diff --git a/photon-client/src/components/app/photon-3d-visualizer.vue b/photon-client/src/components/app/photon-3d-visualizer.vue index cde1d3c720..fa0db9b434 100644 --- a/photon-client/src/components/app/photon-3d-visualizer.vue +++ b/photon-client/src/components/app/photon-3d-visualizer.vue @@ -5,6 +5,8 @@ import type { Mesh, Object3D, PerspectiveCamera, Scene, WebGLRenderer } from "th // @ts-expect-error Intellisense says these conflict with the dynamic imports below import type { TrackballControls } from "three/examples/jsm/controls/TrackballControls.js"; import { onBeforeUnmount, onMounted, watchEffect } from "vue"; +import PvButton from "@/components/common/pv-button.vue"; +import { useTheme } from "vuetify"; const { ArrowHelper, BoxGeometry, @@ -24,10 +26,6 @@ const { TrackballControls } = await import("three/examples/jsm/controls/Trackbal import { useCameraSettingsStore } from "@/stores/settings/CameraSettingsStore"; import { createPerspectiveCamera } from "@/lib/ThreeUtils"; -import { useTheme } from "vuetify"; - -const theme = useTheme(); - const calibrationCoeffs = useCameraSettingsStore().getCalibrationCoeffs( useCameraSettingsStore().currentCameraSettings.validVideoFormats[ useCameraSettingsStore().currentPipelineSettings.cameraVideoModeIndex @@ -38,6 +36,8 @@ const props = defineProps<{ targets: PhotonTarget[]; }>(); +const theme = useTheme(); + let scene: Scene | undefined; let camera: PerspectiveCamera | undefined; let renderer: WebGLRenderer | undefined; @@ -231,24 +231,14 @@ watchEffect(() => { Target Visualization - + First Person - + - + Third Person - + diff --git a/photon-client/src/components/app/photon-calibration-visualizer.vue b/photon-client/src/components/app/photon-calibration-visualizer.vue index 44b336068e..8a0ed3fd68 100644 --- a/photon-client/src/components/app/photon-calibration-visualizer.vue +++ b/photon-client/src/components/app/photon-calibration-visualizer.vue @@ -1,5 +1,7 @@ diff --git a/photon-client/src/components/cameras/CamerasView.vue b/photon-client/src/components/cameras/CamerasView.vue index 82aab6763b..33325891de 100644 --- a/photon-client/src/components/cameras/CamerasView.vue +++ b/photon-client/src/components/cameras/CamerasView.vue @@ -1,15 +1,14 @@ - - diff --git a/photon-client/src/components/common/pv-button.vue b/photon-client/src/components/common/pv-button.vue new file mode 100644 index 0000000000..54168cb39e --- /dev/null +++ b/photon-client/src/components/common/pv-button.vue @@ -0,0 +1,89 @@ + + + diff --git a/photon-client/src/components/common/pv-delete-modal.vue b/photon-client/src/components/common/pv-delete-modal.vue index 3d4805d4cc..bed7b52cd0 100644 --- a/photon-client/src/components/common/pv-delete-modal.vue +++ b/photon-client/src/components/common/pv-delete-modal.vue @@ -1,10 +1,9 @@ diff --git a/photon-client/src/components/common/pv-dialog.vue b/photon-client/src/components/common/pv-dialog.vue new file mode 100644 index 0000000000..379851afc5 --- /dev/null +++ b/photon-client/src/components/common/pv-dialog.vue @@ -0,0 +1,55 @@ + + + diff --git a/photon-client/src/components/common/pv-range-slider.vue b/photon-client/src/components/common/pv-range-slider.vue index 08ec0de98f..0162a107d7 100644 --- a/photon-client/src/components/common/pv-range-slider.vue +++ b/photon-client/src/components/common/pv-range-slider.vue @@ -2,6 +2,7 @@ import { computed } from "vue"; import TooltippedLabel from "@/components/common/pv-tooltipped-label.vue"; import type { WebsocketNumberPair } from "@/types/WebsocketDataTypes"; +import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from "reka-ui"; const value = defineModel<[number, number] | WebsocketNumberPair>({ required: true @@ -24,6 +25,7 @@ const props = withDefaults( sliderCols: 10 } ); +const labelWidth = computed(() => `${((12 - props.sliderCols) / 12) * 100}%`); const localValue = computed<[number, number]>({ get: (): [number, number] => { @@ -52,63 +54,61 @@ const checkNumberRange = (v: string): boolean => { const val: number = parseFloat(v); return isFinite(val) && val >= props.min && val <= props.max; }; + +const sliderModel = computed({ + get: () => [...localValue.value], + set: (v) => { + if (v.length !== 2) return; + localValue.value = [v[0], v[1]]; + } +}); diff --git a/photon-client/src/components/common/pv-select.vue b/photon-client/src/components/common/pv-select.vue index f5700a781f..cbc90660fe 100644 --- a/photon-client/src/components/common/pv-select.vue +++ b/photon-client/src/components/common/pv-select.vue @@ -1,6 +1,18 @@ - diff --git a/photon-client/src/components/common/pv-slider.vue b/photon-client/src/components/common/pv-slider.vue index 534f6dea3b..e9b7a832bd 100644 --- a/photon-client/src/components/common/pv-slider.vue +++ b/photon-client/src/components/common/pv-slider.vue @@ -1,6 +1,8 @@ diff --git a/photon-client/src/components/common/pv-switch.vue b/photon-client/src/components/common/pv-switch.vue index 137f22b050..416703f1d6 100644 --- a/photon-client/src/components/common/pv-switch.vue +++ b/photon-client/src/components/common/pv-switch.vue @@ -1,26 +1,33 @@ - diff --git a/photon-client/src/components/common/pv-tabs.vue b/photon-client/src/components/common/pv-tabs.vue new file mode 100644 index 0000000000..6d760980d2 --- /dev/null +++ b/photon-client/src/components/common/pv-tabs.vue @@ -0,0 +1,32 @@ + + + diff --git a/photon-client/src/components/common/pv-toggle-group.vue b/photon-client/src/components/common/pv-toggle-group.vue new file mode 100644 index 0000000000..bd1fea7707 --- /dev/null +++ b/photon-client/src/components/common/pv-toggle-group.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/photon-client/src/components/common/pv-tooltipped-label.vue b/photon-client/src/components/common/pv-tooltipped-label.vue index ea95ff34f0..386a6b5414 100644 --- a/photon-client/src/components/common/pv-tooltipped-label.vue +++ b/photon-client/src/components/common/pv-tooltipped-label.vue @@ -1,4 +1,6 @@ diff --git a/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue b/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue index 3aa06c7a31..4be18957e1 100644 --- a/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue +++ b/photon-client/src/components/dashboard/CameraAndPipelineSelectCard.vue @@ -1,4 +1,6 @@ - - diff --git a/photon-client/src/components/dashboard/StreamConfigCard.vue b/photon-client/src/components/dashboard/StreamConfigCard.vue index 3258fb3858..05cd5b4ef4 100644 --- a/photon-client/src/components/dashboard/StreamConfigCard.vue +++ b/photon-client/src/components/dashboard/StreamConfigCard.vue @@ -1,12 +1,10 @@ - - diff --git a/photon-client/src/components/dashboard/tabs/OutputTab.vue b/photon-client/src/components/dashboard/tabs/OutputTab.vue index 0ffd779423..c0fa77d245 100644 --- a/photon-client/src/components/dashboard/tabs/OutputTab.vue +++ b/photon-client/src/components/dashboard/tabs/OutputTab.vue @@ -1,4 +1,5 @@