iceholidays-frontend 0.2.0 → 0.4.0

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/iceholidays/frontend/application.sass.scss +1588 -0
  3. data/app/assets/stylesheets/iceholidays/frontend/common.scss +233 -0
  4. data/app/assets/stylesheets/iceholidays/frontend/layout.scss +188 -0
  5. data/app/assets/stylesheets/iceholidays/frontend/utils/_antd_overrides.scss +107 -0
  6. data/app/assets/stylesheets/iceholidays/frontend/utils/_variables.scss +3 -0
  7. data/app/assets/stylesheets/iceholidays/frontend/widgets/filter_pills.scss +45 -0
  8. data/app/assets/stylesheets/iceholidays/frontend/widgets/search_bar.scss +112 -0
  9. data/app/controllers/iceholidays/frontend/application_controller.rb +1 -0
  10. data/app/controllers/iceholidays/frontend/site_controller.rb +32 -0
  11. data/app/javascript/api-services/banners-api.service.ts +28 -0
  12. data/app/javascript/api-services/locations-api.service.ts +49 -0
  13. data/app/javascript/api-services/search-api.service.ts +16 -0
  14. data/app/javascript/api-services/series-api.service.ts +44 -0
  15. data/app/javascript/api-services/testimonials-api.service.ts +27 -0
  16. data/app/javascript/interfaces/banner.interface.ts +10 -0
  17. data/app/javascript/interfaces/country.interface.ts +18 -0
  18. data/app/javascript/interfaces/itinerary.interface.ts +18 -0
  19. data/app/javascript/interfaces/testimonial.interface.ts +6 -0
  20. data/app/javascript/react/App.tsx +32 -0
  21. data/app/javascript/react/components/Destinations.tsx +67 -165
  22. data/app/javascript/react/components/Testimonials.tsx +75 -48
  23. data/app/javascript/react/components/shared/Headline.tsx +29 -0
  24. data/app/javascript/react/components/shared/Postcard.tsx +31 -0
  25. data/app/javascript/react/components/shared/RibbonSection.tsx +21 -0
  26. data/app/javascript/react/components/shared/SlickButtonFix.tsx +19 -0
  27. data/app/javascript/react/index.js +3 -5
  28. data/app/javascript/react/layouts/MainFooter.tsx +72 -0
  29. data/app/javascript/react/layouts/MainHeader.tsx +45 -0
  30. data/app/javascript/react/layouts/MainLayout.tsx +21 -0
  31. data/app/javascript/react/pages/AboutUsPage.tsx +95 -0
  32. data/app/javascript/react/pages/BlogPage.tsx +79 -0
  33. data/app/javascript/react/pages/BlogShowPage.tsx +43 -0
  34. data/app/javascript/react/pages/ContactAgentsPage.tsx +16 -0
  35. data/app/javascript/react/pages/ContactUsPage.tsx +122 -0
  36. data/app/javascript/react/pages/CountriesPage.tsx +62 -0
  37. data/app/javascript/react/pages/Homepage.tsx +90 -0
  38. data/app/javascript/react/pages/ListingPage.tsx +246 -0
  39. data/app/javascript/react/pages/ShowPage.tsx +397 -0
  40. data/app/javascript/react/widgets/FilterPills.tsx +77 -0
  41. data/app/javascript/react/widgets/SearchBarWidget.tsx +42 -0
  42. data/app/views/iceholidays/frontend/site/index.html.erb +1 -24
  43. data/app/views/layouts/iceholidays/frontend/application.html.erb +3 -7
  44. data/config/routes.rb +9 -0
  45. data/lib/iceholidays/frontend/engine.rb +11 -4
  46. data/lib/iceholidays/frontend/version.rb +1 -1
  47. data/public/iceholidays-assets/application.css +1873 -0
  48. data/public/iceholidays-assets/application.js +430 -0
  49. data/public/iceholidays-assets/application.js.map +7 -0
  50. data/public/iceholidays-assets/images/8D7N.png +0 -0
  51. data/public/iceholidays-assets/images/about_us.png +0 -0
  52. data/public/iceholidays-assets/images/about_us2.png +0 -0
  53. data/public/iceholidays-assets/images/banner_arrow.png +0 -0
  54. data/public/iceholidays-assets/images/banner_right_arrow.png +0 -0
  55. data/public/iceholidays-assets/images/blog.png +0 -0
  56. data/public/iceholidays-assets/images/blog1.png +0 -0
  57. data/public/iceholidays-assets/images/certificate1.png +0 -0
  58. data/public/iceholidays-assets/images/certificate2.png +0 -0
  59. data/public/iceholidays-assets/images/china_southern_airlines.png +0 -0
  60. data/public/iceholidays-assets/images/china_southern_airlines_icon.png +0 -0
  61. data/public/iceholidays-assets/images/competitiveness.png +0 -0
  62. data/public/iceholidays-assets/images/contact_agents.png +0 -0
  63. data/public/iceholidays-assets/images/contact_us.png +0 -0
  64. data/public/iceholidays-assets/images/contact_us_form.png +0 -0
  65. data/public/iceholidays-assets/images/ethical.png +0 -0
  66. data/public/iceholidays-assets/images/hw_logo.png +0 -0
  67. data/public/iceholidays-assets/images/innovative.png +0 -0
  68. data/public/iceholidays-assets/images/plane.png +0 -0
  69. data/public/iceholidays-assets/images/social/ico_fb.png +0 -0
  70. data/public/iceholidays-assets/images/social/ico_ig.png +0 -0
  71. data/public/iceholidays-assets/images/social/ico_twitter.png +0 -0
  72. data/public/iceholidays-assets/images/social/ico_yt.png +0 -0
  73. data/public/iceholidays-assets/images/social.png +0 -0
  74. data/public/iceholidays-assets/images/tour1.png +0 -0
  75. metadata +96 -104
  76. data/app/assets/builds/iceholidays/frontend/5star-GEMYV5WA.digested.png +0 -0
  77. data/app/assets/builds/iceholidays/frontend/Frame71-U6FKYUGB.digested.png +0 -0
  78. data/app/assets/builds/iceholidays/frontend/Layer_1-24HTXUKI.digested.png +0 -0
  79. data/app/assets/builds/iceholidays/frontend/Rectangle49-SVQRLXW6.digested.png +0 -0
  80. data/app/assets/builds/iceholidays/frontend/africa-HBPEOBHM.digested.png +0 -0
  81. data/app/assets/builds/iceholidays/frontend/application.js +0 -293
  82. data/app/assets/builds/iceholidays/frontend/application.js.map +0 -7
  83. data/app/assets/builds/iceholidays/frontend/banner1-OM6SQ5GW.digested.png +0 -0
  84. data/app/assets/builds/iceholidays/frontend/banner2-BWOLYVUE.digested.png +0 -0
  85. data/app/assets/builds/iceholidays/frontend/china-DX6D6FE2.digested.png +0 -0
  86. data/app/assets/builds/iceholidays/frontend/china2-FESATHUH.digested.png +0 -0
  87. data/app/assets/builds/iceholidays/frontend/guangzhou-JGSVPIYY.digested.png +0 -0
  88. data/app/assets/builds/iceholidays/frontend/guilin-AXXU7K32.digested.png +0 -0
  89. data/app/assets/builds/iceholidays/frontend/harbin-2YJL7HHH.digested.png +0 -0
  90. data/app/assets/builds/iceholidays/frontend/hongkong-IPUEZ35P.digested.png +0 -0
  91. data/app/assets/builds/iceholidays/frontend/inner_mongolia-EURVGQVT.digested.png +0 -0
  92. data/app/assets/builds/iceholidays/frontend/jiangxi-DTEOQGIY.digested.png +0 -0
  93. data/app/assets/builds/iceholidays/frontend/kenya-F5ZJOIBS.digested.png +0 -0
  94. data/app/assets/builds/iceholidays/frontend/kenya2-CCJWJDUN.digested.png +0 -0
  95. data/app/assets/builds/iceholidays/frontend/kunming-OCHNG2UW.digested.png +0 -0
  96. data/app/assets/builds/iceholidays/frontend/slikroad-CVUSDDRO.digested.png +0 -0
  97. data/app/assets/builds/iceholidays/frontend/southafrica-HBPEOBHM.digested.png +0 -0
  98. data/app/assets/builds/iceholidays/frontend/tanzania-VJSRMTCY.digested.png +0 -0
  99. data/app/assets/builds/iceholidays/frontend/uganda-H4JWFN3A.digested.png +0 -0
  100. data/app/assets/stylesheets/iceholidays/frontend/application.scss +0 -850
  101. data/app/javascript/react/components/Homepage.tsx +0 -16
  102. data/app/javascript/react/components/HomepageBanner.tsx +0 -54
  103. data/app/views/layouts/iceholidays/frontend/shared/_footer.html.erb +0 -42
  104. data/app/views/layouts/iceholidays/frontend/shared/_header.html.erb +0 -20
  105. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/5star.png +0 -0
  106. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/Frame71.png +0 -0
  107. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/Group_71.png +0 -0
  108. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/Layer_1.png +0 -0
  109. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/Rectangle49.png +0 -0
  110. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/TS_Logo.png +0 -0
  111. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/about_st_bg.png +0 -0
  112. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/africa.png +0 -0
  113. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/banner1.png +0 -0
  114. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/banner2.png +0 -0
  115. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/china.png +0 -0
  116. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/china2.png +0 -0
  117. /data/{app/assets/builds/iceholidays/frontend/chongqing-CCJWJDUN.digested.png → public/iceholidays-assets/images/china_listings_cover.png} +0 -0
  118. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/chongqing.png +0 -0
  119. /data/{app/assets/images/iceholidays/frontend/cover_img.jpeg → public/iceholidays-assets/images/cover_img.jpg} +0 -0
  120. /data/{app/assets/images/iceholidays/frontend/feature.jpeg → public/iceholidays-assets/images/feature.jpg} +0 -0
  121. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/guangzhou.png +0 -0
  122. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/guilin.png +0 -0
  123. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/harbin.png +0 -0
  124. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/hongkong.png +0 -0
  125. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/inner_mongolia.png +0 -0
  126. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/jiangxi.png +0 -0
  127. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/kenya.png +0 -0
  128. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/kenya2.png +0 -0
  129. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/kunming.png +0 -0
  130. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/logo_container.png +0 -0
  131. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/logomark.png +0 -0
  132. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/slikroad.png +0 -0
  133. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/southafrica.png +0 -0
  134. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/tanzania.png +0 -0
  135. /data/{app/assets/images/iceholidays/frontend → public/iceholidays-assets/images}/uganda.png +0 -0
