Skip to content

[P3] markers-checklist: follow-up - Sebastian UX-2 review (9 work packages)#2278

Open
rolfheij-sil wants to merge 11 commits into
ai/feature/markers-checklist/followup-tj-review-rolf-05-11-2026from
ai/feature/markers-checklist/followup-ux2-rolf-05-12-2026
Open

[P3] markers-checklist: follow-up - Sebastian UX-2 review (9 work packages)#2278
rolfheij-sil wants to merge 11 commits into
ai/feature/markers-checklist/followup-tj-review-rolf-05-11-2026from
ai/feature/markers-checklist/followup-ux2-rolf-05-12-2026

Conversation

@rolfheij-sil
Copy link
Copy Markdown
Contributor

@rolfheij-sil rolfheij-sil commented May 15, 2026

Note: This PR replaces closed #2264 — the original was inadvertently auto-closed by GitHub's branch-rename API when the branch was renamed to follow the new follow-up convention (ai/feature/{name}/followup-{tag}-{first}-{date}). No reviews or comments had been posted before the rename. All commits are preserved on the new branch.

  • Old branch: ai/feature/markers-checklist-rolf-05-12-2026-ux2
  • New branch: ai/feature/markers-checklist/followup-ux2-rolf-05-12-2026

Merge sequencing: This PR is the third in a 3-PR follow-up to PR #2219:

Merge after #2254. Once #2254 merges, retarget this PR's base back to ai/main (GitHub does this automatically when the head branch is merged into the base branch). Once #2256 also merges, this PR may need a rebase to resolve conflicts in platform-scripture.d.ts and checklist.web-view.tsx.

The paired ai-prompts PR (design + plan + perf-profile) is paranext/ai-prompts#266.

Summary

