Skip to content

Migrate frontend#250

Open
deemp wants to merge 114 commits intoschej-it:mainfrom
deemp:migrate/vue3-vite-ts
Open

Migrate frontend#250
deemp wants to merge 114 commits intoschej-it:mainfrom
deemp:migrate/vue3-vite-ts

Conversation

@deemp
Copy link
Copy Markdown

@deemp deemp commented May 2, 2026

Changes

Migrated frontend to:

  • TypeScript (type safety plays nicely with LLMs)
  • Vue3 (Vue 2 has reached End of Life on December 31st, 2023)
  • Temporal (the standard approach to working with dates; seems ideal for this app because it manipulates dates and times a lot)

AI usage

Almost all of the work was done by Claude, Lingma, and Codex.

I asked Codex to write down initial findings and then add new findings when it worked on previous findings.

Current state

What works:

  • npm run lint
  • npm run build
  • npm run typecheck
  • npm run test:unit (need more tests!)

TODO

deemp and others added 10 commits April 28, 2026 21:20
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
@deemp deemp force-pushed the migrate/vue3-vite-ts branch from 4c27e2b to 90835a3 Compare May 3, 2026 21:00
deemp and others added 3 commits May 4, 2026 00:43
Co-authored-by: Codex <codex@openai.com>
@deemp deemp force-pushed the migrate/vue3-vite-ts branch from 90835a3 to 62a3da0 Compare May 4, 2026 11:30
deemp and others added 15 commits May 4, 2026 14:39
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Co-authored-by: OpenAI Codex <codex@openai.com>
Move the value-keyed Temporal helpers into a dedicated module and keep date_utils.ts as a compatibility barrel.

Add focused regression coverage for the extracted module so future refactors can verify the Temporal boundary directly without relying only on the mixed utility file.

Co-authored-by: OpenAI Codex <codex@openai.com>
Move the remaining pure range and time conversion helpers out of date_utils into focused Temporal-first modules.

Keep date_utils as a compatibility barrel so existing imports continue to work while the refactor proceeds, and split the regression coverage into dedicated test files for the extracted slices.

Co-authored-by: OpenAI Codex <codex@openai.com>
Move event membership, time-seed, and viewed-week helpers into a dedicated event-domain utility module while keeping date_utils.ts as a compatibility barrel. This keeps timezone rules focused on timezone behavior and adds direct regression coverage for the extracted event helpers.

Co-authored-by: OpenAI Codex <codex@openai.com>
Move the schedule-overlap and weekly rendering helpers out of date_utils into a dedicated scheduleDateRules module.

Keep date_utils as a compatibility barrel so existing imports stay stable while the refactor plan progresses.

Split the focused Temporal regression coverage into scheduleDateRules.test.ts so DST projection, overnight splitting, and offset-only rendering stay covered at the new boundary.

Co-authored-by: OpenAI Codex <codex@openai.com>
deemp and others added 2 commits May 8, 2026 11:42
Use the ADR-001 hyphenated format consistently across frontend ADR titles and internal cross-references.
This keeps the documentation naming style aligned and avoids mixed ADR reference formats in the migrated frontend docs.

Co-authored-by: OpenAI Codex <codex@openai.com>
Restore the landing legacy-note row to a direct top offset while preserving the header block height so the hero stack stays on the measured legacy baseline.

This keeps the landing badge and note spacing aligned with the previous site.

Co-authored-by: OpenAI Codex <codex@openai.com>
@deemp deemp force-pushed the migrate/vue3-vite-ts branch from 6dcdad1 to 9b5c31d Compare May 8, 2026 09:10
deemp and others added 27 commits May 8, 2026 12:22
Restore explicit Vuetify 3 item mappings for the new event time and increment selects and update the shared timezone selector to current model-value semantics.

Switch the shared date picker to the current header-hiding prop and add focused regression coverage for the select and date-picker boundaries, including a shared v-select test stub to avoid duplicating that helper.

Co-authored-by: OpenAI Codex <codex@openai.com>
Restore new-event date selection in the migrated frontend by rewiring the date picker to Vuetify 3's rendered day cells instead of relying on the legacy date event API.

Add regression coverage for pointer-based day selection so clicked dates are committed into the bound ISO-date model and the migration bug does not regress.

Co-authored-by: OpenAI Codex <codex@openai.com>
Convert DatePicker ISO string updates back into Temporal.PlainDate values in NewEvent and NewSignUp so the migrated forms keep their canonical internal selected-day shape.

End DatePicker drag selection from pointer, mouse, and touch release events through Vue handlers so hover after release does not keep selecting dates.

Co-authored-by: OpenAI <noreply@openai.com>
Add the comparator package to the repository so migration verification scenarios, runner logic, and reporting stay versioned with the frontend rewrite work.

This gives frontend parity checks a shared, reviewable baseline inside the repo instead of relying on unversioned local comparator code.

Co-authored-by: OpenAI <noreply@openai.com>
Use Vuetify 3 false-icon props for disabled unchecked advanced-options checkboxes and restore single-line truncation for the timezone selector.

This keeps the migrated advanced-options block closer to the legacy frontend and adds regression coverage for the checkbox icon API and timezone selection rendering.

Co-authored-by: OpenAI Codex <codex@openai.com>
Add targeted new-event comparator selectors for the disabled advanced-options label and sign-in helper so parity work can be driven by measured DOM/style differences.

