iceholidays-frontend 0.1.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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +8 -0
- data/app/assets/builds/iceholidays/frontend/application.js +40819 -0
- data/app/assets/builds/iceholidays/frontend/application.js.map +7 -0
- data/app/assets/builds/iceholidays/frontend/banner01-MY5H645U.digested.png +0 -0
- data/app/assets/builds/iceholidays/frontend/banner02-2GQQYFI3.digested.png +0 -0
- data/app/assets/builds/iceholidays/frontend/banner2-BWOLYVUE.digested.png +0 -0
- data/app/assets/config/iceholidays_frontend_manifest.js +0 -0
- data/app/assets/images/iceholidays/frontend/5star.png +0 -0
- data/app/assets/images/iceholidays/frontend/Frame71.png +0 -0
- data/app/assets/images/iceholidays/frontend/Group_71.png +0 -0
- data/app/assets/images/iceholidays/frontend/Layer_1.png +0 -0
- data/app/assets/images/iceholidays/frontend/Rectangle49.png +0 -0
- data/app/assets/images/iceholidays/frontend/TS_Logo.png +0 -0
- data/app/assets/images/iceholidays/frontend/about_st_bg.png +0 -0
- data/app/assets/images/iceholidays/frontend/africa.png +0 -0
- data/app/assets/images/iceholidays/frontend/banner1.png +0 -0
- data/app/assets/images/iceholidays/frontend/banner2.png +0 -0
- data/app/assets/images/iceholidays/frontend/china.jpeg +0 -0
- data/app/assets/images/iceholidays/frontend/china2.png +0 -0
- data/app/assets/images/iceholidays/frontend/chongqing.png +0 -0
- data/app/assets/images/iceholidays/frontend/cover_img.jpeg +0 -0
- data/app/assets/images/iceholidays/frontend/feature.jpeg +0 -0
- data/app/assets/images/iceholidays/frontend/guangzhou.png +0 -0
- data/app/assets/images/iceholidays/frontend/guilin.png +0 -0
- data/app/assets/images/iceholidays/frontend/harbin.png +0 -0
- data/app/assets/images/iceholidays/frontend/hongkong.png +0 -0
- data/app/assets/images/iceholidays/frontend/inner_mongolia.png +0 -0
- data/app/assets/images/iceholidays/frontend/jiangxi.png +0 -0
- data/app/assets/images/iceholidays/frontend/kenya.png +0 -0
- data/app/assets/images/iceholidays/frontend/kenya2.png +0 -0
- data/app/assets/images/iceholidays/frontend/kunming.png +0 -0
- data/app/assets/images/iceholidays/frontend/logo_container.png +0 -0
- data/app/assets/images/iceholidays/frontend/logomark.png +0 -0
- data/app/assets/images/iceholidays/frontend/slikroad.png +0 -0
- data/app/assets/images/iceholidays/frontend/southafrica.png +0 -0
- data/app/assets/images/iceholidays/frontend/tanzania.png +0 -0
- data/app/assets/images/iceholidays/frontend/uganda.png +0 -0
- data/app/assets/stylesheets/iceholidays/frontend/application.scss +790 -0
- data/app/controllers/iceholidays/frontend/application_controller.rb +6 -0
- data/app/controllers/iceholidays/frontend/site_controller.rb +8 -0
- data/app/helpers/iceholidays/frontend/application_helper.rb +9 -0
- data/app/javascript/application.js +5 -0
- data/app/javascript/react/application.js +72 -0
- data/app/javascript/react/components/Destinations.tsx +182 -0
- data/app/javascript/react/components/Homepage.tsx +16 -0
- data/app/javascript/react/components/HomepageBanner.tsx +35 -0
- data/app/javascript/react/components/Testimonials.tsx +66 -0
- data/app/javascript/react/index.js +8 -0
- data/app/jobs/iceholidays/frontend/application_job.rb +6 -0
- data/app/mailers/iceholidays/frontend/application_mailer.rb +8 -0
- data/app/models/iceholidays/frontend/application_record.rb +7 -0
- data/app/views/iceholidays/frontend/site/index.html.erb +24 -0
- data/app/views/layouts/iceholidays/frontend/application.html.erb +24 -0
- data/app/views/layouts/iceholidays/frontend/shared/_footer.html.erb +42 -0
- data/app/views/layouts/iceholidays/frontend/shared/_header.html.erb +20 -0
- data/config/routes.rb +3 -0
- data/lib/iceholidays/frontend/engine.rb +14 -0
- data/lib/iceholidays/frontend/react_component.rb +21 -0
- data/lib/iceholidays/frontend/version.rb +5 -0
- data/lib/iceholidays/frontend.rb +8 -0
- data/lib/tasks/iceholidays/frontend_tasks.rake +4 -0
- metadata +164 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom/client";
|
|
3
|
+
import { intersection, keys, assign, omit } from "lodash-es";
|
|
4
|
+
|
|
5
|
+
const CLASS_ATTRIBUTE_NAME = "data-react-class";
|
|
6
|
+
const PROPS_ATTRIBUTE_NAME = "data-react-props";
|
|
7
|
+
|
|
8
|
+
const ReactComponent = {
|
|
9
|
+
registeredComponents: {},
|
|
10
|
+
componentRoots: {},
|
|
11
|
+
|
|
12
|
+
render(node, component) {
|
|
13
|
+
const propsJson = node.getAttribute(PROPS_ATTRIBUTE_NAME);
|
|
14
|
+
const props = propsJson && JSON.parse(propsJson);
|
|
15
|
+
|
|
16
|
+
const reactElement = React.createElement(component, props);
|
|
17
|
+
const root = ReactDOM.createRoot(node);
|
|
18
|
+
|
|
19
|
+
root.render(reactElement);
|
|
20
|
+
|
|
21
|
+
return root;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
registerComponents(components) {
|
|
25
|
+
const collisions = intersection(
|
|
26
|
+
keys(this.registeredComponents),
|
|
27
|
+
keys(components)
|
|
28
|
+
);
|
|
29
|
+
if (collisions.length > 0) {
|
|
30
|
+
console.error(
|
|
31
|
+
`Following components are already registered: ${collisions}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
assign(this.registeredComponents, omit(components, collisions));
|
|
36
|
+
return true;
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
mountComponents() {
|
|
40
|
+
const { registeredComponents } = this;
|
|
41
|
+
const toMount = document.querySelectorAll(`[${CLASS_ATTRIBUTE_NAME}]`);
|
|
42
|
+
|
|
43
|
+
for (let i = 0; i < toMount.length; i += 1) {
|
|
44
|
+
const node = toMount[i];
|
|
45
|
+
const className = node.getAttribute(CLASS_ATTRIBUTE_NAME);
|
|
46
|
+
const component = registeredComponents[className];
|
|
47
|
+
|
|
48
|
+
if (component) {
|
|
49
|
+
if (node.innerHTML.length === 0) {
|
|
50
|
+
const root = this.render(node, component);
|
|
51
|
+
|
|
52
|
+
this.componentRoots = { ...this.componentRoots, [className]: root };
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
console.error(
|
|
56
|
+
`Can not render a component that has not been registered: ${className}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
setup(components = {}) {
|
|
63
|
+
if (typeof window.ReactComponent === "undefined") {
|
|
64
|
+
window.ReactComponent = this;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
window.ReactComponent.registerComponents(components);
|
|
68
|
+
window.ReactComponent.mountComponents();
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export default ReactComponent;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { Tabs, TabsProps } from "antd";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
const countries = [
|
|
5
|
+
{
|
|
6
|
+
name: "Africa",
|
|
7
|
+
image: "africa.png",
|
|
8
|
+
image2: "africa2.png",
|
|
9
|
+
topCities: [{
|
|
10
|
+
name: "Kenya",
|
|
11
|
+
image: "kenya.png",
|
|
12
|
+
image2: "kenya2.png",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "South Africa",
|
|
16
|
+
image: "southafrica.png",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "Tanzania",
|
|
20
|
+
image: "tanzania.png",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "Uaganda",
|
|
24
|
+
image: "uganda.png",
|
|
25
|
+
}]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "China",
|
|
29
|
+
image: "china.jpeg",
|
|
30
|
+
image2: "china2.png",
|
|
31
|
+
topCities: [{
|
|
32
|
+
name: "Chong Qing",
|
|
33
|
+
image: "chongqing.png",
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "Guangzhou",
|
|
37
|
+
image: "guangzhou.png",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "Guilin",
|
|
41
|
+
image: "guilin.png",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "Hongkong",
|
|
45
|
+
image: "hongkong.png",
|
|
46
|
+
}],
|
|
47
|
+
moreCities: [
|
|
48
|
+
"Leizhou", "Ningxia", "Qinghai", "Shanghai", "Tibet", "Xiamen", "Yunnan"
|
|
49
|
+
],
|
|
50
|
+
tours: [
|
|
51
|
+
{
|
|
52
|
+
name: "Harbin",
|
|
53
|
+
image: "harbin.png",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "Inner Mongolia",
|
|
57
|
+
image: "inner_mongolia.png",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "Jiangxi",
|
|
61
|
+
image: "jiangxi.png",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "Kun Ming",
|
|
65
|
+
image: "kunming.png",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "Silk Road",
|
|
69
|
+
image: "slikroad.png",
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "Europe"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: "Exotic"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "japan"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "korea"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "maldives"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "taiwan"
|
|
90
|
+
},
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
function Destinations(){
|
|
94
|
+
var items:TabsProps["items"] = countries.map((country, index)=>{
|
|
95
|
+
return {
|
|
96
|
+
key: index.toString(),
|
|
97
|
+
label: country.name,
|
|
98
|
+
children: (
|
|
99
|
+
<>
|
|
100
|
+
<div>
|
|
101
|
+
<div className="country-info">
|
|
102
|
+
<img className="country-image"
|
|
103
|
+
src={`/dev-assets/iceholidays/frontend/${country.image}`}
|
|
104
|
+
onMouseOver={e => (e.currentTarget.src = `/dev-assets/iceholidays/frontend/${country.image2}`)}
|
|
105
|
+
onMouseOut={e => (e.currentTarget.src = `/dev-assets/iceholidays/frontend/${country.image}`)}/>
|
|
106
|
+
<h1 className="country-name"> {country.name} </h1>
|
|
107
|
+
<img className="bottom-logo" src={"/dev-assets/iceholidays/frontend/Frame71.png"}></img>
|
|
108
|
+
</div>
|
|
109
|
+
{
|
|
110
|
+
country.topCities?.length &&
|
|
111
|
+
<div className="top-cities">
|
|
112
|
+
<h2>Top Cities</h2>
|
|
113
|
+
<div id="city-group">
|
|
114
|
+
{
|
|
115
|
+
country.topCities?.map((city, index)=>{
|
|
116
|
+
return (
|
|
117
|
+
<div key={index} className="city-cover">
|
|
118
|
+
<img
|
|
119
|
+
src={`/dev-assets/iceholidays/frontend/${city.image}`}
|
|
120
|
+
onMouseOver={e => (e.currentTarget.src = `/dev-assets/iceholidays/frontend/${city.image2}`)}
|
|
121
|
+
onMouseOut={e => (e.currentTarget.src = `/dev-assets/iceholidays/frontend/${city.image}`)}/>
|
|
122
|
+
<div className="city-details">
|
|
123
|
+
<span className="city-name">{city.name}</span>
|
|
124
|
+
<span className="tour-count">1 Tour</span>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
)
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
{
|
|
135
|
+
country.moreCities?.length &&
|
|
136
|
+
<div className="more-cities">
|
|
137
|
+
<h2>Browse more {country.name} destination</h2>
|
|
138
|
+
<div className="other-destinations">
|
|
139
|
+
{
|
|
140
|
+
country.moreCities?.map((otherCity, index)=>{
|
|
141
|
+
return <a key={index} href="/"> {otherCity} </a>
|
|
142
|
+
})
|
|
143
|
+
}
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
{
|
|
149
|
+
country.tours?.length &&
|
|
150
|
+
<div className="other-tours">
|
|
151
|
+
{
|
|
152
|
+
country.tours?.map((tour, index)=>{
|
|
153
|
+
return <div key={index} className={"tour-story"} style={{backgroundImage:`linear-gradient(180deg, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.8) 100%), url("/dev-assets/iceholidays/frontend/${tour.image}")`}}>
|
|
154
|
+
<div className="tour-detail">
|
|
155
|
+
<span className="city-name"> {tour.name} </span>
|
|
156
|
+
<span className="tour-count"> 1 tour </span>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
})
|
|
160
|
+
}
|
|
161
|
+
</div>
|
|
162
|
+
}
|
|
163
|
+
</div>
|
|
164
|
+
</>
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
return (
|
|
170
|
+
<div id="popular-destinations">
|
|
171
|
+
<h1>Explore Popular Destination</h1>
|
|
172
|
+
|
|
173
|
+
<Tabs
|
|
174
|
+
defaultActiveKey="1"
|
|
175
|
+
items={items}
|
|
176
|
+
type="card"/>
|
|
177
|
+
|
|
178
|
+
</div>
|
|
179
|
+
)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export default Destinations;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import HomepageBanner from "./HomepageBanner";
|
|
3
|
+
import Testimonials from "./Testimonials";
|
|
4
|
+
import Destinations from "./Destinations";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const Homepage = React.FC = () => (
|
|
9
|
+
<div>
|
|
10
|
+
<HomepageBanner/>
|
|
11
|
+
<Destinations/>
|
|
12
|
+
<Testimonials/>
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export default Homepage;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Carousel, Image } from "antd";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import banner1 from "../../../assets/images/iceholidays/frontend/banner1.png"
|
|
4
|
+
import banner2 from "../../../assets/images/iceholidays/frontend/banner2.png"
|
|
5
|
+
const banners = [
|
|
6
|
+
{file: banner2},
|
|
7
|
+
{file: banner2},
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
function HomepageBanner(){
|
|
11
|
+
return (
|
|
12
|
+
<div id="cover">
|
|
13
|
+
<div id="search-bar">
|
|
14
|
+
{/* <%=image_tag("iceholidays/frontend/Rectangle49.png")%> */}
|
|
15
|
+
<div id="search-bar-widget">
|
|
16
|
+
sample1
|
|
17
|
+
</div>
|
|
18
|
+
{/* <%=image_tag("iceholidays/frontend/Rectangle49.png", class: "flip")%> */}
|
|
19
|
+
</div>
|
|
20
|
+
<div>
|
|
21
|
+
<Carousel autoplay arrows>
|
|
22
|
+
{
|
|
23
|
+
banners?.map((image, index)=>{
|
|
24
|
+
return (
|
|
25
|
+
<Image key={index} src={`${image.file}`} preview={false}/>
|
|
26
|
+
)
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
</Carousel>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default HomepageBanner;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Carousel } from "antd";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
const contentStyle: React.CSSProperties = {
|
|
5
|
+
height: '160px',
|
|
6
|
+
color: '#fff',
|
|
7
|
+
lineHeight: '160px',
|
|
8
|
+
textAlign: 'center',
|
|
9
|
+
background: '#364d79',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const reviews = [
|
|
13
|
+
{
|
|
14
|
+
key: 1,
|
|
15
|
+
itinerarySummary: "8D6N 8D6N PREMIUM KOREA: <br/> SPLENDOR OF WINTER",
|
|
16
|
+
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!🇰🇷 …",
|
|
17
|
+
customerName: "Evon Ooi"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
key: 2,
|
|
21
|
+
itinerarySummary: "review 2",
|
|
22
|
+
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!🇰🇷 …",
|
|
23
|
+
customerName: "Evon Ooi"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
key: 3,
|
|
27
|
+
itinerarySummary: "review 3",
|
|
28
|
+
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!🇰🇷 …",
|
|
29
|
+
customerName: "Evon Ooi"
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
function Testimonials(){
|
|
34
|
+
return (
|
|
35
|
+
<div id="testimonial">
|
|
36
|
+
<div id="testimonial-header" style={{backgroundImage: 'url("/dev-assets/iceholidays/frontend/Layer_1.png")'}}>
|
|
37
|
+
<span>Testimonial</span>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div id="testimonials">
|
|
41
|
+
<Carousel arrows slidesToScroll= {1} slidesToShow={3}>
|
|
42
|
+
{
|
|
43
|
+
reviews?.map((review)=>{
|
|
44
|
+
return (
|
|
45
|
+
<div key={review.key} className="testimonial">
|
|
46
|
+
<img src="/dev-assets/iceholidays/frontend/5star.png" className="stars-icon"/>
|
|
47
|
+
<div className="itinerary-summary">
|
|
48
|
+
<span> {review.itinerarySummary} </span>
|
|
49
|
+
</div>
|
|
50
|
+
<div className="comment">
|
|
51
|
+
<span>{review.comment}</span>
|
|
52
|
+
</div>
|
|
53
|
+
<div className="customer-name">
|
|
54
|
+
<span>{review.customerName}</span>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
)
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
</Carousel>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export default Testimonials;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
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
|
+
|
|
7
|
+
|
|
8
|
+
ReactComponent.setup({Homepage, HomepageBanner, Destinations, Testimonials})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%= react_component "Homepage"%>
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
<div id="about-signature-tours" style="background: url(<%=asset_path('iceholidays/frontend/about_st_bg.png')%>) no-repeat 70% 7%, linear-gradient(65.77deg, rgba(170, 133, 62, 0.5) 33.44%, rgba(249, 225, 151, 0.5) 67.37%)">
|
|
5
|
+
<div>
|
|
6
|
+
<h1>ABOUT SIGNATURE TOURS</h1>
|
|
7
|
+
<p>
|
|
8
|
+
From charming accommodations to curated cultural encounters, every aspect is thoughtfully crafted to elevate your travel experience. At The Signature Tours, we believe in the S-Tour’s philosophy —where every moment is a signature memory.
|
|
9
|
+
</p>
|
|
10
|
+
<%=image_tag("iceholidays/frontend/Group_71.png")%>
|
|
11
|
+
<div id="about-st-feature">
|
|
12
|
+
<div style="max-width: 449px">
|
|
13
|
+
<p>Every experience is meticulously designed to create memories that last a lifetime. Our journeys go beyond the ordinary, offering experiences that are as unique as you are.</p>
|
|
14
|
+
</div>
|
|
15
|
+
<div id="feature">
|
|
16
|
+
<%=image_tag("iceholidays/frontend/feature.jpeg")%>
|
|
17
|
+
<div id="st-brand">
|
|
18
|
+
<span>Signature Tours</span>
|
|
19
|
+
<%=image_tag("iceholidays/frontend/logomark.png", id: "st-logo")%>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>Iceholidays frontend</title>
|
|
5
|
+
<%= csrf_meta_tags %>
|
|
6
|
+
<%= csp_meta_tag %>
|
|
7
|
+
|
|
8
|
+
<%= yield :head %>
|
|
9
|
+
|
|
10
|
+
<%= javascript_include_tag "iceholidays/frontend/application", "data-turbo-track": "reload", type: "module" %>
|
|
11
|
+
<%= stylesheet_link_tag "iceholidays/frontend/application", media: "all" %>
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
|
|
15
|
+
<%=render partial:"layouts/iceholidays/frontend/shared/header"%>
|
|
16
|
+
|
|
17
|
+
<main>
|
|
18
|
+
<%= yield %>
|
|
19
|
+
</main>
|
|
20
|
+
|
|
21
|
+
<%=render partial:"layouts/iceholidays/frontend/shared/footer"%>
|
|
22
|
+
</body>
|
|
23
|
+
|
|
24
|
+
</html>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<div id="footer">
|
|
2
|
+
<div id="footer-links">
|
|
3
|
+
<div>
|
|
4
|
+
<div class="link-group-title">Countries</div>
|
|
5
|
+
<div>
|
|
6
|
+
<a>africa</a>
|
|
7
|
+
<a>japan</a>
|
|
8
|
+
<a>china</a>
|
|
9
|
+
<a>korea</a>
|
|
10
|
+
<a>europe</a>
|
|
11
|
+
<a>maldives</a>
|
|
12
|
+
<a>exotic</a>
|
|
13
|
+
<a>taiwan</a>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
<div>
|
|
17
|
+
<div class="link-group-title"> </div>
|
|
18
|
+
<div>
|
|
19
|
+
<a>home</a>
|
|
20
|
+
<a>pdpa</a>
|
|
21
|
+
<a>about us</a>
|
|
22
|
+
<a>privacy policy</a>
|
|
23
|
+
<a>contact us</a>
|
|
24
|
+
<a>terms & conditions</a>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
<div>
|
|
28
|
+
<div>
|
|
29
|
+
<div class="link-group-title">Contact Us</div>
|
|
30
|
+
<div><a>contact agents</a></div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div>
|
|
34
|
+
<div class="link-group-title">Follow us on</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<hr>
|
|
39
|
+
<div id="copyright">
|
|
40
|
+
<span>Copyright © 2024 Golden Destinations</span>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<div id="header">
|
|
2
|
+
<div>
|
|
3
|
+
<div class="nav-menu" id="left-menu">
|
|
4
|
+
<a>Home</a>
|
|
5
|
+
<a>about us</a>
|
|
6
|
+
<a>countries</a>
|
|
7
|
+
<a>blog</a>
|
|
8
|
+
</div>
|
|
9
|
+
<a href="/" class="nav-menu logo">
|
|
10
|
+
<%=image_tag("iceholidays/frontend/logo_container.png")%>
|
|
11
|
+
</a>
|
|
12
|
+
<div class="nav-menu" id="right-menu">
|
|
13
|
+
<a>contact agents</a>
|
|
14
|
+
<a>contact us</a>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
<a id="get-brochure">
|
|
18
|
+
<span>get brochure</span>
|
|
19
|
+
</a>
|
|
20
|
+
</div>
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Iceholidays
|
|
2
|
+
module Frontend
|
|
3
|
+
class Engine < ::Rails::Engine
|
|
4
|
+
isolate_namespace Iceholidays::Frontend
|
|
5
|
+
initializer "iceholidays_frontend.assets.precompile" do |app|
|
|
6
|
+
app.config.assets.precompile += %w(iceholidays/frontend/application.js iceholidays/frontend/application.js.map iceholidays/frontend/application.css)
|
|
7
|
+
app.config.assets.precompile += Dir.glob( root.join( 'app', 'assets', 'images', 'iceholidays', 'frontend','**' ) )
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Iceholidays
|
|
2
|
+
module Frontend
|
|
3
|
+
class ReactComponent
|
|
4
|
+
include ActionView::Helpers::TagHelper
|
|
5
|
+
include ActionView::Helpers::TextHelper
|
|
6
|
+
|
|
7
|
+
attr_accessor :name
|
|
8
|
+
|
|
9
|
+
def initialize(name)
|
|
10
|
+
@name = name
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def render(props = {}, options = {})
|
|
14
|
+
tag = options.delete(:tag) || :div
|
|
15
|
+
data = { data: { "react-class" => name, "react-props" => props.to_json } }
|
|
16
|
+
|
|
17
|
+
content_tag(tag, nil, options.deep_merge(data))
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|