@affinda/wc 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/affinda/af-heading.af-logo.af-nav-item.af-navbar.af-text.entry.esm.js.map +1 -1
  2. package/dist/affinda/af-testimonial-carousel.entry.esm.js.map +1 -0
  3. package/dist/affinda/af-testimonial-stat.entry.esm.js.map +1 -0
  4. package/dist/affinda/af-testimonial.entry.esm.js.map +1 -0
  5. package/dist/affinda/af-typography-lockup.entry.esm.js.map +1 -1
  6. package/dist/affinda/affinda.esm.js +1 -1
  7. package/dist/affinda/index.esm.js +1 -1
  8. package/dist/affinda/{p-bf697823.entry.js → p-16c84e60.entry.js} +2 -2
  9. package/dist/affinda/{p-d33de48f.entry.js → p-32f46944.entry.js} +2 -2
  10. package/dist/affinda/{p-b79f976e.entry.js → p-43324b6d.entry.js} +2 -2
  11. package/dist/affinda/p-56284540.entry.js +2 -0
  12. package/dist/affinda/p-56284540.entry.js.map +1 -0
  13. package/dist/affinda/p-66daadde.entry.js +2 -0
  14. package/dist/affinda/p-66daadde.entry.js.map +1 -0
  15. package/dist/affinda/{p-f8d89fb6.entry.js → p-750a694b.entry.js} +2 -2
  16. package/dist/affinda/{p-cb218d26.entry.js → p-9c0b3380.entry.js} +2 -2
  17. package/dist/affinda/{p-a8d223ca.entry.js → p-9e5bef28.entry.js} +2 -2
  18. package/dist/affinda/p-UbNmjSSX.js +3 -0
  19. package/dist/affinda/p-UbNmjSSX.js.map +1 -0
  20. package/dist/affinda/{p-47629246.entry.js → p-c8628633.entry.js} +2 -2
  21. package/dist/affinda/{p-9c22948a.entry.js → p-eff7eff1.entry.js} +2 -2
  22. package/dist/affinda/p-f53b4847.entry.js +2 -0
  23. package/dist/affinda/p-f53b4847.entry.js.map +1 -0
  24. package/dist/affinda/p-fedaec5a.entry.js +2 -0
  25. package/dist/affinda/{p-92f5a5d5.entry.js.map → p-fedaec5a.entry.js.map} +1 -1
  26. package/dist/cjs/af-aspect-ratio.cjs.entry.js +1 -1
  27. package/dist/cjs/af-button-group.cjs.entry.js +1 -1
  28. package/dist/cjs/af-button.cjs.entry.js +1 -1
  29. package/dist/cjs/af-card.cjs.entry.js +1 -1
  30. package/dist/cjs/af-color-swatch.cjs.entry.js +1 -1
  31. package/dist/cjs/af-container.cjs.entry.js +1 -1
  32. package/dist/cjs/af-heading.af-logo.af-nav-item.af-navbar.af-text.entry.cjs.js.map +1 -1
  33. package/dist/cjs/af-heading_5.cjs.entry.js +3 -3
  34. package/dist/cjs/af-icon-button.cjs.entry.js +1 -1
  35. package/dist/cjs/af-testimonial-carousel.cjs.entry.js +90 -0
  36. package/dist/cjs/af-testimonial-carousel.entry.cjs.js.map +1 -0
  37. package/dist/cjs/af-testimonial-stat.cjs.entry.js +22 -0
  38. package/dist/cjs/af-testimonial-stat.entry.cjs.js.map +1 -0
  39. package/dist/cjs/af-testimonial.cjs.entry.js +18 -0
  40. package/dist/cjs/af-testimonial.entry.cjs.js.map +1 -0
  41. package/dist/cjs/af-typography-lockup.cjs.entry.js +2 -2
  42. package/dist/cjs/af-typography-lockup.entry.cjs.js.map +1 -1
  43. package/dist/cjs/affinda.cjs.js +2 -2
  44. package/dist/cjs/{index-1GcSSOS3.js → index-CNijn8X5.js} +57 -7
  45. package/dist/cjs/index-CNijn8X5.js.map +1 -0
  46. package/dist/cjs/index.cjs.js +1 -1
  47. package/dist/cjs/loader.cjs.js +2 -2
  48. package/dist/collection/collection-manifest.json +4 -1
  49. package/dist/collection/components/af-heading/af-heading.css +1 -1
  50. package/dist/collection/components/af-testimonial/af-testimonial.css +143 -0
  51. package/dist/collection/components/af-testimonial/af-testimonial.js +118 -0
  52. package/dist/collection/components/af-testimonial/af-testimonial.js.map +1 -0
  53. package/dist/collection/components/af-testimonial-carousel/af-testimonial-carousel.css +96 -0
  54. package/dist/collection/components/af-testimonial-carousel/af-testimonial-carousel.js +100 -0
  55. package/dist/collection/components/af-testimonial-carousel/af-testimonial-carousel.js.map +1 -0
  56. package/dist/collection/components/af-testimonial-stat/af-testimonial-stat.css +41 -0
  57. package/dist/collection/components/af-testimonial-stat/af-testimonial-stat.js +87 -0
  58. package/dist/collection/components/af-testimonial-stat/af-testimonial-stat.js.map +1 -0
  59. package/dist/collection/components/af-text/af-text.css +1 -1
  60. package/dist/collection/components/af-typography-lockup/af-typography-lockup.css +1 -1
  61. package/dist/components/af-aspect-ratio.js +1 -1
  62. package/dist/components/af-button-group.js +1 -1
  63. package/dist/components/af-button.js +1 -1
  64. package/dist/components/af-card.js +1 -1
  65. package/dist/components/af-color-swatch.js +1 -1
  66. package/dist/components/af-container.js +1 -1
  67. package/dist/components/af-heading.js +1 -1
  68. package/dist/components/af-icon-button.js +1 -1
  69. package/dist/components/af-logo.js +1 -1
  70. package/dist/components/af-nav-item.js +1 -1
  71. package/dist/components/af-navbar.js +1 -1
  72. package/dist/components/af-testimonial-carousel.d.ts +11 -0
  73. package/dist/components/af-testimonial-carousel.js +113 -0
  74. package/dist/components/af-testimonial-carousel.js.map +1 -0
  75. package/dist/components/af-testimonial-stat.d.ts +11 -0
  76. package/dist/components/af-testimonial-stat.js +45 -0
  77. package/dist/components/af-testimonial-stat.js.map +1 -0
  78. package/dist/components/af-testimonial.d.ts +11 -0
  79. package/dist/components/af-testimonial.js +43 -0
  80. package/dist/components/af-testimonial.js.map +1 -0
  81. package/dist/components/af-text.js +1 -1
  82. package/dist/components/af-typography-lockup.js +1 -1
  83. package/dist/components/index.js +13 -13
  84. package/dist/components/{p-Cjv046iG.js → p-Bdy85P7Z.js} +3 -3
  85. package/dist/components/{p-Cjv046iG.js.map → p-Bdy85P7Z.js.map} +1 -1
  86. package/dist/components/{p-DIyOg-i_.js → p-BuySFAGS.js} +4 -4
  87. package/dist/components/{p-DIyOg-i_.js.map → p-BuySFAGS.js.map} +1 -1
  88. package/dist/components/{p-C6idwlD-.js → p-Bxv9iL3G.js} +3 -3
  89. package/dist/components/{p-C6idwlD-.js.map → p-Bxv9iL3G.js.map} +1 -1
  90. package/dist/components/{p-BpGDzCRf.js → p-C0zUdiRs.js} +4 -4
  91. package/dist/components/p-C0zUdiRs.js.map +1 -0
  92. package/dist/components/{p-CaqzUz5o.js → p-C4sw-kYH.js} +3 -3
  93. package/dist/components/{p-CaqzUz5o.js.map → p-C4sw-kYH.js.map} +1 -1
  94. package/dist/components/{p-BHNNF4PT.js → p-CJccTfm5.js} +3 -3
  95. package/dist/components/{p-BHNNF4PT.js.map → p-CJccTfm5.js.map} +1 -1
  96. package/dist/components/{p-DuXQZGjc.js → p-CLA_jBiH.js} +4 -4
  97. package/dist/components/{p-DuXQZGjc.js.map → p-CLA_jBiH.js.map} +1 -1
  98. package/dist/components/{p-CJWIieDU.js → p-Cfj594pp.js} +3 -3
  99. package/dist/components/{p-CJWIieDU.js.map → p-Cfj594pp.js.map} +1 -1
  100. package/dist/components/{p-zwrcq-N2.js → p-ChRDoPDm.js} +52 -7
  101. package/dist/components/p-ChRDoPDm.js.map +1 -0
  102. package/dist/components/{p-cKSy1B8M.js → p-D021PjqL.js} +3 -3
  103. package/dist/components/{p-cKSy1B8M.js.map → p-D021PjqL.js.map} +1 -1
  104. package/dist/components/{p-CRgPNvxI.js → p-DPooX_NW.js} +3 -3
  105. package/dist/components/{p-CRgPNvxI.js.map → p-DPooX_NW.js.map} +1 -1
  106. package/dist/components/{p-DSAo7rhE.js → p-KtmLxy7z.js} +3 -3
  107. package/dist/components/{p-DSAo7rhE.js.map → p-KtmLxy7z.js.map} +1 -1
  108. package/dist/components/{p-Dw33Xm_t.js → p-XAy0kGYd.js} +3 -3
  109. package/dist/components/{p-Dw33Xm_t.js.map → p-XAy0kGYd.js.map} +1 -1
  110. package/dist/esm/af-aspect-ratio.entry.js +1 -1
  111. package/dist/esm/af-button-group.entry.js +1 -1
  112. package/dist/esm/af-button.entry.js +1 -1
  113. package/dist/esm/af-card.entry.js +1 -1
  114. package/dist/esm/af-color-swatch.entry.js +1 -1
  115. package/dist/esm/af-container.entry.js +1 -1
  116. package/dist/esm/af-heading.af-logo.af-nav-item.af-navbar.af-text.entry.js.map +1 -1
  117. package/dist/esm/af-heading_5.entry.js +3 -3
  118. package/dist/esm/af-icon-button.entry.js +1 -1
  119. package/dist/esm/af-testimonial-carousel.entry.js +88 -0
  120. package/dist/esm/af-testimonial-carousel.entry.js.map +1 -0
  121. package/dist/esm/af-testimonial-stat.entry.js +20 -0
  122. package/dist/esm/af-testimonial-stat.entry.js.map +1 -0
  123. package/dist/esm/af-testimonial.entry.js +16 -0
  124. package/dist/esm/af-testimonial.entry.js.map +1 -0
  125. package/dist/esm/af-typography-lockup.entry.js +2 -2
  126. package/dist/esm/af-typography-lockup.entry.js.map +1 -1
  127. package/dist/esm/affinda.js +3 -3
  128. package/dist/esm/{index-Dmaq2rkg.js → index-UbNmjSSX.js} +57 -8
  129. package/dist/{affinda/p-Dmaq2rkg.js.map → esm/index-UbNmjSSX.js.map} +1 -1
  130. package/dist/esm/index.js +1 -1
  131. package/dist/esm/loader.js +3 -3
  132. package/dist/types/components/af-testimonial/af-testimonial.d.ts +23 -0
  133. package/dist/types/components/af-testimonial-carousel/af-testimonial-carousel.d.ts +15 -0
  134. package/dist/types/components/af-testimonial-stat/af-testimonial-stat.d.ts +15 -0
  135. package/dist/types/components.d.ts +105 -0
  136. package/package.json +2 -2
  137. package/dist/affinda/p-92f5a5d5.entry.js +0 -2
  138. package/dist/affinda/p-Dmaq2rkg.js +0 -3
  139. package/dist/cjs/index-1GcSSOS3.js.map +0 -1
  140. package/dist/components/p-BpGDzCRf.js.map +0 -1
  141. package/dist/components/p-zwrcq-N2.js.map +0 -1
  142. package/dist/esm/index-Dmaq2rkg.js.map +0 -1
  143. /package/dist/affinda/{p-bf697823.entry.js.map → p-16c84e60.entry.js.map} +0 -0
  144. /package/dist/affinda/{p-d33de48f.entry.js.map → p-32f46944.entry.js.map} +0 -0
  145. /package/dist/affinda/{p-b79f976e.entry.js.map → p-43324b6d.entry.js.map} +0 -0
  146. /package/dist/affinda/{p-f8d89fb6.entry.js.map → p-750a694b.entry.js.map} +0 -0
  147. /package/dist/affinda/{p-cb218d26.entry.js.map → p-9c0b3380.entry.js.map} +0 -0
  148. /package/dist/affinda/{p-a8d223ca.entry.js.map → p-9e5bef28.entry.js.map} +0 -0
  149. /package/dist/affinda/{p-47629246.entry.js.map → p-c8628633.entry.js.map} +0 -0
  150. /package/dist/affinda/{p-9c22948a.entry.js.map → p-eff7eff1.entry.js.map} +0 -0
