@penn-libraries/web 1.1.1-dev.1 → 1.1.1-dev.2

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.
Files changed (61) hide show
  1. package/dist/cjs/{index-C0qvW4Ra.js → index-DVr0pLZy.js} +57 -3
  2. package/dist/cjs/index-DVr0pLZy.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/pennlibs-autocomplete.pennlibs-fallback-img.pennlibs-footer.pennlibs-header.pennlibs-iiif-img.entry.cjs.js.map +1 -0
  6. package/dist/cjs/{pennlibs-autocomplete_3.cjs.entry.js → pennlibs-autocomplete_5.cjs.entry.js} +261 -2
  7. package/dist/cjs/pennlibs-banner.cjs.entry.js +1 -1
  8. package/dist/cjs/pennlibs-chat.cjs.entry.js +1 -1
  9. package/dist/cjs/pennlibs-feedback.cjs.entry.js +1 -1
  10. package/dist/cjs/pennlibs-hero.cjs.entry.js +1 -1
  11. package/dist/cjs/web.cjs.js +2 -2
  12. package/dist/collection/components/pennlibs-iiif-img/pennlibs-iiif-img.css +9 -2
  13. package/dist/collection/components/pennlibs-iiif-img/pennlibs-iiif-img.js +147 -25
  14. package/dist/collection/components/pennlibs-iiif-img/pennlibs-iiif-img.js.map +1 -1
  15. package/dist/components/pennlibs-iiif-img.js +144 -23
  16. package/dist/components/pennlibs-iiif-img.js.map +1 -1
  17. package/dist/docs.json +4 -4
  18. package/dist/{web/p-D9dYrmUF.js → esm/index-Cst_89-s.js} +57 -3
  19. package/dist/esm/index-Cst_89-s.js.map +1 -0
  20. package/dist/esm/index.js +1 -1
  21. package/dist/esm/loader.js +3 -3
  22. package/dist/esm/pennlibs-autocomplete.pennlibs-fallback-img.pennlibs-footer.pennlibs-header.pennlibs-iiif-img.entry.js.map +1 -0
  23. package/dist/esm/{pennlibs-autocomplete_3.entry.js → pennlibs-autocomplete_5.entry.js} +260 -3
  24. package/dist/esm/pennlibs-banner.entry.js +1 -1
  25. package/dist/esm/pennlibs-chat.entry.js +1 -1
  26. package/dist/esm/pennlibs-feedback.entry.js +1 -1
  27. package/dist/esm/pennlibs-hero.entry.js +1 -1
  28. package/dist/esm/web.js +3 -3
  29. package/dist/types/components/pennlibs-iiif-img/pennlibs-iiif-img.d.ts +45 -4
  30. package/dist/types/components.d.ts +10 -10
  31. package/dist/web/index.esm.js +1 -1
  32. package/dist/web/{p-cb2584da.entry.js → p-4ffdbc93.entry.js} +1 -1
  33. package/dist/web/{p-b4b58af0.entry.js → p-621f166e.entry.js} +1 -1
  34. package/dist/web/{p-e6188c30.entry.js → p-6e0c2de9.entry.js} +260 -3
  35. package/dist/web/{p-ad92090a.entry.js → p-848d9acc.entry.js} +1 -1
  36. package/dist/{esm/index-D9dYrmUF.js → web/p-Cst_89-s.js} +57 -3
  37. package/dist/web/p-Cst_89-s.js.map +1 -0
  38. package/dist/web/{p-43d9c2d4.entry.js → p-a9c79310.entry.js} +1 -1
  39. package/dist/web/pennlibs-autocomplete.pennlibs-fallback-img.pennlibs-footer.pennlibs-header.pennlibs-iiif-img.entry.esm.js.map +1 -0
  40. package/dist/web/web.esm.js +3 -3
  41. package/hydrate/index.js +189 -30
  42. package/hydrate/index.mjs +189 -30
  43. package/package.json +1 -1
  44. package/dist/cjs/index-C0qvW4Ra.js.map +0 -1
  45. package/dist/cjs/pennlibs-autocomplete.pennlibs-footer.pennlibs-header.entry.cjs.js.map +0 -1
  46. package/dist/cjs/pennlibs-fallback-img.cjs.entry.js +0 -20
  47. package/dist/cjs/pennlibs-fallback-img.entry.cjs.js.map +0 -1
  48. package/dist/cjs/pennlibs-iiif-img.cjs.entry.js +0 -132
  49. package/dist/cjs/pennlibs-iiif-img.entry.cjs.js.map +0 -1
  50. package/dist/esm/index-D9dYrmUF.js.map +0 -1
  51. package/dist/esm/pennlibs-autocomplete.pennlibs-footer.pennlibs-header.entry.js.map +0 -1
  52. package/dist/esm/pennlibs-fallback-img.entry.js +0 -18
  53. package/dist/esm/pennlibs-fallback-img.entry.js.map +0 -1
  54. package/dist/esm/pennlibs-iiif-img.entry.js +0 -130
  55. package/dist/esm/pennlibs-iiif-img.entry.js.map +0 -1
  56. package/dist/web/p-D9dYrmUF.js.map +0 -1
  57. package/dist/web/p-c4074cf1.entry.js +0 -130
  58. package/dist/web/p-ce97059c.entry.js +0 -18
  59. package/dist/web/pennlibs-autocomplete.pennlibs-footer.pennlibs-header.entry.esm.js.map +0 -1
  60. package/dist/web/pennlibs-fallback-img.entry.esm.js.map +0 -1
  61. package/dist/web/pennlibs-iiif-img.entry.esm.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { r as registerInstance, c as createEvent, h, d as getElement, a as getAssetPath } from './p-D9dYrmUF.js';
1
+ import { r as registerInstance, c as createEvent, h, d as getElement, a as getAssetPath } from './p-Cst_89-s.js';
2
2
 
3
3
  const pennlibsAutocompleteCss = ":host {\n display: block;\n width: 100%;\n border-radius: 1.25rem;\n padding: 0;\n border-top: 0;\n position: relative;\n}\n\n[role=listbox] {\n position: absolute;\n margin-top: var(--pl-space-xs);\n background: var(--pl-color-bg-default);\n border-radius: 1.25rem;\n box-shadow: rgba(140, 149, 159, 0.3) 0px 8px 24px 0px;\n width: 100%;\n overflow: hidden;\n z-index: 1;\n\n display: flex;\n flex-direction: column;\n}\n\np {\n margin: 0;\n font-size: var(--pl-font-size-s);\n color: var(--pl-color-fg-subtle);\n padding: var(--pl-space-xs) calc(var(--pl-space-m) + var(--pl-space-2xs));\n font-size: var(--pl-font-size-s);\n order: 2;\n font-weight: 500;\n background: var(--pl-color-bg-subtle);\n border-radius: 0 0 1.25rem 1.25rem;\n\n display: flex;\n gap: var(--pl-space-s) var(--pl-space-l);\n flex-wrap: wrap;\n}\n\nol {\n list-style: none;\n margin: 0;\n padding: var(--pl-space-xs) 0;\n order: 1;\n}\n\n[role=option] {\n color: var(--pl-color-fg-default);\n padding: var(--pl-space-s) calc(var(--pl-space-m) + var(--pl-space-2xs));\n text-decoration: none;\n font-weight: 700; \n\n &:hover {\n cursor: pointer;\n }\n\n &:hover,\n &:focus {\n text-decoration-thickness: 2px;\n text-underline-offset: 2px;\n text-decoration: underline;\n }\n}\n\n[aria-selected=true] {\n text-decoration-thickness: 2px;\n text-underline-offset: 2px;\n text-decoration: underline;\n}\n\nmark,\nb {\n background: none;\n font-weight: 400;\n}\n\n.suggestion--border {\n border-bottom: solid 1px rgb(from var(--pl-color-fg-default) r g b / 0.2);\n padding-bottom: calc(var(--pl-space-2xs) + var(--pl-space-s));\n margin-bottom: var(--pl-space-2xs);\n}";
