From 4dd5e86d198ecec421f9bb723140d1595ab0e71c Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Mon, 18 May 2026 11:51:43 -0400 Subject: [PATCH 1/5] feat: add pasting joint positions --- src/lib/components/copy-button.svelte | 25 +++++++----- src/lib/components/paste-button.svelte | 40 +++++++++++++++++++ .../arm/move-to-joint-positions.svelte | 11 +++++ 3 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 src/lib/components/paste-button.svelte diff --git a/src/lib/components/copy-button.svelte b/src/lib/components/copy-button.svelte index f805f61..949e761 100644 --- a/src/lib/components/copy-button.svelte +++ b/src/lib/components/copy-button.svelte @@ -1,5 +1,5 @@ - + + + Copy to clipboard + diff --git a/src/lib/components/paste-button.svelte b/src/lib/components/paste-button.svelte new file mode 100644 index 0000000..c8eda69 --- /dev/null +++ b/src/lib/components/paste-button.svelte @@ -0,0 +1,40 @@ + + + + + {ariaLabel} + diff --git a/src/lib/components/widgets/arm/move-to-joint-positions.svelte b/src/lib/components/widgets/arm/move-to-joint-positions.svelte index 2550c0b..a9c715e 100644 --- a/src/lib/components/widgets/arm/move-to-joint-positions.svelte +++ b/src/lib/components/widgets/arm/move-to-joint-positions.svelte @@ -4,6 +4,7 @@ import AngleUnitToggle from '$lib/components/angle-unit-toggle.svelte' import CopyButton from '$lib/components/copy-button.svelte' import ErrorDisplay from '$lib/components/error.svelte' + import PasteButton from '$lib/components/paste-button.svelte' import Table from '$lib/components/table.svelte' import { numberValueFromEvent } from '$lib/event-handlers' import { degreesToRadians, formatNumeric, radiansToDegrees } from '$lib/format' @@ -39,6 +40,15 @@ // (we only convert to radians when displaying) desiredPositions[index] = useRadians ? radiansToDegrees(inputValue) : inputValue } + + const handlePaste = (data: string): boolean => { + try { + desiredPositions = JSON.parse(data) as number[] + } catch { + return false + } + return true + }
@@ -53,6 +63,7 @@ }} /> +
From 3317d240752000d16ddf51e9e35f2dc8282ea42f Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Wed, 20 May 2026 09:37:09 -0400 Subject: [PATCH 2/5] add pasting for move to position --- .changeset/smart-trees-jam.md | 5 +++++ package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- src/lib/components/paste-button.svelte | 2 +- .../widgets/arm/move-to-position.svelte | 15 ++++++++++++--- 5 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 .changeset/smart-trees-jam.md diff --git a/.changeset/smart-trees-jam.md b/.changeset/smart-trees-jam.md new file mode 100644 index 0000000..a03d807 --- /dev/null +++ b/.changeset/smart-trees-jam.md @@ -0,0 +1,5 @@ +--- +'@viamrobotics/test-widgets': minor +--- + +feat: allow pasting for moveToPositions and moveToPose widgets" diff --git a/package.json b/package.json index 1a736b5..20aefc2 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "@types/node": "^25.6.0", "@types/three": "^0.183.1", "@viamrobotics/motion-tools": "^1.19.1", - "@viamrobotics/prime-core": "^0.1.21", + "@viamrobotics/prime-core": "^0.1.22", "@viamrobotics/sdk": "^0.69.0", "@viamrobotics/svelte-sdk": "^1.2.1", "@viamrobotics/tailwind-config": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4541a2..4b98d04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,10 +91,10 @@ importers: version: 0.183.1 '@viamrobotics/motion-tools': specifier: ^1.19.1 - version: 1.19.1(227c8cb51869e1778568ba51e8c8cd26) + version: 1.19.1(3de9b43f3c997d767960211059488fa9) '@viamrobotics/prime-core': - specifier: ^0.1.21 - version: 0.1.21(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) + specifier: ^0.1.22 + version: 0.1.22(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) '@viamrobotics/sdk': specifier: ^0.69.0 version: 0.69.0 @@ -1308,8 +1308,8 @@ packages: svelte: '>=5' svelte-virtuallists: '>=1' - '@viamrobotics/prime-core@0.1.21': - resolution: {integrity: sha512-y/EG0eIqi7yfpUK86Lyha6h9ZFfl9YLr3/6B8nzpnua6dGuzAt22Rvgi3ekmJP4M6G5BczazjqYbd36ijO00lA==} + '@viamrobotics/prime-core@0.1.22': + resolution: {integrity: sha512-h5ukdMQqHSLIBCWyheliW7cJfCeMC2bIifa9hzHnWBUpuYPwoujG/4/4wWRhohG9XBN1bCZQs/txttUdXpxqBA==} peerDependencies: svelte: '>=5 <6' @@ -4183,7 +4183,7 @@ snapshots: '@typescript-eslint/types': 8.59.1 eslint-visitor-keys: 5.0.1 - '@viamrobotics/motion-tools@1.19.1(227c8cb51869e1778568ba51e8c8cd26)': + '@viamrobotics/motion-tools@1.19.1(3de9b43f3c997d767960211059488fa9)': dependencies: '@ag-grid-community/client-side-row-model': 32.3.9 '@ag-grid-community/core': 32.3.9 @@ -4198,7 +4198,7 @@ snapshots: '@threlte/extras': 9.15.0(@types/three@0.183.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1))(three@0.183.2) '@threlte/rapier': 3.4.0(@dimforge/rapier3d-compat@0.12.0)(svelte@5.55.7(@typescript-eslint/types@8.59.1))(three@0.183.2) '@threlte/xr': 1.4.0(svelte@5.55.7(@typescript-eslint/types@8.59.1))(three@0.183.2) - '@viamrobotics/prime-core': 0.1.21(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) + '@viamrobotics/prime-core': 0.1.22(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) '@viamrobotics/sdk': 0.69.0 '@viamrobotics/svelte-sdk': 1.2.1(@viamrobotics/sdk@0.69.0)(svelte@5.55.7(@typescript-eslint/types@8.59.1)) '@zag-js/collapsible': 1.40.0 @@ -4227,7 +4227,7 @@ snapshots: - react - three - '@viamrobotics/prime-core@0.1.21(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1))': + '@viamrobotics/prime-core@0.1.22(@internationalized/date@3.12.1)(svelte@5.55.7(@typescript-eslint/types@8.59.1))': dependencies: '@codemirror/commands': 6.3.0 '@codemirror/lang-go': 6.0.1 diff --git a/src/lib/components/paste-button.svelte b/src/lib/components/paste-button.svelte index c8eda69..dec1861 100644 --- a/src/lib/components/paste-button.svelte +++ b/src/lib/components/paste-button.svelte @@ -21,7 +21,7 @@ } const iconName = $derived( - isPasteSuccessful === null ? 'content-paste' : isPasteSuccessful ? 'check' : 'close' + isPasteSuccessful === null ? 'content-paste' : (isPasteSuccessful ? 'check' : 'close') ) diff --git a/src/lib/components/widgets/arm/move-to-position.svelte b/src/lib/components/widgets/arm/move-to-position.svelte index 9447723..247a6c6 100644 --- a/src/lib/components/widgets/arm/move-to-position.svelte +++ b/src/lib/components/widgets/arm/move-to-position.svelte @@ -6,6 +6,7 @@ import AngleUnitToggle from '$lib/components/angle-unit-toggle.svelte' import CopyButton from '$lib/components/copy-button.svelte' import ErrorDisplay from '$lib/components/error.svelte' + import PasteButton from '$lib/components/paste-button.svelte' import Table from '$lib/components/table.svelte' import { numberValueFromEvent } from '$lib/event-handlers' import { degreesToRadians, formatNumeric, radiansToDegrees } from '$lib/format' @@ -48,9 +49,16 @@ theta: useRadians ? degreesToRadians(desiredPosition.theta) : desiredPosition.theta, }) - const copyData = $derived( - `{x: ${displayPosition.x}, y: ${displayPosition.y}, z: ${displayPosition.z}, o_x: ${displayPosition.oX}, o_y: ${displayPosition.oY}, o_z: ${displayPosition.oZ}, theta: ${displayPosition.theta}}` - ) + const copyData = $derived(JSON.stringify(displayPosition)) + const handlePaste = (data: string): boolean => { + try { + desiredPosition = JSON.parse(data) as Pose + } catch (error) { + console.error('Error parsing paste data', error) + return false + } + return true + } const handleAngleInputChange = (key: keyof Pose, inputValue: number) => { if (key === 'theta') { @@ -84,6 +92,7 @@ }} /> + From 463580034b1c0c3a98c9ae0fcf7fa7fd737db45f Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Wed, 20 May 2026 09:41:22 -0400 Subject: [PATCH 3/5] remove error log --- src/lib/components/widgets/arm/move-to-position.svelte | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/components/widgets/arm/move-to-position.svelte b/src/lib/components/widgets/arm/move-to-position.svelte index 247a6c6..175d721 100644 --- a/src/lib/components/widgets/arm/move-to-position.svelte +++ b/src/lib/components/widgets/arm/move-to-position.svelte @@ -53,8 +53,7 @@ const handlePaste = (data: string): boolean => { try { desiredPosition = JSON.parse(data) as Pose - } catch (error) { - console.error('Error parsing paste data', error) + } catch { return false } return true From a536db8d1ee62973c1c851d09e7c6025e170fa2d Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Wed, 20 May 2026 10:48:05 -0400 Subject: [PATCH 4/5] use IconButton --- src/lib/components/copy-button.svelte | 15 ++++++--------- src/lib/components/paste-button.svelte | 13 +++++-------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/lib/components/copy-button.svelte b/src/lib/components/copy-button.svelte index 949e761..2b99a08 100644 --- a/src/lib/components/copy-button.svelte +++ b/src/lib/components/copy-button.svelte @@ -1,5 +1,5 @@ - - Copy to clipboard + icon={showCopySuccess ? 'check' : 'content-copy'} + label="Copy to clipboard" + /> + {ariaLabel} diff --git a/src/lib/components/paste-button.svelte b/src/lib/components/paste-button.svelte index dec1861..5f08ab0 100644 --- a/src/lib/components/paste-button.svelte +++ b/src/lib/components/paste-button.svelte @@ -1,5 +1,5 @@ - + icon={iconName} + label="Paste from clipboard" + /> {ariaLabel} From cd2e08de61e75ab40a01f0a6ac8cf2db43d36cb2 Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Wed, 20 May 2026 10:52:23 -0400 Subject: [PATCH 5/5] fix format es lint conflicting --- src/lib/components/paste-button.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/components/paste-button.svelte b/src/lib/components/paste-button.svelte index 5f08ab0..a6bf5d6 100644 --- a/src/lib/components/paste-button.svelte +++ b/src/lib/components/paste-button.svelte @@ -21,7 +21,8 @@ } const iconName = $derived( - isPasteSuccessful === null ? 'content-paste' : (isPasteSuccessful ? 'check' : 'close') + // eslint-disable-next-line unicorn/no-nested-ternary + isPasteSuccessful === null ? 'content-paste' : isPasteSuccessful ? 'check' : 'close' )