Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7cf36c3
Add the read-only analysis catalog panel
alex-rawlings-yyc Aug 14, 2026
2699ece
Adopt the platform Button for the catalog row toggle
alex-rawlings-yyc Aug 14, 2026
528a73c
Harden the analysis catalog against bad input, RTL, and screen readers
alex-rawlings-yyc Aug 14, 2026
b6ad5ec
Stop a panel resize that outlives its release
alex-rawlings-yyc Aug 14, 2026
a6c2e4a
Cover the catalog's empty state and cross-book jump faithfully
alex-rawlings-yyc Aug 17, 2026
fafcd77
Give the catalog width-restore test teeth
alex-rawlings-yyc Aug 17, 2026
f5dc269
Confine the panel resize drag to the primary button
alex-rawlings-yyc Aug 17, 2026
e117d30
End the panel resize drag only on a primary release
alex-rawlings-yyc Aug 17, 2026
a0a06da
Tighten the analysis catalog panel's resizing and rows
alex-rawlings-yyc Aug 18, 2026
ff10255
Start a panel resize from the width on screen
alex-rawlings-yyc Aug 18, 2026
02b655a
Propagate a reset through the WebView state stub
alex-rawlings-yyc Aug 19, 2026
1e32f06
Hold the catalog panel's resize to the room on screen
alex-rawlings-yyc Aug 19, 2026
3933e4a
Drop a stray blank line in the platform React mock
alex-rawlings-yyc Aug 19, 2026
cc8b93b
Keep a remembered panel width through a container clamp
alex-rawlings-yyc Aug 20, 2026
07c4a34
Correct the coverage-ignore reason on the stale drag-origin guard
alex-rawlings-yyc Aug 20, 2026
ef04752
Match the unmount width commit to the release comparison
alex-rawlings-yyc Aug 20, 2026
d263102
Ask for the per-book count label where it is rendered
alex-rawlings-yyc Aug 21, 2026
d8b6b00
Adopt the platform resizable panels for the catalog
alex-rawlings-yyc Aug 21, 2026
83b14e8
Format catalog references and collation through the platform
alex-rawlings-yyc Aug 21, 2026
c85ef27
Adopt the platform empty state and truncation tooltips
alex-rawlings-yyc Aug 21, 2026
878b311
Drop a stale claim about the catalog list from the row doc
alex-rawlings-yyc Aug 21, 2026
a99c505
Take book names and layout direction from the platform
alex-rawlings-yyc Aug 21, 2026
97a3f92
Lay the analysis catalog out in percentages, not fractions
alex-rawlings-yyc Aug 21, 2026
162997a
Give the analysis catalog its own tooltip provider
alex-rawlings-yyc Aug 21, 2026
de3fdd1
Move the analysis catalog panel when a key resizes it
alex-rawlings-yyc Aug 21, 2026
4ba1f8e
Answer arrow keys where the platform handle gets them wrong
alex-rawlings-yyc Aug 21, 2026
a056da5
Keep the catalog width when it is closed and reopened
alex-rawlings-yyc Aug 21, 2026
aa8a599
Mirror Home and End in a right-to-left interface
alex-rawlings-yyc Aug 21, 2026
5fbc1c1
Store the catalog width the panel group settled on
alex-rawlings-yyc Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion REVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ The merge control's **tooltip** runs its localized strings through `resolvedOrEm

## A `title` in a test assertion does not mean the code renders a `title` attribute

Every tooltip in this extension goes through the platform `Tooltip`/`TooltipContent`; none sets an HTML `title` attribute. Tests nevertheless assert `toHaveAttribute('title', …)` because the `Tooltip` stub in [\_\_mocks\_\_/platform-bible-react.tsx](__mocks__/platform-bible-react.tsx) reads its `TooltipContent` child's text and clones the trigger with that text as a `title`, which keeps the tooltip assertable without simulating hover in jsdom. The `title` **prop** some components take (the boundary button's, for one) is likewise just a prop name; it is rendered as `TooltipContent` children.
Every tooltip in this extension goes through the platform `Tooltip`/`TooltipContent`, with one documented exception: the usage counts in [src/components/CatalogRowView.tsx](src/components/CatalogRowView.tsx) sit inside the row's own button, where a tooltip trigger would nest one interactive element in another, so they carry a native `title` and repeat their label in screen-reader-only text. Outside that exception, no component sets an HTML `title` attribute. Tests nevertheless assert `toHaveAttribute('title', …)` because the `Tooltip` stub in [\_\_mocks\_\_/platform-bible-react.tsx](__mocks__/platform-bible-react.tsx) reads its `TooltipContent` child's text and clones the trigger with that text as a `title`, which keeps the tooltip assertable without simulating hover in jsdom. The `title` **prop** some components take (the boundary button's, for one) is likewise just a prop name; it is rendered as `TooltipContent` children.

So do not conclude from either signal that a control is limited to plain text — for instance, that it cannot hold a `Kbd` or any other element. Read the component's own JSX before claiming a render path is text-only.

Expand Down
14 changes: 14 additions & 0 deletions __mocks__/lucide-react.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,17 @@ export function Merge(props: Readonly<{ className?: string }>): ReactElement {
export function Split(props: Readonly<{ size?: number; className?: string }>): ReactElement {
return <svg data-testid="split-icon" {...props} />;
}

/**
* Stub for the ChevronRight icon, marking a collapsed catalog row.
*/
export function ChevronRight(props: Readonly<{ className?: string }>): ReactElement {
return <svg data-testid="chevron-right-icon" {...props} />;
}

/**
* Stub for the ChevronDown icon, marking an expanded catalog row.
*/
export function ChevronDown(props: Readonly<{ className?: string }>): ReactElement {
return <svg data-testid="chevron-down-icon" {...props} />;
}
16 changes: 16 additions & 0 deletions __mocks__/platform-bible-react-experimental.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* @file Jest mock for platform-bible-react/experimental. The real package ships ESM which Jest
* cannot parse without extra transform configuration. This stub provides the subset used by the
* extension.
*/

/** Text and layout direction. */
export type Direction = 'rtl' | 'ltr';

/**
* Layout direction the interface runs in, read from the document rather than from localStorage as
* the real function does, so a test sets it the way it would for any other RTL assertion.
*/
export function readDirection(): Direction {
return document.documentElement.dir === 'rtl' ? 'rtl' : 'ltr';
}
Loading