@affinda/wc 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/affinda/af-testimonial-carousel.entry.esm.js.map +1 -1
- package/dist/affinda/af-testimonial.entry.esm.js.map +1 -1
- package/dist/affinda/af-video-container.entry.esm.js.map +1 -1
- package/dist/affinda/affinda.esm.js +1 -1
- package/dist/affinda/{p-de75cb4f.entry.js → p-165c413d.entry.js} +2 -2
- package/dist/affinda/p-165c413d.entry.js.map +1 -0
- package/dist/affinda/{p-a7a8f18c.entry.js → p-65dd559a.entry.js} +2 -2
- package/dist/affinda/{p-09dfcd40.entry.js → p-d362651c.entry.js} +2 -2
- package/dist/affinda/p-d362651c.entry.js.map +1 -0
- package/dist/cjs/af-testimonial-carousel.cjs.entry.js +1 -1
- package/dist/cjs/af-testimonial-carousel.entry.cjs.js.map +1 -1
- package/dist/cjs/af-testimonial.cjs.entry.js +6 -6
- package/dist/cjs/af-testimonial.entry.cjs.js.map +1 -1
- package/dist/cjs/af-video-container.cjs.entry.js +3 -3
- package/dist/cjs/af-video-container.entry.cjs.js.map +1 -1
- package/dist/cjs/affinda.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/components/af-testimonial/af-testimonial.js +8 -8
- package/dist/collection/components/af-testimonial/af-testimonial.js.map +1 -1
- package/dist/collection/components/af-testimonial-carousel/af-testimonial-carousel.js +3 -3
- package/dist/collection/components/af-testimonial-carousel/af-testimonial-carousel.js.map +1 -1
- package/dist/collection/components/af-video-container/af-video-container.js +4 -4
- package/dist/collection/components/af-video-container/af-video-container.js.map +1 -1
- package/dist/components/af-testimonial-carousel.js +2 -2
- package/dist/components/af-testimonial-carousel.js.map +1 -1
- package/dist/components/af-testimonial.js +6 -6
- package/dist/components/af-testimonial.js.map +1 -1
- package/dist/components/af-video-container.js +3 -3
- package/dist/components/af-video-container.js.map +1 -1
- package/dist/esm/af-testimonial-carousel.entry.js +1 -1
- package/dist/esm/af-testimonial-carousel.entry.js.map +1 -1
- package/dist/esm/af-testimonial.entry.js +6 -6
- package/dist/esm/af-testimonial.entry.js.map +1 -1
- package/dist/esm/af-video-container.entry.js +3 -3
- package/dist/esm/af-video-container.entry.js.map +1 -1
- package/dist/esm/affinda.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/types/components/af-testimonial/af-testimonial.d.ts +2 -2
- package/dist/types/components/af-video-container/af-video-container.d.ts +1 -1
- package/dist/types/components.d.ts +6 -6
- package/package.json +2 -2
- package/dist/affinda/p-09dfcd40.entry.js.map +0 -1
- package/dist/affinda/p-de75cb4f.entry.js.map +0 -1
- /package/dist/affinda/{p-a7a8f18c.entry.js.map → p-65dd559a.entry.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"af-testimonial-carousel.entry.esm.js","sources":["src/components/af-testimonial-carousel/af-testimonial-carousel.css?tag=af-testimonial-carousel&encapsulation=scoped","src/components/af-testimonial-carousel/af-testimonial-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-carousel {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.testimonial-slides {\n position: relative;\n width: 100%;\n min-height: 544px;\n overflow: hidden;\n}\n\n.testimonial-slides ::slotted(af-testimonial) {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;\n}\n\n/* Respect reduced motion: slides can auto-advance, so remove the\n * 500ms cross-fade/slide transition and swap instantly. */\n@media (prefers-reduced-motion: reduce) {\n .testimonial-slides ::slotted(af-testimonial) {\n transition: none;\n }\n}\n\n/* Progress indicator - wraps af-progress-line atom */\n/* Per Figma: centered below the card with horizontal padding */\n.testimonial-progress {\n margin-top: 32px;\n max-width: 840px;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* Navigation is now rendered inside each testimonial's footer via props */\n\n","import { Component, State, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * TestimonialCarousel - Carousel for displaying multiple customer testimonials.\n * \n * Handles navigation between testimonials with progress indicator.\n * Wrap in Section/Container for proper page layout and theming.\n * \n * @slot - Testimonial components to display in the carousel\n */\n@Component({\n tag: 'af-testimonial-carousel',\n styleUrl: 'af-testimonial-carousel.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonialCarousel {\n @Element() host!: HTMLElement;\n @State() currentIndex: number = 0;\n @State() isAnimating: boolean = false;\n @State() testimonialCount: number = 0;\n\n private testimonials: HTMLElement[] = [];\n private observer: MutationObserver | undefined;\n\n componentDidLoad() {\n this.detectTestimonials();\n \n // Watch for testimonials being added (for React async rendering)\n this.observer = new MutationObserver(() => {\n this.detectTestimonials();\n });\n \n this.observer.observe(this.host, {\n childList: true,\n subtree: true\n });\n }\n\n disconnectedCallback() {\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n /**\n * Listen for navigation events from testimonials\n */\n @Listen('
|
|
1
|
+
{"version":3,"file":"af-testimonial-carousel.entry.esm.js","sources":["src/components/af-testimonial-carousel/af-testimonial-carousel.css?tag=af-testimonial-carousel&encapsulation=scoped","src/components/af-testimonial-carousel/af-testimonial-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-carousel {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.testimonial-slides {\n position: relative;\n width: 100%;\n min-height: 544px;\n overflow: hidden;\n}\n\n.testimonial-slides ::slotted(af-testimonial) {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;\n}\n\n/* Respect reduced motion: slides can auto-advance, so remove the\n * 500ms cross-fade/slide transition and swap instantly. */\n@media (prefers-reduced-motion: reduce) {\n .testimonial-slides ::slotted(af-testimonial) {\n transition: none;\n }\n}\n\n/* Progress indicator - wraps af-progress-line atom */\n/* Per Figma: centered below the card with horizontal padding */\n.testimonial-progress {\n margin-top: 32px;\n max-width: 840px;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* Navigation is now rendered inside each testimonial's footer via props */\n\n","import { Component, State, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * TestimonialCarousel - Carousel for displaying multiple customer testimonials.\n * \n * Handles navigation between testimonials with progress indicator.\n * Wrap in Section/Container for proper page layout and theming.\n * \n * @slot - Testimonial components to display in the carousel\n */\n@Component({\n tag: 'af-testimonial-carousel',\n styleUrl: 'af-testimonial-carousel.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonialCarousel {\n @Element() host!: HTMLElement;\n @State() currentIndex: number = 0;\n @State() isAnimating: boolean = false;\n @State() testimonialCount: number = 0;\n\n private testimonials: HTMLElement[] = [];\n private observer: MutationObserver | undefined;\n\n componentDidLoad() {\n this.detectTestimonials();\n \n // Watch for testimonials being added (for React async rendering)\n this.observer = new MutationObserver(() => {\n this.detectTestimonials();\n });\n \n this.observer.observe(this.host, {\n childList: true,\n subtree: true\n });\n }\n\n disconnectedCallback() {\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n /**\n * Listen for navigation events from testimonials\n */\n @Listen('afNavPrev')\n handleNavPrev() {\n this.goToPrevious();\n }\n\n @Listen('afNavNext')\n handleNavNext() {\n this.goToNext();\n }\n\n private detectTestimonials() {\n const newTestimonials = Array.from(this.host.querySelectorAll('af-testimonial')) as HTMLElement[];\n \n if (newTestimonials.length !== this.testimonials.length) {\n this.testimonials = newTestimonials;\n this.testimonialCount = newTestimonials.length;\n \n if (this.testimonials.length > 0) {\n this.currentIndex = 0;\n this.updateVisibleTestimonial();\n }\n }\n }\n\n private updateVisibleTestimonial() {\n const hasPrev = this.currentIndex > 0;\n const hasNext = this.currentIndex < this.testimonialCount - 1;\n const showNav = this.testimonialCount > 1;\n\n this.testimonials.forEach((testimonial, index) => {\n const offset = (index - this.currentIndex) * 100;\n testimonial.style.transform = `translateX(${offset}%)`;\n testimonial.style.opacity = index === this.currentIndex ? '1' : '0';\n testimonial.style.pointerEvents = index === this.currentIndex ? 'auto' : 'none';\n \n // Set navigation props on testimonials (directly on the element for Stencil)\n (testimonial as any).showNavigation = showNav;\n (testimonial as any).hasPrev = hasPrev;\n (testimonial as any).hasNext = hasNext;\n });\n }\n\n private goToPrevious = () => {\n if (this.isAnimating || this.currentIndex === 0) return;\n \n this.isAnimating = true;\n this.currentIndex = this.currentIndex - 1;\n this.updateVisibleTestimonial();\n \n setTimeout(() => {\n this.isAnimating = false;\n }, 500);\n };\n\n private goToNext = () => {\n if (this.isAnimating || this.currentIndex >= this.testimonialCount - 1) return;\n \n this.isAnimating = true;\n this.currentIndex = this.currentIndex + 1;\n this.updateVisibleTestimonial();\n \n setTimeout(() => {\n this.isAnimating = false;\n }, 500);\n };\n\n /**\n * Calculate progress value (0 to 1) based on current position\n */\n private getProgress(): number {\n if (this.testimonialCount <= 1) return 0;\n return (this.currentIndex + 1) / this.testimonialCount;\n }\n\n render() {\n return (\n <Host>\n <div class=\"testimonial-carousel\">\n <div class=\"testimonial-slides\">\n <slot></slot>\n </div>\n \n {/* Progress indicator using af-progress-line atom */}\n {this.testimonialCount > 1 && (\n <div class=\"testimonial-progress\">\n <af-progress-line progress={this.getProgress()} />\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"af-testimonial.entry.esm.js","sources":["src/components/af-testimonial/af-testimonial.css?tag=af-testimonial&encapsulation=scoped","src/components/af-testimonial/af-testimonial.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-card {\n /* Uses themed level-1 background from parent Section */\n background: var(--af-background-level-1, var(--colour-mistgreen-200, #e8eeed));\n border-radius: var(--border-radius-card-level-1, 32px);\n overflow: hidden;\n display: flex;\n height: 544px;\n box-sizing: border-box;\n}\n\n/* Image side - 40.5% of card width (519px of 1280px in Figma) */\n.testimonial-image {\n position: relative;\n width: 50%;\n min-width: 300px;\n /* Minimum for readability */\n max-width: 519px;\n /* Cap at Figma design width */\n height: 100%;\n /* Dark background for image overlay effect - always dark regardless of theme */\n background: var(--colour-brand-inkwell, #14343b);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n}\n\n.testimonial-bg-image {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.7;\n}\n\n.testimonial-logo {\n position: relative;\n z-index: 1;\n padding: 0 108px;\n max-width: 100%;\n}\n\n.testimonial-logo img {\n width: 100%;\n height: auto;\n display: block;\n}\n\n/* Content side */\n.testimonial-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 32px;\n padding: 48px;\n /* Subtle border using themed border token */\n border: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n border-left: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n box-sizing: border-box;\n}\n\n.testimonial-quote-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n /* Allow flex item to shrink */\n overflow: hidden;\n}\n\n.testimonial-quote-icon {\n width: 48px;\n height: 48px;\n /* Quote icon uses themed secondary heading color (gold/ochre accent) */\n color: var(--af-typography-heading-secondary, var(--colour-brand-soft-clay, #b09670));\n flex-shrink: 0;\n}\n\n/* Quote text — 22px / 140% per Webflow reference. Accepts either the\n `quote` prop (rendered as plain text) or the `quote-body` slot (rich). */\n.testimonial-text {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 22px;\n line-height: 1.4;\n font-weight: var(--font-weight-regular, 400);\n color: var(--af-typography-body-default, var(--colour-brand-inkwell, #14343b));\n}\n.testimonial-text ::slotted(p),\n.testimonial-text p {\n font: inherit;\n color: inherit;\n margin: 0 0 12px 0;\n}\n.testimonial-text ::slotted(p:last-child),\n.testimonial-text p:last-child {\n margin-bottom: 0;\n}\n.testimonial-text ::slotted(ul),\n.testimonial-text ul {\n margin: 0 0 12px 0;\n padding-left: 20px;\n}\n\n/* Attribution uses body-dark color for emphasis */\n.testimonial-attribution {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 16px;\n line-height: 24px;\n color: var(--af-typography-body-dark, var(--colour-brand-inkwell, #14343b));\n margin-top: 12px;\n}\n\n.testimonial-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 32px;\n width: 100%;\n flex-shrink: 0;\n}\n\n/* ≥ mobile and ≤ tablet — 2-column intermediate layout so the stats row\n * doesn't snap straight from 4-across to 1-across on common iPad / narrow\n * laptop widths. */\n@media (min-width: 768px) and (max-width: 1023px) {\n .testimonial-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n/* ≤ mobile — single column stack */\n@media (max-width: 767px) {\n .testimonial-stats {\n grid-template-columns: 1fr;\n }\n}\n\n.testimonial-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n /* Themed border color */\n border-top: 1px solid var(--af-background-border-default, var(--colour-mistgreen-400, #d1ddda));\n padding-top: 32px;\n flex-shrink: 0;\n min-height: 48px;\n}\n\n.testimonial-nav {\n display: flex;\n gap: 12px;\n}\n\n.testimonial-nav-buttons {\n display: flex;\n gap: 12px;\n}\n\n/* CTA button is now handled by af-button atom component */","import { Component, Prop, h, Host, Event, EventEmitter } from '@stencil/core';\n\n/**\n * @slot quote-body - Rich quote content (paragraphs, lists). Overrides the\n * `quote` string prop when provided. Use for testimonials that include\n * multiple paragraphs, bulleted points, or inline emphasis.\n * @slot quote-icon - Quote icon (defaults to af-icon name=\"quote\").\n * @slot stats - Statistic items (af-testimonial-stat components).\n * @slot navigation - Custom nav controls (when not using built-in ones).\n */\n@Component({\n tag: 'af-testimonial',\n styleUrl: 'af-testimonial.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonial {\n /**\n * Background image URL for the testimonial card\n */\n @Prop() backgroundImage?: string;\n\n /**\n * Company logo URL\n */\n @Prop() logoImage?: string;\n\n /**\n * Testimonial quote text. Falls back to the `quote-body` slot if that\n * slot has content.\n */\n @Prop() quote?: string;\n\n /**\n * Attribution text (e.g., \"– Nathaniel Barrs, CTO, PSC Insurance\")\n */\n @Prop() attribution!: string;\n\n /**\n * Link to full case study\n */\n @Prop() readMoreLink?: string;\n\n /**\n * Whether to show built-in navigation buttons (used when in a carousel)\n */\n @Prop({ mutable: true }) showNavigation: boolean = false;\n\n /**\n * Whether the previous button is enabled\n */\n @Prop({ mutable: true }) hasPrev: boolean = false;\n\n /**\n * Whether the next button is enabled\n */\n @Prop({ mutable: true }) hasNext: boolean = false;\n\n /**\n * Emitted when the previous button is clicked\n */\n @Event() navPrev!: EventEmitter<void>;\n\n /**\n * Emitted when the next button is clicked\n */\n @Event() navNext!: EventEmitter<void>;\n\n private handlePrev = () => {\n this.navPrev.emit();\n };\n\n private handleNext = () => {\n this.navNext.emit();\n };\n\n render() {\n return (\n <Host>\n <div class=\"testimonial-card\">\n {/* Image side */}\n <div class=\"testimonial-image\">\n {this.backgroundImage && (\n <img src={this.backgroundImage} alt=\"\" class=\"testimonial-bg-image\" />\n )}\n {this.logoImage && (\n <div class=\"testimonial-logo\">\n <img src={this.logoImage} alt=\"Company logo\" />\n </div>\n )}\n </div>\n\n {/* Content side */}\n <div class=\"testimonial-content\">\n <div class=\"testimonial-quote-section\">\n {/* Quote icon - using af-icon atom with slot for flexibility */}\n <div class=\"testimonial-quote-icon\">\n <slot name=\"quote-icon\">\n <af-icon name=\"quote\" size={48} />\n </slot>\n </div>\n\n {/* Quote text — slot takes priority; falls back to prop. */}\n <div class=\"testimonial-text\">\n <slot name=\"quote-body\">{this.quote}</slot>\n </div>\n {/* Attribution */}\n <div class=\"testimonial-attribution\">{this.attribution}</div>\n </div>\n\n {/* Statistics slot */}\n <div class=\"testimonial-stats\">\n <slot name=\"stats\"></slot>\n </div>\n\n {/* Footer with navigation and CTA */}\n <div class=\"testimonial-footer\">\n <div class=\"testimonial-nav\">\n {this.showNavigation ? (\n // Render built-in navigation buttons\n <div class=\"testimonial-nav-buttons\">\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasPrev}\n onClick={this.handlePrev}\n ariaLabel=\"Previous testimonial\"\n >\n <af-icon name=\"arrow-left\" size={24} />\n </af-icon-button>\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasNext}\n onClick={this.handleNext}\n ariaLabel=\"Next testimonial\"\n >\n <af-icon name=\"arrow-right\" size={24} />\n </af-icon-button>\n </div>\n ) : (\n // Allow custom navigation via slot\n <slot name=\"navigation\"></slot>\n )}\n </div>\n {this.readMoreLink && (\n <af-button variant=\"secondary\" href={this.readMoreLink}>\n Read full story\n <af-icon slot=\"icon-right\" name=\"arrow-right\" size={24} />\n </af-button>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"af-testimonial.entry.esm.js","sources":["src/components/af-testimonial/af-testimonial.css?tag=af-testimonial&encapsulation=scoped","src/components/af-testimonial/af-testimonial.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-card {\n /* Uses themed level-1 background from parent Section */\n background: var(--af-background-level-1, var(--colour-mistgreen-200, #e8eeed));\n border-radius: var(--border-radius-card-level-1, 32px);\n overflow: hidden;\n display: flex;\n height: 544px;\n box-sizing: border-box;\n}\n\n/* Image side - 40.5% of card width (519px of 1280px in Figma) */\n.testimonial-image {\n position: relative;\n width: 50%;\n min-width: 300px;\n /* Minimum for readability */\n max-width: 519px;\n /* Cap at Figma design width */\n height: 100%;\n /* Dark background for image overlay effect - always dark regardless of theme */\n background: var(--colour-brand-inkwell, #14343b);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n}\n\n.testimonial-bg-image {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.7;\n}\n\n.testimonial-logo {\n position: relative;\n z-index: 1;\n padding: 0 108px;\n max-width: 100%;\n}\n\n.testimonial-logo img {\n width: 100%;\n height: auto;\n display: block;\n}\n\n/* Content side */\n.testimonial-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 32px;\n padding: 48px;\n /* Subtle border using themed border token */\n border: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n border-left: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n box-sizing: border-box;\n}\n\n.testimonial-quote-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n /* Allow flex item to shrink */\n overflow: hidden;\n}\n\n.testimonial-quote-icon {\n width: 48px;\n height: 48px;\n /* Quote icon uses themed secondary heading color (gold/ochre accent) */\n color: var(--af-typography-heading-secondary, var(--colour-brand-soft-clay, #b09670));\n flex-shrink: 0;\n}\n\n/* Quote text — 22px / 140% per Webflow reference. Accepts either the\n `quote` prop (rendered as plain text) or the `quote-body` slot (rich). */\n.testimonial-text {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 22px;\n line-height: 1.4;\n font-weight: var(--font-weight-regular, 400);\n color: var(--af-typography-body-default, var(--colour-brand-inkwell, #14343b));\n}\n.testimonial-text ::slotted(p),\n.testimonial-text p {\n font: inherit;\n color: inherit;\n margin: 0 0 12px 0;\n}\n.testimonial-text ::slotted(p:last-child),\n.testimonial-text p:last-child {\n margin-bottom: 0;\n}\n.testimonial-text ::slotted(ul),\n.testimonial-text ul {\n margin: 0 0 12px 0;\n padding-left: 20px;\n}\n\n/* Attribution uses body-dark color for emphasis */\n.testimonial-attribution {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 16px;\n line-height: 24px;\n color: var(--af-typography-body-dark, var(--colour-brand-inkwell, #14343b));\n margin-top: 12px;\n}\n\n.testimonial-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 32px;\n width: 100%;\n flex-shrink: 0;\n}\n\n/* ≥ mobile and ≤ tablet — 2-column intermediate layout so the stats row\n * doesn't snap straight from 4-across to 1-across on common iPad / narrow\n * laptop widths. */\n@media (min-width: 768px) and (max-width: 1023px) {\n .testimonial-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n/* ≤ mobile — single column stack */\n@media (max-width: 767px) {\n .testimonial-stats {\n grid-template-columns: 1fr;\n }\n}\n\n.testimonial-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n /* Themed border color */\n border-top: 1px solid var(--af-background-border-default, var(--colour-mistgreen-400, #d1ddda));\n padding-top: 32px;\n flex-shrink: 0;\n min-height: 48px;\n}\n\n.testimonial-nav {\n display: flex;\n gap: 12px;\n}\n\n.testimonial-nav-buttons {\n display: flex;\n gap: 12px;\n}\n\n/* CTA button is now handled by af-button atom component */","import { Component, Prop, h, Host, Event, EventEmitter } from '@stencil/core';\n\n/**\n * @slot quote-body - Rich quote content (paragraphs, lists). Overrides the\n * `quote` string prop when provided. Use for testimonials that include\n * multiple paragraphs, bulleted points, or inline emphasis.\n * @slot quote-icon - Quote icon (defaults to af-icon name=\"quote\").\n * @slot stats - Statistic items (af-testimonial-stat components).\n * @slot navigation - Custom nav controls (when not using built-in ones).\n */\n@Component({\n tag: 'af-testimonial',\n styleUrl: 'af-testimonial.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonial {\n /**\n * Background image URL for the testimonial card\n */\n @Prop() backgroundImage?: string;\n\n /**\n * Company logo URL\n */\n @Prop() logoImage?: string;\n\n /**\n * Testimonial quote text. Falls back to the `quote-body` slot if that\n * slot has content.\n */\n @Prop() quote?: string;\n\n /**\n * Attribution text (e.g., \"– Nathaniel Barrs, CTO, PSC Insurance\")\n */\n @Prop() attribution!: string;\n\n /**\n * Link to full case study\n */\n @Prop() readMoreLink?: string;\n\n /**\n * Whether to show built-in navigation buttons (used when in a carousel)\n */\n @Prop({ mutable: true }) showNavigation: boolean = false;\n\n /**\n * Whether the previous button is enabled\n */\n @Prop({ mutable: true }) hasPrev: boolean = false;\n\n /**\n * Whether the next button is enabled\n */\n @Prop({ mutable: true }) hasNext: boolean = false;\n\n /**\n * Emitted when the previous button is clicked\n */\n @Event() afNavPrev!: EventEmitter<void>;\n\n /**\n * Emitted when the next button is clicked\n */\n @Event() afNavNext!: EventEmitter<void>;\n\n private handlePrev = () => {\n this.afNavPrev.emit();\n };\n\n private handleNext = () => {\n this.afNavNext.emit();\n };\n\n render() {\n return (\n <Host>\n <div class=\"testimonial-card\">\n {/* Image side */}\n <div class=\"testimonial-image\">\n {this.backgroundImage && (\n <img src={this.backgroundImage} alt=\"\" class=\"testimonial-bg-image\" />\n )}\n {this.logoImage && (\n <div class=\"testimonial-logo\">\n <img src={this.logoImage} alt=\"Company logo\" />\n </div>\n )}\n </div>\n\n {/* Content side */}\n <div class=\"testimonial-content\">\n <div class=\"testimonial-quote-section\">\n {/* Quote icon - using af-icon atom with slot for flexibility */}\n <div class=\"testimonial-quote-icon\">\n <slot name=\"quote-icon\">\n <af-icon name=\"quote\" size={48} />\n </slot>\n </div>\n\n {/* Quote text — slot takes priority; falls back to prop. */}\n <div class=\"testimonial-text\">\n <slot name=\"quote-body\">{this.quote}</slot>\n </div>\n {/* Attribution */}\n <div class=\"testimonial-attribution\">{this.attribution}</div>\n </div>\n\n {/* Statistics slot */}\n <div class=\"testimonial-stats\">\n <slot name=\"stats\"></slot>\n </div>\n\n {/* Footer with navigation and CTA */}\n <div class=\"testimonial-footer\">\n <div class=\"testimonial-nav\">\n {this.showNavigation ? (\n // Render built-in navigation buttons\n <div class=\"testimonial-nav-buttons\">\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasPrev}\n onClick={this.handlePrev}\n ariaLabel=\"Previous testimonial\"\n >\n <af-icon name=\"arrow-left\" size={24} />\n </af-icon-button>\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasNext}\n onClick={this.handleNext}\n ariaLabel=\"Next testimonial\"\n >\n <af-icon name=\"arrow-right\" size={24} />\n </af-icon-button>\n </div>\n ) : (\n // Allow custom navigation via slot\n <slot name=\"navigation\"></slot>\n )}\n </div>\n {this.readMoreLink && (\n <af-button variant=\"secondary\" href={this.readMoreLink}>\n Read full story\n <af-icon slot=\"icon-right\" name=\"arrow-right\" size={24} />\n </af-button>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"af-video-container.entry.esm.js","sources":["src/components/af-video-container/af-video-container.css?tag=af-video-container&encapsulation=scoped","src/components/af-video-container/af-video-container.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.video-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n gap: var(--space-10, 40px);\n}\n\n/* ==========================================================================\n Top/Bottom Slots\n These inherit theme colors from their position in the split-section\n ========================================================================== */\n\n.video-container__top,\n.video-container__bottom {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Hide empty slots */\n.video-container__top:empty,\n.video-container__bottom:empty {\n display: none;\n}\n\n/* ==========================================================================\n Video Thumbnail Section\n ========================================================================== */\n\n.video-container__video {\n width: 100%;\n max-width: 1024px;\n}\n\n.video-container__thumbnail-wrapper {\n position: absolute;\n inset: 0;\n border-radius: var(--radii-video-crop, 16px);\n overflow: hidden;\n background-color: var(--colour-inkwell-400, #2b484f);\n}\n\n.video-container__thumbnail {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n position: absolute;\n inset: 0;\n}\n\n/* ==========================================================================\n Play Button Overlay\n ========================================================================== */\n\n.video-container__play-button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n border-radius: var(--radii-button, 9999px);\n background-color: var(--af-button-primary-bg, var(--colour-brand-ice, #a6fffb));\n border: 1px solid var(--af-button-primary-stroke, var(--colour-brand-inkwell, #14343b));\n cursor: pointer;\n transition: background-color 0.2s ease;\n color: var(--af-button-primary-icon, var(--colour-brand-inkwell, #14343b));\n}\n\n.video-container__play-button:hover {\n background-color: var(--af-button-primary-bg-hover, var(--colour-ice-600, #95e6e2));\n}\n\n.video-container__play-button:focus-visible {\n outline: 2px solid var(--colour-brand-ice, #a6fffb);\n outline-offset: 2px;\n}\n\n/* ==========================================================================\n Mobile Responsive Styles\n ========================================================================== */\n\n/* mobile-only */\n@media (max-width: 768px) {\n .video-container {\n gap: var(--space-8, 32px);\n }\n\n /* Smaller play button on mobile */\n .video-container__play-button {\n padding: 12px;\n }\n}\n","import { Component, h, Host, Prop, Event, EventEmitter } from '@stencil/core';\n\n/**\n * Video Container molecule component for showcasing video content.\n * \n * Uses slots for typography lockups above and below the video.\n * When used inside af-split-section, the top slot inherits the top theme\n * and the bottom slot inherits the bottom theme for correct colors.\n * \n * @example\n * ```html\n * <af-split-section top-theme=\"mist-green\" bottom-theme=\"white\">\n * <af-video-container video-thumbnail-url=\"/path/to/thumbnail.jpg\">\n * <af-typography-lockup slot=\"top\" text-alignment=\"center\" heading-size=\"2\">\n * <af-heading level=\"2\">Watch our product demo</af-heading>\n * <af-text slot=\"description\">See how Affinda transforms your workflow</af-text>\n * <af-button slot=\"buttons\" variant=\"primary\">Get Started</af-button>\n * </af-typography-lockup>\n * </af-video-container>\n * </af-split-section>\n * ```\n * \n * @slot top - Content above the video (typically af-typography-lockup). Inherits top theme.\n * @slot bottom - Content below the video (typically af-typography-lockup). Inherits bottom theme.\n */\n@Component({\n tag: 'af-video-container',\n styleUrl: 'af-video-container.css',\n shadow: false,\n scoped: true,\n})\nexport class AfVideoContainer {\n /** Video thumbnail image URL */\n @Prop() videoThumbnailUrl: string = '';\n\n /** Video alt text for accessibility */\n @Prop() videoAlt: string = 'Video thumbnail';\n\n /** Optional video URL for play button link */\n @Prop() videoUrl: string = '';\n\n /** \n * Emitted when the play button is clicked.\n * Use this to handle video playback (e.g., open modal, embed player).\n * If videoUrl is set and no handler prevents default, opens URL in new tab.\n */\n @Event()
|
|
1
|
+
{"version":3,"file":"af-video-container.entry.esm.js","sources":["src/components/af-video-container/af-video-container.css?tag=af-video-container&encapsulation=scoped","src/components/af-video-container/af-video-container.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.video-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n gap: var(--space-10, 40px);\n}\n\n/* ==========================================================================\n Top/Bottom Slots\n These inherit theme colors from their position in the split-section\n ========================================================================== */\n\n.video-container__top,\n.video-container__bottom {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Hide empty slots */\n.video-container__top:empty,\n.video-container__bottom:empty {\n display: none;\n}\n\n/* ==========================================================================\n Video Thumbnail Section\n ========================================================================== */\n\n.video-container__video {\n width: 100%;\n max-width: 1024px;\n}\n\n.video-container__thumbnail-wrapper {\n position: absolute;\n inset: 0;\n border-radius: var(--radii-video-crop, 16px);\n overflow: hidden;\n background-color: var(--colour-inkwell-400, #2b484f);\n}\n\n.video-container__thumbnail {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n position: absolute;\n inset: 0;\n}\n\n/* ==========================================================================\n Play Button Overlay\n ========================================================================== */\n\n.video-container__play-button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n border-radius: var(--radii-button, 9999px);\n background-color: var(--af-button-primary-bg, var(--colour-brand-ice, #a6fffb));\n border: 1px solid var(--af-button-primary-stroke, var(--colour-brand-inkwell, #14343b));\n cursor: pointer;\n transition: background-color 0.2s ease;\n color: var(--af-button-primary-icon, var(--colour-brand-inkwell, #14343b));\n}\n\n.video-container__play-button:hover {\n background-color: var(--af-button-primary-bg-hover, var(--colour-ice-600, #95e6e2));\n}\n\n.video-container__play-button:focus-visible {\n outline: 2px solid var(--colour-brand-ice, #a6fffb);\n outline-offset: 2px;\n}\n\n/* ==========================================================================\n Mobile Responsive Styles\n ========================================================================== */\n\n/* mobile-only */\n@media (max-width: 768px) {\n .video-container {\n gap: var(--space-8, 32px);\n }\n\n /* Smaller play button on mobile */\n .video-container__play-button {\n padding: 12px;\n }\n}\n","import { Component, h, Host, Prop, Event, EventEmitter } from '@stencil/core';\n\n/**\n * Video Container molecule component for showcasing video content.\n * \n * Uses slots for typography lockups above and below the video.\n * When used inside af-split-section, the top slot inherits the top theme\n * and the bottom slot inherits the bottom theme for correct colors.\n * \n * @example\n * ```html\n * <af-split-section top-theme=\"mist-green\" bottom-theme=\"white\">\n * <af-video-container video-thumbnail-url=\"/path/to/thumbnail.jpg\">\n * <af-typography-lockup slot=\"top\" text-alignment=\"center\" heading-size=\"2\">\n * <af-heading level=\"2\">Watch our product demo</af-heading>\n * <af-text slot=\"description\">See how Affinda transforms your workflow</af-text>\n * <af-button slot=\"buttons\" variant=\"primary\">Get Started</af-button>\n * </af-typography-lockup>\n * </af-video-container>\n * </af-split-section>\n * ```\n * \n * @slot top - Content above the video (typically af-typography-lockup). Inherits top theme.\n * @slot bottom - Content below the video (typically af-typography-lockup). Inherits bottom theme.\n */\n@Component({\n tag: 'af-video-container',\n styleUrl: 'af-video-container.css',\n shadow: false,\n scoped: true,\n})\nexport class AfVideoContainer {\n /** Video thumbnail image URL */\n @Prop() videoThumbnailUrl: string = '';\n\n /** Video alt text for accessibility */\n @Prop() videoAlt: string = 'Video thumbnail';\n\n /** Optional video URL for play button link */\n @Prop() videoUrl: string = '';\n\n /** \n * Emitted when the play button is clicked.\n * Use this to handle video playback (e.g., open modal, embed player).\n * If videoUrl is set and no handler prevents default, opens URL in new tab.\n */\n @Event() afPlayClick!: EventEmitter<{ videoUrl: string }>;\n\n /**\n * Handles play button click - emits event and optionally opens URL\n */\n private handlePlayClick = () => {\n const event = this.afPlayClick.emit({ videoUrl: this.videoUrl });\n \n // Only open URL if event wasn't prevented and URL exists\n if (!event.defaultPrevented && this.videoUrl) {\n window.open(this.videoUrl, '_blank');\n }\n };\n\n render() {\n return (\n <Host>\n <div class=\"video-container\">\n {/* Top slot - for typography lockup above video (inherits top theme) */}\n <div class=\"video-container__top\">\n <slot name=\"top\"></slot>\n </div>\n\n {/* Video thumbnail section */}\n <div class=\"video-container__video\">\n <af-aspect-ratio ratio=\"16:9\">\n <div class=\"video-container__thumbnail-wrapper\">\n {this.videoThumbnailUrl && (\n <img \n src={this.videoThumbnailUrl} \n alt={this.videoAlt}\n class=\"video-container__thumbnail\"\n loading=\"lazy\"\n />\n )}\n {/* Play button overlay */}\n <button \n class=\"video-container__play-button\"\n onClick={this.handlePlayClick}\n aria-label=\"Play video\"\n type=\"button\"\n >\n <af-icon name=\"play\" size={24}></af-icon>\n </button>\n </div>\n </af-aspect-ratio>\n </div>\n\n {/* Bottom slot - for typography lockup below video (inherits bottom theme) */}\n <div class=\"video-container__bottom\">\n <slot name=\"bottom\"></slot>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n"],"names":[],"mappings":";;AAAA,MAAM,mBAAmB,GAAG,ixDAAixD;;MC+BhyD,gBAAgB,GAAA,MAAA;AAN7B,IAAA,WAAA,CAAA,OAAA,EAAA;;;;AAQU,QAAA,IAAiB,CAAA,iBAAA,GAAW,EAAE;;AAG9B,QAAA,IAAQ,CAAA,QAAA,GAAW,iBAAiB;;AAGpC,QAAA,IAAQ,CAAA,QAAA,GAAW,EAAE;AAS7B;;AAEG;AACK,QAAA,IAAe,CAAA,eAAA,GAAG,MAAK;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;YAGhE,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;;AAExC,SAAC;AA4CF;IA1CC,MAAM,GAAA;QACJ,QACE,EAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACH,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,iBAAiB,EAAA,EAE1B,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,sBAAsB,EAAA,EAC/B,CAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,KAAK,EAAA,CAAQ,CACpB,EAGN,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,wBAAwB,EAAA,EACjC,CAAiB,CAAA,iBAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,MAAM,EAAA,EAC3B,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,oCAAoC,EAAA,EAC5C,IAAI,CAAC,iBAAiB,KACrB,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAC3B,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,MAAM,EAAA,CACd,CACH,EAED,CAAA,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,8BAA8B,EACpC,OAAO,EAAE,IAAI,CAAC,eAAe,EAClB,YAAA,EAAA,YAAY,EACvB,IAAI,EAAC,QAAQ,EAAA,EAEb,CAAS,CAAA,SAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,MAAM,EAAC,IAAI,EAAE,EAAE,EAAY,CAAA,CAClC,CACL,CACU,CACd,EAGN,CAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,yBAAyB,EAAA,EAClC,CAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,QAAQ,EAAA,CAAQ,CACvB,CACF,CACD;;;;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{p as e,g as a,b as t}from"./p-MwnBSqEY.js";export{s as setNonce}from"./p-MwnBSqEY.js";var i=()=>{const a=import.meta.url;const t={};if(a!==""){t.resourcesUrl=new URL(".",a).href}return e(t)};i().then((async e=>{await a();return t([["p-7d3cdda1",[[262,"af-hero",{variant:[513],heading:[1],description:[1],floatNavbar:[516,"float-navbar"],topPad:[1,"top-pad"],maxWidth:[2,"max-width"],maskImage:[4,"mask-image"]}]]],["p-6e181b2b",[[262,"af-icon-text",{icon:[1],headingSize:[2,"heading-size"],orientation:[1],iconSize:[1,"icon-size"]}]]],["p-
|
|
1
|
+
import{p as e,g as a,b as t}from"./p-MwnBSqEY.js";export{s as setNonce}from"./p-MwnBSqEY.js";var i=()=>{const a=import.meta.url;const t={};if(a!==""){t.resourcesUrl=new URL(".",a).href}return e(t)};i().then((async e=>{await a();return t([["p-7d3cdda1",[[262,"af-hero",{variant:[513],heading:[1],description:[1],floatNavbar:[516,"float-navbar"],topPad:[1,"top-pad"],maxWidth:[2,"max-width"],maskImage:[4,"mask-image"]}]]],["p-6e181b2b",[[262,"af-icon-text",{icon:[1],headingSize:[2,"heading-size"],orientation:[1],iconSize:[1,"icon-size"]}]]],["p-165c413d",[[262,"af-testimonial",{backgroundImage:[1,"background-image"],logoImage:[1,"logo-image"],quote:[1],attribution:[1],readMoreLink:[1,"read-more-link"],showNavigation:[1028,"show-navigation"],hasPrev:[1028,"has-prev"],hasNext:[1028,"has-next"]}]]],["p-86f6dfdc",[[262,"af-feature-card",{theme:[1],layout:[1],cardSize:[513,"card-size"],headingSize:[2,"heading-size"],imageSrc:[1,"image-src"],imageAlt:[1,"image-alt"]}]]],["p-4a9b192b",[[262,"af-illustrated-card",{theme:[1],breakpoint:[1],cardSize:[1,"card-size"]}]]],["p-436673bb",[[262,"af-numbered-stepper-item",{index:[514]}]]],["p-2526604b",[[257,"af-stat",{value:[1],label:[1]}]]],["p-83bb96cc",[[258,"af-testimonial-stat",{value:[1],description:[1],accentBorder:[4,"accent-border"]}]]],["p-d362651c",[[262,"af-video-container",{videoThumbnailUrl:[1,"video-thumbnail-url"],videoAlt:[1,"video-alt"],videoUrl:[1,"video-url"]}]]],["p-342b08e5",[[262,"af-feature-grid",{columns:[2],mobileLayout:[1,"mobile-layout"],scrollProgress:[32]},null,{mobileLayout:["onMobileLayoutChange"]}]]],["p-1c96856a",[[262,"af-grid-callout",{imageSrc:[1,"image-src"],imageAlt:[1,"image-alt"],imagePosition:[1,"image-position"],columns:[2],headingSize:[2,"heading-size"]}]]],["p-d7d82986",[[262,"af-in-page-banner",{theme:[1],heading:[1],description:[1],primaryButtonText:[1,"primary-button-text"],primaryButtonUrl:[1,"primary-button-url"],secondaryButtonText:[1,"secondary-button-text"],secondaryButtonUrl:[1,"secondary-button-url"],illustrationUrl:[1,"illustration-url"],showWaveDecoration:[4,"show-wave-decoration"]}]]],["p-a25d3257",[[262,"af-split-section",{topTheme:[1,"top-theme"],bottomTheme:[1,"bottom-theme"],padding:[1],container:[4]}]]],["p-65dd559a",[[262,"af-testimonial-carousel",{currentIndex:[32],isAnimating:[32],testimonialCount:[32]},[[0,"afNavPrev","handleNavPrev"],[0,"afNavNext","handleNavNext"]]]]],["p-9c1e9bd8",[[262,"af-text-image",{imagePosition:[1,"image-position"],imageProportion:[1,"image-proportion"],src:[1],alt:[1],showSecondLockup:[4,"show-second-lockup"]}]]],["p-32d62fbb",[[262,"af-accordion",{mode:[1],value:[1025],defaultValue:[1,"default-value"],internalValue:[32]},[[0,"af-accordion-toggle","handleItemToggle"]],{value:["handleValueChange"]}]]],["p-4eeeb8a1",[[257,"af-accordion-item",{itemId:[513,"item-id"],open:[1540],disabled:[516],contentHeight:[32],toggle:[64]},null,{open:["handleOpenChange"]}]]],["p-9eba91fd",[[257,"af-button-group",{direction:[1],gap:[1]}]]],["p-bbfc9df6",[[257,"af-center",{axis:[1],inline:[4],minHeight:[1,"min-height"]}]]],["p-4f59b554",[[257,"af-checkbox",{checked:[1540],indeterminate:[516],disabled:[516],name:[1],value:[1]}]]],["p-0acadf6f",[[262,"af-client-carousel",{theme:[1],rows:[2],mode:[1]}]]],["p-95d4696a",[[257,"af-color-swatch",{color:[1],name:[1],size:[1]}]]],["p-3ed408f6",[[262,"af-contact-item",{label:[1],value:[1]}]]],["p-41bbb218",[[257,"af-divider",{orientation:[1],spacing:[1]}]]],["p-068ac2fb",[[262,"af-feature-accordion",{heading:[1],items:[1],cycleInterval:[2,"cycle-interval"],autoCycle:[4,"auto-cycle"],expandedIndex:[32],timerProgress:[32]},null,{autoCycle:["handleAutoCycleChange"]}]]],["p-862a2509",[[257,"af-fieldset",{legend:[1],orientation:[1],disabled:[516]}]]],["p-6475796d",[[262,"af-footer",{copyrightText:[1,"copyright-text"],statusText:[1,"status-text"],statusUrl:[1,"status-url"],systemsOperational:[4,"systems-operational"],showStatus:[4,"show-status"]}]]],["p-6756aa66",[[262,"af-footer-column",{heading:[1]}]]],["p-dcc89b4c",[[262,"af-footer-link",{href:[1],external:[4]}]]],["p-6ea474a3",[[257,"af-grid",{columns:[2],columnsLg:[2,"columns-lg"],columnsMd:[2,"columns-md"],columnsSm:[2,"columns-sm"],gap:[1],align:[1]}]]],["p-5e5e7d75",[[257,"af-inline",{gap:[1],align:[1],justify:[1],wrap:[4]}]]],["p-4a355b69",[[257,"af-input",{label:[1],description:[1],placeholder:[1],value:[1025],type:[1],name:[1],disabled:[516],required:[4],readonly:[4],error:[1],showInfoIcon:[4,"show-info-icon"],showSearchIcon:[4,"show-search-icon"],clearable:[4],autocomplete:[1],maxlength:[2],minlength:[2],pattern:[1],isFocused:[32],isHovered:[32]}]]],["p-9480f00d",[[257,"af-logo-well"]]],["p-a1e80460",[[262,"af-nav-accordion",{mode:[1],breakpoint:[513],value:[1025],internalValue:[32]},[[0,"af-nav-accordion-item-toggle","handleItemToggle"]]]]],["p-1b4b0c88",[[262,"af-nav-accordion-item",{itemId:[513,"item-id"],label:[1],open:[1540],disabled:[516],href:[1],breakpoint:[513],contentHeight:[32],hasTriggerSlot:[32],hasContent:[32],toggle:[64]},null,{open:["handleOpenChange"]}]]],["p-43f40921",[[258,"af-nav-card",{heading:[1],href:[1],imageSrc:[1,"image-src"],imageAlt:[1,"image-alt"],isHovered:[32]}]]],["p-5c163c5b",[[262,"af-nav-menu",{heading:[1],breakpoint:[1],showBorder:[4,"show-border"],cardStyle:[516,"card-style"]}]]],["p-827f3050",[[262,"af-nav-menu-nest",{type:[1],breakpoint:[1],showSidebarBorder:[516,"show-sidebar-border"]}]]],["p-dabd389a",[[262,"af-numbered-stepper",{orientation:[1]}]]],["p-631d141c",[[257,"af-paperclip-decoration",{width:[1],height:[1],opacity:[2],fill:[1]}]]],["p-76cb736d",[[257,"af-radio",{checked:[1540],disabled:[516],name:[513],value:[1]}]]],["p-7111051c",[[257,"af-show",{above:[1],below:[1]}]]],["p-a8d75eb1",[[262,"af-social-link",{href:[1],label:[1],icon:[1]}]]],["p-61a6b43d",[[257,"af-spacer",{size:[1],flex:[4],axis:[1]}]]],["p-bed7d9a1",[[257,"af-stack",{direction:[1],gap:[1],align:[1],justify:[1],wrap:[4]}]]],["p-85cc55bb",[[262,"af-stats-row"]]],["p-256970e3",[[262,"af-stepper",{orientation:[1]}]]],["p-eeda78ea",[[262,"af-stepper-step",{index:[514]}]]],["p-7867c2ff",[[257,"af-switch",{active:[1540],disabled:[516],name:[1],value:[1]}]]],["p-9f3e7116",[[257,"af-tab",{label:[1],active:[516],disabled:[516],shape:[513],displayIcon:[4,"display-icon"],displayNumber:[4,"display-number"],value:[1]}]]],["p-35607741",[[257,"af-tab-bar",{shape:[513],breakpoint:[513]},[[0,"keydown","handleKeyDown"]]]]],["p-15f0bd34",[[257,"af-tag",{size:[1],variant:[1],href:[1]}]]],["p-ae430873",[[262,"af-text-image-nest",{layout:[1]}]]],["p-24e74c10",[[257,"af-textarea",{label:[1],description:[1],placeholder:[1],value:[1025],name:[1],disabled:[516],required:[4],readonly:[4],error:[1],showInfoIcon:[4,"show-info-icon"],rows:[2],maxlength:[2],minlength:[2],resize:[1],isFocused:[32],isHovered:[32]}]]],["p-e07e27f1",[[262,"af-theme-override",{theme:[1]}]]],["p-f19cb091",[[257,"af-visually-hidden",{focusable:[4]}]]],["p-365a75e2",[[258,"af-icon-box",{icon:[1],size:[1]}]]],["p-4058a1eb",[[262,"af-section",{padding:[1],theme:[1],container:[4]}]]],["p-6c33fee6",[[257,"af-aspect-ratio",{ratio:[1]}]]],["p-9aed7039",[[257,"af-icon-button",{variant:[513],size:[1],disabled:[4],href:[1],type:[1],ariaLabel:[1,"aria-label"]}]]],["p-9ce0adc2",[[258,"af-image",{src:[1],alt:[1],shape:[1]}]]],["p-a02d6192",[[257,"af-number-badge",{number:[2],variant:[1],size:[2]}]]],["p-90ef7baa",[[257,"af-button",{variant:[513],size:[1],disabled:[4],type:[1],href:[1],hasIconLeft:[32],hasIconRight:[32]}]]],["p-b39eea31",[[262,"af-card",{theme:[1],stretch:[516]}]]],["p-2237e652",[[258,"af-progress-line",{progress:[2],orientation:[1]}]]],["p-4b2c0698",[[257,"af-container",{maxWidth:[1,"max-width"]}]]],["p-364ffa25",[[257,"af-icon",{name:[1],size:[2],label:[1]}]]],["p-b9ec0e75",[[262,"af-navbar",{showDefaultLogo:[4,"show-default-logo"],theme:[1],forceMobile:[516,"force-mobile"],mobileMenuOpen:[32],activeDropdown:[32]},[[0,"click","handleTriggerClick"],[1,"mouseover","handleHover"],[1,"mouseleave","handleHostLeave"],[1,"mouseenter","handleHostEnter"],[4,"click","handleDocumentClick"],[4,"keydown","handleKeyDown"]]],[262,"af-nav-item",{hierarchy:[1],variant:[1],breakpoint:[513],href:[1],active:[4]}],[257,"af-logo"],[257,"af-heading",{level:[1],align:[1]}],[257,"af-text",{variant:[1],align:[1],as:[1]}]]],["p-44d960ca",[[257,"af-typography-lockup",{headingSize:[8,"heading-size"],breakpoint:[1],textAlignment:[1,"text-alignment"],headingAlignment:[1,"heading-alignment"],descriptionAlignment:[1,"description-alignment"],buttonLayout:[1,"button-layout"],buttonsAlignment:[1,"buttons-alignment"],maxWidth:[2,"max-width"],headingColor:[1,"heading-color"],descriptionColor:[1,"description-color"],hasDescription:[32],hasButtons:[32]}]]]],e)}));
|
|
2
2
|
//# sourceMappingURL=affinda.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as t,c as a,h as i,H as e}from"./p-MwnBSqEY.js";const s=".sc-af-testimonial-h{display:block;width:100%}.testimonial-card.sc-af-testimonial{background:var(--af-background-level-1, var(--colour-mistgreen-200, #e8eeed));border-radius:var(--border-radius-card-level-1, 32px);overflow:hidden;display:flex;height:544px;box-sizing:border-box}.testimonial-image.sc-af-testimonial{position:relative;width:50%;min-width:300px;max-width:519px;height:100%;background:var(--colour-brand-inkwell, #14343b);display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}.testimonial-bg-image.sc-af-testimonial{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0.7}.testimonial-logo.sc-af-testimonial{position:relative;z-index:1;padding:0 108px;max-width:100%}.testimonial-logo.sc-af-testimonial img.sc-af-testimonial{width:100%;height:auto;display:block}.testimonial-content.sc-af-testimonial{flex:1;display:flex;flex-direction:column;gap:32px;padding:48px;border:1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));border-left:1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));box-sizing:border-box}.testimonial-quote-section.sc-af-testimonial{flex:1;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:hidden}.testimonial-quote-icon.sc-af-testimonial{width:48px;height:48px;color:var(--af-typography-heading-secondary, var(--colour-brand-soft-clay, #b09670));flex-shrink:0}.testimonial-text.sc-af-testimonial{font-family:var(--typography-bodyfont, 'NeuSans', sans-serif);font-size:22px;line-height:1.4;font-weight:var(--font-weight-regular, 400);color:var(--af-typography-body-default, var(--colour-brand-inkwell, #14343b))}.testimonial-text.sc-af-testimonial-s>p,.testimonial-text .sc-af-testimonial-s>p,.testimonial-text.sc-af-testimonial p.sc-af-testimonial{font:inherit;color:inherit;margin:0 0 12px 0}.testimonial-text.sc-af-testimonial-s>p,.testimonial-text.sc-af-testimonial-s>p:last-child,.testimonial-text .sc-af-testimonial-s>p:last-child,.testimonial-text.sc-af-testimonial p.sc-af-testimonial:last-child{margin-bottom:0}.testimonial-text.sc-af-testimonial-s>ul,.testimonial-text .sc-af-testimonial-s>ul,.testimonial-text.sc-af-testimonial ul.sc-af-testimonial{margin:0 0 12px 0;padding-left:20px}.testimonial-attribution.sc-af-testimonial{font-family:var(--typography-bodyfont, 'NeuSans', sans-serif);font-size:16px;line-height:24px;color:var(--af-typography-body-dark, var(--colour-brand-inkwell, #14343b));margin-top:12px}.testimonial-stats.sc-af-testimonial{display:grid;grid-template-columns:repeat(4, 1fr);gap:32px;width:100%;flex-shrink:0}@media (min-width: 768px) and (max-width: 1023px){.testimonial-stats.sc-af-testimonial{grid-template-columns:repeat(2, 1fr)}}@media (max-width: 767px){.testimonial-stats.sc-af-testimonial{grid-template-columns:1fr}}.testimonial-footer.sc-af-testimonial{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--af-background-border-default, var(--colour-mistgreen-400, #d1ddda));padding-top:32px;flex-shrink:0;min-height:48px}.testimonial-nav.sc-af-testimonial{display:flex;gap:12px}.testimonial-nav-buttons.sc-af-testimonial{display:flex;gap:12px}";const o=class{constructor(i){t(this,i);this.
|
|
2
|
-
//# sourceMappingURL=p-
|
|
1
|
+
import{r as t,c as a,h as i,H as e}from"./p-MwnBSqEY.js";const s=".sc-af-testimonial-h{display:block;width:100%}.testimonial-card.sc-af-testimonial{background:var(--af-background-level-1, var(--colour-mistgreen-200, #e8eeed));border-radius:var(--border-radius-card-level-1, 32px);overflow:hidden;display:flex;height:544px;box-sizing:border-box}.testimonial-image.sc-af-testimonial{position:relative;width:50%;min-width:300px;max-width:519px;height:100%;background:var(--colour-brand-inkwell, #14343b);display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}.testimonial-bg-image.sc-af-testimonial{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0.7}.testimonial-logo.sc-af-testimonial{position:relative;z-index:1;padding:0 108px;max-width:100%}.testimonial-logo.sc-af-testimonial img.sc-af-testimonial{width:100%;height:auto;display:block}.testimonial-content.sc-af-testimonial{flex:1;display:flex;flex-direction:column;gap:32px;padding:48px;border:1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));border-left:1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));box-sizing:border-box}.testimonial-quote-section.sc-af-testimonial{flex:1;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:hidden}.testimonial-quote-icon.sc-af-testimonial{width:48px;height:48px;color:var(--af-typography-heading-secondary, var(--colour-brand-soft-clay, #b09670));flex-shrink:0}.testimonial-text.sc-af-testimonial{font-family:var(--typography-bodyfont, 'NeuSans', sans-serif);font-size:22px;line-height:1.4;font-weight:var(--font-weight-regular, 400);color:var(--af-typography-body-default, var(--colour-brand-inkwell, #14343b))}.testimonial-text.sc-af-testimonial-s>p,.testimonial-text .sc-af-testimonial-s>p,.testimonial-text.sc-af-testimonial p.sc-af-testimonial{font:inherit;color:inherit;margin:0 0 12px 0}.testimonial-text.sc-af-testimonial-s>p,.testimonial-text.sc-af-testimonial-s>p:last-child,.testimonial-text .sc-af-testimonial-s>p:last-child,.testimonial-text.sc-af-testimonial p.sc-af-testimonial:last-child{margin-bottom:0}.testimonial-text.sc-af-testimonial-s>ul,.testimonial-text .sc-af-testimonial-s>ul,.testimonial-text.sc-af-testimonial ul.sc-af-testimonial{margin:0 0 12px 0;padding-left:20px}.testimonial-attribution.sc-af-testimonial{font-family:var(--typography-bodyfont, 'NeuSans', sans-serif);font-size:16px;line-height:24px;color:var(--af-typography-body-dark, var(--colour-brand-inkwell, #14343b));margin-top:12px}.testimonial-stats.sc-af-testimonial{display:grid;grid-template-columns:repeat(4, 1fr);gap:32px;width:100%;flex-shrink:0}@media (min-width: 768px) and (max-width: 1023px){.testimonial-stats.sc-af-testimonial{grid-template-columns:repeat(2, 1fr)}}@media (max-width: 767px){.testimonial-stats.sc-af-testimonial{grid-template-columns:1fr}}.testimonial-footer.sc-af-testimonial{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--af-background-border-default, var(--colour-mistgreen-400, #d1ddda));padding-top:32px;flex-shrink:0;min-height:48px}.testimonial-nav.sc-af-testimonial{display:flex;gap:12px}.testimonial-nav-buttons.sc-af-testimonial{display:flex;gap:12px}";const o=class{constructor(i){t(this,i);this.afNavPrev=a(this,"afNavPrev");this.afNavNext=a(this,"afNavNext");this.showNavigation=false;this.hasPrev=false;this.hasNext=false;this.handlePrev=()=>{this.afNavPrev.emit()};this.handleNext=()=>{this.afNavNext.emit()}}render(){return i(e,{key:"6e9852855010e696e1f3f8d250541da3f99675bb"},i("div",{key:"779f2f42b5443b384b5d02bcdcbb8c2ea904d793",class:"testimonial-card"},i("div",{key:"da08dac0b57e4861d941d9ee1347234a23bc76cd",class:"testimonial-image"},this.backgroundImage&&i("img",{key:"a02cb9792a2ac5d31ad06842dfe9914e02bc5f65",src:this.backgroundImage,alt:"",class:"testimonial-bg-image"}),this.logoImage&&i("div",{key:"fe75369fdff4bd79c96eb4de4d162b124f8f8037",class:"testimonial-logo"},i("img",{key:"21bb43f47b0c4f759f23bdbfa3ff8e07ed6d709c",src:this.logoImage,alt:"Company logo"}))),i("div",{key:"aa07b37eb9eb25e98eb7a7ed7bda01028ef1521f",class:"testimonial-content"},i("div",{key:"4f30fb4aaf739e1f7b05152bad8ccd0a90da0c5f",class:"testimonial-quote-section"},i("div",{key:"3ecc3a1c62fd853bf61c8399885572f48be95f40",class:"testimonial-quote-icon"},i("slot",{key:"838996eaa0db4d93e8ccd400021b069f32ce63ec",name:"quote-icon"},i("af-icon",{key:"8de2e75dbf0de964f0213d3a4c4b1c3ff399cd90",name:"quote",size:48}))),i("div",{key:"54aa8e50eb467db8479d2bd1f18960e5016e56ae",class:"testimonial-text"},i("slot",{key:"f4b67d5a449754c8258db5b60d761420a836923d",name:"quote-body"},this.quote)),i("div",{key:"80076fa3891101465cc5c94739c7b5a71448b81c",class:"testimonial-attribution"},this.attribution)),i("div",{key:"7dc0037ded29ba32536fa4b1ef68a383849cef3d",class:"testimonial-stats"},i("slot",{key:"6146b401ec0a2f840f6f4e80b3352c1ff51c243d",name:"stats"})),i("div",{key:"a5c3f27c91aaa05c24f6db2fe507a6a3ae7a4457",class:"testimonial-footer"},i("div",{key:"82aac81fe42e157bd713bde5562832b6d2a3a08c",class:"testimonial-nav"},this.showNavigation?i("div",{class:"testimonial-nav-buttons"},i("af-icon-button",{variant:"secondary",disabled:!this.hasPrev,onClick:this.handlePrev,ariaLabel:"Previous testimonial"},i("af-icon",{name:"arrow-left",size:24})),i("af-icon-button",{variant:"secondary",disabled:!this.hasNext,onClick:this.handleNext,ariaLabel:"Next testimonial"},i("af-icon",{name:"arrow-right",size:24}))):i("slot",{name:"navigation"})),this.readMoreLink&&i("af-button",{key:"8f3ff6293ae51a697c90d6c4e0c74276abb9da1a",variant:"secondary",href:this.readMoreLink},"Read full story",i("af-icon",{key:"afcaf06157c82fbc85eed2dd8cb2794d48b7d7fe",slot:"icon-right",name:"arrow-right",size:24}))))))}};o.style=s;export{o as af_testimonial};
|
|
2
|
+
//# sourceMappingURL=p-165c413d.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["registerInstance","createEvent","h","Host","afTestimonialCss","AfTestimonial","constructor","hostRef","this","afNavPrev","afNavNext","showNavigation","hasPrev","hasNext","handlePrev","emit","handleNext","render","key","class","backgroundImage","src","alt","logoImage","name","size","quote","attribution","variant","disabled","onClick","ariaLabel","readMoreLink","href","slot","style"],"sources":["0"],"mappings":"YAAcA,OAAuBC,OAAaC,OAAQC,MAAY,kBAEtE,MAAMC,EAAmB,ynGAEzB,MAAMC,EAAgB,MAClB,WAAAC,CAAYC,GACRP,EAAiBQ,KAAMD,GACvBC,KAAKC,UAAYR,EAAYO,KAAM,aACnCA,KAAKE,UAAYT,EAAYO,KAAM,aAInCA,KAAKG,eAAiB,MAItBH,KAAKI,QAAU,MAIfJ,KAAKK,QAAU,MACfL,KAAKM,WAAa,KACdN,KAAKC,UAAUM,MAAM,EAEzBP,KAAKQ,WAAa,KACdR,KAAKE,UAAUK,MAAM,CAE7B,CACA,MAAAE,GACI,OAAQf,EAAEC,EAAM,CAAEe,IAAK,4CAA8ChB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,oBAAsBjB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,qBAAuBX,KAAKY,iBAAoBlB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CG,IAAKb,KAAKY,gBAAiBE,IAAK,GAAIH,MAAO,yBAA4BX,KAAKe,WAAcrB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,oBAAsBjB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CG,IAAKb,KAAKe,UAAWD,IAAK,mBAAsBpB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,uBAAyBjB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,6BAA+BjB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,0BAA4BjB,EAAE,OAAQ,CAAEgB,IAAK,2CAA4CM,KAAM,cAAgBtB,EAAE,UAAW,CAAEgB,IAAK,2CAA4CM,KAAM,QAASC,KAAM,OAASvB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,oBAAsBjB,EAAE,OAAQ,CAAEgB,IAAK,2CAA4CM,KAAM,cAAgBhB,KAAKkB,QAASxB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,2BAA6BX,KAAKmB,cAAezB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,qBAAuBjB,EAAE,OAAQ,CAAEgB,IAAK,2CAA4CM,KAAM,WAAatB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,sBAAwBjB,EAAE,MAAO,CAAEgB,IAAK,2CAA4CC,MAAO,mBAAqBX,KAAKG,eAE1sDT,EAAE,MAAO,CAAEiB,MAAO,2BAA6BjB,EAAE,iBAAkB,CAAE0B,QAAS,YAAaC,UAAWrB,KAAKI,QAASkB,QAAStB,KAAKM,WAAYiB,UAAW,wBAA0B7B,EAAE,UAAW,CAAEsB,KAAM,aAAcC,KAAM,MAAQvB,EAAE,iBAAkB,CAAE0B,QAAS,YAAaC,UAAWrB,KAAKK,QAASiB,QAAStB,KAAKQ,WAAYe,UAAW,oBAAsB7B,EAAE,UAAW,CAAEsB,KAAM,cAAeC,KAAM,OAE9YvB,EAAE,OAAQ,CAAEsB,KAAM,gBAAmBhB,KAAKwB,cAAiB9B,EAAE,YAAa,CAAEgB,IAAK,2CAA4CU,QAAS,YAAaK,KAAMzB,KAAKwB,cAAgB,kBAAmB9B,EAAE,UAAW,CAAEgB,IAAK,2CAA4CgB,KAAM,aAAcV,KAAM,cAAeC,KAAM,SACpT,GAEJpB,EAAc8B,MAAQ/B,SAEbC","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as t,h as s,H as i,a as e}from"./p-MwnBSqEY.js";const a=".sc-af-testimonial-carousel-h{display:block;width:100%}.testimonial-carousel.sc-af-testimonial-carousel{position:relative;width:100%;overflow:hidden}.testimonial-slides.sc-af-testimonial-carousel{position:relative;width:100%;min-height:544px;overflow:hidden}.testimonial-slides.sc-af-testimonial-carousel-s>af-testimonial,.testimonial-slides .sc-af-testimonial-carousel-s>af-testimonial{position:absolute;top:0;left:0;width:100%;transition:transform 0.5s ease-in-out, opacity 0.5s ease-in-out}@media (prefers-reduced-motion: reduce){.testimonial-slides.sc-af-testimonial-carousel-s>af-testimonial,.testimonial-slides .sc-af-testimonial-carousel-s>af-testimonial{transition:none}}.testimonial-progress.sc-af-testimonial-carousel{margin-top:32px;max-width:840px;margin-left:auto;margin-right:auto}";const o=class{constructor(s){t(this,s);this.currentIndex=0;this.isAnimating=false;this.testimonialCount=0;this.testimonials=[];this.goToPrevious=()=>{if(this.isAnimating||this.currentIndex===0)return;this.isAnimating=true;this.currentIndex=this.currentIndex-1;this.updateVisibleTestimonial();setTimeout((()=>{this.isAnimating=false}),500)};this.goToNext=()=>{if(this.isAnimating||this.currentIndex>=this.testimonialCount-1)return;this.isAnimating=true;this.currentIndex=this.currentIndex+1;this.updateVisibleTestimonial();setTimeout((()=>{this.isAnimating=false}),500)}}componentDidLoad(){this.detectTestimonials();this.observer=new MutationObserver((()=>{this.detectTestimonials()}));this.observer.observe(this.host,{childList:true,subtree:true})}disconnectedCallback(){if(this.observer){this.observer.disconnect()}}handleNavPrev(){this.goToPrevious()}handleNavNext(){this.goToNext()}detectTestimonials(){const t=Array.from(this.host.querySelectorAll("af-testimonial"));if(t.length!==this.testimonials.length){this.testimonials=t;this.testimonialCount=t.length;if(this.testimonials.length>0){this.currentIndex=0;this.updateVisibleTestimonial()}}}updateVisibleTestimonial(){const t=this.currentIndex>0;const s=this.currentIndex<this.testimonialCount-1;const i=this.testimonialCount>1;this.testimonials.forEach(((e,a)=>{const o=(a-this.currentIndex)*100;e.style.transform=`translateX(${o}%)`;e.style.opacity=a===this.currentIndex?"1":"0";e.style.pointerEvents=a===this.currentIndex?"auto":"none";e.showNavigation=i;e.hasPrev=t;e.hasNext=s}))}getProgress(){if(this.testimonialCount<=1)return 0;return(this.currentIndex+1)/this.testimonialCount}render(){return s(i,{key:"
|
|
2
|
-
//# sourceMappingURL=p-
|
|
1
|
+
import{r as t,h as s,H as i,a as e}from"./p-MwnBSqEY.js";const a=".sc-af-testimonial-carousel-h{display:block;width:100%}.testimonial-carousel.sc-af-testimonial-carousel{position:relative;width:100%;overflow:hidden}.testimonial-slides.sc-af-testimonial-carousel{position:relative;width:100%;min-height:544px;overflow:hidden}.testimonial-slides.sc-af-testimonial-carousel-s>af-testimonial,.testimonial-slides .sc-af-testimonial-carousel-s>af-testimonial{position:absolute;top:0;left:0;width:100%;transition:transform 0.5s ease-in-out, opacity 0.5s ease-in-out}@media (prefers-reduced-motion: reduce){.testimonial-slides.sc-af-testimonial-carousel-s>af-testimonial,.testimonial-slides .sc-af-testimonial-carousel-s>af-testimonial{transition:none}}.testimonial-progress.sc-af-testimonial-carousel{margin-top:32px;max-width:840px;margin-left:auto;margin-right:auto}";const o=class{constructor(s){t(this,s);this.currentIndex=0;this.isAnimating=false;this.testimonialCount=0;this.testimonials=[];this.goToPrevious=()=>{if(this.isAnimating||this.currentIndex===0)return;this.isAnimating=true;this.currentIndex=this.currentIndex-1;this.updateVisibleTestimonial();setTimeout((()=>{this.isAnimating=false}),500)};this.goToNext=()=>{if(this.isAnimating||this.currentIndex>=this.testimonialCount-1)return;this.isAnimating=true;this.currentIndex=this.currentIndex+1;this.updateVisibleTestimonial();setTimeout((()=>{this.isAnimating=false}),500)}}componentDidLoad(){this.detectTestimonials();this.observer=new MutationObserver((()=>{this.detectTestimonials()}));this.observer.observe(this.host,{childList:true,subtree:true})}disconnectedCallback(){if(this.observer){this.observer.disconnect()}}handleNavPrev(){this.goToPrevious()}handleNavNext(){this.goToNext()}detectTestimonials(){const t=Array.from(this.host.querySelectorAll("af-testimonial"));if(t.length!==this.testimonials.length){this.testimonials=t;this.testimonialCount=t.length;if(this.testimonials.length>0){this.currentIndex=0;this.updateVisibleTestimonial()}}}updateVisibleTestimonial(){const t=this.currentIndex>0;const s=this.currentIndex<this.testimonialCount-1;const i=this.testimonialCount>1;this.testimonials.forEach(((e,a)=>{const o=(a-this.currentIndex)*100;e.style.transform=`translateX(${o}%)`;e.style.opacity=a===this.currentIndex?"1":"0";e.style.pointerEvents=a===this.currentIndex?"auto":"none";e.showNavigation=i;e.hasPrev=t;e.hasNext=s}))}getProgress(){if(this.testimonialCount<=1)return 0;return(this.currentIndex+1)/this.testimonialCount}render(){return s(i,{key:"a3dba3e3073b5a0009a68896c962269dec2ec580"},s("div",{key:"21e3310b04dced5b58bf88ffbe773ad7ed3f56be",class:"testimonial-carousel"},s("div",{key:"85fe5a7dc6b0dc55e7602c75b273492082b17ab5",class:"testimonial-slides"},s("slot",{key:"6712252f49721d7d63b4e136ddff6f40a043cd4e"})),this.testimonialCount>1&&s("div",{key:"212be1b74d47c371f1942808475fbb459760aff5",class:"testimonial-progress"},s("af-progress-line",{key:"7b8ec0176748a0e20cf5cfc653bb3be798a1e6df",progress:this.getProgress()}))))}get host(){return e(this)}};o.style=a;export{o as af_testimonial_carousel};
|
|
2
|
+
//# sourceMappingURL=p-65dd559a.entry.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as
|
|
2
|
-
//# sourceMappingURL=p-
|
|
1
|
+
import{r as e,c as o,h as a,H as i}from"./p-MwnBSqEY.js";const t=".sc-af-video-container-h{display:block;width:100%}.video-container.sc-af-video-container{display:flex;flex-direction:column;align-items:center;width:100%;gap:var(--space-10, 40px)}.video-container__top.sc-af-video-container,.video-container__bottom.sc-af-video-container{width:100%;display:flex;flex-direction:column;align-items:center}.video-container__top.sc-af-video-container:empty,.video-container__bottom.sc-af-video-container:empty{display:none}.video-container__video.sc-af-video-container{width:100%;max-width:1024px}.video-container__thumbnail-wrapper.sc-af-video-container{position:absolute;inset:0;border-radius:var(--radii-video-crop, 16px);overflow:hidden;background-color:var(--colour-inkwell-400, #2b484f)}.video-container__thumbnail.sc-af-video-container{width:100%;height:100%;object-fit:cover;display:block;position:absolute;inset:0}.video-container__play-button.sc-af-video-container{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);display:flex;align-items:center;justify-content:center;padding:24px;border-radius:var(--radii-button, 9999px);background-color:var(--af-button-primary-bg, var(--colour-brand-ice, #a6fffb));border:1px solid var(--af-button-primary-stroke, var(--colour-brand-inkwell, #14343b));cursor:pointer;transition:background-color 0.2s ease;color:var(--af-button-primary-icon, var(--colour-brand-inkwell, #14343b))}.video-container__play-button.sc-af-video-container:hover{background-color:var(--af-button-primary-bg-hover, var(--colour-ice-600, #95e6e2))}.video-container__play-button.sc-af-video-container:focus-visible{outline:2px solid var(--colour-brand-ice, #a6fffb);outline-offset:2px}@media (max-width: 768px){.video-container.sc-af-video-container{gap:var(--space-8, 32px)}.video-container__play-button.sc-af-video-container{padding:12px}}";const n=class{constructor(a){e(this,a);this.afPlayClick=o(this,"afPlayClick");this.videoThumbnailUrl="";this.videoAlt="Video thumbnail";this.videoUrl="";this.handlePlayClick=()=>{const e=this.afPlayClick.emit({videoUrl:this.videoUrl});if(!e.defaultPrevented&&this.videoUrl){window.open(this.videoUrl,"_blank")}}}render(){return a(i,{key:"6554d80d7b00b2e7c2ebed35d10fe48b2e55af21"},a("div",{key:"7acffa76ffb032446270850359deb315af18dd43",class:"video-container"},a("div",{key:"d79361dc04ce97b953754a63b76805be4391b593",class:"video-container__top"},a("slot",{key:"c5b1f43ecfb23cc39cc83dba5711a70eb909edef",name:"top"})),a("div",{key:"d2159295b5950d500f06389ce2d394c7e7c902db",class:"video-container__video"},a("af-aspect-ratio",{key:"fb17e071a5003a62f6fd8037a5d73d5f195eee14",ratio:"16:9"},a("div",{key:"c1aaedd7603b9a024f8bbe1ac280597e662b5c07",class:"video-container__thumbnail-wrapper"},this.videoThumbnailUrl&&a("img",{key:"a55c605d6e07c569cdcbd3ecd1239e3d6ba63bc3",src:this.videoThumbnailUrl,alt:this.videoAlt,class:"video-container__thumbnail",loading:"lazy"}),a("button",{key:"d04a4b4b5313327e5d81e75219ae9bc0d3866c33",class:"video-container__play-button",onClick:this.handlePlayClick,"aria-label":"Play video",type:"button"},a("af-icon",{key:"52bc748aacd58d1acc1f22e2acfb07eb71447cdc",name:"play",size:24}))))),a("div",{key:"8f423ee569de7c7749f675d7815a50b4d491252e",class:"video-container__bottom"},a("slot",{key:"d645d52209cb8537a7286b161c257ebd011cc061",name:"bottom"}))))}};n.style=t;export{n as af_video_container};
|
|
2
|
+
//# sourceMappingURL=p-d362651c.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["registerInstance","createEvent","h","Host","afVideoContainerCss","AfVideoContainer","constructor","hostRef","this","afPlayClick","videoThumbnailUrl","videoAlt","videoUrl","handlePlayClick","event","emit","defaultPrevented","window","open","render","key","class","name","ratio","src","alt","loading","onClick","type","size","style"],"sources":["0"],"mappings":"YAAcA,OAAuBC,OAAaC,OAAQC,MAAY,kBAEtE,MAAMC,EAAsB,kxDAE5B,MAAMC,EAAmB,MACrB,WAAAC,CAAYC,GACRP,EAAiBQ,KAAMD,GACvBC,KAAKC,YAAcR,EAAYO,KAAM,eAErCA,KAAKE,kBAAoB,GAEzBF,KAAKG,SAAW,kBAEhBH,KAAKI,SAAW,GAIhBJ,KAAKK,gBAAkB,KACnB,MAAMC,EAAQN,KAAKC,YAAYM,KAAK,CAAEH,SAAUJ,KAAKI,WAErD,IAAKE,EAAME,kBAAoBR,KAAKI,SAAU,CAC1CK,OAAOC,KAAKV,KAAKI,SAAU,SAC/B,EAER,CACA,MAAAO,GACI,OAAQjB,EAAEC,EAAM,CAAEiB,IAAK,4CAA8ClB,EAAE,MAAO,CAAEkB,IAAK,2CAA4CC,MAAO,mBAAqBnB,EAAE,MAAO,CAAEkB,IAAK,2CAA4CC,MAAO,wBAA0BnB,EAAE,OAAQ,CAAEkB,IAAK,2CAA4CE,KAAM,SAAWpB,EAAE,MAAO,CAAEkB,IAAK,2CAA4CC,MAAO,0BAA4BnB,EAAE,kBAAmB,CAAEkB,IAAK,2CAA4CG,MAAO,QAAUrB,EAAE,MAAO,CAAEkB,IAAK,2CAA4CC,MAAO,sCAAwCb,KAAKE,mBAAsBR,EAAE,MAAO,CAAEkB,IAAK,2CAA4CI,IAAKhB,KAAKE,kBAAmBe,IAAKjB,KAAKG,SAAUU,MAAO,6BAA8BK,QAAS,SAAYxB,EAAE,SAAU,CAAEkB,IAAK,2CAA4CC,MAAO,+BAAgCM,QAASnB,KAAKK,gBAAiB,aAAc,aAAce,KAAM,UAAY1B,EAAE,UAAW,CAAEkB,IAAK,2CAA4CE,KAAM,OAAQO,KAAM,SAAW3B,EAAE,MAAO,CAAEkB,IAAK,2CAA4CC,MAAO,2BAA6BnB,EAAE,OAAQ,CAAEkB,IAAK,2CAA4CE,KAAM,aACtuC,GAEJjB,EAAiByB,MAAQ1B,SAEhBC","ignoreList":[]}
|
|
@@ -92,7 +92,7 @@ const AfTestimonialCarousel = class {
|
|
|
92
92
|
return (this.currentIndex + 1) / this.testimonialCount;
|
|
93
93
|
}
|
|
94
94
|
render() {
|
|
95
|
-
return (index.h(index.Host, { key: '
|
|
95
|
+
return (index.h(index.Host, { key: 'a3dba3e3073b5a0009a68896c962269dec2ec580' }, index.h("div", { key: '21e3310b04dced5b58bf88ffbe773ad7ed3f56be', class: "testimonial-carousel" }, index.h("div", { key: '85fe5a7dc6b0dc55e7602c75b273492082b17ab5', class: "testimonial-slides" }, index.h("slot", { key: '6712252f49721d7d63b4e136ddff6f40a043cd4e' })), this.testimonialCount > 1 && (index.h("div", { key: '212be1b74d47c371f1942808475fbb459760aff5', class: "testimonial-progress" }, index.h("af-progress-line", { key: '7b8ec0176748a0e20cf5cfc653bb3be798a1e6df', progress: this.getProgress() }))))));
|
|
96
96
|
}
|
|
97
97
|
get host() { return index.getElement(this); }
|
|
98
98
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"af-testimonial-carousel.entry.cjs.js","sources":["src/components/af-testimonial-carousel/af-testimonial-carousel.css?tag=af-testimonial-carousel&encapsulation=scoped","src/components/af-testimonial-carousel/af-testimonial-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-carousel {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.testimonial-slides {\n position: relative;\n width: 100%;\n min-height: 544px;\n overflow: hidden;\n}\n\n.testimonial-slides ::slotted(af-testimonial) {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;\n}\n\n/* Respect reduced motion: slides can auto-advance, so remove the\n * 500ms cross-fade/slide transition and swap instantly. */\n@media (prefers-reduced-motion: reduce) {\n .testimonial-slides ::slotted(af-testimonial) {\n transition: none;\n }\n}\n\n/* Progress indicator - wraps af-progress-line atom */\n/* Per Figma: centered below the card with horizontal padding */\n.testimonial-progress {\n margin-top: 32px;\n max-width: 840px;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* Navigation is now rendered inside each testimonial's footer via props */\n\n","import { Component, State, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * TestimonialCarousel - Carousel for displaying multiple customer testimonials.\n * \n * Handles navigation between testimonials with progress indicator.\n * Wrap in Section/Container for proper page layout and theming.\n * \n * @slot - Testimonial components to display in the carousel\n */\n@Component({\n tag: 'af-testimonial-carousel',\n styleUrl: 'af-testimonial-carousel.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonialCarousel {\n @Element() host!: HTMLElement;\n @State() currentIndex: number = 0;\n @State() isAnimating: boolean = false;\n @State() testimonialCount: number = 0;\n\n private testimonials: HTMLElement[] = [];\n private observer: MutationObserver | undefined;\n\n componentDidLoad() {\n this.detectTestimonials();\n \n // Watch for testimonials being added (for React async rendering)\n this.observer = new MutationObserver(() => {\n this.detectTestimonials();\n });\n \n this.observer.observe(this.host, {\n childList: true,\n subtree: true\n });\n }\n\n disconnectedCallback() {\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n /**\n * Listen for navigation events from testimonials\n */\n @Listen('
|
|
1
|
+
{"version":3,"file":"af-testimonial-carousel.entry.cjs.js","sources":["src/components/af-testimonial-carousel/af-testimonial-carousel.css?tag=af-testimonial-carousel&encapsulation=scoped","src/components/af-testimonial-carousel/af-testimonial-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-carousel {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.testimonial-slides {\n position: relative;\n width: 100%;\n min-height: 544px;\n overflow: hidden;\n}\n\n.testimonial-slides ::slotted(af-testimonial) {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;\n}\n\n/* Respect reduced motion: slides can auto-advance, so remove the\n * 500ms cross-fade/slide transition and swap instantly. */\n@media (prefers-reduced-motion: reduce) {\n .testimonial-slides ::slotted(af-testimonial) {\n transition: none;\n }\n}\n\n/* Progress indicator - wraps af-progress-line atom */\n/* Per Figma: centered below the card with horizontal padding */\n.testimonial-progress {\n margin-top: 32px;\n max-width: 840px;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* Navigation is now rendered inside each testimonial's footer via props */\n\n","import { Component, State, h, Host, Element, Listen } from '@stencil/core';\n\n/**\n * TestimonialCarousel - Carousel for displaying multiple customer testimonials.\n * \n * Handles navigation between testimonials with progress indicator.\n * Wrap in Section/Container for proper page layout and theming.\n * \n * @slot - Testimonial components to display in the carousel\n */\n@Component({\n tag: 'af-testimonial-carousel',\n styleUrl: 'af-testimonial-carousel.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonialCarousel {\n @Element() host!: HTMLElement;\n @State() currentIndex: number = 0;\n @State() isAnimating: boolean = false;\n @State() testimonialCount: number = 0;\n\n private testimonials: HTMLElement[] = [];\n private observer: MutationObserver | undefined;\n\n componentDidLoad() {\n this.detectTestimonials();\n \n // Watch for testimonials being added (for React async rendering)\n this.observer = new MutationObserver(() => {\n this.detectTestimonials();\n });\n \n this.observer.observe(this.host, {\n childList: true,\n subtree: true\n });\n }\n\n disconnectedCallback() {\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n /**\n * Listen for navigation events from testimonials\n */\n @Listen('afNavPrev')\n handleNavPrev() {\n this.goToPrevious();\n }\n\n @Listen('afNavNext')\n handleNavNext() {\n this.goToNext();\n }\n\n private detectTestimonials() {\n const newTestimonials = Array.from(this.host.querySelectorAll('af-testimonial')) as HTMLElement[];\n \n if (newTestimonials.length !== this.testimonials.length) {\n this.testimonials = newTestimonials;\n this.testimonialCount = newTestimonials.length;\n \n if (this.testimonials.length > 0) {\n this.currentIndex = 0;\n this.updateVisibleTestimonial();\n }\n }\n }\n\n private updateVisibleTestimonial() {\n const hasPrev = this.currentIndex > 0;\n const hasNext = this.currentIndex < this.testimonialCount - 1;\n const showNav = this.testimonialCount > 1;\n\n this.testimonials.forEach((testimonial, index) => {\n const offset = (index - this.currentIndex) * 100;\n testimonial.style.transform = `translateX(${offset}%)`;\n testimonial.style.opacity = index === this.currentIndex ? '1' : '0';\n testimonial.style.pointerEvents = index === this.currentIndex ? 'auto' : 'none';\n \n // Set navigation props on testimonials (directly on the element for Stencil)\n (testimonial as any).showNavigation = showNav;\n (testimonial as any).hasPrev = hasPrev;\n (testimonial as any).hasNext = hasNext;\n });\n }\n\n private goToPrevious = () => {\n if (this.isAnimating || this.currentIndex === 0) return;\n \n this.isAnimating = true;\n this.currentIndex = this.currentIndex - 1;\n this.updateVisibleTestimonial();\n \n setTimeout(() => {\n this.isAnimating = false;\n }, 500);\n };\n\n private goToNext = () => {\n if (this.isAnimating || this.currentIndex >= this.testimonialCount - 1) return;\n \n this.isAnimating = true;\n this.currentIndex = this.currentIndex + 1;\n this.updateVisibleTestimonial();\n \n setTimeout(() => {\n this.isAnimating = false;\n }, 500);\n };\n\n /**\n * Calculate progress value (0 to 1) based on current position\n */\n private getProgress(): number {\n if (this.testimonialCount <= 1) return 0;\n return (this.currentIndex + 1) / this.testimonialCount;\n }\n\n render() {\n return (\n <Host>\n <div class=\"testimonial-carousel\">\n <div class=\"testimonial-slides\">\n <slot></slot>\n </div>\n \n {/* Progress indicator using af-progress-line atom */}\n {this.testimonialCount > 1 && (\n <div class=\"testimonial-progress\">\n <af-progress-line progress={this.getProgress()} />\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n\n"],"names":["h","Host"],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ const afTestimonialCss = ".sc-af-testimonial-h{display:block;width:100%}.testimo
|
|
|
7
7
|
const AfTestimonial = class {
|
|
8
8
|
constructor(hostRef) {
|
|
9
9
|
index.registerInstance(this, hostRef);
|
|
10
|
-
this.
|
|
11
|
-
this.
|
|
10
|
+
this.afNavPrev = index.createEvent(this, "afNavPrev");
|
|
11
|
+
this.afNavNext = index.createEvent(this, "afNavNext");
|
|
12
12
|
/**
|
|
13
13
|
* Whether to show built-in navigation buttons (used when in a carousel)
|
|
14
14
|
*/
|
|
@@ -22,18 +22,18 @@ const AfTestimonial = class {
|
|
|
22
22
|
*/
|
|
23
23
|
this.hasNext = false;
|
|
24
24
|
this.handlePrev = () => {
|
|
25
|
-
this.
|
|
25
|
+
this.afNavPrev.emit();
|
|
26
26
|
};
|
|
27
27
|
this.handleNext = () => {
|
|
28
|
-
this.
|
|
28
|
+
this.afNavNext.emit();
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
render() {
|
|
32
|
-
return (index.h(index.Host, { key: '
|
|
32
|
+
return (index.h(index.Host, { key: '6e9852855010e696e1f3f8d250541da3f99675bb' }, index.h("div", { key: '779f2f42b5443b384b5d02bcdcbb8c2ea904d793', class: "testimonial-card" }, index.h("div", { key: 'da08dac0b57e4861d941d9ee1347234a23bc76cd', class: "testimonial-image" }, this.backgroundImage && (index.h("img", { key: 'a02cb9792a2ac5d31ad06842dfe9914e02bc5f65', src: this.backgroundImage, alt: "", class: "testimonial-bg-image" })), this.logoImage && (index.h("div", { key: 'fe75369fdff4bd79c96eb4de4d162b124f8f8037', class: "testimonial-logo" }, index.h("img", { key: '21bb43f47b0c4f759f23bdbfa3ff8e07ed6d709c', src: this.logoImage, alt: "Company logo" })))), index.h("div", { key: 'aa07b37eb9eb25e98eb7a7ed7bda01028ef1521f', class: "testimonial-content" }, index.h("div", { key: '4f30fb4aaf739e1f7b05152bad8ccd0a90da0c5f', class: "testimonial-quote-section" }, index.h("div", { key: '3ecc3a1c62fd853bf61c8399885572f48be95f40', class: "testimonial-quote-icon" }, index.h("slot", { key: '838996eaa0db4d93e8ccd400021b069f32ce63ec', name: "quote-icon" }, index.h("af-icon", { key: '8de2e75dbf0de964f0213d3a4c4b1c3ff399cd90', name: "quote", size: 48 }))), index.h("div", { key: '54aa8e50eb467db8479d2bd1f18960e5016e56ae', class: "testimonial-text" }, index.h("slot", { key: 'f4b67d5a449754c8258db5b60d761420a836923d', name: "quote-body" }, this.quote)), index.h("div", { key: '80076fa3891101465cc5c94739c7b5a71448b81c', class: "testimonial-attribution" }, this.attribution)), index.h("div", { key: '7dc0037ded29ba32536fa4b1ef68a383849cef3d', class: "testimonial-stats" }, index.h("slot", { key: '6146b401ec0a2f840f6f4e80b3352c1ff51c243d', name: "stats" })), index.h("div", { key: 'a5c3f27c91aaa05c24f6db2fe507a6a3ae7a4457', class: "testimonial-footer" }, index.h("div", { key: '82aac81fe42e157bd713bde5562832b6d2a3a08c', class: "testimonial-nav" }, this.showNavigation ? (
|
|
33
33
|
// Render built-in navigation buttons
|
|
34
34
|
index.h("div", { class: "testimonial-nav-buttons" }, index.h("af-icon-button", { variant: "secondary", disabled: !this.hasPrev, onClick: this.handlePrev, ariaLabel: "Previous testimonial" }, index.h("af-icon", { name: "arrow-left", size: 24 })), index.h("af-icon-button", { variant: "secondary", disabled: !this.hasNext, onClick: this.handleNext, ariaLabel: "Next testimonial" }, index.h("af-icon", { name: "arrow-right", size: 24 })))) : (
|
|
35
35
|
// Allow custom navigation via slot
|
|
36
|
-
index.h("slot", { name: "navigation" }))), this.readMoreLink && (index.h("af-button", { key: '
|
|
36
|
+
index.h("slot", { name: "navigation" }))), this.readMoreLink && (index.h("af-button", { key: '8f3ff6293ae51a697c90d6c4e0c74276abb9da1a', variant: "secondary", href: this.readMoreLink }, "Read full story", index.h("af-icon", { key: 'afcaf06157c82fbc85eed2dd8cb2794d48b7d7fe', slot: "icon-right", name: "arrow-right", size: 24 }))))))));
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
AfTestimonial.style = afTestimonialCss;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"af-testimonial.entry.cjs.js","sources":["src/components/af-testimonial/af-testimonial.css?tag=af-testimonial&encapsulation=scoped","src/components/af-testimonial/af-testimonial.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-card {\n /* Uses themed level-1 background from parent Section */\n background: var(--af-background-level-1, var(--colour-mistgreen-200, #e8eeed));\n border-radius: var(--border-radius-card-level-1, 32px);\n overflow: hidden;\n display: flex;\n height: 544px;\n box-sizing: border-box;\n}\n\n/* Image side - 40.5% of card width (519px of 1280px in Figma) */\n.testimonial-image {\n position: relative;\n width: 50%;\n min-width: 300px;\n /* Minimum for readability */\n max-width: 519px;\n /* Cap at Figma design width */\n height: 100%;\n /* Dark background for image overlay effect - always dark regardless of theme */\n background: var(--colour-brand-inkwell, #14343b);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n}\n\n.testimonial-bg-image {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.7;\n}\n\n.testimonial-logo {\n position: relative;\n z-index: 1;\n padding: 0 108px;\n max-width: 100%;\n}\n\n.testimonial-logo img {\n width: 100%;\n height: auto;\n display: block;\n}\n\n/* Content side */\n.testimonial-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 32px;\n padding: 48px;\n /* Subtle border using themed border token */\n border: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n border-left: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n box-sizing: border-box;\n}\n\n.testimonial-quote-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n /* Allow flex item to shrink */\n overflow: hidden;\n}\n\n.testimonial-quote-icon {\n width: 48px;\n height: 48px;\n /* Quote icon uses themed secondary heading color (gold/ochre accent) */\n color: var(--af-typography-heading-secondary, var(--colour-brand-soft-clay, #b09670));\n flex-shrink: 0;\n}\n\n/* Quote text — 22px / 140% per Webflow reference. Accepts either the\n `quote` prop (rendered as plain text) or the `quote-body` slot (rich). */\n.testimonial-text {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 22px;\n line-height: 1.4;\n font-weight: var(--font-weight-regular, 400);\n color: var(--af-typography-body-default, var(--colour-brand-inkwell, #14343b));\n}\n.testimonial-text ::slotted(p),\n.testimonial-text p {\n font: inherit;\n color: inherit;\n margin: 0 0 12px 0;\n}\n.testimonial-text ::slotted(p:last-child),\n.testimonial-text p:last-child {\n margin-bottom: 0;\n}\n.testimonial-text ::slotted(ul),\n.testimonial-text ul {\n margin: 0 0 12px 0;\n padding-left: 20px;\n}\n\n/* Attribution uses body-dark color for emphasis */\n.testimonial-attribution {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 16px;\n line-height: 24px;\n color: var(--af-typography-body-dark, var(--colour-brand-inkwell, #14343b));\n margin-top: 12px;\n}\n\n.testimonial-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 32px;\n width: 100%;\n flex-shrink: 0;\n}\n\n/* ≥ mobile and ≤ tablet — 2-column intermediate layout so the stats row\n * doesn't snap straight from 4-across to 1-across on common iPad / narrow\n * laptop widths. */\n@media (min-width: 768px) and (max-width: 1023px) {\n .testimonial-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n/* ≤ mobile — single column stack */\n@media (max-width: 767px) {\n .testimonial-stats {\n grid-template-columns: 1fr;\n }\n}\n\n.testimonial-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n /* Themed border color */\n border-top: 1px solid var(--af-background-border-default, var(--colour-mistgreen-400, #d1ddda));\n padding-top: 32px;\n flex-shrink: 0;\n min-height: 48px;\n}\n\n.testimonial-nav {\n display: flex;\n gap: 12px;\n}\n\n.testimonial-nav-buttons {\n display: flex;\n gap: 12px;\n}\n\n/* CTA button is now handled by af-button atom component */","import { Component, Prop, h, Host, Event, EventEmitter } from '@stencil/core';\n\n/**\n * @slot quote-body - Rich quote content (paragraphs, lists). Overrides the\n * `quote` string prop when provided. Use for testimonials that include\n * multiple paragraphs, bulleted points, or inline emphasis.\n * @slot quote-icon - Quote icon (defaults to af-icon name=\"quote\").\n * @slot stats - Statistic items (af-testimonial-stat components).\n * @slot navigation - Custom nav controls (when not using built-in ones).\n */\n@Component({\n tag: 'af-testimonial',\n styleUrl: 'af-testimonial.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonial {\n /**\n * Background image URL for the testimonial card\n */\n @Prop() backgroundImage?: string;\n\n /**\n * Company logo URL\n */\n @Prop() logoImage?: string;\n\n /**\n * Testimonial quote text. Falls back to the `quote-body` slot if that\n * slot has content.\n */\n @Prop() quote?: string;\n\n /**\n * Attribution text (e.g., \"– Nathaniel Barrs, CTO, PSC Insurance\")\n */\n @Prop() attribution!: string;\n\n /**\n * Link to full case study\n */\n @Prop() readMoreLink?: string;\n\n /**\n * Whether to show built-in navigation buttons (used when in a carousel)\n */\n @Prop({ mutable: true }) showNavigation: boolean = false;\n\n /**\n * Whether the previous button is enabled\n */\n @Prop({ mutable: true }) hasPrev: boolean = false;\n\n /**\n * Whether the next button is enabled\n */\n @Prop({ mutable: true }) hasNext: boolean = false;\n\n /**\n * Emitted when the previous button is clicked\n */\n @Event() navPrev!: EventEmitter<void>;\n\n /**\n * Emitted when the next button is clicked\n */\n @Event() navNext!: EventEmitter<void>;\n\n private handlePrev = () => {\n this.navPrev.emit();\n };\n\n private handleNext = () => {\n this.navNext.emit();\n };\n\n render() {\n return (\n <Host>\n <div class=\"testimonial-card\">\n {/* Image side */}\n <div class=\"testimonial-image\">\n {this.backgroundImage && (\n <img src={this.backgroundImage} alt=\"\" class=\"testimonial-bg-image\" />\n )}\n {this.logoImage && (\n <div class=\"testimonial-logo\">\n <img src={this.logoImage} alt=\"Company logo\" />\n </div>\n )}\n </div>\n\n {/* Content side */}\n <div class=\"testimonial-content\">\n <div class=\"testimonial-quote-section\">\n {/* Quote icon - using af-icon atom with slot for flexibility */}\n <div class=\"testimonial-quote-icon\">\n <slot name=\"quote-icon\">\n <af-icon name=\"quote\" size={48} />\n </slot>\n </div>\n\n {/* Quote text — slot takes priority; falls back to prop. */}\n <div class=\"testimonial-text\">\n <slot name=\"quote-body\">{this.quote}</slot>\n </div>\n {/* Attribution */}\n <div class=\"testimonial-attribution\">{this.attribution}</div>\n </div>\n\n {/* Statistics slot */}\n <div class=\"testimonial-stats\">\n <slot name=\"stats\"></slot>\n </div>\n\n {/* Footer with navigation and CTA */}\n <div class=\"testimonial-footer\">\n <div class=\"testimonial-nav\">\n {this.showNavigation ? (\n // Render built-in navigation buttons\n <div class=\"testimonial-nav-buttons\">\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasPrev}\n onClick={this.handlePrev}\n ariaLabel=\"Previous testimonial\"\n >\n <af-icon name=\"arrow-left\" size={24} />\n </af-icon-button>\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasNext}\n onClick={this.handleNext}\n ariaLabel=\"Next testimonial\"\n >\n <af-icon name=\"arrow-right\" size={24} />\n </af-icon-button>\n </div>\n ) : (\n // Allow custom navigation via slot\n <slot name=\"navigation\"></slot>\n )}\n </div>\n {this.readMoreLink && (\n <af-button variant=\"secondary\" href={this.readMoreLink}>\n Read full story\n <af-icon slot=\"icon-right\" name=\"arrow-right\" size={24} />\n </af-button>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n\n"],"names":["h","Host"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"af-testimonial.entry.cjs.js","sources":["src/components/af-testimonial/af-testimonial.css?tag=af-testimonial&encapsulation=scoped","src/components/af-testimonial/af-testimonial.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.testimonial-card {\n /* Uses themed level-1 background from parent Section */\n background: var(--af-background-level-1, var(--colour-mistgreen-200, #e8eeed));\n border-radius: var(--border-radius-card-level-1, 32px);\n overflow: hidden;\n display: flex;\n height: 544px;\n box-sizing: border-box;\n}\n\n/* Image side - 40.5% of card width (519px of 1280px in Figma) */\n.testimonial-image {\n position: relative;\n width: 50%;\n min-width: 300px;\n /* Minimum for readability */\n max-width: 519px;\n /* Cap at Figma design width */\n height: 100%;\n /* Dark background for image overlay effect - always dark regardless of theme */\n background: var(--colour-brand-inkwell, #14343b);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n}\n\n.testimonial-bg-image {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.7;\n}\n\n.testimonial-logo {\n position: relative;\n z-index: 1;\n padding: 0 108px;\n max-width: 100%;\n}\n\n.testimonial-logo img {\n width: 100%;\n height: auto;\n display: block;\n}\n\n/* Content side */\n.testimonial-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 32px;\n padding: 48px;\n /* Subtle border using themed border token */\n border: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n border-left: 1px solid var(--af-background-border-subtle, var(--colour-mistgreen-200, #e8eeed));\n box-sizing: border-box;\n}\n\n.testimonial-quote-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n /* Allow flex item to shrink */\n overflow: hidden;\n}\n\n.testimonial-quote-icon {\n width: 48px;\n height: 48px;\n /* Quote icon uses themed secondary heading color (gold/ochre accent) */\n color: var(--af-typography-heading-secondary, var(--colour-brand-soft-clay, #b09670));\n flex-shrink: 0;\n}\n\n/* Quote text — 22px / 140% per Webflow reference. Accepts either the\n `quote` prop (rendered as plain text) or the `quote-body` slot (rich). */\n.testimonial-text {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 22px;\n line-height: 1.4;\n font-weight: var(--font-weight-regular, 400);\n color: var(--af-typography-body-default, var(--colour-brand-inkwell, #14343b));\n}\n.testimonial-text ::slotted(p),\n.testimonial-text p {\n font: inherit;\n color: inherit;\n margin: 0 0 12px 0;\n}\n.testimonial-text ::slotted(p:last-child),\n.testimonial-text p:last-child {\n margin-bottom: 0;\n}\n.testimonial-text ::slotted(ul),\n.testimonial-text ul {\n margin: 0 0 12px 0;\n padding-left: 20px;\n}\n\n/* Attribution uses body-dark color for emphasis */\n.testimonial-attribution {\n font-family: var(--typography-bodyfont, 'NeuSans', sans-serif);\n font-size: 16px;\n line-height: 24px;\n color: var(--af-typography-body-dark, var(--colour-brand-inkwell, #14343b));\n margin-top: 12px;\n}\n\n.testimonial-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 32px;\n width: 100%;\n flex-shrink: 0;\n}\n\n/* ≥ mobile and ≤ tablet — 2-column intermediate layout so the stats row\n * doesn't snap straight from 4-across to 1-across on common iPad / narrow\n * laptop widths. */\n@media (min-width: 768px) and (max-width: 1023px) {\n .testimonial-stats {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n/* ≤ mobile — single column stack */\n@media (max-width: 767px) {\n .testimonial-stats {\n grid-template-columns: 1fr;\n }\n}\n\n.testimonial-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n /* Themed border color */\n border-top: 1px solid var(--af-background-border-default, var(--colour-mistgreen-400, #d1ddda));\n padding-top: 32px;\n flex-shrink: 0;\n min-height: 48px;\n}\n\n.testimonial-nav {\n display: flex;\n gap: 12px;\n}\n\n.testimonial-nav-buttons {\n display: flex;\n gap: 12px;\n}\n\n/* CTA button is now handled by af-button atom component */","import { Component, Prop, h, Host, Event, EventEmitter } from '@stencil/core';\n\n/**\n * @slot quote-body - Rich quote content (paragraphs, lists). Overrides the\n * `quote` string prop when provided. Use for testimonials that include\n * multiple paragraphs, bulleted points, or inline emphasis.\n * @slot quote-icon - Quote icon (defaults to af-icon name=\"quote\").\n * @slot stats - Statistic items (af-testimonial-stat components).\n * @slot navigation - Custom nav controls (when not using built-in ones).\n */\n@Component({\n tag: 'af-testimonial',\n styleUrl: 'af-testimonial.css',\n shadow: false,\n scoped: true,\n})\nexport class AfTestimonial {\n /**\n * Background image URL for the testimonial card\n */\n @Prop() backgroundImage?: string;\n\n /**\n * Company logo URL\n */\n @Prop() logoImage?: string;\n\n /**\n * Testimonial quote text. Falls back to the `quote-body` slot if that\n * slot has content.\n */\n @Prop() quote?: string;\n\n /**\n * Attribution text (e.g., \"– Nathaniel Barrs, CTO, PSC Insurance\")\n */\n @Prop() attribution!: string;\n\n /**\n * Link to full case study\n */\n @Prop() readMoreLink?: string;\n\n /**\n * Whether to show built-in navigation buttons (used when in a carousel)\n */\n @Prop({ mutable: true }) showNavigation: boolean = false;\n\n /**\n * Whether the previous button is enabled\n */\n @Prop({ mutable: true }) hasPrev: boolean = false;\n\n /**\n * Whether the next button is enabled\n */\n @Prop({ mutable: true }) hasNext: boolean = false;\n\n /**\n * Emitted when the previous button is clicked\n */\n @Event() afNavPrev!: EventEmitter<void>;\n\n /**\n * Emitted when the next button is clicked\n */\n @Event() afNavNext!: EventEmitter<void>;\n\n private handlePrev = () => {\n this.afNavPrev.emit();\n };\n\n private handleNext = () => {\n this.afNavNext.emit();\n };\n\n render() {\n return (\n <Host>\n <div class=\"testimonial-card\">\n {/* Image side */}\n <div class=\"testimonial-image\">\n {this.backgroundImage && (\n <img src={this.backgroundImage} alt=\"\" class=\"testimonial-bg-image\" />\n )}\n {this.logoImage && (\n <div class=\"testimonial-logo\">\n <img src={this.logoImage} alt=\"Company logo\" />\n </div>\n )}\n </div>\n\n {/* Content side */}\n <div class=\"testimonial-content\">\n <div class=\"testimonial-quote-section\">\n {/* Quote icon - using af-icon atom with slot for flexibility */}\n <div class=\"testimonial-quote-icon\">\n <slot name=\"quote-icon\">\n <af-icon name=\"quote\" size={48} />\n </slot>\n </div>\n\n {/* Quote text — slot takes priority; falls back to prop. */}\n <div class=\"testimonial-text\">\n <slot name=\"quote-body\">{this.quote}</slot>\n </div>\n {/* Attribution */}\n <div class=\"testimonial-attribution\">{this.attribution}</div>\n </div>\n\n {/* Statistics slot */}\n <div class=\"testimonial-stats\">\n <slot name=\"stats\"></slot>\n </div>\n\n {/* Footer with navigation and CTA */}\n <div class=\"testimonial-footer\">\n <div class=\"testimonial-nav\">\n {this.showNavigation ? (\n // Render built-in navigation buttons\n <div class=\"testimonial-nav-buttons\">\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasPrev}\n onClick={this.handlePrev}\n ariaLabel=\"Previous testimonial\"\n >\n <af-icon name=\"arrow-left\" size={24} />\n </af-icon-button>\n <af-icon-button\n variant=\"secondary\"\n disabled={!this.hasNext}\n onClick={this.handleNext}\n ariaLabel=\"Next testimonial\"\n >\n <af-icon name=\"arrow-right\" size={24} />\n </af-icon-button>\n </div>\n ) : (\n // Allow custom navigation via slot\n <slot name=\"navigation\"></slot>\n )}\n </div>\n {this.readMoreLink && (\n <af-button variant=\"secondary\" href={this.readMoreLink}>\n Read full story\n <af-icon slot=\"icon-right\" name=\"arrow-right\" size={24} />\n </af-button>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n\n"],"names":["h","Host"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ const afVideoContainerCss = ".sc-af-video-container-h{display:block;width:100%}.
|
|
|
7
7
|
const AfVideoContainer = class {
|
|
8
8
|
constructor(hostRef) {
|
|
9
9
|
index.registerInstance(this, hostRef);
|
|
10
|
-
this.
|
|
10
|
+
this.afPlayClick = index.createEvent(this, "afPlayClick");
|
|
11
11
|
/** Video thumbnail image URL */
|
|
12
12
|
this.videoThumbnailUrl = '';
|
|
13
13
|
/** Video alt text for accessibility */
|
|
@@ -18,7 +18,7 @@ const AfVideoContainer = class {
|
|
|
18
18
|
* Handles play button click - emits event and optionally opens URL
|
|
19
19
|
*/
|
|
20
20
|
this.handlePlayClick = () => {
|
|
21
|
-
const event = this.
|
|
21
|
+
const event = this.afPlayClick.emit({ videoUrl: this.videoUrl });
|
|
22
22
|
// Only open URL if event wasn't prevented and URL exists
|
|
23
23
|
if (!event.defaultPrevented && this.videoUrl) {
|
|
24
24
|
window.open(this.videoUrl, '_blank');
|
|
@@ -26,7 +26,7 @@ const AfVideoContainer = class {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
render() {
|
|
29
|
-
return (index.h(index.Host, { key: '
|
|
29
|
+
return (index.h(index.Host, { key: '6554d80d7b00b2e7c2ebed35d10fe48b2e55af21' }, index.h("div", { key: '7acffa76ffb032446270850359deb315af18dd43', class: "video-container" }, index.h("div", { key: 'd79361dc04ce97b953754a63b76805be4391b593', class: "video-container__top" }, index.h("slot", { key: 'c5b1f43ecfb23cc39cc83dba5711a70eb909edef', name: "top" })), index.h("div", { key: 'd2159295b5950d500f06389ce2d394c7e7c902db', class: "video-container__video" }, index.h("af-aspect-ratio", { key: 'fb17e071a5003a62f6fd8037a5d73d5f195eee14', ratio: "16:9" }, index.h("div", { key: 'c1aaedd7603b9a024f8bbe1ac280597e662b5c07', class: "video-container__thumbnail-wrapper" }, this.videoThumbnailUrl && (index.h("img", { key: 'a55c605d6e07c569cdcbd3ecd1239e3d6ba63bc3', src: this.videoThumbnailUrl, alt: this.videoAlt, class: "video-container__thumbnail", loading: "lazy" })), index.h("button", { key: 'd04a4b4b5313327e5d81e75219ae9bc0d3866c33', class: "video-container__play-button", onClick: this.handlePlayClick, "aria-label": "Play video", type: "button" }, index.h("af-icon", { key: '52bc748aacd58d1acc1f22e2acfb07eb71447cdc', name: "play", size: 24 }))))), index.h("div", { key: '8f423ee569de7c7749f675d7815a50b4d491252e', class: "video-container__bottom" }, index.h("slot", { key: 'd645d52209cb8537a7286b161c257ebd011cc061', name: "bottom" })))));
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
AfVideoContainer.style = afVideoContainerCss;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"af-video-container.entry.cjs.js","sources":["src/components/af-video-container/af-video-container.css?tag=af-video-container&encapsulation=scoped","src/components/af-video-container/af-video-container.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.video-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n gap: var(--space-10, 40px);\n}\n\n/* ==========================================================================\n Top/Bottom Slots\n These inherit theme colors from their position in the split-section\n ========================================================================== */\n\n.video-container__top,\n.video-container__bottom {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Hide empty slots */\n.video-container__top:empty,\n.video-container__bottom:empty {\n display: none;\n}\n\n/* ==========================================================================\n Video Thumbnail Section\n ========================================================================== */\n\n.video-container__video {\n width: 100%;\n max-width: 1024px;\n}\n\n.video-container__thumbnail-wrapper {\n position: absolute;\n inset: 0;\n border-radius: var(--radii-video-crop, 16px);\n overflow: hidden;\n background-color: var(--colour-inkwell-400, #2b484f);\n}\n\n.video-container__thumbnail {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n position: absolute;\n inset: 0;\n}\n\n/* ==========================================================================\n Play Button Overlay\n ========================================================================== */\n\n.video-container__play-button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n border-radius: var(--radii-button, 9999px);\n background-color: var(--af-button-primary-bg, var(--colour-brand-ice, #a6fffb));\n border: 1px solid var(--af-button-primary-stroke, var(--colour-brand-inkwell, #14343b));\n cursor: pointer;\n transition: background-color 0.2s ease;\n color: var(--af-button-primary-icon, var(--colour-brand-inkwell, #14343b));\n}\n\n.video-container__play-button:hover {\n background-color: var(--af-button-primary-bg-hover, var(--colour-ice-600, #95e6e2));\n}\n\n.video-container__play-button:focus-visible {\n outline: 2px solid var(--colour-brand-ice, #a6fffb);\n outline-offset: 2px;\n}\n\n/* ==========================================================================\n Mobile Responsive Styles\n ========================================================================== */\n\n/* mobile-only */\n@media (max-width: 768px) {\n .video-container {\n gap: var(--space-8, 32px);\n }\n\n /* Smaller play button on mobile */\n .video-container__play-button {\n padding: 12px;\n }\n}\n","import { Component, h, Host, Prop, Event, EventEmitter } from '@stencil/core';\n\n/**\n * Video Container molecule component for showcasing video content.\n * \n * Uses slots for typography lockups above and below the video.\n * When used inside af-split-section, the top slot inherits the top theme\n * and the bottom slot inherits the bottom theme for correct colors.\n * \n * @example\n * ```html\n * <af-split-section top-theme=\"mist-green\" bottom-theme=\"white\">\n * <af-video-container video-thumbnail-url=\"/path/to/thumbnail.jpg\">\n * <af-typography-lockup slot=\"top\" text-alignment=\"center\" heading-size=\"2\">\n * <af-heading level=\"2\">Watch our product demo</af-heading>\n * <af-text slot=\"description\">See how Affinda transforms your workflow</af-text>\n * <af-button slot=\"buttons\" variant=\"primary\">Get Started</af-button>\n * </af-typography-lockup>\n * </af-video-container>\n * </af-split-section>\n * ```\n * \n * @slot top - Content above the video (typically af-typography-lockup). Inherits top theme.\n * @slot bottom - Content below the video (typically af-typography-lockup). Inherits bottom theme.\n */\n@Component({\n tag: 'af-video-container',\n styleUrl: 'af-video-container.css',\n shadow: false,\n scoped: true,\n})\nexport class AfVideoContainer {\n /** Video thumbnail image URL */\n @Prop() videoThumbnailUrl: string = '';\n\n /** Video alt text for accessibility */\n @Prop() videoAlt: string = 'Video thumbnail';\n\n /** Optional video URL for play button link */\n @Prop() videoUrl: string = '';\n\n /** \n * Emitted when the play button is clicked.\n * Use this to handle video playback (e.g., open modal, embed player).\n * If videoUrl is set and no handler prevents default, opens URL in new tab.\n */\n @Event()
|
|
1
|
+
{"version":3,"file":"af-video-container.entry.cjs.js","sources":["src/components/af-video-container/af-video-container.css?tag=af-video-container&encapsulation=scoped","src/components/af-video-container/af-video-container.tsx"],"sourcesContent":[":host {\n display: block;\n width: 100%;\n}\n\n.video-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n gap: var(--space-10, 40px);\n}\n\n/* ==========================================================================\n Top/Bottom Slots\n These inherit theme colors from their position in the split-section\n ========================================================================== */\n\n.video-container__top,\n.video-container__bottom {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Hide empty slots */\n.video-container__top:empty,\n.video-container__bottom:empty {\n display: none;\n}\n\n/* ==========================================================================\n Video Thumbnail Section\n ========================================================================== */\n\n.video-container__video {\n width: 100%;\n max-width: 1024px;\n}\n\n.video-container__thumbnail-wrapper {\n position: absolute;\n inset: 0;\n border-radius: var(--radii-video-crop, 16px);\n overflow: hidden;\n background-color: var(--colour-inkwell-400, #2b484f);\n}\n\n.video-container__thumbnail {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n position: absolute;\n inset: 0;\n}\n\n/* ==========================================================================\n Play Button Overlay\n ========================================================================== */\n\n.video-container__play-button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n border-radius: var(--radii-button, 9999px);\n background-color: var(--af-button-primary-bg, var(--colour-brand-ice, #a6fffb));\n border: 1px solid var(--af-button-primary-stroke, var(--colour-brand-inkwell, #14343b));\n cursor: pointer;\n transition: background-color 0.2s ease;\n color: var(--af-button-primary-icon, var(--colour-brand-inkwell, #14343b));\n}\n\n.video-container__play-button:hover {\n background-color: var(--af-button-primary-bg-hover, var(--colour-ice-600, #95e6e2));\n}\n\n.video-container__play-button:focus-visible {\n outline: 2px solid var(--colour-brand-ice, #a6fffb);\n outline-offset: 2px;\n}\n\n/* ==========================================================================\n Mobile Responsive Styles\n ========================================================================== */\n\n/* mobile-only */\n@media (max-width: 768px) {\n .video-container {\n gap: var(--space-8, 32px);\n }\n\n /* Smaller play button on mobile */\n .video-container__play-button {\n padding: 12px;\n }\n}\n","import { Component, h, Host, Prop, Event, EventEmitter } from '@stencil/core';\n\n/**\n * Video Container molecule component for showcasing video content.\n * \n * Uses slots for typography lockups above and below the video.\n * When used inside af-split-section, the top slot inherits the top theme\n * and the bottom slot inherits the bottom theme for correct colors.\n * \n * @example\n * ```html\n * <af-split-section top-theme=\"mist-green\" bottom-theme=\"white\">\n * <af-video-container video-thumbnail-url=\"/path/to/thumbnail.jpg\">\n * <af-typography-lockup slot=\"top\" text-alignment=\"center\" heading-size=\"2\">\n * <af-heading level=\"2\">Watch our product demo</af-heading>\n * <af-text slot=\"description\">See how Affinda transforms your workflow</af-text>\n * <af-button slot=\"buttons\" variant=\"primary\">Get Started</af-button>\n * </af-typography-lockup>\n * </af-video-container>\n * </af-split-section>\n * ```\n * \n * @slot top - Content above the video (typically af-typography-lockup). Inherits top theme.\n * @slot bottom - Content below the video (typically af-typography-lockup). Inherits bottom theme.\n */\n@Component({\n tag: 'af-video-container',\n styleUrl: 'af-video-container.css',\n shadow: false,\n scoped: true,\n})\nexport class AfVideoContainer {\n /** Video thumbnail image URL */\n @Prop() videoThumbnailUrl: string = '';\n\n /** Video alt text for accessibility */\n @Prop() videoAlt: string = 'Video thumbnail';\n\n /** Optional video URL for play button link */\n @Prop() videoUrl: string = '';\n\n /** \n * Emitted when the play button is clicked.\n * Use this to handle video playback (e.g., open modal, embed player).\n * If videoUrl is set and no handler prevents default, opens URL in new tab.\n */\n @Event() afPlayClick!: EventEmitter<{ videoUrl: string }>;\n\n /**\n * Handles play button click - emits event and optionally opens URL\n */\n private handlePlayClick = () => {\n const event = this.afPlayClick.emit({ videoUrl: this.videoUrl });\n \n // Only open URL if event wasn't prevented and URL exists\n if (!event.defaultPrevented && this.videoUrl) {\n window.open(this.videoUrl, '_blank');\n }\n };\n\n render() {\n return (\n <Host>\n <div class=\"video-container\">\n {/* Top slot - for typography lockup above video (inherits top theme) */}\n <div class=\"video-container__top\">\n <slot name=\"top\"></slot>\n </div>\n\n {/* Video thumbnail section */}\n <div class=\"video-container__video\">\n <af-aspect-ratio ratio=\"16:9\">\n <div class=\"video-container__thumbnail-wrapper\">\n {this.videoThumbnailUrl && (\n <img \n src={this.videoThumbnailUrl} \n alt={this.videoAlt}\n class=\"video-container__thumbnail\"\n loading=\"lazy\"\n />\n )}\n {/* Play button overlay */}\n <button \n class=\"video-container__play-button\"\n onClick={this.handlePlayClick}\n aria-label=\"Play video\"\n type=\"button\"\n >\n <af-icon name=\"play\" size={24}></af-icon>\n </button>\n </div>\n </af-aspect-ratio>\n </div>\n\n {/* Bottom slot - for typography lockup below video (inherits bottom theme) */}\n <div class=\"video-container__bottom\">\n <slot name=\"bottom\"></slot>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n"],"names":["h","Host"],"mappings":";;;;AAAA,MAAM,mBAAmB,GAAG,ixDAAixD;;MC+BhyD,gBAAgB,GAAA,MAAA;AAN7B,IAAA,WAAA,CAAA,OAAA,EAAA;;;;AAQU,QAAA,IAAiB,CAAA,iBAAA,GAAW,EAAE;;AAG9B,QAAA,IAAQ,CAAA,QAAA,GAAW,iBAAiB;;AAGpC,QAAA,IAAQ,CAAA,QAAA,GAAW,EAAE;AAS7B;;AAEG;AACK,QAAA,IAAe,CAAA,eAAA,GAAG,MAAK;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;YAGhE,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;;AAExC,SAAC;AA4CF;IA1CC,MAAM,GAAA;QACJ,QACEA,QAACC,UAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACHD,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,iBAAiB,EAAA,EAE1BA,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,sBAAsB,EAAA,EAC/BA,OAAA,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAM,IAAI,EAAC,KAAK,EAAA,CAAQ,CACpB,EAGNA,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,wBAAwB,EAAA,EACjCA,OAAiB,CAAA,iBAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,MAAM,EAAA,EAC3BA,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,oCAAoC,EAAA,EAC5C,IAAI,CAAC,iBAAiB,KACrBA,OAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAC3B,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,MAAM,EAAA,CACd,CACH,EAEDA,OAAA,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EACE,KAAK,EAAC,8BAA8B,EACpC,OAAO,EAAE,IAAI,CAAC,eAAe,EAClB,YAAA,EAAA,YAAY,EACvB,IAAI,EAAC,QAAQ,EAAA,EAEbA,OAAS,CAAA,SAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,MAAM,EAAC,IAAI,EAAE,EAAE,EAAY,CAAA,CAClC,CACL,CACU,CACd,EAGNA,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAC,yBAAyB,EAAA,EAClCA,OAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,QAAQ,EAAA,CAAQ,CACvB,CACF,CACD;;;;;;;"}
|