@page-speed/lightbox 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +244 -0
- package/dist/__mocks__/styleMock.d.ts +4 -0
- package/dist/components/Layouts/HorizontalLayout.d.ts +16 -0
- package/dist/components/Lightbox.d.ts +10 -0
- package/dist/components/LightboxChrome.d.ts +21 -0
- package/dist/components/LightboxContent.d.ts +13 -0
- package/dist/components/LightboxOverlay.d.ts +12 -0
- package/dist/components/index.css +99 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.js +21964 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +2033 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.js +2079 -0
- package/dist/hooks/useGalleryState.d.ts +14 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +1 -0
- package/dist/hooks/useLightbox.d.ts +20 -0
- package/dist/hooks/useLightboxState.d.ts +9 -0
- package/dist/hooks/useResponsiveness.d.ts +7 -0
- package/dist/index.cjs +22043 -0
- package/dist/index.css +99 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +22043 -0
- package/dist/renderers/ComponentRenderer.d.ts +9 -0
- package/dist/renderers/ImageRenderer.d.ts +14 -0
- package/dist/renderers/PDFRenderer.d.ts +11 -0
- package/dist/renderers/VideoRenderer.d.ts +13 -0
- package/dist/renderers/index.css +99 -0
- package/dist/renderers/index.d.ts +4 -0
- package/dist/renderers/index.js +21620 -0
- package/dist/types.d.ts +62 -0
- package/package.json +84 -0
package/README.md
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# @page-speed/lightbox
|
|
2
|
+
|
|
3
|
+
High‑performance, media‑rich lightbox for React, designed for the DashTrack / OpenSite ecosystem and the Semantic Site Builder engine.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`@page-speed/lightbox` renders images, videos, PDFs, and custom React components inside a responsive, keyboard‑friendly lightbox. It is built to be:
|
|
8
|
+
|
|
9
|
+
- **Fast** – small, tree‑shakable bundles with lazy loading for heavy dependencies (like the PDF viewer).
|
|
10
|
+
- **Composable** – separate layers for core hooks, components, and renderers.
|
|
11
|
+
- **Semantic‑engine ready** – easy to integrate into the Semantic Site Builder / Chai payload flow.
|
|
12
|
+
|
|
13
|
+
You can use it both inside the DashTrack platform and in standalone React apps.
|
|
14
|
+
|
|
15
|
+
## Key Features
|
|
16
|
+
|
|
17
|
+
- **Multiple media types**: `image`, `video`, `pdf`, and `component` (custom React content).
|
|
18
|
+
- **Responsive layouts**: chooses `fullscreen`, `vertical-split`, or `horizontal` layout based on viewport (overridable via props).
|
|
19
|
+
- **Keyboard & accessibility**: arrow‑key navigation, Escape to close, and ARIA‑friendly dialog structure.
|
|
20
|
+
- **Tree‑shakable exports**: granular subpaths for `core`, `hooks`, `components`, and `renderers`.
|
|
21
|
+
- **PDF support**: built‑in PDF rendering via `@page-speed/pdf-viewer`, lazily loaded only when needed.
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
The library has **React 18+** as a peer dependency and ships TypeScript typings out of the box.
|
|
26
|
+
|
|
27
|
+
### With pnpm (DashTrack default)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm add @page-speed/lightbox
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### With npm
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install @page-speed/lightbox
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### With yarn
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
yarn add @page-speed/lightbox
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Basic Usage (Controlled by Parent)
|
|
46
|
+
|
|
47
|
+
The `Lightbox` component is intentionally **controlled by mount/unmount**. You decide when it is shown by conditionally rendering it in your component.
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import { useState } from "react";
|
|
51
|
+
import { Lightbox, type LightboxItem } from "@page-speed/lightbox";
|
|
52
|
+
|
|
53
|
+
const items: LightboxItem[] = [
|
|
54
|
+
{ id: "1", type: "image", src: "/images/hero.jpg", alt: "Hero" },
|
|
55
|
+
{ id: "2", type: "video", src: "/videos/demo.mp4", title: "Demo" },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
export function Gallery() {
|
|
59
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
60
|
+
const [initialIndex, setInitialIndex] = useState(0);
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<>
|
|
64
|
+
<button
|
|
65
|
+
onClick={() => {
|
|
66
|
+
setInitialIndex(0);
|
|
67
|
+
setIsOpen(true);
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
Open gallery
|
|
71
|
+
</button>
|
|
72
|
+
|
|
73
|
+
{isOpen && (
|
|
74
|
+
<Lightbox
|
|
75
|
+
items={items}
|
|
76
|
+
initialIndex={initialIndex}
|
|
77
|
+
onClose={() => setIsOpen(false)}
|
|
78
|
+
/>
|
|
79
|
+
)}
|
|
80
|
+
</>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**How it works:**
|
|
86
|
+
|
|
87
|
+
- Clicking the button sets `isOpen` to `true`, which mounts the `<Lightbox />`.
|
|
88
|
+
- When the lightbox is mounted, it locks body scroll and calls `onOpen` (if provided).
|
|
89
|
+
- When you close the lightbox (via close button, overlay, or Escape), it calls `onClose`, and the parent should unmount it by toggling `isOpen`.
|
|
90
|
+
|
|
91
|
+
## Defining Lightbox Items
|
|
92
|
+
|
|
93
|
+
Items are strongly typed via `LightboxItem` and support different media strategies:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import type { LightboxItem } from "@page-speed/lightbox";
|
|
97
|
+
|
|
98
|
+
const items: LightboxItem[] = [
|
|
99
|
+
{ id: "img-1", type: "image", src: "/images/hero.jpg", alt: "Hero" },
|
|
100
|
+
{ id: "pdf-1", type: "pdf", src: "/docs/brochure.pdf", title: "Brochure" },
|
|
101
|
+
{
|
|
102
|
+
id: "component-1",
|
|
103
|
+
type: "component",
|
|
104
|
+
component: MyCustomSlide,
|
|
105
|
+
data: { heading: "Custom slide" },
|
|
106
|
+
},
|
|
107
|
+
];
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Key fields:
|
|
111
|
+
|
|
112
|
+
- `id: string` – unique per item.
|
|
113
|
+
- `type: "image" | "video" | "pdf" | "component"` – controls which renderer is used.
|
|
114
|
+
- `src?: string` – URL for image/video/PDF.
|
|
115
|
+
- `alt?: string` – alt text for images.
|
|
116
|
+
- `title?` / `caption?` – shown in the chrome/caption area when enabled.
|
|
117
|
+
- `component?: React.ComponentType<any>` – for `type: "component"`, your own React slide.
|
|
118
|
+
- `download?` / `share?` – optional download/share configuration.
|
|
119
|
+
|
|
120
|
+
## Lightbox Props (High‑Level)
|
|
121
|
+
|
|
122
|
+
The full `LightboxProps` type lives in `src/types.ts` and is exported from the package. The most commonly used props are:
|
|
123
|
+
|
|
124
|
+
- `items: LightboxItem[]` – **required** list of slides.
|
|
125
|
+
- `initialIndex?: number` – index of the item to show first.
|
|
126
|
+
- `layout?: "horizontal" | "vertical-split" | "custom-slide" | "fullscreen" | "inline"` – override automatic layout.
|
|
127
|
+
- `controls?: Partial<LightboxControls>` – enable/disable UI features.
|
|
128
|
+
- `height?: string | number` – e.g. `"80vh"`.
|
|
129
|
+
- `maxWidth?: string | number` – e.g. `"1200px"`.
|
|
130
|
+
- `className?`, `style?` – for wrapping container.
|
|
131
|
+
- `onOpen?`, `onClose?` – lifecycle callbacks.
|
|
132
|
+
- `onSelect?(index: number)` – called when the current index changes.
|
|
133
|
+
- `onNext?`, `onPrev?` – called on navigation.
|
|
134
|
+
- `enableKeyboardShortcuts?: boolean` – default `true`.
|
|
135
|
+
- `disableScroll?: boolean` – default `true` (locks body scroll while open).
|
|
136
|
+
- `closeOnBackdropClick?: boolean` – default `true`.
|
|
137
|
+
|
|
138
|
+
Example configuring layout and controls:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
<Lightbox
|
|
142
|
+
items={items}
|
|
143
|
+
layout="horizontal"
|
|
144
|
+
controls={{ navigation: true, keyboard: true, captions: true }}
|
|
145
|
+
onSelect={(index) => console.log("Selected index", index)}
|
|
146
|
+
/>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Hooks and Core API
|
|
150
|
+
|
|
151
|
+
For more advanced usage (especially inside the Semantic Site Builder), you can work directly with the hooks and core exports.
|
|
152
|
+
|
|
153
|
+
### `useLightbox` (core)
|
|
154
|
+
|
|
155
|
+
`useLightbox` composes gallery navigation and open/close state into a single hook. It is exported from both `@page-speed/lightbox` and `@page-speed/lightbox/core`.
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
import { useLightbox } from "@page-speed/lightbox/core";
|
|
159
|
+
|
|
160
|
+
const lb = useLightbox({ items, onSelect: (i) => console.log(i) });
|
|
161
|
+
|
|
162
|
+
// lb: { isOpen, open, close, currentIndex, currentItem, next, prev, canNext, canPrev, goTo, items }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
You can build your own UI around this hook if you need something different from the default `<Lightbox />` shell.
|
|
166
|
+
|
|
167
|
+
### Hooks Subpath
|
|
168
|
+
|
|
169
|
+
The `hooks` subpath provides granular imports for tree‑shaking:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
import { useGalleryState, useResponsiveness } from "@page-speed/lightbox/hooks";
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Available hooks:
|
|
176
|
+
|
|
177
|
+
- `useGalleryState` – navigation state for a list of `LightboxItem`s.
|
|
178
|
+
- `useLightboxState` – open/close + scroll locking.
|
|
179
|
+
- `useLightbox` – composed lightbox controller.
|
|
180
|
+
- `useKeyboardShortcuts` – attach keyboard handlers.
|
|
181
|
+
- `useResponsiveness` – responsive breakpoint info.
|
|
182
|
+
|
|
183
|
+
## Components and Renderers
|
|
184
|
+
|
|
185
|
+
You can import the building blocks individually when constructing custom UIs or integrating into block registries.
|
|
186
|
+
|
|
187
|
+
### Components
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
import {
|
|
191
|
+
Lightbox,
|
|
192
|
+
LightboxOverlay,
|
|
193
|
+
LightboxContent,
|
|
194
|
+
LightboxChrome,
|
|
195
|
+
HorizontalLayout,
|
|
196
|
+
} from "@page-speed/lightbox/components";
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Renderers
|
|
200
|
+
|
|
201
|
+
```ts
|
|
202
|
+
import {
|
|
203
|
+
ImageRenderer,
|
|
204
|
+
VideoRenderer,
|
|
205
|
+
PDFRenderer,
|
|
206
|
+
ComponentRenderer,
|
|
207
|
+
} from "@page-speed/lightbox/renderers";
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
These renderers are what `LightboxContent` uses under the hood for each `LightboxItem.type`.
|
|
211
|
+
|
|
212
|
+
## Integration Notes for Semantic Site Builder
|
|
213
|
+
|
|
214
|
+
- Treat `items: LightboxItem[]` as the **projection of your Chai/semantic payload** for a gallery block.
|
|
215
|
+
- Use the **controlled mounting pattern**: the builder decides when to show a lightbox by mounting `<Lightbox />` with the appropriate `items` and `initialIndex`.
|
|
216
|
+
- For full control or custom block shells, prefer `useLightbox` from `@page-speed/lightbox/core` and wire it into your block registry.
|
|
217
|
+
|
|
218
|
+
See `dev-docs/lightbox-implementation-guide.md` and `dev-docs/SEMANTIC_SITE_BUILDER.md` in this repo for deeper, platform‑specific details.
|
|
219
|
+
|
|
220
|
+
## Performance Notes
|
|
221
|
+
|
|
222
|
+
- Heavy dependencies like the PDF viewer are **lazy‑loaded**, so including support for PDFs does not impact the initial bundle significantly.
|
|
223
|
+
- The module exports are **tree‑shakable**, especially when using the subpaths (`/core`, `/hooks`, `/components`, `/renderers`).
|
|
224
|
+
- The lightbox locks body scroll while open to reduce layout shift and improve perceived stability.
|
|
225
|
+
|
|
226
|
+
For broader ecosystem performance guidelines, see `dev-docs/ECOSYSTEM_GUIDELINES.md`.
|
|
227
|
+
|
|
228
|
+
## Contributing
|
|
229
|
+
|
|
230
|
+
Contributions are welcome. Please open issues or pull requests on the GitHub repo:
|
|
231
|
+
|
|
232
|
+
- Repository: <https://github.com/opensite-ai/page-speed-lightbox>
|
|
233
|
+
|
|
234
|
+
Follow the existing code style, add tests for new behavior, and ensure `pnpm test`, `pnpm run type-check`, and `pnpm run build` all pass before submitting.
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
This project is licensed under the MIT License. See the `LICENSE` file for details.
|
|
239
|
+
|
|
240
|
+
## Related Projects
|
|
241
|
+
|
|
242
|
+
- [@page-speed/pdf-viewer](https://github.com/opensite-ai/page-speed-pdf-viewer) – PDF viewer used internally by the lightbox.
|
|
243
|
+
- [Page Speed Hooks](https://github.com/opensite-ai/page-speed-hooks) – hooks for optimizing page load behavior.
|
|
244
|
+
- [OpenSite AI](https://opensite.ai) – more about the platform and ecosystem.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface HorizontalLayoutProps {
|
|
3
|
+
content: React.ReactNode;
|
|
4
|
+
chrome: React.ReactNode;
|
|
5
|
+
height?: string | number;
|
|
6
|
+
maxWidth?: string | number;
|
|
7
|
+
className?: string;
|
|
8
|
+
style?: React.CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Default desktop layout: primary content area with chrome and optional
|
|
12
|
+
* thumbnails below. For v1 we only implement the main content + chrome
|
|
13
|
+
* region; thumbnails can be added later as a non-breaking enhancement.
|
|
14
|
+
*/
|
|
15
|
+
export declare function HorizontalLayout({ content, chrome, height, maxWidth, className, style, }: HorizontalLayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LightboxProps } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Main Lightbox component.
|
|
4
|
+
*
|
|
5
|
+
* This component is intentionally controlled from the outside: it renders
|
|
6
|
+
* whenever it is mounted, and callers decide when to mount/unmount it.
|
|
7
|
+
* That keeps it easy to integrate into the Semantic Site Builder while
|
|
8
|
+
* still providing strong defaults for keyboard and scroll handling.
|
|
9
|
+
*/
|
|
10
|
+
export declare function Lightbox(props: LightboxProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LightboxControls, LightboxItem } from "../types";
|
|
2
|
+
interface LightboxChromeProps {
|
|
3
|
+
currentIndex: number;
|
|
4
|
+
totalItems: number;
|
|
5
|
+
currentItem: LightboxItem | null;
|
|
6
|
+
canNext: boolean;
|
|
7
|
+
canPrev: boolean;
|
|
8
|
+
controls?: Partial<LightboxControls>;
|
|
9
|
+
onNext: () => void;
|
|
10
|
+
onPrev: () => void;
|
|
11
|
+
onClose?: () => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Toolbar / chrome shown above or below the main content.
|
|
15
|
+
*
|
|
16
|
+
* For v1 this focuses on navigation, close button, basic captions, and
|
|
17
|
+
* counter. More advanced controls (share, download, fullscreen) can be
|
|
18
|
+
* layered in later without breaking the API.
|
|
19
|
+
*/
|
|
20
|
+
export declare function LightboxChrome({ currentIndex, totalItems, currentItem, canNext, canPrev, controls, onNext, onPrev, onClose, }: LightboxChromeProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LightboxItem, LightboxLayoutType } from "../types";
|
|
2
|
+
interface LightboxContentProps {
|
|
3
|
+
item: LightboxItem | null;
|
|
4
|
+
layout: LightboxLayoutType;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Dispatches to the appropriate renderer based on the LightboxItem type.
|
|
8
|
+
*
|
|
9
|
+
* This component stays very small so individual renderers can be
|
|
10
|
+
* tree-shaken and swapped out by the Semantic UI engine if needed.
|
|
11
|
+
*/
|
|
12
|
+
export declare function LightboxContent({ item, layout }: LightboxContentProps): import("react/jsx-runtime").JSX.Element | null;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface LightboxOverlayProps {
|
|
2
|
+
onClose?: () => void;
|
|
3
|
+
closeOnBackdropClick?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Full-screen dark overlay that sits behind the lightbox content.
|
|
7
|
+
*
|
|
8
|
+
* Kept intentionally minimal so it works well with the Semantic Site
|
|
9
|
+
* Builder and external layout containers.
|
|
10
|
+
*/
|
|
11
|
+
export declare function LightboxOverlay({ onClose, closeOnBackdropClick, }: LightboxOverlayProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* src/styles/Lightbox.module.css */
|
|
2
|
+
.Lightbox_lightboxPortal3 {
|
|
3
|
+
position: fixed;
|
|
4
|
+
inset: 0;
|
|
5
|
+
z-index: 1000;
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
}
|
|
10
|
+
.Lightbox_overlay3 {
|
|
11
|
+
position: fixed;
|
|
12
|
+
inset: 0;
|
|
13
|
+
background: var(--lightbox-overlay, rgba(0, 0, 0, 0.85));
|
|
14
|
+
}
|
|
15
|
+
.Lightbox_horizontalLayoutRoot3 {
|
|
16
|
+
position: relative;
|
|
17
|
+
max-width: var(--lightbox-max-width, 90vw);
|
|
18
|
+
width: 100%;
|
|
19
|
+
padding: var(--lightbox-padding, 24px);
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
}
|
|
22
|
+
.Lightbox_horizontalLayoutContainer3 {
|
|
23
|
+
position: relative;
|
|
24
|
+
background: var(--lightbox-modal-bg, #111);
|
|
25
|
+
color: var(--lightbox-text, #fff);
|
|
26
|
+
border-radius: var(--lightbox-radius, 12px);
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
}
|
|
31
|
+
.Lightbox_mainContent3 {
|
|
32
|
+
flex: 1;
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
background: var(--lightbox-content-bg, #000);
|
|
37
|
+
}
|
|
38
|
+
.Lightbox_toolbar3 {
|
|
39
|
+
border-top: 1px solid var(--lightbox-border, rgba(255, 255, 255, 0.1));
|
|
40
|
+
}
|
|
41
|
+
.Lightbox_media3 {
|
|
42
|
+
max-width: 100%;
|
|
43
|
+
max-height: 80vh;
|
|
44
|
+
object-fit: contain;
|
|
45
|
+
}
|
|
46
|
+
.Lightbox_chrome3 {
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
justify-content: space-between;
|
|
50
|
+
padding: 8px 12px;
|
|
51
|
+
background: var(--lightbox-toolbar, rgba(0, 0, 0, 0.5));
|
|
52
|
+
}
|
|
53
|
+
.Lightbox_chromeSection3 {
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
gap: 8px;
|
|
57
|
+
}
|
|
58
|
+
.Lightbox_navButton3,
|
|
59
|
+
.Lightbox_closeButton3 {
|
|
60
|
+
border: none;
|
|
61
|
+
border-radius: 999px;
|
|
62
|
+
padding: 6px 10px;
|
|
63
|
+
background: rgba(255, 255, 255, 0.08);
|
|
64
|
+
color: inherit;
|
|
65
|
+
cursor: pointer;
|
|
66
|
+
}
|
|
67
|
+
.Lightbox_navButton3:disabled {
|
|
68
|
+
opacity: 0.4;
|
|
69
|
+
cursor: default;
|
|
70
|
+
}
|
|
71
|
+
.Lightbox_counter3 {
|
|
72
|
+
font-size: 12px;
|
|
73
|
+
opacity: 0.85;
|
|
74
|
+
}
|
|
75
|
+
.Lightbox_captionContainer3 {
|
|
76
|
+
display: flex;
|
|
77
|
+
flex-direction: column;
|
|
78
|
+
}
|
|
79
|
+
.Lightbox_captionTitle3 {
|
|
80
|
+
font-size: 14px;
|
|
81
|
+
font-weight: 600;
|
|
82
|
+
}
|
|
83
|
+
.Lightbox_captionText3 {
|
|
84
|
+
font-size: 12px;
|
|
85
|
+
opacity: 0.85;
|
|
86
|
+
}
|
|
87
|
+
.Lightbox_pdfContainer3 {
|
|
88
|
+
width: 100%;
|
|
89
|
+
height: 80vh;
|
|
90
|
+
background: #111;
|
|
91
|
+
}
|
|
92
|
+
.Lightbox_pdfFallback3 {
|
|
93
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
justify-content: center;
|
|
96
|
+
width: 100%;
|
|
97
|
+
height: 100%;
|
|
98
|
+
color: var(--lightbox-text-muted, rgba(255, 255, 255, 0.7));
|
|
99
|
+
}
|