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/copy-button.svelte b/src/lib/components/copy-button.svelte
index f805f61..2b99a08 100644
--- a/src/lib/components/copy-button.svelte
+++ b/src/lib/components/copy-button.svelte
@@ -1,5 +1,5 @@
-
+ {ariaLabel}
+
diff --git a/src/lib/components/paste-button.svelte b/src/lib/components/paste-button.svelte
new file mode 100644
index 0000000..a6bf5d6
--- /dev/null
+++ b/src/lib/components/paste-button.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+ {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 384ca01..4241d24 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'
@@ -37,6 +38,14 @@
desiredPositions[index] = useRadians ? radiansToDegrees(inputValue) : inputValue
}
+ const handlePaste = (data: string): boolean => {
+ try {
+ desiredPositions = JSON.parse(data) as number[]
+ } catch {
+ return false
+ }
+ return true
+ }
const degreesToDisplayAngle = (degrees: number) => {
return useRadians ? degreesToRadians(degrees) : degrees
}
@@ -89,6 +98,7 @@
}}
/>
+
diff --git a/src/lib/components/widgets/arm/move-to-position.svelte b/src/lib/components/widgets/arm/move-to-position.svelte
index 9447723..175d721 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,15 @@
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 {
+ return false
+ }
+ return true
+ }
const handleAngleInputChange = (key: keyof Pose, inputValue: number) => {
if (key === 'theta') {
@@ -84,6 +91,7 @@
}}
/>
+