Skip to content

Commit 8f043f0

Browse files
committed
refactor: code cleanup
1 parent 4d9710e commit 8f043f0

File tree

9 files changed

+30
-46
lines changed

9 files changed

+30
-46
lines changed

dev/slides.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ function imageLink(asset: string, size: number) {
55
}
66

77
export const slides = [
8-
{ asset: "image01.0800ee93.3840x5760" },
9-
{ asset: "image02.645bc7e4.3840x5070" },
10-
{ asset: "image03.13c5eeb7.3840x5120" },
8+
{ asset: "image01.0800ee93.3840x5760", description: "Puppy in sunglasses" },
9+
{ asset: "image02.645bc7e4.3840x5070", description: "Miami beach" },
10+
{ asset: "image03.13c5eeb7.3840x5120", description: "Flamingo" },
1111
{ asset: "image04.2d71a97f.3840x2546" },
1212
{ asset: "image05.c6ce32ab.3840x5760" },
1313
{ asset: "image06.74d5e191.3840x2553" },
@@ -65,7 +65,6 @@ export const slides = [
6565
src: imageLink(asset, width),
6666
width,
6767
height,
68-
description: "Description of the image",
6968
srcSet: breakpoints.map((breakpoint) => ({
7069
src: imageLink(asset, breakpoint),
7170
width: breakpoint,

src/contexts/A11yContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export function A11yContextProvider({ children }: React.PropsWithChildren) {
2424
const [autoPlaying, setAutoPlaying] = React.useState(false);
2525

2626
const context = React.useMemo(() => {
27-
const trackFocusWithin = (onFocus?: React.FocusEventHandler, onBlur?: React.FocusEventHandler) => {
27+
const trackFocusWithin: A11yContextType["trackFocusWithin"] = (onFocus, onBlur) => {
2828
const trackAndDelegate = (focusWithinValue: boolean) => (event: React.FocusEvent) => {
2929
if (!event.currentTarget.contains(event.relatedTarget)) {
3030
setFocusWithin(focusWithinValue);

src/modules/Carousel.tsx

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import {
99
cssClass,
1010
cssVar,
1111
getSlide,
12-
getSlideIndex,
1312
getSlideKey,
1413
hasSlides,
1514
isImageSlide,
1615
makeInertWhen,
1716
parseLengthPercentage,
1817
translateLabel,
18+
translateSlideCounter,
1919
} from "../utils.js";
2020
import { ImageSlide } from "../components/index.js";
2121
import { useController } from "./Controller/index.js";
@@ -33,10 +33,9 @@ function cssSlidePrefix(value?: string) {
3333
type CarouselSlideProps = {
3434
slide: Slide;
3535
offset: number;
36-
index: number;
3736
};
3837

39-
function CarouselSlide({ slide, offset, index }: CarouselSlideProps) {
38+
function CarouselSlide({ slide, offset }: CarouselSlideProps) {
4039
const containerRef = React.useRef<HTMLDivElement>(null);
4140

4241
const { currentIndex, slides } = useLightboxState();
@@ -84,10 +83,6 @@ function CarouselSlide({ slide, offset, index }: CarouselSlideProps) {
8483
) : null;
8584
};
8685

87-
const slideLabel = translateLabel(labels, "{{index}} of {{slidesLength}}")
88-
.replace("{{index}}", String(index + 1))
89-
.replace("{{slidesLength}}", String(slides.length));
90-
9186
return (
9287
<div
9388
ref={containerRef}
@@ -100,7 +95,7 @@ function CarouselSlide({ slide, offset, index }: CarouselSlideProps) {
10095
style={style}
10196
role="region"
10297
aria-roledescription={translateLabel(labels, "Slide")}
103-
aria-label={slideLabel}
98+
aria-label={translateSlideCounter(labels, slides, currentIndex + offset)}
10499
>
105100
{renderSlide()}
106101
</div>
@@ -121,10 +116,7 @@ export function Carousel({ carousel, labels }: ComponentProps) {
121116
const paddingValue = parseLengthPercentage(carousel.padding);
122117

123118
const preload = calculatePreload(carousel, slides, 1);
124-
const items: ({ key: React.Key } & (
125-
| { slide: Slide; offset: number; index: number }
126-
| { slide?: never; offset?: never; index?: number }
127-
))[] = [];
119+
const items: ({ key: React.Key } & ({ slide: Slide; offset: number } | { slide?: never; offset?: never }))[] = [];
128120

129121
if (hasSlides(slides)) {
130122
for (let index = currentIndex - preload; index <= currentIndex + preload; index += 1) {
@@ -137,7 +129,6 @@ export function Carousel({ carousel, labels }: ComponentProps) {
137129
? {
138130
key: [`${key}`, getSlideKey(slide)].filter(Boolean).join("|"),
139131
offset: index - currentIndex,
140-
index: getSlideIndex(index, slides.length),
141132
slide,
142133
}
143134
: { key },
@@ -161,8 +152,8 @@ export function Carousel({ carousel, labels }: ComponentProps) {
161152
aria-roledescription={translateLabel(labels, "Carousel")}
162153
aria-label={translateLabel(labels, "Photo gallery")}
163154
>
164-
{items.map(({ key, slide, offset, index }) =>
165-
slide ? <CarouselSlide key={key} slide={slide} offset={offset} index={index} /> : <Placeholder key={key} />,
155+
{items.map(({ key, slide, offset }) =>
156+
slide ? <CarouselSlide key={key} slide={slide} offset={offset} /> : <Placeholder key={key} />,
166157
)}
167158
</div>
168159
);

src/modules/Controller/Controller.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,10 @@ export function Controller({ children, ...props }: ComponentProps) {
328328

329329
const focusOnMount = useEventCallback(() => {
330330
// capture focus only when rendered inside a portal
331-
if (getOwnerDocument().querySelector(`.${cssClass(MODULE_PORTAL)} .${cssClass(cssContainerPrefix())}`)) {
331+
if (
332+
controller.focus &&
333+
getOwnerDocument().querySelector(`.${cssClass(MODULE_PORTAL)} .${cssClass(cssContainerPrefix())}`)
334+
) {
332335
focus();
333336
}
334337
});

src/plugins/counter/Counter.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ export function CounterComponent({ counter }: ComponentProps) {
3030
className={clsx(cssClass("counter"), className || legacyClassName)}
3131
{...legacyRest}
3232
{...rest}
33-
aria-hidden="true"
33+
// slides already provide the "k of N" label, so there is no need to override the `aria-hidden` attribute here
34+
aria-hidden
3435
>
3536
{currentIndex + 1} {separator} {slides.length}
3637
</div>

src/plugins/thumbnails/Thumbnail.tsx

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
makeComposePrefix,
1313
RenderThumbnailProps,
1414
Slide,
15-
translateLabel,
15+
translateSlideCounter,
1616
useDocumentContext,
1717
useEventCallback,
1818
useLightboxProps,
@@ -79,29 +79,20 @@ export type ThumbnailProps = {
7979
slide: Slide | null;
8080
index: number;
8181
onClick: () => void;
82-
active: boolean;
8382
fadeIn?: FadeSettings;
8483
fadeOut?: FadeSettings;
8584
placeholder: boolean;
8685
onLoseFocus: () => void;
8786
};
8887

89-
export function Thumbnail({
90-
slide,
91-
index,
92-
onClick,
93-
active,
94-
fadeIn,
95-
fadeOut,
96-
placeholder,
97-
onLoseFocus,
98-
}: ThumbnailProps) {
88+
export function Thumbnail({ slide, index, onClick, fadeIn, fadeOut, placeholder, onLoseFocus }: ThumbnailProps) {
9989
const ref = React.useRef<HTMLButtonElement>(null);
10090
const { render, styles, labels } = useLightboxProps();
101-
const { slides, currentIndex } = useLightboxState();
91+
const { slides, globalIndex } = useLightboxState();
10292
const { getOwnerDocument } = useDocumentContext();
10393
const { width, height, imageFit } = useThumbnailsProps();
10494
const rect = { width, height };
95+
const active = index === globalIndex;
10596

10697
const onLoseFocusCallback = useEventCallback(onLoseFocus);
10798

@@ -111,10 +102,6 @@ export function Thumbnail({
111102
}
112103
}, [fadeOut, onLoseFocusCallback, getOwnerDocument]);
113104

114-
const thumbnailLabel = translateLabel(labels, "{{index}} of {{slidesLength}}")
115-
.replace("{{index}}", String(index + 1))
116-
.replace("{{slidesLength}}", String(slides.length));
117-
118105
return (
119106
<button
120107
ref={ref}
@@ -143,8 +130,8 @@ export function Thumbnail({
143130
...styles.thumbnail,
144131
}}
145132
onClick={onClick}
146-
aria-label={thumbnailLabel}
147-
aria-current={index === currentIndex ? true : undefined}
133+
aria-current={active ? true : undefined}
134+
aria-label={translateSlideCounter(labels, slides, index)}
148135
>
149136
{slide && renderThumbnail({ slide, render, rect, imageFit })}
150137
</button>

src/plugins/thumbnails/ThumbnailsTrack.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
cssClass,
1212
cssVar,
1313
getSlide,
14-
getSlideIndex,
1514
getSlideKey,
1615
hasSlides,
1716
Slide,
@@ -161,7 +160,6 @@ export function ThumbnailsTrack({ visible, containerRef }: ThumbnailsTrackProps)
161160
>
162161
<nav
163162
ref={track}
164-
role="navigation"
165163
style={styles.thumbnailsTrack}
166164
className={clsx(cssClass(cssPrefix("track")), cssClass(CLASS_FLEX_CENTER))}
167165
aria-label={translateLabel(labels, "Thumbnails")}
@@ -197,9 +195,8 @@ export function ThumbnailsTrack({ visible, containerRef }: ThumbnailsTrackProps)
197195
return (
198196
<Thumbnail
199197
key={key}
200-
index={getSlideIndex(index, slides.length)}
198+
index={index}
201199
slide={slide}
202-
active={index === globalIndex}
203200
fadeIn={fadeIn}
204201
fadeOut={fadeOut}
205202
placeholder={!slide}

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export interface ControllerSettings {
217217
/** @deprecated for internal use only */
218218
touchAction: "none" | "pan-y";
219219
// TODO v4: remove
220-
/** @deprecated describe the carousel for AT even if it is contained in a dialog */
220+
/** @deprecated for internal use only */
221221
aria: boolean;
222222
/** if `true`, close the lightbox on pull-up gesture */
223223
closeOnPullUp: boolean;

src/utils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ export function label(labels: Labels | undefined, defaultLabel: Label) {
4343
return translateLabel(labels, defaultLabel);
4444
}
4545

46+
export function translateSlideCounter(labels: Labels | undefined, slides: Slide[], index: number) {
47+
return translateLabel(labels, "{{index}} of {{slidesLength}}")
48+
.replace("{{index}}", String(getSlideIndex(index, slides.length) + 1))
49+
.replace("{{slidesLength}}", String(slides.length));
50+
}
51+
4652
export function cleanup(...cleaners: (() => void)[]) {
4753
return () => {
4854
cleaners.forEach((cleaner) => {

0 commit comments

Comments
 (0)