@@ -8,7 +8,7 @@ var afButton_entry = require('./af-button.cjs.entry.js');
8
8
  var afIconButton_entry = require('./af-icon-button.cjs.entry.js');
9
9
  var afButtonGroup_entry = require('./af-button-group.cjs.entry.js');
10
10
  var afTypographyLockup_entry = require('./af-typography-lockup.cjs.entry.js');
11
- require('./index-1GcSSOS3.js');
11
+ require('./index-CNijn8X5.js');
12
12
 
13
13
 
14
14
 
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-1GcSSOS3.js');
3
+ var index = require('./index-CNijn8X5.js');
4
4
 
5
5
  const defineCustomElements = async (win, options) => {
6
6
  if (typeof window === 'undefined') return undefined;
7
7
  await index.globalScripts();
8
- return index.bootstrapLazy([["af-heading_5.cjs",[[257,"af-heading",{"level":[1],"align":[1]}],[257,"af-logo"],[257,"af-nav-item",{"hierarchy":[1],"variant":[1],"href":[1],"active":[4]}],[257,"af-navbar"],[257,"af-text",{"variant":[1],"align":[1],"as":[1]}]]],["af-aspect-ratio.cjs",[[257,"af-aspect-ratio",{"ratio":[1]}]]],["af-button.cjs",[[257,"af-button",{"variant":[1],"size":[1],"disabled":[4],"href":[1],"type":[1]}]]],["af-button-group.cjs",[[257,"af-button-group",{"direction":[1],"gap":[1]}]]],["af-card.cjs",[[262,"af-card",{"backgroundImage":[1,"background-image"],"backgroundColor":[1,"background-color"],"darkOverlay":[4,"dark-overlay"]}]]],["af-color-swatch.cjs",[[257,"af-color-swatch",{"color":[1],"name":[1],"size":[1]}]]],["af-container.cjs",[[257,"af-container",{"maxWidth":[1,"max-width"]}]]],["af-icon-button.cjs",[[257,"af-icon-button",{"variant":[1],"size":[1],"disabled":[4],"href":[1],"type":[1],"ariaLabel":[1,"aria-label"]}]]],["af-typography-lockup.cjs",[[257,"af-typography-lockup",{"headingSize":[2,"heading-size"],"breakpoint":[1],"textAlignment":[1,"text-alignment"],"buttonAlignment":[1,"button-alignment"],"maxWidth":[2,"max-width"]}]]]], options);
8
+ return index.bootstrapLazy([["af-heading_5.cjs",[[257,"af-heading",{"level":[1],"align":[1]}],[257,"af-logo"],[257,"af-nav-item",{"hierarchy":[1],"variant":[1],"href":[1],"active":[4]}],[257,"af-navbar"],[257,"af-text",{"variant":[1],"align":[1],"as":[1]}]]],["af-aspect-ratio.cjs",[[257,"af-aspect-ratio",{"ratio":[1]}]]],["af-button.cjs",[[257,"af-button",{"variant":[1],"size":[1],"disabled":[4],"href":[1],"type":[1]}]]],["af-button-group.cjs",[[257,"af-button-group",{"direction":[1],"gap":[1]}]]],["af-card.cjs",[[262,"af-card",{"backgroundImage":[1,"background-image"],"backgroundColor":[1,"background-color"],"darkOverlay":[4,"dark-overlay"]}]]],["af-color-swatch.cjs",[[257,"af-color-swatch",{"color":[1],"name":[1],"size":[1]}]]],["af-container.cjs",[[257,"af-container",{"maxWidth":[1,"max-width"]}]]],["af-icon-button.cjs",[[257,"af-icon-button",{"variant":[1],"size":[1],"disabled":[4],"href":[1],"type":[1],"ariaLabel":[1,"aria-label"]}]]],["af-testimonial.cjs",[[262,"af-testimonial",{"backgroundImage":[1,"background-image"],"logoImage":[1,"logo-image"],"quote":[1],"attribution":[1],"readMoreLink":[1,"read-more-link"]}]]],["af-testimonial-carousel.cjs",[[262,"af-testimonial-carousel",{"currentIndex":[32],"isAnimating":[32],"testimonialCount":[32]}]]],["af-testimonial-stat.cjs",[[258,"af-testimonial-stat",{"value":[1],"description":[1],"accentBorder":[4,"accent-border"]}]]],["af-typography-lockup.cjs",[[257,"af-typography-lockup",{"headingSize":[2,"heading-size"],"breakpoint":[1],"textAlignment":[1,"text-alignment"],"buttonAlignment":[1,"button-alignment"],"maxWidth":[2,"max-width"]}]]]], options);
9
9
  };
10
10
 
11
11
  exports.setNonce = index.setNonce;
@@ -12,7 +12,10 @@
12
12
  "components/af-icon-button/af-icon-button.js",
13
13
  "components/af-button-group/af-button-group.js",
14
14
  "components/af-typography-lockup/af-typography-lockup.js",
15
- "components/af-card/af-card.js"
15
+ "components/af-card/af-card.js",
16
+ "components/af-testimonial/af-testimonial.js",
17
+ "components/af-testimonial-carousel/af-testimonial-carousel.js",
18
+ "components/af-testimonial-stat/af-testimonial-stat.js"
16
19
  ],
17
20
  "compiler": {
18
21
  "name": "@stencil/core",
@@ -6,7 +6,7 @@
6
6
  margin: 0;
7
7
  padding: 0;
8
8
  font-family: 'NeuSans', 'Inter', 'Segoe UI', system-ui, sans-serif;
9
- font-weight: 500;
9
+ font-weight: 400;
10
10
  color: var(--colour-typography-heading-primary, #14343b);
11
11
  letter-spacing: -0.02em;
12
12
  }
@@ -0,0 +1,143 @@
1
+ :host {
2
+ display: block;
3
+ width: 100%;
4
+ }
5
+
6
+ .testimonial-card {
7
+ background: var(--colour-background-level-1, #e8eeed);
8
+ border-radius: var(--border-radius-card-level-1, 32px);
9
+ overflow: hidden;
10
+ display: flex;
11
+ height: 544px;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ /* Image side - 519px wide */
16
+ .testimonial-image {
17
+ position: relative;
18
+ width: 519px;
19
+ height: 100%;
20
+ background: #000000;
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ flex-shrink: 0;
25
+ overflow: hidden;
26
+ }
27
+
28
+ .testimonial-bg-image {
29
+ position: absolute;
30
+ inset: 0;
31
+ width: 100%;
32
+ height: 100%;
33
+ object-fit: cover;
34
+ opacity: 0.7;
35
+ }
36
+
37
+ .testimonial-logo {
38
+ position: relative;
39
+ z-index: 1;
40
+ padding: 0 108px;
41
+ max-width: 100%;
42
+ }
43
+
44
+ .testimonial-logo img {
45
+ width: 100%;
46
+ height: auto;
47
+ display: block;
48
+ }
49
+
50
+ /* Content side */
51
+ .testimonial-content {
52
+ flex: 1;
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: 32px;
56
+ padding: 48px;
57
+ border: 1px solid rgba(255, 255, 255, 0.08);
58
+ border-left: 1px solid rgba(255, 255, 255, 0.08);
59
+ box-sizing: border-box;
60
+ }
61
+
62
+ .testimonial-quote-section {
63
+ flex: 1;
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: 12px;
67
+ }
68
+
69
+ .testimonial-quote-icon {
70
+ width: 48px;
71
+ height: 48px;
72
+ color: var(--colour-brand-inkwell, #14343b);
73
+ flex-shrink: 0;
74
+ }
75
+
76
+ .testimonial-text {
77
+ font-family: 'NeuSans', 'Inter', 'Segoe UI', system-ui, sans-serif;
78
+ font-size: 22px;
79
+ font-weight: 400;
80
+ line-height: 1.4;
81
+ color: var(--colour-typography-body-default, #2b484f);
82
+ margin: 0;
83
+ max-height: 155px;
84
+ overflow: hidden;
85
+ text-overflow: ellipsis;
86
+ }
87
+
88
+ .testimonial-attribution {
89
+ font-family: 'NeuSans', 'Inter', 'Segoe UI', system-ui, sans-serif;
90
+ font-size: 22px;
91
+ font-weight: 400;
92
+ line-height: 1.4;
93
+ color: var(--colour-typography-body-dark, #14343b);
94
+ margin: 0;
95
+ }
96
+
97
+ .testimonial-stats {
98
+ display: flex;
99
+ gap: 32px;
100
+ width: 100%;
101
+ }
102
+
103
+ .testimonial-footer {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: space-between;
107
+ border-top: 1px solid var(--colour-background-border-default, #d1ddda);
108
+ padding-top: 32px;
109
+ }
110
+
111
+ .testimonial-nav {
112
+ display: flex;
113
+ gap: 12px;
114
+ }
115
+
116
+ .testimonial-cta {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ gap: 8px;
120
+ padding: 12px 24px;
121
+ border: 1px solid var(--colour-brand-inkwell, #14343b);
122
+ border-radius: 9999px;
123
+ font-family: 'NeuSans', 'Inter', 'Segoe UI', system-ui, sans-serif;
124
+ font-size: 17px;
125
+ font-weight: 500;
126
+ line-height: 20px;
127
+ color: var(--colour-brand-inkwell, #14343b);
128
+ text-decoration: none;
129
+ cursor: pointer;
130
+ transition: all 0.2s ease;
131
+ }
132
+
133
+ .testimonial-cta:hover {
134
+ background: var(--colour-background-level-1, #e8eeed);
135
+ transform: translateY(-1px);
136
+ }
137
+
138
+ .testimonial-cta svg {
139
+ width: 24px;
140
+ height: 24px;
141
+ }
142
+
143
+
@@ -0,0 +1,118 @@
1
+ import { h, Host } from "@stencil/core";
2
+ export class AfTestimonial {
3
+ render() {
4
+ return (h(Host, { key: '963791303c22cdea677a7923ffce8b16ea97cb26' }, h("div", { key: '369ad62ceb17461c4511f0cb7338a5f812b69717', class: "testimonial-card" }, h("div", { key: 'e548a64653054d54b282b83c0a64326c0973122d', class: "testimonial-image" }, this.backgroundImage && (h("img", { key: '21f779030e13675278b4cd18ae2df0c0bf9c59a3', src: this.backgroundImage, alt: "", class: "testimonial-bg-image" })), this.logoImage && (h("div", { key: '23298bd5b1c3db0ed5bff4c1d1cd0582e09b50a2', class: "testimonial-logo" }, h("img", { key: '357214f50e38cfa9e53cf7914c87f22c7971f1d5', src: this.logoImage, alt: "Company logo" })))), h("div", { key: 'd2913ca4d9b38a048ebedb123fdb0b7b9e78cc6f', class: "testimonial-content" }, h("div", { key: '92756afbcbd391a7fcb8b1a99d92bcc370f3787d', class: "testimonial-quote-section" }, h("div", { key: '40f844093eb232bf06b353a27c066f5ae99a85bf', class: "testimonial-quote-icon" }, h("slot", { key: '3cf6da2811c1cdf6a4540f72727fe479c7d4d4ca', name: "quote-icon" }, h("svg", { key: 'f59e4ceb77b67bbba1b5d647d10dd6f15b1d9319', width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("path", { key: 'dbcc67a7e7ab90b4d1172f0cced568eeeb182150', d: "M10.5 25.5C10.5 23.0147 12.5147 21 15 21H18C18.8284 21 19.5 20.3284 19.5 19.5V15C19.5 12.5147 17.4853 10.5 15 10.5H10.5C6.35786 10.5 3 13.8579 3 18V33C3 35.4853 5.01472 37.5 7.5 37.5H15C17.4853 37.5 19.5 35.4853 19.5 33V25.5C19.5 23.0147 17.4853 21 15 21H10.5ZM33 25.5C33 23.0147 35.0147 21 37.5 21H40.5C41.3284 21 42 20.3284 42 19.5V15C42 12.5147 39.9853 10.5 37.5 10.5H33C28.8579 10.5 25.5 13.8579 25.5 18V33C25.5 35.4853 27.5147 37.5 30 37.5H37.5C39.9853 37.5 42 35.4853 42 33V25.5C42 23.0147 39.9853 21 37.5 21H33Z", fill: "currentColor" })))), h("p", { key: '1b487f7ab688642b9c5166a3fc8eb1191e1daa36', class: "testimonial-text" }, this.quote), h("p", { key: '539600a1d6eb098ea329307d40cac941d1d631a4', class: "testimonial-attribution" }, this.attribution)), h("div", { key: '307e784601fd66cdd4573eaf0a83c8d61ab83301', class: "testimonial-stats" }, h("slot", { key: '2ab5758e92ed670e6d6ed554f3fce7a7e1fc0077', name: "stats" })), h("div", { key: 'b13d6b51a27f5e94d40929f6c337513ca84af1cd', class: "testimonial-footer" }, h("div", { key: '69b92a55946c936cdc78d7f317caacb8fd334779', class: "testimonial-nav" }, h("slot", { key: '41c0ef3a1497d33d7c2dc7b34a267d9158ff1aa0', name: "navigation" })), this.readMoreLink && (h("a", { key: 'd4c7e0acce78b7fb16085cd9c7c8762325dc6b6c', href: this.readMoreLink, class: "testimonial-cta" }, h("span", { key: '0576e6e26afeb35f07aa4ad0190cdd6e3b4242c1' }, "Read full story"), h("svg", { key: 'd3c6d905c55782f2b22e6070a4adcca4bd0164cf', width: "24", height: "24", viewBox: "0 0 24 24", fill: "none" }, h("path", { key: '61c7ecddf75102a501626fc59fe55cd1402b06e2', d: "M5 12H19M19 12L12 5M19 12L12 19", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" })))))))));
5
+ }
6
+ static get is() { return "af-testimonial"; }
7
+ static get encapsulation() { return "scoped"; }
8
+ static get originalStyleUrls() {
9
+ return {
10
+ "$": ["af-testimonial.css"]
11
+ };
12
+ }
13
+ static get styleUrls() {
14
+ return {
15
+ "$": ["af-testimonial.css"]
16
+ };
17
+ }
18
+ static get properties() {
19
+ return {
20
+ "backgroundImage": {
21
+ "type": "string",
22
+ "mutable": false,
23
+ "complexType": {
24
+ "original": "string",
25
+ "resolved": "string | undefined",
26
+ "references": {}
27
+ },
28
+ "required": false,
29
+ "optional": true,
30
+ "docs": {
31
+ "tags": [],
32
+ "text": "Background image URL for the testimonial card"
33
+ },
34
+ "getter": false,
35
+ "setter": false,
36
+ "reflect": false,
37
+ "attribute": "background-image"
38
+ },
39
+ "logoImage": {
40
+ "type": "string",
41
+ "mutable": false,
42
+ "complexType": {
43
+ "original": "string",
44
+ "resolved": "string | undefined",
45
+ "references": {}
46
+ },
47
+ "required": false,
48
+ "optional": true,
49
+ "docs": {
50
+ "tags": [],
51
+ "text": "Company logo URL"
52
+ },
53
+ "getter": false,
54
+ "setter": false,
55
+ "reflect": false,
56
+ "attribute": "logo-image"
57
+ },
58
+ "quote": {
59
+ "type": "string",
60
+ "mutable": false,
61
+ "complexType": {
62
+ "original": "string",
63
+ "resolved": "string",
64
+ "references": {}
65
+ },
66
+ "required": true,
67
+ "optional": false,
68
+ "docs": {
69
+ "tags": [],
70
+ "text": "Testimonial quote text"
71
+ },
72
+ "getter": false,
73
+ "setter": false,
74
+ "reflect": false,
75
+ "attribute": "quote"
76
+ },
77
+ "attribution": {
78
+ "type": "string",
79
+ "mutable": false,
80
+ "complexType": {
81
+ "original": "string",
82
+ "resolved": "string",
83
+ "references": {}
84
+ },
85
+ "required": true,
86
+ "optional": false,
87
+ "docs": {
88
+ "tags": [],
89
+ "text": "Attribution text (e.g., \"\u2013 Nathaniel Barrs, CTO, PSC Insurance\")"
90
+ },
91
+ "getter": false,
92
+ "setter": false,
93
+ "reflect": false,
94
+ "attribute": "attribution"
95
+ },
96
+ "readMoreLink": {
97
+ "type": "string",
98
+ "mutable": false,
99
+ "complexType": {
100
+ "original": "string",
101
+ "resolved": "string | undefined",
102
+ "references": {}
103
+ },
104
+ "required": false,
105
+ "optional": true,
106
+ "docs": {
107
+ "tags": [],
108
+ "text": "Link to full case study"
109
+ },
110
+ "getter": false,
111
+ "setter": false,
112
+ "reflect": false,
113
+ "attribute": "read-more-link"
114
+ }
115
+ };
116
+ }
117
+ }
118
+ //# sourceMappingURL=af-testimonial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"af-testimonial.js","sourceRoot":"","sources":["../../../src/components/af-testimonial/af-testimonial.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAQzD,MAAM,OAAO,aAAa;IA0BxB,MAAM;QACJ,OAAO,CACL,EAAC,IAAI;YACH,4DAAK,KAAK,EAAC,kBAAkB;gBAE3B,4DAAK,KAAK,EAAC,mBAAmB;oBAC3B,IAAI,CAAC,eAAe,IAAI,CACvB,4DAAK,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,sBAAsB,GAAG,CACvE;oBACA,IAAI,CAAC,SAAS,IAAI,CACjB,4DAAK,KAAK,EAAC,kBAAkB;wBAC3B,4DAAK,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAC,cAAc,GAAG,CAC3C,CACP,CACG;gBAGN,4DAAK,KAAK,EAAC,qBAAqB;oBAC9B,4DAAK,KAAK,EAAC,2BAA2B;wBAEpC,4DAAK,KAAK,EAAC,wBAAwB;4BACjC,6DAAM,IAAI,EAAC,YAAY;gCACrB,4DAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B;oCAC5F,6DAAM,CAAC,EAAC,wgBAAwgB,EAAC,IAAI,EAAC,cAAc,GAAE,CACliB,CACD,CACH;wBAEN,0DAAG,KAAK,EAAC,kBAAkB,IAAE,IAAI,CAAC,KAAK,CAAK;wBAC5C,0DAAG,KAAK,EAAC,yBAAyB,IAAE,IAAI,CAAC,WAAW,CAAK,CACrD;oBAGN,4DAAK,KAAK,EAAC,mBAAmB;wBAC5B,6DAAM,IAAI,EAAC,OAAO,GAAQ,CACtB;oBAGN,4DAAK,KAAK,EAAC,oBAAoB;wBAC7B,4DAAK,KAAK,EAAC,iBAAiB;4BAC1B,6DAAM,IAAI,EAAC,YAAY,GAAQ,CAC3B;wBACL,IAAI,CAAC,YAAY,IAAI,CACpB,0DAAG,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAC,iBAAiB;4BACjD,iFAA4B;4BAC5B,4DAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM;gCACzD,6DAAM,CAAC,EAAC,iCAAiC,EAAC,MAAM,EAAC,cAAc,kBAAc,GAAG,oBAAgB,OAAO,qBAAiB,OAAO,GAAE,CAC7H,CACJ,CACL,CACG,CACF,CACF,CACD,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Prop, h, Host } from '@stencil/core';\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\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 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 slot for flexibility */}\n <div class=\"testimonial-quote-icon\">\n <slot name=\"quote-icon\">\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.5 25.5C10.5 23.0147 12.5147 21 15 21H18C18.8284 21 19.5 20.3284 19.5 19.5V15C19.5 12.5147 17.4853 10.5 15 10.5H10.5C6.35786 10.5 3 13.8579 3 18V33C3 35.4853 5.01472 37.5 7.5 37.5H15C17.4853 37.5 19.5 35.4853 19.5 33V25.5C19.5 23.0147 17.4853 21 15 21H10.5ZM33 25.5C33 23.0147 35.0147 21 37.5 21H40.5C41.3284 21 42 20.3284 42 19.5V15C42 12.5147 39.9853 10.5 37.5 10.5H33C28.8579 10.5 25.5 13.8579 25.5 18V33C25.5 35.4853 27.5147 37.5 30 37.5H37.5C39.9853 37.5 42 35.4853 42 33V25.5C42 23.0147 39.9853 21 37.5 21H33Z\" fill=\"currentColor\"/>\n </svg>\n </slot>\n </div>\n\n <p class=\"testimonial-text\">{this.quote}</p>\n <p class=\"testimonial-attribution\">{this.attribution}</p>\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 <slot name=\"navigation\"></slot>\n </div>\n {this.readMoreLink && (\n <a href={this.readMoreLink} class=\"testimonial-cta\">\n <span>Read full story</span>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12H19M19 12L12 5M19 12L12 19\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </a>\n )}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n\n\n"]}
@@ -0,0 +1,96 @@
1
+ :host {
2
+ display: block;
3
+ width: 100%;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .testimonial-carousel {
8
+ position: relative;
9
+ width: 100%;
10
+ }
11
+
12
+ .testimonial-slides {
13
+ position: relative;
14
+ width: 100%;
15
+ min-height: 544px;
16
+ overflow: hidden;
17
+ }
18
+
19
+ .testimonial-slides ::slotted(af-testimonial) {
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
23
+ width: 100%;
24
+ transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
25
+ }
26
+
27
+ /* Progress indicator */
28
+ .testimonial-progress {
29
+ display: flex;
30
+ gap: 12px;
31
+ justify-content: center;
32
+ margin-top: 32px;
33
+ padding: 0 220px;
34
+ }
35
+
36
+ .progress-dot {
37
+ width: 100%;
38
+ max-width: 840px;
39
+ height: 3px;
40
+ background: var(--colour-background-border-default, #d1ddda);
41
+ border-radius: 2px;
42
+ cursor: pointer;
43
+ transition: background 0.3s ease;
44
+ position: relative;
45
+ overflow: hidden;
46
+ }
47
+
48
+ .progress-dot.active {
49
+ background: var(--colour-background-border-active, #8a7049);
50
+ }
51
+
52
+ .progress-dot:hover:not(.active) {
53
+ background: var(--colour-background-border-default, #c1cdc9);
54
+ }
55
+
56
+ /* Navigation buttons - positioned bottom left, next to each other */
57
+ .carousel-navigation {
58
+ position: absolute;
59
+ bottom: 48px;
60
+ left: 48px;
61
+ display: flex;
62
+ gap: 12px;
63
+ align-items: center;
64
+ z-index: 10;
65
+ }
66
+
67
+ .nav-button {
68
+ width: 48px;
69
+ height: 48px;
70
+ border-radius: 50%;
71
+ border: 1px solid var(--colour-brand-inkwell, #14343b);
72
+ background: transparent;
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ cursor: pointer;
77
+ transition: all 0.2s ease;
78
+ color: var(--colour-brand-inkwell, #14343b);
79
+ }
80
+
81
+ .nav-button:hover:not(:disabled) {
82
+ background: rgba(255, 255, 255, 0.1);
83
+ transform: translateY(-2px);
84
+ }
85
+
86
+ .nav-button:disabled {
87
+ opacity: 0.4;
88
+ cursor: not-allowed;
89
+ border-color: var(--colour-brand-inkwell, #14343b);
90
+ }
91
+
92
+ .nav-button svg {
93
+ width: 24px;
94
+ height: 24px;
95
+ }
96
+
@@ -0,0 +1,100 @@
1
+ import { h, Host } from "@stencil/core";
2
+ export class AfTestimonialCarousel {
3
+ constructor() {
4
+ this.currentIndex = 0;
5
+ this.isAnimating = false;
6
+ this.testimonialCount = 0;
7
+ this.testimonials = [];
8
+ this.goToPrevious = () => {
9
+ if (this.isAnimating || this.currentIndex === 0)
10
+ return;
11
+ this.isAnimating = true;
12
+ this.currentIndex = this.currentIndex - 1;
13
+ this.updateVisibleTestimonial();
14
+ setTimeout(() => {
15
+ this.isAnimating = false;
16
+ }, 500);
17
+ };
18
+ this.goToNext = () => {
19
+ if (this.isAnimating || this.currentIndex >= this.testimonialCount - 1)
20
+ return;
21
+ this.isAnimating = true;
22
+ this.currentIndex = this.currentIndex + 1;
23
+ this.updateVisibleTestimonial();
24
+ setTimeout(() => {
25
+ this.isAnimating = false;
26
+ }, 500);
27
+ };
28
+ }
29
+ componentDidLoad() {
30
+ this.detectTestimonials();
31
+ // Watch for testimonials being added (for React async rendering)
32
+ this.observer = new MutationObserver(() => {
33
+ this.detectTestimonials();
34
+ });
35
+ this.observer.observe(this.host, {
36
+ childList: true,
37
+ subtree: true
38
+ });
39
+ }
40
+ disconnectedCallback() {
41
+ if (this.observer) {
42
+ this.observer.disconnect();
43
+ }
44
+ }
45
+ detectTestimonials() {
46
+ const newTestimonials = Array.from(this.host.querySelectorAll('af-testimonial'));
47
+ if (newTestimonials.length !== this.testimonials.length) {
48
+ this.testimonials = newTestimonials;
49
+ this.testimonialCount = newTestimonials.length;
50
+ console.log('Found testimonials:', this.testimonials.length);
51
+ if (this.testimonials.length > 0) {
52
+ this.currentIndex = 0;
53
+ this.updateVisibleTestimonial();
54
+ }
55
+ }
56
+ }
57
+ updateVisibleTestimonial() {
58
+ this.testimonials.forEach((testimonial, index) => {
59
+ const offset = (index - this.currentIndex) * 100;
60
+ testimonial.style.transform = `translateX(${offset}%)`;
61
+ testimonial.style.opacity = index === this.currentIndex ? '1' : '0';
62
+ testimonial.style.pointerEvents = index === this.currentIndex ? 'auto' : 'none';
63
+ });
64
+ }
65
+ render() {
66
+ const hasPrev = this.currentIndex > 0;
67
+ const hasNext = this.currentIndex < this.testimonialCount - 1;
68
+ return (h(Host, { key: 'ffa14246fa8a47d1cc079b0026df5a914e2b9362' }, h("div", { key: 'e984a28fd99ca671d8bdd55a780fbf76d7a189dc', class: "testimonial-carousel" }, h("div", { key: '55d09df04a1ee008d30a9227d3e6914dce46e173', class: "testimonial-slides" }, h("slot", { key: '992ac1e4849bcc042ccd0eeb47319b3e34364a1f' })), this.testimonialCount > 1 && (h("div", { key: '247420c536242d5e66ada662a23828eaa0190c84', class: "testimonial-progress" }, Array.from({ length: this.testimonialCount }).map((_, index) => (h("div", { class: `progress-dot ${index === this.currentIndex ? 'active' : ''}`, onClick: () => {
69
+ if (!this.isAnimating && index !== this.currentIndex) {
70
+ this.isAnimating = true;
71
+ this.currentIndex = index;
72
+ this.updateVisibleTestimonial();
73
+ setTimeout(() => {
74
+ this.isAnimating = false;
75
+ }, 500);
76
+ }
77
+ } }))))), this.testimonialCount > 1 && (h("div", { key: 'dc31d36ed57808d5c28d2c1dcb2729e6ed5342f7', class: "carousel-navigation" }, h("button", { key: '37f18430b88a9e983fc6e673d206be03c4cc1d40', class: "nav-button prev", disabled: !hasPrev, onClick: this.goToPrevious, "aria-label": "Previous testimonial" }, h("svg", { key: '9292c82f1b5f993aa8cffd301592dba8f5261c10', width: "24", height: "24", viewBox: "0 0 24 24", fill: "none" }, h("path", { key: '0c34f308ae42547d24584858769ee295e01e02c9', d: "M19 12H5M5 12L12 19M5 12L12 5", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }))), h("button", { key: '984436b6d311d92623a9740d871c57d09de1a06e', class: "nav-button next", disabled: !hasNext, onClick: this.goToNext, "aria-label": "Next testimonial" }, h("svg", { key: 'e3d55f1efb6c29a74256c4db64283cb1abaa0aa5', width: "24", height: "24", viewBox: "0 0 24 24", fill: "none" }, h("path", { key: 'c9404bc3ad64ccb8ad0da3291ce7d4b622637e3d', d: "M5 12H19M19 12L12 5M19 12L12 19", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }))))))));
78
+ }
79
+ static get is() { return "af-testimonial-carousel"; }
80
+ static get encapsulation() { return "scoped"; }
81
+ static get originalStyleUrls() {
82
+ return {
83
+ "$": ["af-testimonial-carousel.css"]
84
+ };
85
+ }
86
+ static get styleUrls() {
87
+ return {
88
+ "$": ["af-testimonial-carousel.css"]
89
+ };
90
+ }
91
+ static get states() {
92
+ return {
93
+ "currentIndex": {},
94
+ "isAnimating": {},
95
+ "testimonialCount": {}
96
+ };
97
+ }
98
+ static get elementRef() { return "host"; }
99
+ }
100
+ //# sourceMappingURL=af-testimonial-carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"af-testimonial-carousel.js","sourceRoot":"","sources":["../../../src/components/af-testimonial-carousel/af-testimonial-carousel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, State, h, Host, Element } from '@stencil/core';\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 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 console.log('Found testimonials:', this.testimonials.length);\n \n if (this.testimonials.length > 0) {\n this.currentIndex = 0;\n this.updateVisibleTestimonial();\n }\n }\n }\n\n private updateVisibleTestimonial() {\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 }\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 render() {\n const hasPrev = this.currentIndex > 0;\n const hasNext = this.currentIndex < this.testimonialCount - 1;\n\n return (\n <Host>\n <div class=\"testimonial-carousel\">\n <div class=\"testimonial-slides\">\n <slot></slot>\n </div>\n \n {/* Progress indicator */}\n {this.testimonialCount > 1 && (\n <div class=\"testimonial-progress\">\n {Array.from({ length: this.testimonialCount }).map((_, index) => (\n <div \n class={`progress-dot ${index === this.currentIndex ? 'active' : ''}`}\n onClick={() => {\n if (!this.isAnimating && index !== this.currentIndex) {\n this.isAnimating = true;\n this.currentIndex = index;\n this.updateVisibleTestimonial();\n setTimeout(() => {\n this.isAnimating = false;\n }, 500);\n }\n }}\n />\n ))}\n </div>\n )}\n\n {/* Navigation buttons */}\n {this.testimonialCount > 1 && (\n <div class=\"carousel-navigation\">\n <button \n class=\"nav-button prev\" \n disabled={!hasPrev}\n onClick={this.goToPrevious}\n aria-label=\"Previous testimonial\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M19 12H5M5 12L12 19M5 12L12 5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button \n class=\"nav-button next\" \n disabled={!hasNext}\n onClick={this.goToNext}\n aria-label=\"Next testimonial\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 12H19M19 12L12 5M19 12L12 19\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n\n"]}
@@ -0,0 +1,41 @@
1
+ :host {
2
+ display: block;
3
+ flex: 1;
4
+ min-width: 0;
5
+ }
6
+
7
+ .stat {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 8px;
11
+ }
12
+
13
+ .stat--accent {
14
+ border-left: 2px solid var(--colour-background-border-active, #8a7049);
15
+ padding-left: 16px;
16
+ min-height: 76px;
17
+ justify-content: center;
18
+ }
19
+
20
+ .stat-value {
21
+ font-family: 'NeuSans', 'Inter', 'Segoe UI', system-ui, sans-serif;
22
+ font-size: 44px;
23
+ font-weight: 400;
24
+ line-height: 1;
25
+ letter-spacing: -0.88px;
26
+ color: var(--colour-typography-heading-secondary, #8a7049);
27
+ margin: 0;
28
+ }
29
+
30
+ .stat-description {
31
+ font-family: 'NeuSans', 'Inter', 'Segoe UI', system-ui, sans-serif;
32
+ font-size: 16px;
33
+ font-weight: 400;
34
+ line-height: 24px;
35
+ color: var(--colour-typography-body-dark, #14343b);
36
+ margin: 0;
37
+ overflow: hidden;
38
+ text-overflow: ellipsis;
39
+ }
40
+
41
+