@orangesk/orange-design-system 2.0.0-beta.18 → 2.0.0-beta.19
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/build/components/Accordion/style.css +1 -1
- package/build/components/Accordion/style.css.map +1 -1
- package/build/components/AnchorNavigation/style.css +1 -1
- package/build/components/AnchorNavigation/style.css.map +1 -1
- package/build/components/Megamenu/style.css +1 -1
- package/build/components/Megamenu/style.css.map +1 -1
- package/build/components/index.js +1 -23
- package/build/components/index.js.map +1 -1
- package/build/components/tsconfig.tsbuildinfo +1 -1
- package/build/components/types/index.d.ts +2 -2
- package/build/components/types/src/components/Accordion/Accordion.d.ts +2 -2
- package/build/components/types/src/components/Accordion/Accordion.static.d.ts +1 -0
- package/build/components/types/src/components/Carousel/Carousel.static.d.ts +38 -18
- package/build/lib/components.css +1 -1
- package/build/lib/components.css.map +1 -1
- package/build/lib/megamenu.css +1 -1
- package/build/lib/megamenu.css.map +1 -1
- package/build/lib/megamenu.js +1 -1
- package/build/lib/megamenu.js.map +1 -1
- package/build/lib/scripts.js +1 -9
- package/build/lib/scripts.js.map +1 -1
- package/build/lib/style.css +1 -1
- package/build/lib/style.css.map +1 -1
- package/build/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.static.ts +36 -30
- package/src/components/Accordion/Accordion.tsx +4 -4
- package/src/components/Accordion/AccordionHeader.tsx +0 -10
- package/src/components/Accordion/styles/mixins.scss +0 -6
- package/src/components/Accordion/styles/style.scss +2 -2
- package/src/components/Accordion/tests/Accordion.unit.test.js +12 -26
- package/src/components/AnchorNavigation/AnchorNavigation.static.ts +0 -1
- package/src/components/AnchorNavigation/styles/mixins.scss +4 -0
- package/src/components/Carousel/Carousel.static.ts +177 -91
- package/src/components/Carousel/tests/Carousel.static.test.js +213 -0
- package/src/components/Carousel/tests/Carousel.unit.test.js +58 -0
- package/src/components/Expander/Expander.static.ts +11 -12
- package/src/components/Footer/Footer.tsx +1 -1
- package/src/components/Footer/tests/Footer.conformance.test.js +4 -4
- package/src/components/Footer/tests/Footer.unit.test.js +4 -4
- package/src/components/Megamenu/Megamenu.tsx +71 -55
- package/src/components/Megamenu/MegamenuBlog.tsx +3 -6
- package/src/components/Megamenu/static.ts +0 -9
- package/src/components/Megamenu/styles/mixins.scss +1 -1
- package/src/components/PromoBanner/PromoBanner.tsx +2 -0
|
@@ -13,9 +13,15 @@ jest.mock("swiper", () => ({
|
|
|
13
13
|
destroy: jest.fn(),
|
|
14
14
|
update: jest.fn(),
|
|
15
15
|
on: jest.fn(),
|
|
16
|
+
enable: jest.fn(),
|
|
17
|
+
disable: jest.fn(),
|
|
16
18
|
activeIndex: 0,
|
|
17
19
|
isBeginning: true,
|
|
18
20
|
isEnd: false,
|
|
21
|
+
slides: [{}, {}, {}],
|
|
22
|
+
params: {
|
|
23
|
+
slidesPerView: 1,
|
|
24
|
+
},
|
|
19
25
|
})),
|
|
20
26
|
}));
|
|
21
27
|
|
|
@@ -44,9 +50,15 @@ describe("Carousel Static - External Controls", () => {
|
|
|
44
50
|
destroy: jest.fn(),
|
|
45
51
|
update: jest.fn(),
|
|
46
52
|
on: jest.fn(),
|
|
53
|
+
enable: jest.fn(),
|
|
54
|
+
disable: jest.fn(),
|
|
47
55
|
activeIndex: 0,
|
|
48
56
|
isBeginning: true,
|
|
49
57
|
isEnd: false,
|
|
58
|
+
slides: [{}, {}, {}],
|
|
59
|
+
params: {
|
|
60
|
+
slidesPerView: 1,
|
|
61
|
+
},
|
|
50
62
|
};
|
|
51
63
|
|
|
52
64
|
Swiper.mockImplementation(() => mockSwiperInstance);
|
|
@@ -189,6 +201,7 @@ describe("Carousel Static - External Controls", () => {
|
|
|
189
201
|
it("should disable next button when at end", () => {
|
|
190
202
|
mockSwiperInstance.isBeginning = false;
|
|
191
203
|
mockSwiperInstance.isEnd = true;
|
|
204
|
+
mockSwiperInstance.activeIndex = 2; // Set to last slide so activeIndex + slidesPerView >= slidesCount
|
|
192
205
|
|
|
193
206
|
carouselInstance.updateExternalControlsState();
|
|
194
207
|
|
|
@@ -401,3 +414,203 @@ describe("Carousel Static - External Controls", () => {
|
|
|
401
414
|
});
|
|
402
415
|
});
|
|
403
416
|
});
|
|
417
|
+
|
|
418
|
+
describe("Carousel Static - Auto-Disable Feature", () => {
|
|
419
|
+
let carouselElement;
|
|
420
|
+
let carouselInstance;
|
|
421
|
+
let mockSwiperInstance;
|
|
422
|
+
|
|
423
|
+
beforeEach(() => {
|
|
424
|
+
jest.clearAllMocks();
|
|
425
|
+
|
|
426
|
+
// Create mock Swiper instance with slides array
|
|
427
|
+
mockSwiperInstance = {
|
|
428
|
+
slideNext: jest.fn(),
|
|
429
|
+
slidePrev: jest.fn(),
|
|
430
|
+
destroy: jest.fn(),
|
|
431
|
+
update: jest.fn(),
|
|
432
|
+
on: jest.fn(),
|
|
433
|
+
enable: jest.fn(),
|
|
434
|
+
disable: jest.fn(),
|
|
435
|
+
activeIndex: 0,
|
|
436
|
+
isBeginning: true,
|
|
437
|
+
isEnd: false,
|
|
438
|
+
slides: [], // Will be populated in tests
|
|
439
|
+
params: {
|
|
440
|
+
slidesPerView: 1.2,
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
Swiper.mockImplementation(() => mockSwiperInstance);
|
|
445
|
+
|
|
446
|
+
document.body.innerHTML = `
|
|
447
|
+
<div class="carousel" data-carousel-id="test-carousel" id="test-carousel">
|
|
448
|
+
<div class="carousel__viewport">
|
|
449
|
+
<div class="carousel__track">
|
|
450
|
+
<div class="carousel__slide">Slide 1</div>
|
|
451
|
+
<div class="carousel__slide">Slide 2</div>
|
|
452
|
+
<div class="carousel__slide">Slide 3</div>
|
|
453
|
+
</div>
|
|
454
|
+
</div>
|
|
455
|
+
<div class="carousel__pagination"></div>
|
|
456
|
+
</div>
|
|
457
|
+
`;
|
|
458
|
+
|
|
459
|
+
carouselElement = document.querySelector(".carousel");
|
|
460
|
+
global.requestAnimationFrame = jest.fn((cb) => cb());
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
afterEach(() => {
|
|
464
|
+
document.body.innerHTML = "";
|
|
465
|
+
global.requestAnimationFrame = undefined;
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
describe("Auto-disable when content fits", () => {
|
|
469
|
+
it("should enable carousel when more slides than slidesPerView", () => {
|
|
470
|
+
// 3 slides, slidesPerView 1.2
|
|
471
|
+
mockSwiperInstance.slides = [
|
|
472
|
+
document.createElement("div"),
|
|
473
|
+
document.createElement("div"),
|
|
474
|
+
document.createElement("div"),
|
|
475
|
+
];
|
|
476
|
+
mockSwiperInstance.params.slidesPerView = 1.2;
|
|
477
|
+
|
|
478
|
+
carouselInstance = new Carousel(carouselElement);
|
|
479
|
+
|
|
480
|
+
expect(mockSwiperInstance.enable).toHaveBeenCalled();
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it("should disable carousel when slides match slidesPerView", () => {
|
|
484
|
+
// 2 slides, slidesPerView 2
|
|
485
|
+
mockSwiperInstance.slides = [
|
|
486
|
+
document.createElement("div"),
|
|
487
|
+
document.createElement("div"),
|
|
488
|
+
];
|
|
489
|
+
mockSwiperInstance.params.slidesPerView = 2;
|
|
490
|
+
|
|
491
|
+
carouselInstance = new Carousel(carouselElement);
|
|
492
|
+
|
|
493
|
+
expect(mockSwiperInstance.disable).toHaveBeenCalled();
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
it("should disable carousel when slides less than slidesPerView", () => {
|
|
497
|
+
// 1 slide, slidesPerView 3
|
|
498
|
+
mockSwiperInstance.slides = [document.createElement("div")];
|
|
499
|
+
mockSwiperInstance.params.slidesPerView = 3;
|
|
500
|
+
|
|
501
|
+
carouselInstance = new Carousel(carouselElement);
|
|
502
|
+
|
|
503
|
+
expect(mockSwiperInstance.disable).toHaveBeenCalled();
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
it("should enable carousel when slides exceed slidesPerView by more than 1", () => {
|
|
507
|
+
// 5 slides, slidesPerView 2
|
|
508
|
+
mockSwiperInstance.slides = [
|
|
509
|
+
document.createElement("div"),
|
|
510
|
+
document.createElement("div"),
|
|
511
|
+
document.createElement("div"),
|
|
512
|
+
document.createElement("div"),
|
|
513
|
+
document.createElement("div"),
|
|
514
|
+
];
|
|
515
|
+
mockSwiperInstance.params.slidesPerView = 2;
|
|
516
|
+
|
|
517
|
+
carouselInstance = new Carousel(carouselElement);
|
|
518
|
+
|
|
519
|
+
expect(mockSwiperInstance.enable).toHaveBeenCalled();
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
describe("Update state on resize/breakpoint change", () => {
|
|
524
|
+
it("should update carousel enabled state on resize event", () => {
|
|
525
|
+
mockSwiperInstance.slides = [
|
|
526
|
+
document.createElement("div"),
|
|
527
|
+
document.createElement("div"),
|
|
528
|
+
];
|
|
529
|
+
mockSwiperInstance.params.slidesPerView = 2;
|
|
530
|
+
|
|
531
|
+
carouselInstance = new Carousel(carouselElement);
|
|
532
|
+
|
|
533
|
+
// Clear previous calls
|
|
534
|
+
mockSwiperInstance.disable.mockClear();
|
|
535
|
+
mockSwiperInstance.enable.mockClear();
|
|
536
|
+
|
|
537
|
+
// Simulate resize event with different breakpoint
|
|
538
|
+
mockSwiperInstance.slides = [
|
|
539
|
+
document.createElement("div"),
|
|
540
|
+
document.createElement("div"),
|
|
541
|
+
document.createElement("div"),
|
|
542
|
+
document.createElement("div"),
|
|
543
|
+
];
|
|
544
|
+
mockSwiperInstance.params.slidesPerView = 3;
|
|
545
|
+
|
|
546
|
+
// Get the resize callback
|
|
547
|
+
const resizeCallback = mockSwiperInstance.on.mock.calls.find(
|
|
548
|
+
(call) => call[0] === "resize",
|
|
549
|
+
);
|
|
550
|
+
if (resizeCallback) {
|
|
551
|
+
resizeCallback[1]();
|
|
552
|
+
expect(mockSwiperInstance.enable).toHaveBeenCalled();
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
it("should handle resize with decimal slidesPerView", () => {
|
|
557
|
+
mockSwiperInstance.slides = [
|
|
558
|
+
document.createElement("div"),
|
|
559
|
+
document.createElement("div"),
|
|
560
|
+
document.createElement("div"),
|
|
561
|
+
document.createElement("div"),
|
|
562
|
+
];
|
|
563
|
+
mockSwiperInstance.params.slidesPerView = 2.5;
|
|
564
|
+
|
|
565
|
+
carouselInstance = new Carousel(carouselElement);
|
|
566
|
+
|
|
567
|
+
// 4 slides > 2.5, should be enabled
|
|
568
|
+
expect(mockSwiperInstance.enable).toHaveBeenCalled();
|
|
569
|
+
});
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
describe("Edge cases for auto-disable", () => {
|
|
573
|
+
it("should handle carousel with no slides", () => {
|
|
574
|
+
mockSwiperInstance.slides = [];
|
|
575
|
+
mockSwiperInstance.params.slidesPerView = 1;
|
|
576
|
+
|
|
577
|
+
carouselInstance = new Carousel(carouselElement);
|
|
578
|
+
|
|
579
|
+
expect(mockSwiperInstance.disable).toHaveBeenCalled();
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
it("should handle slidesPerView as string number", () => {
|
|
583
|
+
mockSwiperInstance.slides = [
|
|
584
|
+
document.createElement("div"),
|
|
585
|
+
document.createElement("div"),
|
|
586
|
+
];
|
|
587
|
+
mockSwiperInstance.params.slidesPerView = "2";
|
|
588
|
+
|
|
589
|
+
carouselInstance = new Carousel(carouselElement);
|
|
590
|
+
|
|
591
|
+
expect(mockSwiperInstance.disable).toHaveBeenCalled();
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
it("should default to slidesPerView 1 if not specified", () => {
|
|
595
|
+
mockSwiperInstance.slides = [
|
|
596
|
+
document.createElement("div"),
|
|
597
|
+
document.createElement("div"),
|
|
598
|
+
];
|
|
599
|
+
mockSwiperInstance.params.slidesPerView = undefined;
|
|
600
|
+
|
|
601
|
+
carouselInstance = new Carousel(carouselElement);
|
|
602
|
+
|
|
603
|
+
// 2 slides > 1 (default), should be enabled
|
|
604
|
+
expect(mockSwiperInstance.enable).toHaveBeenCalled();
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
it("should not crash if updateCarouselEnabledState called without instance", () => {
|
|
608
|
+
carouselInstance = new Carousel(carouselElement);
|
|
609
|
+
carouselInstance.instance = null;
|
|
610
|
+
|
|
611
|
+
expect(() => {
|
|
612
|
+
carouselInstance.updateCarouselEnabledState();
|
|
613
|
+
}).not.toThrow();
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
});
|
|
@@ -272,4 +272,62 @@ describe("rendering Carousel", () => {
|
|
|
272
272
|
expect(carousel).toHaveAttribute("data-carousel-id", "test-data-id");
|
|
273
273
|
});
|
|
274
274
|
});
|
|
275
|
+
|
|
276
|
+
describe("Auto-disable feature", () => {
|
|
277
|
+
const items = [
|
|
278
|
+
<p key="item1">item1</p>,
|
|
279
|
+
<p key="item2">item2</p>,
|
|
280
|
+
<p key="item3">item3</p>,
|
|
281
|
+
];
|
|
282
|
+
|
|
283
|
+
it("should render carousel element with id for auto-disable feature", () => {
|
|
284
|
+
const { container } = render(
|
|
285
|
+
<Carousel id="auto-disable-test" items={items} />,
|
|
286
|
+
);
|
|
287
|
+
const carousel = container.querySelector(".carousel");
|
|
288
|
+
expect(carousel).toHaveAttribute("id", "auto-disable-test");
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it("should support swiperOptions with slidesPerView for auto-disable", () => {
|
|
292
|
+
const swiperOptions = {
|
|
293
|
+
slidesPerView: 2,
|
|
294
|
+
breakpoints: {
|
|
295
|
+
1240: {
|
|
296
|
+
slidesPerView: 3,
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
const { container } = render(
|
|
301
|
+
<Carousel items={items} swiperOptions={swiperOptions} />,
|
|
302
|
+
);
|
|
303
|
+
const carousel = container.querySelector(".carousel");
|
|
304
|
+
expect(carousel.getAttribute("data-swiper-options")).toContain(
|
|
305
|
+
"slidesPerView",
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
it("should work with bleedRight carousel and auto-disable", () => {
|
|
310
|
+
const { container } = render(
|
|
311
|
+
<Carousel items={items} bleedRight showScrollbar />,
|
|
312
|
+
);
|
|
313
|
+
const carousel = container.querySelector(".carousel");
|
|
314
|
+
expect(carousel).toHaveClass("carousel--bleed-right");
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it("should support minimal slides for testing auto-disable", () => {
|
|
318
|
+
const minimalItems = [<p key="item1">item1</p>];
|
|
319
|
+
const { container } = render(<Carousel items={minimalItems} />);
|
|
320
|
+
const slides = container.getElementsByClassName("carousel__slide");
|
|
321
|
+
expect(slides.length).toBe(1);
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it("should support many slides for testing auto-disable with high slidesPerView", () => {
|
|
325
|
+
const manyItems = Array.from({ length: 10 }, (_, i) => (
|
|
326
|
+
<p key={`item${i}`}>item{i}</p>
|
|
327
|
+
));
|
|
328
|
+
const { container } = render(<Carousel items={manyItems} />);
|
|
329
|
+
const slides = container.getElementsByClassName("carousel__slide");
|
|
330
|
+
expect(slides.length).toBe(10);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
275
333
|
});
|
|
@@ -13,35 +13,34 @@ export default class Expander {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
toggle() {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const summary = this.element.querySelector("summary");
|
|
17
|
+
|
|
19
18
|
if (!summary) {
|
|
20
19
|
return;
|
|
21
20
|
}
|
|
22
|
-
|
|
23
|
-
const summaryText = summary.getAttribute(
|
|
24
|
-
const summaryOpenedText = summary.getAttribute(
|
|
21
|
+
|
|
22
|
+
const summaryText = summary.getAttribute("data-summary");
|
|
23
|
+
const summaryOpenedText = summary.getAttribute("data-summary-opened");
|
|
25
24
|
|
|
26
25
|
summary.setAttribute(
|
|
27
|
-
|
|
28
|
-
summary.getAttribute(
|
|
26
|
+
"aria-expanded",
|
|
27
|
+
summary.getAttribute("aria-expanded") === "true" ? "false" : "true",
|
|
29
28
|
);
|
|
30
29
|
|
|
31
30
|
if (summaryOpenedText) {
|
|
32
31
|
const text =
|
|
33
|
-
summary.getAttribute(
|
|
32
|
+
summary.getAttribute("aria-expanded") === "true"
|
|
34
33
|
? summaryOpenedText
|
|
35
34
|
: summaryText;
|
|
36
35
|
|
|
37
36
|
if (text) {
|
|
38
|
-
summary.setAttribute(
|
|
37
|
+
summary.setAttribute("aria-label", text);
|
|
39
38
|
}
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
init() {
|
|
44
|
-
this.element.addEventListener(
|
|
43
|
+
this.element.addEventListener("toggle", this.toggle);
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
update() {
|
|
@@ -50,7 +49,7 @@ export default class Expander {
|
|
|
50
49
|
}
|
|
51
50
|
|
|
52
51
|
destroy() {
|
|
53
|
-
this.element.removeEventListener(
|
|
52
|
+
this.element.removeEventListener("toggle", this.toggle);
|
|
54
53
|
}
|
|
55
54
|
|
|
56
55
|
static getInstance(el: HTMLElementWithExpander | null): Expander | null {
|
|
@@ -68,7 +68,7 @@ const Footer: React.FC<FooterProps> = ({ className, data = footerData }) => {
|
|
|
68
68
|
<div className={CLASS_GRID}>
|
|
69
69
|
{data.columns.map((column, index) => (
|
|
70
70
|
<div key={`footer-column-${index}`}>
|
|
71
|
-
<
|
|
71
|
+
<p className={CLASS_TITLE}>{column.title}</p>
|
|
72
72
|
<ul className={CLASS_LIST}>
|
|
73
73
|
{column.links.map((link, linkIndex) => (
|
|
74
74
|
<li
|
|
@@ -107,14 +107,14 @@ describe("Footer Conformance Tests", () => {
|
|
|
107
107
|
|
|
108
108
|
describe("Semantic HTML", () => {
|
|
109
109
|
it("uses proper semantic elements", () => {
|
|
110
|
-
const { getByRole, getAllByRole } = render(<Footer />);
|
|
110
|
+
const { getByRole, getAllByRole, container } = render(<Footer />);
|
|
111
111
|
|
|
112
112
|
// Footer should be a landmark
|
|
113
113
|
expect(getByRole("contentinfo")).toBeInTheDocument();
|
|
114
114
|
|
|
115
|
-
// Should have proper
|
|
116
|
-
const
|
|
117
|
-
expect(
|
|
115
|
+
// Should have proper column titles (now rendered as paragraphs with footer__title class)
|
|
116
|
+
const titles = container.querySelectorAll(".footer__title");
|
|
117
|
+
expect(titles.length).toBe(4); // One for each column
|
|
118
118
|
|
|
119
119
|
// Should have navigation lists
|
|
120
120
|
const lists = getAllByRole("list");
|
|
@@ -115,14 +115,14 @@ describe("Footer", () => {
|
|
|
115
115
|
});
|
|
116
116
|
|
|
117
117
|
it("has proper semantic structure", () => {
|
|
118
|
-
const { getByRole, getAllByRole } = render(<Footer />);
|
|
118
|
+
const { getByRole, getAllByRole, container } = render(<Footer />);
|
|
119
119
|
|
|
120
120
|
// Should have footer landmark
|
|
121
121
|
expect(getByRole("contentinfo")).toBeInTheDocument();
|
|
122
122
|
|
|
123
|
-
// Should have
|
|
124
|
-
const
|
|
125
|
-
expect(
|
|
123
|
+
// Should have column titles (now rendered as paragraphs with footer__title class)
|
|
124
|
+
const titles = container.querySelectorAll(".footer__title");
|
|
125
|
+
expect(titles).toHaveLength(4); // 4 columns
|
|
126
126
|
|
|
127
127
|
// Should have lists for navigation
|
|
128
128
|
const lists = getAllByRole("list");
|
|
@@ -81,12 +81,9 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
81
81
|
data-hide-when-sticky="true"
|
|
82
82
|
>
|
|
83
83
|
<div className={CLASS_CONTAINER}>
|
|
84
|
-
<h2 id="top-menu-title" className="sr-only">
|
|
85
|
-
Top menu
|
|
86
|
-
</h2>
|
|
87
84
|
<ul
|
|
88
85
|
className={cx(CLASS_NAV, CLASS_NAV_SPACE_SMALL)}
|
|
89
|
-
aria-
|
|
86
|
+
aria-label="Top menu"
|
|
90
87
|
>
|
|
91
88
|
<li className={CLASS_NAV_ITEM}>
|
|
92
89
|
<a
|
|
@@ -123,10 +120,7 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
123
120
|
|
|
124
121
|
<div className={CLASS_MAIN}>
|
|
125
122
|
<div className={CLASS_CONTAINER}>
|
|
126
|
-
<
|
|
127
|
-
Hlavné menu
|
|
128
|
-
</h2>
|
|
129
|
-
<ul className={CLASS_NAV} aria-labelledby="menu-title">
|
|
123
|
+
<ul className={CLASS_NAV} aria-label="Hlavné menu">
|
|
130
124
|
<li className={cx(CLASS_NAV_ITEM, CLASS_NAV_ITEM_MAIN)}>
|
|
131
125
|
<a
|
|
132
126
|
href="#"
|
|
@@ -199,62 +193,75 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
199
193
|
</div>
|
|
200
194
|
|
|
201
195
|
<div className={CLASS_CARD}>
|
|
202
|
-
<
|
|
196
|
+
<p id="pausaly-heading" className={CLASS_TEXT_LARGE}>
|
|
197
|
+
Internet
|
|
198
|
+
</p>
|
|
203
199
|
<ul
|
|
204
200
|
className={CLASS_SUBNAV}
|
|
205
201
|
role="group"
|
|
206
202
|
aria-labelledby="pausaly-heading"
|
|
207
203
|
>
|
|
208
204
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
209
|
-
<a href="#">Prehľad
|
|
205
|
+
<a href="#">Prehľad internetu</a>
|
|
210
206
|
</li>
|
|
211
207
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
212
|
-
<a href="#">
|
|
208
|
+
<a href="#">Mobilný internet</a>
|
|
213
209
|
</li>
|
|
214
210
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
215
|
-
<a href="#">
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
CLASS_TAG_ORANGE,
|
|
220
|
-
CLASS_TAG_SMALL,
|
|
221
|
-
)}
|
|
222
|
-
>
|
|
223
|
-
Novinka
|
|
224
|
-
</span>
|
|
211
|
+
<a href="#">Bezpečný internet so sebou</a>
|
|
212
|
+
</li>
|
|
213
|
+
<li className={CLASS_SUBNAV_ITEM}>
|
|
214
|
+
<a href="#">Domáca linka k internetu</a>
|
|
225
215
|
</li>
|
|
226
216
|
</ul>
|
|
227
217
|
|
|
228
|
-
<
|
|
229
|
-
|
|
230
|
-
|
|
218
|
+
<p
|
|
219
|
+
id="volania-s-kreditom-heading"
|
|
220
|
+
className={CLASS_TEXT_LARGE}
|
|
221
|
+
>
|
|
222
|
+
Televízia
|
|
223
|
+
</p>
|
|
231
224
|
<ul
|
|
232
225
|
className={CLASS_SUBNAV}
|
|
233
226
|
role="group"
|
|
234
227
|
aria-labelledby="volania-s-kreditom-heading"
|
|
235
228
|
>
|
|
236
229
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
237
|
-
<a href="#">
|
|
230
|
+
<a href="#">Najlepšia TV na doma</a>
|
|
231
|
+
</li>
|
|
232
|
+
<li className={CLASS_SUBNAV_ITEM}>
|
|
233
|
+
<a href="#">TV cez satelit</a>
|
|
238
234
|
</li>
|
|
239
235
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
240
|
-
<a href="#">
|
|
236
|
+
<a href="#">TV cez internet</a>
|
|
241
237
|
</li>
|
|
242
238
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
243
|
-
<a href="#">
|
|
239
|
+
<a href="#">Novinky na Orange TV</a>
|
|
244
240
|
</li>
|
|
245
241
|
</ul>
|
|
246
242
|
|
|
247
|
-
<
|
|
243
|
+
<p id="zahranicie-heading" className={CLASS_TEXT_LARGE}>
|
|
244
|
+
Internet + televízia
|
|
245
|
+
</p>
|
|
248
246
|
<ul
|
|
249
247
|
className={CLASS_SUBNAV}
|
|
250
248
|
role="group"
|
|
251
249
|
aria-labelledby="zahranicie-heading"
|
|
252
250
|
>
|
|
253
251
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
254
|
-
<a href="#">
|
|
252
|
+
<a href="#">Ponuka Love</a>{" "}
|
|
253
|
+
<span
|
|
254
|
+
className={cx(
|
|
255
|
+
CLASS_TAG,
|
|
256
|
+
CLASS_TAG_ORANGE,
|
|
257
|
+
CLASS_TAG_SMALL,
|
|
258
|
+
)}
|
|
259
|
+
>
|
|
260
|
+
Novinka
|
|
261
|
+
</span>
|
|
255
262
|
</li>
|
|
256
263
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
257
|
-
<a href="#">
|
|
264
|
+
<a href="#">Výhodný pár zariadení</a>
|
|
258
265
|
</li>
|
|
259
266
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
260
267
|
<a href="#">Volania do zahraničia</a>
|
|
@@ -266,36 +273,29 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
266
273
|
</div>
|
|
267
274
|
|
|
268
275
|
<div className={CLASS_CARD}>
|
|
269
|
-
<
|
|
276
|
+
<p
|
|
277
|
+
id="nase-sluzby-heading"
|
|
278
|
+
className={CLASS_TEXT_LARGE}
|
|
279
|
+
>
|
|
280
|
+
Ste náš zákazník?
|
|
281
|
+
</p>
|
|
270
282
|
<ul
|
|
271
283
|
className={CLASS_SUBNAV}
|
|
272
284
|
role="group"
|
|
273
285
|
aria-labelledby="nase-sluzby-heading"
|
|
274
286
|
>
|
|
275
|
-
<li className={CLASS_SUBNAV_ITEM}>
|
|
276
|
-
<a href="#">Chcem zmeniť paušál</a>
|
|
277
|
-
</li>
|
|
278
|
-
<li className={CLASS_SUBNAV_ITEM}>
|
|
279
|
-
<a href="#">Dobiť kredit</a>
|
|
280
|
-
</li>
|
|
281
287
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
282
288
|
<a href="#">Predĺžiť služby</a>
|
|
283
289
|
</li>
|
|
284
290
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
285
|
-
<a href="#">
|
|
291
|
+
<a href="#">Nový internet</a>
|
|
286
292
|
</li>
|
|
287
293
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
288
|
-
<a href="#">
|
|
289
|
-
</li>
|
|
290
|
-
<li className={CLASS_SUBNAV_ITEM}>
|
|
291
|
-
<a href="#">Orange Svojim</a>
|
|
294
|
+
<a href="#">Nová televízia</a>
|
|
292
295
|
</li>
|
|
293
296
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
294
297
|
<a href="#">Odporučte Orange</a>
|
|
295
298
|
</li>
|
|
296
|
-
<li className={CLASS_SUBNAV_ITEM}>
|
|
297
|
-
<a href="#">Ostatné služby</a>
|
|
298
|
-
</li>
|
|
299
299
|
</ul>
|
|
300
300
|
</div>
|
|
301
301
|
</div>
|
|
@@ -394,10 +394,10 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
394
394
|
CLASS_INPUT,
|
|
395
395
|
CLASS_INPUT_SEARCH_ICON_WITH_PLACEHOLDER,
|
|
396
396
|
)}
|
|
397
|
-
id="search-
|
|
397
|
+
id="megamenu-search-input"
|
|
398
398
|
type="text"
|
|
399
399
|
placeholder="Search"
|
|
400
|
-
name="search
|
|
400
|
+
name="search"
|
|
401
401
|
defaultValue={searchEmpty ? "" : "apple"}
|
|
402
402
|
/>
|
|
403
403
|
{searchEmpty ? (
|
|
@@ -558,10 +558,10 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
558
558
|
CLASS_INPUT,
|
|
559
559
|
CLASS_INPUT_SEARCH_ICON_WITH_PLACEHOLDER,
|
|
560
560
|
)}
|
|
561
|
-
id="search-
|
|
561
|
+
id="megamenu-mobile-search-input"
|
|
562
562
|
type="text"
|
|
563
563
|
placeholder="Search"
|
|
564
|
-
name="search
|
|
564
|
+
name="search"
|
|
565
565
|
/>
|
|
566
566
|
<ul className={cx(CLASS_SUBNAV, "hide")}>
|
|
567
567
|
<li className={CLASS_SUBNAV_ITEM}>
|
|
@@ -647,7 +647,12 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
647
647
|
</ul>
|
|
648
648
|
</div>
|
|
649
649
|
<div>
|
|
650
|
-
<
|
|
650
|
+
<p
|
|
651
|
+
id="mobile-internet-heading"
|
|
652
|
+
className={CLASS_TEXT_LARGE}
|
|
653
|
+
>
|
|
654
|
+
Internet
|
|
655
|
+
</p>
|
|
651
656
|
<ul
|
|
652
657
|
className={CLASS_SUBNAV}
|
|
653
658
|
role="group"
|
|
@@ -667,7 +672,12 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
667
672
|
</li>
|
|
668
673
|
</ul>
|
|
669
674
|
|
|
670
|
-
<
|
|
675
|
+
<p
|
|
676
|
+
id="mobile-tv-heading"
|
|
677
|
+
className={CLASS_TEXT_LARGE}
|
|
678
|
+
>
|
|
679
|
+
Televízia
|
|
680
|
+
</p>
|
|
671
681
|
<ul
|
|
672
682
|
className={CLASS_SUBNAV}
|
|
673
683
|
role="group"
|
|
@@ -687,9 +697,12 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
687
697
|
</li>
|
|
688
698
|
</ul>
|
|
689
699
|
|
|
690
|
-
<
|
|
700
|
+
<p
|
|
701
|
+
id="mobile-internet-tv-heading"
|
|
702
|
+
className={CLASS_TEXT_LARGE}
|
|
703
|
+
>
|
|
691
704
|
Internet + televízia
|
|
692
|
-
</
|
|
705
|
+
</p>
|
|
693
706
|
<ul
|
|
694
707
|
className={CLASS_SUBNAV}
|
|
695
708
|
role="group"
|
|
@@ -718,9 +731,12 @@ export const Megamenu = ({ className, searchEmpty }: MegamenuProps) => {
|
|
|
718
731
|
</li>
|
|
719
732
|
</ul>
|
|
720
733
|
|
|
721
|
-
<
|
|
734
|
+
<p
|
|
735
|
+
id="mobile-customer-heading"
|
|
736
|
+
className={CLASS_TEXT_LARGE}
|
|
737
|
+
>
|
|
722
738
|
Ste náš zákazník?
|
|
723
|
-
</
|
|
739
|
+
</p>
|
|
724
740
|
<ul
|
|
725
741
|
className={CLASS_SUBNAV}
|
|
726
742
|
role="group"
|