From 331cb1570e758c8572b7869ee226646e629b0ac2 Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Wed, 1 Jul 2026 12:02:00 -0400
Subject: [PATCH 1/8] decrease challenge difficulty for slow computers
---
apps/gateway/src/routers/cap.router.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/gateway/src/routers/cap.router.ts b/apps/gateway/src/routers/cap.router.ts
index 8082a91fd..602ac7c42 100644
--- a/apps/gateway/src/routers/cap.router.ts
+++ b/apps/gateway/src/routers/cap.router.ts
@@ -22,7 +22,7 @@ const router = Router();
router.post('/challenge', (_, res) => {
res.status(200).json(
cap.createChallenge({
- challengeDifficulty: 5,
+ challengeDifficulty: 4,
expiresMs: 60_000 * 5
})
);
From 4dc9559ee9c6797cf6f3cf0fea7c88e0dcc4794d Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Wed, 1 Jul 2026 12:02:35 -0400
Subject: [PATCH 2/8] disable summary actions (copy, download, print) for
instruments administered on gateway
---
apps/gateway/src/Root.tsx | 1 +
.../InstrumentRenderer/InstrumentRenderer.tsx | 2 ++
.../ScalarInstrumentRenderer.tsx | 11 +++++++++-
.../InstrumentSummary/InstrumentSummary.tsx | 22 +++++++++++--------
4 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/apps/gateway/src/Root.tsx b/apps/gateway/src/Root.tsx
index 4f96b8787..9efa12b72 100644
--- a/apps/gateway/src/Root.tsx
+++ b/apps/gateway/src/Root.tsx
@@ -91,6 +91,7 @@ export const Root = ({ id, initialSeriesIndex, target, token }: RootProps) => {
void handleSolve(token)} />}
className="min-h-full w-full"
disableBegin={!verified}
diff --git a/packages/react-core/src/components/InstrumentRenderer/InstrumentRenderer.tsx b/packages/react-core/src/components/InstrumentRenderer/InstrumentRenderer.tsx
index 8ac335397..36c16875b 100644
--- a/packages/react-core/src/components/InstrumentRenderer/InstrumentRenderer.tsx
+++ b/packages/react-core/src/components/InstrumentRenderer/InstrumentRenderer.tsx
@@ -15,6 +15,8 @@ export type InstrumentRendererProps = {
className?: string;
/** When true, the "Begin" button on the overview screen is disabled. */
disableBegin?: boolean;
+ /** Whether to disable copy, download, print in the final summary */
+ disableSummaryActions?: boolean;
initialSeriesIndex?: number;
NavigationBlocker?: NavigationBlockerComponent;
onSubmit: InstrumentSubmitHandler;
diff --git a/packages/react-core/src/components/InstrumentRenderer/ScalarInstrumentRenderer.tsx b/packages/react-core/src/components/InstrumentRenderer/ScalarInstrumentRenderer.tsx
index e33cbf51a..4d3f94869 100644
--- a/packages/react-core/src/components/InstrumentRenderer/ScalarInstrumentRenderer.tsx
+++ b/packages/react-core/src/components/InstrumentRenderer/ScalarInstrumentRenderer.tsx
@@ -28,6 +28,8 @@ export type ScalarInstrumentRendererProps = {
className?: string;
/** When true, the "Begin" button on the overview screen is disabled. */
disableBegin?: boolean;
+ /** Whether to disable copy, download, print in the final summary */
+ disableSummaryActions?: boolean;
NavigationBlocker?: NavigationBlockerComponent;
/** @deprecated */
onCompileError?: (error: Error) => void;
@@ -42,6 +44,7 @@ export const ScalarInstrumentRenderer = ({
beforeBegin,
className,
disableBegin,
+ disableSummaryActions,
NavigationBlocker,
onCompileError,
onSubmit,
@@ -120,7 +123,13 @@ export const ScalarInstrumentRenderer = ({
);
})
.with({ index: 2 }, () => (
-
+
))
.otherwise(() => null)
)
diff --git a/packages/react-core/src/components/InstrumentSummary/InstrumentSummary.tsx b/packages/react-core/src/components/InstrumentSummary/InstrumentSummary.tsx
index acbc85feb..ddc8ac419 100644
--- a/packages/react-core/src/components/InstrumentSummary/InstrumentSummary.tsx
+++ b/packages/react-core/src/components/InstrumentSummary/InstrumentSummary.tsx
@@ -14,6 +14,7 @@ import type { SubjectDisplayInfo } from '../../types';
export type InstrumentSummaryProps = {
data: any;
+ disableActions?: boolean;
displayAllMeasures?: boolean;
instrument: AnyUnilingualInstrument;
subject?: SubjectDisplayInfo;
@@ -22,6 +23,7 @@ export type InstrumentSummaryProps = {
export const InstrumentSummary = ({
data,
+ disableActions,
displayAllMeasures,
instrument,
subject,
@@ -102,15 +104,17 @@ export const InstrumentSummary = ({
})}
-
+ {!disableActions && (
+
+ )}
{subject && (
From d0d75da60ecad9be1c72f100c254525631775c0c Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Thu, 2 Jul 2026 11:20:58 -0400
Subject: [PATCH 3/8] update libui
---
pnpm-lock.yaml | 104 ++++++++++++++++++--------------------------
pnpm-workspace.yaml | 2 +-
2 files changed, 44 insertions(+), 62 deletions(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e4feee09f..f454c7d10 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -25,8 +25,8 @@ catalogs:
specifier: ^0.2.1
version: 0.2.1
'@douglasneuroinformatics/libui':
- specifier: ^6.7.1
- version: 6.7.1
+ specifier: ^6.8.0
+ version: 6.8.0
'@douglasneuroinformatics/libui-form-types':
specifier: ^0.13.0
version: 0.13.0
@@ -371,7 +371,7 @@ importers:
version: 0.0.6
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@opendatacapture/react-core':
specifier: workspace:*
version: link:../../packages/react-core
@@ -471,7 +471,7 @@ importers:
dependencies:
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
'@opendatacapture/licenses':
specifier: workspace:*
version: link:../../packages/licenses
@@ -556,7 +556,7 @@ importers:
version: 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@monaco-editor/react':
specifier: ^4.7.0
version: 4.7.0(monaco-editor@0.52.2)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
@@ -683,7 +683,7 @@ importers:
version: 0.0.3(typescript@6.0.3)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@heroicons/react':
specifier: ^2.2.0
version: 2.2.0(react@vendor+react@19.x)
@@ -980,7 +980,7 @@ importers:
version: 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@opendatacapture/instrument-bundler':
specifier: workspace:*
version: link:../instrument-bundler
@@ -1168,7 +1168,7 @@ importers:
version: 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@opendatacapture/instrument-bundler':
specifier: 'workspace:'
version: link:../instrument-bundler
@@ -1381,7 +1381,7 @@ importers:
devDependencies:
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
+ version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
'@opendatacapture/instrument-stubs':
specifier: workspace:*
version: link:../packages/instrument-stubs
@@ -2103,9 +2103,9 @@ packages:
{ integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== }
engines: { node: '>=6.9.0' }
- '@base-ui/react@1.5.0':
+ '@base-ui/react@1.6.0':
resolution:
- { integrity: sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A== }
+ { integrity: sha512-/jzjTWJYXhRFO45Bev9lc3cHbmjzCMpUqbMZ2AgKy/z25mY9B6shGSNcXcjQar9n5doM0KYW1W8fcFv2jZBuMw== }
engines: { node: '>=14.0.0' }
peerDependencies:
'@date-fns/tz': ^1.2.0
@@ -2121,9 +2121,9 @@ packages:
date-fns:
optional: true
- '@base-ui/utils@0.2.9':
+ '@base-ui/utils@0.3.1':
resolution:
- { integrity: sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw== }
+ { integrity: sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg== }
peerDependencies:
'@types/react': '*'
react: ^17 || ^18 || ^19
@@ -2315,9 +2315,13 @@ packages:
resolution:
{ integrity: sha512-56DsMv5yb5aG/NRVGp7BpuW7toUAgp4gfGDhbFTGPHVuGiL/U7+CnvW/BI1Me9NFIBM5bpuU30w4Kgr6xPMwHQ== }
- '@douglasneuroinformatics/libui@6.7.1':
+ '@douglasneuroinformatics/libui-form-types@0.15.0':
+ resolution:
+ { integrity: sha512-ag36tPgh9KxrcZzzc793M5GYyJcTSXXeDR0dZxa4+1Bk3RuDBsePNACKftypZKZFHZxvT8NIokLeRqRoNOquFA== }
+
+ '@douglasneuroinformatics/libui@6.8.0':
resolution:
- { integrity: sha512-8WyaszZssYlkQ4ytz6zUBiisW29O3CoT7VS3wifS4qXI21tMLqJWMYBf/MW0Sde68vHVz3kA0lr4b075JEe51A== }
+ { integrity: sha512-ZjmNl1YbMlqB/KuWCFT/5uLXU+eZoJ5GaKu9gxE70W+xvJrGt7LDi4X3GlCMf4i11Ez3ALDrpFG11oNEx5vAug== }
engines: { node: 22.x }
peerDependencies:
react: ^19.1.0
@@ -9981,6 +9985,10 @@ packages:
resolution:
{ integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== }
+ lodash-es@4.18.1:
+ resolution:
+ { integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== }
+
lodash.includes@4.3.0:
resolution:
{ integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== }
@@ -14211,27 +14219,27 @@ snapshots:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
- '@base-ui/react@1.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@base-ui/react@1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.29.7
- '@base-ui/utils': 0.2.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@base-ui/utils': 0.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@floating-ui/react-dom': 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@floating-ui/utils': 0.2.11
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
use-sync-external-store: 1.6.0(react@19.1.0)
- '@base-ui/react@1.5.0(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)':
+ '@base-ui/react@1.6.0(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)':
dependencies:
'@babel/runtime': 7.29.7
- '@base-ui/utils': 0.2.9(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
+ '@base-ui/utils': 0.3.1(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
'@floating-ui/react-dom': 2.1.8(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
'@floating-ui/utils': 0.2.11
react: link:vendor/react@19.x
react-dom: link:vendor/react-dom@19.x
use-sync-external-store: 1.6.0(react@vendor+react@19.x)
- '@base-ui/utils@0.2.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@base-ui/utils@0.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@babel/runtime': 7.29.7
'@floating-ui/utils': 0.2.11
@@ -14240,7 +14248,7 @@ snapshots:
reselect: 5.2.0
use-sync-external-store: 1.6.0(react@19.1.0)
- '@base-ui/utils@0.2.9(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)':
+ '@base-ui/utils@0.3.1(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)':
dependencies:
'@babel/runtime': 7.29.7
'@floating-ui/utils': 0.2.11
@@ -14460,11 +14468,15 @@ snapshots:
dependencies:
type-fest: 4.41.0
- '@douglasneuroinformatics/libui@6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)':
+ '@douglasneuroinformatics/libui-form-types@0.15.0':
dependencies:
- '@base-ui/react': 1.5.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ type-fest: 4.41.0
+
+ '@douglasneuroinformatics/libui@6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)':
+ dependencies:
+ '@base-ui/react': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@douglasneuroinformatics/libjs': 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
- '@douglasneuroinformatics/libui-form-types': 0.13.0
+ '@douglasneuroinformatics/libui-form-types': 0.15.0
'@radix-ui/react-accordion': 1.2.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@radix-ui/react-alert-dialog': 1.1.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@radix-ui/react-avatar': 1.1.11(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -14491,7 +14503,7 @@ snapshots:
'@tanstack/table-core': 8.21.3
class-variance-authority: 0.7.1
clsx: 2.1.1
- lodash-es: 4.17.21
+ lodash-es: 4.18.1
lucide-react: 1.17.0(react@19.1.0)
motion: 11.18.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0
@@ -14499,7 +14511,6 @@ snapshots:
react-dropzone: 14.4.1(react@19.1.0)
react-error-boundary: 4.1.2(react@19.1.0)
react-resizable-panels: 2.1.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- recharts: 2.15.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
tailwind-merge: 2.6.1
tailwindcss: 4.3.0
ts-pattern: 5.9.0
@@ -14518,11 +14529,11 @@ snapshots:
- neverthrow
- use-sync-external-store
- '@douglasneuroinformatics/libui@6.7.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)':
+ '@douglasneuroinformatics/libui@6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)':
dependencies:
- '@base-ui/react': 1.5.0(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
+ '@base-ui/react': 1.6.0(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
'@douglasneuroinformatics/libjs': 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
- '@douglasneuroinformatics/libui-form-types': 0.13.0
+ '@douglasneuroinformatics/libui-form-types': 0.15.0
'@radix-ui/react-accordion': 1.2.12(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
'@radix-ui/react-alert-dialog': 1.1.15(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
'@radix-ui/react-avatar': 1.1.11(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
@@ -14549,7 +14560,7 @@ snapshots:
'@tanstack/table-core': 8.21.3
class-variance-authority: 0.7.1
clsx: 2.1.1
- lodash-es: 4.17.21
+ lodash-es: 4.18.1
lucide-react: 1.17.0(react@vendor+react@19.x)
motion: 11.18.2(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
react: link:vendor/react@19.x
@@ -14557,7 +14568,6 @@ snapshots:
react-dropzone: 14.4.1(react@vendor+react@19.x)
react-error-boundary: 4.1.2(react@vendor+react@19.x)
react-resizable-panels: 2.1.9(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
- recharts: 2.15.4(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
tailwind-merge: 2.6.1
tailwindcss: 4.3.0
ts-pattern: 5.9.0
@@ -21545,6 +21555,8 @@ snapshots:
lodash-es@4.17.21: {}
+ lodash-es@4.18.1: {}
+
lodash.includes@4.3.0: {}
lodash.isboolean@3.0.3: {}
@@ -23160,14 +23172,6 @@ snapshots:
react: link:vendor/react@19.x
react-dom: link:vendor/react-dom@19.x
- react-smooth@4.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
- dependencies:
- fast-equals: 5.4.0
- prop-types: 15.8.1
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- react-transition-group: 4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
-
react-smooth@4.0.4(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x):
dependencies:
fast-equals: 5.4.0
@@ -23188,15 +23192,6 @@ snapshots:
react: link:vendor/react@19.x
tslib: 2.8.1
- react-transition-group@4.4.5(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
- dependencies:
- '@babel/runtime': 7.29.7
- dom-helpers: 5.2.1
- loose-envify: 1.4.0
- prop-types: 15.8.1
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
-
react-transition-group@4.4.5(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x):
dependencies:
'@babel/runtime': 7.29.7
@@ -23254,19 +23249,6 @@ snapshots:
dependencies:
decimal.js-light: 2.5.1
- recharts@2.15.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
- dependencies:
- clsx: 2.1.1
- eventemitter3: 4.0.7
- lodash: 4.18.1
- react: 19.1.0
- react-dom: 19.1.0(react@19.1.0)
- react-is: 18.3.1
- react-smooth: 4.0.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
- recharts-scale: 0.4.5
- tiny-invariant: 1.3.3
- victory-vendor: 36.9.2
-
recharts@2.15.4(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x):
dependencies:
clsx: 2.1.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index f0ccc8845..64fa46e4c 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -22,7 +22,7 @@ catalog:
'@douglasneuroinformatics/libjs': ^3.2.1
'@douglasneuroinformatics/libpasswd': '^0.0.3'
'@douglasneuroinformatics/libstats': '^0.2.1'
- '@douglasneuroinformatics/libui': ^6.7.1
+ '@douglasneuroinformatics/libui': ^6.8.0
'@douglasneuroinformatics/libui-form-types': ^0.13.0
'@microsoft/api-extractor': '^7.47.6'
'@prisma/client': '^6.9.0'
From 1da32e80ec1400299ea6fc4da504a1c2d1bf8196 Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Thu, 2 Jul 2026 11:22:57 -0400
Subject: [PATCH 4/8] update libui-form-types
---
pnpm-lock.yaml | 14 +++-----------
pnpm-workspace.yaml | 2 +-
2 files changed, 4 insertions(+), 12 deletions(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f454c7d10..4c66aa26b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,8 +28,8 @@ catalogs:
specifier: ^6.8.0
version: 6.8.0
'@douglasneuroinformatics/libui-form-types':
- specifier: ^0.13.0
- version: 0.13.0
+ specifier: ^0.15.0
+ version: 0.15.0
'@microsoft/api-extractor':
specifier: ^7.47.6
version: 7.58.7
@@ -1095,7 +1095,7 @@ importers:
dependencies:
'@douglasneuroinformatics/libui-form-types':
specifier: 'catalog:'
- version: 0.13.0
+ version: 0.15.0
'@opendatacapture/licenses':
specifier: workspace:*
version: link:../licenses
@@ -2311,10 +2311,6 @@ packages:
{ integrity: sha512-weXJgsNBdz26ldMMEh20Cn9EtR+ynn3O9v81ZEWnfBmzZmFxSlUxnevLlncJxbVM6s6SgH97C4B/L8AdGvlCxA== }
engines: { node: '>=20' }
- '@douglasneuroinformatics/libui-form-types@0.13.0':
- resolution:
- { integrity: sha512-56DsMv5yb5aG/NRVGp7BpuW7toUAgp4gfGDhbFTGPHVuGiL/U7+CnvW/BI1Me9NFIBM5bpuU30w4Kgr6xPMwHQ== }
-
'@douglasneuroinformatics/libui-form-types@0.15.0':
resolution:
{ integrity: sha512-ag36tPgh9KxrcZzzc793M5GYyJcTSXXeDR0dZxa4+1Bk3RuDBsePNACKftypZKZFHZxvT8NIokLeRqRoNOquFA== }
@@ -14464,10 +14460,6 @@ snapshots:
'@douglasneuroinformatics/libstats-win32-arm64-msvc': 0.2.1
'@douglasneuroinformatics/libstats-win32-x64-msvc': 0.2.1
- '@douglasneuroinformatics/libui-form-types@0.13.0':
- dependencies:
- type-fest: 4.41.0
-
'@douglasneuroinformatics/libui-form-types@0.15.0':
dependencies:
type-fest: 4.41.0
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 64fa46e4c..75a65ba87 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -23,7 +23,7 @@ catalog:
'@douglasneuroinformatics/libpasswd': '^0.0.3'
'@douglasneuroinformatics/libstats': '^0.2.1'
'@douglasneuroinformatics/libui': ^6.8.0
- '@douglasneuroinformatics/libui-form-types': ^0.13.0
+ '@douglasneuroinformatics/libui-form-types': ^0.15.0
'@microsoft/api-extractor': '^7.47.6'
'@prisma/client': '^6.9.0'
'@tailwindcss/vite': '4.3.0'
From feec8b7f93a6a9a0538e11fe1a3f2322f3228fbb Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Thu, 2 Jul 2026 11:30:22 -0400
Subject: [PATCH 5/8] implement combobox in schemas and translate
---
packages/instrument-utils/src/translate.ts | 4 ++--
packages/schemas/src/instrument/instrument.form.ts | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/instrument-utils/src/translate.ts b/packages/instrument-utils/src/translate.ts
index 298836c09..d749b87ab 100644
--- a/packages/instrument-utils/src/translate.ts
+++ b/packages/instrument-utils/src/translate.ts
@@ -79,9 +79,9 @@ function translateScalarField(
options: field.options?.[language]
}))
.with(
- { kind: 'number', variant: P.union('radio', 'select') },
+ { kind: 'number', variant: P.union('combobox', 'radio', 'select') },
{ kind: 'set' },
- { kind: 'string', variant: P.union('radio', 'select') },
+ { kind: 'string', variant: P.union('combobox', 'radio', 'select') },
(field) => ({
...field,
...base,
diff --git a/packages/schemas/src/instrument/instrument.form.ts b/packages/schemas/src/instrument/instrument.form.ts
index ed9b4583b..be2af0089 100644
--- a/packages/schemas/src/instrument/instrument.form.ts
+++ b/packages/schemas/src/instrument/instrument.form.ts
@@ -32,7 +32,7 @@ const $$FormInstrumentStringField = (langu
$$FormInstrumentBaseField(language).extend({
kind: z.literal('string'),
options: $$InstrumentUIOption(z.record(z.string(), z.string().min(1)), language),
- variant: z.enum(['radio', 'select'])
+ variant: z.enum(['combobox', 'radio', 'select'])
}),
$$FormInstrumentBaseField(language).extend({
kind: z.literal('string'),
From 7165e58cac95e5b4633a649764a9e68909778906 Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Thu, 2 Jul 2026 11:30:30 -0400
Subject: [PATCH 6/8] add combobox to form reference
---
.../instruments/examples/form/Form-Reference/index.ts | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/apps/playground/src/instruments/examples/form/Form-Reference/index.ts b/apps/playground/src/instruments/examples/form/Form-Reference/index.ts
index da13f785e..811fc7bd5 100644
--- a/apps/playground/src/instruments/examples/form/Form-Reference/index.ts
+++ b/apps/playground/src/instruments/examples/form/Form-Reference/index.ts
@@ -76,6 +76,16 @@ export default defineInstrument({
{
title: 'String',
fields: {
+ stringCombobox: {
+ kind: 'string',
+ label: 'String (Combobox)',
+ options: {
+ a: 'A',
+ b: 'B',
+ c: 'C'
+ },
+ variant: 'combobox'
+ },
stringInput: {
kind: 'string',
label: 'String (Input)',
@@ -230,6 +240,7 @@ export default defineInstrument({
});
}
}),
+ stringCombobox: z.enum(['a', 'b', 'c']),
stringRadio: z.enum(['a', 'b', 'c']),
stringSelect: z.enum(['a', 'b', 'c']),
stringTextArea: z.string(),
From 02bd542295c119c5bd66090f4ace815720991239 Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Thu, 2 Jul 2026 11:43:33 -0400
Subject: [PATCH 7/8] update libui
---
pnpm-lock.yaml | 26 +++++++++++++-------------
pnpm-workspace.yaml | 2 +-
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4c66aa26b..dfa364a95 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -25,8 +25,8 @@ catalogs:
specifier: ^0.2.1
version: 0.2.1
'@douglasneuroinformatics/libui':
- specifier: ^6.8.0
- version: 6.8.0
+ specifier: ^6.8.1
+ version: 6.8.1
'@douglasneuroinformatics/libui-form-types':
specifier: ^0.15.0
version: 0.15.0
@@ -371,7 +371,7 @@ importers:
version: 0.0.6
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@opendatacapture/react-core':
specifier: workspace:*
version: link:../../packages/react-core
@@ -471,7 +471,7 @@ importers:
dependencies:
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
'@opendatacapture/licenses':
specifier: workspace:*
version: link:../../packages/licenses
@@ -556,7 +556,7 @@ importers:
version: 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@monaco-editor/react':
specifier: ^4.7.0
version: 4.7.0(monaco-editor@0.52.2)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
@@ -683,7 +683,7 @@ importers:
version: 0.0.3(typescript@6.0.3)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@heroicons/react':
specifier: ^2.2.0
version: 2.2.0(react@vendor+react@19.x)
@@ -980,7 +980,7 @@ importers:
version: 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@opendatacapture/instrument-bundler':
specifier: workspace:*
version: link:../instrument-bundler
@@ -1168,7 +1168,7 @@ importers:
version: 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)
'@opendatacapture/instrument-bundler':
specifier: 'workspace:'
version: link:../instrument-bundler
@@ -1381,7 +1381,7 @@ importers:
devDependencies:
'@douglasneuroinformatics/libui':
specifier: 'catalog:'
- version: 6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
+ version: 6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)
'@opendatacapture/instrument-stubs':
specifier: workspace:*
version: link:../packages/instrument-stubs
@@ -2315,9 +2315,9 @@ packages:
resolution:
{ integrity: sha512-ag36tPgh9KxrcZzzc793M5GYyJcTSXXeDR0dZxa4+1Bk3RuDBsePNACKftypZKZFHZxvT8NIokLeRqRoNOquFA== }
- '@douglasneuroinformatics/libui@6.8.0':
+ '@douglasneuroinformatics/libui@6.8.1':
resolution:
- { integrity: sha512-ZjmNl1YbMlqB/KuWCFT/5uLXU+eZoJ5GaKu9gxE70W+xvJrGt7LDi4X3GlCMf4i11Ez3ALDrpFG11oNEx5vAug== }
+ { integrity: sha512-uiQG0M/slaiMV/YG5Grnzh+CyQl/cRoHcIe9sJsBB5onajM9Zfv06D/mnbogiGlRDOLibNabuQBio0bbZBT9Qw== }
engines: { node: 22.x }
peerDependencies:
react: ^19.1.0
@@ -14464,7 +14464,7 @@ snapshots:
dependencies:
type-fest: 4.41.0
- '@douglasneuroinformatics/libui@6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)':
+ '@douglasneuroinformatics/libui@6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@19.1.0))(zod@vendor+zod@3.x)':
dependencies:
'@base-ui/react': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@douglasneuroinformatics/libjs': 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
@@ -14521,7 +14521,7 @@ snapshots:
- neverthrow
- use-sync-external-store
- '@douglasneuroinformatics/libui@6.8.0(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)':
+ '@douglasneuroinformatics/libui@6.8.1(immer@10.2.0)(neverthrow@8.2.0)(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)(tailwindcss@4.3.0)(use-sync-external-store@1.6.0(react@vendor+react@19.x))(zod@vendor+zod@3.x)':
dependencies:
'@base-ui/react': 1.6.0(react-dom@vendor+react-dom@19.x)(react@vendor+react@19.x)
'@douglasneuroinformatics/libjs': 3.2.1(neverthrow@8.2.0)(zod@vendor+zod@3.x)
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 75a65ba87..9cfd4fa39 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -22,7 +22,7 @@ catalog:
'@douglasneuroinformatics/libjs': ^3.2.1
'@douglasneuroinformatics/libpasswd': '^0.0.3'
'@douglasneuroinformatics/libstats': '^0.2.1'
- '@douglasneuroinformatics/libui': ^6.8.0
+ '@douglasneuroinformatics/libui': ^6.8.1
'@douglasneuroinformatics/libui-form-types': ^0.15.0
'@microsoft/api-extractor': '^7.47.6'
'@prisma/client': '^6.9.0'
From 82b0ae9d8f80c61c0b36887e1374fc7f2bf3607b Mon Sep 17 00:00:00 2001
From: joshunrau
Date: Thu, 2 Jul 2026 11:45:15 -0400
Subject: [PATCH 8/8] increment version
---
package.json | 2 +-
packages/instrument-bundler/package.json | 2 +-
packages/instrument-guidelines/package.json | 2 +-
packages/playground-url/package.json | 2 +-
packages/serve-instrument/package.json | 2 +-
runtime/v1/package.json | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/package.json b/package.json
index 7da96ae3a..9ba880452 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "opendatacapture",
"type": "module",
- "version": "2.0.0",
+ "version": "2.1.0",
"private": true,
"packageManager": "pnpm@10.34.3",
"license": "Apache-2.0",
diff --git a/packages/instrument-bundler/package.json b/packages/instrument-bundler/package.json
index 949162190..d5247ffd6 100644
--- a/packages/instrument-bundler/package.json
+++ b/packages/instrument-bundler/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendatacapture/instrument-bundler",
"type": "module",
- "version": "2.0.0",
+ "version": "2.1.0",
"license": "Apache-2.0",
"publishConfig": {
"access": "public"
diff --git a/packages/instrument-guidelines/package.json b/packages/instrument-guidelines/package.json
index 2389e23e1..92ec22d5d 100644
--- a/packages/instrument-guidelines/package.json
+++ b/packages/instrument-guidelines/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendatacapture/instrument-guidelines",
"type": "module",
- "version": "2.0.0",
+ "version": "2.1.0",
"description": "Guidelines for authoring Open Data Capture instruments, intended to be read by an AI agent (e.g. Claude Code).",
"license": "Apache-2.0",
"publishConfig": {
diff --git a/packages/playground-url/package.json b/packages/playground-url/package.json
index c15b6fe62..bd797cedd 100644
--- a/packages/playground-url/package.json
+++ b/packages/playground-url/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendatacapture/playground-url",
"type": "module",
- "version": "2.0.0",
+ "version": "2.1.0",
"license": "Apache-2.0",
"publishConfig": {
"access": "public"
diff --git a/packages/serve-instrument/package.json b/packages/serve-instrument/package.json
index 458ef3808..1b4ef8f3a 100644
--- a/packages/serve-instrument/package.json
+++ b/packages/serve-instrument/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendatacapture/serve-instrument",
"type": "module",
- "version": "2.0.0",
+ "version": "2.1.0",
"license": "Apache-2.0",
"publishConfig": {
"access": "public"
diff --git a/runtime/v1/package.json b/runtime/v1/package.json
index 83fc13c21..05bac9cd3 100644
--- a/runtime/v1/package.json
+++ b/runtime/v1/package.json
@@ -1,7 +1,7 @@
{
"name": "@opendatacapture/runtime-v1",
"type": "module",
- "version": "2.0.0",
+ "version": "2.1.0",
"author": {
"name": "Douglas Neuroinformatics",
"email": "support@douglasneuroinformatics.ca"