Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
bbd2396
Add Tailwind CSS v4 + redesign sign-in page (casadesign)
Jul 9, 2026
51b21e4
Use Figtree instead of Inter across the design system
Jul 9, 2026
d48c24a
Add design.md design system + record casadesign workflow
Jul 9, 2026
4edf54b
Add Tailwind app-shell layout (casa_app)
Jul 9, 2026
898942d
Redesign supervisor landing as a triage dashboard
Jul 9, 2026
15e4cac
Refine supervisor dashboard: initials, page title, WCAG + responsive
Jul 9, 2026
3409005
Show user names without honorific prefixes (display_person helper)
Jul 9, 2026
5d22005
Remove redundant sidebar identity block
Jul 9, 2026
a238ced
Drop the sidebar logo mark — org name only
Jul 9, 2026
b3cc06e
Redesign remaining auth pages onto the Tailwind casa_auth layout
Jul 9, 2026
82e1eb1
Strip honorifics from names across legacy pages + datatables
Jul 9, 2026
2ade255
Shorten dashboard subtitle (drop em-dash and redundant org name)
Jul 9, 2026
8cb66a6
test(dashboard): expect supervisor dashboard to render, not redirect
Jul 10, 2026
51024ba
feat(notifications): migrate notifications page to the Tailwind casa_…
Jul 10, 2026
c9e0091
docs(design): make design.md the permanent design-system record + add…
Jul 10, 2026
1c0e204
feat(profile): migrate edit-profile page to the Tailwind casa_app shell
Jul 10, 2026
943b0d9
docs(design): record Form errors + Disclosure components; mark edit p…
Jul 10, 2026
2111aef
feat(shell): show the user's role in the account menu; refine dashboa…
Jul 10, 2026
867d38f
feat(shell): drop icon from role badge and colour-code it by role
Jul 10, 2026
2d9d4c6
refactor(design): sentence-case labels, streamline error summary, ado…
Jul 10, 2026
1235e35
refactor(profile): collapse form-error summary to one streamlined line
Jul 10, 2026
8ec4fa1
feat(dashboard): add the volunteer landing dashboard
Jul 10, 2026
28c2226
feat(dashboard): add the admin org-wide dashboard
Jul 10, 2026
e5e74dd
style(dashboard): give the roster/cases table cards a bottom inset
Jul 10, 2026
88a2759
style(notifications): inset the list card so rows clear the rounded c…
Jul 10, 2026
05dfa2c
feat(design): datatable strategy — theme jQuery DataTables via a Tail…
Jul 10, 2026
20d29ed
feat(cases): migrate the cases index onto the shell + DataTables skin
Jul 10, 2026
94f7dfb
refactor(cases): rebuild the cases index as a bespoke table (retire D…
Jul 10, 2026
cb7a76c
fix(cases): refine the bespoke table — filter chevrons, row action, t…
Jul 10, 2026
6152877
fix(cases): label the row Edit action (icon + text)
Jul 10, 2026
0968d76
feat(cases): replace dead hearing/judge columns with "Next court date"
Jul 10, 2026
1f65a73
fix(cases): make the row Edit action a tertiary (ghost) button
Jul 10, 2026
3eec6bd
feat(cases): collapse secondary header actions into a "More" menu
Jul 13, 2026
52ca1c1
feat(health): rebuild the metrics page as accessible server-rendered …
Jul 13, 2026
2f66b3a
feat(health): add a date-range filter and a Stimulus hover layer
Jul 13, 2026
660473f
chore(deps): drop unused chart.js, chartjs-adapter-luxon, and luxon
Jul 13, 2026
ddca724
fix(shell): open only one header dropdown at a time
Jul 13, 2026
8fca6d3
feat(cases): sortable column headers
Jul 13, 2026
f87fc55
feat(cases): free-text search on the cases index
Jul 13, 2026
24e19c9
feat(cases): responsive cases index (mobile cards + 2-up filters)
Jul 13, 2026
fad6e19
feat(health): responsive metrics page
Jul 13, 2026
05ed2cf
feat(dashboards): responsive supervisor + volunteer tables
Jul 14, 2026
e53aded
Fix WCAG AA contrast on the swept pages (notifications, edit profile,…
Jul 14, 2026
55396c8
Record the responsive sweep and true-width verification in the design…
Jul 14, 2026
c952c86
Add bin/measure-responsive.mjs, the true-width overflow checker
Jul 14, 2026
f7175b2
Harden shipped work: fix occurred_at flake, cover SupervisorDashboard
Jul 14, 2026
0d3087c
Case show infra: add-to-calendar and modal Stimulus controllers
Jul 14, 2026
a5642e1
Case show infra: Tailwind case-contact card + medium_icon decorator
Jul 14, 2026
bc8db2a
Case show infra: court-report and local-storage-reset controllers
Jul 14, 2026
7cea364
Migrate Case show to the Tailwind casa_app layout (Phase B)
Jul 14, 2026
21aeade
Fix WCAG AA contrast on the Resolve Reminder button
Jul 14, 2026
a6a61e6
Docs: record the Case show migration + native-dialog modal pattern
Jul 14, 2026
3b4c18d
Migrate case groups to Tailwind and add button + modal design tokens
Jul 14, 2026
fba5d3f
Extract the native-dialog modal into a Dialog:: component suite
Jul 14, 2026
dde15a9
Collapse occasional case actions into a More menu
Jul 14, 2026
3be2a11
Move Emancipation into the case-show More menu
Jul 14, 2026
900219e
Collapse case-show secondary actions into More on mobile
Jul 14, 2026
aca3146
Migrate the new case form to Tailwind (Stage 1)
Jul 15, 2026
2169ab7
Migrate CASA case edit page to the Tailwind design system
Jul 15, 2026
1b1d65a
Replace court-order remove SweetAlert with the Dialog confirm
Jul 15, 2026
c7b21e1
Replace court-order copy-from-sibling SweetAlert with the Dialog confirm
Jul 15, 2026
f05c6cc
Polish the case details page: consistent buttons, clearer date-in-care
Jul 15, 2026
30af987
Sweep hand-written buttons to button_classes; reminder confirm dialog
Jul 15, 2026
9502a90
Case details: sentence-case headings (no colons), name + placement ty…
Jul 15, 2026
e640343
Close the volunteer-name flow loop with a back-to-case return path
Jul 15, 2026
836ff04
New case contact types: blank by default with a visible chevron
Jul 15, 2026
30cf34b
Fix the contact-types chevron: it was hidden behind TomSelect's control
Jul 15, 2026
a6f6bf4
Match the multiselect chevron to the single-select chevrons
Jul 15, 2026
43fc8da
Sentence-case the default contact types; scan app-shipped content for…
Jul 15, 2026
733cddb
Backlog: add the post-migration sentence-case sweep item
Jul 15, 2026
edea305
Backlog + cleanup: save volunteer-page plan, drop dead report modal
Jul 15, 2026
5e2f806
Contrast: filter + menu icon ink slate-400 -> slate-500 (AA)
Jul 15, 2026
1b1c960
Migrate volunteers#edit to the casa_app design system
Jul 18, 2026
7d30989
Migrate volunteers#index to a bespoke casa_app table
Jul 18, 2026
8621ac6
Migrate supervisors#index + #edit to the casa_app design system
Jul 18, 2026
be48204
Fix account dropdown rendering behind page buttons (z-index)
Jul 18, 2026
0895d28
Migrate learning hours to the casa_app design system
Jul 19, 2026
d7e6010
Migrate new volunteer + new supervisor pages to casa_app
Jul 19, 2026
26b9dec
Fix stale invite-acceptance specs to match the migrated casa_auth page
Jul 19, 2026
12156be
Migrate case contacts index + drafts to casa_app
Jul 19, 2026
1f1264e
Migrate case-contact multi-step form to casa_app
Jul 19, 2026
0e35bc2
Migrate reimbursements queue to casa_app (bespoke table)
Jul 19, 2026
116d303
Migrate reports hub to casa_app
Jul 19, 2026
5c4a6c9
Migrate organization settings (casa_org#edit) to casa_app
Jul 19, 2026
bf6d99c
Migrate court report generator (case_court_reports#index) to casa_app
Jul 19, 2026
4f519f8
Migrate simple settings CRUD forms to casa_app (Phase 5 batch 1)
Jul 19, 2026
87e59ce
Migrate contact type/group/topic forms to casa_app (Phase 5 batch 2)
Jul 19, 2026
c33cdda
Migrate hearing types + checklist items + custom org links to casa_ap…
Jul 19, 2026
c08bc98
Migrate mileage rates + placements + banners to casa_app (Phase 5 bat…
Jul 19, 2026
fbaeea5
Migrate court dates + bulk court dates to casa_app (Phase 5 batch 5)
Jul 19, 2026
3993b4d
Migrate imports (CSV) to casa_app (Phase 5 batch 5b)
Jul 19, 2026
421bee2
Migrate emancipation checklist + index to casa_app (Phase 5 batch 5c)
Jul 19, 2026
1856145
Migrate all-CASA-admin shell + org management to casa_app design (Pha…
Jul 19, 2026
829d226
Migrate all-CASA-admin auth pages to the casa_auth shell (Phase 6c)
Jul 19, 2026
a1e7134
Migrate all-CASA-admin patch notes to the shell (Phase 6b)
Jul 19, 2026
93743a9
Rebuild the public landing page on the design system (close out Phase 6)
Jul 19, 2026
514de4c
Card-stack the org-settings + checklist admin tables on mobile
Jul 19, 2026
59c46b2
Drop stale "Phase 6 — Edges" stub from the backlog
Jul 20, 2026
09efe57
Migrate case_contacts_new_design to a bespoke casa_app table
Jul 20, 2026
3f425c3
Remove the dead case_contacts_new_design DataTable stack
Jul 20, 2026
9c9f671
Backlog: track Bootstrap-layout straggler pages; close stale items
Jul 20, 2026
a358856
Migrate fund_requests#new to the casa_app design system
Jul 20, 2026
377c9e2
Migrate casa_admins index/new/edit to the casa_app design system
Jul 20, 2026
cca23dc
Migrate other_duties index/new/edit to the casa_app design system
Jul 20, 2026
6b25d46
Migrate notes#edit to the casa_app design system
Jul 20, 2026
543797d
Delete orphaned case_assignments/index dead view
Jul 20, 2026
a7e27cb
Migrate the error test page off the Bootstrap layout
Jul 20, 2026
3011da8
Backlog: finish-line audit — no web page uses the Bootstrap layout
Jul 20, 2026
19ed3aa
Fix casa_admins/edit view spec missed in the casa_admins migration
Jul 20, 2026
bdc1325
Delete the Bootstrap application layout
Jul 20, 2026
e76c54c
Finish Bootstrap decommission: retire layouts/devise + application.scss
Jul 20, 2026
7080e0b
Sentence-case sweep (1/4): case-detail fact labels
Jul 20, 2026
3328e4c
Sentence-case sweep (2/4): court dates pages
Jul 20, 2026
9bdef0b
Sentence-case sweep (3/4): edit-profile labels
Jul 20, 2026
d9ca35d
Sentence-case sweep (4a): casa_admins, other_duties, notes
Jul 20, 2026
2625fd7
Backlog: track sentence-case sweep batch progress
Jul 20, 2026
75b093f
Sentence-case sweep (4b): volunteer + supervisor edit pages
Jul 20, 2026
b8698bf
Sentence-case sweep (4c): learning hours + settings CRUD forms
Jul 20, 2026
3b7a8a7
Sentence-case sweep (4d): case-contact form + CTAs + dialog titles
Jul 20, 2026
28ff436
Sentence-case sweep (4e/4f): remaining headings, CTAs, form labels
Jul 20, 2026
90dcb5c
Backlog: mark sentence-case sweep DONE
Jul 20, 2026
fd8dc8b
Dead code removal (1/N): orphaned partials, component, decorator method
Jul 20, 2026
784a163
Dead code removal (2/N): Bootstrap sidebar/header layout partials
Jul 20, 2026
444c3c9
Dead code removal (3/N): reimbursements serverSide DataTable stack
Jul 20, 2026
9e30b96
Dead code removal (4/N): dashboard.js + volunteers/supervisors DataTa…
Jul 20, 2026
5bf9143
Dead code removal (5/N): dead datatable? authorization predicates
Jul 20, 2026
c1eb52c
Dead code removal (6/N): learning_hours.js DataTable init
Jul 20, 2026
c75a483
Dead code removal (7/N): orphaned Bootstrap-era SCSS partials
Jul 20, 2026
e2787b9
Backlog: mark dead-code removal DONE (7 batches) + record carve-outs
Jul 20, 2026
a6d24fe
Self-host Figtree + Bootstrap Icons; drop the CDN links
Jul 20, 2026
09fbe20
Refresh stale view/request specs left by the design migration
Jul 20, 2026
f325626
Drop the now-unused sass + bootstrap-scss deps
Jul 20, 2026
eddc703
Move the mobile nav toggle to a Stimulus controller
Jul 20, 2026
eddd093
Contrast audit: bump readable text-slate-400 to slate-500 (WCAG AA)
Jul 20, 2026
930d4f8
Add an axe accessibility pass; fix the select-name violations found
Jul 20, 2026
b79042d
Sentence-case sweep (round 2, settings): org-settings headings + labels
Jul 20, 2026
3920fae
Sentence-case sweep (round 2, reports + court reports)
Jul 20, 2026
f1b5f6c
Sentence-case sweep (round 2, casa_cases)
Jul 20, 2026
0af6a3f
Sentence-case sweep (round 2, everything else)
Jul 20, 2026
1681d29
Backlog: record the round-2 sentence-case re-sweep + the scan-pattern…
Jul 20, 2026
253c5c7
Converge all table column headers on the design-system token (drop up…
Jul 20, 2026
da6e781
Unify table cell padding (px-4 py-3) + top-align column headers
Jul 20, 2026
9b327ec
Top-align table body cells to match the headers
Jul 20, 2026
a3308c2
Fix the sign-in flow (real bugs) + refresh stale auth specs
Jul 20, 2026
63d1a5e
Align stale "unauthorized redirect" specs with the app's actual behavior
Jul 20, 2026
83566de
Fix full-suite reds: stale auth/migration specs + one sentence-case miss
Jul 20, 2026
72e8315
Wire the session-timeout value into casa_app (was always defaulting t…
Jul 20, 2026
1324588
Make ViewComponent previews interactive + fix truncated-text on Tailwind
Jul 20, 2026
9e499f2
Backlog: track a full-suite green-confirmation run
Jul 20, 2026
481520f
Add all-CASA "Metrics" console; extract MetricsReport; slim /health t…
Jul 20, 2026
7cb81f2
Add per-chapter "Analytics" page (admin + supervisor)
Jul 20, 2026
0431868
Add chapter KPI cards to the Analytics page
Jul 20, 2026
01e72e3
Match Analytics KPI cards to the design-system stat card + document
Jul 20, 2026
5bc6bb7
Add system specs for the Metrics + Analytics pages
Jul 20, 2026
66c7247
Fix stale truncated-text component spec (text-bold -> font-bold)
Jul 20, 2026
a526c16
Backlog: record the full-suite result after Metrics/Analytics
Jul 20, 2026
f7f61d5
fix(casadesign): consistent filter/section padding across roster + an…
Jul 21, 2026
1bb75e8
fix(casadesign): left-align case-contact card body; drop transition-a…
Jul 21, 2026
c488a64
fix(casadesign): fix case-contact card type hierarchy (body out-weigh…
Jul 21, 2026
83e0c55
fix(casadesign): one "Show details" disclosure per case-contact card …
Jul 21, 2026
064365e
fix(casadesign): un-nest case-contact detail (divider, not a card-in-…
Jul 21, 2026
391f088
Merge origin/main into casadesign
Jul 21, 2026
c874c09
fix(casadesign): case-contact edit form — lock the required case, res…
Jul 21, 2026
8b10870
fix(casadesign): notes topics — dividers not nested cards; clearer "R…
Jul 21, 2026
ecfb157
feat(casadesign): case-contact Notes as a fixed-topic checklist (reti…
Jul 21, 2026
5604e71
fix(casadesign): tighten empty reimbursement card (autosave line insi…
Jul 21, 2026
65c3694
feat(casadesign): structured mailing address (line 1 / line 2 / city …
Jul 21, 2026
e4f8ca2
feat(casadesign): structured reimbursement-check address (line 1 / li…
Jul 21, 2026
c5ce975
fix(casadesign): case-contact edit — case badge in the Details header…
Jul 21, 2026
2b4c92c
fix(casadesign): topic-removal confirm uses the design-system dialog,…
Jul 21, 2026
6c5694e
fix(casadesign): expense Delete confirm dialog; divider rows; autosav…
Jul 21, 2026
34ad0ad
fix(casadesign): expense rows use the court-order card pattern (inlin…
Jul 21, 2026
8c59069
fix(casadesign): expense rows — dividers + visible labels, stacked am…
Jul 21, 2026
691a6f6
fix(casadesign): expense Delete is a compact top-right trash icon, no…
Jul 21, 2026
78c8b40
feat(casadesign): case-contact "Submit & add another" button + "view …
Jul 22, 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: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ Hotwire-first: Turbo for navigation/forms, Stimulus controllers in `app/javascri
## Style
This project uses **Standard.rb** (not vanilla RuboCop). Don't fight it on spacing/quotes/trailing commas. There is also a `.standard_todo.yml` of grandfathered violations — leave older files alone unless touching them substantively. Older migration files (2020–2024) are intentionally excluded from linting.

## Design system (casadesign branch)

This branch introduces a Tailwind CSS v4 design system, documented in **`design.md`** (repo root) — the source of truth for the new aesthetic. Read it before UI work and keep it updated. New pages use Tailwind-only layouts and coexist with the legacy Bootstrap UI (migrate page-by-page). **On every page, show user names without honorific prefixes (first + last only) — `display_person` for new UI, `formatted_name` at existing `.display_name` sites — never mutate the stored `display_name`.** **Workflow: on `casadesign`, commit and push to the `casadesign` branch at every checkpoint (do not wait for approval).** **Buttons come from the `button_classes(:primary|:secondary|:danger|:danger_outline|:success)` helper (one shared 40px height token, never hand-written class strings; before finishing UI work, grep the touched views for clickable elements with a hand-rolled button shape (`inline-flex` + `rounded-lg` + `px-`/`py-` + `bg-`/`border-`) and convert them to `button_classes` (the tertiary ghost is the only documented exception): this drift, a bespoke string at a different height next to the 40px token, is a recurring bug). Section headings and subtitles are sentence case with **no trailing colon** (colons only on inline key:value fact labels; audit `grep '<h[123][^>]*>[^<]*:</h'`); sentence case also covers app-shipped content (seed defaults and constants like `ContactTypeGroup::DEFAULT_CONTACT_TYPE_GROUPS`, shown as the multiselect chips), not just view copy, so before finishing scan the touched views AND app-shipped names/defaults for Title Case or ALL-CAPS and fix them (proper nouns/acronyms CASA, IEP excepted; never force-case free-form org data); person names are dark identifying text (`font-medium text-slate-800`), not brand nav links, and avoid sending the user out of the current flow via a name without a clear path back. Multiselects (TomSelect) load blank with a placeholder, never pre-selected with every option (the dropdown's Select/Unselect all covers that), and their chevron is a `.ts-wrapper::after` base64-SVG caret with **`z-index: 2`** (TomSelect's opaque `.ts-control` paints over a plain `::after`, so without the z-index the caret is hidden behind it; a `content` glyph escape and a raw data URI both broke in the build). Verify chevrons at the pixel level (screenshot + darkest-pixel), not by computed style. Native-dialog modals use the `Dialog::` ViewComponent suite (`Dialog::GroupComponent` + `Dialog::HeaderComponent`/`BodyComponent`/`FooterComponent`), not the legacy Bootstrap `Modal::*`. Page headers use one primary CTA plus a `More` overflow menu (native `<details>` + the `dropdown` controller): keep core actions visible and overflow only occasional ones, never bury a core action (also breaks non-JS specs, which can't open `<details>`). On mobile, collapse the remaining visible secondaries into `More` too (render twice with `hidden sm:contents` / `sm:hidden`) so only the primary CTA and `More` share the top line. Leading icons on menu/list items top-align to the first line (`items-start`), never centered against wrapped text. When you build and verify a component or pattern, document it in `design.md` immediately (do not wait for approval) and reuse it from there: `design.md` is the source of truth, so match it and never re-derive or let it drift. Before finishing a new or changed component, **check it against `design.md` and its sibling components and pixel-verify the match** (e.g. the multiselect chevron must match the single-select chevron, measured via screenshot + darkest-pixel, never eyeballed or trusted from computed style): rendering is not the same as matching. When a partial is still rendered by legacy Bootstrap pages (e.g. `shared/_manage_volunteers`, `shared/_court_order_list`), never restyle it in place: add a casa_app-specific Tailwind twin (`casa_cases/_volunteer_assignment`, `casa_cases/_court_orders`) that preserves every JS hook (ids, classes, data-actions, field names, DOM adjacencies) and leave the shared partial for the Bootstrap pages.**

## Where to look for more
- `.github/instructions/ruby.instructions.md` and `.github/instructions/copilot-review.instructions.md` — the project's own review checklist; the source of truth for "what is a bug-shaped change here."
- `doc/architecture-decisions/` — ADRs (especially 0002 no-UI-signup, 0003 two-user-tables, 0006 few-controller-tests, 0007 inline-email-CSS).
Expand Down
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ group :development do
end

group :test do
gem "axe-core-rspec" # Accessibility (axe-core) assertions for system specs
gem "capybara" # Integration testing framework
gem "capybara-screenshot" # Automatic screenshot on test failure
gem "database_cleaner-active_record" # Database cleaning strategies for tests
Expand Down
6 changes: 6 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ GEM
railties (>= 7.2)
warden
awesome_print (1.9.2)
axe-core-api (4.12.0)
dumb_delegator
axe-core-rspec (4.12.0)
axe-core-api (= 4.12.0)
azure-storage-blob (2.0.3)
azure-storage-common (~> 2.0)
nokogiri (~> 1, >= 1.10.8)
Expand Down Expand Up @@ -188,6 +192,7 @@ GEM
request_store (>= 1.0)
ruby2_keywords
drb (2.2.3)
dumb_delegator (1.1.0)
email_spec (2.3.1)
htmlentities (~> 4.3)
launchy (>= 2.1, < 4.0)
Expand Down Expand Up @@ -705,6 +710,7 @@ DEPENDENCIES
amazing_print
annotaterb
authtrail
axe-core-rspec
azure-storage-blob
blueprinter
brakeman
Expand Down
2 changes: 1 addition & 1 deletion Procfile.dev
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
web: bin/rails server -p 3000 -b 0.0.0.0
js: npm run build:dev --watch
css: npm run build:css:dev --watch
tw: npm run build:tailwind:dev
47 changes: 0 additions & 47 deletions app/assets/stylesheets/application.scss

This file was deleted.

6 changes: 0 additions & 6 deletions app/assets/stylesheets/base/breakpoints.scss

This file was deleted.

26 changes: 0 additions & 26 deletions app/assets/stylesheets/base/variables.scss

This file was deleted.

41 changes: 0 additions & 41 deletions app/assets/stylesheets/pages/all_casa_admin_dashboard.scss

This file was deleted.

Loading
Loading