Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
✅ Deploy Preview for fresco-sandbox ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Pull request overview
Major v4.0.0 release update introducing a new form system, schema v8 support, preview mode, multi-user capability, and a revamped drag-and-drop/dashboard UI, alongside significant refactors and infrastructure/config updates.
Changes:
- Added preview mode infrastructure (API routes, DB fields, auth toggle, preview interview flow).
- Introduced new form field system (TanStack Form contexts/hooks + many new field components).
- Reworked drag-and-drop (new
lib/dndstore/hooks/utils, plus refactors in interviewer components).
Reviewed changes
Copilot reviewed 293 out of 804 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| lib/interviewer/components/Panels.js | Formatting simplification for panel wrapper |
| lib/interviewer/components/Panel.tsx | New TSX panel component with collapse/minimize/highlight logic |
| lib/interviewer/components/Panel.js | Removed legacy Panel implementation |
| lib/interviewer/components/NodeBin.tsx | New NodeBin using new ~/lib/dnd drop target hook |
| lib/interviewer/components/NodeBin.js | Removed legacy NodeBin drag/drop HOC implementation |
| lib/interviewer/components/Node.tsx | New memoized Node wrapper + MotionNode |
| lib/interviewer/components/Node.js | Removed legacy Node implementation |
| lib/interviewer/components/Navigation.tsx | Navigation refactor (props-driven disable state + passphrase prompt) |
| lib/interviewer/components/MultiNodeBucket.js | Removed legacy bucket component |
| lib/interviewer/components/Edge.js | Updated edge color selector wiring |
| lib/interviewer/components/DialogManager.js | Redux action import refactor |
| lib/interviewer/components/CollapsablePrompts.js | Added support for rendering children in prompts container |
| lib/interviewer/components/CategoricalItem.js | Removed legacy categorical item implementation |
| lib/interviewer/components/Canvas/NodeLayout.js | Updated updateNode API usage |
| lib/interviewer/components/Canvas/NarrativeEdgeLayout.js | Minor formatting cleanup |
| lib/interviewer/components/Canvas/LayoutNode.js | Layout node rendering tweaks (size + import ordering) |
| lib/interviewer/components/Canvas/EdgeLayout.js | Selector refactor for codebook lookup |
| lib/interviewer/components/Canvas/ConvexHulls.js | Selector import consolidation |
| lib/interviewer/components/Canvas/Canvas.js | Formatting cleanup |
| lib/interviewer/components/BackgroundImage.js | Formatting cleanup |
| lib/interviewer/behaviours/scrollable.js | Removed legacy scrollable HOC |
| lib/interviewer/behaviours/DragAndDrop/useDropMonitor.js | Removed legacy drop monitor hook |
| lib/interviewer/behaviours/DragAndDrop/store.js | Store middleware updated for unserializable drag/drop values |
| lib/interviewer/behaviours/DragAndDrop/reducer.js | Action type constants changed from Symbols to strings |
| lib/interviewer/behaviours/DragAndDrop/index.js | Export surface adjusted |
| lib/interviewer/behaviours/DragAndDrop/MonitorDropTarget.js | Removed legacy monitor HOC |
| lib/interviewer/behaviours/DragAndDrop/MonitorDragSource.js | Removed legacy monitor HOC |
| lib/interviewer/behaviours/DragAndDrop/Monitor.js | Removed legacy monitor base |
| lib/interviewer/behaviours/DragAndDrop/DropTarget.js | Import cleanup |
| lib/interviewer/behaviours/DragAndDrop/DropObstacle.js | Formatting + minor simplifications |
| lib/interviewer/behaviours/DragAndDrop/DragSource.js | Defaults added for handler props |
| lib/interviewer/behaviours/DragAndDrop/DragPreview.js | Removed eslint disable header (left blank line) |
| lib/interviewer/behaviours/AssetMetaProvider.js | Selector import/path refactor |
| lib/form/utils/scrollToFirstError.ts | Added helper to scroll to first form error |
| lib/form/utils/formContexts.ts | Added TanStack Form contexts |
| lib/form/types.ts | Added core form typing layer |
| lib/form/hooks/useTanStackForm.ts | Added TanStack Form hook wrapper |
| lib/form/components/fields/utils/options.js | Added option normalization helpers |
| lib/form/components/fields/VisualAnalogScale.js | Added VAS wrapper field |
| lib/form/components/fields/ToggleButton.tsx | Added ToggleButton field |
| lib/form/components/fields/Toggle.tsx | Added Toggle field |
| lib/form/components/fields/TextArea.tsx | Added TextArea field |
| lib/form/components/fields/Slider/index.js | Added Slider barrel export |
| lib/form/components/fields/Slider/Track.js | Added slider Track component |
| lib/form/components/fields/Slider/Tick.js | Added slider Tick component |
| lib/form/components/fields/Slider/Field.js | Added Slider field wrapper |
| lib/form/components/fields/Search.tsx | Added Search field wrapper |
| lib/form/components/fields/RelativeDatePicker.js | Added relative date picker wrapper |
| lib/form/components/fields/Radio.tsx | Added Radio field |
| lib/form/components/fields/MarkdownLabel.js | Added markdown label wrapper |
| lib/form/components/fields/Markdown.js | Added markdown renderer with sanitize/raw support |
| lib/form/components/fields/LikertScale.js | Added Likert scale wrapper |
| lib/form/components/fields/FieldSkeleton.tsx | Added skeleton for loading states |
| lib/form/components/fields/DatePicker/index.js | Added DatePicker barrel export |
| lib/form/components/fields/DatePicker/helpers.js | Added DatePicker helper utilities |
| lib/form/components/fields/DatePicker/Panels.js | Added DatePicker animated panels container |
| lib/form/components/fields/DatePicker/Panel.js | Added DatePicker animated panel |
| lib/form/components/fields/DatePicker/Field.js | Added DatePicker field wrapper |
| lib/form/components/fields/DatePicker/DatePicker/helpers.js | Added DatePicker internal helpers |
| lib/form/components/fields/DatePicker/DatePicker/Years.js | Added years range supplier |
| lib/form/components/fields/DatePicker/DatePicker/Months.js | Added months range supplier |
| lib/form/components/fields/DatePicker/DatePicker/Days.js | Added days range supplier |
| lib/form/components/fields/DatePicker/DatePicker/DatePickerContext.js | Added DatePicker context |
| lib/form/components/fields/DatePicker/DatePicker/Date.js | Added DatePicker date selector helper |
| lib/form/components/fields/Checkbox.js | Added checkbox field component (redux-form style props) |
| lib/form/components/fields/Boolean.js | Added boolean field component |
| lib/dnd/utils.ts | Added DnD hit detection + raf throttle utilities |
| lib/dnd/types.ts | Added core DnD types |
| lib/dnd/index.ts | Added DnD public exports |
| lib/dnd/tests/setup.ts | Added test environment setup for DnD |
| lib/dnd/DndStoreProvider.tsx | Added Zustand-based DnD store provider + drag preview portal |
| lib/dialogs/useDialog.stories.tsx | Added story for useDialog |
| lib/dialogs/Dialog.stories.tsx | Added dialog stories |
| lib/dialogs/ControlledDialog.tsx | Added controlled dialog variant |
| lib/dialogs/ControlledDialog.stories.tsx | Added controlled dialog stories |
| lib/db/schema.prisma | Added preview + pending protocol fields, ApiToken model, asset value |
| lib/db/migrations/20251204222357_add_protocol_is_pending/migration.sql | Migration: add Protocol.isPending |
| lib/db/migrations/20251118073416_add_preview_mode_and_api_tokens/migration.sql | Migration: preview mode + ApiToken + index |
| lib/db/migrations/20250426201139_add_protocol_experiments/migration.sql | Migration: add Protocol.experiments |
| lib/db/migrations/20250122184616_add_asset_value/migration.sql | Migration: add Asset.value + join table pk changes |
| lib/cache.ts | Cache tags refactor + multi-tag revalidation + deployment keying |
| knip.json | Knip config updates + Playwright wiring |
| jsconfig.json | Added JS compilerOptions config file |
| hooks/usePortal.ts | Made usePortal client-safe for SSR + delayed mount |
| hooks/useCanvas.ts | Formatting cleanup |
| hooks/use-data-table.tsx | Updated data table types import path |
| fresco.config.ts | Added schema v8 + preview min architect version |
| env.js | Added PREVIEW_MODE env var |
| docker-compose.prod.yml | Updated prod compose env + ports + volumes |
| docker-compose.dev.yml | YAML formatting cleanup |
| components/ui/tooltip.tsx | Tailwind class ordering tweaks |
| components/ui/toaster.tsx | Tailwind class ordering tweaks |
| components/ui/toast.tsx | Fixed Heading import path |
| components/ui/table.tsx | Table container styling/layout changes |
| components/ui/switch.tsx | Tailwind class ordering tweaks |
| components/ui/separator.tsx | Quote/style normalization |
| components/ui/select.tsx | Tailwind class ordering tweaks |
| components/ui/progress.tsx | Tailwind class ordering tweaks |
| components/ui/popover.tsx | Quote/style normalization |
| components/ui/dialog.tsx | Fixed typography import paths |
| components/ui/checkbox.tsx | Tailwind class ordering tweaks |
| components/ui/card.tsx | Fixed Heading import path + class changes |
| components/ui/badge.tsx | Fixed export formatting |
| components/ui/Label.tsx | Fixed Heading import path |
| components/ui/Input.tsx | Tailwind class ordering tweaks |
| components/ui/CloseButton.tsx | Made onClick optional + class ordering |
| components/ui/Button.tsx | Updated tableHeader variant styles |
| components/ui/AlertDialog.tsx | Fixed typography import paths |
| components/ui/Alert.tsx | Fixed typography import paths |
| components/typography/Heading.tsx | Minor expression parenthesization cleanup |
| components/layout/SettingsSection.tsx | Updated Heading import path |
| components/layout/ResponsiveContainer.tsx | Added new content base size |
| components/interview/ActionButton.tsx | Added interview action button component |
| components/interview/ActionButton.stories.tsx | Added ActionButton story |
| components/data-table/data-table.tsx | Updated types import path + layout tweaks |
| components/data-table/data-table-toolbar.tsx | Updated types import path + layout tweaks |
| components/data-table/data-table-skeleton.tsx | Layout tweaks |
| components/data-table/data-table-pagination.tsx | Updated pageSizes import path |
| components/data-table/data-table-floating-bar.tsx | Minor typing + class ordering |
| components/data-table/data-table-faceted-filter.tsx | Updated Option import path + class ordering |
| components/data-table/advanced/data-table-advanced-toolbar.tsx | Updated types import path + wrapper removal |
| components/data-table/advanced/data-table-advanced-filter.tsx | Updated types import path |
| components/VersionSection.tsx | Typography import path updates + class ordering |
| components/Providers/index.tsx | Added global Providers wrapper (Motion/Radix/Dialog/Toaster) |
| components/Providers/RadixDirectionProvider.tsx | Added Radix direction provider |
| components/ProtocolImport/JobReducer.ts | Added “Migrating protocol” import status |
| components/ProtocolImport/JobCard.tsx | Typography import updates + class ordering |
| components/PreviewModeAuthSwitch.tsx | Added switch for preview auth requirement |
| components/ErrorReportNotifier.tsx | Class ordering tweaks |
| components/ErrorDetails.tsx | Import ordering + class ordering tweaks |
| components/DynamicLucideIcon.tsx | Added CMS-safe lucide icon resolver |
| components/DataTable/types.ts | Added new activity types (API token + preview mode) |
| components/DataTable/DataTable.tsx | Removed redundant wrapper border |
| components/DataTable/ColumnHeader.tsx | UI tweaks for sortable headers |
| components/CloseButton.tsx | Added new CloseButton wrapper component |
| components/BackgroundBlobs/Canvas.tsx | Tailwind conversion for sizing |
| components/BackgroundBlobs/BackgroundBlobs.tsx | Inlined RNG helpers (removed import) |
| app/not-found.tsx | Typography import path updates + class ordering |
| app/layout.tsx | Added Providers + ResponsiveContainer path change |
| app/global-error.tsx | Typography import path updates + ResponsiveContainer path change |
| app/error.tsx | Typography import path updates + ResponsiveContainer path change |
| app/dashboard/settings/loading.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/settings/_components/UpdateUploadThingToken.tsx | Switched to generic UpdateSettingsValue API |
| app/dashboard/settings/_components/UpdateInstallationId.tsx | Switched to generic UpdateSettingsValue API |
| app/dashboard/protocols/page.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/protocols/loading.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/protocols/_components/DeleteProtocolsDialog.tsx | Updated Protocol type import + improved warning copy |
| app/dashboard/participants/page.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/participants/loading.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/participants/_components/ParticipantModal.tsx | Typography import path updates |
| app/dashboard/participants/_components/ImportCSVModal.tsx | Typography import path updates + error message change |
| app/dashboard/participants/_components/ExportParticipants/ImportExportSection.tsx | Typography + ResponsiveContainer import updates |
| app/dashboard/participants/_components/ExportParticipants/GenerateParticipantURLsButton.tsx | Updated types to table client exports |
| app/dashboard/participants/_components/ExportParticipants/ExportParticipants.tsx | Added SuperJSON parsing for participants payload |
| app/dashboard/participants/_components/ExportParticipants/ExportCSVParticipantURLs.tsx | Updated types to table client exports |
| app/dashboard/participants/_components/DropzoneField.tsx | Typography import path updates |
| app/dashboard/participants/_components/DeleteParticipantsDialog.tsx | Alert variant set + improved warning copy |
| app/dashboard/page.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/loading.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/interviews/page.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/interviews/loading.tsx | Typography + ResponsiveContainer import path updates |
| app/dashboard/interviews/_components/GenerateInterviewURLs.tsx | Added SuperJSON parsing for protocols payload |
| app/dashboard/interviews/_components/ExportOptionsView.tsx | Typography import path updates |
| app/dashboard/interviews/_components/ExportInterviewsDialog.tsx | Added SuperJSON parsing for prepared export payloads |
| app/dashboard/interviews/_components/ExportCSVInterviewURLs.tsx | Updated protocol/interview types |
| app/dashboard/_components/UploadThingModal.tsx | Typography import path updates |
| app/dashboard/_components/UpdateSettingsValue.tsx | Simplified API: now uses setAppSetting by key |
| app/dashboard/_components/SummaryStatistics/SummaryStatistics.tsx | ResponsiveContainer import path updates |
| app/dashboard/_components/SummaryStatistics/StatCard.tsx | Typography import path updates |
| app/dashboard/_components/RecruitmentTestSectionServer.tsx | Typography import path updates |
| app/dashboard/_components/RecruitmentTestSection.tsx | Added SuperJSON parsing for promises |
| app/dashboard/_components/ProtocolsTable/ProtocolsTableClient.tsx | Added SuperJSON parsing + exported ProtocolWithInterviews type |
| app/dashboard/_components/ProtocolsTable/ProtocolsTable.tsx | Removed unstable_noStore usage |
| app/dashboard/_components/ProtocolsTable/Columns.tsx | Updated imports + ProtocolWithInterviews type source |
| app/dashboard/_components/ProtocolsTable/ActionsDropdown.tsx | Updated ProtocolWithInterviews type source |
| app/dashboard/_components/ProtocolUploader.tsx | Class ordering tweaks |
| app/dashboard/_components/ParticipantsTable/ParticipantsTableClient.tsx | Added SuperJSON parsing + exported ParticipantWithInterviews type |
| app/dashboard/_components/ParticipantsTable/GenerateParticipantURLButton.tsx | Updated protocol types + typography import path |
| app/dashboard/_components/ParticipantsTable/Columns.tsx | Updated protocol/participant type sources + typography import path |
| app/dashboard/_components/ParticipantsTable/ActionsDropdown.tsx | Updated participant type source |
| app/dashboard/_components/NavigationBar.tsx | Typography import path update + Image priority |
| app/dashboard/_components/InterviewsTable/InterviewsTable.tsx | Added SuperJSON parsing for interviews payload |
| app/dashboard/_components/ActivityFeed/utils.ts | Updated ActivityType type import path |
| app/dashboard/_components/ActivityFeed/SearchParams.ts | Updated filter/sort type import path |
| app/dashboard/_components/ActivityFeed/ColumnDefinition.tsx | Updated data-table types import path + minor cell render tweak |
| app/api/uploadthing/route.ts | Use derived base URL for callback, tolerate missing token |
| app/api/test/clear-cache/route.ts | Added test-only cache invalidation endpoint |
| app/api/preview/types.ts | Added preview message exchange types |
| app/api/preview/helpers.ts | Added preview mode auth helper + CORS response helpers |
| app/(interview)/preview/layout.tsx | Added preview layout with small-screen overlay |
| app/(interview)/preview/[protocolId]/route.ts | Added preview protocol gate + redirect handler |
| app/(interview)/preview/[protocolId]/interview/page.tsx | Added preview interview page (in-memory interview construction) |
| app/(interview)/layout.tsx | Added shared interview root layout with metadata + styles import |
| app/(interview)/interview/layout.tsx | Simplified interview layout (moved overlay out) |
| app/(interview)/interview/finished/page.tsx | Typography import path updates + class ordering |
| app/(interview)/interview/_components/SmallScreenOverlay.tsx | Typography import path updates |
| app/(interview)/interview/_components/ServerSync.tsx | Removed legacy client-side sync component |
| app/(interview)/interview/_components/InterviewShell.tsx | Switched to SuperJSON payload + store factory + DnD provider |
| app/(interview)/interview/[interviewId]/sync/route.ts | Added POST route to persist interview state |
| app/(interview)/interview/[interviewId]/page.tsx | Switched to SuperJSON payload + updated finished interview guard |
| app/(interview)/interview/[interviewId]/layout.tsx | Added per-session layout with small-screen overlay |
| app/(blobs)/layout.tsx | Class ordering tweaks |
| app/(blobs)/expired/page.tsx | Removed runtime redirect check + styling tweak |
| app/(blobs)/(setup)/setup/page.tsx | Class ordering tweaks |
| app/(blobs)/(setup)/layout.tsx | Forced dynamic rendering for DB-backed expiry check |
| app/(blobs)/(setup)/_components/SignInForm.tsx | Typography import path updates |
| app/(blobs)/(setup)/_components/Sidebar.tsx | Typography import path updates |
| app/(blobs)/(setup)/_components/OnboardSteps/UploadProtocol.tsx | Typography import path updates |
| app/(blobs)/(setup)/_components/OnboardSteps/ManageParticipants.tsx | Typography import path updates |
| app/(blobs)/(setup)/_components/OnboardSteps/Documentation.tsx | Typography import path updates |
| app/(blobs)/(setup)/_components/OnboardSteps/CreateAccount.tsx | Typography import path updates |
| app/(blobs)/(setup)/_components/OnboardSteps/ConnectUploadThing.tsx | Typography import path updates |
| actions/uploadThing.ts | Updated UploadThing helper import path |
| actions/reset.ts | Batch tag revalidation + UploadThing helper import path update |
| actions/protocols.ts | Protocol insert refactor (schema/typing changes) |
| actions/appSettings.ts | App setting schema refactor + centralized getStringValue |
| actions/activityFeed.ts | Updated activity types import path |
| Dockerfile | Added build arg + NODE_OPTIONS change + prisma CLI install step |
| CLAUDE.md | Documentation whitespace + “Debugging” tips section |
| .vscode/settings.json | Editor defaults + Tailwind regex tweaks |
| .vscode/launch.json | JSON formatting cleanup |
| .vscode/extensions.json | JSON formatting cleanup |
| .storybook/preview.tsx | Switched to nextjs-vite preview + Providers decorator |
| .storybook/preview.ts | Removed old preview config |
| .storybook/main.ts | Switched Storybook framework to @storybook/nextjs-vite |
| .prettierrc | Added tabWidth/useTabs options |
| .github/workflows/docker-build-pr.yml | Input to disable image optimization + renamed image |
| .github/workflows/chromatic.yml | Added Chromatic CI workflow |
| .github/dependabot.yml | Quote/style normalization |
| .github/workflows/update-snapshots.yml | Removed snapshot update workflow |
| .github/workflows/playwright.yml | Removed Playwright CI workflow |
| .eslintrc.cjs | Removed legacy ESLint config |
| .serena/memories/* | Removed Serena memory docs/ignores |
Comments suppressed due to low confidence (1)
actions/protocols.ts:1
- The function signature indicates
protocolInsertSchemais the source of truth, but the runtime validation (protocolInsertSchema.parse(input)) was removed. This allows malformed/untrusted input to reach Prisma writes (and can cause runtime exceptions or invalid DB state). Re-introduceprotocolInsertSchema.parse(input)(orsafeParsewith a clear error) and destructure from the parsed result.
'use server';
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
app/dashboard/participants/_components/ExportParticipants/ExportParticipants.tsx
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 293 out of 802 changed files in this pull request and generated 12 comments.
Comments suppressed due to low confidence (1)
app/dashboard/participants/_components/ImportCSVModal.tsx:1
ZodError.messageis often a generic/verbose summary and may be less actionable than showing a specific issue. Consider usinge.errors[0]?.message(or formattinge.errors) to surface the most relevant validation problem to the user.
'use client';
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
app/dashboard/_components/ParticipantsTable/ParticipantsTableClient.tsx
Outdated
Show resolved
Hide resolved
🎭 Playwright E2E Test Report❌ Tests failed. View the full report here: |
🎭 Playwright E2E Test Report❌ Tests failed. View the full report here: |
base-ui's Combobox.Input onChange handler expects the native React ChangeEvent (reads event.nativeEvent.inputType), but InputField's onChange only forwards the string value. Added a nativeOnChange prop to InputField that forwards the raw event, and switched Combobox to the render-function form to bridge the two APIs.
… components Update useProtocolForm and createFieldMetadata to forward the new optional hint and showValidationHints properties from protocol form field definitions. Fix validation hint extraction by moving z.meta() registration from the inner schema to the outer z.prefault() wrapper so z.globalRegistry.get() can find it. Add storybook coverage for both Field and useProtocolForm.
…lling
- Replace NumberCounterField with InputField type="number" throughout
- Consolidate PersonFields as single source of truth for person form fields:
- Add namespace prop (replaces prefix/index), useProtocolForm integration
- Add nameToggle prop for "I know this person's name" toggle
- Add initial.attributes for restoring custom field values on back navigation
- Refactor AddPersonForm to compose PersonFields
- Add relationship/parenthood questions to AddPersonForm for parent, partner,
and sibling modes
- Add gestational carrier step skip logic when carrier is unambiguous
- Remove extended family wizard sections (grandparents, aunts/uncles, cousins,
siblings' families)
- Use Surface/Heading consistently across all wizard steps
- Fix sex-at-birth/gender-identity sensitive labelling in getParentLabel
- Fix FamilyPedigree.stories.tsx type errors
- Add BFS-based dynamic node labelling (getDisplayLabel) for unnamed nodes:
- Named intermediary labels ("Rob's Parent")
- Lineage fallback ("Paternal Grandparent")
- Labels baked into nodes at finalization
- 20 unit tests covering all relationship types
Add configurable debug logging to the Zustand form store with colored console output and batched grouping for register/unregister bursts. Enable via `<FormStoreProvider debug>`. Each store instance gets an auto-incrementing ID for differentiation in logs. Add value/onChange props to Checkbox so it can be used directly with the Field component as a boolean input, while preserving the base-ui checked/onCheckedChange API for standalone and CheckboxGroup use.
…round Add AnimatePresence for smooth form-to-alert transitions, celebrate particles on passphrase success, and semi-transparent blurred panel. Add names in non-European scripts (Arabic, CJK, Devanagari, Bengali, Amharic, Greek, Thai, Armenian, Georgian, Cyrillic). Fix initial stream distribution to avoid wave effect on mount.
🎭 Playwright E2E Test Report❌ Tests failed. View the full report here: |
replace invariant throws with null guards so stale selectors that reevaluate after node deletion dont crash the app
🎭 Playwright E2E Test Report❌ Tests failed. View the full report here: |
🎭 Playwright E2E Test Report❌ Tests failed. View the full report here: |
Significant release!
Waiting on: