@orangesk/orange-design-system 2.0.0-beta.3 → 2.0.0-beta.5

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 (227) hide show
  1. package/build/components/index.css +1 -2
  2. package/build/components/index.css.map +1 -1
  3. package/build/components/index.js +6 -6
  4. package/build/components/index.js.map +1 -1
  5. package/build/components/tsconfig.tsbuildinfo +1 -1
  6. package/build/components/types/index.d.ts +1474 -0
  7. package/build/components/types/src/components/CarouselHero/CarouselHero.d.ts +18 -0
  8. package/build/components/types/src/components/CarouselHero/CarouselHero.static.d.ts +47 -0
  9. package/build/components/types/src/components/CarouselHero/CarouselHeroItem.d.ts +9 -0
  10. package/build/components/types/src/components/CarouselHero/constants.d.ts +34 -0
  11. package/build/components/types/src/components/CarouselHero/index.d.ts +2 -0
  12. package/build/components/types/src/components/Pagination/Pagination.d.ts +2 -3
  13. package/build/components/types/src/components/index.d.ts +2 -3
  14. package/build/components/types/src/scripts/index.d.ts +5 -0
  15. package/build/lib/components.css +1 -1
  16. package/build/lib/components.css.map +1 -1
  17. package/build/lib/scripts.js +4 -4
  18. package/build/lib/scripts.js.map +1 -1
  19. package/build/lib/style.css +1 -1
  20. package/build/lib/style.css.map +1 -1
  21. package/build/lib/tsconfig.tsbuildinfo +1 -1
  22. package/package.json +5 -3
  23. package/src/components/CarouselHero/CarouselHero.static.ts +528 -0
  24. package/src/components/CarouselHero/CarouselHero.tsx +148 -0
  25. package/src/components/CarouselHero/CarouselHeroItem.tsx +41 -0
  26. package/src/components/CarouselHero/constants.ts +37 -0
  27. package/src/components/CarouselHero/index.ts +2 -0
  28. package/src/components/CarouselHero/styles/config.scss +54 -0
  29. package/src/components/CarouselHero/styles/mixins.scss +289 -0
  30. package/src/components/CarouselHero/styles/style.scss +67 -0
  31. package/src/components/CarouselHero/tests/CarouselHero.conformance.test.js +148 -0
  32. package/src/components/CarouselHero/tests/CarouselHero.unit.test.js +289 -0
  33. package/src/components/CarouselHero/tests/CarouselHeroItem.conformance.test.js +142 -0
  34. package/src/components/CarouselHero/tests/CarouselHeroItem.unit.test.js +210 -0
  35. package/src/components/Controls/styles/config.scss +2 -2
  36. package/src/components/Pagination/Pagination.tsx +2 -2
  37. package/src/components/index.ts +2 -2
  38. package/build/components/Accordion/index.js +0 -16
  39. package/build/components/Accordion/index.js.map +0 -1
  40. package/build/components/Accordion/tsconfig.tsbuildinfo +0 -1
  41. package/build/components/Alert/index.js +0 -16
  42. package/build/components/Alert/index.js.map +0 -1
  43. package/build/components/Alert/tsconfig.tsbuildinfo +0 -1
  44. package/build/components/AnchorNavigation/index.js +0 -16
  45. package/build/components/AnchorNavigation/index.js.map +0 -1
  46. package/build/components/AnchorNavigation/style.css +0 -2
  47. package/build/components/AnchorNavigation/style.css.map +0 -1
  48. package/build/components/AnchorNavigation/tsconfig.tsbuildinfo +0 -1
  49. package/build/components/Bar/index.js +0 -16
  50. package/build/components/Bar/index.js.map +0 -1
  51. package/build/components/Bar/tsconfig.tsbuildinfo +0 -1
  52. package/build/components/BlockAction/index.js +0 -16
  53. package/build/components/BlockAction/index.js.map +0 -1
  54. package/build/components/BlockAction/tsconfig.tsbuildinfo +0 -1
  55. package/build/components/BodyBanner/index.js +0 -16
  56. package/build/components/BodyBanner/index.js.map +0 -1
  57. package/build/components/BodyBanner/style.css +0 -2
  58. package/build/components/BodyBanner/style.css.map +0 -1
  59. package/build/components/BodyBanner/tsconfig.tsbuildinfo +0 -1
  60. package/build/components/Breadcrumbs/index.js +0 -16
  61. package/build/components/Breadcrumbs/index.js.map +0 -1
  62. package/build/components/Breadcrumbs/tsconfig.tsbuildinfo +0 -1
  63. package/build/components/Button/index.js +0 -16
  64. package/build/components/Button/index.js.map +0 -1
  65. package/build/components/Button/tsconfig.tsbuildinfo +0 -1
  66. package/build/components/Buttons/index.js +0 -16
  67. package/build/components/Buttons/index.js.map +0 -1
  68. package/build/components/Buttons/tsconfig.tsbuildinfo +0 -1
  69. package/build/components/Card/index.js +0 -16
  70. package/build/components/Card/index.js.map +0 -1
  71. package/build/components/Card/tsconfig.tsbuildinfo +0 -1
  72. package/build/components/Carousel/index.js +0 -16
  73. package/build/components/Carousel/index.js.map +0 -1
  74. package/build/components/Carousel/style.css +0 -2
  75. package/build/components/Carousel/style.css.map +0 -1
  76. package/build/components/Carousel/tsconfig.tsbuildinfo +0 -1
  77. package/build/components/CarouselPromotions/index.js +0 -16
  78. package/build/components/CarouselPromotions/index.js.map +0 -1
  79. package/build/components/CarouselPromotions/tsconfig.tsbuildinfo +0 -1
  80. package/build/components/CartTable/index.js +0 -16
  81. package/build/components/CartTable/index.js.map +0 -1
  82. package/build/components/CartTable/style.css +0 -2
  83. package/build/components/CartTable/style.css.map +0 -1
  84. package/build/components/CartTable/tsconfig.tsbuildinfo +0 -1
  85. package/build/components/Code/index.js +0 -11
  86. package/build/components/Code/index.js.map +0 -1
  87. package/build/components/Code/style.css +0 -2
  88. package/build/components/Code/style.css.map +0 -1
  89. package/build/components/Code/tsconfig.tsbuildinfo +0 -1
  90. package/build/components/Container/index.js +0 -16
  91. package/build/components/Container/index.js.map +0 -1
  92. package/build/components/Container/tsconfig.tsbuildinfo +0 -1
  93. package/build/components/Controls/index.js +0 -16
  94. package/build/components/Controls/index.js.map +0 -1
  95. package/build/components/Controls/tsconfig.tsbuildinfo +0 -1
  96. package/build/components/Cover/index.js +0 -16
  97. package/build/components/Cover/index.js.map +0 -1
  98. package/build/components/Cover/tsconfig.tsbuildinfo +0 -1
  99. package/build/components/Divider/index.js +0 -16
  100. package/build/components/Divider/index.js.map +0 -1
  101. package/build/components/Divider/tsconfig.tsbuildinfo +0 -1
  102. package/build/components/DocumentationSidebar/index.js +0 -16
  103. package/build/components/DocumentationSidebar/index.js.map +0 -1
  104. package/build/components/DocumentationSidebar/style.css +0 -2
  105. package/build/components/DocumentationSidebar/style.css.map +0 -1
  106. package/build/components/DocumentationSidebar/tsconfig.tsbuildinfo +0 -1
  107. package/build/components/Dropdown/index.js +0 -16
  108. package/build/components/Dropdown/index.js.map +0 -1
  109. package/build/components/Dropdown/style.css +0 -2
  110. package/build/components/Dropdown/style.css.map +0 -1
  111. package/build/components/Dropdown/tsconfig.tsbuildinfo +0 -1
  112. package/build/components/Expander/index.js +0 -16
  113. package/build/components/Expander/index.js.map +0 -1
  114. package/build/components/Expander/tsconfig.tsbuildinfo +0 -1
  115. package/build/components/FeatureAccordion/index.js +0 -16
  116. package/build/components/FeatureAccordion/index.js.map +0 -1
  117. package/build/components/FeatureAccordion/style.css +0 -2
  118. package/build/components/FeatureAccordion/style.css.map +0 -1
  119. package/build/components/FeatureAccordion/tsconfig.tsbuildinfo +0 -1
  120. package/build/components/Footer/index.js +0 -16
  121. package/build/components/Footer/index.js.map +0 -1
  122. package/build/components/Footer/tsconfig.tsbuildinfo +0 -1
  123. package/build/components/Forms/index.js +0 -20
  124. package/build/components/Forms/index.js.map +0 -1
  125. package/build/components/Forms/style.css +0 -2
  126. package/build/components/Forms/style.css.map +0 -1
  127. package/build/components/Forms/tsconfig.tsbuildinfo +0 -1
  128. package/build/components/Gauge/index.js +0 -16
  129. package/build/components/Gauge/index.js.map +0 -1
  130. package/build/components/Gauge/tsconfig.tsbuildinfo +0 -1
  131. package/build/components/Grid/index.js +0 -16
  132. package/build/components/Grid/index.js.map +0 -1
  133. package/build/components/Grid/style.css +0 -2
  134. package/build/components/Grid/style.css.map +0 -1
  135. package/build/components/Grid/tsconfig.tsbuildinfo +0 -1
  136. package/build/components/Hero/index.js +0 -16
  137. package/build/components/Hero/index.js.map +0 -1
  138. package/build/components/Hero/style.css +0 -2
  139. package/build/components/Hero/style.css.map +0 -1
  140. package/build/components/Hero/tsconfig.tsbuildinfo +0 -1
  141. package/build/components/Icon/index.js +0 -11
  142. package/build/components/Icon/index.js.map +0 -1
  143. package/build/components/Icon/tsconfig.tsbuildinfo +0 -1
  144. package/build/components/IconList/index.js +0 -16
  145. package/build/components/IconList/index.js.map +0 -1
  146. package/build/components/IconList/style.css +0 -2
  147. package/build/components/IconList/style.css.map +0 -1
  148. package/build/components/IconList/tsconfig.tsbuildinfo +0 -1
  149. package/build/components/Image/index.js +0 -16
  150. package/build/components/Image/index.js.map +0 -1
  151. package/build/components/Image/tsconfig.tsbuildinfo +0 -1
  152. package/build/components/Link/index.js +0 -7
  153. package/build/components/Link/index.js.map +0 -1
  154. package/build/components/Link/tsconfig.tsbuildinfo +0 -1
  155. package/build/components/List/index.js +0 -16
  156. package/build/components/List/index.js.map +0 -1
  157. package/build/components/List/tsconfig.tsbuildinfo +0 -1
  158. package/build/components/Loader/index.js +0 -16
  159. package/build/components/Loader/index.js.map +0 -1
  160. package/build/components/Loader/tsconfig.tsbuildinfo +0 -1
  161. package/build/components/Megamenu/index.js +0 -16
  162. package/build/components/Megamenu/index.js.map +0 -1
  163. package/build/components/Megamenu/tsconfig.tsbuildinfo +0 -1
  164. package/build/components/Modal/index.js +0 -20
  165. package/build/components/Modal/index.js.map +0 -1
  166. package/build/components/Modal/tsconfig.tsbuildinfo +0 -1
  167. package/build/components/Pagination/index.js +0 -16
  168. package/build/components/Pagination/index.js.map +0 -1
  169. package/build/components/Pagination/tsconfig.tsbuildinfo +0 -1
  170. package/build/components/Pill/index.js +0 -16
  171. package/build/components/Pill/index.js.map +0 -1
  172. package/build/components/Pill/tsconfig.tsbuildinfo +0 -1
  173. package/build/components/Preview/index.js +0 -77
  174. package/build/components/Preview/index.js.map +0 -1
  175. package/build/components/Preview/style.css +0 -2
  176. package/build/components/Preview/style.css.map +0 -1
  177. package/build/components/Preview/tsconfig.tsbuildinfo +0 -1
  178. package/build/components/Progress/index.js +0 -16
  179. package/build/components/Progress/index.js.map +0 -1
  180. package/build/components/Progress/tsconfig.tsbuildinfo +0 -1
  181. package/build/components/PromoBanner/index.js +0 -16
  182. package/build/components/PromoBanner/index.js.map +0 -1
  183. package/build/components/PromoBanner/style.css +0 -2
  184. package/build/components/PromoBanner/style.css.map +0 -1
  185. package/build/components/PromoBanner/tsconfig.tsbuildinfo +0 -1
  186. package/build/components/PromotionCard/index.js +0 -16
  187. package/build/components/PromotionCard/index.js.map +0 -1
  188. package/build/components/PromotionCard/tsconfig.tsbuildinfo +0 -1
  189. package/build/components/Section/index.js +0 -16
  190. package/build/components/Section/index.js.map +0 -1
  191. package/build/components/Section/tsconfig.tsbuildinfo +0 -1
  192. package/build/components/Skeleton/index.js +0 -16
  193. package/build/components/Skeleton/index.js.map +0 -1
  194. package/build/components/Skeleton/tsconfig.tsbuildinfo +0 -1
  195. package/build/components/SkipLink/index.js +0 -16
  196. package/build/components/SkipLink/index.js.map +0 -1
  197. package/build/components/SkipLink/tsconfig.tsbuildinfo +0 -1
  198. package/build/components/Stepbar/index.js +0 -16
  199. package/build/components/Stepbar/index.js.map +0 -1
  200. package/build/components/Stepbar/tsconfig.tsbuildinfo +0 -1
  201. package/build/components/Sticker/index.js +0 -16
  202. package/build/components/Sticker/index.js.map +0 -1
  203. package/build/components/Sticker/tsconfig.tsbuildinfo +0 -1
  204. package/build/components/Table/index.js +0 -16
  205. package/build/components/Table/index.js.map +0 -1
  206. package/build/components/Table/tsconfig.tsbuildinfo +0 -1
  207. package/build/components/Tabs/index.js +0 -16
  208. package/build/components/Tabs/index.js.map +0 -1
  209. package/build/components/Tabs/tsconfig.tsbuildinfo +0 -1
  210. package/build/components/Tag/index.js +0 -16
  211. package/build/components/Tag/index.js.map +0 -1
  212. package/build/components/Tag/tsconfig.tsbuildinfo +0 -1
  213. package/build/components/Testimonial/index.js +0 -16
  214. package/build/components/Testimonial/index.js.map +0 -1
  215. package/build/components/Testimonial/tsconfig.tsbuildinfo +0 -1
  216. package/build/components/Tile/index.js +0 -16
  217. package/build/components/Tile/index.js.map +0 -1
  218. package/build/components/Tile/tsconfig.tsbuildinfo +0 -1
  219. package/build/components/Tooltip/index.js +0 -16
  220. package/build/components/Tooltip/index.js.map +0 -1
  221. package/build/components/Tooltip/style.css +0 -2
  222. package/build/components/Tooltip/style.css.map +0 -1
  223. package/build/components/Tooltip/tsconfig.tsbuildinfo +0 -1
  224. package/build/components/static.css +0 -2
  225. package/build/components/static.css.map +0 -1
  226. package/build/components/static.js +0 -10
  227. package/build/components/static.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ export const CLASS_ROOT = "carousel-hero";
