@sikka/hawa 0.1.85 → 0.1.87
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/README.md +1 -1
- package/dist/index.d.mts +22 -2
- package/dist/index.d.ts +22 -2
- package/dist/index.js +814 -743
- package/dist/index.mjs +600 -531
- package/dist/styles.css +31 -65
- package/package.json +1 -1
- package/src/blocks/AuthForms/AppLanding.tsx +17 -7
- package/src/blocks/AuthForms/SignInForm.tsx +1 -1
- package/src/blocks/AuthForms/SignUpForm.tsx +1 -1
- package/src/blocks/Payment/CreditCardForm.tsx +20 -19
- package/src/elements/ActionCard.tsx +64 -0
- package/src/elements/Carousel.tsx +5 -155
- package/src/elements/DropdownMenu.tsx +5 -0
- package/src/elements/index.ts +2 -0
- package/src/layout/Footer.tsx +50 -13
- package/src/styles.css +31 -65
package/dist/styles.css
CHANGED
|
@@ -758,6 +758,9 @@ video {
|
|
|
758
758
|
.bottom-14 {
|
|
759
759
|
bottom: 3.5rem;
|
|
760
760
|
}
|
|
761
|
+
.bottom-2 {
|
|
762
|
+
bottom: 0.5rem;
|
|
763
|
+
}
|
|
761
764
|
.bottom-4 {
|
|
762
765
|
bottom: 1rem;
|
|
763
766
|
}
|
|
@@ -1075,9 +1078,6 @@ video {
|
|
|
1075
1078
|
.hidden {
|
|
1076
1079
|
display: none;
|
|
1077
1080
|
}
|
|
1078
|
-
.aspect-\[2\/3\] {
|
|
1079
|
-
aspect-ratio: 2/3;
|
|
1080
|
-
}
|
|
1081
1081
|
.aspect-square {
|
|
1082
1082
|
aspect-ratio: 1 / 1;
|
|
1083
1083
|
}
|
|
@@ -1096,9 +1096,6 @@ video {
|
|
|
1096
1096
|
.h-11 {
|
|
1097
1097
|
height: 2.75rem;
|
|
1098
1098
|
}
|
|
1099
|
-
.h-12 {
|
|
1100
|
-
height: 3rem;
|
|
1101
|
-
}
|
|
1102
1099
|
.h-14 {
|
|
1103
1100
|
height: 3.5rem;
|
|
1104
1101
|
}
|
|
@@ -1180,6 +1177,9 @@ video {
|
|
|
1180
1177
|
.h-\[32px\] {
|
|
1181
1178
|
height: 32px;
|
|
1182
1179
|
}
|
|
1180
|
+
.h-\[400px\] {
|
|
1181
|
+
height: 400px;
|
|
1182
|
+
}
|
|
1183
1183
|
.h-\[calc\(100\%-3\.5rem\)\] {
|
|
1184
1184
|
height: calc(100% - 3.5rem);
|
|
1185
1185
|
}
|
|
@@ -1228,6 +1228,9 @@ video {
|
|
|
1228
1228
|
.min-h-\[80px\] {
|
|
1229
1229
|
min-height: 80px;
|
|
1230
1230
|
}
|
|
1231
|
+
.min-h-screen {
|
|
1232
|
+
min-height: 100vh;
|
|
1233
|
+
}
|
|
1231
1234
|
.w-0 {
|
|
1232
1235
|
width: 0px;
|
|
1233
1236
|
}
|
|
@@ -1309,6 +1312,9 @@ video {
|
|
|
1309
1312
|
.w-\[1\.2rem\] {
|
|
1310
1313
|
width: 1.2rem;
|
|
1311
1314
|
}
|
|
1315
|
+
.w-\[1000px\] {
|
|
1316
|
+
width: 1000px;
|
|
1317
|
+
}
|
|
1312
1318
|
.w-\[12px\] {
|
|
1313
1319
|
width: 12px;
|
|
1314
1320
|
}
|
|
@@ -1345,15 +1351,9 @@ video {
|
|
|
1345
1351
|
.w-\[42px\] {
|
|
1346
1352
|
width: 42px;
|
|
1347
1353
|
}
|
|
1348
|
-
.w-\[500px\] {
|
|
1349
|
-
width: 500px;
|
|
1350
|
-
}
|
|
1351
1354
|
.w-\[64px\] {
|
|
1352
1355
|
width: 64px;
|
|
1353
1356
|
}
|
|
1354
|
-
.w-\[90\%\] {
|
|
1355
|
-
width: 90%;
|
|
1356
|
-
}
|
|
1357
1357
|
.w-\[calc\(1\%\)\] {
|
|
1358
1358
|
width: calc(1%);
|
|
1359
1359
|
}
|
|
@@ -1576,19 +1576,6 @@ video {
|
|
|
1576
1576
|
.snap-x {
|
|
1577
1577
|
scroll-snap-type: x var(--tw-scroll-snap-strictness);
|
|
1578
1578
|
}
|
|
1579
|
-
.snap-mandatory {
|
|
1580
|
-
--tw-scroll-snap-strictness: mandatory;
|
|
1581
|
-
}
|
|
1582
|
-
.snap-start {
|
|
1583
|
-
scroll-snap-align: start;
|
|
1584
|
-
}
|
|
1585
|
-
.snap-always {
|
|
1586
|
-
scroll-snap-stop: always;
|
|
1587
|
-
}
|
|
1588
|
-
.scroll-px-10 {
|
|
1589
|
-
scroll-padding-left: 2.5rem;
|
|
1590
|
-
scroll-padding-right: 2.5rem;
|
|
1591
|
-
}
|
|
1592
1579
|
.appearance-none {
|
|
1593
1580
|
-webkit-appearance: none;
|
|
1594
1581
|
-moz-appearance: none;
|
|
@@ -1769,15 +1756,9 @@ video {
|
|
|
1769
1756
|
.overflow-y-clip {
|
|
1770
1757
|
overflow-y: clip;
|
|
1771
1758
|
}
|
|
1772
|
-
.overflow-x-scroll {
|
|
1773
|
-
overflow-x: scroll;
|
|
1774
|
-
}
|
|
1775
1759
|
.overflow-y-scroll {
|
|
1776
1760
|
overflow-y: scroll;
|
|
1777
1761
|
}
|
|
1778
|
-
.scroll-smooth {
|
|
1779
|
-
scroll-behavior: smooth;
|
|
1780
|
-
}
|
|
1781
1762
|
.truncate {
|
|
1782
1763
|
overflow: hidden;
|
|
1783
1764
|
text-overflow: ellipsis;
|
|
@@ -2027,10 +2008,6 @@ video {
|
|
|
2027
2008
|
--tw-bg-opacity: 1;
|
|
2028
2009
|
background-color: rgb(219 234 254 / var(--tw-bg-opacity));
|
|
2029
2010
|
}
|
|
2030
|
-
.bg-blue-200 {
|
|
2031
|
-
--tw-bg-opacity: 1;
|
|
2032
|
-
background-color: rgb(191 219 254 / var(--tw-bg-opacity));
|
|
2033
|
-
}
|
|
2034
2011
|
.bg-blue-300 {
|
|
2035
2012
|
--tw-bg-opacity: 1;
|
|
2036
2013
|
background-color: rgb(147 197 253 / var(--tw-bg-opacity));
|
|
@@ -2117,10 +2094,6 @@ video {
|
|
|
2117
2094
|
--tw-bg-opacity: 1;
|
|
2118
2095
|
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
|
|
2119
2096
|
}
|
|
2120
|
-
.bg-green-300 {
|
|
2121
|
-
--tw-bg-opacity: 1;
|
|
2122
|
-
background-color: rgb(134 239 172 / var(--tw-bg-opacity));
|
|
2123
|
-
}
|
|
2124
2097
|
.bg-green-500 {
|
|
2125
2098
|
--tw-bg-opacity: 1;
|
|
2126
2099
|
background-color: rgb(34 197 94 / var(--tw-bg-opacity));
|
|
@@ -2138,10 +2111,6 @@ video {
|
|
|
2138
2111
|
.bg-muted {
|
|
2139
2112
|
background-color: hsl(var(--muted));
|
|
2140
2113
|
}
|
|
2141
|
-
.bg-orange-100 {
|
|
2142
|
-
--tw-bg-opacity: 1;
|
|
2143
|
-
background-color: rgb(255 237 213 / var(--tw-bg-opacity));
|
|
2144
|
-
}
|
|
2145
2114
|
.bg-orange-400 {
|
|
2146
2115
|
--tw-bg-opacity: 1;
|
|
2147
2116
|
background-color: rgb(251 146 60 / var(--tw-bg-opacity));
|
|
@@ -2188,10 +2157,6 @@ video {
|
|
|
2188
2157
|
--tw-bg-opacity: 1;
|
|
2189
2158
|
background-color: rgb(127 29 29 / var(--tw-bg-opacity));
|
|
2190
2159
|
}
|
|
2191
|
-
.bg-rose-100 {
|
|
2192
|
-
--tw-bg-opacity: 1;
|
|
2193
|
-
background-color: rgb(255 228 230 / var(--tw-bg-opacity));
|
|
2194
|
-
}
|
|
2195
2160
|
.bg-secondary {
|
|
2196
2161
|
background-color: hsl(var(--secondary));
|
|
2197
2162
|
}
|
|
@@ -2236,16 +2201,14 @@ video {
|
|
|
2236
2201
|
.bg-opacity-80 {
|
|
2237
2202
|
--tw-bg-opacity: 0.8;
|
|
2238
2203
|
}
|
|
2239
|
-
.bg-gradient-to-t {
|
|
2240
|
-
background-image: linear-gradient(to top, var(--tw-gradient-stops));
|
|
2241
|
-
}
|
|
2242
2204
|
.bg-none {
|
|
2243
2205
|
background-image: none;
|
|
2244
2206
|
}
|
|
2245
|
-
.
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2207
|
+
.bg-cover {
|
|
2208
|
+
background-size: cover;
|
|
2209
|
+
}
|
|
2210
|
+
.bg-center {
|
|
2211
|
+
background-position: center;
|
|
2249
2212
|
}
|
|
2250
2213
|
.fill-current {
|
|
2251
2214
|
fill: currentColor;
|
|
@@ -2716,9 +2679,6 @@ video {
|
|
|
2716
2679
|
--tw-text-opacity: 1;
|
|
2717
2680
|
color: rgb(255 255 255 / var(--tw-text-opacity));
|
|
2718
2681
|
}
|
|
2719
|
-
.text-white\/50 {
|
|
2720
|
-
color: rgb(255 255 255 / 0.5);
|
|
2721
|
-
}
|
|
2722
2682
|
.text-yellow-700 {
|
|
2723
2683
|
--tw-text-opacity: 1;
|
|
2724
2684
|
color: rgb(161 98 7 / var(--tw-text-opacity));
|
|
@@ -2918,6 +2878,9 @@ video {
|
|
|
2918
2878
|
.duration-300 {
|
|
2919
2879
|
transition-duration: 300ms;
|
|
2920
2880
|
}
|
|
2881
|
+
.duration-500 {
|
|
2882
|
+
transition-duration: 500ms;
|
|
2883
|
+
}
|
|
2921
2884
|
.will-change-\[opacity\2c transform\] {
|
|
2922
2885
|
will-change: opacity,transform;
|
|
2923
2886
|
}
|
|
@@ -2968,6 +2931,9 @@ video {
|
|
|
2968
2931
|
.duration-300 {
|
|
2969
2932
|
animation-duration: 300ms;
|
|
2970
2933
|
}
|
|
2934
|
+
.duration-500 {
|
|
2935
|
+
animation-duration: 500ms;
|
|
2936
|
+
}
|
|
2971
2937
|
.delay-100 {
|
|
2972
2938
|
animation-delay: 100ms;
|
|
2973
2939
|
}
|
|
@@ -3269,6 +3235,10 @@ body {
|
|
|
3269
3235
|
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
|
|
3270
3236
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
3271
3237
|
}
|
|
3238
|
+
.hover\:drop-shadow-2xl:hover {
|
|
3239
|
+
--tw-drop-shadow: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15));
|
|
3240
|
+
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
3241
|
+
}
|
|
3272
3242
|
.hover\:drop-shadow-lg:hover {
|
|
3273
3243
|
--tw-drop-shadow: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) drop-shadow(0 4px 3px rgb(0 0 0 / 0.1));
|
|
3274
3244
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
@@ -4049,10 +4019,6 @@ body {
|
|
|
4049
4019
|
display: flex;
|
|
4050
4020
|
}
|
|
4051
4021
|
|
|
4052
|
-
.sm\:w-\[44\%\] {
|
|
4053
|
-
width: 44%;
|
|
4054
|
-
}
|
|
4055
|
-
|
|
4056
4022
|
.sm\:columns-2 {
|
|
4057
4023
|
-moz-columns: 2;
|
|
4058
4024
|
columns: 2;
|
|
@@ -4164,10 +4130,6 @@ body {
|
|
|
4164
4130
|
width: 12rem;
|
|
4165
4131
|
}
|
|
4166
4132
|
|
|
4167
|
-
.md\:w-\[30\%\] {
|
|
4168
|
-
width: 30%;
|
|
4169
|
-
}
|
|
4170
|
-
|
|
4171
4133
|
.md\:w-full {
|
|
4172
4134
|
width: 100%;
|
|
4173
4135
|
}
|
|
@@ -4197,6 +4159,10 @@ body {
|
|
|
4197
4159
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
4198
4160
|
}
|
|
4199
4161
|
|
|
4162
|
+
.md\:grid-cols-3 {
|
|
4163
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
4164
|
+
}
|
|
4165
|
+
|
|
4200
4166
|
.md\:flex-row {
|
|
4201
4167
|
flex-direction: row;
|
|
4202
4168
|
}
|
package/package.json
CHANGED
|
@@ -9,11 +9,15 @@ type AppLandingTypes = {
|
|
|
9
9
|
handleSignUp: () => void
|
|
10
10
|
handleLanguage: () => void
|
|
11
11
|
handleColorMode: () => void
|
|
12
|
-
texts
|
|
12
|
+
texts?: {
|
|
13
13
|
signIn: string
|
|
14
14
|
signUp: string
|
|
15
15
|
lang: string
|
|
16
|
+
newUserText?: string
|
|
17
|
+
createAccount?: string
|
|
16
18
|
}
|
|
19
|
+
withoutSignUp?: boolean
|
|
20
|
+
handleRouteToSignUp?: () => void
|
|
17
21
|
size: "small" | "normal" | "full"
|
|
18
22
|
}
|
|
19
23
|
|
|
@@ -67,12 +71,18 @@ export const AppLanding: FC<AppLandingTypes> = (props) => {
|
|
|
67
71
|
{props.handleSignUp && (
|
|
68
72
|
<Button onClick={props.handleSignUp}>{props.texts.signUp}</Button>
|
|
69
73
|
)} */}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
{!props.withoutSignUp && (
|
|
75
|
+
<div className="p-3 text-center text-sm font-normal dark:text-gray-300">
|
|
76
|
+
{props.texts.newUserText}{" "}
|
|
77
|
+
<span
|
|
78
|
+
onClick={props.handleRouteToSignUp}
|
|
79
|
+
className="clickable-link"
|
|
80
|
+
>
|
|
81
|
+
{props.texts.createAccount}
|
|
82
|
+
</span>
|
|
83
|
+
</div>
|
|
84
|
+
)}
|
|
85
|
+
|
|
76
86
|
</CardContent>
|
|
77
87
|
</Card>
|
|
78
88
|
<div className="mt-6 flex flex-row justify-between">
|
|
@@ -135,7 +135,7 @@ export const SignInForm: FC<SignInFormTypes> = (props) => {
|
|
|
135
135
|
{props.texts.signInText}
|
|
136
136
|
</Button>
|
|
137
137
|
{!props.withoutSignUp && (
|
|
138
|
-
<div className="p-3 text-center text-sm font-
|
|
138
|
+
<div className="p-3 text-center text-sm font-normal dark:text-gray-300">
|
|
139
139
|
{props.texts.newUserText}{" "}
|
|
140
140
|
<span
|
|
141
141
|
onClick={props.handleRouteToSignUp}
|
|
@@ -295,7 +295,7 @@ export const SignUpForm: FC<SignUpFormTypes> = (props) => {
|
|
|
295
295
|
</Button>
|
|
296
296
|
</form>
|
|
297
297
|
</FormProvider>
|
|
298
|
-
<div className="flex flex-row items-center justify-center gap-1 p-3 text-center text-sm font-
|
|
298
|
+
<div className="flex flex-row items-center justify-center gap-1 p-3 text-center text-sm font-normal dark:text-white">
|
|
299
299
|
<span>{props.texts.existingUserText}</span>
|
|
300
300
|
<span
|
|
301
301
|
onClick={props.handleRouteToSignIn}
|
|
@@ -28,30 +28,30 @@ export const CreditCardForm: FC<CreditCardFormTypes> = (props) => {
|
|
|
28
28
|
render={({ field }) => (
|
|
29
29
|
<HawaTextField
|
|
30
30
|
width="full"
|
|
31
|
-
name="
|
|
32
|
-
placeholder="
|
|
33
|
-
type="
|
|
31
|
+
name="cardNumber"
|
|
32
|
+
placeholder="1234 1234 1234 1234"
|
|
33
|
+
type="number"
|
|
34
34
|
label="Card Number"
|
|
35
35
|
helpertext={errors.password?.message}
|
|
36
36
|
/>
|
|
37
37
|
)}
|
|
38
38
|
rules={{
|
|
39
|
-
required: "
|
|
39
|
+
required: "Card Number is rquired",
|
|
40
40
|
}}
|
|
41
41
|
/>
|
|
42
42
|
<div className="w-1/4">
|
|
43
43
|
<Controller
|
|
44
44
|
control={control}
|
|
45
|
-
name="
|
|
45
|
+
name="cardCVC"
|
|
46
46
|
render={({ field }) => (
|
|
47
47
|
<HawaTextField
|
|
48
48
|
width="full"
|
|
49
|
-
name="
|
|
49
|
+
name="cardCVC"
|
|
50
50
|
maxLength="3"
|
|
51
51
|
autoComplete="cc-number"
|
|
52
|
-
placeholder=""
|
|
53
|
-
type="
|
|
54
|
-
label="
|
|
52
|
+
placeholder="CVC"
|
|
53
|
+
type="number"
|
|
54
|
+
label="CVC"
|
|
55
55
|
helpertext={errors.password?.message}
|
|
56
56
|
/>
|
|
57
57
|
)}
|
|
@@ -61,16 +61,17 @@ export const CreditCardForm: FC<CreditCardFormTypes> = (props) => {
|
|
|
61
61
|
/>
|
|
62
62
|
</div>
|
|
63
63
|
</div>
|
|
64
|
+
|
|
64
65
|
<Controller
|
|
65
66
|
control={control}
|
|
66
|
-
name="
|
|
67
|
+
name="cardExpiry"
|
|
67
68
|
render={({ field }) => (
|
|
68
69
|
<HawaTextField
|
|
69
70
|
width="full"
|
|
70
|
-
name="
|
|
71
|
-
placeholder="
|
|
72
|
-
type="
|
|
73
|
-
label="
|
|
71
|
+
name="cardExpiry"
|
|
72
|
+
placeholder="MM / YY"
|
|
73
|
+
type="password"
|
|
74
|
+
label="Expiry Date"
|
|
74
75
|
helpertext={errors.password?.message}
|
|
75
76
|
/>
|
|
76
77
|
)}
|
|
@@ -84,15 +85,15 @@ export const CreditCardForm: FC<CreditCardFormTypes> = (props) => {
|
|
|
84
85
|
render={({ field }) => (
|
|
85
86
|
<HawaTextField
|
|
86
87
|
width="full"
|
|
87
|
-
name="
|
|
88
|
-
placeholder="Enter password"
|
|
89
|
-
type="
|
|
90
|
-
label="
|
|
88
|
+
name="cardName"
|
|
89
|
+
// placeholder="Enter password"
|
|
90
|
+
type="text"
|
|
91
|
+
label="Name on card"
|
|
91
92
|
helpertext={errors.password?.message}
|
|
92
93
|
/>
|
|
93
94
|
)}
|
|
94
95
|
rules={{
|
|
95
|
-
required: "
|
|
96
|
+
required: "Card holder name is rquired",
|
|
96
97
|
}}
|
|
97
98
|
/>
|
|
98
99
|
</CardContent>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React, { FC, useState } from "react"
|
|
2
|
+
import { Button } from "./Button"
|
|
3
|
+
|
|
4
|
+
type ImageCardTypes = {
|
|
5
|
+
children: any
|
|
6
|
+
align?: any
|
|
7
|
+
bottomElement?: any
|
|
8
|
+
inCardActions?: any
|
|
9
|
+
cardImage?: string
|
|
10
|
+
title?: string
|
|
11
|
+
subtitle?: string
|
|
12
|
+
blank?: boolean
|
|
13
|
+
}
|
|
14
|
+
export const ActionCard: FC<ImageCardTypes> = (props) => {
|
|
15
|
+
const [hovered, setHovered] = useState(false)
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<div className="flex h-full w-full flex-col gap-1 ">
|
|
19
|
+
<div
|
|
20
|
+
className="group relative h-full w-full rounded border bg-background bg-cover bg-center transition-all duration-500 hover:drop-shadow-2xl"
|
|
21
|
+
style={{
|
|
22
|
+
backgroundImage: `url(${props.blank ? "" : props.cardImage})`,
|
|
23
|
+
}}
|
|
24
|
+
onMouseEnter={() => setHovered(true)}
|
|
25
|
+
onMouseLeave={() => setHovered(false)}
|
|
26
|
+
>
|
|
27
|
+
{props.blank ? (
|
|
28
|
+
<div className="flex h-full flex-col items-center justify-center ">
|
|
29
|
+
<svg
|
|
30
|
+
className="h-10 w-10 text-foreground"
|
|
31
|
+
stroke="currentColor"
|
|
32
|
+
fill="currentColor"
|
|
33
|
+
stroke-width="0"
|
|
34
|
+
viewBox="0 0 24 24"
|
|
35
|
+
height="1em"
|
|
36
|
+
width="1em"
|
|
37
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
38
|
+
>
|
|
39
|
+
<path d="M19 11h-6V5h-2v6H5v2h6v6h2v-6h6z"></path>
|
|
40
|
+
</svg>
|
|
41
|
+
</div>
|
|
42
|
+
) : (
|
|
43
|
+
<div className="absolute inset-0 rounded bg-black opacity-50"></div>
|
|
44
|
+
)}
|
|
45
|
+
<div className="absolute bottom-2 right-2 z-10 opacity-0 transition-all duration-200 group-hover:opacity-100">
|
|
46
|
+
{props.inCardActions}
|
|
47
|
+
</div>
|
|
48
|
+
{!props.blank && (
|
|
49
|
+
<div className="relative p-4">
|
|
50
|
+
<h1 className="text-white">{props.title}</h1>
|
|
51
|
+
<p className="text-white">{props.subtitle}</p>
|
|
52
|
+
</div>
|
|
53
|
+
)}
|
|
54
|
+
</div>
|
|
55
|
+
<div
|
|
56
|
+
className={`flex flex-row justify-between text-sm transition-all duration-200 ${
|
|
57
|
+
hovered ? "opacity-100" : "opacity-0"
|
|
58
|
+
}`}
|
|
59
|
+
>
|
|
60
|
+
{props.bottomElement}
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
@@ -6,7 +6,7 @@ interface CarouselProps {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export const Carousel: React.FC<CarouselProps> = ({ images }) => {
|
|
9
|
-
const imageWidth =
|
|
9
|
+
const imageWidth = 1000 + 16 // Adjust according to your image width
|
|
10
10
|
const {
|
|
11
11
|
containerRef,
|
|
12
12
|
handleMouseDown,
|
|
@@ -17,7 +17,7 @@ export const Carousel: React.FC<CarouselProps> = ({ images }) => {
|
|
|
17
17
|
|
|
18
18
|
return (
|
|
19
19
|
<div
|
|
20
|
-
className="flex cursor-pointer snap-x gap-4 overflow-x-
|
|
20
|
+
className="flex cursor-pointer snap-x gap-4 overflow-x-hidden justify-center items-center"
|
|
21
21
|
onMouseDown={handleMouseDown}
|
|
22
22
|
onMouseLeave={handleMouseLeave}
|
|
23
23
|
onMouseUp={handleMouseUp}
|
|
@@ -25,10 +25,12 @@ export const Carousel: React.FC<CarouselProps> = ({ images }) => {
|
|
|
25
25
|
ref={containerRef}
|
|
26
26
|
>
|
|
27
27
|
{images.map((image, index) => (
|
|
28
|
-
<div key={index} className="
|
|
28
|
+
<div key={index} className="w-[1000px] h-96 flex-shrink-0">
|
|
29
|
+
{/* <div key={index} className="h-40 w-60 flex-shrink-0"> */}
|
|
29
30
|
<img
|
|
30
31
|
src={image}
|
|
31
32
|
alt={`Carousel Image ${index}`}
|
|
33
|
+
width={imageWidth}
|
|
32
34
|
className="h-full w-full rounded-lg object-cover"
|
|
33
35
|
/>
|
|
34
36
|
</div>
|
|
@@ -37,155 +39,3 @@ export const Carousel: React.FC<CarouselProps> = ({ images }) => {
|
|
|
37
39
|
)
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
// import React, { FC, useEffect, useRef } from "react"
|
|
41
|
-
// import clsx from "clsx"
|
|
42
|
-
|
|
43
|
-
// type CarouselTypes = {
|
|
44
|
-
// /** The text inside the chip */
|
|
45
|
-
// label: string
|
|
46
|
-
// /** The small icon before the chip label */
|
|
47
|
-
// icon?: JSX.Element
|
|
48
|
-
// /** The color of the chip, must be a tailwind color */
|
|
49
|
-
// color?: string
|
|
50
|
-
// /** The size of the chip */
|
|
51
|
-
// size?: "small" | "normal" | "large"
|
|
52
|
-
// /** Enable/Disable the dot before the label of the chip */
|
|
53
|
-
// dot?: boolean
|
|
54
|
-
// /** Red/Green dot next to the label of the chip indicating online/offline or available/unavailable */
|
|
55
|
-
// dotType?: "available" | "unavailable"
|
|
56
|
-
// }
|
|
57
|
-
|
|
58
|
-
// export const Carousel: FC<CarouselTypes> = (props) => {
|
|
59
|
-
// const scrollContainer = useRef(null)
|
|
60
|
-
|
|
61
|
-
// useEffect(() => {
|
|
62
|
-
// let isDown = false
|
|
63
|
-
// let startX
|
|
64
|
-
// let scrollLeft
|
|
65
|
-
|
|
66
|
-
// const onMouseDown = (e) => {
|
|
67
|
-
// isDown = true
|
|
68
|
-
// startX = e.pageX
|
|
69
|
-
// scrollLeft = scrollContainer.current.scrollLeft
|
|
70
|
-
// }
|
|
71
|
-
|
|
72
|
-
// const onMouseLeave = () => {
|
|
73
|
-
// isDown = false
|
|
74
|
-
// }
|
|
75
|
-
|
|
76
|
-
// const onMouseUp = () => {
|
|
77
|
-
// isDown = false
|
|
78
|
-
// }
|
|
79
|
-
|
|
80
|
-
// const onMouseMove = (e) => {
|
|
81
|
-
// if (!isDown) return
|
|
82
|
-
// e.preventDefault()
|
|
83
|
-
// const x = e.pageX
|
|
84
|
-
// const walk = x - startX
|
|
85
|
-
// scrollContainer.current.scrollLeft = scrollLeft - walk
|
|
86
|
-
// }
|
|
87
|
-
|
|
88
|
-
// const container = scrollContainer.current
|
|
89
|
-
// container.addEventListener("mousedown", onMouseDown)
|
|
90
|
-
// container.addEventListener("mouseleave", onMouseLeave)
|
|
91
|
-
// container.addEventListener("mouseup", onMouseUp)
|
|
92
|
-
// container.addEventListener("mousemove", onMouseMove)
|
|
93
|
-
|
|
94
|
-
// return () => {
|
|
95
|
-
// container.removeEventListener("mousedown", onMouseDown)
|
|
96
|
-
// container.removeEventListener("mouseleave", onMouseLeave)
|
|
97
|
-
// container.removeEventListener("mouseup", onMouseUp)
|
|
98
|
-
// container.removeEventListener("mousemove", onMouseMove)
|
|
99
|
-
// }
|
|
100
|
-
// }, [])
|
|
101
|
-
// return (
|
|
102
|
-
// <div className="relative flex flex-col items-center justify-center overflow-hidden bg-gray-50">
|
|
103
|
-
// <div className="w-[500px]">
|
|
104
|
-
// <div
|
|
105
|
-
// ref={scrollContainer}
|
|
106
|
-
// className="scrollbar-hide mt-14 flex w-full snap-x snap-mandatory scroll-px-10 gap-10 overflow-x-scroll scroll-smooth px-10"
|
|
107
|
-
// >
|
|
108
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-orange-100 sm:w-[44%] md:w-[30%]">
|
|
109
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
110
|
-
// <h2 className="mt-4 text-xl font-bold text-white">Cangu</h2>
|
|
111
|
-
// <p className="text-sm text-white/50">Indonesia</p>
|
|
112
|
-
// </div>
|
|
113
|
-
// <img
|
|
114
|
-
// src="https://source.unsplash.com/9bp48ITvd00"
|
|
115
|
-
// alt="image"
|
|
116
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
117
|
-
// />
|
|
118
|
-
// </div>
|
|
119
|
-
|
|
120
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-orange-100 sm:w-[44%] md:w-[30%]">
|
|
121
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
122
|
-
// <h2 className="mt-4 text-xl font-bold text-white">New York</h2>
|
|
123
|
-
// <p className="text-sm text-white/50">United States</p>
|
|
124
|
-
// </div>
|
|
125
|
-
// <img
|
|
126
|
-
// src="https://source.unsplash.com/4HG5hlhmZg8"
|
|
127
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
128
|
-
// />
|
|
129
|
-
// </div>
|
|
130
|
-
|
|
131
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-blue-100 sm:w-[44%] md:w-[30%]">
|
|
132
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
133
|
-
// <h2 className="mt-4 text-xl font-bold text-white">London</h2>
|
|
134
|
-
// <p className="text-sm text-white/50">United Kingdom</p>
|
|
135
|
-
// </div>
|
|
136
|
-
// <img
|
|
137
|
-
// src="https://source.unsplash.com/oBmlsTW2pHY"
|
|
138
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
139
|
-
// />
|
|
140
|
-
// </div>
|
|
141
|
-
|
|
142
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-green-100 sm:w-[44%] md:w-[30%]">
|
|
143
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
144
|
-
// <h2 className="mt-4 text-xl font-bold text-white">Bali</h2>
|
|
145
|
-
// <p className="text-sm text-white/50">Indonesia</p>
|
|
146
|
-
// </div>
|
|
147
|
-
// <img
|
|
148
|
-
// src="https://source.unsplash.com/1kdIG_258bU"
|
|
149
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
150
|
-
// />
|
|
151
|
-
// </div>
|
|
152
|
-
|
|
153
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-rose-100 sm:w-[44%] md:w-[30%]">
|
|
154
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
155
|
-
// <h2 className="mt-4 text-xl font-bold text-white">
|
|
156
|
-
// Times Square
|
|
157
|
-
// </h2>
|
|
158
|
-
// <p className="text-sm text-white/50">Singapore</p>
|
|
159
|
-
// </div>
|
|
160
|
-
// <img
|
|
161
|
-
// src="https://source.unsplash.com/l8vKWxhVuts"
|
|
162
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
163
|
-
// />
|
|
164
|
-
// </div>
|
|
165
|
-
|
|
166
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-yellow-100 sm:w-[44%] md:w-[30%]">
|
|
167
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
168
|
-
// <h2 className="mt-4 text-xl font-bold text-white">Bangkok</h2>
|
|
169
|
-
// <p className="text-sm text-white/50">Thailand</p>
|
|
170
|
-
// </div>
|
|
171
|
-
// <img
|
|
172
|
-
// src="https://source.unsplash.com/0LGDmbnk0-U"
|
|
173
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
174
|
-
// />
|
|
175
|
-
// </div>
|
|
176
|
-
|
|
177
|
-
// <div className="md:2/3 relative aspect-[2/3] w-[90%] shrink-0 snap-start snap-always rounded-xl bg-red-100 sm:w-[44%] md:w-[30%]">
|
|
178
|
-
// <div className="absolute bottom-0 z-10 w-full rounded-xl bg-gradient-to-t from-black px-5 py-3">
|
|
179
|
-
// <h2 className="mt-4 text-xl font-bold text-white">Latina</h2>
|
|
180
|
-
// <p className="text-sm text-white/50">South America</p>
|
|
181
|
-
// </div>
|
|
182
|
-
// <img
|
|
183
|
-
// src="https://source.unsplash.com/tVqQSfXQ_SI"
|
|
184
|
-
// className="h-full w-full rounded-xl object-cover"
|
|
185
|
-
// />
|
|
186
|
-
// </div>
|
|
187
|
-
// </div>
|
|
188
|
-
// </div>
|
|
189
|
-
// </div>
|
|
190
|
-
// )
|
|
191
|
-
// }
|