Follow-up PR for the merged markers-checklist work (PR #2219). Addresses Sebastian's UX review delivered 2026-05-05 (UX Review of Porting Result - Markers Checklist.csv): 22 findings + 4 improvement ideas (deferred per design).

Design + implementation plan + perf-profile live in ai-prompts:

  • .context/features/markers-checklist/working-docs/ux-followup-design.md
  • .context/features/markers-checklist/working-docs/ux-followup-implementation-plan.md
  • .context/features/markers-checklist/working-docs/perf-profile.md (WP9)

This is the Sebastian UX-2 follow-up; the TJ-review follow-up lives in PR #2254.


7 commits across 9 work packages

WP Commit Findings Status
WP1 fdf9f176f6 #3, #13 (backend C#) Done
WP2 6068e92905 #19, #15, #16, #17 (UI bugfixes; #18 deferred to WP4) Done
WP3 8aa80f398f #1, #5, #6, #14 (toolbar restructure) Done
WP4 no commit #7, #18 N/A (already satisfied on HEAD via PR #2219)
WP5 b686a2a81f #8 (view-toggle dropdown) Done
WP6 07668b5acf #12 (menu rework + Notification toasts) Done
WP7 91ce56a97b #22 (persistence) Done
WP8 e6d686f5b0 #10, #11, #4 (table polish) Done
WP9 ai-prompts #9 (perf profile only — fixes in follow-up PR) Profile captured, fixes deferred

Per-finding status (Sebastian's 22)

# Finding Status Evidence
1 Two toolbars — drop inner Done (WP3) Visual: only outer chrome hamburger remains; count("[aria-label='Project']") == 1.
2 ScrollGroup vs Scope Selector integration Deferred (out of scope per design) Tracked as future ticket.
3 "Identical markers" message when no comparatives Done (WP1) Backend gates the variant on comparativeTextIds.Count > 0; UI now shows "Select a project to view its paragraph markers."
4 Header full-cell tooltip + hover Done (WP8) tw-w-full tw-cursor-default hover:tw-bg-accent/50 div wraps the cell; tooltip "rolf test" verified on hover.
5 Truncating primary placeholder Done (WP3) Primary trigger now shows short project name ("ROT"), no "Select primary S…".
6 Comparative placeholder + no Select-All Done (WP3) Empty comparative shows localized placeholder; ProjectSelector hideSelectAll prop.
7 Scope Selector Dropdown Variant N/A (already on HEAD via PR #2219) WP4 investigation confirmed it was already in.
8 View toggles as dropdown menu Done (WP5) Single eye-icon button opens DropdownMenu with two checkbox items (Hide Matches, Show Verse Text).
9 Performance Deferred (perf-profile.md captured in WP9; fixes in follow-up PR) Profile lives in ai-prompts; fix work scoped separately.
10 Equal column widths Done (WP8) All 7 project columns 107px wide; Reference 96px fixed.
11 Sticky header z-index Done (WP8) Table section wrapped in tw-relative tw-z-0 so the toolbar's z-10 wins over the thead's z-20.
12 Menu items (Copy/Print/Save/Inventory/Settings) Done (WP6) Verified: "Open Project Settings…", "Copy all text to clipboard", "Print Markers Checklist", "Save Markers Checklist", "Markers Inventory…", "Markers Checklist Settings". Print/Save fire NotificationService toasts saying "not yet implemented". Wordlist could not be reproduced in current build.
13 \rem \rem / \toc1 \toc1 duplication Done (WP1) Backend dropped the prepended TextItem in PostProcessParagraph. Visual: each marker appears once.
14 Bidirectional same-project filter Done (WP3) Primary popover shows only the 4 projects not currently in the comparative list (verified via list inspection).
15 Match-row coloring Done (WP2 — unit tests only) Implementation present: tw-bg-primary tw-text-primary-foreground on isMatch rows. Visual verification fell back to unit tests because real match data was unreachable in the GEN 2:23 fixture.
16 Clickable verse-number goto Done (WP2) <button data-testid="checklist-verse-goto"> wraps verse-number <sup>; onClick calls onGotoVerseClick(verseRef).
17 Settings dialog focus Done (WP2) useEffect + requestAnimationFrame focuses equivalentMarkersInputRef after the Radix focus trap activates. Code-verified; live verification difficult through CDP cross-iframe focus tracking.
18 Filter dropdown Space scroll N/A (already on HEAD via PR #2219's command.tsx Space-handler) WP4 investigation confirmed.
19 Character-style rendering Done (WP2) Any character-style item renders as <span className="usfm_{characterStyle}" data-character-style="{characterStyle}">; CSS catalog lives in checklist-usfm-styles.scss. Cells wrap content in checklist-formatted-font parent class.
20 ProjectSelector initial-Open-tabs Deferred — flag to ProjectSelector team Cross-feature, out of scope.
21 ProjectSelector list-refresh on install/open/close Deferred — flag to ProjectSelector team Cross-feature, out of scope.
22 Persist comparative projects, hideMatches, showVerseText, equivalent markers, marker filter Done (WP7) Hook useChecklistDefaults reads/writes user-setting platformScripture.markersChecklistDefaults. Verified live: previously-selected 7 comparative texts and dialog values (p/q, q1 q2) reappear on reopen.

Plan deviations

  • WP4 produced no commit. PR [P3][backend+ui] markers-checklist: Backend + UI implementation (C# data provider, React web view, E2E tests) #2219 (which landed before this branch was based) already contained the cherry-picked Dropdown Variant scope selector and the command.tsx Space-handler. Findings #7 and Prepare release #18 were satisfied on HEAD without additional work; WP4 investigation confirmed and documented this.
  • #15 visual proof fell back to unit tests. Match rows require the chapter / range to contain a row where every comparative agrees with the primary at the same paragraph marker. The exercised GEN 2:23 fixture had no such row; the implementation is covered by unit tests in checklist.component.test.tsx.
  • Fix ReadMe icon #12 Wordlist could not be reproduced in the current build — likely already removed since the 2026-05-05 review.

Known issues

  • WP6 Sonner toast z-index may be obscured in some layouts (e.g. floating webview). Reviewer feedback during testing would be appreciated.
  • Pre-existing storybook test failures in lib/platform-bible-react/ for DEFAULT_SCROLL_GROUP_LOCALIZED_STRINGS — these are unrelated to this PR and exist on ai/main.
  • Pre-existing lint warning for import/no-named-as-default on ProjectSelector in lib/platform-bible-react/src/components/advanced/settings-components/settings-sidebar.component.tsx — unrelated.

Tested

Live walkthrough against running app (CDP-attached headless Electron). Screenshots captured to /tmp/wp-final-*.png:

  • Opened Markers Checklist via PAPI platformScripture.openMarkersChecklist.
  • Verified single-toolbar layout, populated comparatives from persisted user setting (verifying #22 round-trip).
  • Walked the outer hamburger: all 6 expected items (Open Project Settings… / Copy all text to clipboard / Print Markers Checklist / Save Markers Checklist / Markers Inventory… / Markers Checklist Settings).
  • Opened primary popover: only the 4 projects not selected as comparatives appear (verifying #14).
  • Selected ROT as primary, table rendered with 8 equal-width project columns + smaller fixed Reference column.
  • Confirmed markers render once per paragraph (no \q1 \q1 duplication — Fix Lint warnings #13).
  • Eye-icon opened DropdownMenu with two checkbox items (#8).
  • Hovered ROT header — tooltip "rolf test" appeared, full-cell hover bg-accent/50 (Fix release #4).
  • Inspected DOM stacking context — table thead z-20 inside tw-relative tw-z-0 wrapper; toolbar z-10 wins (Add debugging to GHA workflows #11).
  • Opened Markers Checklist Settings dialog; Tab cycles inputs (Equivalent markers → Help button → Markers-to-display → Cancel → Save) inside the dialog only.
  • Toggled comparative-text count and view modes; cleared dialog inputs and saved — all persisted across reopens (#22).

Test plan

  • npm run lint — 0 errors (1 pre-existing warning, unrelated)
  • npm run typecheck — clean
  • npm test — TS suites pass except the 5 pre-existing storybook failures noted above
  • dotnet test in c-sharp-tests/ — 706 passed, 0 failed, 6 skipped
  • CI green
  • Tested by Rolf

🤖 Generated with Claude Code


This change is Reviewable

rolfheij-sil and others added 11 commits May 11, 2026 21:32
- #13: PostProcessParagraph no longer prepends `\marker` as a TextItem.
  The UI renders the marker from paragraph.Marker. INV-004 revised:
  Items contains only the original verse-text items (or empty when
  showVerseText=false).

- #3 backend: PostProcessRows gains hasComparativeTexts parameter. The
  "Comparative texts have identical markers" Identical variant is now
  only emitted when at least one comparative is configured. The empty-
  with-no-comparatives case returns NoResults instead.

- #3 frontend: empty-results fallback no longer defaults to the
  identical-markers string. New keys
  %markersChecklist_emptyResult_noResults% / _selectProject% drive a
  context-appropriate message.

Co-Authored-By: Claude Code <noreply@anthropic.com>
… deferred)

- #19: character-style items now render as <span className="usfm_{marker}">
  with styling from a new checklist-usfm-styles.scss partial mirroring
  scripture-editor's _usj-nodes.scss character-style subset. The SCSS is
  imported via ?inline in checklist.web-view-provider.ts and concatenated
  with the tailwind styles passed to PAPI (the extension's webpack config
  uses sass-loader without style-loader, so the styles must be threaded
  through the web-view-provider's styles field rather than the standard
  side-effect import). No more literal "(\\nd Lord)".
- #15: match rows get tw-bg-primary tw-text-primary-foreground on both
  the reference and project cells when row.isMatch === true.
- #16: verse-number items in cells are now click-to-navigate buttons
  routed through onGotoLinkClick. The button's verseRef is reconstructed
  as `{book chapter}:{verseNumber}` from the owning cell's reference.
  Plain-superscript fallback preserved for read-only contexts.
- #17: settings dialog focuses the equivalent-markers input on each open
  transition via requestAnimationFrame so Radix's focus trap is active
  before we focus. Replaces the autoFocus prop on the Input which fired
  before the focus trap mounted.
- #18: deferred to be re-verified after WP4 cherry-picks
  shadcn-ui/command.tsx (which addresses the underlying cmdk Space
  propagation). Reopen if filter-dropdown space still scrolls the table
  after WP4.

Adds Vitest regression tests for #19 (character-style className), #15
(match-row coloring on the reference cell), and #16 (verse-goto button
wiring + verseRef reconstruction). Per CLAUDE.md the test file uses the
`// @vitest-environment jsdom` directive because the extensions vitest
config defaults to environment: 'node' and the new tests need RTL.

Co-Authored-By: Claude Code <noreply@anthropic.com>
- #1: dropped the inner ChecklistTool TabToolbar. Selectors + view
  toggles now render inline in a single sticky row. The outer Platform
  tab chrome hamburger will host our menu items via WebViewMenu
  contributions (see WP6); the now-dead `projectMenuData` /
  `onSelectProjectMenuItem` props + clipboard/menu wiring have been
  removed to keep the web-view free of orphaned code.
- #5: primary-project trigger no longer shows the truncating
  "Select primary S..." placeholder. The trigger renders the project's
  short name; the localized hint remains available via the aria-label /
  tooltip. Also dropped the redundant `primaryProjectName` lookup that
  was only used to populate the now-defunct placeholder.
- #6: comparative-texts trigger shows a proper placeholder
  ("Select comparative texts") when empty. Added an opt-in
  `hideSelectAll` prop to ProjectSelector's `project-multi` mode and
  set it on the comparative trigger — selecting every project as a
  comparative is rarely useful and creates accidental wide queries.
- #14: bidirectional same-project filter. Primary list hides every
  selected comparative; comparative list hides the primary. Filter
  logic extracted to `checklist-project-filter.utils.ts` with 7
  unit tests so the rule can't regress silently.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Replace the ToggleGroup of Eye/EyeOff + Book/BookOpen buttons with a
single eye-icon DropdownMenu containing checkbox items:
- Hide matches (disabled when columnCount <= 1)
- Show verse text

Per UX-2 finding #8: the icon does not change with state; the
checkbox marks inside the menu show the current state.

Co-Authored-By: Claude Code <noreply@anthropic.com>
…toasts (#12)

Hamburger menu rework per UX-2 finding #12:

- Rename Copy -> "Copy all text to clipboard"; show Sonner success toast
  ("Checklist text copied to clipboard.") on successful clipboard write
- Rename Settings -> "Markers Checklist Settings"; sync the dialog
  title (`markersChecklist_settings_title`) so menu + dialog match
- Add "Print Markers Checklist" -- handler fires "not yet implemented"
  toast via NotificationService (`papi.notifications.send`)
- Add "Save Markers Checklist" -- same not-implemented toast pattern
- Add "Markers Inventory..." -- opens the existing
  `platformScripture.markersInventory` web view via the already-
  registered `platformScripture.openMarkersInventory` command

Wiring details:

The plan's original "intercept Copy in the web view" path no longer
applies because WP3 deleted the inner TabToolbar. Menu items now
dispatch through the outer Platform.Bible tab chrome, which calls
`papi.commands.sendCommand(command, tabId)` -- so the web view never
receives a direct `onSelectProjectMenuItem` callback. To preserve
live `visibleData` access for the clipboard copy we introduce a
companion broadcast network event (`CHECKLIST_COPY_REQUEST_EVENT`,
mirroring the existing `CHECKLIST_OPEN_SETTINGS_EVENT`): the
`copyMarkersChecklist` command in main.ts emits the event, and the
web view subscribes via `useEvent` to build the clipboard text from
the current `visibleData` snapshot.

Clipboard write resilience: when the outer-chrome menu fires, focus
sits on the main-frame menu, not the web view's iframe -- so the
async clipboard API throws "Document is not focused". The handler
calls `window.focus()` first and falls back to a hidden-textarea
`execCommand('copy')` if the async path is still unreachable.

All "not implemented" / "copy succeeded" messages use
`papi.notifications.send({severity:'info'})` which surfaces as a
non-blocking Sonner toast in the renderer's mounted <Toaster />.

Verification: visual-verified via CDP -- menu order matches plan,
all toasts render, clipboard receives table content, Markers
Inventory opens, Settings dialog title updated. Lint clean, typecheck
clean, 136/136 platform-scripture vitest tests pass, 706/706 C# tests
pass.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Persist comparative projects, view toggles, equivalent markers, and
marker filter to a user setting so a new checklist tab — or a fresh
app session — inherits the user's last-committed defaults.

- New setting: platformScripture.markersChecklistDefaults
  (declared in contributions/settings.json + SettingTypes augmentation
  in platform-scripture.d.ts).
- New hook: useChecklistDefaults reads the setting on mount and
  exposes a writeDefaults callback that merges partial updates with
  the latest snapshot before calling papi.settings.set. Errors are
  swallowed + logged so a failed persist degrades to per-tab-only
  persistence.
- Split checklist.web-view's body into an outer ChecklistWebView
  (reads the setting, gates rendering on isLoading) and an inner
  ChecklistContent (runs all the useWebViewState slots). The gate is
  required because useWebViewState's `useState(() => ...)` lazy init
  consults the default exactly once — without the gate, the first
  render would seed every slot with the static defaults and silently
  ignore the persisted value.
- A new useEffect in ChecklistContent mirrors the persisted slots
  back to the setting on every change (last-write-wins for cross-tab
  races, accepted as a minor UX wart).
- Scope and verse range are NOT persisted (matches PT9 memento
  behaviour and reviewer instruction).

Cross-restart visual verification confirmed: comparative project +
equivalentMarkers + markerFilter all survive `./.erb/scripts/refresh.sh`
and seed a freshly-opened Markers Checklist tab.

Tests: 6 new vitest cases in use-checklist-defaults.test.ts pin the
hook contract (loading state, persisted-value exposure, partial-merge,
read-fail fallback, write-merge, write-fail swallow). 173/173 platform-
scripture tests pass; npm run typecheck + npm run lint clean.

Co-Authored-By: Claude Code <noreply@anthropic.com>
- #10: enforce equal column widths via `table-fixed` layout +
  `tw-w-24` on the first `<th>` (Ref column). TanStack's DataTable
  does not honor `ColumnDef.size`, and inline widths on inner divs
  do not propagate to the `<th>` under table-fixed — widths must
  live on the `<th>` itself. Applied via Tailwind arbitrary
  variants on the `<section>` wrapper, no shared-lib changes.
  Replaces the previous auto-layout sizing where the widest cell
  drove the column width (making columns unequal).
- #11: wrap the table section in `tw-relative tw-z-0` so the sticky
  thead's intrinsic `z-20` (set by shadcn-ui Table) stays inside a
  new stacking context and never out-stacks the toolbar (`z-10`).
- #4: header tooltip + hover now cover the entire header cell
  (was just the text span). Cursor stays as the default arrow
  (neither pointer nor text). A subtle `bg-accent/50` on hover
  makes the hoverable area discoverable.

Co-Authored-By: Claude Code <noreply@anthropic.com>
WP2's `tw-bg-primary tw-text-primary-foreground` was unreadable in both
light and dark modes — inner spans hardcode their own text colors
(`tw-text-foreground`, `tw-text-primary`, `tw-text-muted-foreground`),
overriding the outer container's `tw-text-primary-foreground`. Net
effect: same color on same color = invisible content. Additionally the
bg-color sat on the inner content div, so the colored region didn't
cover the full table cell (an unstyled border framed every match row).

Fix: replace with `tw-bg-primary/30` (subtle tint) and bleed the tint
to the cell edges via `-tw-m-4 tw-px-6 tw-py-6`, which cancels
`TableCell`'s built-in `tw-p-4` and restores the content offset. The
30% opacity lets the inner spans' default colors stay readable in
both light AND dark modes.

Approach A (negative-margin bleed on the cell's outermost element)
was chosen over modifying the shared `DataTable` to honor a
`columnDef.meta.className` (Approach B) because the shared DataTable
renders `<TableCell>{flexRender(cell, ctx)}</TableCell>` with no hook
for per-cell `<td>` classes — adding one would expand the PR scope to
`lib/platform-bible-react` and require ADR coverage.

- Drop `tw-text-primary-foreground` (no longer needed)
- Replace inner-div bg with outer-element bg that fills the full cell
- Update RTL tests to assert `tw-bg-primary/30` and the absence of
  `tw-text-primary-foreground`

Co-Authored-By: Claude Code <noreply@anthropic.com>
…(#15)

The first fix attempt (3b8b99b) tried to bleed a tw-bg-primary/30 inner
container past TableCell's tw-p-4 with negative margins. Rolf reported the
colored region still only covered the text/content area, not the full cell
rectangle.

This iteration applies the tint at the row level via a new getRowClassName
prop on the shared DataTable component. The row's `<tr>` background paints
under every `<td>`, so each cell truly fills edge-to-edge. Color is
centralized in a single MATCH_ROW_BG_CLASS module-scope constant for
one-place tuning.

Changes:
- lib/platform-bible-react/src/components/advanced/data-table:
  Add optional getRowClassName?: (row) => string | undefined prop. Forwarded
  to `<TableRow>`'s className. No behavior change when the prop is omitted.
  Dist rebuilt.
- extensions/src/platform-scripture/src/components/checklist.component.tsx:
  MATCH_ROW_BG_CLASS = 'tw-bg-primary/20' (down from /30 — Rolf: too loud).
  Pass via getRowClassName when row.original.isMatch. Removed the negative-
  margin construction from both refColumn and projectColumns cells.
- checklist.component.test.tsx: RTL tests now walk up from the reference
  cell to the `<tr>` and assert the bg class lives there, not on inner
  content.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Disable the outer Platform.Bible tab chrome for the markers checklist
(shouldShowToolbar=false) and host the hamburger menu directly on the
inner TabToolbar — partial reversal of WP3's "drop the inner toolbar"
decision, prompted by Rolf's request to consolidate everything on one
toolbar instead of duplicating chrome.

Changes:

- checklist.web-view-provider.ts: shouldShowToolbar false.
- checklist.types.ts: restore the projectMenuData + onSelectProjectMenuItem
  props on ChecklistToolProps (with Localized + MultiColumnMenu imports).
- checklist.component.tsx: restore the TabToolbar import and use it again
  as the toolbar wrapper, passing the project-menu props through. Wrap
  renderToolbarStart and renderToolbarEnd in `tw-flex tw-h-full
  tw-items-center` divs so selectors / view-menu trigger align
  horizontally with the hamburger (TabToolbar's inner area divs hardcode
  items-start, which top-aligned them while the hamburger center-aligned).
- checklist.web-view.tsx: restore MARKERS_CHECKLIST_WEB_VIEW_TYPE +
  DEFAULT_WEBVIEW_MENU constants, the useData(papi.menuData...).WebViewMenu
  fetch + memoized narrowing, and the handleSelectProjectMenuItem dispatch
  (papi.commands.sendCommand for every item — no local Copy intercept,
  reuses WP6's CHECKLIST_COPY_REQUEST_EVENT plumbing unchanged).

Menu items (Copy / Print / Save / Markers Inventory / Settings) still
flow through the same registered commands in main.ts; only the dispatch
origin moves from outer chrome to inner toolbar.

Co-Authored-By: Claude Code <noreply@anthropic.com>
…th PR #2212

The earlier WP4 investigation concluded the Dropdown Variant was already on
HEAD via PR #2219; that conclusion was incomplete. The shared component's
JSX is present on HEAD, but four call-site / shared-lib gaps kept the
markers-checklist's scope dropdown from matching the design in PR #2212's
Dropdown Variant story:

1. The Navigate footer was never rendering — `checklist.web-view.tsx` passed
   `currentScrRef` but not `onCurrentScrRefChange`, and the component gates
   the footer on the callback. Fixed by wiring `onCurrentScrRefChange=
   {setLiveScrRef}` (option A — broadcasts via the scroll group; does NOT
   raise the editor tab, to keep focus inside the checklist).

2. Footer label read "Navigate" instead of "Change current reference".
   `localizedStrings.json` contributed "Navigate" for
   `webView_scope_selector_navigate`; renamed to "Change current reference"
   to match the design.

3. "Choose specific books" was missing from the dropdown because
   `availableScopes` excluded `selectedBooks`. Added the scope (option C
   from triage); `handleScopeChange` intercepts `selectedBooks` and fires a
   `papi.notifications.send` toast — "Choose specific books is not yet
   supported for the markers checklist." — without committing the scope
   change, so the previous scope stays active. The backend's
   ChecklistRequest.verseRange contract only supports contiguous start/end
   ranges, so a real implementation needs a separate follow-up.

4. Verse / Chapter / Book dropdown items weren't showing their scrRef
   suffixes (`MAT 5:3`, `MAT 5`, `MAT`). Root cause was in the shared
   ScopeSelector: `DropdownMenuContent`'s `tw-min-w-[12rem]` (192px) sat
   below the `DROPDOWN_NARROW_THRESHOLD_PX` (200), so `isDropdownNarrow`
   stayed true and suffixes were hidden. Bumped to `tw-min-w-[14rem]`
   (224px) so the content rect lands at ~216px (after shadcn's `tw-p-1`),
   clearing the threshold. Rebuilt platform-bible-react dist. Affects every
   ScopeSelector dropdown-variant consumer — 32px wider minimum, low risk.

Files:
- extensions/src/platform-scripture/src/checklist.web-view.tsx
- extensions/src/platform-scripture/contributions/localizedStrings.json
- lib/platform-bible-react/src/components/advanced/scope-selector/scope-selector.component.tsx
- lib/platform-bible-react/dist/* (rebuilt)

Co-Authored-By: Claude Code <noreply@anthropic.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