@teamimpact/veda-ui-blocks 0.1.0-beta.13 → 0.1.0-beta.14

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/dist/index.js CHANGED
@@ -103,74 +103,9 @@ var DEFAULT_EXPANDED_CONTENT_JSX = /* @__PURE__ */ jsxs("div", { className: "blo
103
103
  ] })
104
104
  ] });
105
105
 
106
- // src/components/Cards/Card/Card.tsx
107
- import { Icon as Icon2 } from "@trussworks/react-uswds";
108
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
109
- function Card({
110
- tag,
111
- title,
112
- description,
113
- subtitle,
114
- callToAction,
115
- callToActionSecondary,
116
- image,
117
- imagePosition = "cover",
118
- colorMode = "light",
119
- isMastHead = false,
120
- className,
121
- children
122
- }) {
123
- const rootClassName = make_class_name("blocks-card", [
124
- imagePosition === "left" ? "blocks-card--image-left" : imagePosition === "right" ? "blocks-card--image-right" : void 0,
125
- colorMode === "dark" ? "blocks-card--dark" : colorMode === "brand" ? "blocks-card--brand" : void 0,
126
- isMastHead ? "blocks-card--mast-head" : void 0,
127
- className
128
- ]);
129
- const hasContent = tag || title || subtitle || description || callToAction || callToActionSecondary;
130
- return /* @__PURE__ */ jsxs2("div", { className: rootClassName, children: [
131
- imagePosition === "cover" && /* @__PURE__ */ jsx2("div", { className: "blocks-card__media", children: image }),
132
- /* @__PURE__ */ jsxs2("div", { className: "blocks-card__content-container", children: [
133
- imagePosition !== "cover" && /* @__PURE__ */ jsx2("div", { className: "blocks-card__media", children: image }),
134
- hasContent && /* @__PURE__ */ jsxs2("div", { className: "blocks-card__content", children: [
135
- tag && /* @__PURE__ */ jsx2("div", { className: "blocks-card__tag", children: tag }),
136
- title && (typeof title === "string" ? /* @__PURE__ */ jsx2("h2", { className: "blocks-card__title", children: title }) : title),
137
- subtitle && /* @__PURE__ */ jsx2("div", { className: "blocks-card__subtitle", children: subtitle }),
138
- description && /* @__PURE__ */ jsx2("p", { className: "blocks-card__description", children: description }),
139
- (callToAction || callToActionSecondary) && /* @__PURE__ */ jsxs2("div", { className: "blocks-card__actions", children: [
140
- callToAction && /* @__PURE__ */ jsxs2(
141
- "a",
142
- {
143
- href: callToAction.href,
144
- className: "usa-button",
145
- ...get_external_anchor_props(callToAction.isExternal),
146
- children: [
147
- callToAction.label,
148
- callToAction.isExternal && /* @__PURE__ */ jsx2(Icon2.Launch, { "aria-hidden": true, focusable: false, size: 3 })
149
- ]
150
- }
151
- ),
152
- callToActionSecondary && /* @__PURE__ */ jsxs2(
153
- "a",
154
- {
155
- href: callToActionSecondary.href,
156
- className: "usa-button usa-button--outline",
157
- ...get_external_anchor_props(callToActionSecondary.isExternal),
158
- children: [
159
- callToActionSecondary.label,
160
- callToActionSecondary.isExternal && /* @__PURE__ */ jsx2(Icon2.Launch, { "aria-hidden": true, focusable: false, size: 3 })
161
- ]
162
- }
163
- )
164
- ] })
165
- ] })
166
- ] }),
167
- children && /* @__PURE__ */ jsx2("div", { className: "blocks-card__children", children })
168
- ] });
169
- }
170
-
171
106
  // src/components/icons/ArrowIcon.tsx