@@ -1,68 +1,95 @@
1
- import { Carousel } from "antd";
1
+ import { Carousel, notification } from "antd";
2
2
  import React from "react";
3
+ import SlickButtonFix from "./shared/SlickButtonFix";
4
+ import { mdiFountainPenTip, mdiMenuLeft, mdiMenuRight } from "@mdi/js";
5
+ import Icon from "@mdi/react";
6
+ import RibbonSection from "./shared/RibbonSection";
7
+ import TestimonialsApi from "../../api-services/testimonials-api.service";
8
+ import { Testimonial } from "../../interfaces/testimonial.interface";
9
+ import createDOMPurify from 'dompurify'
3
10
 
4
- import star5 from "../../../assets/images/iceholidays/frontend/5star.png";
5
- import layer1 from "../../../assets/images/iceholidays/frontend/Layer_1.png";
6
- const contentStyle: React.CSSProperties = {
7
- height: '160px',
8
- color: '#fff',
9
- lineHeight: '160px',
10
- textAlign: 'center',
11
- background: '#364d79',
12
- };
11
+ const DOMPurify = createDOMPurify(window)
12
+
13
+ export default class Testimonials extends React.Component {
14
+ api = new TestimonialsApi;
15
+
16
+ state = {
17
+ reviews: []
18
+ }
19
+
20
+ componentDidMount() {
21
+ this.api.getTestimonials()
22
+ .then(testimonialsData => {
23
+ this.setState({reviews: testimonialsData})
24
+ })
25
+ .catch(error => {
26
+ notification.error({ message: 'An error occured while loading testimonials.'});
27
+ });
28
+ }
29
+
30
+ render(){
31
+ return (
32
+ <RibbonSection title="Testimonial">
33
+ <div id="testimonials">
34
+ <Carousel autoplay arrows dots={false} draggable slidesToScroll= {1} slidesToShow={this.state.reviews.length > 3 ? 3 : this.state.reviews.length}
35
+ prevArrow={
36
+ <SlickButtonFix>
37
+ <Icon path={mdiMenuLeft} size={4} />
38
+ </SlickButtonFix>
39
+ }
40
+ nextArrow={
41
+ <SlickButtonFix>
42
+ <Icon path={mdiMenuRight} size={4} />
43
+ </SlickButtonFix>
44
+ }>
45
+ {
46
+ this.state.reviews.map((review:Testimonial)=>{
47
+ return (
48
+ <div key={review.id} className="testimonial">
49
+ <img src="/iceholidays-assets/images/5star.png" className="stars-icon"/>
50
+ <div className="tour">
51
+ <img src="/iceholidays-assets/images/logomark.png" className="st-logo"/>
52
+ <div>
53
+ <span> {review.tour} </span>
54
+ </div>
55
+ </div>
56
+ <div className="comment">
57
+ <span dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(review.comment) }} />
58
+ </div>
59
+ <div className="author">
60
+ <Icon path={mdiFountainPenTip} size={1} className="author-icon" />
61
+ <span>{review.author}</span>
62
+ </div>
63
+ </div>
64
+ )
65
+ })
66
+ }
67
+ </Carousel>
68
+ </div>
69
+ </RibbonSection>
70
+ )
71
+ }
72
+ }
13
73
 
