From dac9d89f9128a85f519edec01dbbc4a193488f7e Mon Sep 17 00:00:00 2001 From: npeter83 Date: Thu, 24 Sep 2026 23:48:22 +0200 Subject: [PATCH] feat(design): the field family, the dropdown trigger, native controls, the no-raw-input lint rule (E28 S3c) - ui/Input, Textarea, InnerInput + fieldClass (A4): the >= 3:1 edge, a 2px accent focus edge, the danger edge for invalid, md/sm/xs/heading rungs, 1rem and 44 on touch - ui/SelectTrigger (A5): SortControl, FilterSelect, the view switcher and the date filter on one trigger, a pill in a toolbar, r8 in a form - ui/NativeControls (A6): Checkbox, CheckRow, Slider, ColorInput - every raw input swept (~100 sites); inputCls retired; local/input-primitive - useReturnFocus: an in-place editor hands the focus back to its trigger on Enter/Escape (the playlist and Plex title renames, the priority number); the Plex playlist rename gains Escape and an accessible name - back to top: a round 48 FAB (owner decision); DESIGN.md A2 and the log --- CLAUDE.md | 1 + docs/DESIGN.md | 30 ++++-- frontend/eslint.config.js | 42 +++++++- frontend/src/components/AddToPlaylist.tsx | 6 +- frontend/src/components/AdminLogs.tsx | 13 ++- frontend/src/components/AdminUsers.tsx | 9 +- frontend/src/components/ChannelTags.tsx | 6 +- frontend/src/components/ChatThread.tsx | 5 +- frontend/src/components/ConfigPanel.tsx | 20 ++-- frontend/src/components/DateFilterSelect.tsx | 30 +++--- frontend/src/components/DebugRecorder.tsx | 6 +- frontend/src/components/DownloadCenter.tsx | 6 +- frontend/src/components/DownloadDialog.tsx | 6 +- frontend/src/components/IssueComposer.tsx | 19 ++-- frontend/src/components/KeyGate.tsx | 14 +-- frontend/src/components/Messages.tsx | 6 +- frontend/src/components/MyLogViewer.tsx | 13 ++- .../src/components/PersonalViewsModal.tsx | 9 +- frontend/src/components/Playlists.tsx | 34 ++++--- frontend/src/components/PlaylistsRail.tsx | 11 ++- .../src/components/PlexCollectionEditor.tsx | 9 +- .../src/components/PlexCollectionView.tsx | 23 +++-- .../src/components/PlexPlayerSettings.tsx | 36 ++----- frontend/src/components/PlexPlaylistAdd.tsx | 5 +- frontend/src/components/PlexPlaylistView.tsx | 22 ++++- frontend/src/components/PlexSidebar.tsx | 6 +- frontend/src/components/ProfileEditor.tsx | 12 +-- frontend/src/components/Scheduler.tsx | 19 ++-- frontend/src/components/SearchBar.tsx | 5 +- frontend/src/components/SettingsPanel.tsx | 35 +++---- frontend/src/components/SetupWizard.tsx | 42 ++++---- frontend/src/components/ShareDialog.tsx | 36 +++---- frontend/src/components/TagManager.tsx | 9 +- frontend/src/components/UploadDialog.tsx | 6 +- frontend/src/components/VideoEditor.tsx | 18 ++-- frontend/src/components/ViewSwitcher.tsx | 18 ++-- frontend/src/components/WatchPage.tsx | 5 +- frontend/src/components/Welcome.tsx | 14 +-- frontend/src/components/downloadAdmin.tsx | 32 +++--- frontend/src/components/downloadModals.tsx | 20 ++-- frontend/src/components/plexBrowseLists.tsx | 15 +-- frontend/src/components/plexDetailUi.tsx | 5 +- .../src/components/plexPlayerControls.tsx | 18 +--- frontend/src/components/ui/BackToTop.tsx | 6 +- frontend/src/components/ui/Combobox.tsx | 12 ++- frontend/src/components/ui/CommandPalette.tsx | 10 +- frontend/src/components/ui/FilterSelect.tsx | 18 ++-- frontend/src/components/ui/Input.dom.test.tsx | 81 +++++++++++++++ frontend/src/components/ui/Input.tsx | 79 +++++++++++++++ frontend/src/components/ui/NativeControls.tsx | 98 +++++++++++++++++++ frontend/src/components/ui/Pager.tsx | 6 +- .../ui/PriorityStepper.dom.test.tsx | 14 +++ .../src/components/ui/PriorityStepper.tsx | 12 ++- frontend/src/components/ui/README.md | 14 +-- frontend/src/components/ui/SelectTrigger.tsx | 50 ++++++++++ frontend/src/components/ui/SortControl.tsx | 26 ++--- frontend/src/components/ui/fieldStyles.ts | 41 ++++++++ frontend/src/components/ui/form.tsx | 9 -- frontend/src/components/ui/tableHeader.tsx | 6 +- frontend/src/components/ui/useReturnFocus.ts | 21 ++++ frontend/src/design-lab/DesignLab.tsx | 8 +- frontend/src/design-lab/batchA.tsx | 89 ++++++++--------- .../src/lib/inputPrimitive.contract.test.ts | 43 ++++++++ 63 files changed, 923 insertions(+), 416 deletions(-) create mode 100644 frontend/src/components/ui/Input.dom.test.tsx create mode 100644 frontend/src/components/ui/Input.tsx create mode 100644 frontend/src/components/ui/NativeControls.tsx create mode 100644 frontend/src/components/ui/SelectTrigger.tsx create mode 100644 frontend/src/components/ui/fieldStyles.ts create mode 100644 frontend/src/components/ui/useReturnFocus.ts create mode 100644 frontend/src/lib/inputPrimitive.contract.test.ts diff --git a/CLAUDE.md b/CLAUDE.md index 2c5da3bb..a0f4310c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -96,6 +96,7 @@ CQRS, a repository/DI framework, a router library, a generic CRUD-router factory | FE keyboard shortcut | a row in `lib/keymap.ts` + `dispatch()` | a private `keydown` listener with its own key literals | | FE list/grid keys | `NavGrid`/`keyboardNav` + `navItemAttrs` + `data-nav-open` | a private arrow-key / roving-tabindex handler | | FE view push (history) | `rememberNavPosition()` right before `history.pushState` | a push that forgets: Back strands focus on `` | +| FE text field / checkbox / slider | `ui/Input` · `Textarea` · `InnerInput` in a `fieldClass` frame · `Checkbox`/`CheckRow` · `Slider` | a raw ``/`