Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
338 commits
Select commit Hold shift + click to select a range
4d64a46
implement elevation plugin in tailwind
jthrilly Sep 19, 2025
e2b96d5
implement elevation plugin using correct heuristics; implement and ha…
jthrilly Sep 22, 2025
4e9223a
remove old dialog system
jthrilly Sep 28, 2025
86dc334
add dialog footer back in; fix issue with validation on form close
jthrilly Oct 6, 2025
0bd0a4e
add initial icon component
jthrilly Oct 6, 2025
e781753
implement new Icon component and update existing icons to ts
jthrilly Oct 6, 2025
7d22aae
begin to replace use of old dialog component
jthrilly Oct 6, 2025
e5456f8
implement type scale
jthrilly Oct 7, 2025
76123b2
switch to margin bottom for spacing
jthrilly Oct 7, 2025
c2c5d6c
increase spacing
jthrilly Oct 7, 2025
ab876aa
correctly handle overflow for node form
jthrilly Oct 8, 2025
4c9f781
fix scrollToFirstError
jthrilly Oct 8, 2025
76d3b13
implement example of async form submission:
jthrilly Oct 9, 2025
2715d02
implement better return type for submission result
jthrilly Oct 9, 2025
f897b4b
fix existing dialog uses in dashboard
jthrilly Oct 10, 2025
c05e87b
fix dialog centering; fix node component
jthrilly Oct 13, 2025
0388d89
debugging validation and dialog instability
jthrilly Oct 13, 2025
c99084c
add eslint plugin for missing tailwind classes
jthrilly Oct 14, 2025
a010ecc
Implement RenderMarkdown component
jthrilly Oct 14, 2025
57f4458
add position:relative to body to fix iOS 26 issue with dialogs
jthrilly Oct 16, 2025
4356d34
merge with base branch
jthrilly Oct 16, 2025
5de1953
finish merge with parent branch
jthrilly Oct 16, 2025
86e1107
implement DialogTrigger
jthrilly Oct 20, 2025
bb85adb
implement chroma scaling
jthrilly Oct 21, 2025
0331073
tweak shadows for the last time
jthrilly Oct 22, 2025
19e6782
fix interviews table
jthrilly Oct 22, 2025
df069e7
update basic interview shell and nav bar
jthrilly Oct 23, 2025
fe764dd
improve prompt;name generator; name gen panels; quick add button
jthrilly Oct 23, 2025
11fb42a
numberous style fixes; new navigation bar
jthrilly Oct 24, 2025
096f943
simplify typography ssytem
jthrilly Oct 27, 2025
afe1098
remove next.lock
jthrilly Oct 27, 2025
5f80a8f
fix button text color
jthrilly Oct 28, 2025
3a57649
further component fixes
jthrilly Oct 31, 2025
8e34cef
improvements to field state and required state
jthrilly Nov 14, 2025
0564e6a
add theme switcher to storybook
jthrilly Nov 14, 2025
9d1b910
better responsiveness for dialogs
jthrilly Nov 17, 2025
e6c4dd2
merge with v4
jthrilly Nov 17, 2025
763e892
update storybook implementation
jthrilly Nov 17, 2025
a48d760
improve NodeForm rendering
jthrilly Nov 18, 2025
1754356
merge
jthrilly Nov 20, 2025
829fbd1
better handling of fieldsets
jthrilly Nov 20, 2025
0810bbb
update base-ui
jthrilly Nov 20, 2025
353e77a
experiment with custom element
jthrilly Nov 24, 2025
41d9de1
implement multlselect component
jthrilly Nov 24, 2025
c20f745
make buttons default to type=button
jthrilly Nov 25, 2025
65b178f
update tailwind styles
jthrilly Nov 25, 2025
d2c9773
Merge branch 'v4' into new-form-system
jthrilly Nov 25, 2025
801fb79
remove invalid colors from stories
jthrilly Nov 25, 2025
7dfcdf1
merge with v4
jthrilly Nov 25, 2025
06e7a96
remove unused dependencies
jthrilly Nov 25, 2025
ba57f01
rough rich text component
jthrilly Nov 25, 2025
efd0b7d
Add renderer component
jthrilly Nov 25, 2025
e20c65c
Refactor form field naming and extract dialog components
jthrilly Nov 27, 2025
5f2c7a7
Add BasicDialogPopup component with type-safe animation constraints
jthrilly Nov 27, 2025
f0e82c5
Refactor dialog components: rename BasicDialogPopup to ModalPopup
jthrilly Nov 27, 2025
33f490f
prototype of new approach to arrayfield
jthrilly Dec 2, 2025
d93e58f
Replace ControlledDialog with Dialog and refactor dialog components
jthrilly Dec 3, 2025
844fa6a
add test coverage of dialog return types
jthrilly Dec 3, 2025
132fefe
Implement confirm() utility; improve handling of nested dialogs
jthrilly Dec 3, 2025
ccd20b2
fix issues in useDialog.stories.tsx
jthrilly Dec 3, 2025
8cc6c6d
improve documentation for dialog component
jthrilly Dec 3, 2025
b579ba8
implement scrollable dialog body
jthrilly Dec 3, 2025
e5e03df
upgrade storybook
jthrilly Dec 3, 2025
1139fb5
Upgrade storybook and implement scrollable dialog body
jthrilly Dec 3, 2025
3d5cd9c
fix bug with border radious on focus outline
jthrilly Dec 3, 2025
b1e206a
Move default popup animation to ModalPopup and make it optional
jthrilly Dec 3, 2025
b3ed073
merge with v4
jthrilly Dec 4, 2025
974e551
merge with v4
jthrilly Dec 4, 2025
5155abe
improve scroll area; fix item editing
jthrilly Dec 8, 2025
d25010e
massive refactor of ArrayField
jthrilly Dec 8, 2025
0e1e96c
prepare to implement inline editing
jthrilly Dec 8, 2025
9b048ae
working dashboard
jthrilly Dec 9, 2025
f5c4388
dramatically improve styling
jthrilly Dec 9, 2025
8850b24
ready to attempt inline mode for ArrayField
jthrilly Dec 9, 2025
2253fc0
wip field array
jthrilly Dec 12, 2025
c0a5b14
implement useManagedItems; implement combined item and editor compone…
jthrilly Dec 15, 2025
c528dbb
finally working
jthrilly Dec 15, 2025
36660ad
mostly working
jthrilly Dec 15, 2025
bee448c
feat(form): improve form component with new fields and features
jthrilly Dec 18, 2025
b74c553
fix custom validation
jthrilly Dec 18, 2025
ae22121
fix unit tests
jthrilly Dec 18, 2025
c3e4f1b
finalise validation state; implement validation summary via meta regi…
jthrilly Dec 18, 2025
a198581
refactor validation hint generation
jthrilly Dec 18, 2025
32b2f4a
tweak alert colors
jthrilly Dec 18, 2025
f31df29
add link style for button; remove textMuted button variant; clarify m…
jthrilly Dec 19, 2025
316468f
ensure consistent field widths
jthrilly Dec 19, 2025
5b41ea0
finish ArrayField component at last
jthrilly Dec 19, 2025
349af68
complete pass on form fields excluding VAS and other slider
jthrilly Dec 19, 2025
03aee3d
remove incorrect exports
jthrilly Dec 23, 2025
852441b
implement NumberCounterField
jthrilly Dec 25, 2025
8b5c5a7
reorganise component structure
jthrilly Dec 26, 2025
b34616a
begin refactor of change handling
jthrilly Dec 26, 2025
10546d1
Refactor form field system with improved type safety and consistent APIs
jthrilly Dec 27, 2025
8055051
Refactor form system: improve type organization, validation, and fiel…
jthrilly Dec 27, 2025
f400831
Migrate tooltip to base-ui and refactor slider components
jthrilly Dec 27, 2025
752b5f5
rough fix for dialog scroll animation issue
jthrilly Dec 27, 2025
a0505bb
resolve animation issues with nested array fields
jthrilly Dec 27, 2025
b9fd1dc
Add keyboard navigation and focus coordination to DnD system
jthrilly Jan 5, 2026
fbad12c
Fix grid layout virtualization in VirtualizedCollection
jthrilly Jan 8, 2026
317ee19
Fix virtualized list item height measurement and spacing
jthrilly Jan 8, 2026
f327e50
Remove virtualization feature from Collection component
jthrilly Jan 8, 2026
51b852f
Add grid navigation fix, comprehensive test coverage, and ScrollArea …
jthrilly Jan 9, 2026
e850230
WIP Collection
jthrilly Jan 9, 2026
53f32db
Add InlineGridLayout and SpatialKeyboardDelegate for grid-based colle…
jthrilly Jan 10, 2026
83c3711
Redesign Node component with separated visual states and improved ani…
jthrilly Jan 11, 2026
b9e3857
Refactor Collection focus management to use native browser focus
jthrilly Jan 12, 2026
92acc7d
Update Storybook config to use defineMain/definePreview patterns
jthrilly Jan 12, 2026
c5d9bf6
Add Storybook controls for Collection component layout and item options
jthrilly Jan 12, 2026
3e25054
Fix ScrollArea keyboard event handling for Collection navigation
jthrilly Jan 12, 2026
13d1492
Fix container ref not being set for keyboard navigation
jthrilly Jan 12, 2026
49473ef
Add collection-level drop zones for drag and drop between collections
jthrilly Jan 12, 2026
dcbf2b7
Add Motion layout animations to Collection component
jthrilly Jan 12, 2026
26d1536
improve layout animation
jthrilly Jan 12, 2026
28e158f
Improve virtualized Collection scroll performance
jthrilly Jan 13, 2026
1e609f7
Add virtualization support to Collection component
jthrilly Jan 13, 2026
84e172c
Fix animate prop not passed in VirtualizedRendererStory
jthrilly Jan 14, 2026
874f741
Fix virtualized InlineGridLayout measuring items at wrong size
jthrilly Jan 14, 2026
ff1851c
Fix Collection focus ring flash and Tab key cycling bugs
jthrilly Jan 14, 2026
16fce5d
fix collection tests
jthrilly Jan 14, 2026
b818952
create resize observer mock
jthrilly Jan 15, 2026
c4bc217
add patch for temporary workaround for https://github.com/import-js/e…
jthrilly Jan 15, 2026
33b54ce
lint and test
jthrilly Jan 15, 2026
7092dce
should be CI ready again
jthrilly Jan 15, 2026
7a9727c
linting and typechecking
jthrilly Jan 15, 2026
8c41798
fix typescript errors in stories
jthrilly Jan 16, 2026
7aa44aa
Fix Select directory case sensitivity for Linux CI
jthrilly Jan 16, 2026
a21882e
disable env check for tests; run tests in headless mode
jthrilly Jan 16, 2026
f74110b
Run unit tests only in CI, let Chromatic handle interaction tests
jthrilly Jan 16, 2026
01012f4
Enhance Chromatic GitHub integration
jthrilly Jan 16, 2026
7b0f805
Merge pull request #577 from complexdatacollective/grid-list
jthrilly Jan 16, 2026
ca11221
Merge v4 into new-form-system
jthrilly Jan 17, 2026
2901af8
Fix Docker build: copy patches directory for pnpm
jthrilly Jan 17, 2026
e26abdb
Fix Docker build: copy patches to runner stage too
jthrilly Jan 17, 2026
cd77ae0
update knip config; merge with v4;
jthrilly Jan 19, 2026
854d1f8
resolve knip issues
jthrilly Jan 19, 2026
fb53a69
knip and typecheck
jthrilly Jan 19, 2026
756f7c4
lint
jthrilly Jan 19, 2026
d56f369
tests
jthrilly Jan 19, 2026
6be2729
target button correctly in e2e test
jthrilly Jan 19, 2026
51630d0
dont disable submit button based on form validity
jthrilly Jan 19, 2026
fc5cb9c
implement alternative test setup for e2e tests
jthrilly Jan 19, 2026
2e5a3ec
add sorting feature to Collection component
jthrilly Jan 21, 2026
54a47d7
improve alerts; begin redesign of toaasts
jthrilly Jan 21, 2026
3d5f09d
toasts
jthrilly Jan 21, 2026
ae26309
fix resetAppSettings server action
jthrilly Jan 22, 2026
d7883ba
update setup screen; remove context requirement from some validations
jthrilly Jan 22, 2026
9eb0206
fix: add scroll-into-view for keyboard navigation in Combobox
jthrilly Jan 22, 2026
27399ef
fix: resolve lint, typecheck and knip errors
jthrilly Jan 22, 2026
1b15bd8
feat: support both direct values and native events in form onChange h…
jthrilly Jan 22, 2026
6930948
feat: add responsive mobile navigation drawer
jthrilly Jan 22, 2026
30505bb
patch base-ui to bypass strict mode bug; lint etc
jthrilly Jan 22, 2026
7223511
implement multiple delete and username validation
jthrilly Jan 22, 2026
5c964ec
refactor: migrate OrdinalBin interface to TypeScript with new structure
jthrilly Jan 23, 2026
6c97d3f
remove redux form
jthrilly Jan 23, 2026
7fccfae
refactor: migrate NodeList to use Collection component
jthrilly Jan 23, 2026
0bfecac
style: update NavButton active state to use outline instead of underline
jthrilly Jan 23, 2026
44c4f7f
improve responsiveness of navigation bar; remove speach from prompt; …
jthrilly Jan 23, 2026
c1371d8
refactor: remove CSSVariables utilities, use CSS-only color handling
jthrilly Jan 23, 2026
509ebb7
refactor(Toast): use Tailwind theme values and canonical class syntax
jthrilly Jan 23, 2026
d5be286
fix tailwind classes in Toast
jthrilly Jan 23, 2026
f2b8480
feat(Collection): add fuzzy search filtering with Web Worker
jthrilly Jan 23, 2026
610f2a5
knip
jthrilly Jan 23, 2026
8762483
feat(Collection): add Storybook controls and interaction tests for fi…
jthrilly Jan 23, 2026
2dc0152
refactor(NameGenerator): migrate interface to Tailwind CSS
jthrilly Jan 23, 2026
47b7ddd
refactor(Prompts): migrate component to Tailwind CSS
jthrilly Jan 23, 2026
3599ebb
fix(elevation): use --color-* variables for scoped background colors
jthrilly Jan 23, 2026
28df841
feat(QuickAddField): add Storybook stories and improve UX
jthrilly Jan 23, 2026
e4cce56
improve node list and fix bug in slidesform
jthrilly Jan 23, 2026
06361e6
make animate pulse use success color
jthrilly Jan 23, 2026
f4596ca
refactor interfaces to use tailwind classes rather than scss
jthrilly Jan 26, 2026
8d2f4c4
fix bug with network summary dark color calculation
jthrilly Jan 26, 2026
d184268
test(onboard): add integration tests for participant identifier flow
jthrilly Jan 26, 2026
a1e0405
fix imports
jthrilly Jan 26, 2026
59e04d8
fix(e2e): resolve test isolation and data serialization issues
jthrilly Jan 26, 2026
8a84516
fix imports
jthrilly Jan 26, 2026
28a9a5e
test(onboard): add database isolation for tests that modify data
jthrilly Jan 26, 2026
cd00b1c
test(participants): fix sorting and export URL tests to match UI
jthrilly Jan 26, 2026
18a3f02
test(dashboard): add visual snapshot tests for all dashboard routes
jthrilly Jan 26, 2026
a778eaa
add test protocols
jthrilly Jan 26, 2026
bdabd8e
remove TEST_ENVIRONMENT global
jthrilly Jan 26, 2026
0f5fbef
test(e2e): run Playwright tests inside Docker for consistent snapshots
jthrilly Jan 26, 2026
5df39f7
test(e2e): add database isolation fixtures and visual snapshot updates
jthrilly Jan 26, 2026
1e9156b
test(e2e): fix database snapshot race condition and test stability
jthrilly Jan 26, 2026
c9ca88d
adjust for e2e tests
jthrilly Jan 26, 2026
5458b95
partial refactor of e2e tests
jthrilly Jan 27, 2026
805d293
add form helpers
jthrilly Jan 27, 2026
a2c4452
test(e2e): rewrite e2e test infrastructure and specs
jthrilly Jan 27, 2026
b1915b6
only run visual snapshots in docker
jthrilly Jan 28, 2026
60e0ad5
Merge remote-tracking branch 'origin/v4' into new-form-system
jthrilly Jan 28, 2026
66aa16e
fix: resolve knip and typecheck issues after v4 merge
jthrilly Jan 28, 2026
e1215a6
fix(e2e): isolate Docker volumes and always copy standalone assets
jthrilly Jan 28, 2026
4350432
fix: redirect to no-anonymous-recruitment page and add onboard test c…
jthrilly Jan 28, 2026
537989e
single failing test
jthrilly Jan 28, 2026
1ceeac3
fix issues with test timing and isolation
jthrilly Jan 28, 2026
93c791d
Merge branch 'v4' into new-form-system
jthrilly Jan 28, 2026
307c900
Merge latest v4 changes into new-form-system
jthrilly Jan 28, 2026
51c986f
fix issues with animation in CI
jthrilly Jan 28, 2026
e6da54e
update snapshots
jthrilly Jan 28, 2026
4005c91
add responsive visual snapshots, and refactor visual snapshot utilities
jthrilly Jan 29, 2026
c8b87ef
full screen viewport
jthrilly Jan 29, 2026
c07ab85
fix env issues
jthrilly Jan 29, 2026
3556bfd
fix storybook
jthrilly Jan 29, 2026
d1ab941
remove chromatic workflow
jthrilly Jan 29, 2026
5c6a6da
Merge origin/v4 into new-form-system
jthrilly Jan 29, 2026
21645c3
add notes about refactoring
jthrilly Jan 29, 2026
cd0cbf9
Merge origin/v4 into new-form-system
jthrilly Jan 30, 2026
8c8a9a0
fix: resolve e2e test failures and improve test reliability
jthrilly Jan 30, 2026
dfe74e7
fix: resolve test failures and lint errors
jthrilly Jan 30, 2026
a81c212
fix: resolve test failures and lint errors
jthrilly Jan 30, 2026
b9c090b
update baseline snapshots
jthrilly Jan 30, 2026
b5f64ef
fix: save pnpm cache even when e2e tests fail
jthrilly Jan 30, 2026
e72900a
mask time ago
jthrilly Jan 30, 2026
06e3db2
feat: deploy e2e reports to PR-specific subdirectories
jthrilly Jan 30, 2026
b9a871b
fix: resolve activity feed cache invalidation issue
jthrilly Jan 30, 2026
fff8d69
update baseline snapshots and try to fix activity feed cached data
jthrilly Jan 30, 2026
0ec307d
remove netlify storybook deploy and reinstate chromatic deploy
jthrilly Jan 30, 2026
c307674
make health route dynamic; make version section muse mocked api for c…
jthrilly Jan 30, 2026
5dbdaf9
fix: resolve Chromatic interaction test timing issues
jthrilly Jan 30, 2026
c6cca11
fix issue with --radius circular definition
jthrilly Feb 2, 2026
4159626
add scrollbar-gutter to prevent layout shift when scrollbar appears
jthrilly Feb 2, 2026
511057e
fix: resolve cache corruption and incorrect server directive in proto…
jthrilly Feb 2, 2026
6953f80
correct typescript task name in CLAUDE.md
jthrilly Feb 2, 2026
f915946
improve table formatting; implement preview mode settings section
jthrilly Feb 2, 2026
a549cf5
use Dialog for deleting api tokens
jthrilly Feb 2, 2026
e73fffa
improve settings page responsiveness; add e2e coverage of preview mod…
jthrilly Feb 2, 2026
734da4a
fix e2e test for preview mode toggle; add data-testid attributes
jthrilly Feb 2, 2026
8f9737b
format: reorder Tailwind classes in RecruitmentTestSection
jthrilly Feb 2, 2026
70289bf
refactor: replace getByText/locator with data-testid in settings e2e …
jthrilly Feb 2, 2026
c41b652
docs: add e2e test selector best practices to documentation
jthrilly Feb 2, 2026
02ba9d3
refactor: improve e2e test selectors and add component prop spreading
jthrilly Feb 2, 2026
58edb61
add color definitions for new activity table events; fix Heading rend…
jthrilly Feb 2, 2026
bcde04a
refactor: pass data promises as props to dashboard components
jthrilly Feb 2, 2026
f9e4632
refactor: make data table headers and buttons responsive
jthrilly Feb 2, 2026
512a339
improvements to responsiveness of data tables
jthrilly Feb 2, 2026
ea4ea0f
Merge branch 'v4' into new-form-system
jthrilly Feb 2, 2026
2ec76aa
add Storybook story for Skeleton component and improve opacity styling
jthrilly Feb 2, 2026
be8d5bf
address test failures in CI
jthrilly Feb 3, 2026
6c54a2d
fix: resolve e2e test flakiness and visual snapshot issues
jthrilly Feb 3, 2026
01eb395
Merge remote-tracking branch 'origin/v4' into new-form-system
jthrilly Feb 3, 2026
ad1c1e2
correctly transform UPLOADTHING_TOKEN during onboarding
jthrilly Feb 3, 2026
a657099
fix: use deterministic IDs for activity events in e2e seeds
jthrilly Feb 3, 2026
c1ef9b5
fix: update dashboard phone baseline with correct activity ordering
jthrilly Feb 3, 2026
9221ed4
fix: update dashboard tablet baseline with correct activity ordering
jthrilly Feb 3, 2026
0846fac
implement responsiveness for navigation menu; refactor egoform and in…
jthrilly Feb 3, 2026
56967dd
Merge branch 'v4' into new-form-system
jthrilly Feb 5, 2026
c45d770
Merge branch 'v4' into new-form-system
jthrilly Feb 9, 2026
2b72d42
responsive setup
jthrilly Feb 9, 2026
7b39042
update visual snapshots
jthrilly Feb 9, 2026
92383cf
Merge remote-tracking branch 'origin/next' into new-form-system
jthrilly Feb 9, 2026
5130456
Merge remote-tracking branch 'origin/next' into new-form-system
jthrilly Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .github/workflows/cleanup-e2e-reports.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ jobs:
</style>
</head>
<body>
<h1>Fresco E2E Test Reports</h1>
<h1>🎭 Fresco E2E Test Reports</h1>
<p>No failed test reports available.</p>
</body>
</html>
Expand Down Expand Up @@ -163,7 +163,7 @@ jobs:
</style>
</head>
<body>
<h1>Fresco E2E Test Reports</h1>
<h1>🎭 Fresco E2E Test Reports</h1>
<p>Failed test reports by PR:</p>
$(cat index.html.tmp)
</body>
Expand Down
39 changes: 35 additions & 4 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,37 @@ jobs:
cp -r new-report/playwright-report/* merged/pr-${{ github.event.pull_request.number }}/

# Generate index page listing all reports
cat > merged/index.html << 'EOF'
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fresco E2E Test Reports</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; }
h1 { color: #333; }
ul { list-style: none; padding: 0; }
li { padding: 10px 0; border-bottom: 1px solid #eee; }
a { color: #0066cc; text-decoration: none; }
a:hover { text-decoration: underline; }
.timestamp { color: #666; font-size: 0.9em; }
</style>
</head>
<body>
<h1>🎭 Fresco E2E Test Reports</h1>
<p>Failed test reports by PR:</p>
<ul id="reports"></ul>
<script>
const reportsEl = document.getElementById('reports');
const prDirs = Array.from(document.querySelectorAll('a[href^="pr-"]')).map(a => a.getAttribute('href'));
// This will be populated by the directory listing
</script>
</body>
</html>
EOF

# Create a simple directory listing
echo "<ul>" > merged/index.html.tmp
for dir in merged/pr-*/; do
if [ -d "$dir" ]; then
Expand Down Expand Up @@ -141,7 +172,7 @@ jobs:
</style>
</head>
<body>
<h1>Fresco E2E Test Reports</h1>
<h1>🎭 Fresco E2E Test Reports</h1>
<p>Failed test reports by PR:</p>
$(cat merged/index.html.tmp)
</body>
Expand All @@ -163,11 +194,11 @@ jobs:
with:
issue-number: ${{ github.event.pull_request.number }}
body: |
## Playwright E2E Test Report
## 🎭 Playwright E2E Test Report

Tests failed. View the full report here:
❌ **Tests failed.** View the full report here:

**[https://complexdatacollective.github.io/Fresco/pr-${{ github.event.pull_request.number }}/](https://complexdatacollective.github.io/Fresco/pr-${{ github.event.pull_request.number }}/)**
👉 **[https://complexdatacollective.github.io/Fresco/pr-${{ github.event.pull_request.number }}/](https://complexdatacollective.github.io/Fresco/pr-${{ github.event.pull_request.number }}/)**

<details>
<summary>Report details</summary>
Expand Down
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,21 @@ yarn-error.log*
storybook-static

# e2e testing
/tests/e2e/playwright-report/
/tests/e2e/test-results/
/tests/e2e/screenshots/
/tests/e2e/.auth/
/tests/e2e/.context-data.json
/tests/e2e/.db-snapshots/
/playwright-report/
/test-results/
/playwright/.cache/

# Serena
.serena

# playwright MCP
./playwright-mcp

.pnpm-store
.pnpm-docker-store
Binary file removed .playwright-mcp/page-2025-12-04T13-07-07-849Z.png
Binary file not shown.
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
"quoteProps": "consistent",
"singleQuote": true,
"tabWidth": 2,
"useTabs": false
"useTabs": false,
"tailwindFunctions": ["cva", "cx"]
}
40 changes: 18 additions & 22 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
import type { StorybookConfig } from '@storybook/nextjs-vite';
import { defineMain } from '@storybook/nextjs-vite/node';

const config: StorybookConfig = {
stories: [
'../{app,components,lib}/**/*.mdx',
'../{app,components,lib}/**/*.stories.@(js|jsx|mjs|ts|tsx)',
export default defineMain({
addons: [
'@storybook/addon-docs',
'@storybook/addon-a11y',
'@storybook/addon-vitest',
'@chromatic-com/storybook',
],
addons: [],
framework: {
name: '@storybook/nextjs-vite',
options: {},
options: {
builder: {
// Customize the Vite builder options here
viteConfigPath: './vitest.config.ts',
},
},
},
staticDirs: ['../public'],
viteFinal(config) {
if (config.optimizeDeps) {
config.optimizeDeps.esbuildOptions = {
...config.optimizeDeps.esbuildOptions,
loader: {
...config.optimizeDeps.esbuildOptions?.loader,
'.js': 'jsx',
},
};
}

return config;
staticDirs: ['../public', { from: '../styles/themes', to: '/styles/themes' }],
typescript: {
check: false,
},
};
export default config;
stories: ['../**/*.stories.@(js|jsx|mjs|ts|tsx|mdx)'],
});
86 changes: 62 additions & 24 deletions .storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,43 +1,81 @@
import type { Preview } from '@storybook/nextjs-vite';
import addonA11y from '@storybook/addon-a11y';
import addonDocs from '@storybook/addon-docs';
import addonVitest from '@storybook/addon-vitest';
import { definePreview } from '@storybook/nextjs-vite';
import { StrictMode } from 'react';
import Providers from '../components/Providers';
import '../styles/globals.css';
import { getInitialTheme, globalTypes, withTheme } from './theme-switcher';

const preview: Preview = {
// @chromatic-com/storybook is not included here because it doesn't export a
// CSF Next compatible preview addon. It only provides server-side preset
// functionality and manager UI, so it's configured in main.ts only.
// See: https://github.com/chromaui/addon-visual-tests/pull/404

export default definePreview({
addons: [addonDocs(), addonA11y(), addonVitest()],
parameters: {
options: {
storySort: {
order: [
'Design System',
['Colors', 'Elevation', 'Type Scale', 'Typography'],
'UI',
'Systems',
['Form', 'Dialogs', 'DragAndDrop'],
'Interview',
'*',
],
},
},
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
backgrounds: {
options: {
light: {
name: 'light',
value: '#ffffff',
},

dark: {
name: 'dark',
value: '#1f1f1f',
}
}
a11y: {
// 'todo' - show a11y violations in the test UI only
// 'error' - fail CI on a11y violations
// 'off' - skip a11y checks entirely
test: 'todo',
/**
* base-ui dialog adds focus guards which are picked up by a11y tests
* but are necessary for proper focus management within the dialog,
* and compatible with WCAG guidelines, so we disable this rule here.
*/
config: {
rules: [
{
id: 'aria-hidden-focus',
selector: '[data-base-ui-focus-guard]',
enabled: false,
},
],
},
},
},

decorators: [
(Story) => (
<Providers>
<Story />
</Providers>
// nextjs-vite doesn't seem to pick up the strict mode setting from next config
<StrictMode>
{/**
* required by base-ui: https://base-ui.com/react/overview/quick-start#portals
*/}
<div className="root h-screen">
<Providers>
<Story />
</Providers>
</div>
</StrictMode>
),
withTheme,
],

initialGlobals: {
backgrounds: {
value: 'light'
}
}
};
globalTypes,

export default preview;
initialGlobals: {
theme: getInitialTheme(),
},
});
135 changes: 135 additions & 0 deletions .storybook/theme-switcher.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
import type { Decorator } from '@storybook/nextjs-vite';
import { useLayoutEffect, useState } from 'react';

const THEME_KEY = 'theme';
const STORAGE_KEY = 'storybook-theme-preference';

const themes = {
dashboard: {
name: 'Dashboard',
path: '/styles/themes/default.css',
},
interview: {
name: 'Interview',
path: '/styles/themes/interview.css',
},
} as const;

type ThemeKey = keyof typeof themes;

const THEME_LINK_ID = 'storybook-theme-stylesheet';

function getStoredTheme(): ThemeKey | null {
try {
const stored = localStorage.getItem(STORAGE_KEY);
if (stored && stored in themes) {
return stored as ThemeKey;
}
} catch (error) {
// eslint-disable-next-line no-console
console.warn('Failed to read theme from localStorage:', error);
}
return null;
}

function setStoredTheme(theme: ThemeKey) {
try {
localStorage.setItem(STORAGE_KEY, theme);
} catch (error) {
// eslint-disable-next-line no-console
console.warn('Failed to save theme to localStorage:', error);
}
}

function loadTheme(themeKey: ThemeKey): Promise<void> {
return new Promise((resolve) => {
const existingLink = document.getElementById(
THEME_LINK_ID,
) as HTMLLinkElement | null;

if (existingLink?.href.endsWith(themes[themeKey].path)) {
resolve();
return;
}

if (existingLink) {
existingLink.remove();
}

const link = document.createElement('link');
link.id = THEME_LINK_ID;
link.rel = 'stylesheet';
link.href = themes[themeKey].path;

link.onload = () => resolve();
link.onerror = () => resolve();

document.head.appendChild(link);

setTimeout(resolve, 1000);
});
}

function ThemeWrapper({
selectedTheme,
children,
}: {
selectedTheme: ThemeKey;
children: React.ReactNode;
}) {
const [isLoading, setIsLoading] = useState(true);

useLayoutEffect(() => {
setIsLoading(true);
void loadTheme(selectedTheme).then(() => {
setStoredTheme(selectedTheme);
setIsLoading(false);
});
}, [selectedTheme]);

// Apply data-theme to the HTML element for dark mode
useLayoutEffect(() => {
document.documentElement.setAttribute('data-theme', selectedTheme);
}, [selectedTheme]);

return (
<div
data-theme={selectedTheme}
className="bg-background text-text"
style={{ opacity: isLoading ? 0 : 1, transition: 'opacity 150ms' }}
>
{children}
</div>
);
}

export const withTheme: Decorator = (Story, context) => {
const selectedTheme = (context.globals[THEME_KEY] as ThemeKey) ?? 'default';

return (
<ThemeWrapper selectedTheme={selectedTheme}>
<Story />
</ThemeWrapper>
);
};

export const globalTypes = {
[THEME_KEY]: {
name: 'Theme',
description: 'Global theme for components',
defaultValue: getStoredTheme() ?? 'default',
toolbar: {
icon: 'paintbrush' as const,
items: Object.entries(themes).map(([key, { name }]) => ({
value: key,
title: name,
})),
showName: true,
dynamicTitle: true,
},
},
};

export function getInitialTheme(): ThemeKey {
return getStoredTheme() ?? 'dashboard';
}
Loading
Loading