14
74
  const reviews = [
15
75
  {
16
76
  key: 1,
17
- itinerarySummary: "8D6N 8D6N PREMIUM KOREA: <br/> SPLENDOR OF WINTER",
77
+ itinerarySummaryTitle: "8D6N 8D6N PREMIUM KOREA:",
78
+ itinerarySummaryDesc: "SPLENDOR OF WINTER",
18
79
  comment: "Thanks to our exceptional guide ANDY & MEILAN. 👍👍👍The Korea tour was fantastic,Their deep knowledge and engaging style made the experience truly memorable. Highly recommend for anyone wanting an insightful and enjoyable tour of Korea!🇰🇷 …",
19
80
  customerName: "Evon Ooi"
20
81
  },
21
82
  {
22
83
  key: 2,
23
- itinerarySummary: "review 2",
84
+ itinerarySummaryTitle: "review 2",
24
85
  comment: "Thanks to our exceptional guide ANDY & MEILAN. 👍👍👍The Korea tour was fantastic,Their deep knowledge and engaging style made the experience truly memorable. Highly recommend for anyone wanting an insightful and enjoyable tour of Korea!🇰🇷 …",
25
86
  customerName: "Evon Ooi"
26
87
  },
27
88
  {
28
89
  key: 3,
29
- itinerarySummary: "review 3",
90
+ itinerarySummaryTitle: "review 3",
30
91
  comment: "Thanks to our exceptional guide ANDY & MEILAN. 👍👍👍The Korea tour was fantastic,Their deep knowledge and engaging style made the experience truly memorable. Highly recommend for anyone wanting an insightful and enjoyable tour of Korea!🇰🇷 …",
31
92
  customerName: "Evon Ooi"
32
- }
93
+ },
33
94
  ]
34
95
 
35
- function Testimonials(){
36
- return (
37
- <div id="testimonial">
38
- <div id="testimonial-header" style={{backgroundImage: "url("+ layer1+")"}}>
39
- <span>Testimonial</span>
40
- </div>
41
-
42
- <div id="testimonials">
43
- <Carousel arrows slidesToScroll= {1} slidesToShow={3}>
44
- {
45
- reviews?.map((review)=>{
46
- return (
47
- <div key={review.key} className="testimonial">
48
- <img src={star5} className="stars-icon"/>
49
- <div className="itinerary-summary">
50
- <span> {review.itinerarySummary} </span>
51
- </div>
52
- <div className="comment">
53
- <span>{review.comment}</span>
54
- </div>
55
- <div className="customer-name">
56
- <span>{review.customerName}</span>
57
- </div>
58
- </div>
59
- )
60
- })
61
- }
62
- </Carousel>
63
- </div>
64
- </div>
65
- )
66
- }
67
-
68
- export default Testimonials;
@@ -0,0 +1,29 @@
1
+ import { Breadcrumb } from "antd";
2
+ import React, { JSX } from "react";
3
+ import SearchBarWidget from "../../widgets/SearchBarWidget";
4
+
5
+
6
+ const Headline = (
7
+ props: {
8
+ bannerImage: string;
9
+ title?: string;
10
+ children?: JSX.Element;
11
+ breadcrumbs: any[];
12
+ }
13
+ ) => {
14
+ const { bannerImage, title, children, breadcrumbs } = props;
15
+ return (
16
+ <>
17
+ <SearchBarWidget/>
18
+ <div id="headline">
19
+ <div id="headline_banner" style={{backgroundImage: `url(${bannerImage})`}}></div>
20
+ <div id="headline_header">
21
+ { title ? <h1> {title} </h1> : children}
22
+ </div>
23
+ <Breadcrumb items={breadcrumbs} separator=">"/>
24
+ </div>
25
+ </>
26
+ )
27
+ }
28
+
29
+ export default Headline;
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { Link } from "react-router-dom";
3
+ import { mdiMenuRight } from "@mdi/js";
4
+ import Icon from "@mdi/react";
5
+
6
+
7
+ const Postcard = (
8
+ props: {
9
+ link: string;
10
+ image: string;
11
+ name: string;
12
+ tourCount: number;
13
+ }
14
+ ) => {
15
+ const { link, image, name, tourCount } = props;
16
+
17
+ const pluralize = (count: number, noun: string, suffix = 's') =>
18
+ `${count} ${noun}${count > 1 ? suffix : ''}`;
19
+
20
+ return (
21
+ <Link to={link} className="postcard">
22
+ <img src={image}/>
23
+ <div className="details">
24
+ <span className="name">{name}</span>
25
+ <span className="tour-count">{pluralize(tourCount, "Tour")} <Icon path={mdiMenuRight} size={1} /> </span>
26
+ </div>
27
+ </Link>
28
+ )
29
+ }
30
+
31
+ export default Postcard;
@@ -0,0 +1,21 @@
1
+ import React, { JSX } from "react";
2
+
3
+ const RibbonSection = (
4
+ props: {
5
+ title?: string;
6
+ children?: JSX.Element;
7
+ }
8
+ ) => {
9
+ const { title, children } = props;
10
+ return (
11
+ <div id="ribbon-section">
12
+ <div id="ribbon-section_header">
13
+ { title && <h1> {title} </h1>}
14
+ </div>
15
+
16
+ {children}
17
+ </div>
18
+ )
19
+ }
20
+
21
+ export default RibbonSection;
@@ -0,0 +1,19 @@
1
+ import React, { JSX } from "react";
2
+
3
+
4
+ const SlickButtonFix = (
5
+ props: {
6
+ children: JSX.Element;
7
+ slideCount?: number;
8
+ currentSlide?: number;
9
+ }
10
+ ) => {
11
+ const { children, currentSlide, slideCount, ...others } = props;
12
+ return (
13
+ <span {...others}>
14
+ {children}
15
+ </span>
16
+ );
17
+ };
18
+
19
+ export default SlickButtonFix;
@@ -1,8 +1,6 @@
1
+
2
+ import App from "./App"
1
3
  import ReactComponent from "./application"
2
- import Destinations from "./components/Destinations"
3
- import HomepageBanner from "./components/HomepageBanner"
4
- import Homepage from "./components/Homepage"
5
- import Testimonials from "./components/Testimonials"
6
4
 
7
5
 
8
- ReactComponent.setup({Homepage, HomepageBanner, Destinations, Testimonials})
6
+ ReactComponent.setup({App})
@@ -0,0 +1,72 @@
1
+ import { notification, Space } from "antd";
2
+ import React from "react";
3
+ import { Link } from "react-router-dom";
4
+ import LocationsApi from "../../api-services/locations-api.service";
5
+ import { Country } from "../../interfaces/country.interface";
6
+
7
+
8
+ export default class MainFooter extends React.Component {
9
+ api = new LocationsApi;
10
+
11
+ state = {
12
+ countries: []
13
+ }
14
+
15
+ componentDidMount() {
16
+ this.api.getCountries()
17
+ .then(locationsData => {
18
+ this.setState({countries: locationsData})
19
+ })
20
+ .catch(error => {
21
+ notification.error({ message: 'An error occured while loading countries.'});
22
+ });
23
+ }
24
+
25
+ render(){
26
+ return (
27
+ <div id="main-footer">
28
+ <div id="main-footer_links">
29
+ <div>
30
+ <div className="link-group-title">Countries</div>
31
+ <div>
32
+ {
33
+ this.state.countries.map((country: Country)=> <Link to={`/app/listing?keyword=${country.name}`}>{country.name}</Link> )
34
+ }
35
+ </div>
36
+ </div>
37
+ <div>
38
+ <div className="link-group-title">&nbsp;</div>
39
+ <div>
40
+ <Link to="/app">home</Link>
41
+ <Link to="/app">pdpa</Link>
42
+ <Link to="/app/about-us">about us</Link>
43
+ <Link to="/app">privacy policy</Link>
44
+ <Link to="/app/contact-us">contact us</Link>
45
+ <Link to="/app">terms & conditions</Link>
46
+ </div>
47
+ </div>
48
+ <div>
49
+ <div>
50
+ <div className="link-group-title">Contact Us</div>
51
+ <div><Link to="/app/contact-agents">contact agents</Link></div>
52
+ </div>
53
+
54
+ <div>
55
+ <div className="link-group-title">Follow us on</div>
56
+ <Space size={20}>
57
+ <img src="/iceholidays-assets/images/social/ico_fb.png"/>
58
+ <img src="/iceholidays-assets/images/social/ico_twitter.png"/>
59
+ <img src="/iceholidays-assets/images/social/ico_yt.png"/>
60
+ <img src="/iceholidays-assets/images/social/ico_ig.png"/>
61
+ </Space>
62
+ </div>
63
+ </div>
64
+ <hr/>
65
+ </div>
66
+ <div id="copyright">
67
+ <span>Copyright © 2024 Golden Destinations</span>
68
+ </div>
69
+ </div>
70
+ )
71
+ }
72
+ }
@@ -0,0 +1,45 @@
1
+ import { mdiFileDownload } from "@mdi/js";
2
+ import Icon from "@mdi/react";
3
+ import { Button } from "antd";
4
+ import React from "react";
5
+ import { NavLink } from "react-router-dom";
6
+
7
+
8
+ const routes = [
9
+ {label: "Home", path: "/app"},
10
+ {label: "About Us", path: "/app/about-us"},
11
+ {label: "Countries", path: "/app/countries"},
12
+ {label: "Blog", path: "/app/blog"}
13
+ ]
14
+
15
+ const routes2 = [
16
+ {label: "Contact Agents", path: "/app/contact-agents"},
17
+ {label: "Contact Us", path: "/app/contact-us"}
18
+ ]
19
+
20
+ const MainHeader = () => {
21
+ return (
22
+ <div id="main-header">
23
+ <div>
24
+ <div className="nav-menu" id="left-menu">
25
+ {
26
+ routes.map((route, index)=> <NavLink key={index} to={route.path} end className={({ isActive }) => (isActive ? 'active' : '')}> {route.label} </NavLink>)
27
+ }
28
+ </div>
29
+ <span className="nav-menu logo">
30
+ <img src="/iceholidays-assets/images/logo_container.png"/>
31
+ </span>
32
+ <div className="nav-menu" id="right-menu">
33
+ {
34
+ routes2.map((route, index)=> <NavLink key={index} to={route.path} end className={({ isActive }) => (isActive ? 'active' : '')}> {route.label} </NavLink>)
35
+ }
36
+ </div>
37
+ </div>
38
+ <a id="get-brochure">
39
+ <Button type="primary"><Icon path={mdiFileDownload} size="18px" /> get brochure</Button>
40
+ </a>
41
+ </div>
42
+ )
43
+ }
44
+
45
+ export default MainHeader;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import { Outlet } from "react-router-dom";
3
+ import { Layout } from 'antd';
4
+ import MainHeader from "./MainHeader";
5
+ import MainFooter from "./MainFooter";
6
+
7
+ const { Content } = Layout;
8
+
9
+ const MainLayout = () => {
10
+ return (
11
+ <Layout>
12
+ <MainHeader/>
13
+ <Content>
14
+ <Outlet/>
15
+ </Content>
16
+ <MainFooter/>
17
+ </Layout>
18
+ )
19
+ };
20
+
21
+ export default MainLayout;
@@ -0,0 +1,95 @@
1
+ import React from "react";
2
+ import Headline from "../components/shared/Headline";
3
+ import { Col, Flex, Row } from "antd";
4
+ import RibbonSection from "../components/shared/RibbonSection";
5
+
6
+ const bannerPath = '/iceholidays-assets/images/about_us.png';
7
+ const breadcrumbs = [
8
+ { title: 'Home' },
9
+ { title: 'About Us' }
10
+ ]
11
+
12
+ const AboutUsPage = React.FC = () => (
13
+ <div id="about-us-page">
14
+ <Headline bannerImage={bannerPath} breadcrumbs={breadcrumbs} title="“WHAT WE DO”"/>
15
+
16
+ <div id="about-us-page_body">
17
+ <div id="introduction">
18
+ <Flex vertical align="center" justify="center">
19
+ <img src="/iceholidays-assets/images/logomark.png"/>
20
+ <h1> Welcome To The Signature Tours </h1>
21
+ </Flex>
22
+ </div>
23
+
24
+ <div id="article">
25
+ <Row gutter={40}>
26
+ <Col span={24}>
27
+ <img src="/iceholidays-assets/images/about_us2.png"/>
28
+ </Col>
29
+ <Col span={12}>
30
+ <p>The Signature Tours was born from a passion for redefining travel. We believe that journeys should be more than just trips—they should be transformative experiences, filled with moments that leave an indelible mark on the soul. Catering to discerning travelers who seek more than the ordinary, The Signature Tours crafts bespoke journeys that combine sophistication, cultural immersion, and unparalleled quality. </p>
31
+ <p>Our story begins with a vision: to create journeys that linger in the heart long after the traveler returns home. Each itinerary we design reflects our dedication to perfection. From the charm of boutique accommodations nestled in picturesque landscapes to handpicked cultural experiences that unveil the soul of a destination, every detail is thoughtfully considered to ensure your journey is as seamless as it is extraordinary.</p>
32
+ <p>At The Signature Tours, we embrace the philosophy of the S-Tours experience—where every moment is a masterpiece. Imagine strolling through the cobblestone streets of a quaint village, savoring the aroma of freshly baked bread as locals welcome you with warm smiles. </p>
33
+ </Col>
34
+ <Col span={12}>
35
+ <p>Picture yourself standing atop a majestic mountain at sunrise,the golden hues of the horizon reflecting the sense of awe within you. These are the kinds of moments we strive to create—authentic, meaningful, and unforgettable.</p>
36
+ <p>But our commitment goes beyond premium and comfort. It’s about forging connections—with places, cultures, and people. It’s about stepping into a story, whether it’s exploring ancient ruins with a seasoned archaeologist, learning the art of wine making from a passionate vintner, or sharing laughter with a local family over a home-cooked meal.</p>
37
+ <p>At The Signature Tours, every journey is an invitation to step out of the ordinary and into a world of wonder. We’re not just about travel; we’re about creating memories that stay with you forever. This is our promise, and this is what we call the S-Tours philosophy where we deliver S-Class Journeys, Signature Memories. Because every journey should be as unique as your signature.</p>
38
+ </Col>
39
+ </Row>
40
+ </div>
41
+
42
+
43
+ </div>
44
+ <RibbonSection>
45
+ <>
46
+ <Row id="quality-policy" gutter={40} justify="center">
47
+ <Col span={24}>
48
+ <div className="section-header">
49
+ <h2>Quality Policy</h2>
50
+ <p>ICE Holidays is committed to striving towards our customer satisfaction in areas of more quality value for money of our products & services. The management and all employees are committed to the company quality policy through effort in:</p>
51
+ </div>
52
+ </Col>
53
+ <Col span={8}>
54
+ <div className="items">
55
+ <img src="/iceholidays-assets/images/innovative.png"/>
56
+ <label>Innovative</label>
57
+ <p>Talent team develops great products and services; Agile, innovative, and a quality conscious team of resourceful people dedicated to the best.</p>
58
+ </div>
59
+ </Col>
60
+ <Col span={8}>
61
+ <div className="items">
62
+ <img src="/iceholidays-assets/images/competitiveness.png"/>
63
+ <label>Competitiveness</label>
64
+ <p>Provide competitive pricing to achieve customer satisfaction.</p>
65
+ </div>
66
+ </Col>
67
+ <Col span={8}>
68
+ <div className="items">
69
+ <img src="/iceholidays-assets/images/ethical.png"/>
70
+ <label>Ethical</label>
71
+ <p>Precedent for an honest, fair and ethical business.</p>
72
+ </div>
73
+ </Col>
74
+ </Row>
75
+
76
+ <Row id="certificates" gutter={24}>
77
+ <Col span={24}>
78
+ <div className="section-header">
79
+ <h2>Our Certificates</h2>
80
+ <p>We have acquired recognition and certificates such as:</p>
81
+ </div>
82
+ </Col>
83
+ <Col span={8}>
84
+ <img src="/iceholidays-assets/images/certificate1.png"/>
85
+ </Col>
86
+ <Col span={8}>
87
+ <img src="/iceholidays-assets/images/certificate2.png"/>
88
+ </Col>
89
+ </Row>
90
+ </>
91
+ </RibbonSection>
92
+ </div>
93
+ );
94
+
95
+ export default AboutUsPage;
@@ -0,0 +1,79 @@
1
+ import React from "react";
2
+ import Headline from "../components/shared/Headline";
3
+ import { Button, Card, Col, Row, Space } from "antd";
4
+ import FilterPills from "../widgets/FilterPills";
5
+ import { Link } from "react-router-dom";
6
+ const { Meta } = Card;
7
+
8
+ const bannerPath = '/iceholidays-assets/images/blog.png';
9
+ const breadcrumbs = [
10
+ { title: 'Home' },
11
+ { title: 'Blog' }
12
+ ]
13
+
14
+ const types = [ "News", "Blogs" ];
15
+ const blogs = [
16
+ {
17
+ id: 1,
18
+ cover: "/iceholidays-assets/images/blog1.png",
19
+ title: "旅游的意义:探索世界与内心的旅程",
20
+ info: "未分类 / 发表评论 / 2024年11月22日",
21
+ summary: "旅游不仅拓展视野,也带来人生的启示。它教会我们谦逊、适应变化、享受过程,激发内心力量,感恩遇见,并帮助我们找回初心。"
22
+ },
23
+ {
24
+ id: 2,
25
+ cover: "/iceholidays-assets/images/blog1.png",
26
+ title: "旅游的意义:探索世界与内心的旅程",
27
+ info: "未分类 / 发表评论 / 2024年11月22日",
28
+ summary: "旅游不仅拓展视野,也带来人生的启示。它教会我们谦逊、适应变化、享受过程,激发内心力量,感恩遇见,并帮助我们找回初心。"
29
+ },
30
+ {
31
+ id: 3,
32
+ cover: "/iceholidays-assets/images/blog1.png",
33
+ title: "旅游的意义:探索世界与内心的旅程",
34
+ info: "未分类 / 发表评论 / 2024年11月22日",
35
+ summary: "旅游不仅拓展视野,也带来人生的启示。它教会我们谦逊、适应变化、享受过程,激发内心力量,感恩遇见,并帮助我们找回初心。"
36
+ },
37
+ ]
38
+
39
+
40
+ const BlogPage = React.FC = () => (
41
+ <div id="blog-page">
42
+ <Headline bannerImage={bannerPath} breadcrumbs={breadcrumbs} title="Blog"/>
43
+
44
+ <div id="blog-page_body">
45
+ <Space size={12} direction="vertical">
46
+ <FilterPills items={types} allOption={true}></FilterPills>
47
+ <FilterPills items="years" title="Year" allOption={true}></FilterPills>
48
+ <FilterPills items="months" title="Month" allOption={true}></FilterPills>
49
+ </Space>
50
+
51
+ <div id="blogs">
52
+ <Row wrap gutter={20}>
53
+ {
54
+ blogs.map(blog => (
55
+ <Col span={8}>
56
+ <Link to={`/app/blog/${blog.id}`}>
57
+ <Card
58
+ hoverable
59
+ cover={<img alt="example" src={blog.cover} />}
60
+ >
61
+ <Meta title={blog.title} description={
62
+ <>
63
+ <span>{blog.info}</span>
64
+ <p>{blog.summary}</p>
65
+ <Button color="primary" variant="outlined" block>阅读更多</Button>
66
+ </>
67
+ } />
68
+ </Card>
69
+ </Link>
70
+ </Col>
71
+ ))
72
+ }
73
+ </Row>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ );
78
+
79
+ export default BlogPage;
@@ -0,0 +1,43 @@
1
+ import React from "react";
2
+ import Headline from "../components/shared/Headline";
3
+
4
+ const bannerPath = '/iceholidays-assets/images/blog.png';
5
+ const breadcrumbs = [
6
+ { title: 'Home' },
7
+ { title: 'Blog' },
8
+ { title: '从斯里兰卡到马尔代夫' },
9
+ ]
10
+
11
+ const types = [ "News", "Blogs" ];
12
+ const blogs = [
13
+ {
14
+ cover: "/iceholidays-assets/images/blog1.png",
15
+ title: "旅游的意义:探索世界与内心的旅程",
16
+ info: "未分类 / 发表评论 / 2024年11月22日",
17
+ summary: "旅游不仅拓展视野,也带来人生的启示。它教会我们谦逊、适应变化、享受过程,激发内心力量,感恩遇见,并帮助我们找回初心。"
18
+ },
19
+ {
20
+ cover: "/iceholidays-assets/images/blog1.png",
21
+ title: "旅游的意义:探索世界与内心的旅程",
22
+ info: "未分类 / 发表评论 / 2024年11月22日",
23
+ summary: "旅游不仅拓展视野,也带来人生的启示。它教会我们谦逊、适应变化、享受过程,激发内心力量,感恩遇见,并帮助我们找回初心。"
24
+ },
25
+ {
26
+ cover: "/iceholidays-assets/images/blog1.png",
27
+ title: "旅游的意义:探索世界与内心的旅程",
28
+ info: "未分类 / 发表评论 / 2024年11月22日",
29
+ summary: "旅游不仅拓展视野,也带来人生的启示。它教会我们谦逊、适应变化、享受过程,激发内心力量,感恩遇见,并帮助我们找回初心。"
30
+ },
31
+ ]
32
+
33
+ const BlogShowPage = React.FC = () => (
34
+ <div id="blog-show-page">
35
+ <Headline bannerImage={bannerPath} breadcrumbs={breadcrumbs} title="Blog"/>
36
+
37
+ <div id="blog-page_body">
38
+
39
+ </div>
40
+ </div>
41
+ );
42
+
43
+ export default BlogShowPage;
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import Headline from "../components/shared/Headline";
3
+
4
+ const bannerPath = '/iceholidays-assets/images/contact_agents.png';
5
+ const breadcrumbs = [
6
+ { title: 'Home' },
7
+ { title: 'Contact Agents' }
8
+ ]
9
+
10
+ const ContactAgentsPage = React.FC = () => (
11
+ <div id="contact-agents-page">
12
+ <Headline bannerImage={bannerPath} breadcrumbs={breadcrumbs} title="CONTACT AGENTS"/>
13
+ </div>
14
+ );
15
+
16
+ export default ContactAgentsPage;