Co-authored-by: OpenAI Codex <codex@openai.com>
Restore the signed-out advanced-options helper styling in NewEvent so the helper prompt keeps legacy emphasis while the checkbox control remains visually disabled.

Adjust the helper indent per Vuetify density to match the legacy label alignment and add regression coverage for the disabled helper markup and CSS contract.

Co-authored-by: OpenAI Codex <codex@openai.com>
Update the comparator instructions with the current local frontend paths and an explicit startup sequence for running old-vs-new checks.

This documents the expected server launch flow and URL override behavior for this checkout.

Co-authored-by: OpenAI Codex <codex@openai.com>
Separate the comparator instructions into a general comparator flow section and a styling checks section.

This keeps the browser-inspection and selector guidance scoped to comparator-driven parity work instead of reading like a global frontend styling policy.

Co-authored-by: OpenAI Codex <codex@openai.com>
Restore the migrated new event and sign up time range selects to closer legacy behavior.

Use explicit Vuetify 3 solo variants, green selected-item treatment, and fixed menu widths so the top-level time/date controls keep the expected filled background and stable dropdown sizing.

Replace the separator nudge with a shared time-range layout structure and CSS variables so the row alignment is tunable without depending on one-off offsets.

Co-authored-by: OpenAI Codex <codex@openai.com>
Restore full-width sizing on the migrated date picker so it no longer falls back to Vuetify's fixed 328px shell width.
Record the comparator rerun showing the width regression is resolved while header and height parity work remains.

Co-authored-by: OpenAI Codex <codex@openai.com>
Prevent adjacent-month day cells in the migrated date picker from driving the custom drag-select path or Vuetify month navigation.

Add picker-level regressions for cross-month drag hover and direct adjacent-month clicks so the dialog no longer jumps back to the top of the form during date selection.

Co-authored-by: OpenAI Codex <codex@openai.com>
Strip Vuetify's generated item title prop from the shared timezone selector item slot so custom item rendering does not duplicate visible timezone rows in the create flows.

Add a focused regression test for the custom item-slot path to keep the shared selector from reintroducing duplicated dropdown labels.

Co-authored-by: OpenAI Codex <codex@openai.com>
Restore the new event timezone selector underline without reintroducing the old field-level Vuetify layout overrides.

Split the compact select styling used by the time increment control away from the timezone selector, keep the timezone field underlined, move the reset action outside the field underline, and widen the selector to match legacy truncation behavior more closely.

Co-authored-by: OpenAI Codex <codex@openai.com>
Extract a shared editor dialog header for the new event, group, and sign up flows.

Use that shared structure to restore the legacy close-button placement, sizing, and tint while keeping the no-tabs dialog path delegated to the child editors.

Add regression tests for the shared header and dialog wiring so the migrated header layout stays aligned with the legacy frontend.

Co-authored-by: OpenAI Codex <codex@openai.com>
Extend the shared migration comparator scenario for the new event dialog to capture the close button element.

This keeps old-vs-new header action checks measurable when validating dialog alignment and button styling regressions during the frontend migration.

Co-authored-by: OpenAI Codex <codex@openai.com>
Keep the new event submit CTA grey and non-interactive until the required name is present instead of relying on Vuetify's disabled styling.

This restores the expected legacy visual states for invalid and valid forms and adds a focused regression test so the migrated button does not lose its label or revert to an active-looking invalid state.

Co-authored-by: OpenAI Codex <codex@openai.com>
Render NewEvent time-range select menu items through an explicit item slot so the active option can use the legacy green palette without relying on Vuetify internal state-layer overrides.

Add a regression test that locks the selected menu item styling contract for the time-range dropdowns.

Co-authored-by: OpenAI Codex <codex@openai.com>
Document ADR-009 for frontend semantic styling tokens as the shared contract for repeated visual state styling.

Define app-level semantic CSS custom properties, prohibit feature-local hardcoded shared-state palette drift, and require token-backed parity work and exceptions discipline so styling consistency rules are reviewable during migration.

Co-authored-by: OpenAI Codex <codex@openai.com>
Move repeated new-event form state colors into app-level --timeful semantic styling tokens and switch the component to consume them instead of hardcoded palette literals.

Update the NewEvent regression coverage to assert the shared token contract so future styling parity work reuses the same semantics for selection, muted helper text, disabled copy, and emphasized sign-in links.

Co-authored-by: OpenAI Codex <codex@openai.com>
Normalize the new event checkbox control gutter so standard and compact Vuetify checkboxes share the legacy visual column.

Add a shared disabled checkbox icon token and use it for sign-in-gated checkbox icons so advanced-option rows match the top-level notification row.

Co-authored-by: OpenAI <noreply@openai.com>
Use the shared selection palette for the new event date option, time increment, and timezone dropdown items so the form matches the What times might work menus.

Add regression coverage for the owned item render paths to keep the active-row styling on the shared semantic selection tokens.

Co-authored-by: OpenAI Codex <codex@openai.com>
Replace palette-based selected-state wiring in the new event form with semantic token-backed classes.

Add the minimum app-level semantic tokens needed for invalid-field, submit-error, and primary action states so the form aligns with ADR-009 without broadening the refactor into unrelated local colors.

Co-authored-by: OpenAI Codex <codex@openai.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant