diff --git a/gui/package.json b/gui/package.json
index 761c0a15f..00deaa49e 100644
--- a/gui/package.json
+++ b/gui/package.json
@@ -19,8 +19,8 @@
"@tauri-apps/api": "^2.0.2",
"@tauri-apps/plugin-dialog": "^2.0.0",
"@tauri-apps/plugin-fs": "2.4.1",
- "@tauri-apps/plugin-opener": "^2.4.0",
"@tauri-apps/plugin-http": "^2.5.0",
+ "@tauri-apps/plugin-opener": "^2.4.0",
"@tauri-apps/plugin-log": "~2",
"@tauri-apps/plugin-os": "^2.0.0",
"@tauri-apps/plugin-shell": "^2.3.0",
@@ -30,6 +30,7 @@
"ajv": "^8.17.1",
"browser-fs-access": "^0.35.0",
"classnames": "^2.5.1",
+ "convert": "^5.12.0",
"flatbuffers": "22.10.26",
"intl-pluralrules": "^2.0.1",
"ip-num": "^1.5.1",
diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl
index 3090887df..39863a07b 100644
--- a/gui/public/i18n/en/translation.ftl
+++ b/gui/public/i18n/en/translation.ftl
@@ -27,6 +27,13 @@ tips-tap_setup = You can slowly tap your tracker 2 times to choose it instead of
tips-turn_on_tracker = Using official SlimeVR trackers? Don't forget to turn on your tracker after connecting it to the PC!
tips-failed_webgl = Failed to initialize WebGL.
+## Units
+unit-meter = Meter
+unit-foot = Foot
+unit-inch = Inch
+unit-cm = cm
+
+
## Body parts
body_part-NONE = Unassigned
body_part-HEAD = Head
@@ -1166,7 +1173,7 @@ onboarding-automatic_mounting-put_trackers_on-next = I have all my trackers on
onboarding-automatic_mounting-return-home = Done
## Tracker manual proportions setupa
-onboarding-manual_proportions-back = Go Back to Reset tutorial
+onboarding-manual_proportions-back-scaled = Go back to Scaled Proportions
onboarding-manual_proportions-title = Manual Body Proportions
onboarding-manual_proportions-fine_tuning_button = Automatically fine tune proportions
onboarding-manual_proportions-fine_tuning_button-disabled-tooltip = Please connect a VR headset to use automatic fine tuning
@@ -1270,28 +1277,33 @@ onboarding-automatic_proportions-smol_warning =
Please redo the measurements and ensure they are correct.
onboarding-automatic_proportions-smol_warning-cancel = Go back
-## Tracker scaled proportions setup
-onboarding-scaled_proportions-title = Scaled proportions
-onboarding-scaled_proportions-description = For SlimeVR trackers to work, we need to know the length of your bones. This will use an average proportion and scale it based on your height.
-onboarding-scaled_proportions-manual_height-title = Configure your height
-onboarding-scaled_proportions-manual_height-description-v2 = This height will be used as a baseline for your body proportions.
-onboarding-scaled_proportions-manual_height-missing_steamvr = SteamVR is not currently connected to SlimeVR, so measurements can't be based on your headset. Proceed at your own risk or check the docs!
-onboarding-scaled_proportions-manual_height-height-v2 = Your full height is
-onboarding-scaled_proportions-manual_height-estimated_height = Your estimated headset height is:
-onboarding-scaled_proportions-manual_height-next_step = Continue and save
-onboarding-scaled_proportions-manual_height-warning =
- You are currently using the manual way of setting up scaled proportions!
- This mode is recommended only if you do not use an HMD with SlimeVR.
- To be able to use the automatic scaled proportions please:
-onboarding-scaled_proportions-manual_height-warning-no_hmd = Connect a VR headset
-onboarding-scaled_proportions-manual_height-warning-no_controllers = Make sure your controllers are connected and correctly assigned to your hands
+## User height calibration
+onboarding-user_height-title = What is your height?
+onboarding-user_height-description = We need your height to calculate your body proportions and accurately represent your movements. You can either let SlimeVR calculate it, or input your height manually.
+onboarding-user_height-need_head_tracker = An HMD (or Head tracker) and controllers with positional tracking are required to perform the calibration.
+onboarding-user_height-calculate = Calculate my height automatically
+onboarding-user_height-next_step = Continue and save
+onboarding-user_height-manual-proportions = Manual Proportions
+onboarding-user_height-calibration-title = Calibration Progress
+onboarding-user_height-calibration-RECORDING_FLOOR = Touch the floor with the tip of your controller
+onboarding-user_height-calibration-WAITING_FOR_RISE = Stand back up
+onboarding-user_height-calibration-WAITING_FOR_FW_LOOK = Stand back up and look forward
+onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-ok = Make sure your head is leveled
+onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-low = Do not look at the floor
+onboarding-user_height-calibration-WAITING_FOR_FW_LOOK-high = Do not look too high up
+onboarding-user_height-calibration-WAITING_FOR_CONTROLLER_PITCH = Make sure the controller is pointing down
+onboarding-user_height-calibration-RECORDING_HEIGHT = Stand back up and stand still!
+onboarding-user_height-calibration-DONE = Success!
+onboarding-user_height-calibration-ERROR_TIMEOUT = Calibration timed out, try again.
+onboarding-user_height-calibration-ERROR_TOO_HIGH = The detected user height is too high, Try again.
+onboarding-user_height-calibration-ERROR_TOO_SMALL = The detected user height is too small. Make sure to sand fully up during the process.
+onboarding-user_height-calibration-error = Calibration Failed
+onboarding-user_height-manual-tip = While adjusting your height, try different poses and see how the skeleton matches your body.
+onboarding-user_height-reset-warning = You already had proportions set using the manual proportions page.
+ Continuing will reset these proportions to use only your height.
-## Tracker scaled proportions reset
-onboarding-scaled_proportions-reset_proportion-title = Reset your body proportions
-onboarding-scaled_proportions-reset_proportion-description = To set your body proportions based on your height, you need to now reset all of your proportions. This will clear any proportions you have configured and provide a baseline configuration.
-onboarding-scaled_proportions-done-title = Body proportions set
-onboarding-scaled_proportions-done-description = Your body proportions should now be configured based on your height.
+ Do you want to continue?
## Stay Aligned setup
onboarding-stay_aligned-title = Stay Aligned
diff --git a/gui/public/images/user-height/controller-ok.webp b/gui/public/images/user-height/controller-ok.webp
new file mode 100644
index 000000000..d04d7e685
Binary files /dev/null and b/gui/public/images/user-height/controller-ok.webp differ
diff --git a/gui/public/images/user-height/controller-wrong-1.webp b/gui/public/images/user-height/controller-wrong-1.webp
new file mode 100644
index 000000000..3cf2c2076
Binary files /dev/null and b/gui/public/images/user-height/controller-wrong-1.webp differ
diff --git a/gui/public/images/user-height/controller-wrong-2.webp b/gui/public/images/user-height/controller-wrong-2.webp
new file mode 100644
index 000000000..b1c778da5
Binary files /dev/null and b/gui/public/images/user-height/controller-wrong-2.webp differ
diff --git a/gui/public/images/user-height/done.webp b/gui/public/images/user-height/done.webp
new file mode 100644
index 000000000..27b9a965f
Binary files /dev/null and b/gui/public/images/user-height/done.webp differ
diff --git a/gui/public/images/user-height/look-forward-high.webp b/gui/public/images/user-height/look-forward-high.webp
new file mode 100644
index 000000000..9e6a653ff
Binary files /dev/null and b/gui/public/images/user-height/look-forward-high.webp differ
diff --git a/gui/public/images/user-height/look-forward-low.webp b/gui/public/images/user-height/look-forward-low.webp
new file mode 100644
index 000000000..41b4d3d83
Binary files /dev/null and b/gui/public/images/user-height/look-forward-low.webp differ
diff --git a/gui/public/images/user-height/look-forward-ok.webp b/gui/public/images/user-height/look-forward-ok.webp
new file mode 100644
index 000000000..7baf329f0
Binary files /dev/null and b/gui/public/images/user-height/look-forward-ok.webp differ
diff --git a/gui/public/images/user-height/stand-still.webp b/gui/public/images/user-height/stand-still.webp
new file mode 100644
index 000000000..3e7dc198e
Binary files /dev/null and b/gui/public/images/user-height/stand-still.webp differ
diff --git a/gui/public/images/user-height/timeout.webp b/gui/public/images/user-height/timeout.webp
new file mode 100644
index 000000000..3bd3f07df
Binary files /dev/null and b/gui/public/images/user-height/timeout.webp differ
diff --git a/gui/public/images/user-height/touch-floor.webp b/gui/public/images/user-height/touch-floor.webp
new file mode 100644
index 000000000..61c8ec47f
Binary files /dev/null and b/gui/public/images/user-height/touch-floor.webp differ
diff --git a/gui/public/images/user-height/wrong-height.webp b/gui/public/images/user-height/wrong-height.webp
new file mode 100644
index 000000000..540e9d1ca
Binary files /dev/null and b/gui/public/images/user-height/wrong-height.webp differ
diff --git a/gui/src/components/commons/ArrowLink.tsx b/gui/src/components/commons/ArrowLink.tsx
index 40de60460..c68ef3573 100644
--- a/gui/src/components/commons/ArrowLink.tsx
+++ b/gui/src/components/commons/ArrowLink.tsx
@@ -12,7 +12,7 @@ export function ArrowLink({
}: {
to: string;
children: ReactNode;
- state?: { SerialPort?: string };
+ state?: any;
direction?: 'left' | 'right';
variant?: 'flat' | 'boxed' | 'boxed-2';
}) {
diff --git a/gui/src/components/commons/Tooltip.tsx b/gui/src/components/commons/Tooltip.tsx
index fbc29203f..898fd0452 100644
--- a/gui/src/components/commons/Tooltip.tsx
+++ b/gui/src/components/commons/Tooltip.tsx
@@ -1,4 +1,3 @@
-import { useBreakpoint } from '@/hooks/breakpoint';
import classNames from 'classnames';
import {
ReactNode,
@@ -462,11 +461,11 @@ export function Tooltip({
spacing = 10,
}: TooltipProps) {
const childRef = useRef(null);
- const { isMobile } = useBreakpoint('mobile');
+ const isAndroid = window.__ANDROID__?.isThere();
let portal = null;
if (variant === 'auto') {
- portal = isMobile ? (
+ portal = isAndroid ? (
{content}
) : (
+