4
4
 
@@ -275,6 +275,20 @@ const Autocomplete = class {
275
275
  };
276
276
  Autocomplete.style = pennlibsAutocompleteCss;
277
277
 
278
+ const pennlibsFallbackImgCss = ":host{font-family:var(--pl-font-family);font-size:var(--pl-font-size);display:flex;align-items:center;justify-content:center;padding:1rem;background:var(--pl-color-bg-subtle);aspect-ratio:3/2}.no-image__img{width:100%;max-width:150px;filter:grayscale(1) opacity(0.3)}";
279
+
280
+ const NoImage = class {
281
+ constructor(hostRef) {
282
+ registerInstance(this, hostRef);
283
+ }
284
+ render() {
285
+ const shieldImg = getAssetPath('./assets/simplified-shield.webp');
286
+ return (h("img", { key: 'ba6cc227e90aac2e22b9997ad5c794fd4fd6d5ef', src: shieldImg, alt: "", class: "no-image__img" }));
287
+ }
288
+ static get assetsDirs() { return ["assets"]; }
289
+ };
290
+ NoImage.style = pennlibsFallbackImgCss;
291
+
278
292
  const pennlibsFooterCss = ":host {\n font-family: var(--pl-font-family);\n font-size: var(--pl-font-size);\n --padding-bottom: 5.75rem;\n}\n\n@media print {\n :host {\n display: none;\n }\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n}\n\n.website-footer-wrapper {\n background: var(--pl-color-penn-blue);\n padding-bottom: var(--padding-bottom);\n}\n\n.viewport-margins {\n max-width: var(--pl-viewport-margins-max-width);\n margin: 0 auto;\n padding: 0 var(--pl-viewport-margins-gutter, 1em);\n}\n\n.website-footer {\n background-size: cover;\n color: var(--pl-color-fg-subtle-on-emphasis);\n}\n\n.website-footer a {\n color: var(--pl-color-fg-subtle-on-emphasis);\n}\n\n.website-footer__content {\n padding: 4em 0;\n}\n\n.website-footer__links-container {\n gap: 4em 2em;\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(12em, 1fr));\n}\n\n.website-footer__heading {\n font-size: 0.8em;\n text-transform: uppercase;\n letter-spacing: 0.075em;\n margin-bottom: 1em;\n opacity: 0.75;\n}\n\n.website-footer__links {\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 0.75em;\n}\n\n.website-footer__links a {\n text-decoration: none;\n}\n\n.website-footer__links a:hover {\n text-decoration: underline;\n text-underline-offset: var(--pl-link-text-underline-offset);\n}\n\n.website-footer__footer {\n padding: 1em 0;\n background: rgba(1, 31, 91, 0.65);\n}\n\n.website-footer__links--footer {\n display: flex;\n flex-wrap: wrap;\n gap: 0;\n flex-direction: row;\n margin-left: -0.5em;\n\n @media (max-width: 1080px) {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(16em, 1fr));\n }\n}\n\n.website-footer__links--footer a {\n display: inline-block;\n padding: 0.5em 0.75em;\n font-size: 0.875em;\n opacity: 0.875;\n font-weight: 500;\n}\n\n.website-footer__links--footer a:hover {\n text-decoration: underline;\n text-underline-offset: var(--pl-link-text-underline-offset);\n}";
279
293
 