2
+
3
+ export const CLASS_VIEWPORT_WRAPPER = `${CLASS_ROOT}__viewport-wrapper`;
4
+ export const CLASS_VIEWPORT = `${CLASS_ROOT}__viewport`;
5
+ export const CLASS_TRACK = `${CLASS_ROOT}__track`;
6
+ export const CLASS_SLIDE = `${CLASS_ROOT}__slide`;
7
+ export const CLASS_SLIDE_CONTENT = `${CLASS_ROOT}__slide-content`;
8
+ export const CLASS_SLIDE_TITLE = `${CLASS_ROOT}__slide-title`;
9
+ export const CLASS_SLIDE_SUBTITLE = `${CLASS_ROOT}__slide-subtitle`;
10
+ export const CLASS_SLIDE_IMAGE_WRAPPER = `${CLASS_ROOT}__slide-image-wrapper`;
11
+ export const CLASS_SLIDE_IMAGE = `${CLASS_ROOT}__slide-image`;
12
+ export const CLASS_SLIDE_BUTTON = `${CLASS_ROOT}__slide-button`;
13
+ export const CLASS_PREV = `${CLASS_ROOT}__prev`;
14
+ export const CLASS_NEXT = `${CLASS_ROOT}__next`;
15
+ export const CLASS_PLAY_PAUSE = `${CLASS_ROOT}__play-pause`;
16
+ export const CLASS_TABS = `${CLASS_ROOT}__tabs`;
17
+ export const CLASS_TAB = `${CLASS_ROOT}__tab`;
18
+ export const CLASS_PAGINATION = `${CLASS_ROOT}__pagination`;
19
+ export const CLASS_PAGINATION_ITEM = `${CLASS_ROOT}__pagination-item`;
20
+ export const CLASS_PAGINATION_SVG = `${CLASS_ROOT}__pagination-svg`;
21
+ export const CLASS_PAGINATION_CIRCLE = `${CLASS_ROOT}__pagination-circle`;
22
+ export const CLASS_CONTROLS = `${CLASS_ROOT}__controls`;
23
+ export const CLASS_NAVIGATION = `${CLASS_ROOT}__navigation`;
24
+
25
+ export const CLASS_ACTIVE = "is-active";
26
+ export const CLASS_PLAYING = "is-playing";
27
+ export const CLASS_PAUSED = "is-paused";
28
+
29
+ export const SELECTOR_VIEWPORT = `.${CLASS_VIEWPORT}`;
30
+ export const SELECTOR_TRACK = `.${CLASS_TRACK}`;
31
+ export const SELECTOR_PREV = `.${CLASS_PREV}`;
32
+ export const SELECTOR_NEXT = `.${CLASS_NEXT}`;
33
+ export const SELECTOR_PLAY_PAUSE = `.${CLASS_PLAY_PAUSE}`;
34
+ export const SELECTOR_TABS = `.${CLASS_TABS}`;
35
+ export const SELECTOR_TAB = `.${CLASS_TAB}`;
36
+ export const SELECTOR_PAGINATION = `.${CLASS_PAGINATION}`;
37
+ export const SELECTOR_ACTIVE = `.${CLASS_ACTIVE}`;
@@ -0,0 +1,2 @@
1
+ export { CarouselHero, CarouselHeroItem } from "./CarouselHero";
2
+ export type { CarouselHeroProps, TabItem } from "./CarouselHero";
@@ -0,0 +1,54 @@
1
+ @use "../../../styles/tokens/space";
2
+ @use "../../../styles/tokens/color";
3
+ @use "../../../styles/tools/convert";
4
+ @use "sass:math";
5
+
6
+ $space: space.get("large");
7
+
8
+ $viewport-horizontal-spacing: (
9
+ default: convert.to-rem(20px),
10
+ md: 0,
11
+ );
12
+
13
+ $controls-spacing: space.get("medium");
14
+
15
+ $tabs-spacing: space.get("small");
16
+
17
+ $tab-colors: (
18
+ default: (
19
+ color: var(--color-text-moderate),
20
+ border-color: transparent,
21
+ background-color: transparent,
22
+ ),
23
+ active: (
24
+ color: var(--color-text-brand),
25
+ border-color: var(--color-border-brand),
26
+ background-color: transparent,
27
+ ),
28
+ hover: (
29
+ color: var(--color-text-brand),
30
+ border-color: var(--color-border-brand),
31
+ background-color: var(--color-surface-subtle),
32
+ ),
33
+ );
34
+
35
+ $navigation-spacing: space.get("small");
36
+
37
+ $slide-min-height: (
38
+ default: convert.to-rem(560px),
39
+ );
40
+
41
+ // SVG countdown animation constants
42
+ $animated-dot-radius: 5;
43
+ $pi: math.div(math.round(math.$pi * 10000), 10000);
44
+ $animated-dot-circumference: 2 * $pi * $animated-dot-radius;
45
+
46
+ @keyframes countdown {
47
+ from {
48
+ // stroke-dashoffset can't be negative number due to Safari issues.
49
+ stroke-dashoffset: $animated-dot-circumference;
50
+ }
51
+ to {
52
+ stroke-dashoffset: 0;
53
+ }
54
+ }
@@ -0,0 +1,289 @@
1
+ @use "sass:map" as sass-map;
2
+ @use "sass:math";
3
+ @use "../../../styles/tokens/base";
4
+ @use "../../../styles/tokens/space";
5
+ @use "../../../styles/tools/convert";
6
+ @use "../../../styles/tools/generate";
7
+ @use "../../../styles/tokens/breakpoint";
8
+ @use "../../Button/styles/mixins" as button-mixins;
9
+ @use "../../../styles/typography/config" as typography-config;
10
+ @use "../../../styles/typography/mixins" as typography-mixins;
11
+ @use "./config";
12
+
13
+ @mixin base {
14
+ margin: 0 auto;
15
+ position: relative;
16
+ margin-bottom: config.$space;
17
+ }
18
+
19
+ @mixin viewport-wrapper {
20
+ position: relative;
21
+ }
22
+
23
+ @mixin viewport {
24
+ margin: 0 auto;
25
+ position: relative;
26
+ overflow: hidden;
27
+ transform: translateZ(0);
28
+
29
+ &.is-draggable {
30
+ user-select: none;
31
+ cursor: -webkit-grab;
32
+ cursor: grab;
33
+ }
34
+
35
+ &.is-dragging {
36
+ cursor: -webkit-grabbing;
37
+ cursor: grabbing;
38
+ }
39
+ }
40
+
41
+ @mixin track {
42
+ transform: translateZ(0);
43
+ width: 100%;
44
+ margin: 0;
45
+ padding: 0;
46
+ display: flex;
47
+ z-index: 1;
48
+ }
49
+
50
+ @mixin controls-base {
51
+ display: flex;
52
+ flex-direction: row;
53
+ align-items: center;
54
+ justify-content: space-between;
55
+ width: 100%;
56
+ padding: 0 convert.to-rem(40px);
57
+ background: var(--color-surface-primary);
58
+ border-bottom: 1px solid var(--color-border-subtle);
59
+
60
+ @include breakpoint.get("sm", "down") {
61
+ padding: 0 convert.to-rem(15px);
62
+ }
63
+ }
64
+
65
+ @mixin tabs-base {
66
+ display: flex;
67
+ flex: 1;
68
+ gap: 0;
69
+ overflow-x: auto;
70
+ overflow-y: inherit;
71
+ scrollbar-width: none; // Hide scrollbar for Firefox
72
+ -ms-overflow-style: none; // Hide scrollbar for IE/Edge
73
+ position: relative;
74
+
75
+ // Hide tabs on mobile (md and down), show pagination instead
76
+ @include breakpoint.get("md", "down") {
77
+ display: none;
78
+ }
79
+
80
+ // Hide scrollbar for WebKit browsers
81
+ &::-webkit-scrollbar {
82
+ display: none;
83
+ }
84
+
85
+ &::after {
86
+ content: "";
87
+ position: sticky;
88
+ right: 0;
89
+ top: 0;
90
+ bottom: 0;
91
+ width: convert.to-rem(56px);
92
+ background: linear-gradient(
93
+ 90deg,
94
+ transparent 0%,
95
+ color-mix(in srgb, var(--color-surface-primary), transparent 50%) 20%,
96
+ var(--color-surface-primary) 100%
97
+ );
98
+ pointer-events: none;
99
+ z-index: 1;
100
+ flex-shrink: 0;
101
+ margin-left: auto;
102
+ }
103
+ }
104
+
105
+ @mixin tab-base($colors: config.$tab-colors) {
106
+ position: relative;
107
+ padding: convert.to-rem(25px) convert.to-rem(15px);
108
+ border: none;
109
+ border-top: 4px solid transparent;
110
+ background: none;
111
+ cursor: pointer;
112
+ color: var(--color-text-default);
113
+ text-align: center;
114
+ flex: 0;
115
+ white-space: nowrap;
116
+ font-weight: 700;
117
+
118
+ &.is-active,
119
+ &[aria-selected="true"] {
120
+ border-top-color: var(--color-border-accent);
121
+ }
122
+
123
+ &:hover:not(.is-active):not([aria-selected="true"]) {
124
+ color: var(--color-text-accent);
125
+ }
126
+ }
127
+
128
+ @mixin navigation-base {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: convert.to-rem(10px);
132
+ }
133
+
134
+ @mixin slide-base {
135
+ display: flex;
136
+ flex-direction: row;
137
+ width: 100%;
138
+ flex: 0 0 100%;
139
+ user-select: none;
140
+ position: relative;
141
+ overflow: hidden;
142
+
143
+ @each $breakpoint, $height in config.$slide-min-height {
144
+ @include breakpoint.get($breakpoint) {
145
+ min-height: $height;
146
+ }
147
+ }
148
+
149
+ @include breakpoint.get("md", "down") {
150
+ flex-direction: column;
151
+ }
152
+ }
153
+
154
+ @mixin slide-content {
155
+ flex: 0 0 50%;
156
+ display: flex;
157
+ z-index: 2;
158
+ flex-direction: column;
159
+ align-items: flex-start;
160
+ padding: convert.to-rem(60px) convert.to-rem(120px) convert.to-rem(60px)
161
+ convert.to-rem(70px);
162
+
163
+ > *:last-child {
164
+ margin-bottom: 0;
165
+ }
166
+
167
+ @include breakpoint.get("xl", "down") {
168
+ padding-left: convert.to-rem(40px);
169
+ }
170
+
171
+ @include breakpoint.get("md", "down") {
172
+ flex: initial;
173
+ }
174
+
175
+ @include breakpoint.get("sm", "down") {
176
+ padding: convert.to-rem(30px) convert.to-rem(10px);
177
+ }
178
+ }
179
+
180
+ @mixin slide-image {
181
+ flex: 0 0 50%;
182
+ display: flex;
183
+ margin-bottom: 0 !important;
184
+ object-fit: cover;
185
+ object-position: center;
186
+ width: 50%;
187
+
188
+ @include breakpoint.get("md", "down") {
189
+ flex: 1;
190
+ width: 100%;
191
+ }
192
+ }
193
+
194
+ @mixin slide-title {
195
+ color: var(--color-text-default);
196
+ margin-top: 0;
197
+ margin-bottom: space.get("medium");
198
+ }
199
+
200
+ @mixin pagination-base {
201
+ user-select: none;
202
+ display: none; // Hidden by default on desktop
203
+ flex-wrap: wrap;
204
+ justify-content: center;
205
+ padding: convert.to-rem(20px) 0;
206
+
207
+ // Show pagination on mobile (md and down)
208
+ @include breakpoint.get("md", "down") {
209
+ display: flex;
210
+ }
211
+
212
+ @include breakpoint.get("sm", "down") {
213
+ justify-content: flex-start;
214
+ }
215
+ }
216
+
217
+ @mixin pagination-item-base {
218
+ background: none;
219
+ user-select: none;
220
+ display: block;
221
+ cursor: pointer;
222
+ border-radius: 100%;
223
+ width: convert.to-rem(10px);
224
+ height: convert.to-rem(10px);
225
+ margin: convert.to-rem(8px);
226
+ background-color: var(--color-surface-contrast);
227
+
228
+ &:hover {
229
+ background-color: var(--color-icon-brand);
230
+ }
231
+
232
+ &.is-active {
233
+ background-color: transparent;
234
+ }
235
+ }
236
+
237
+ @mixin pagination-svg() {
238
+ position: relative;
239
+ display: none;
240
+ left: -1px;
241
+ top: -1px;
242
+ // This transform is a workaround due to Safari not supporting negative values for stroke-dashoffset.
243
+ // We're rotating the SVG so that the line starts to animate from the top (12o'clock).
244
+ // The vertical flip is to make the line animate clockwise.
245
+ transform: rotate(-90deg) scale(1, -1);
246
+
247
+ .is-playing .is-active > & {
248
+ display: block;
249
+ }
250
+
251
+ .is-paused .is-active > & {
252
+ display: block;
253
+
254
+ circle {
255
+ stroke: var(--color-border-accent);
256
+ stroke-width: 2px;
257
+ stroke-dasharray: config.$animated-dot-circumference;
258
+ stroke-dashoffset: 0;
259
+ fill: none;
260
+ animation: none;
261
+ }
262
+ }
263
+
264
+ // Show SVG ring for active state when no autoplay
265
+ .carousel-hero:not(.is-playing):not(.is-paused) .is-active > & {
266
+ display: block;
267
+
268
+ circle {
269
+ stroke: var(--color-border-accent);
270
+ stroke-width: 2px;
271
+ stroke-dasharray: config.$animated-dot-circumference;
272
+ stroke-dashoffset: 0;
273
+ fill: none;
274
+ animation: none;
275
+ }
276
+ }
277
+ }
278
+
279
+ @mixin pagination-circle() {
280
+ stroke-width: 2px;
281
+ stroke: var(--color-border-accent);
282
+ stroke-dasharray: config.$animated-dot-circumference;
283
+ stroke-dashoffset: config.$animated-dot-circumference;
284
+ animation-name: countdown;
285
+ animation-iteration-count: 1;
286
+ animation-timing-function: linear;
287
+ animation-direction: reverse;
288
+ fill: none;
289
+ }
@@ -0,0 +1,67 @@
1
+ @use "./mixins";
2
+
3
+ @layer components {
4
+ .carousel-hero {
5
+ @include mixins.base;
6
+
7
+ &__viewport-wrapper {
8
+ @include mixins.viewport-wrapper;
9
+ }
10
+
11
+ &__viewport {
12
+ @include mixins.viewport;
13
+ }
14
+
15
+ &__track {
16
+ @include mixins.track;
17
+ }
18
+
19
+ &__slide {
20
+ @include mixins.slide-base;
21
+ }
22
+
23
+ &__slide-content {
24
+ @include mixins.slide-content;
25
+ }
26
+
27
+ &__slide-title {
28
+ @include mixins.slide-title;
29
+ }
30
+
31
+ &__slide-image {
32
+ @include mixins.slide-image;
33
+ }
34
+
35
+ &__controls {
36
+ @include mixins.controls-base;
37
+ }
38
+
39
+ &__tabs {
40
+ @include mixins.tabs-base;
41
+ }
42
+
43
+ &__tab {
44
+ @include mixins.tab-base;
45
+ }
46
+
47
+ &__navigation {
48
+ @include mixins.navigation-base;
49
+ }
50
+
51
+ &__pagination {
52
+ @include mixins.pagination-base;
53
+ }
54
+
55
+ &__pagination-item {
56
+ @include mixins.pagination-item-base;
57
+ }
58
+
59
+ &__pagination-svg {
60
+ @include mixins.pagination-svg;
61
+ }
62
+
63
+ &__pagination-circle {
64
+ @include mixins.pagination-circle;
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,148 @@
1
+ import { render } from "@testing-library/react";
2
+ import { axe } from "jest-axe";
3
+
4
+ import { CarouselHero, CarouselHeroItem } from "../";
5
+
6
+ const basicExample = (
7
+ <CarouselHero>
8
+ <CarouselHeroItem
9
+ title="Slide 1"
10
+ image="https://placehold.co/720x560?text=Slide+1"
11
+ >
12
+ <p>First slide content</p>
13
+ </CarouselHeroItem>
14
+ <CarouselHeroItem
15
+ title="Slide 2"
16
+ image="https://placehold.co/720x560?text=Slide+2"
17
+ >
18
+ <p>Second slide content</p>
19
+ </CarouselHeroItem>
20
+ </CarouselHero>
21
+ );
22
+
23
+ const exampleWithTabs = (
24
+ <CarouselHero
25
+ tabs={[
26
+ { label: "First Tab" },
27
+ { label: "Second Tab" },
28
+ { label: "Third Tab" },
29
+ ]}
30
+ >
31
+ <CarouselHeroItem
32
+ title="Slide 1"
33
+ image="https://placehold.co/720x560?text=Slide+1"
34
+ >
35
+ <p>First slide with tabs</p>
36
+ </CarouselHeroItem>
37
+ <CarouselHeroItem
38
+ title="Slide 2"
39
+ image="https://placehold.co/720x560?text=Slide+2"
40
+ >
41
+ <p>Second slide with tabs</p>
42
+ </CarouselHeroItem>
43
+ <CarouselHeroItem
44
+ title="Slide 3"
45
+ image="https://placehold.co/720x560?text=Slide+3"
46
+ >
47
+ <p>Third slide with tabs</p>
48
+ </CarouselHeroItem>
49
+ </CarouselHero>
50
+ );
51
+
52
+ const exampleWithAutoplay = (
53
+ <CarouselHero
54
+ interval={3000}
55
+ tabs={[{ label: "Auto Tab 1" }, { label: "Auto Tab 2" }]}
56
+ >
57
+ <CarouselHeroItem
58
+ title="Auto Slide 1"
59
+ image="https://placehold.co/720x560?text=Auto+Slide+1"
60
+ >
61
+ <p>Autoplay slide 1</p>
62
+ </CarouselHeroItem>
63
+ <CarouselHeroItem
64
+ title="Auto Slide 2"
65
+ image="https://placehold.co/720x560?text=Auto+Slide+2"
66
+ >
67
+ <p>Autoplay slide 2</p>
68
+ </CarouselHeroItem>
69
+ </CarouselHero>
70
+ );
71
+
72
+ const exampleWithComplexContent = (
73
+ <CarouselHero
74
+ colorScheme="light"
75
+ tabs={[{ label: "Product 1" }, { label: "Product 2" }]}
76
+ interval={5000}
77
+ swiperOptions={{ speed: 300 }}
78
+ >
79
+ <CarouselHeroItem
80
+ title="Premium Product"
81
+ image="https://placehold.co/720x560?text=Product+1"
82
+ >
83
+ <p>Discover our premium product line with advanced features.</p>
84
+ <button type="button">Learn More</button>
85
+ <button type="button">Buy Now</button>
86
+ </CarouselHeroItem>
87
+ <CarouselHeroItem
88
+ title="Special Offer"
89
+ image="https://placehold.co/720x560?text=Product+2"
90
+ >
91
+ <p>Limited time offer - get 50% off on selected items.</p>
92
+ <ul>
93
+ <li>Free shipping</li>
94
+ <li>30-day return policy</li>
95
+ <li>Extended warranty</li>
96
+ </ul>
97
+ <button type="button">View Details</button>
98
+ </CarouselHeroItem>
99
+ </CarouselHero>
100
+ );
101
+
102
+ describe("CarouselHero conformance", () => {
103
+ it("is valid html", () => {
104
+ const { container } = render(basicExample);
105
+ expect(container).toHTMLValidate();
106
+ });
107
+
108
+ it("is accessible", async () => {
109
+ const { container } = render(basicExample);
110
+ expect(await axe(container)).toHaveNoViolations();
111
+ });
112
+ });
113
+
114
+ describe("CarouselHero with tabs conformance", () => {
115
+ it("is valid html", () => {
116
+ const { container } = render(exampleWithTabs);
117
+ expect(container).toHTMLValidate();
118
+ });
119
+
120
+ it("is accessible", async () => {
121
+ const { container } = render(exampleWithTabs);
122
+ expect(await axe(container)).toHaveNoViolations();
123
+ });
124
+ });
125
+
126
+ describe("CarouselHero with autoplay conformance", () => {
127
+ it("is valid html", () => {
128
+ const { container } = render(exampleWithAutoplay);
129
+ expect(container).toHTMLValidate();
130
+ });
131
+
132
+ it("is accessible", async () => {
133
+ const { container } = render(exampleWithAutoplay);
134
+ expect(await axe(container)).toHaveNoViolations();
135
+ });
136
+ });
137
+
138
+ describe("CarouselHero with complex content conformance", () => {
139
+ it("is valid html", () => {
140
+ const { container } = render(exampleWithComplexContent);
141
+ expect(container).toHTMLValidate();
142
+ });
143
+
144
+ it("is accessible", async () => {
145
+ const { container } = render(exampleWithComplexContent);
146
+ expect(await axe(container)).toHaveNoViolations();
147
+ });
148
+ });