172
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
173
- var ArrowIcon = () => /* @__PURE__ */ jsxs3(
107
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
108
+ var ArrowIcon = () => /* @__PURE__ */ jsxs2(
174
109
  "svg",
175
110
  {
176
111
  width: "20",
@@ -180,8 +115,8 @@ var ArrowIcon = () => /* @__PURE__ */ jsxs3(
180
115
  preserveAspectRatio: "xMidYMid meet",
181
116
  "aria-hidden": "true",
182
117
  children: [
183
- /* @__PURE__ */ jsx3("circle", { cx: "10", cy: "10", r: "10", fill: "currentColor" }),
184
- /* @__PURE__ */ jsx3("g", { transform: "translate(5.333, 5.333)", children: /* @__PURE__ */ jsx3(
118
+ /* @__PURE__ */ jsx2("circle", { cx: "10", cy: "10", r: "10", fill: "currentColor" }),
119
+ /* @__PURE__ */ jsx2("g", { transform: "translate(5.333, 5.333)", children: /* @__PURE__ */ jsx2(
185
120
  "path",
186
121
  {
187
122
  fillRule: "evenodd",
@@ -194,36 +129,188 @@ var ArrowIcon = () => /* @__PURE__ */ jsxs3(
194
129
  }
195
130
  );
196
131
 
132
+ // src/components/Link/AsLink.tsx
133
+ import { jsx as jsx3 } from "react/jsx-runtime";
134
+ function AsLink({
135
+ as,
136
+ isExternal,
137
+ children,
138
+ ...rest
139
+ }) {
140
+ const Component = as ?? "a";
141
+ return /* @__PURE__ */ jsx3(
142
+ Component,
143
+ {
144
+ ...rest,
145
+ ...typeof as !== "string" || as === "a" ? get_external_anchor_props(isExternal) : {},
146
+ children
147
+ }
148
+ );
149
+ }
150
+
151
+ // src/components/Link/Link.tsx
152
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
153
+ function Link({
154
+ variant = "text",
155
+ size = "md",
156
+ isExternal,
157
+ className,
158
+ as,
159
+ children,
160
+ ...rest
161
+ }) {
162
+ const rootClassName = make_class_name("blocks-link", [
163
+ `blocks-link--${variant}`,
164
+ variant === "button" || variant === "button-outline" ? "usa-button" : void 0,
165
+ variant === "button-outline" ? "usa-button--outline" : void 0,
166
+ variant === "text" ? "usa-button--unstyled" : void 0,
167
+ `blocks-link--${size}`,
168
+ isExternal ? "blocks-link--external usa-link--external" : void 0,
169
+ className
170
+ ]);
171
+ const props = {
172
+ className: rootClassName,
173
+ as,
174
+ isExternal,
175
+ ...rest
176
+ };
177
+ return /* @__PURE__ */ jsxs3(AsLink, { ...props, children: [
178
+ children,
179
+ variant === "arrow" && /* @__PURE__ */ jsx4(ArrowIcon, {})
180
+ ] });
181
+ }
182
+
183
+ // src/components/Cards/Card/Card.tsx
184
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
185
+ function Card(props) {
186
+ const {
187
+ tag,
188
+ title,
189
+ description,
190
+ subtitle,
191
+ callToAction,
192
+ callToActionSecondary,
193
+ image,
194
+ imagePosition = "cover",
195
+ colorMode = "light",
196
+ isMastHead = false,
197
+ className,
198
+ children
199
+ } = props;
200
+ const {
201
+ label: callToActionLabel,
202
+ variant: callToActionVariant = "button",
203
+ ...callToActionProps
204
+ } = callToAction ?? {};
205
+ const {
206
+ label: callToActionSecondaryLabel,
207
+ variant: callToActionSecondaryVariant = "button-outline",
208
+ ...callToActionSecondaryProps
209
+ } = callToActionSecondary ?? {};
210
+ const rootClassName = make_class_name("blocks-card", [
211
+ imagePosition === "left" ? "blocks-card--image-left" : imagePosition === "right" ? "blocks-card--image-right" : void 0,
212
+ colorMode === "dark" ? "blocks-card--dark" : colorMode === "brand" ? "blocks-card--brand" : void 0,
213
+ isMastHead ? "blocks-card--mast-head" : void 0,
214
+ className
215
+ ]);
216
+ const hasContent = tag || title || subtitle || description || callToAction || callToActionSecondary;
217
+ return /* @__PURE__ */ jsxs4("div", { className: rootClassName, children: [
218
+ imagePosition === "cover" && /* @__PURE__ */ jsx5("div", { className: "blocks-card__media", children: image }),
219
+ /* @__PURE__ */ jsxs4("div", { className: "blocks-card__content-container", children: [
220
+ imagePosition !== "cover" && /* @__PURE__ */ jsx5("div", { className: "blocks-card__media", children: image }),
221
+ hasContent && /* @__PURE__ */ jsxs4("div", { className: "blocks-card__content", children: [
222
+ tag && /* @__PURE__ */ jsx5("div", { className: "blocks-card__tag", children: tag }),
223
+ title && (typeof title === "string" ? /* @__PURE__ */ jsx5("h2", { className: "blocks-card__title", children: title }) : title),
224
+ subtitle && /* @__PURE__ */ jsx5("div", { className: "blocks-card__subtitle", children: subtitle }),
225
+ description && /* @__PURE__ */ jsx5("p", { className: "blocks-card__description", children: description }),
226
+ (callToAction || callToActionSecondary) && /* @__PURE__ */ jsxs4("div", { className: "blocks-card__actions", children: [
227
+ callToAction && /* @__PURE__ */ jsx5(
228
+ Link,
229
+ {
230
+ ...{
231
+ ...callToActionProps,
232
+ variant: callToActionVariant,
233
+ children: callToActionLabel
234
+ // TypeScript cannot verify that spread props for callToAction satisfy Omit<ComponentPropsWithRef<T>, "as">
235
+ // for an unconstrained generic T. Cast through unknown preserves T so callers still get
236
+ // accurate prop checking (e.g. href only valid when as="a").
237
+ // TypeScript cannot verify generics when props are spread and generics must be inferred
238
+ // For accurate prop checking, all props need to be explicitly defined
239
+ // ex. ❌ <Card {...props} callToAction={...callToActionProps} /> vs ✅ <Card {...props} callToAction={{label: "text", href="/", as: "a"}} />
240
+ }
241
+ }
242
+ ),
243
+ callToActionSecondary && /* @__PURE__ */ jsx5(
244
+ Link,
245
+ {
246
+ ...{
247
+ ...callToActionSecondaryProps,
248
+ variant: callToActionSecondaryVariant,
249
+ children: callToActionSecondaryLabel
250
+ // See typescript warning above
251
+ }
252
+ }
253
+ )
254
+ ] })
255
+ ] })
256
+ ] }),
257
+ children && /* @__PURE__ */ jsx5("div", { className: "blocks-card__children", children })
258
+ ] });
259
+ }
260
+
197
261
  // src/components/Cards/CardCTA/CardCTA.tsx
198
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
262
+ import { useState as useState2 } from "react";
263
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
199
264
  function CardCTA({
200
265
  title,
201
- url,
266
+ titleAs = "h2",
202
267
  description,
203
268
  accentColor,
204
- titleAs = "h2",
205
269
  className,
206
270
  style,
271
+ isExternal,
272
+ as,
207
273
  ...rest
208
274
  }) {
209
- const TitleTag = titleAs;
210
275
  const rootClassName = make_class_name("blocks-card-cta", [
211
276
  !description ? "blocks-card-cta--without-description" : void 0,
212
277
  className
213
278
  ]);
214
279
  const accentColorStyle = accentColor ? { "--blocks-card-cta-custom-accent-color": accentColor } : void 0;
215
- return /* @__PURE__ */ jsx4("a", { href: url, className: rootClassName, style: { ...accentColorStyle, ...style }, ...rest, children: /* @__PURE__ */ jsxs4("div", { className: "blocks-card-cta__body", children: [
216
- /* @__PURE__ */ jsxs4(TitleTag, { className: "blocks-card-cta__title", title, children: [
217
- title,
218
- /* @__PURE__ */ jsx4("span", { className: "blocks-card-cta__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx4(ArrowIcon, {}) })
219
- ] }),
220
- description && /* @__PURE__ */ jsx4("p", { className: "blocks-card-cta__description", children: description })
221
- ] }) });
280
+ const [isHovered, setIsHovered] = useState2(false);
281
+ const props = {
282
+ className: rootClassName,
283
+ style: { ...accentColorStyle, ...style },
284
+ as,
285
+ isExternal,
286
+ ...rest
287
+ };
288
+ return /* @__PURE__ */ jsx6(
289
+ AsLink,
290
+ {
291
+ ...props,
292
+ onMouseEnter: () => setIsHovered(true),
293
+ onMouseLeave: () => setIsHovered(false),
294
+ children: /* @__PURE__ */ jsxs5("div", { className: "blocks-card-cta__body", children: [
295
+ /* @__PURE__ */ jsx6(
296
+ Link,
297
+ {
298
+ as: titleAs,
299
+ className: `blocks-card-cta__title ${isHovered ? "usa-button--hover" : ""}`,
300
+ isExternal,
301
+ size: "lg",
302
+ variant: "arrow",
303
+ children: title
304
+ }
305
+ ),
306
+ description && /* @__PURE__ */ jsx6("p", { className: "blocks-card-cta__description", children: description })
307
+ ] })
308
+ }
309
+ );
222
310
  }
223
311
 
224
312
  // src/components/Cards/CardDetailed/CardDetailed.tsx
225
- import { Icon as Icon3 } from "@trussworks/react-uswds";
226
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
313
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
227
314
  function CardDetailed({
228
315
  intro,
229
316
  title,
@@ -236,44 +323,57 @@ function CardDetailed({
236
323
  imagePosition = "top",
237
324
  className = ""
238
325
  }) {
326
+ const {
327
+ label: callToActionLabel,
328
+ variant: callToActionVariant = "button",
329
+ ...callToActionProps
330
+ } = callToAction ?? {};
331
+ const {
332
+ label: callToActionSecondaryLabel,
333
+ variant: callToActionSecondaryVariant = "button-outline",
334
+ ...callToActionSecondaryProps
335
+ } = callToActionSecondary ?? {};
239
336
  const rootClassName = make_class_name("blocks-card-detailed", [
240
337
  imagePosition !== "top" ? `blocks-card-detailed--image-${imagePosition}` : "",
241
338
  className
242
339
  ]);
243
340
  const hasContent = intro || title || description || tags.length || callToAction || callToActionSecondary;
244
- return /* @__PURE__ */ jsxs5("div", { className: rootClassName, children: [
245
- /* @__PURE__ */ jsxs5("div", { className: "blocks-card-detailed__media", children: [
341
+ return /* @__PURE__ */ jsxs6("div", { className: rootClassName, children: [
342
+ /* @__PURE__ */ jsxs6("div", { className: "blocks-card-detailed__media", children: [
246
343
  image,
247
- tagPrimary && /* @__PURE__ */ jsx5("div", { className: "blocks-card-detailed__tag-primary", children: tagPrimary })
344
+ tagPrimary && /* @__PURE__ */ jsx7("div", { className: "blocks-card-detailed__tag-primary", children: tagPrimary })
248
345
  ] }),
249
- hasContent && /* @__PURE__ */ jsxs5("div", { className: "blocks-card-detailed__content-container", children: [
250
- intro && /* @__PURE__ */ jsx5("div", { className: "blocks-card-detailed__intro", title: intro, children: intro }),
251
- title && (typeof title === "string" ? /* @__PURE__ */ jsx5("h2", { className: "blocks-card-detailed__title", title, children: title }) : title),
252
- isNonEmptyArray(tags) && /* @__PURE__ */ jsx5("div", { className: "blocks-card-detailed__tags", children: tags }),
253
- description && /* @__PURE__ */ jsx5("p", { className: "blocks-card-detailed__description", children: description }),
254
- (callToAction || callToActionSecondary) && /* @__PURE__ */ jsxs5("div", { className: "blocks-card-detailed__actions", children: [
255
- callToAction && /* @__PURE__ */ jsxs5(
256
- "a",
346
+ hasContent && /* @__PURE__ */ jsxs6("div", { className: "blocks-card-detailed__content-container", children: [
347
+ intro && /* @__PURE__ */ jsx7("div", { className: "blocks-card-detailed__intro", title: intro, children: intro }),
348
+ title && (typeof title === "string" ? /* @__PURE__ */ jsx7("h2", { className: "blocks-card-detailed__title", title, children: title }) : title),
349
+ isNonEmptyArray(tags) && /* @__PURE__ */ jsx7("div", { className: "blocks-card-detailed__tags", children: tags }),
350
+ description && /* @__PURE__ */ jsx7("p", { className: "blocks-card-detailed__description", children: description }),
351
+ (callToAction || callToActionSecondary) && /* @__PURE__ */ jsxs6("div", { className: "blocks-card-detailed__actions", children: [
352
+ callToAction && /* @__PURE__ */ jsx7(
353
+ Link,
257
354
  {
258
- href: callToAction.href,
259
- className: "usa-button",
260
- ...get_external_anchor_props(callToAction.isExternal),
261
- children: [
262
- callToAction.label,
263
- callToAction.isExternal && /* @__PURE__ */ jsx5(Icon3.Launch, { "aria-hidden": true, focusable: false, size: 3 })
264
- ]
355
+ ...{
356
+ ...callToActionProps,
357
+ variant: callToActionVariant,
358
+ children: callToActionLabel
359
+ // TypeScript cannot verify that spread props for callToAction satisfy Omit<ComponentPropsWithRef<T>, "as">
360
+ // for an unconstrained generic T. Cast through unknown preserves T so callers still get
361
+ // accurate prop checking (e.g. href only valid when as="a").
362
+ // TypeScript cannot verify generics when props are spread and generics must be inferred
363
+ // For accurate prop checking, all props need to be explicitly defined
364
+ // ex. ❌ <CardDetailed {...props} callToAction={...callToActionProps} /> vs ✅ <CardDetailed {...props} callToAction={{label: "text", href="/", as: "a"}} />
365
+ }
265
366
  }
266
367
  ),
267
- callToActionSecondary && /* @__PURE__ */ jsxs5(
268
- "a",
368
+ callToActionSecondary && /* @__PURE__ */ jsx7(
369
+ Link,
269
370
  {
270
- href: callToActionSecondary.href,
271
- className: "usa-button usa-button--outline",
272
- ...get_external_anchor_props(callToActionSecondary.isExternal),
273
- children: [
274
- callToActionSecondary.label,
275
- callToActionSecondary.isExternal && /* @__PURE__ */ jsx5(Icon3.Launch, { "aria-hidden": true, focusable: false, size: 3 })
276
- ]
371
+ ...{
372
+ ...callToActionSecondaryProps,
373
+ variant: callToActionSecondaryVariant,
374
+ children: callToActionSecondaryLabel
375
+ // See typescript warning above
376
+ }
277
377
  }
278
378
  )
279
379
  ] })
@@ -282,34 +382,52 @@ function CardDetailed({
282
382
  }
283
383
 
284
384
  // src/components/Cards/CardMini/CardMini.tsx
285
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
286
- function CardMini({ image, title, url, tag, titleAs = "h2", className }) {
385
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
386
+ function CardMini({
387
+ image,
388
+ title,
389
+ titleAs = "h2",
390
+ tag,
391
+ className,
392
+ isExternal,
393
+ as,
394
+ ...rest
395
+ }) {
287
396
  const TitleTag = titleAs;
288
- const hasTag = Boolean(tag);
289
397
  const rootClassName = make_class_name("blocks-card-mini", [
290
- hasTag ? "blocks-card-mini--with-tag" : void 0,
398
+ isDefined(tag) ? "blocks-card-mini--with-tag" : void 0,
291
399
  className
292
400
  ]);
293
- return /* @__PURE__ */ jsxs6("a", { href: url, className: rootClassName, children: [
294
- /* @__PURE__ */ jsx6("div", { className: "blocks-card-mini__image", children: image }),
295
- /* @__PURE__ */ jsxs6("div", { className: "blocks-card-mini__body", children: [
296
- /* @__PURE__ */ jsx6(TitleTag, { className: "blocks-card-mini__title", title, children: title }),
297
- tag && /* @__PURE__ */ jsx6("div", { className: "blocks-card-mini__tag", children: tag })
401
+ const titleClassName = make_class_name("blocks-card-mini__title", [
402
+ isExternal ? "usa-link--external" : void 0
403
+ ]);
404
+ const props = {
405
+ className: rootClassName,
406
+ as,
407
+ isExternal,
408
+ ...rest
409
+ };
410
+ return /* @__PURE__ */ jsxs7(AsLink, { ...props, children: [
411
+ /* @__PURE__ */ jsx8("div", { className: "blocks-card-mini__image", children: image }),
412
+ /* @__PURE__ */ jsxs7("div", { className: "blocks-card-mini__body", children: [
413
+ /* @__PURE__ */ jsx8(TitleTag, { className: titleClassName, title, children: title }),
414
+ tag && /* @__PURE__ */ jsx8("div", { className: "blocks-card-mini__tag", children: tag })
298
415
  ] })
299
416
  ] });
300
417
  }
301
418
 
302
419
  // src/components/Cards/CardSimple/CardSimple.tsx
303
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
420
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
304
421
  function CardSimple({
305
- title,
306
422
  image,
307
- url,
308
- isExternal,
423
+ title,
424
+ titleAs = "h2",
309
425
  tag,
310
426
  size = "default",
311
- titleAs = "h2",
312
- className
427
+ className,
428
+ isExternal,
429
+ as,
430
+ ...rest
313
431
  }) {
314
432
  const TitleTag = titleAs;
315
433
  const rootClassName = make_class_name("blocks-card-simple", [
@@ -319,21 +437,290 @@ function CardSimple({
319
437
  const titleClassName = make_class_name("blocks-card-simple__title", [
320
438
  isExternal ? "usa-link--external" : void 0
321
439
  ]);
322
- return /* @__PURE__ */ jsxs7("a", { href: url, className: rootClassName, ...get_external_anchor_props(isExternal), children: [
323
- /* @__PURE__ */ jsxs7("div", { className: "blocks-card-simple__media", children: [
440
+ const props = {
441
+ className: rootClassName,
442
+ as,
443
+ isExternal,
444
+ ...rest
445
+ };
446
+ return /* @__PURE__ */ jsxs8(AsLink, { ...props, children: [
447
+ /* @__PURE__ */ jsxs8("div", { className: "blocks-card-simple__media", children: [
324
448
  image,
325
- /* @__PURE__ */ jsx7("div", { className: "blocks-card-simple__overlay", "aria-hidden": "true" })
449
+ /* @__PURE__ */ jsx9("div", { className: "blocks-card-simple__overlay", "aria-hidden": "true" })
326
450
  ] }),
327
- /* @__PURE__ */ jsxs7("div", { className: "blocks-card-simple__body", children: [
328
- tag && /* @__PURE__ */ jsx7("div", { className: "blocks-card-simple__tag", children: tag }),
329
- /* @__PURE__ */ jsx7(TitleTag, { className: titleClassName, children: title })
451
+ /* @__PURE__ */ jsxs8("div", { className: "blocks-card-simple__body", children: [
452
+ tag && /* @__PURE__ */ jsx9("div", { className: "blocks-card-simple__tag", children: tag }),
453
+ /* @__PURE__ */ jsx9(TitleTag, { className: titleClassName, children: title })
330
454
  ] })
331
455
  ] });
332
456
  }
333
457
 
458
+ // src/components/Carousel/Carousel.tsx
459
+ import useEmblaCarousel from "embla-carousel-react";
460
+ import { useCallback, useEffect, useState as useState3 } from "react";
461
+
462
+ // src/components/icons/NavigateBeforeIcon.tsx
463
+ import { jsx as jsx10 } from "react/jsx-runtime";
464
+ var NavigateBeforeIcon = () => /* @__PURE__ */ jsx10(
465
+ "svg",
466
+ {
467
+ xmlns: "http://www.w3.org/2000/svg",
468
+ width: "24",
469
+ height: "24",
470
+ viewBox: "0 0 24 24",
471
+ "aria-hidden": "true",
472
+ focusable: "false",
473
+ role: "img",
474
+ children: /* @__PURE__ */ jsx10("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" })
475
+ }
476
+ );
477
+
478
+ // src/components/icons/NavigateNextIcon.tsx
479
+ import { jsx as jsx11 } from "react/jsx-runtime";
480
+ var NavigateNextIcon = () => /* @__PURE__ */ jsx11(
481
+ "svg",
482
+ {
483
+ xmlns: "http://www.w3.org/2000/svg",
484
+ width: "24",
485
+ height: "24",
486
+ viewBox: "0 0 24 24",
487
+ "aria-hidden": "true",
488
+ focusable: "false",
489
+ role: "img",
490
+ children: /* @__PURE__ */ jsx11("path", { d: "m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" })
491
+ }
492
+ );
493
+
494
+ // src/foundations/theme-token-bridge.helpers.ts
495
+ var BASE_COLOR_TOKENS = [
496
+ "base-lightest",
497
+ "base-lighter",
498
+ "base-light",
499
+ "base",
500
+ "base-dark",
501
+ "base-darker",
502
+ "base-darkest",
503
+ "ink"
504
+ ];
505
+ var PRIMARY_COLOR_TOKENS = [
506
+ "primary-lightest",
507
+ "primary-lighter",
508
+ "primary-light",
509
+ "primary",
510
+ "primary-vivid",
511
+ "primary-dark",
512
+ "primary-darker",
513
+ "primary-darkest"
514
+ ];
515
+ var SECONDARY_COLOR_TOKENS = [
516
+ "secondary-lightest",
517
+ "secondary-lighter",
518
+ "secondary-light",
519
+ "secondary",
520
+ "secondary-vivid",
521
+ "secondary-dark",
522
+ "secondary-darker",
523
+ "secondary-darkest"
524
+ ];
525
+ var ACCENT_COOL_COLOR_TOKENS = [
526
+ "accent-cool-lightest",
527
+ "accent-cool-lighter",
528
+ "accent-cool-light",
529
+ "accent-cool",
530
+ "accent-cool-dark",
531
+ "accent-cool-darker",
532
+ "accent-cool-darkest"
533
+ ];
534
+ var ACCENT_WARM_COLOR_TOKENS = [
535
+ "accent-warm-lightest",
536
+ "accent-warm-lighter",
537
+ "accent-warm-light",
538
+ "accent-warm",
539
+ "accent-warm-dark",
540
+ "accent-warm-darker",
541
+ "accent-warm-darkest"
542
+ ];
543
+ var INFO_COLOR_TOKENS = [
544
+ "info-lighter",
545
+ "info-light",
546
+ "info",
547
+ "info-dark",
548
+ "info-darker"
549
+ ];
550
+ var WARNING_COLOR_TOKENS = [
551
+ "warning-lighter",
552
+ "warning-light",
553
+ "warning",
554
+ "warning-dark",
555
+ "warning-darker"
556
+ ];
557
+ var ERROR_COLOR_TOKENS = [
558
+ "error-lighter",
559
+ "error-light",
560
+ "error",
561
+ "error-dark",
562
+ "error-darker"
563
+ ];
564
+ var SUCCESS_COLOR_TOKENS = [
565
+ "success-lighter",
566
+ "success-light",
567
+ "success",
568
+ "success-dark",
569
+ "success-darker"
570
+ ];
571
+ var DISABLED_COLOR_TOKENS = [
572
+ "disabled-lighter",
573
+ "disabled-light",
574
+ "disabled",
575
+ "disabled-dark",
576
+ "disabled-darker"
577
+ ];
578
+ var EMERGENCY_COLOR_TOKENS = ["emergency", "emergency-dark"];
579
+ var COLOR_TOKENS = [
580
+ ...BASE_COLOR_TOKENS,
581
+ ...PRIMARY_COLOR_TOKENS,
582
+ ...SECONDARY_COLOR_TOKENS,
583
+ ...ACCENT_COOL_COLOR_TOKENS,
584
+ ...ACCENT_WARM_COLOR_TOKENS,
585
+ ...INFO_COLOR_TOKENS,
586
+ ...WARNING_COLOR_TOKENS,
587
+ ...ERROR_COLOR_TOKENS,
588
+ ...SUCCESS_COLOR_TOKENS,
589
+ ...EMERGENCY_COLOR_TOKENS,
590
+ ...DISABLED_COLOR_TOKENS
591
+ ];
592
+ var resolveColorToken = (color) => COLOR_TOKENS.includes(color) ? `var(--color-${color})` : color;
593
+
594
+ // src/components/icons/CloseIcon.tsx
595
+ import { jsx as jsx12 } from "react/jsx-runtime";
596
+ var CloseIcon = () => /* @__PURE__ */ jsx12("svg", { height: "24", width: "24", viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", children: /* @__PURE__ */ jsx12("path", { d: "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) });
597
+
598
+ // src/components/Tag/Tag.tsx
599
+ import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
600
+ function Tag({
601
+ variant = "solid",
602
+ size = "default",
603
+ color,
604
+ bgColor,
605
+ borderColor,
606
+ textColor,
607
+ icon,
608
+ onClose,
609
+ children,
610
+ className
611
+ }) {
612
+ const rootClassName = make_class_name("blocks-tag", [
613
+ `blocks-tag--${variant}`,
614
+ size === "big" ? "blocks-tag--big" : void 0,
615
+ icon ? "blocks-tag--icon" : void 0,
616
+ onClose ? "blocks-tag--x-close" : void 0,
617
+ className
618
+ ]);
619
+ const customStyle = color || textColor || bgColor || borderColor ? {
620
+ ...color ? { "--blocks-tag-custom-color": resolveColorToken(color) } : void 0,
621
+ ...textColor ? { "--blocks-tag-custom-text-color": resolveColorToken(textColor) } : void 0,
622
+ ...bgColor ? { "--blocks-tag-custom-bg-color": resolveColorToken(bgColor) } : void 0,
623
+ ...borderColor ? { "--blocks-tag-custom-border-color": resolveColorToken(borderColor) } : void 0
624
+ } : void 0;
625
+ return /* @__PURE__ */ jsxs9("span", { className: rootClassName, style: customStyle, children: [
626
+ icon && /* @__PURE__ */ jsx13("span", { className: "blocks-tag__icon", children: icon }),
627
+ children,
628
+ onClose && /* @__PURE__ */ jsx13(
629
+ "button",
630
+ {
631
+ type: "button",
632
+ className: "blocks-tag__close-button",
633
+ "aria-label": "Remove tag",
634
+ tabIndex: 0,
635
+ onClick: onClose,
636
+ children: /* @__PURE__ */ jsx13(CloseIcon, {})
637
+ }
638
+ )
639
+ ] });
640
+ }
641
+
642
+ // src/components/Carousel/Carousel.tsx
643
+ import { jsx as jsx14, jsxs as jsxs10 } from "react/jsx-runtime";
644
+ function Carousel({ items, maxVisibleItems = 2, className }) {
645
+ const [emblaRef, emblaApi] = useEmblaCarousel({
646
+ loop: false,
647
+ slidesToScroll: "auto"
648
+ });
649
+ const [, forceUpdate] = useState3(0);
650
+ useEffect(() => {
651
+ if (!emblaApi) return;
652
+ const onEmblaStateChange = () => forceUpdate((n) => n + 1);
653
+ emblaApi.on("select", onEmblaStateChange).on("reInit", onEmblaStateChange).on("init", onEmblaStateChange);
654
+ }, [emblaApi]);
655
+ const scrollPrev = useCallback(() => emblaApi?.scrollPrev(), [emblaApi]);
656
+ const scrollNext = useCallback(() => emblaApi?.scrollNext(), [emblaApi]);
657
+ const showControls = items.length > maxVisibleItems;
658
+ const effectiveVisibleItems = Math.min(items.length, maxVisibleItems);
659
+ return /* @__PURE__ */ jsxs10("div", { className: make_class_name("blocks-carousel", [className]), children: [
660
+ /* @__PURE__ */ jsx14("div", { className: "blocks-carousel__viewport", ref: emblaRef, children: /* @__PURE__ */ jsx14("div", { className: "blocks-carousel__track", children: items.map(({ tag: { label: tagLabel, ...tagProps } = {}, ...cardProps }, index) => /* @__PURE__ */ jsx14(
661
+ "div",
662
+ {
663
+ className: make_class_name("blocks-carousel__item", [
664
+ `blocks-carousel__item--${effectiveVisibleItems}`
665
+ ]),
666
+ children: /* @__PURE__ */ jsx14(
667
+ Card,
668
+ {
669
+ ...cardProps,
670
+ ...tagLabel && { tag: /* @__PURE__ */ jsx14(Tag, { ...tagProps, children: tagLabel }) }
671
+ }
672
+ )
673
+ },
674
+ index
675
+ )) }) }),
676
+ /* @__PURE__ */ jsxs10(
677
+ "div",
678
+ {
679
+ className: make_class_name("blocks-carousel__controls", [
680
+ !showControls ? "blocks-carousel__controls--hidden" : void 0
681
+ ]),
682
+ "aria-hidden": !showControls || void 0,
683
+ children: [
684
+ /* @__PURE__ */ jsx14(
685
+ Link,
686
+ {
687
+ as: "button",
688
+ type: "button",
689
+ variant: "text",
690
+ className: "blocks-carousel__btn blocks-carousel__btn--prev",
691
+ onClick: scrollPrev,
692
+ disabled: !emblaApi?.canScrollPrev(),
693
+ "aria-label": "Previous slide",
694
+ children: /* @__PURE__ */ jsx14(NavigateBeforeIcon, {})
695
+ }
696
+ ),
697
+ /* @__PURE__ */ jsxs10("span", { className: "blocks-carousel__counter", "aria-live": "polite", children: [
698
+ (emblaApi?.selectedScrollSnap() ?? 0) + 1,
699
+ " / ",
700
+ emblaApi?.scrollSnapList().length ?? 0
701
+ ] }),
702
+ /* @__PURE__ */ jsx14(
703
+ Link,
704
+ {
705
+ as: "button",
706
+ type: "button",
707
+ variant: "text",
708
+ className: "blocks-carousel__btn blocks-carousel__btn--next",
709
+ onClick: scrollNext,
710
+ disabled: !emblaApi?.canScrollNext(),
711
+ "aria-label": "Next slide",
712
+ children: /* @__PURE__ */ jsx14(NavigateNextIcon, {})
713
+ }
714
+ )
715
+ ]
716
+ }
717
+ )
718
+ ] });
719
+ }
720
+
334
721
  // src/components/Footer/Footer.tsx
335
- import { GridContainer, Icon as Icon4, Link, Footer as USWDSFooter } from "@trussworks/react-uswds";
336
- import { Fragment, jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
722
+ import { GridContainer, Icon as Icon2, Link as Link2, Footer as USWDSFooter } from "@trussworks/react-uswds";
723
+ import { Fragment, jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
337
724
  function Footer({
338
725
  portalDetails,
339
726
  primaryNavItems,
@@ -342,21 +729,21 @@ function Footer({
342
729
  className
343
730
  }) {
344
731
  const footerClassName = make_class_name("blocks-footer", [className]);
345
- return /* @__PURE__ */ jsx8(
732
+ return /* @__PURE__ */ jsx15(
346
733
  USWDSFooter,
347
734
  {
348
735
  className: footerClassName,
349
736
  size: "slim",
350
- primary: /* @__PURE__ */ jsx8(GridContainer, { children: /* @__PURE__ */ jsxs8("section", { className: "blocks-footer__primary-section", children: [
351
- /* @__PURE__ */ jsxs8("div", { className: "blocks-footer__title", children: [
352
- portalDetails.logo ? /* @__PURE__ */ jsx8("div", { className: "blocks-footer__logo", children: portalDetails.logo }) : null,
353
- /* @__PURE__ */ jsxs8("div", { className: "blocks-footer__title-text", children: [
354
- /* @__PURE__ */ jsx8("span", { children: portalDetails.title }),
355
- portalDetails.tagline ? /* @__PURE__ */ jsx8("p", { children: portalDetails.tagline }) : null
737
+ primary: /* @__PURE__ */ jsx15(GridContainer, { children: /* @__PURE__ */ jsxs11("section", { className: "blocks-footer__primary-section", children: [
738
+ /* @__PURE__ */ jsxs11("div", { className: "blocks-footer__title", children: [
739
+ portalDetails.logo ? /* @__PURE__ */ jsx15("div", { className: "blocks-footer__logo", children: portalDetails.logo }) : null,
740
+ /* @__PURE__ */ jsxs11("div", { className: "blocks-footer__title-text", children: [
741
+ /* @__PURE__ */ jsx15("span", { children: portalDetails.title }),
742
+ portalDetails.tagline ? /* @__PURE__ */ jsx15("p", { children: portalDetails.tagline }) : null
356
743
  ] })
357
744
  ] }),
358
- primaryNavItems.length > 0 ? /* @__PURE__ */ jsx8("nav", { className: "blocks-footer__primary-nav", "aria-label": "Footer primary navigation", children: /* @__PURE__ */ jsx8("ul", { children: primaryNavItems.map(({ label, href, isExternal }) => /* @__PURE__ */ jsx8("li", { className: "usa-footer__primary-content", children: /* @__PURE__ */ jsx8(
359
- Link,
745
+ primaryNavItems.length > 0 ? /* @__PURE__ */ jsx15("nav", { className: "blocks-footer__primary-nav", "aria-label": "Footer primary navigation", children: /* @__PURE__ */ jsx15("ul", { children: primaryNavItems.map(({ label, href, isExternal }) => /* @__PURE__ */ jsx15("li", { className: "usa-footer__primary-content", children: /* @__PURE__ */ jsx15(
746
+ Link2,
360
747
  {
361
748
  className: "usa-footer__primary-link",
362
749
  href,
@@ -365,31 +752,31 @@ function Footer({
365
752
  }
366
753
  ) }, href)) }) }) : null
367
754
  ] }) }),
368
- secondary: /* @__PURE__ */ jsxs8(Fragment, { children: [
369
- secondaryNavItems.length > 0 ? /* @__PURE__ */ jsx8("section", { className: "blocks-footer__secondary-section-upper", children: /* @__PURE__ */ jsx8(
755
+ secondary: /* @__PURE__ */ jsxs11(Fragment, { children: [
756
+ secondaryNavItems.length > 0 ? /* @__PURE__ */ jsx15("section", { className: "blocks-footer__secondary-section-upper", children: /* @__PURE__ */ jsx15(
370
757
  "nav",
371
758
  {
372
759
  className: "blocks-footer__secondary-nav",
373
760
  "aria-label": "Footer secondary navigation",
374
- children: /* @__PURE__ */ jsx8("ul", { children: secondaryNavItems.map(({ label, href, isExternal }) => /* @__PURE__ */ jsx8("li", { className: "usa-footer__secondary-link", children: /* @__PURE__ */ jsx8(Link, { href, ...get_external_anchor_props(isExternal), children: label }) }, href)) })
761
+ children: /* @__PURE__ */ jsx15("ul", { children: secondaryNavItems.map(({ label, href, isExternal }) => /* @__PURE__ */ jsx15("li", { className: "usa-footer__secondary-link", children: /* @__PURE__ */ jsx15(Link2, { href, ...get_external_anchor_props(isExternal), children: label }) }, href)) })
375
762
  }
376
763
  ) }) : null,
377
- utilityNavItems?.length || portalDetails.updatedDate || portalDetails.contacts?.length ? /* @__PURE__ */ jsxs8("section", { className: "blocks-footer__secondary-section-lower", children: [
378
- utilityNavItems?.length ? /* @__PURE__ */ jsx8("nav", { className: "blocks-footer__utility-nav", "aria-label": "Site utilities", children: /* @__PURE__ */ jsx8("ul", { children: utilityNavItems.length ? utilityNavItems.map(({ text, label, href, isExternal }) => /* @__PURE__ */ jsxs8("li", { children: [
764
+ utilityNavItems?.length || portalDetails.updatedDate || portalDetails.contacts?.length ? /* @__PURE__ */ jsxs11("section", { className: "blocks-footer__secondary-section-lower", children: [
765
+ utilityNavItems?.length ? /* @__PURE__ */ jsx15("nav", { className: "blocks-footer__utility-nav", "aria-label": "Site utilities", children: /* @__PURE__ */ jsx15("ul", { children: utilityNavItems.length ? utilityNavItems.map(({ text, label, href, isExternal }) => /* @__PURE__ */ jsxs11("li", { children: [
379
766
  text,
380
767
  " ",
381
- /* @__PURE__ */ jsx8(Link, { href, ...get_external_anchor_props(isExternal), children: label })
768
+ /* @__PURE__ */ jsx15(Link2, { href, ...get_external_anchor_props(isExternal), children: label })
382
769
  ] }, href)) : null }) }) : null,
383
- portalDetails.updatedDate || portalDetails.contacts?.length ? /* @__PURE__ */ jsxs8("div", { className: "blocks-footer__secondary-meta", children: [
384
- portalDetails.updatedDate ? /* @__PURE__ */ jsxs8("p", { children: [
770
+ portalDetails.updatedDate || portalDetails.contacts?.length ? /* @__PURE__ */ jsxs11("div", { className: "blocks-footer__secondary-meta", children: [
771
+ portalDetails.updatedDate ? /* @__PURE__ */ jsxs11("p", { children: [
385
772
  "Site last updated: ",
386
773
  portalDetails.updatedDate
387
774
  ] }) : null,
388
- portalDetails.contacts?.length ? /* @__PURE__ */ jsx8("nav", { className: "blocks-footer__contacts-nav", "aria-label": "Site contacts", children: /* @__PURE__ */ jsx8("ul", { children: portalDetails.contacts.map(({ label, name, email }) => /* @__PURE__ */ jsxs8("li", { children: [
389
- /* @__PURE__ */ jsx8("span", { children: label }),
390
- /* @__PURE__ */ jsxs8(Link, { href: `mailto:${email}`, ...get_external_anchor_props(), children: [
391
- /* @__PURE__ */ jsx8(Icon4.Mail, { "aria-hidden": "true", focusable: false }),
392
- /* @__PURE__ */ jsx8("span", { children: name })
775
+ portalDetails.contacts?.length ? /* @__PURE__ */ jsx15("nav", { className: "blocks-footer__contacts-nav", "aria-label": "Site contacts", children: /* @__PURE__ */ jsx15("ul", { children: portalDetails.contacts.map(({ label, name, email }) => /* @__PURE__ */ jsxs11("li", { children: [
776
+ /* @__PURE__ */ jsx15("span", { children: label }),
777
+ /* @__PURE__ */ jsxs11(Link2, { href: `mailto:${email}`, ...get_external_anchor_props(), children: [
778
+ /* @__PURE__ */ jsx15(Icon2.Mail, { "aria-hidden": "true", focusable: false }),
779
+ /* @__PURE__ */ jsx15("span", { children: name })
393
780
  ] })
394
781
  ] }, `${label}-${email}`)) }) }) : null
395
782
  ] }) : null
@@ -401,14 +788,14 @@ function Footer({
401
788
 
402
789
  // src/components/Header/Header.tsx
403
790
  import { NavMenuButton, PrimaryNav, Title, Header as USWDSHeader } from "@trussworks/react-uswds";
404
- import { useCallback, useMemo, useRef as useRef2, useState as useState2 } from "react";
791
+ import { useCallback as useCallback2, useMemo, useRef as useRef2, useState as useState4 } from "react";
405
792
 
406
793
  // src/hooks/useClickOutside.ts
407
- import { useEffect, useRef } from "react";
794
+ import { useEffect as useEffect2, useRef } from "react";
408
795
  function useClickOutside(callback, options) {
409
796
  const ref = useRef(null);
410
797
  const { excludeRefs, bindEscapeKey } = options ?? {};
411
- useEffect(() => {
798
+ useEffect2(() => {
412
799
  const handleClickOutside = (event) => {
413
800
  if ([ref, ...excludeRefs ?? []].every(
414
801
  (r) => r.current && !r.current.contains(event.target)
@@ -419,7 +806,7 @@ function useClickOutside(callback, options) {
419
806
  document.addEventListener("click", handleClickOutside);
420
807
  return () => document.removeEventListener("click", handleClickOutside);
421
808
  }, [callback, excludeRefs]);
422
- useEffect(() => {
809
+ useEffect2(() => {
423
810
  if (!bindEscapeKey) return;
424
811
  const handleEscape = (event) => {
425
812
  if (event.key === "Escape") {
@@ -435,9 +822,9 @@ function useClickOutside(callback, options) {
435
822
  }
436
823
 
437
824
  // src/hooks/useWindowResize.ts
438
- import { useEffect as useEffect2 } from "react";
825
+ import { useEffect as useEffect3 } from "react";
439
826
  function useWindowResize(handleResize) {
440
- useEffect2(() => {
827
+ useEffect3(() => {
441
828
  window.addEventListener("resize", handleResize);
442
829
  return () => {
443
830
  window.removeEventListener("resize", handleResize);
@@ -446,8 +833,8 @@ function useWindowResize(handleResize) {
446
833
  }
447
834
 
448
835
  // src/components/Header/Header.helpers.tsx
449
- import { Link as Link2, Menu, NavDropDownButton } from "@trussworks/react-uswds";
450
- import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
836
+ import { Link as Link3, Menu, NavDropDownButton } from "@trussworks/react-uswds";
837
+ import { Fragment as Fragment2, jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
451
838
  var make_nav_items_initial_state = (navItems) => {
452
839
  const initialState = {};
453
840
  const initialProps = navItems.map((item) => {
@@ -479,14 +866,14 @@ var make_menu_link_jsx = ({ label, href, isExternal, isPrimary }, options) => {
479
866
  if (isCurrent) {
480
867
  className.push("usa-current");
481
868
  }
482
- return /* @__PURE__ */ jsx9(
869
+ return /* @__PURE__ */ jsx16(
483
870
  "a",
484
871
  {
485
872
  href,
486
873
  className: className.join(" "),
487
874
  "aria-current": isCurrent ? "page" : void 0,
488
875
  ...get_external_anchor_props(isExternal),
489
- children: /* @__PURE__ */ jsx9("span", { children: label })
876
+ children: /* @__PURE__ */ jsx16("span", { children: label })
490
877
  },
491
878
  href
492
879
  );
@@ -494,8 +881,8 @@ var make_menu_link_jsx = ({ label, href, isExternal, isPrimary }, options) => {
494
881
  var make_menu_link_with_dropdown_jsx = ({ label, menuId, subItems }, options) => {
495
882
  const { navDropDownOpenState, handleToggleDropdown, currentPath } = options;
496
883
  const sublinks = subItems.map((item) => make_menu_link_jsx(item, { currentPath }));
497
- return /* @__PURE__ */ jsxs9(Fragment2, { children: [
498
- /* @__PURE__ */ jsx9(
884
+ return /* @__PURE__ */ jsxs12(Fragment2, { children: [
885
+ /* @__PURE__ */ jsx16(
499
886
  NavDropDownButton,
500
887
  {
501
888
  menuId,
@@ -505,11 +892,11 @@ var make_menu_link_with_dropdown_jsx = ({ label, menuId, subItems }, options) =>
505
892
  isCurrent: sublinks.some((sublink) => is_current_path(sublink.props.href, currentPath))
506
893
  }
507
894
  ),
508
- /* @__PURE__ */ jsx9(Menu, { items: sublinks, isOpen: navDropDownOpenState[menuId] ?? false, id: menuId }, "one")
895
+ /* @__PURE__ */ jsx16(Menu, { items: sublinks, isOpen: navDropDownOpenState[menuId] ?? false, id: menuId }, "one")
509
896
  ] });
510
897
  };
511
- var make_custom_nav_item_jsx = (customNavItem) => isNavItem(customNavItem) ? /* @__PURE__ */ jsx9(
512
- Link2,
898
+ var make_custom_nav_item_jsx = (customNavItem) => isNavItem(customNavItem) ? /* @__PURE__ */ jsx16(
899
+ Link3,
513
900
  {
514
901
  className: "blocks-header__custom-nav-item usa-button",
515
902
  variant: "unstyled",
@@ -520,7 +907,7 @@ var make_custom_nav_item_jsx = (customNavItem) => isNavItem(customNavItem) ? /*
520
907
  ) : customNavItem;
521
908
 
522
909
  // src/components/Header/Header.tsx
523
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
910
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
524
911
  function Header(props) {
525
912
  const {
526
913
  portalDetails: { logo, title, url },
@@ -533,11 +920,11 @@ function Header(props) {
533
920
  () => make_nav_items_initial_state(navItems),
534
921
  [navItems]
535
922
  );
536
- const [navDropDownOpenState, setNavDropDownOpenState] = useState2(
923
+ const [navDropDownOpenState, setNavDropDownOpenState] = useState4(
537
924
  initialNavDropDownOpenState
538
925
  );
539
- const [isMobileNavExpanded, setIsMobileNavExpanded] = useState2(false);
540
- const handleToggleDropdown = useCallback(
926
+ const [isMobileNavExpanded, setIsMobileNavExpanded] = useState4(false);
927
+ const handleToggleDropdown = useCallback2(
541
928
  (menuId) => {
542
929
  if (isMobileNavExpanded) {
543
930
  setNavDropDownOpenState((prev) => ({
@@ -556,8 +943,8 @@ function Header(props) {
556
943
  },
557
944
  [isMobileNavExpanded]
558
945
  );
559
- const handleToggleMobileNav = useCallback(() => setIsMobileNavExpanded((prev) => !prev), []);
560
- const handleClickOutside = useCallback(() => {
946
+ const handleToggleMobileNav = useCallback2(() => setIsMobileNavExpanded((prev) => !prev), []);
947
+ const handleClickOutside = useCallback2(() => {
561
948
  if (isMobileNavExpanded) {
562
949
  setIsMobileNavExpanded(false);
563
950
  } else {
@@ -588,15 +975,15 @@ function Header(props) {
588
975
  currentPath
589
976
  }) : make_menu_link_jsx(item, { currentPath })
590
977
  );
591
- return /* @__PURE__ */ jsx10(USWDSHeader, { className: headerClassName, basic: true, showMobileOverlay: isMobileNavExpanded, children: /* @__PURE__ */ jsxs10("div", { className: "usa-nav-container", children: [
592
- /* @__PURE__ */ jsxs10("div", { className: "usa-navbar", children: [
593
- /* @__PURE__ */ jsxs10("div", { className: "blocks-header__portal-details", children: [
594
- /* @__PURE__ */ jsx10("a", { className: "blocks-header__portal-logo", href: url ?? "/", children: logo }),
595
- title ? /* @__PURE__ */ jsx10(Title, { children: /* @__PURE__ */ jsx10("a", { href: url ?? "/", children: title }) }) : null
978
+ return /* @__PURE__ */ jsx17(USWDSHeader, { className: headerClassName, basic: true, showMobileOverlay: isMobileNavExpanded, children: /* @__PURE__ */ jsxs13("div", { className: "usa-nav-container", children: [
979
+ /* @__PURE__ */ jsxs13("div", { className: "usa-navbar", children: [
980
+ /* @__PURE__ */ jsxs13("div", { className: "blocks-header__portal-details", children: [
981
+ /* @__PURE__ */ jsx17("a", { className: "blocks-header__portal-logo", href: url ?? "/", children: logo }),
982
+ title ? /* @__PURE__ */ jsx17(Title, { children: /* @__PURE__ */ jsx17("a", { href: url ?? "/", children: title }) }) : null
596
983
  ] }),
597
- /* @__PURE__ */ jsx10(NavMenuButton, { ref: mobileNavToggleRef, onClick: handleToggleMobileNav, label: "Menu" })
984
+ /* @__PURE__ */ jsx17(NavMenuButton, { ref: mobileNavToggleRef, onClick: handleToggleMobileNav, label: "Menu" })
598
985
  ] }),
599
- /* @__PURE__ */ jsx10(
986
+ /* @__PURE__ */ jsx17(
600
987
  PrimaryNav,
601
988
  {
602
989
  ref: menuRef,
@@ -609,181 +996,6 @@ function Header(props) {
609
996
  ] }) });
610
997
  }
611
998
 
612
- // src/components/Link/Link.tsx
613
- import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
614
- function Link3({
615
- variant = "text",
616
- size = "md",
617
- isExternal,
618
- className,
619
- as,
620
- children,
621
- ...rest
622
- }) {
623
- const Component = isExternal ? "a" : as ?? "a";
624
- const rootClassName = make_class_name("blocks-link", [
625
- `blocks-link--${variant}`,
626
- variant === "button" || variant === "button-outline" ? "usa-button" : void 0,
627
- variant === "button-outline" ? "usa-button--outline" : void 0,
628
- variant === "text" ? "usa-button--unstyled" : void 0,
629
- `blocks-link--${size}`,
630
- isExternal ? "blocks-link--external usa-link--external" : void 0,
631
- className
632
- ]);
633
- return /* @__PURE__ */ jsxs11(Component, { className: rootClassName, ...get_external_anchor_props(isExternal), ...rest, children: [
634
- children,
635
- variant === "arrow" && /* @__PURE__ */ jsx11(ArrowIcon, {})
636
- ] });
637
- }
638
-
639
- // src/foundations/theme-token-bridge.helpers.ts
640
- var BASE_COLOR_TOKENS = [
641
- "base-lightest",
642
- "base-lighter",
643
- "base-light",
644
- "base",
645
- "base-dark",
646
- "base-darker",
647
- "base-darkest",
648
- "ink"
649
- ];
650
- var PRIMARY_COLOR_TOKENS = [
651
- "primary-lightest",
652
- "primary-lighter",
653
- "primary-light",
654
- "primary",
655
- "primary-vivid",
656
- "primary-dark",
657
- "primary-darker",
658
- "primary-darkest"
659
- ];
660
- var SECONDARY_COLOR_TOKENS = [
661
- "secondary-lightest",
662
- "secondary-lighter",
663
- "secondary-light",
664
- "secondary",
665
- "secondary-vivid",
666
- "secondary-dark",
667
- "secondary-darker",
668
- "secondary-darkest"
669
- ];
670
- var ACCENT_COOL_COLOR_TOKENS = [
671
- "accent-cool-lightest",
672
- "accent-cool-lighter",
673
- "accent-cool-light",
674
- "accent-cool",
675
- "accent-cool-dark",
676
- "accent-cool-darker",
677
- "accent-cool-darkest"
678
- ];
679
- var ACCENT_WARM_COLOR_TOKENS = [
680
- "accent-warm-lightest",
681
- "accent-warm-lighter",
682
- "accent-warm-light",
683
- "accent-warm",
684
- "accent-warm-dark",
685
- "accent-warm-darker",
686
- "accent-warm-darkest"
687
- ];
688
- var INFO_COLOR_TOKENS = [
689
- "info-lighter",
690
- "info-light",
691
- "info",
692
- "info-dark",
693
- "info-darker"
694
- ];
695
- var WARNING_COLOR_TOKENS = [
696
- "warning-lighter",
697
- "warning-light",
698
- "warning",
699
- "warning-dark",
700
- "warning-darker"
701
- ];
702
- var ERROR_COLOR_TOKENS = [
703
- "error-lighter",
704
- "error-light",
705
- "error",
706
- "error-dark",
707
- "error-darker"
708
- ];
709
- var SUCCESS_COLOR_TOKENS = [
710
- "success-lighter",
711
- "success-light",
712
- "success",
713
- "success-dark",
714
- "success-darker"
715
- ];
716
- var DISABLED_COLOR_TOKENS = [
717
- "disabled-lighter",
718
- "disabled-light",
719
- "disabled",
720
- "disabled-dark",
721
- "disabled-darker"
722
- ];
723
- var EMERGENCY_COLOR_TOKENS = ["emergency", "emergency-dark"];
724
- var COLOR_TOKENS = [
725
- ...BASE_COLOR_TOKENS,
726
- ...PRIMARY_COLOR_TOKENS,
727
- ...SECONDARY_COLOR_TOKENS,
728
- ...ACCENT_COOL_COLOR_TOKENS,
729
- ...ACCENT_WARM_COLOR_TOKENS,
730
- ...INFO_COLOR_TOKENS,
731
- ...WARNING_COLOR_TOKENS,
732
- ...ERROR_COLOR_TOKENS,
733
- ...SUCCESS_COLOR_TOKENS,
734
- ...EMERGENCY_COLOR_TOKENS,
735
- ...DISABLED_COLOR_TOKENS
736
- ];
737
- var resolveColorToken = (color) => COLOR_TOKENS.includes(color) ? `var(--color-${color})` : color;
738
-
739
- // src/components/icons/CloseIcon.tsx
740
- import { jsx as jsx12 } from "react/jsx-runtime";
741
- var CloseIcon = () => /* @__PURE__ */ jsx12("svg", { height: "24", width: "24", viewBox: "0 0 24 24", "aria-hidden": "true", focusable: "false", children: /* @__PURE__ */ jsx12("path", { d: "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) });
742
-
743
- // src/components/Tag/Tag.tsx
744
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
745
- function Tag({
746
- variant = "solid",
747
- size = "default",
748
- color,
749
- bgColor,
750
- borderColor,
751
- textColor,
752
- icon,
753
- onClose,
754
- children,
755
- className
756
- }) {
757
- const rootClassName = make_class_name("blocks-tag", [
758
- `blocks-tag--${variant}`,
759
- size === "big" ? "blocks-tag--big" : void 0,
760
- icon ? "blocks-tag--icon" : void 0,
761
- onClose ? "blocks-tag--x-close" : void 0,
762
- className
763
- ]);
764
- const customStyle = color || textColor || bgColor || borderColor ? {
765
- ...color ? { "--blocks-tag-custom-color": resolveColorToken(color) } : void 0,
766
- ...textColor ? { "--blocks-tag-custom-text-color": resolveColorToken(textColor) } : void 0,
767
- ...bgColor ? { "--blocks-tag-custom-bg-color": resolveColorToken(bgColor) } : void 0,
768
- ...borderColor ? { "--blocks-tag-custom-border-color": resolveColorToken(borderColor) } : void 0
769
- } : void 0;
770
- return /* @__PURE__ */ jsxs12("span", { className: rootClassName, style: customStyle, children: [
771
- icon && /* @__PURE__ */ jsx13("span", { className: "blocks-tag__icon", children: icon }),
772
- children,
773
- onClose && /* @__PURE__ */ jsx13(
774
- "button",
775
- {
776
- type: "button",
777
- className: "blocks-tag__close-button",
778
- "aria-label": "Remove tag",
779
- tabIndex: 0,
780
- onClick: onClose,
781
- children: /* @__PURE__ */ jsx13(CloseIcon, {})
782
- }
783
- )
784
- ] });
785
- }
786
-
787
999
  // src/geo/GeoConfigProvider.tsx
788
1000
  import { StacApiProvider } from "@developmentseed/stac-react";
789
1001
  import { createContext, useContext } from "react";
@@ -795,7 +1007,7 @@ var DEFAULT_TILE_MATRIX_SET = "WebMercatorQuad";
795
1007
  var STAC_COLORSTOP_RGBA_ARG_COUNT = 4;
796
1008
 
797
1009
  // src/geo/GeoConfigProvider.tsx
798
- import { jsx as jsx14 } from "react/jsx-runtime";
1010
+ import { jsx as jsx18 } from "react/jsx-runtime";
799
1011
  var GeoConfigContext = createContext(null);
800
1012
  function useGeoConfig() {
801
1013
  const ctx = useContext(GeoConfigContext);
@@ -807,24 +1019,24 @@ function GeoConfigProvider({
807
1019
  titilerBaseUrl = TITILER_BASE_URL,
808
1020
  children
809
1021
  }) {
810
- return /* @__PURE__ */ jsx14(GeoConfigContext.Provider, { value: { titilerBaseUrl }, children: /* @__PURE__ */ jsx14(StacApiProvider, { apiUrl: stacApiUrl, children }) });
1022
+ return /* @__PURE__ */ jsx18(GeoConfigContext.Provider, { value: { titilerBaseUrl }, children: /* @__PURE__ */ jsx18(StacApiProvider, { apiUrl: stacApiUrl, children }) });
811
1023
  }
812
1024
 
813
1025
  // src/geo/Legend/Legend.tsx
814
- import { Icon as Icon5 } from "@trussworks/react-uswds";
815
- import { useState as useState3 } from "react";
816
- import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1026
+ import { Icon as Icon3 } from "@trussworks/react-uswds";
1027
+ import { useState as useState5 } from "react";
1028
+ import { Fragment as Fragment3, jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
817
1029
  function Legend({ initialExpanded = false, ...props }) {
818
1030
  const { title, description, unit, min, max, colorStops, provider, spatialExtent, timeDensity } = props;
819
- const [isExpanded, setIsExpanded] = useState3(initialExpanded);
1031
+ const [isExpanded, setIsExpanded] = useState5(initialExpanded);
820
1032
  const subtitle = [provider, spatialExtent, timeDensity].some(isDefined) ? [provider, spatialExtent, timeDensity].filter(isDefined).join(" \xB7 ") : void 0;
821
- return /* @__PURE__ */ jsxs13("div", { className: "blocks-legend", children: [
822
- /* @__PURE__ */ jsxs13("div", { className: "blocks-legend__header", children: [
823
- /* @__PURE__ */ jsxs13("div", { className: "blocks-legend__header-text", children: [
824
- title && /* @__PURE__ */ jsx15("h3", { className: "blocks-legend__title", title, children: title }),
825
- subtitle && /* @__PURE__ */ jsx15("p", { className: "blocks-legend__subtitle", title: subtitle, children: subtitle })
1033
+ return /* @__PURE__ */ jsxs14("div", { className: "blocks-legend", children: [
1034
+ /* @__PURE__ */ jsxs14("div", { className: "blocks-legend__header", children: [
1035
+ /* @__PURE__ */ jsxs14("div", { className: "blocks-legend__header-text", children: [
1036
+ title && /* @__PURE__ */ jsx19("h3", { className: "blocks-legend__title", title, children: title }),
1037
+ subtitle && /* @__PURE__ */ jsx19("p", { className: "blocks-legend__subtitle", title: subtitle, children: subtitle })
826
1038
  ] }),
827
- description && /* @__PURE__ */ jsx15(
1039
+ description && /* @__PURE__ */ jsx19(
828
1040
  "button",
829
1041
  {
830
1042
  type: "button",
@@ -832,12 +1044,12 @@ function Legend({ initialExpanded = false, ...props }) {
832
1044
  "aria-expanded": isExpanded,
833
1045
  "aria-label": "Toggle layer description",
834
1046
  onClick: () => setIsExpanded((v) => !v),
835
- children: /* @__PURE__ */ jsx15(Icon5.InfoOutline, { "aria-hidden": true, focusable: false, size: 3 })
1047
+ children: /* @__PURE__ */ jsx19(Icon3.InfoOutline, { "aria-hidden": true, focusable: false, size: 3 })
836
1048
  }
837
1049
  )
838
1050
  ] }),
839
- colorStops && /* @__PURE__ */ jsxs13(Fragment3, { children: [
840
- /* @__PURE__ */ jsx15("div", { className: "blocks-legend__gradient-bar", children: /* @__PURE__ */ jsx15(
1051
+ colorStops && /* @__PURE__ */ jsxs14(Fragment3, { children: [
1052
+ /* @__PURE__ */ jsx19("div", { className: "blocks-legend__gradient-bar", children: /* @__PURE__ */ jsx19(
841
1053
  "div",
842
1054
  {
843
1055
  className: "blocks-legend__gradient",
@@ -846,18 +1058,18 @@ function Legend({ initialExpanded = false, ...props }) {
846
1058
  }
847
1059
  }
848
1060
  ) }),
849
- isDefined(min) && isDefined(max) && /* @__PURE__ */ jsxs13("div", { className: "blocks-legend__labels", children: [
850
- /* @__PURE__ */ jsx15("span", { className: "blocks-legend__min", children: min }),
851
- /* @__PURE__ */ jsx15("span", { className: "blocks-legend__unit", children: unit }),
852
- /* @__PURE__ */ jsx15("span", { className: "blocks-legend__max", children: max })
1061
+ isDefined(min) && isDefined(max) && /* @__PURE__ */ jsxs14("div", { className: "blocks-legend__labels", children: [
1062
+ /* @__PURE__ */ jsx19("span", { className: "blocks-legend__min", children: min }),
1063
+ /* @__PURE__ */ jsx19("span", { className: "blocks-legend__unit", children: unit }),
1064
+ /* @__PURE__ */ jsx19("span", { className: "blocks-legend__max", children: max })
853
1065
  ] })
854
1066
  ] }),
855
- isExpanded && description && /* @__PURE__ */ jsx15("div", { className: "blocks-legend__description", children: /* @__PURE__ */ jsx15("div", { className: "blocks-legend__description-inner", children: description }) })
1067
+ isExpanded && description && /* @__PURE__ */ jsx19("div", { className: "blocks-legend__description", children: /* @__PURE__ */ jsx19("div", { className: "blocks-legend__description-inner", children: description }) })
856
1068
  ] });
857
1069
  }
858
1070
 
859
1071
  // src/geo/StacCompareMap/StacCompareMap.tsx
860
- import { useEffect as useEffect3, useId, useRef as useRef3, useState as useState4 } from "react";
1072
+ import { useEffect as useEffect5, useId, useRef as useRef3, useState as useState8 } from "react";
861
1073
  import {
862
1074
  Layer,
863
1075
  Map as MapLibreMap,
@@ -922,10 +1134,38 @@ var formatRenderPropertiesToQuery = (renderProperties) => {
922
1134
  };
923
1135
 
924
1136
  // src/geo/DateChip/DateChip.tsx
925
- import { jsx as jsx16 } from "react/jsx-runtime";
1137
+ import { jsx as jsx20 } from "react/jsx-runtime";
926
1138
  function DateChip({ left, right }) {
927
1139
  const label = right === void 0 || left.from === right.from && left.to === right.to ? formatDateRange(left) : `${formatDateRange(left)} vs ${formatDateRange(right)}`;
928
- return /* @__PURE__ */ jsx16("div", { className: "blocks-date-chip", children: label });
1140
+ return /* @__PURE__ */ jsx20("div", { className: "blocks-date-chip", children: label });
1141
+ }
1142
+
1143
+ // src/geo/hooks/useMapScrollGuard.ts
1144
+ import { useEffect as useEffect4, useState as useState6 } from "react";
1145
+ function useMapScrollGuard(enabled, containerRef) {
1146
+ const [isInteractive, setIsInteractive] = useState6(false);
1147
+ useEffect4(() => {
1148
+ if (!enabled || !isInteractive) return;
1149
+ const handleClick = (e) => {
1150
+ if (!containerRef.current?.contains(e.target)) {
1151
+ setIsInteractive(false);
1152
+ }
1153
+ };
1154
+ const handleKeyDown = (e) => {
1155
+ if (e.key === "Escape") setIsInteractive(false);
1156
+ };
1157
+ document.addEventListener("click", handleClick);
1158
+ document.addEventListener("keydown", handleKeyDown);
1159
+ return () => {
1160
+ document.removeEventListener("click", handleClick);
1161
+ document.removeEventListener("keydown", handleKeyDown);
1162
+ };
1163
+ }, [enabled, isInteractive, containerRef]);
1164
+ return {
1165
+ isInteractive,
1166
+ onActivate: () => setIsInteractive(true),
1167
+ onDeactivate: () => setIsInteractive(false)
1168
+ };
929
1169
  }
930
1170
 
931
1171
  // src/geo/hooks/useStacRasterLayer.ts
@@ -1113,6 +1353,106 @@ function useStacRasterLayer(rasterLayerConfig) {
1113
1353
  };
1114
1354
  }
1115
1355
 
1356
+ // src/geo/MapScrollGuard/LockMapControl.tsx
1357
+ import { useState as useState7 } from "react";
1358
+ import { createPortal } from "react-dom";
1359
+ import { useControl as useControl2 } from "react-map-gl/maplibre";
1360
+
1361
+ // src/components/icons/LockIcon.tsx
1362
+ import { jsx as jsx21 } from "react/jsx-runtime";
1363
+ var LockIcon = () => /* @__PURE__ */ jsx21(
1364
+ "svg",
1365
+ {
1366
+ width: "24",
1367
+ height: "24",
1368
+ viewBox: "0 0 24 24",
1369
+ fill: "currentColor",
1370
+ "aria-hidden": "true",
1371
+ focusable: "false",
1372
+ xmlns: "http://www.w3.org/2000/svg",
1373
+ children: /* @__PURE__ */ jsx21("path", { d: "M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z" })
1374
+ }
1375
+ );
1376
+
1377
+ // src/geo/MapScrollGuard/MapScrollGuardExit.tsx
1378
+ import { jsx as jsx22 } from "react/jsx-runtime";
1379
+ function MapScrollGuardExit({ onDeactivate }) {
1380
+ return /* @__PURE__ */ jsx22(
1381
+ "button",
1382
+ {
1383
+ className: "blocks-map-scroll-guard-exit",
1384
+ onClick: onDeactivate,
1385
+ type: "button",
1386
+ "aria-label": "Lock map \u2014 stop interacting",
1387
+ children: /* @__PURE__ */ jsx22(LockIcon, {})
1388
+ }
1389
+ );
1390
+ }
1391
+
1392
+ // src/geo/MapScrollGuard/LockMapControl.tsx
1393
+ import { jsx as jsx23 } from "react/jsx-runtime";
1394
+ var LockControl = class {
1395
+ container = null;
1396
+ onAdd(_map) {
1397
+ const container = document.createElement("div");
1398
+ container.className = "maplibregl-ctrl maplibregl-ctrl-group blocks-map-scroll-guard-exit-control";
1399
+ this.container = container;
1400
+ return container;
1401
+ }
1402
+ onRemove() {
1403
+ this.container?.remove();
1404
+ this.container = null;
1405
+ }
1406
+ };
1407
+ function LockMapControl({ onDeactivate }) {
1408
+ const [portalTarget, setPortalTarget] = useState7(null);
1409
+ const ctrl = useControl2(
1410
+ () => new LockControl(),
1411
+ () => setPortalTarget(ctrl?.container ?? null),
1412
+ () => setPortalTarget(null),
1413
+ { position: "top-left" }
1414
+ );
1415
+ if (!portalTarget) return null;
1416
+ return createPortal(/* @__PURE__ */ jsx23(MapScrollGuardExit, { onDeactivate }), portalTarget);
1417
+ }
1418
+
1419
+ // src/components/icons/CursorClickIcon.tsx
1420
+ import { jsx as jsx24 } from "react/jsx-runtime";
1421
+ var CursorClickIcon = () => /* @__PURE__ */ jsx24(
1422
+ "svg",
1423
+ {
1424
+ width: "24",
1425
+ height: "24",
1426
+ viewBox: "0 0 24 24",
1427
+ fill: "currentColor",
1428
+ "aria-hidden": "true",
1429
+ focusable: "false",
1430
+ xmlns: "http://www.w3.org/2000/svg",
1431
+ children: /* @__PURE__ */ jsx24("path", { d: "M11.5803 8.69C11.3787 8.69 11.1854 8.77007 11.0429 8.9126C10.9004 9.05513 10.8203 9.24844 10.8203 9.45V20.9C10.8203 21.32 11.1603 21.66 11.5803 21.66C11.7703 21.66 11.9303 21.6 12.0603 21.5L13.9703 19.95L15.6303 23.57C15.7603 23.84 16.0303 24 16.3203 24C16.4303 24 16.5403 24 16.6503 23.92L19.4103 22.64C19.7903 22.46 19.9703 22 19.7703 21.63L18.1003 18L20.5103 17.55C20.6703 17.5 20.8203 17.43 20.9403 17.29C21.2103 16.97 21.1703 16.5 20.8203 16.21L12.0803 8.86L12.0703 8.87C11.9403 8.76 11.7703 8.69 11.5803 8.69ZM15.8203 10V8H20.8203V10H15.8203ZM14.6503 4.76L17.4803 1.93L18.8903 3.34L16.0603 6.17L14.6503 4.76ZM10.8203 0H12.8203V5H10.8203V0ZM4.75031 14.66L7.58031 11.83L8.99031 13.24L6.16031 16.07L4.75031 14.66ZM4.75031 3.34L6.16031 1.93L8.99031 4.76L7.58031 6.17L4.75031 3.34ZM7.82031 10H2.82031V8H7.82031V10Z" })
1432
+ }
1433
+ );
1434
+
1435
+ // src/geo/MapScrollGuard/MapScrollGuard.tsx
1436
+ import { jsx as jsx25, jsxs as jsxs15 } from "react/jsx-runtime";
1437
+ function MapScrollGuard({ onActivate }) {
1438
+ return /* @__PURE__ */ jsx25(
1439
+ "button",
1440
+ {
1441
+ className: "blocks-map-scroll-guard",
1442
+ onClick: (e) => {
1443
+ e.stopPropagation();
1444
+ onActivate();
1445
+ },
1446
+ type: "button",
1447
+ "aria-label": "Click to interact with map",
1448
+ children: /* @__PURE__ */ jsxs15("span", { className: "blocks-map-scroll-guard__pill", children: [
1449
+ /* @__PURE__ */ jsx25(CursorClickIcon, {}),
1450
+ /* @__PURE__ */ jsx25("span", { className: "blocks-map-scroll-guard__label", children: "Click to interact with the map" })
1451
+ ] })
1452
+ }
1453
+ );
1454
+ }
1455
+
1116
1456
  // src/geo/stac.basemaps.ts
1117
1457
  var createRasterBasemapStyle = ({
1118
1458
  id,
@@ -1161,7 +1501,7 @@ var BASEMAP_LABEL_LAYER_IDS = {
1161
1501
  };
1162
1502
 
1163
1503
  // src/geo/StacCompareMap/StacCompareMap.tsx
1164
- import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
1504
+ import { jsx as jsx26, jsxs as jsxs16 } from "react/jsx-runtime";
1165
1505
  var MAP_PANEL_STYLE = {
1166
1506
  position: "absolute",
1167
1507
  top: 0,
@@ -1173,7 +1513,8 @@ function StacCompareMap({
1173
1513
  initialViewState,
1174
1514
  leftLayerConfig,
1175
1515
  rightLayerConfig,
1176
- className
1516
+ className,
1517
+ showScrollGuard = false
1177
1518
  }) {
1178
1519
  const resolvedBeforeLayerId = typeof baseMapStyle === "string" ? BASEMAP_LABEL_LAYER_IDS[baseMapStyle] : void 0;
1179
1520
  const instanceId = useId();
@@ -1181,8 +1522,12 @@ function StacCompareMap({
1181
1522
  const rightMapRef = useRef3(null);
1182
1523
  const compareRef = useRef3(null);
1183
1524
  const containerRef = useRef3(null);
1184
- const [leftMapLoaded, setLeftMapLoaded] = useState4(false);
1185
- const [rightMapLoaded, setRightMapLoaded] = useState4(false);
1525
+ const [leftMapLoaded, setLeftMapLoaded] = useState8(false);
1526
+ const [rightMapLoaded, setRightMapLoaded] = useState8(false);
1527
+ const { isInteractive, onActivate, onDeactivate } = useMapScrollGuard(
1528
+ showScrollGuard,
1529
+ containerRef
1530
+ );
1186
1531
  const containerClassName = make_class_name("blocks-stacmap-compare", [className]);
1187
1532
  const left = useStacRasterLayer(leftLayerConfig);
1188
1533
  const right = useStacRasterLayer(rightLayerConfig);
@@ -1191,7 +1536,7 @@ function StacCompareMap({
1191
1536
  const leftLayerId = `${leftLayerConfig.collectionId}-raster-layer-left-${instanceId}`;
1192
1537
  const rightSourceId = `${rightLayerConfig.collectionId}-raster-source-right-${instanceId}`;
1193
1538
  const rightLayerId = `${rightLayerConfig.collectionId}-raster-layer-right-${instanceId}`;
1194
- useEffect3(() => {
1539
+ useEffect5(() => {
1195
1540
  if (!leftMapLoaded || !rightMapLoaded) return;
1196
1541
  if (compareRef.current) return;
1197
1542
  const leftMap = leftMapRef.current?.getMap();
@@ -1210,7 +1555,7 @@ function StacCompareMap({
1210
1555
  }
1211
1556
  });
1212
1557
  }, [leftMapLoaded, rightMapLoaded]);
1213
- useEffect3(() => {
1558
+ useEffect5(() => {
1214
1559
  return () => {
1215
1560
  compareRef.current?.remove();
1216
1561
  compareRef.current = null;
@@ -1221,8 +1566,8 @@ function StacCompareMap({
1221
1566
  ...initialViewState && { initialViewState },
1222
1567
  style: MAP_PANEL_STYLE
1223
1568
  };
1224
- return /* @__PURE__ */ jsxs14("div", { ref: containerRef, className: containerClassName, children: [
1225
- /* @__PURE__ */ jsxs14(
1569
+ return /* @__PURE__ */ jsxs16("div", { ref: containerRef, className: containerClassName, children: [
1570
+ /* @__PURE__ */ jsxs16(
1226
1571
  MapLibreMap,
1227
1572
  {
1228
1573
  ref: leftMapRef,
@@ -1230,9 +1575,10 @@ function StacCompareMap({
1230
1575
  attributionControl: false,
1231
1576
  onLoad: () => setLeftMapLoaded(true),
1232
1577
  children: [
1233
- /* @__PURE__ */ jsx17(AttributionMapControl, {}),
1234
- /* @__PURE__ */ jsx17(NavigationControl, { position: "top-left", showCompass: false }),
1235
- left.mapSource.tiles && /* @__PURE__ */ jsx17(Source, { id: leftSourceId, type: "raster", tiles: [left.mapSource.tiles], children: /* @__PURE__ */ jsx17(
1578
+ /* @__PURE__ */ jsx26(AttributionMapControl, {}),
1579
+ /* @__PURE__ */ jsx26(NavigationControl, { position: "top-left", showCompass: false }),
1580
+ showScrollGuard && isInteractive && /* @__PURE__ */ jsx26(LockMapControl, { onDeactivate }),
1581
+ left.mapSource.tiles && /* @__PURE__ */ jsx26(Source, { id: leftSourceId, type: "raster", tiles: [left.mapSource.tiles], children: /* @__PURE__ */ jsx26(
1236
1582
  Layer,
1237
1583
  {
1238
1584
  id: leftLayerId,
@@ -1243,7 +1589,7 @@ function StacCompareMap({
1243
1589
  ]
1244
1590
  }
1245
1591
  ),
1246
- /* @__PURE__ */ jsxs14(
1592
+ /* @__PURE__ */ jsxs16(
1247
1593
  MapLibreMap,
1248
1594
  {
1249
1595
  ref: rightMapRef,
@@ -1251,8 +1597,8 @@ function StacCompareMap({
1251
1597
  attributionControl: false,
1252
1598
  onLoad: () => setRightMapLoaded(true),
1253
1599
  children: [
1254
- /* @__PURE__ */ jsx17(AttributionMapControl, {}),
1255
- right.mapSource.tiles && /* @__PURE__ */ jsx17(Source, { id: rightSourceId, type: "raster", tiles: [right.mapSource.tiles], children: /* @__PURE__ */ jsx17(
1600
+ /* @__PURE__ */ jsx26(AttributionMapControl, {}),
1601
+ right.mapSource.tiles && /* @__PURE__ */ jsx26(Source, { id: rightSourceId, type: "raster", tiles: [right.mapSource.tiles], children: /* @__PURE__ */ jsx26(
1256
1602
  Layer,
1257
1603
  {
1258
1604
  id: rightLayerId,
@@ -1263,33 +1609,40 @@ function StacCompareMap({
1263
1609
  ]
1264
1610
  }
1265
1611
  ),
1266
- /* @__PURE__ */ jsx17("div", { className: "blocks-stacmap-compare__date-chip", children: /* @__PURE__ */ jsx17(DateChip, { left: leftLayerConfig.dateRange, right: rightLayerConfig.dateRange }) }),
1267
- !isSameCollection && left.legend && /* @__PURE__ */ jsx17("div", { className: "blocks-stacmap-compare__legend-left", children: /* @__PURE__ */ jsx17(Legend, { ...left.legend }) }),
1268
- right.legend && /* @__PURE__ */ jsx17("div", { className: "blocks-stacmap-compare__legend-right", children: /* @__PURE__ */ jsx17(Legend, { ...right.legend }) })
1612
+ /* @__PURE__ */ jsx26("div", { className: "blocks-stacmap-compare__date-chip", children: /* @__PURE__ */ jsx26(DateChip, { left: leftLayerConfig.dateRange, right: rightLayerConfig.dateRange }) }),
1613
+ !isSameCollection && left.legend && /* @__PURE__ */ jsx26("div", { className: "blocks-stacmap-compare__legend-left", children: /* @__PURE__ */ jsx26(Legend, { ...left.legend }) }),
1614
+ right.legend && /* @__PURE__ */ jsx26("div", { className: "blocks-stacmap-compare__legend-right", children: /* @__PURE__ */ jsx26(Legend, { ...right.legend }) }),
1615
+ showScrollGuard && !isInteractive && /* @__PURE__ */ jsx26(MapScrollGuard, { onActivate })
1269
1616
  ] });
1270
1617
  }
1271
1618
 
1272
1619
  // src/geo/StacSingleLayerMap/StacSingleLayerMap.tsx
1273
- import { useId as useId2 } from "react";
1620
+ import { useId as useId2, useRef as useRef4 } from "react";
1274
1621
  import {
1275
1622
  Layer as Layer2,
1276
1623
  Map as MapLibreMap2,
1277
1624
  NavigationControl as NavigationControl2,
1278
1625
  Source as Source2
1279
1626
  } from "react-map-gl/maplibre";
1280
- import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
1627
+ import { jsx as jsx27, jsxs as jsxs17 } from "react/jsx-runtime";
1281
1628
  function StacSingleLayerMap({
1282
1629
  baseMapStyle = CARTO_DARK_WITH_LABELS_BASEMAP_STYLE,
1283
1630
  initialViewState,
1284
- layerConfig
1631
+ layerConfig,
1632
+ showScrollGuard = false
1285
1633
  }) {
1286
1634
  const resolvedBeforeLayerId = typeof baseMapStyle === "string" ? BASEMAP_LABEL_LAYER_IDS[baseMapStyle] : void 0;
1287
1635
  const instanceId = useId2();
1288
1636
  const sourceId = `${layerConfig.collectionId}-raster-source-${instanceId}`;
1289
1637
  const layerId = `${layerConfig.collectionId}-raster-layer-${instanceId}`;
1290
1638
  const { mapSource, legend } = useStacRasterLayer(layerConfig);
1291
- return /* @__PURE__ */ jsxs15("div", { className: "blocks-stacmap-singlelayer", children: [
1292
- /* @__PURE__ */ jsxs15(
1639
+ const containerRef = useRef4(null);
1640
+ const { isInteractive, onActivate, onDeactivate } = useMapScrollGuard(
1641
+ showScrollGuard,
1642
+ containerRef
1643
+ );
1644
+ return /* @__PURE__ */ jsxs17("div", { className: "blocks-stacmap-singlelayer", ref: containerRef, children: [
1645
+ /* @__PURE__ */ jsxs17(
1293
1646
  MapLibreMap2,
1294
1647
  {
1295
1648
  mapStyle: baseMapStyle,
@@ -1297,9 +1650,10 @@ function StacSingleLayerMap({
1297
1650
  style: { position: "absolute", inset: 0 },
1298
1651
  attributionControl: false,
1299
1652
  children: [
1300
- /* @__PURE__ */ jsx18(AttributionMapControl, {}),
1301
- /* @__PURE__ */ jsx18(NavigationControl2, { position: "top-left", showCompass: false }),
1302
- mapSource.tiles && /* @__PURE__ */ jsx18(Source2, { id: sourceId, type: "raster", tiles: [mapSource.tiles], children: /* @__PURE__ */ jsx18(
1653
+ /* @__PURE__ */ jsx27(AttributionMapControl, {}),
1654
+ /* @__PURE__ */ jsx27(NavigationControl2, { position: "top-left", showCompass: false }),
1655
+ showScrollGuard && isInteractive && /* @__PURE__ */ jsx27(LockMapControl, { onDeactivate }),
1656
+ mapSource.tiles && /* @__PURE__ */ jsx27(Source2, { id: sourceId, type: "raster", tiles: [mapSource.tiles], children: /* @__PURE__ */ jsx27(
1303
1657
  Layer2,
1304
1658
  {
1305
1659
  id: layerId,
@@ -1310,8 +1664,9 @@ function StacSingleLayerMap({
1310
1664
  ]
1311
1665
  }
1312
1666
  ),
1313
- /* @__PURE__ */ jsx18("div", { className: "blocks-stacmap-singlelayer__legend", children: legend && /* @__PURE__ */ jsx18(Legend, { ...legend }) }),
1314
- /* @__PURE__ */ jsx18("div", { className: "blocks-stacmap-singlelayer__date-chip", children: /* @__PURE__ */ jsx18(DateChip, { left: layerConfig.dateRange }) })
1667
+ /* @__PURE__ */ jsx27("div", { className: "blocks-stacmap-singlelayer__legend", children: legend && /* @__PURE__ */ jsx27(Legend, { ...legend }) }),
1668
+ /* @__PURE__ */ jsx27("div", { className: "blocks-stacmap-singlelayer__date-chip", children: /* @__PURE__ */ jsx27(DateChip, { left: layerConfig.dateRange }) }),
1669
+ showScrollGuard && !isInteractive && /* @__PURE__ */ jsx27(MapScrollGuard, { onActivate })
1315
1670
  ] });
1316
1671
  }
1317
1672
  export {
@@ -1324,11 +1679,12 @@ export {
1324
1679
  CardDetailed,
1325
1680
  CardMini,
1326
1681
  CardSimple,
1682
+ Carousel,
1327
1683
  Footer,
1328
1684
  GeoConfigProvider,
1329
1685
  Header,
1330
1686
  Legend,
1331
- Link3 as Link,
1687
+ Link,
1332
1688
  NASA_BLUE_MARBLE_BASEMAP_STYLE,
1333
1689
  OPEN_FREE_MAP_DARK_BASEMAP_STYLE,
1334
1690
  OPEN_FREE_MAP_LABELS_LAYER_ID,