280
294
  const Footer = class {
@@ -374,5 +388,248 @@ const Header = class {
374
388
  };
375
389
  Header.style = pennlibsHeaderCss;
376
390
 
377
- export { Autocomplete as pennlibs_autocomplete, Footer as pennlibs_footer, Header as pennlibs_header };
378
- //# sourceMappingURL=pennlibs-autocomplete.pennlibs-footer.pennlibs-header.entry.esm.js.map
391
+ const pennlibsIiifImgCss = ":host{display:block;width:100%;max-width:100%;align-self:flex-start;aspect-ratio:var(--aspect-ratio, auto)}picture{display:block;line-height:0}.iiif-img{display:block;width:100%;max-width:100%;height:auto;opacity:0;filter:blur(5px);transition:opacity 0.15s ease-in, filter 0.15s ease-in}.iiif-img.loaded{opacity:1;filter:blur(0)}.fallback-container{display:block;width:100%;height:100%}.fallback-container pennlibs-fallback-img{width:100%;height:100%}pennlibs-fallback-img{display:block;width:100%;height:100%}";
392
+
393
+ const PIXEL_DENSITIES = [1, 1.5, 2];
394
+ const IIIFImg = class {
395
+ constructor(hostRef) {
396
+ registerInstance(this, hostRef);
397
+ /**
398
+ * The IIIF [region](https://iiif.io/api/image/3.0/#41-region) of the image to display.
399
+ * Defines the rectangular portion of the underlying image to return.
400
+ *
401
+ * `full`: The full image is returned, without any cropping.
402
+ *
403
+ * `square`: A square area where width and height equal the shorter dimension.
404
+ *
405
+ * `width:height`: Any aspect ratio format (e.g., `16:9`, `4:3`, `3:2`, `21:9`) applies
406
+ * a centered crop based on the source image dimensions and sets the CSS aspect-ratio
407
+ * property for layout reservation.
408
+ *
409
+ * `x,y,w,h`: Absolute pixel coordinates (x, y position; w, h dimensions).
410
+ *
411
+ * `pct:x,y,w,h`: Percentage-based coordinates of full image dimensions.
412
+ *
413
+ * @default 'full'
414
+ */
415
+ this.region = 'full';
416
+ /**
417
+ * The IIIF [rotation](https://iiif.io/api/image/3.0/#44-rotation) to apply to the image.
418
+ * Specifies mirroring and clockwise rotation in degrees (0-360).
419
+ *
420
+ * `n`: Rotation in degrees only.
421
+ *
422
+ * `!n`: Mirror the image vertically, then rotate by n degrees.
423
+ *
424
+ * @default '0'
425
+ */
426
+ this.rotation = '0';
427
+ /**
428
+ * The IIIF [quality](https://iiif.io/api/image/3.0/#quality) of the image.
429
+ * Controls the color delivery mode.
430
+ *
431
+ * `default`: The server's default quality.
432
+ *
433
+ * `color`: Full color information.
434
+ *
435
+ * `gray`: Grayscale rendering.
436
+ *
437
+ * `bitonal`: Black and white only.
438
+ *
439
+ * @default 'default'
440
+ */
441
+ this.quality = 'default';
442
+ /**
443
+ * Native browser lazy loading behavior. Use "lazy" to defer loading until the image is near the viewport,
444
+ * or "eager" to load immediately.
445
+ * @default 'lazy'
446
+ */
447
+ this.loading = 'lazy';
448
+ /**
449
+ * Whether to display a fallback placeholder image when the IIIF image fails to load.
450
+ * @default true
451
+ */
452
+ this.showFallback = true;
453
+ this.isLoaded = false;
454
+ this.hasError = false;
455
+ this.baseUrl = 'https://iiif-images.library.upenn.edu/iiif/3';
456
+ this.handleLoad = () => {
457
+ this.isLoaded = true;
458
+ };
459
+ this.handleError = () => {
460
+ this.hasError = true;
461
+ };
462
+ }
463
+ /**
464
+ * Fetch IIIF image info to get actual dimensions.
465
+ */
466
+ async fetchImageInfo() {
467
+ try {
468
+ const currentUuid = this.uuid; // Capture current UUID
469
+ const infoUrl = `${this.baseUrl}/${currentUuid}/info.json`;
470
+ const response = await fetch(infoUrl);
471
+ if (!response.ok) {
472
+ console.error(`Failed to fetch IIIF info.json for ${currentUuid}`);
473
+ return;
474
+ }
475
+ const info = await response.json();
476
+ // Only update dimensions if UUID hasn't changed during fetch
477
+ // (protects against race conditions if component updates)
478
+ if (this.uuid === currentUuid) {
479
+ this.imageDimensions = {
480
+ width: info.width,
481
+ height: info.height,
482
+ };
483
+ this.fetchedUuid = currentUuid;
484
+ }
485
+ }
486
+ catch (error) {
487
+ console.error(`Error fetching IIIF image info for ${this.uuid}:`, error);
488
+ }
489
+ }
490
+ /**
491
+ * Check if a region value matches aspect ratio format (e.g., "16:9", "4:3", "3:2").
492
+ */
493
+ isAspectRatio(value) {
494
+ return /^\d+:\d+$/.test(value);
495
+ }
496
+ /**
497
+ * Set CSS custom property for aspect ratio on the host element.
498
+ */
499
+ setAspectRatioCss(aspectRatio) {
500
+ const [widthRatio, heightRatio] = aspectRatio.split(':');
501
+ this.hostElement.style.setProperty('--aspect-ratio', `${widthRatio} / ${heightRatio}`);
502
+ }
503
+ /**
504
+ * Clear CSS custom property for aspect ratio from the host element.
505
+ */
506
+ clearAspectRatioCss() {
507
+ this.hostElement.style.removeProperty('--aspect-ratio');
508
+ }
509
+ /**
510
+ * Format a number for IIIF percentage values (remove trailing zeros).
511
+ * IIIF spec requires no trailing zeros per section 4.7.
512
+ */
513
+ formatPercent(value) {
514
+ return value.toFixed(2).replace(/\.?0+$/, '');
515
+ }
516
+ /**
517
+ * Calculate a centered crop region for a given aspect ratio.
518
+ * Requires actual image dimensions to calculate correctly.
519
+ * @param aspectRatio - The target aspect ratio (e.g., "3:2" or "2:3")
520
+ * @returns A IIIF percentage-based region string (e.g., "pct:0,16.67,100,66.67")
521
+ */
522
+ calculateCenteredCrop(aspectRatio) {
523
+ if (!this.imageDimensions) {
524
+ throw new Error('Image dimensions required for aspect ratio calculation');
525
+ }
526
+ const [widthRatio, heightRatio] = aspectRatio.split(':').map(Number);
527
+ const targetRatio = widthRatio / heightRatio;
528
+ const sourceRatio = this.imageDimensions.width / this.imageDimensions.height;
529
+ // Determine if we need to crop width or height
530
+ if (sourceRatio > targetRatio) {
531
+ // Source is wider than target - crop left and right
532
+ const widthPercent = (targetRatio / sourceRatio) * 100;
533
+ const xOffset = (100 - widthPercent) / 2;
534
+ return `pct:${this.formatPercent(xOffset)},0,${this.formatPercent(widthPercent)},100`;
535
+ }
536
+ else {
537
+ // Source is taller than target - crop top and bottom
538
+ const heightPercent = (sourceRatio / targetRatio) * 100;
539
+ const yOffset = (100 - heightPercent) / 2;
540
+ return `pct:0,${this.formatPercent(yOffset)},100,${this.formatPercent(heightPercent)}`;
541
+ }
542
+ }
543
+ /**
544
+ * Get the region parameter for the IIIF URL.
545
+ */
546
+ getRegionParam() {
547
+ // Handle custom aspect ratios
548
+ let regionParam = this.region || 'full';
549
+ if (this.isAspectRatio(regionParam)) {
550
+ // Only apply crop if we have dimensions for the current UUID
551
+ if (this.imageDimensions && this.fetchedUuid === this.uuid) {
552
+ regionParam = this.calculateCenteredCrop(regionParam);
553
+ }
554
+ else {
555
+ // Use full image until dimensions are loaded
556
+ regionParam = 'full';
557
+ }
558
+ }
559
+ return regionParam;
560
+ }
561
+ buildIIIFUrl(width, format = 'jpg') {
562
+ const sizeParam = width ? `${width},` : 'max';
563
+ const regionParam = this.getRegionParam();
564
+ return `${this.baseUrl}/${this.uuid}/${regionParam}/${sizeParam}/${this.rotation}/${this.quality}.${format}`;
565
+ }
566
+ generateSrcset(baseWidth, format) {
567
+ return PIXEL_DENSITIES.map(density => {
568
+ const width = Math.round(baseWidth * density);
569
+ const url = this.buildIIIFUrl(width, format);
570
+ return `${url} ${density}x`;
571
+ }).join(', ');
572
+ }
573
+ handleRegionChange(newValue, oldValue) {
574
+ // Only process if region actually changed
575
+ if (newValue === oldValue) {
576
+ return;
577
+ }
578
+ // If new region is an aspect ratio, set CSS and fetch info
579
+ if (newValue && this.isAspectRatio(newValue)) {
580
+ this.setAspectRatioCss(newValue);
581
+ this.fetchImageInfo();
582
+ }
583
+ else {
584
+ // Clear aspect ratio CSS if no longer using aspect ratio format
585
+ this.clearAspectRatioCss();
586
+ }
587
+ }
588
+ componentDidLoad() {
589
+ // Set CSS aspect ratio and fetch image info if using aspect ratio format
590
+ if (this.region && this.isAspectRatio(this.region)) {
591
+ this.setAspectRatioCss(this.region);
592
+ this.fetchImageInfo();
593
+ }
594
+ if ('ResizeObserver' in window) {
595
+ this.resizeObserver = new ResizeObserver(entries => {
596
+ for (const entry of entries) {
597
+ this.observedWidth = Math.round(entry.contentRect.width);
598
+ if (this.resizeObserver) {
599
+ this.resizeObserver.disconnect();
600
+ this.resizeObserver = undefined;
601
+ }
602
+ }
603
+ });
604
+ this.resizeObserver.observe(this.hostElement);
605
+ }
606
+ }
607
+ disconnectedCallback() {
608
+ if (this.resizeObserver) {
609
+ this.resizeObserver.disconnect();
610
+ this.resizeObserver = undefined;
611
+ }
612
+ }
613
+ render() {
614
+ // Show placeholder until we've measured the component width
615
+ if (!this.observedWidth) {
616
+ return h("pennlibs-fallback-img", null);
617
+ }
618
+ if (this.hasError && this.showFallback) {
619
+ return (h("div", { class: "fallback-container" }, h("pennlibs-fallback-img", null)));
620
+ }
621
+ const imgClasses = {
622
+ 'iiif-img': true,
623
+ 'loaded': this.isLoaded
624
+ };
625
+ return (h("picture", null, h("source", { type: "image/webp", srcSet: this.generateSrcset(this.observedWidth, 'webp') }), h("img", { class: imgClasses, src: this.buildIIIFUrl(this.observedWidth, 'jpg'), srcSet: this.generateSrcset(this.observedWidth, 'jpg'), alt: this.alt, loading: this.loading, onLoad: this.handleLoad, onError: this.handleError })));
626
+ }
627
+ get hostElement() { return getElement(this); }
628
+ static get watchers() { return {
629
+ "region": ["handleRegionChange"]
630
+ }; }
631
+ };
632
+ IIIFImg.style = pennlibsIiifImgCss;
633
+
634
+ export { Autocomplete as pennlibs_autocomplete, NoImage as pennlibs_fallback_img, Footer as pennlibs_footer, Header as pennlibs_header, IIIFImg as pennlibs_iiif_img };
635
+ //# sourceMappingURL=pennlibs-autocomplete.pennlibs-fallback-img.pennlibs-footer.pennlibs-header.pennlibs-iiif-img.entry.esm.js.map
@@ -1,4 +1,4 @@
1
- import { r as registerInstance, h } from './p-D9dYrmUF.js';
1
+ import { r as registerInstance, h } from './p-Cst_89-s.js';
2
2
 
3
3
  const pennlibsChatCss = ":host {\n font-family: var(--pl-font-family);\n font-size: var(--pl-font-size);\n line-height: normal;\n}\n\n@media print {\n :host {\n display: none;\n }\n}\n\na {\n display: flex;\n align-items: center;\n background: linear-gradient(45deg, #faa755, #fcca99);\n border-radius: 1em;\n position: fixed;\n bottom: 0.75em;\n right: 0.75em;\n box-shadow: rgba(0,0,0,0.3) 0px 2px 16px 0px;\n color: var(--pl-color-penn-blue);\n text-decoration: none;\n font-weight: 500;\n padding: 0.15em;\n font-size: 1em;\n\n @media (min-width: 820px) {\n bottom: 1.5em;\n right: 1.5em;\n width: auto;\n padding: 0.15em 0.75em;\n padding-left: 0.5em;\n }\n}\n\na:hover {\n text-decoration: underline;\n text-underline-offset: var(--pl-link-text-underline-offset);\n text-decoration-thickness: var(--pl-link-hover-text-decoration-thickness);\n}\n\na:hover,\na:focus {\n outline: none;\n box-shadow: 0 0 0 2px var(--pl-color-bg-attention),0 0 0 4px var(--pl-color-penn-blue), rgba(0,0,0,0.3) 0px 2px 16px 0px;;\n}\n\nsvg {\n width: 2.5em;\n height: 2.5em;\n}\n\nspan {\n display: none;\n font-size: 1.1em;\n\n @media (min-width: 820px) {\n display: inline;\n }\n}";
4
4
 
@@ -1,5 +1,5 @@
1
1
  const NAMESPACE = 'web';
2
- const BUILD = /* web */ { hydratedSelectorName: "hydrated", lazyLoad: true, propChangeCallback: false, updatable: true};
2
+ const BUILD = /* web */ { hydratedSelectorName: "hydrated", lazyLoad: true, propChangeCallback: true, updatable: true};
3
3
 
4
4
  const globalScripts = () => {};
5
5
  const globalStyles = "@import url(\"https://use.typekit.net/gbh8cmg.css\");\n\n:root {\n --pl-color-penn-red: #990000;\n --pl-color-penn-blue: #011F5B;\n --pl-color-gray-dark: #2D3545;\n --pl-color-gray: #595F6A;\n --pl-color-gray-light: #F5F5F6;\n --pl-color-gray-blue-light: #EEEEF4;\n --pl-color-white: #FFFFFF;\n --pl-color-blue: #0E5696;\n --pl-color-blue-light: #D4E4F2;\n --pl-color-green: #267434;\n --pl-color-green-light: #F1F7E1;\n --pl-color-orange: #BD4718;\n --pl-color-orange-light: #FEEDDD;\n --pl-color-purple: #80317F;\n --pl-color-purple-light: #F2DFED;\n --pl-color-bg-gradient-1: linear-gradient(45deg, rgba(200, 219, 232, 0.8), rgba(239, 210, 215, 0.8));\n --pl-color-bg-gradient-2: linear-gradient(45deg, #dbe9f5, #feefdf);\n --pl-font-size: 16px;\n --pl-font-sans-serif: proxima-nova, system-ui, sans-serif;\n --pl-font-serif: cormorant-garamond, serif;\n --pl-link-text-underline-offset: 0.2em;\n --pl-link-text-decoration-thickness: 1px;\n --pl-link-hover-text-decoration-thickness: 2px;\n --pl-viewport-margins-max-width: 1440px;\n --pl-viewport-margins-gutter: 1em;\n --pl-color-fg-default: var(--pl-color-gray-dark);\n --pl-color-fg-subtle: var(--pl-color-gray);\n --pl-color-fg-subtle-on-emphasis: var(--pl-color-gray-light);\n --pl-color-fg-on-emphasis: var(--pl-color-white);\n --pl-color-fg-accent: var(--pl-color-blue);\n --pl-color-fg-success: var(--pl-color-green);\n --pl-color-fg-attention: var(--pl-color-orange);\n --pl-color-fg-info: var(--pl-color-purple);\n --pl-color-bg-default: var(--pl-color-white);\n --pl-color-bg-subtle: var(--pl-color-gray-light);\n --pl-color-bg-subtle-brand: var(--pl-color-gray-blue-light);\n --pl-color-bg-emphasis: var(--pl-color-gray-dark);\n --pl-color-bg-accent: var(--pl-color-blue-light);\n --pl-color-bg-success: var(--pl-color-green-light);\n --pl-color-bg-attention: var(--pl-color-orange-light);\n --pl-color-bg-info: var(--pl-color-purple-light);\n --pl-color-bg-accent-emphasis: var(--pl-color-blue);\n --pl-color-bg-success-emphasis: var(--pl-color-green);\n --pl-color-bg-attention-emphasis: var(--pl-color-orange);\n --pl-color-bg-info-emphasis: var(--pl-color-purple);\n --pl-font-family: var(--pl-font-sans-serif);\n --pl-link-text-underline-offset: 0.2em;\n --pl-link-text-decoration-thickness: 1px;\n --pl-link-hover-text-decoration-thickness: 2px;\n\n /* Font size tokens */\n --pl-font-size-5xl: 3rem;\n --pl-font-size-4xl: 2.75rem;\n --pl-font-size-3xl: 2.25rem;\n --pl-font-size-2xl: 1.5rem;\n --pl-font-size-xl: 1.25rem;\n --pl-font-size-l: 1.125rem;\n --pl-font-size-m: 1rem;\n --pl-font-size-s: 0.875rem;\n --pl-font-size-xs: 0.75rem;\n \n /* Spacing tokens */\n --pl-space-3xs: 0.125rem;\n --pl-space-2xs: 0.25rem;\n --pl-space-xs: 0.5rem;\n --pl-space-s: 0.75rem;\n --pl-space-m: 1rem;\n --pl-space-l: 1.5rem;\n --pl-space-xl: 2rem;\n --pl-space-2xl: 3rem;\n --pl-space-3xl: 4rem;\n\n /* Border radius tokens */\n --pl-border-radius-subtle: 0.25rem;\n --pl-border-radius: 1rem;\n\n /* Focus box shadow tokens */\n --pl-focus-box-shadow: 0 0 0 2px var(--pl-color-bg-accent), 0 0 0 4px var(--pl-color-fg-default);\n}\n\n@media (min-width: 768px) {\n :root {\n --pl-viewport-margins-gutter: 3em;\n }\n}\n\n@media print {\n body {\n zoom: 80%;\n }\n}\n\n.pl-viewport-margins {\n max-width: var(--pl-viewport-margins-max-width);\n margin: 0 auto;\n padding: 0 var(--pl-viewport-margins-gutter, 1rem);\n width: 100%;\n}\n\n/*\n Prevents a flash of unstyled content (FOUC) while custom elements are loading.\n Ensures that elements are only visible once they're fully defined and ready to be displayed.\n*/\n:not(:defined) {\n visibility: hidden;\n}\n\n/*\n Reset\n*/\n\n:where(.pl-reset) {\n font-weight: 400;\n line-height: 1.4;\n color: var(--pl-color-fg-default);\n accent-color: var(--pl-color-fg-accent);\n\n /* Use a more-intuitive box-sizing model */\n & :is(*, *::before, *::after) {\n box-sizing: border-box;\n margin: 0;\n }\n\n /* Improve media defaults */\n & :is(img, picture, video, canvas, svg) {\n display: block;\n max-width: 100%;\n }\n\n /* Inherit fonts for form controls */\n & :is(input, button, textarea, select) {\n font: var(--pl-font-family);\n }\n\n /* Avoid text overflows */\n & :is(p, h1, h2, h3, h4, h5, h6) {\n overflow-wrap: break-word;\n }\n\n /* Improve line wrapping */\n & p {\n text-wrap: pretty;\n }\n & :is(h1, h2, h3, h4, h5, h6) {\n text-wrap: balance;\n }\n\n /* Link styles */\n & a {\n color: var(--pl-color-fg-accent);\n text-decoration: underline;\n text-underline-offset: var(--pl-link-text-underline-offset);\n text-decoration-thickness: var(--pl-link-text-decoration-thickness);\n font-weight: 500;\n\n &:hover {\n text-decoration-thickness: 3px;\n }\n }\n}\n\n/*\n Typeset\n*/\n\n:where(.pl-typeset) {\n font-family: var(--pl-font-family);\n \n & :is(p, .pl-p) {\n font-family: var(--pl-font-family);\n }\n\n & :is(h1, .pl-h1, h2, .pl-h2) {\n font-family: var(--pl-font-serif);\n }\n\n & :is(h1, .pl-h1, h2, .pl-h2, h3, .pl-h3, h4, .pl-h4, h5, .pl-h5, h6, .pl-h6) {\n font-weight: 600;\n }\n\n & *+:is(h2,h3,h4,h5,h6) {\n margin-block-start: var(--pl-space-xl);\n }\n\n & :is(h1, .pl-h1, h2, .pl-h2) {\n font-weight: 600;\n line-height: 1.125;\n font-family: var(--pl-font-serif);\n color: var(--pl-color-penn-blue);\n position: relative;\n\n &::after {\n bottom: -0.25rem;\n content: \"\";\n display: block;\n height: 4px;\n opacity: 1;\n position: absolute;\n }\n }\n\n & :is(h1, .pl-h1) {\n font-size: var(--pl-font-size-5xl);\n margin-bottom: 0.5em;\n margin-top: 0;\n\n &::after {\n background: var(--pl-color-penn-red);\n width: 2.25rem;\n }\n }\n\n & :is(h2, .pl-h2) {\n font-size: var(--pl-font-size-3xl);\n margin-bottom: 0.5em;\n\n &::after {\n background: #d6d6dc;\n width: 2.25rem;\n }\n }\n\n & :is(h3, .pl-h3) {\n font-size: var(--pl-font-size-xl);\n font-family: var(--pl-font-sans-serif);\n color: var(--pl-color-fg-default);\n margin-bottom: var(--pl-space-m);\n\n &:after {\n content: none;\n }\n }\n\n & :is(h4, .pl-h4) {\n font-size: var(--pl-font-size-m);\n margin-bottom: var(--pl-space-s);\n\n &:after {\n content: none;\n }\n }\n}\n\n/* \n Display\n*/\n.pl-block { display: block; }\n.pl-inline { display: inline; }\n.pl-inline-block { display: inline-block; }\n.pl-flex { display: flex; }\n.pl-inline-flex { display: inline-flex; }\n.pl-grid { display: grid; }\n.pl-inline-grid { display: inline-grid; }\n.pl-none { display: none; }\n\n/* \n Flex direction utilities\n*/\n.pl-flex-row { flex-direction: row; }\n.pl-flex-col { flex-direction: column; }\n\n/* \n Spacing\n*/\n\n/* Margin utilities */\n.pl-margin-0 { margin: 0; }\n.pl-margin-2xs { margin: var(--pl-space-2xs); }\n.pl-margin-xs { margin: var(--pl-space-xs); }\n.pl-margin-s { margin: var(--pl-space-s); }\n.pl-margin-m { margin: var(--pl-space-m); }\n.pl-margin-l { margin: var(--pl-space-l); }\n.pl-margin-xl { margin: var(--pl-space-xl); }\n.pl-margin-2xl { margin: var(--pl-space-2xl); }\n.pl-margin-3xl { margin: var(--pl-space-3xl); }\n\n/* Margin top */\n.pl-margin-t-0 { margin-top: 0; }\n.pl-margin-t-2xs { margin-top: var(--pl-space-2xs); }\n.pl-margin-t-xs { margin-top: var(--pl-space-xs); }\n.pl-margin-t-s { margin-top: var(--pl-space-s); }\n.pl-margin-t-m { margin-top: var(--pl-space-m); }\n.pl-margin-t-l { margin-top: var(--pl-space-l); }\n.pl-margin-t-xl { margin-top: var(--pl-space-xl); }\n.pl-margin-t-2xl { margin-top: var(--pl-space-2xl); }\n.pl-margin-t-3xl { margin-top: var(--pl-space-3xl); }\n\n/* Margin bottom */\n.pl-margin-b-0 { margin-bottom: 0; }\n.pl-margin-b-2xs { margin-bottom: var(--pl-space-2xs); }\n.pl-margin-b-xs { margin-bottom: var(--pl-space-xs); }\n.pl-margin-b-s { margin-bottom: var(--pl-space-s); }\n.pl-margin-b-m { margin-bottom: var(--pl-space-m); }\n.pl-margin-b-l { margin-bottom: var(--pl-space-l); }\n.pl-margin-b-xl { margin-bottom: var(--pl-space-xl); }\n.pl-margin-b-2xl { margin-bottom: var(--pl-space-2xl); }\n.pl-margin-b-3xl { margin-bottom: var(--pl-space-3xl); }\n\n/* Margin left */\n.pl-margin-l-0 { margin-left: 0; }\n.pl-margin-l-2xs { margin-left: var(--pl-space-2xs); }\n.pl-margin-l-xs { margin-left: var(--pl-space-xs); }\n.pl-margin-l-s { margin-left: var(--pl-space-s); }\n.pl-margin-l-m { margin-left: var(--pl-space-m); }\n.pl-margin-l-l { margin-left: var(--pl-space-l); }\n.pl-margin-l-xl { margin-left: var(--pl-space-xl); }\n.pl-margin-l-2xl { margin-left: var(--pl-space-2xl); }\n.pl-margin-l-3xl { margin-left: var(--pl-space-3xl); }\n\n/* Margin right */\n.pl-margin-r-0 { margin-right: 0; }\n.pl-margin-r-2xs { margin-right: var(--pl-space-2xs); }\n.pl-margin-r-xs { margin-right: var(--pl-space-xs); }\n.pl-margin-r-s { margin-right: var(--pl-space-s); }\n.pl-margin-r-m { margin-right: var(--pl-space-m); }\n.pl-margin-r-l { margin-right: var(--pl-space-l); }\n.pl-margin-r-xl { margin-right: var(--pl-space-xl); }\n.pl-margin-r-2xl { margin-right: var(--pl-space-2xl); }\n.pl-margin-r-3xl { margin-right: var(--pl-space-3xl); }\n\n/* Margin x (left and right) */\n.pl-margin-x-0 { margin-left: 0; margin-right: 0; }\n.pl-margin-x-2xs { margin-left: var(--pl-space-2xs); margin-right: var(--pl-space-2xs); }\n.pl-margin-x-xs { margin-left: var(--pl-space-xs); margin-right: var(--pl-space-xs); }\n.pl-margin-x-s { margin-left: var(--pl-space-s); margin-right: var(--pl-space-s); }\n.pl-margin-x-m { margin-left: var(--pl-space-m); margin-right: var(--pl-space-m); }\n.pl-margin-x-l { margin-left: var(--pl-space-l); margin-right: var(--pl-space-l); }\n.pl-margin-x-xl { margin-left: var(--pl-space-xl); margin-right: var(--pl-space-xl); }\n.pl-margin-x-2xl { margin-left: var(--pl-space-2xl); margin-right: var(--pl-space-2xl); }\n.pl-margin-x-3xl { margin-left: var(--pl-space-3xl); margin-right: var(--pl-space-3xl); }\n\n/* Margin y (top and bottom) */\n.pl-margin-y-0 { margin-top: 0; margin-bottom: 0; }\n.pl-margin-y-2xs { margin-top: var(--pl-space-2xs); margin-bottom: var(--pl-space-2xs); }\n.pl-margin-y-xs { margin-top: var(--pl-space-xs); margin-bottom: var(--pl-space-xs); }\n.pl-margin-y-s { margin-top: var(--pl-space-s); margin-bottom: var(--pl-space-s); }\n.pl-margin-y-m { margin-top: var(--pl-space-m); margin-bottom: var(--pl-space-m); }\n.pl-margin-y-l { margin-top: var(--pl-space-l); margin-bottom: var(--pl-space-l); }\n.pl-margin-y-xl { margin-top: var(--pl-space-xl); margin-bottom: var(--pl-space-xl); }\n.pl-margin-y-2xl { margin-top: var(--pl-space-2xl); margin-bottom: var(--pl-space-2xl); }\n.pl-margin-y-3xl { margin-top: var(--pl-space-3xl); margin-bottom: var(--pl-space-3xl); }\n\n/* Padding utilities */\n.pl-padding-0 { padding: 0; }\n.pl-padding-2xs { padding: var(--pl-space-2xs); }\n.pl-padding-xs { padding: var(--pl-space-xs); }\n.pl-padding-s { padding: var(--pl-space-s); }\n.pl-padding-m { padding: var(--pl-space-m); }\n.pl-padding-l { padding: var(--pl-space-l); }\n.pl-padding-xl { padding: var(--pl-space-xl); }\n.pl-padding-2xl { padding: var(--pl-space-2xl); }\n.pl-padding-3xl { padding: var(--pl-space-3xl); }\n\n/* Padding top */\n.pl-padding-t-0 { padding-top: 0; }\n.pl-padding-t-2xs { padding-top: var(--pl-space-2xs); }\n.pl-padding-t-xs { padding-top: var(--pl-space-xs); }\n.pl-padding-t-s { padding-top: var(--pl-space-s); }\n.pl-padding-t-m { padding-top: var(--pl-space-m); }\n.pl-padding-t-l { padding-top: var(--pl-space-l); }\n.pl-padding-t-xl { padding-top: var(--pl-space-xl); }\n.pl-padding-t-2xl { padding-top: var(--pl-space-2xl); }\n.pl-padding-t-3xl { padding-top: var(--pl-space-3xl); }\n\n/* Padding bottom */\n.pl-padding-b-0 { padding-bottom: 0; }\n.pl-padding-b-2xs { padding-bottom: var(--pl-space-2xs); }\n.pl-padding-b-xs { padding-bottom: var(--pl-space-xs); }\n.pl-padding-b-s { padding-bottom: var(--pl-space-s); }\n.pl-padding-b-m { padding-bottom: var(--pl-space-m); }\n.pl-padding-b-l { padding-bottom: var(--pl-space-l); }\n.pl-padding-b-xl { padding-bottom: var(--pl-space-xl); }\n.pl-padding-b-2xl { padding-bottom: var(--pl-space-2xl); }\n.pl-padding-b-3xl { padding-bottom: var(--pl-space-3xl); }\n\n/* Padding left */\n.pl-padding-l-0 { padding-left: 0; }\n.pl-padding-l-2xs { padding-left: var(--pl-space-2xs); }\n.pl-padding-l-xs { padding-left: var(--pl-space-xs); }\n.pl-padding-l-s { padding-left: var(--pl-space-s); }\n.pl-padding-l-m { padding-left: var(--pl-space-m); }\n.pl-padding-l-l { padding-left: var(--pl-space-l); }\n.pl-padding-l-xl { padding-left: var(--pl-space-xl); }\n.pl-padding-l-2xl { padding-left: var(--pl-space-2xl); }\n.pl-padding-l-3xl { padding-left: var(--pl-space-3xl); }\n\n/* Padding right */\n.pl-padding-r-0 { padding-right: 0; }\n.pl-padding-r-2xs { padding-right: var(--pl-space-2xs); }\n.pl-padding-r-xs { padding-right: var(--pl-space-xs); }\n.pl-padding-r-s { padding-right: var(--pl-space-s); }\n.pl-padding-r-m { padding-right: var(--pl-space-m); }\n.pl-padding-r-l { padding-right: var(--pl-space-l); }\n.pl-padding-r-xl { padding-right: var(--pl-space-xl); }\n.pl-padding-r-2xl { padding-right: var(--pl-space-2xl); }\n.pl-padding-r-3xl { padding-right: var(--pl-space-3xl); }\n\n/* Padding x (left and right) */\n.pl-padding-x-0 { padding-left: 0; padding-right: 0; }\n.pl-padding-x-2xs { padding-left: var(--pl-space-2xs); padding-right: var(--pl-space-2xs); }\n.pl-padding-x-xs { padding-left: var(--pl-space-xs); padding-right: var(--pl-space-xs); }\n.pl-padding-x-s { padding-left: var(--pl-space-s); padding-right: var(--pl-space-s); }\n.pl-padding-x-m { padding-left: var(--pl-space-m); padding-right: var(--pl-space-m); }\n.pl-padding-x-l { padding-left: var(--pl-space-l); padding-right: var(--pl-space-l); }\n.pl-padding-x-xl { padding-left: var(--pl-space-xl); padding-right: var(--pl-space-xl); }\n.pl-padding-x-2xl { padding-left: var(--pl-space-2xl); padding-right: var(--pl-space-2xl); }\n.pl-padding-x-3xl { padding-left: var(--pl-space-3xl); padding-right: var(--pl-space-3xl); }\n\n/* Padding y (top and bottom) */\n.pl-padding-y-0 { padding-top: 0; padding-bottom: 0; }\n.pl-padding-y-2xs { padding-top: var(--pl-space-2xs); padding-bottom: var(--pl-space-2xs); }\n.pl-padding-y-xs { padding-top: var(--pl-space-xs); padding-bottom: var(--pl-space-xs); }\n.pl-padding-y-s { padding-top: var(--pl-space-s); padding-bottom: var(--pl-space-s); }\n.pl-padding-y-m { padding-top: var(--pl-space-m); padding-bottom: var(--pl-space-m); }\n.pl-padding-y-l { padding-top: var(--pl-space-l); padding-bottom: var(--pl-space-l); }\n.pl-padding-y-xl { padding-top: var(--pl-space-xl); padding-bottom: var(--pl-space-xl); }\n.pl-padding-y-2xl { padding-top: var(--pl-space-2xl); padding-bottom: var(--pl-space-2xl); }\n.pl-padding-y-3xl { padding-top: var(--pl-space-3xl); padding-bottom: var(--pl-space-3xl); }\n\n/* Gap utilities for flexbox and grid */\n.pl-gap-0 { gap: 0; }\n.pl-gap-2xs { gap: var(--pl-space-2xs); }\n.pl-gap-xs { gap: var(--pl-space-xs); }\n.pl-gap-s { gap: var(--pl-space-s); }\n.pl-gap-m { gap: var(--pl-space-m); }\n.pl-gap-l { gap: var(--pl-space-l); }\n.pl-gap-xl { gap: var(--pl-space-xl); }\n.pl-gap-2xl { gap: var(--pl-space-2xl); }\n.pl-gap-3xl { gap: var(--pl-space-3xl); } \n\n/*\n Font size\n*/\n\n.pl-font-size-xs {\n font-size: var(--pl-font-size-xs);\n}\n\n.pl-font-size-s {\n font-size: var(--pl-font-size-s);\n}\n\n.pl-font-size-m {\n font-size: var(--pl-font-size-m);\n}\n\n.pl-font-size-l {\n font-size: var(--pl-font-size-l);\n}\n\n.pl-font-size-xl {\n font-size: var(--pl-font-size-xl);\n}\n\n.pl-font-size-2xl {\n font-size: var(--pl-font-size-2xl);\n}\n\n.pl-font-size-3xl {\n font-size: var(--pl-font-size-3xl);\n}\n\n.pl-font-size-4xl {\n font-size: var(--pl-font-size-4xl);\n}\n\n.pl-font-size-5xl {\n font-size: var(--pl-font-size-5xl);\n}\n\n/*\n Line length\n*/\n\n.pl-line-length {\n max-width: 60ch;\n}\n\n/*\n Border radius\n*/\n\n.pl-border-radius-subtle {\n border-radius: var(--pl-border-radius-subtle);\n}\n\n.pl-border-radius {\n border-radius: var(--pl-border-radius);\n}\n\n/*\n Definition list\n*/\n\n.pl-dl:not(.pl-dl--inline) {\n display: grid;\n grid-row-gap: 0.25rem;\n \n & dt {\n font-weight: 600;\n margin-top: 0.5rem;\n }\n}\n\n@media (min-width: 720px) {\n .pl-dl:not(.pl-dl--inline) {\n grid-template-columns: 12rem 1fr;\n\n & dt {\n grid-column: 1 / 2;\n margin-top: 0;\n padding-right: 1rem;\n }\n\n & dd {\n grid-column: 2 / 3;\n margin-bottom: 0;\n }\n }\n}\n\n@media (min-width: 720px) {\n .pl-dl:not(.pl-dl--inline) dt:not(:first-of-type),\n .pl-dl:not(.pl-dl--inline) dt:not(:first-of-type) + dd {\n padding-top: 0.75rem;\n margin-top: 0.5rem;\n border-top: solid 1px var(--pl-color-bg-subtle-brand);\n }\n}\n\n.pl-dl--inline {\n display: block;\n \n & dt,\n & dd {\n display: inline;\n padding-right: 0.5rem;\n margin-bottom: 0;\n }\n \n & dt {\n font-weight: 600;\n }\n \n & dt:not(:first-of-type)::before {\n content: \"\";\n display: block;\n margin-bottom: 0.5rem;\n }\n \n & a {\n color: var(--pl-color-fg-default);\n text-decoration-style: dotted;\n font-weight: 400;\n\n &:hover {\n text-decoration-style: solid;\n text-decoration-thickness: 2px;\n }\n }\n}\n\n";
@@ -1516,10 +1516,19 @@ var insertBefore = (parent, newNode, reference) => {
1516
1516
  };
1517
1517
  var renderVdom = (hostRef, renderFnResults, isInitialLoad = false) => {
1518
1518
  const hostElm = hostRef.$hostElement$;
1519
+ const cmpMeta = hostRef.$cmpMeta$;
1519
1520
  const oldVNode = hostRef.$vnode$ || newVNode(null, null);
1520
1521
  const isHostElement = isHost(renderFnResults);
1521
1522
  const rootVnode = isHostElement ? renderFnResults : h(null, null, renderFnResults);
1522
1523
  hostTagName = hostElm.tagName;
1524
+ if (cmpMeta.$attrsToReflect$) {
1525
+ rootVnode.$attrs$ = rootVnode.$attrs$ || {};
1526
+ cmpMeta.$attrsToReflect$.forEach(([propName, attribute]) => {
1527
+ {
1528
+ rootVnode.$attrs$[attribute] = hostElm[propName];
1529
+ }
1530
+ });
1531
+ }
1523
1532
  if (isInitialLoad && rootVnode.$attrs$) {
1524
1533
  for (const key of Object.keys(rootVnode.$attrs$)) {
1525
1534
  if (hostElm.hasAttribute(key) && !["key", "ref", "style", "class"].includes(key)) {
@@ -1723,6 +1732,7 @@ var setValue = (ref, propName, newVal, cmpMeta) => {
1723
1732
  `Couldn't find host element for "${cmpMeta.$tagName$}" as it is unknown to this Stencil runtime. This usually happens when integrating a 3rd party Stencil component with another Stencil component or application. Please reach out to the maintainers of the 3rd party Stencil component or report this on the Stencil Discord server (https://chat.stenciljs.com) or comment on this similar [GitHub issue](https://github.com/stenciljs/core/issues/5457).`
1724
1733
  );
1725
1734
  }
1735
+ const elm = hostRef.$hostElement$ ;
1726
1736
  const oldVal = hostRef.$instanceValues$.get(propName);
1727
1737
  const flags = hostRef.$flags$;
1728
1738
  const instance = hostRef.$lazyInstance$ ;
@@ -1734,6 +1744,18 @@ var setValue = (ref, propName, newVal, cmpMeta) => {
1734
1744
  if ((!(flags & 8 /* isConstructingInstance */) || oldVal === void 0) && didValueChange) {
1735
1745
  hostRef.$instanceValues$.set(propName, newVal);
1736
1746
  if (instance) {
1747
+ if (cmpMeta.$watchers$ && flags & 128 /* isWatchReady */) {
1748
+ const watchMethods = cmpMeta.$watchers$[propName];
1749
+ if (watchMethods) {
1750
+ watchMethods.map((watchMethodName) => {
1751
+ try {
1752
+ instance[watchMethodName](newVal, oldVal, propName);
1753
+ } catch (e) {
1754
+ consoleError(e, elm);
1755
+ }
1756
+ });
1757
+ }
1758
+ }
1737
1759
  if ((flags & (2 /* hasRendered */ | 16 /* isQueuedForUpdate */)) === 2 /* hasRendered */) {
1738
1760
  if (instance.componentShouldUpdate) {
1739
1761
  if (instance.componentShouldUpdate(newVal, oldVal, propName) === false) {
@@ -1751,6 +1773,17 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1751
1773
  var _a, _b;
1752
1774
  const prototype = Cstr.prototype;
1753
1775
  if (cmpMeta.$members$ || BUILD.propChangeCallback) {
1776
+ {
1777
+ if (Cstr.watchers && !cmpMeta.$watchers$) {
1778
+ cmpMeta.$watchers$ = Cstr.watchers;
1779
+ }
1780
+ if (Cstr.deserializers && !cmpMeta.$deserializers$) {
1781
+ cmpMeta.$deserializers$ = Cstr.deserializers;
1782
+ }
1783
+ if (Cstr.serializers && !cmpMeta.$serializers$) {
1784
+ cmpMeta.$serializers$ = Cstr.serializers;
1785
+ }
1786
+ }
1754
1787
  const members = Object.entries((_a = cmpMeta.$members$) != null ? _a : {});
1755
1788
  members.map(([memberName, [memberFlags]]) => {
1756
1789
  if ((memberFlags & 31 /* Prop */ || (flags & 2 /* proxyState */) && memberFlags & 32 /* State */)) {
@@ -1869,8 +1902,12 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1869
1902
  /* @__PURE__ */ new Set([
1870
1903
  ...Object.keys((_b = cmpMeta.$watchers$) != null ? _b : {}),
1871
1904
  ...members.filter(([_, m]) => m[0] & 31 /* HasAttribute */).map(([propName, m]) => {
1905
+ var _a2;
1872
1906
  const attrName = m[1] || propName;
1873
1907
  attrNameToPropName.set(attrName, propName);
1908
+ if (m[0] & 512 /* ReflectAttr */) {
1909
+ (_a2 = cmpMeta.$attrsToReflect$) == null ? void 0 : _a2.push([propName, attrName]);
1910
+ }
1874
1911
  return attrName;
1875
1912
  })
1876
1913
  ])
@@ -1899,6 +1936,11 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
1899
1936
  throw new Error(`Constructor for "${cmpMeta.$tagName$}#${hostRef.$modeName$}" was not found`);
1900
1937
  }
1901
1938
  if (!Cstr.isProxied) {
1939
+ {
1940
+ cmpMeta.$watchers$ = Cstr.watchers;
1941
+ cmpMeta.$serializers$ = Cstr.serializers;
1942
+ cmpMeta.$deserializers$ = Cstr.deserializers;
1943
+ }
1902
1944
  proxyComponent(Cstr, cmpMeta, 2 /* proxyState */);
1903
1945
  Cstr.isProxied = true;
1904
1946
  }
@@ -1914,6 +1956,9 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
1914
1956
  {
1915
1957
  hostRef.$flags$ &= -9 /* isConstructingInstance */;
1916
1958
  }
1959
+ {
1960
+ hostRef.$flags$ |= 128 /* isWatchReady */;
1961
+ }
1917
1962
  endNewInstance();
1918
1963
  fireConnectedCallback(hostRef.$lazyInstance$, elm);
1919
1964
  } else {
@@ -2058,6 +2103,7 @@ var bootstrapLazy = (lazyBundles, options = {}) => {
2058
2103
  let hasSlotRelocation = false;
2059
2104
  lazyBundles.map((lazyBundle) => {
2060
2105
  lazyBundle[1].map((compactMeta) => {
2106
+ var _a2, _b, _c;
2061
2107
  const cmpMeta = {
2062
2108
  $flags$: compactMeta[0],
2063
2109
  $tagName$: compactMeta[1],
@@ -2073,6 +2119,14 @@ var bootstrapLazy = (lazyBundles, options = {}) => {
2073
2119
  {
2074
2120
  cmpMeta.$listeners$ = compactMeta[3];
2075
2121
  }
2122
+ {
2123
+ cmpMeta.$attrsToReflect$ = [];
2124
+ }
2125
+ {
2126
+ cmpMeta.$watchers$ = (_a2 = compactMeta[4]) != null ? _a2 : {};
2127
+ cmpMeta.$serializers$ = (_b = compactMeta[5]) != null ? _b : {};
2128
+ cmpMeta.$deserializers$ = (_c = compactMeta[6]) != null ? _c : {};
2129
+ }
2076
2130
  const tagName = cmpMeta.$tagName$;
2077
2131
  const HostElement = class extends HTMLElement {
2078
2132
  // StencilLazyHost
@@ -2215,6 +2269,6 @@ var hostListenerOpts = (flags) => supportsListenerOptions ? {
2215
2269
  var setNonce = (nonce) => plt.$nonce$ = nonce;
2216
2270
 
2217
2271
  export { getAssetPath as a, bootstrapLazy as b, createEvent as c, getElement as d, setAssetPath as e, globalScripts as g, h, promiseResolve as p, registerInstance as r, setNonce as s };
2218
- //# sourceMappingURL=index-D9dYrmUF.js.map
2272
+ //# sourceMappingURL=p-Cst_89-s.js.map
2219
2273
 
2220
- //# sourceMappingURL=index-D9dYrmUF.js.map
2274
+ //# sourceMappingURL=p-Cst_89-s.js.map