mautourco-components 0.2.7 → 0.2.9
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/dist/components/atoms/Icon/Icon.d.ts +1 -0
- package/dist/components/atoms/Icon/Icon.js +3 -4
- package/dist/components/atoms/Icon/icons/Chevron.d.ts +2 -0
- package/dist/components/atoms/Icon/icons/Chevron.js +10 -10
- package/dist/components/atoms/Typography/Typography.d.ts +2 -0
- package/dist/components/atoms/Typography/Typography.js +13 -4
- package/dist/components/molecules/RatingTab/RatingTab.js +1 -1
- package/dist/components/molecules/ServiceSelector/ServiceSelector.d.ts +22 -0
- package/dist/components/molecules/ServiceSelector/ServiceSelector.js +85 -0
- package/dist/components/molecules/ServiceSelector/index.d.ts +2 -0
- package/dist/components/molecules/ServiceSelector/index.js +1 -0
- package/dist/components/organisms/PaxSelector/PaxSelector.js +3 -3
- package/dist/components/organisms/SearchBarTransfer/SearchBarTransfer.js +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/styles/components/molecule/service-selector.css +2310 -0
- package/dist/styles/components/organism/pax-selector.css +3 -15
- package/dist/styles/components/organism/search-bar-transfer.css +4 -10
- package/dist/styles/components/rating-tab.css +1 -3
- package/package.json +1 -1
- package/src/components/atoms/Icon/Icon.tsx +4 -3
- package/src/components/atoms/Icon/icons/Chevron.tsx +30 -11
- package/src/components/atoms/Typography/Typography.tsx +29 -2
- package/src/components/molecules/RatingTab/RatingTab.tsx +1 -1
- package/src/components/molecules/ServiceSelector/ServiceSelector.tsx +179 -0
- package/src/components/molecules/ServiceSelector/index.ts +3 -0
- package/src/components/organisms/PaxSelector/PaxSelector.tsx +4 -4
- package/src/components/organisms/SearchBarTransfer/SearchBarTransfer.tsx +3 -3
- package/src/styles/components/molecule/service-selector.css +228 -0
- package/src/styles/components/organism/pax-selector.css +3 -15
- package/src/styles/components/organism/search-bar-transfer.css +4 -10
- package/src/styles/components/rating-tab.css +1 -3
- package/src/components/atoms/Icon/icons/ChevronDownIcon.tsx +0 -46
|
@@ -2236,11 +2236,7 @@
|
|
|
2236
2236
|
}
|
|
2237
2237
|
|
|
2238
2238
|
.pax-selector__stepper-label {
|
|
2239
|
-
|
|
2240
|
-
font-weight: 700;
|
|
2241
|
-
font-size: 16px;
|
|
2242
|
-
line-height: 24px;
|
|
2243
|
-
color: var(--color-text-default, #262626);
|
|
2239
|
+
/* La couleur est maintenant gérée par la prop color="default" du composant Text */
|
|
2244
2240
|
}
|
|
2245
2241
|
|
|
2246
2242
|
.pax-selector__stepper-controls {
|
|
@@ -2669,11 +2665,7 @@
|
|
|
2669
2665
|
}
|
|
2670
2666
|
|
|
2671
2667
|
.pax-selector__age-section-title {
|
|
2672
|
-
|
|
2673
|
-
font-weight: var(--font-weight-font-bold, 700);
|
|
2674
|
-
font-size: 16px;
|
|
2675
|
-
line-height: 24px;
|
|
2676
|
-
color: var(--color-text-default, #262626);
|
|
2668
|
+
/* La couleur est maintenant gérée par la prop color="default" du composant Text */
|
|
2677
2669
|
margin: 0;
|
|
2678
2670
|
}
|
|
2679
2671
|
|
|
@@ -2722,11 +2714,7 @@
|
|
|
2722
2714
|
}
|
|
2723
2715
|
|
|
2724
2716
|
.pax-selector__room-name {
|
|
2725
|
-
|
|
2726
|
-
font-weight: var(--font-weight-font-bold, 700);
|
|
2727
|
-
font-size: 18px;
|
|
2728
|
-
line-height: 24px;
|
|
2729
|
-
color: var(--color-text-accent, #0f7173);
|
|
2717
|
+
/* La couleur est maintenant gérée par la prop color="accent" du composant Text */
|
|
2730
2718
|
margin: 0;
|
|
2731
2719
|
}
|
|
2732
2720
|
|
|
@@ -2099,10 +2099,6 @@
|
|
|
2099
2099
|
justify-content: space-between;
|
|
2100
2100
|
}
|
|
2101
2101
|
|
|
2102
|
-
.search-bar-transfer__title {
|
|
2103
|
-
color: var(--color-text-accent, #0f7173);
|
|
2104
|
-
}
|
|
2105
|
-
|
|
2106
2102
|
/* Mode Selector (Segmented Button) */
|
|
2107
2103
|
|
|
2108
2104
|
.search-bar-transfer__mode-selector {
|
|
@@ -2119,9 +2115,7 @@
|
|
|
2119
2115
|
justify-content: space-between;
|
|
2120
2116
|
}
|
|
2121
2117
|
|
|
2122
|
-
|
|
2123
|
-
color: var(--color-text-subtle);
|
|
2124
|
-
}
|
|
2118
|
+
/* La couleur est maintenant gérée par la prop color="subtle" du composant Text */
|
|
2125
2119
|
|
|
2126
2120
|
.search-bar-transfer__add-buttons {
|
|
2127
2121
|
display: flex;
|
|
@@ -2143,7 +2137,7 @@
|
|
|
2143
2137
|
display: flex;
|
|
2144
2138
|
align-items: center;
|
|
2145
2139
|
gap: 0.5rem;
|
|
2146
|
-
|
|
2140
|
+
/* La couleur du texte est maintenant gérée par la prop color="default" du composant Text */
|
|
2147
2141
|
}
|
|
2148
2142
|
|
|
2149
2143
|
/* Divider between categories */
|
|
@@ -2215,8 +2209,8 @@
|
|
|
2215
2209
|
gap: 1rem;
|
|
2216
2210
|
}
|
|
2217
2211
|
|
|
2218
|
-
|
|
2219
|
-
|
|
2212
|
+
/* Responsive: Réduire la taille du titre sur mobile */
|
|
2213
|
+
.search-bar-transfer__header .heading-md {
|
|
2220
2214
|
font-size: var(--font-size-text-2xl, 24px);
|
|
2221
2215
|
line-height: var(--font-leading-leading-2xl, 36px);
|
|
2222
2216
|
}
|
|
@@ -2114,9 +2114,7 @@
|
|
|
2114
2114
|
color: var(--checkbox-color-checkbox-checked-default, #0f7173);
|
|
2115
2115
|
}
|
|
2116
2116
|
|
|
2117
|
-
|
|
2118
|
-
color: var(--color-text-default, #262626);
|
|
2119
|
-
}
|
|
2117
|
+
/* La couleur est maintenant gérée par la prop color="default" du composant Text */
|
|
2120
2118
|
|
|
2121
2119
|
/* States */
|
|
2122
2120
|
|
package/package.json
CHANGED
|
@@ -14,7 +14,6 @@ import EyeIcon from "./icons/EyeIcon";
|
|
|
14
14
|
import InfoIcon from "./icons/InfoIcon";
|
|
15
15
|
import CheckCircleIcon from "./icons/CheckCircleIcon";
|
|
16
16
|
import StrollerIcon from "./icons/StrollerIcon";
|
|
17
|
-
import ChevronDownIcon from "./icons/ChevronDownIcon";
|
|
18
17
|
import CarIcon from "./icons/CarIcon";
|
|
19
18
|
import MoreIcon from "./icons/MoreIcon";
|
|
20
19
|
import Settings from "./icons/Settings";
|
|
@@ -74,6 +73,7 @@ interface IconProps {
|
|
|
74
73
|
size?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
75
74
|
className?: string;
|
|
76
75
|
color?: string;
|
|
76
|
+
style?: React.CSSProperties;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
const Icon: React.FC<IconProps> = ({
|
|
@@ -81,8 +81,9 @@ const Icon: React.FC<IconProps> = ({
|
|
|
81
81
|
size = "md",
|
|
82
82
|
className = "",
|
|
83
83
|
color,
|
|
84
|
+
style,
|
|
84
85
|
}) => {
|
|
85
|
-
const iconProps = { size, className, color };
|
|
86
|
+
const iconProps = { size, className, color, style };
|
|
86
87
|
|
|
87
88
|
switch (name) {
|
|
88
89
|
case "chevron-down":
|
|
@@ -124,7 +125,7 @@ const Icon: React.FC<IconProps> = ({
|
|
|
124
125
|
case "stroller":
|
|
125
126
|
return <StrollerIcon {...iconProps} />;
|
|
126
127
|
case "chevron-down-new":
|
|
127
|
-
return <
|
|
128
|
+
return <Chevron direction="down" variant="filled" {...iconProps} />;
|
|
128
129
|
case "car":
|
|
129
130
|
return <CarIcon {...iconProps} />;
|
|
130
131
|
case "more":
|
|
@@ -2,16 +2,20 @@ import React from 'react';
|
|
|
2
2
|
|
|
3
3
|
interface ChevronProps {
|
|
4
4
|
direction?: 'up' | 'down' | 'left' | 'right';
|
|
5
|
+
variant?: 'outline' | 'filled';
|
|
5
6
|
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
6
7
|
className?: string;
|
|
7
8
|
color?: string;
|
|
9
|
+
style?: React.CSSProperties;
|
|
8
10
|
}
|
|
9
11
|
|
|
10
12
|
const Chevron: React.FC<ChevronProps> = ({
|
|
11
13
|
direction = 'down',
|
|
14
|
+
variant = 'outline',
|
|
12
15
|
size = 'md',
|
|
13
16
|
className = '',
|
|
14
|
-
color
|
|
17
|
+
color,
|
|
18
|
+
style
|
|
15
19
|
}) => {
|
|
16
20
|
const getSizeClasses = () => {
|
|
17
21
|
switch (size) {
|
|
@@ -24,14 +28,13 @@ const Chevron: React.FC<ChevronProps> = ({
|
|
|
24
28
|
}
|
|
25
29
|
};
|
|
26
30
|
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
case 'left': return { transform: 'rotate(360deg)' };
|
|
32
|
-
case 'right': return { transform: 'rotate(360deg)' };
|
|
33
|
-
default: return { transform: 'rotate(0deg)' };
|
|
31
|
+
const getRotationStyle = () => {
|
|
32
|
+
if (variant === 'filled') {
|
|
33
|
+
const rotations = { up: 180, down: 0, left: 90, right: -90 };
|
|
34
|
+
return { transform: `rotate(${rotations[direction] || 0}deg)` };
|
|
34
35
|
}
|
|
36
|
+
// Outline variant doesn't need rotation (paths handle direction)
|
|
37
|
+
return { transform: 'rotate(0deg)' };
|
|
35
38
|
};
|
|
36
39
|
|
|
37
40
|
const getPath = () => {
|
|
@@ -50,14 +53,30 @@ const Chevron: React.FC<ChevronProps> = ({
|
|
|
50
53
|
};
|
|
51
54
|
|
|
52
55
|
const sizeClasses = getSizeClasses();
|
|
53
|
-
const directionStyle = getDirectionStyle();
|
|
54
56
|
const colorClass = color ? `text-${color}` : 'text-current';
|
|
55
57
|
const classes = `${sizeClasses} ${colorClass} ${className}`;
|
|
58
|
+
const rotationStyle = getRotationStyle();
|
|
59
|
+
const combinedStyle = style ? { ...rotationStyle, ...style } : rotationStyle;
|
|
56
60
|
|
|
57
|
-
return (
|
|
61
|
+
return variant === 'filled' ? (
|
|
62
|
+
<svg
|
|
63
|
+
className={classes}
|
|
64
|
+
style={combinedStyle}
|
|
65
|
+
viewBox="0 0 15 12"
|
|
66
|
+
fill="none"
|
|
67
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
68
|
+
>
|
|
69
|
+
<path
|
|
70
|
+
d="M12.4707 0.571533H2.07621C0.87817 0.571533 0.163582 1.90675 0.828137 2.90358L6.02536 10.6994C6.6191 11.59 7.92778 11.59 8.52151 10.6994L13.7187 2.90358C14.3833 1.90675 13.6687 0.571533 12.4707 0.571533Z"
|
|
71
|
+
fill="currentColor"
|
|
72
|
+
stroke="currentColor"
|
|
73
|
+
strokeWidth="1.14286"
|
|
74
|
+
/>
|
|
75
|
+
</svg>
|
|
76
|
+
) : (
|
|
58
77
|
<svg
|
|
59
78
|
className={classes}
|
|
60
|
-
style={
|
|
79
|
+
style={combinedStyle}
|
|
61
80
|
viewBox="0 0 24 24"
|
|
62
81
|
fill="none"
|
|
63
82
|
stroke="currentColor"
|
|
@@ -5,10 +5,24 @@ type BodySizeInput = BodyTokenSize | 'base' | 'xl';
|
|
|
5
5
|
type Variant = 'light' | 'regular' | 'medium' | 'bold' | 'black';
|
|
6
6
|
type Leading = 'none' | '4' | '5' | '6' | '7';
|
|
7
7
|
type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
|
|
8
|
+
type TextColor =
|
|
9
|
+
| 'default'
|
|
10
|
+
| 'accent'
|
|
11
|
+
| 'subtle'
|
|
12
|
+
| 'light'
|
|
13
|
+
| 'brand'
|
|
14
|
+
| 'inverted'
|
|
15
|
+
| 'state-default'
|
|
16
|
+
| 'state-hover'
|
|
17
|
+
| 'state-filled'
|
|
18
|
+
| 'state-disabled'
|
|
19
|
+
| 'state-error'
|
|
20
|
+
| 'state-success';
|
|
8
21
|
|
|
9
22
|
interface BaseProps {
|
|
10
23
|
variant?: Variant;
|
|
11
24
|
leading?: Leading;
|
|
25
|
+
color?: TextColor;
|
|
12
26
|
className?: string;
|
|
13
27
|
children: React.ReactNode;
|
|
14
28
|
onClick?: React.MouseEventHandler<Element>;
|
|
@@ -91,11 +105,19 @@ const buildVariantClass = (base: string, variant: Variant): string | undefined =
|
|
|
91
105
|
return `${base}--${variant}`;
|
|
92
106
|
};
|
|
93
107
|
|
|
108
|
+
const getColorStyle = (color?: TextColor): React.CSSProperties => {
|
|
109
|
+
if (!color) return {};
|
|
110
|
+
return {
|
|
111
|
+
color: `var(--color-text-${color}, inherit)`,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
|
|
94
115
|
|
|
95
116
|
export const Heading: React.FC<HeadingProps> = ({
|
|
96
117
|
level = 2,
|
|
97
118
|
variant = 'bold',
|
|
98
119
|
leading,
|
|
120
|
+
color,
|
|
99
121
|
as,
|
|
100
122
|
className = '',
|
|
101
123
|
children,
|
|
@@ -114,8 +136,10 @@ export const Heading: React.FC<HeadingProps> = ({
|
|
|
114
136
|
.filter(Boolean)
|
|
115
137
|
.join(' ');
|
|
116
138
|
|
|
139
|
+
const colorStyle = getColorStyle(color);
|
|
140
|
+
|
|
117
141
|
return (
|
|
118
|
-
<Tag className={classes} onClick={onClick}>
|
|
142
|
+
<Tag className={classes} style={colorStyle} onClick={onClick}>
|
|
119
143
|
{children}
|
|
120
144
|
</Tag>
|
|
121
145
|
);
|
|
@@ -126,6 +150,7 @@ export const Text: React.FC<TextProps> = ({
|
|
|
126
150
|
size = 'md',
|
|
127
151
|
variant = 'regular',
|
|
128
152
|
leading,
|
|
153
|
+
color,
|
|
129
154
|
as,
|
|
130
155
|
className = '',
|
|
131
156
|
children,
|
|
@@ -145,8 +170,10 @@ export const Text: React.FC<TextProps> = ({
|
|
|
145
170
|
.filter(Boolean)
|
|
146
171
|
.join(' ');
|
|
147
172
|
|
|
173
|
+
const colorStyle = getColorStyle(color);
|
|
174
|
+
|
|
148
175
|
return (
|
|
149
|
-
<Tag className={classes} onClick={onClick}>
|
|
176
|
+
<Tag className={classes} style={colorStyle} onClick={onClick}>
|
|
150
177
|
{children}
|
|
151
178
|
</Tag>
|
|
152
179
|
);
|
|
@@ -81,7 +81,7 @@ const RatingTab: React.FC<RatingTabProps> = ({
|
|
|
81
81
|
<div className="rating-tab__checkbox">
|
|
82
82
|
{checked && <Check size="sm" className="rating-tab__checkbox-icon" />}
|
|
83
83
|
</div>
|
|
84
|
-
<Text size="sm" className="rating-tab__label">
|
|
84
|
+
<Text size="sm" color="default" className="rating-tab__label">
|
|
85
85
|
{label}
|
|
86
86
|
</Text>
|
|
87
87
|
</div>
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import React, { useState, useRef, useEffect } from 'react';
|
|
2
|
+
import Icon from '../../atoms/Icon/Icon';
|
|
3
|
+
import { Text } from '../../atoms/Typography/Typography';
|
|
4
|
+
import '../../../styles/components/molecule/service-selector.css';
|
|
5
|
+
|
|
6
|
+
export type ServiceType = 'transfer' | 'accommodation' | 'excursion';
|
|
7
|
+
|
|
8
|
+
export interface ServiceOption {
|
|
9
|
+
value: ServiceType;
|
|
10
|
+
label: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
badge?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface ServiceSelectorProps {
|
|
17
|
+
/** Selected service */
|
|
18
|
+
value?: ServiceType;
|
|
19
|
+
/** Change handler */
|
|
20
|
+
onChange: (value: ServiceType) => void;
|
|
21
|
+
/** Disabled state */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
/** Additional CSS classes */
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const DEFAULT_OPTIONS: ServiceOption[] = [
|
|
28
|
+
{
|
|
29
|
+
value: 'accommodation',
|
|
30
|
+
label: 'Accommodation',
|
|
31
|
+
icon: 'building',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
value: 'transfer',
|
|
35
|
+
label: 'Transfer',
|
|
36
|
+
icon: 'car',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
value: 'excursion',
|
|
40
|
+
label: 'Excursion',
|
|
41
|
+
icon: 'map-pin',
|
|
42
|
+
disabled: true,
|
|
43
|
+
badge: 'Coming soon',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const ServiceSelector: React.FC<ServiceSelectorProps> = ({
|
|
48
|
+
value,
|
|
49
|
+
onChange,
|
|
50
|
+
disabled = false,
|
|
51
|
+
className = '',
|
|
52
|
+
}) => {
|
|
53
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
54
|
+
const dropdownRef = useRef<HTMLDivElement>(null);
|
|
55
|
+
|
|
56
|
+
// Close dropdown when clicking outside
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
const handleClickOutside = (event: MouseEvent) => {
|
|
59
|
+
if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
|
|
60
|
+
setIsOpen(false);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
65
|
+
return () => {
|
|
66
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
67
|
+
};
|
|
68
|
+
}, []);
|
|
69
|
+
|
|
70
|
+
const handleToggleDropdown = () => {
|
|
71
|
+
if (!disabled) {
|
|
72
|
+
setIsOpen(!isOpen);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const handleOptionSelect = (option: ServiceOption) => {
|
|
77
|
+
if (disabled || option.disabled) return;
|
|
78
|
+
onChange(option.value);
|
|
79
|
+
setIsOpen(false);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const getDropdownState = () => {
|
|
83
|
+
if (disabled) return 'disabled';
|
|
84
|
+
// If a service is selected, always show selected state (even if open)
|
|
85
|
+
if (value) return 'selected';
|
|
86
|
+
if (isOpen) return 'open';
|
|
87
|
+
return 'default';
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const selectedOption = value ? DEFAULT_OPTIONS.find(opt => opt.value === value) : null;
|
|
91
|
+
const displayText = selectedOption ? selectedOption.label : 'Select a service';
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<div ref={dropdownRef} className={`service-selector ${className}`}>
|
|
95
|
+
<button
|
|
96
|
+
type="button"
|
|
97
|
+
className={`service-selector__trigger service-selector__trigger--${getDropdownState()}`}
|
|
98
|
+
onClick={handleToggleDropdown}
|
|
99
|
+
disabled={disabled}
|
|
100
|
+
aria-expanded={isOpen}
|
|
101
|
+
aria-haspopup="listbox"
|
|
102
|
+
>
|
|
103
|
+
<div className="service-selector__trigger-content">
|
|
104
|
+
{selectedOption && (
|
|
105
|
+
<Icon
|
|
106
|
+
name={selectedOption.icon as any}
|
|
107
|
+
size="md"
|
|
108
|
+
className="service-selector__trigger-icon"
|
|
109
|
+
/>
|
|
110
|
+
)}
|
|
111
|
+
<Text
|
|
112
|
+
size="base"
|
|
113
|
+
variant="bold"
|
|
114
|
+
className="service-selector__trigger-text"
|
|
115
|
+
>
|
|
116
|
+
{displayText}
|
|
117
|
+
</Text>
|
|
118
|
+
</div>
|
|
119
|
+
<Icon
|
|
120
|
+
name="chevron-down-new"
|
|
121
|
+
size="sm"
|
|
122
|
+
className="service-selector__trigger-chevron"
|
|
123
|
+
style={{
|
|
124
|
+
transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',
|
|
125
|
+
transition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
|
|
126
|
+
transformOrigin: 'center'
|
|
127
|
+
}}
|
|
128
|
+
/>
|
|
129
|
+
</button>
|
|
130
|
+
|
|
131
|
+
{isOpen && (
|
|
132
|
+
<div className="service-selector__panel" role="listbox">
|
|
133
|
+
<div className="service-selector__content">
|
|
134
|
+
<div className="service-selector__options-wrapper">
|
|
135
|
+
{DEFAULT_OPTIONS.map((option) => {
|
|
136
|
+
const isSelected = value === option.value;
|
|
137
|
+
const isDisabled = option.disabled || disabled;
|
|
138
|
+
|
|
139
|
+
return (
|
|
140
|
+
<button
|
|
141
|
+
key={option.value}
|
|
142
|
+
type="button"
|
|
143
|
+
className={`service-selector__option ${isSelected ? 'service-selector__option--selected' : ''} ${isDisabled ? 'service-selector__option--disabled' : ''}`}
|
|
144
|
+
onClick={() => handleOptionSelect(option)}
|
|
145
|
+
disabled={isDisabled}
|
|
146
|
+
role="option"
|
|
147
|
+
aria-selected={isSelected}
|
|
148
|
+
>
|
|
149
|
+
<Icon
|
|
150
|
+
name={option.icon as any}
|
|
151
|
+
size="md"
|
|
152
|
+
className={`service-selector__option-icon ${isSelected ? 'service-selector__option-icon--selected' : ''}`}
|
|
153
|
+
/>
|
|
154
|
+
<Text
|
|
155
|
+
size="base"
|
|
156
|
+
variant="bold"
|
|
157
|
+
color={isSelected ? 'inverted' : 'default'}
|
|
158
|
+
className="service-selector__option-text"
|
|
159
|
+
>
|
|
160
|
+
{option.label}
|
|
161
|
+
</Text>
|
|
162
|
+
{option.badge && (
|
|
163
|
+
<span className="service-selector__option-badge">
|
|
164
|
+
{option.badge}
|
|
165
|
+
</span>
|
|
166
|
+
)}
|
|
167
|
+
</button>
|
|
168
|
+
);
|
|
169
|
+
})}
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
)}
|
|
174
|
+
</div>
|
|
175
|
+
);
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export default ServiceSelector;
|
|
179
|
+
|
|
@@ -285,7 +285,7 @@ const StepperRow: React.FC<StepperRowProps> = ({
|
|
|
285
285
|
|
|
286
286
|
return (
|
|
287
287
|
<div className="pax-selector__stepper">
|
|
288
|
-
<Text size="base" variant="bold" className="pax-selector__stepper-label">
|
|
288
|
+
<Text size="base" variant="bold" color="default" className="pax-selector__stepper-label">
|
|
289
289
|
{label}
|
|
290
290
|
</Text>
|
|
291
291
|
<div className="pax-selector__stepper-controls">
|
|
@@ -467,7 +467,7 @@ const RoomEditor: React.FC<RoomEditorProps> = ({
|
|
|
467
467
|
<div className="pax-selector__room-container">
|
|
468
468
|
<div className="pax-selector__room-header">
|
|
469
469
|
<div className="pax-selector__room-title">
|
|
470
|
-
<Text size="lg" variant="bold" className="pax-selector__room-name">
|
|
470
|
+
<Text size="lg" variant="bold" color="accent" className="pax-selector__room-name">
|
|
471
471
|
Room {roomNumber}
|
|
472
472
|
</Text>
|
|
473
473
|
<Icon name="home" size="md" className="pax-selector__room-icon" />
|
|
@@ -516,7 +516,7 @@ const RoomEditor: React.FC<RoomEditorProps> = ({
|
|
|
516
516
|
{/* Age specification section */}
|
|
517
517
|
{((room.teens > 0) || (room.children > 0) || (room.infants > 0)) && (
|
|
518
518
|
<div className="pax-selector__age-section">
|
|
519
|
-
<Text size="base" variant="bold" className="pax-selector__age-section-title">
|
|
519
|
+
<Text size="base" variant="bold" color="default" className="pax-selector__age-section-title">
|
|
520
520
|
Please specify the age :
|
|
521
521
|
</Text>
|
|
522
522
|
|
|
@@ -857,7 +857,7 @@ const PaxSelector: React.FC<PaxSelectorProps> = ({
|
|
|
857
857
|
{/* Age specification for single room */}
|
|
858
858
|
{((internalData.teens > 0) || (internalData.children > 0) || (internalData.infants > 0)) && (
|
|
859
859
|
<div className="pax-selector__age-section">
|
|
860
|
-
<Text size="base" variant="bold" className="pax-selector__age-section-title">
|
|
860
|
+
<Text size="base" variant="bold" color="default" className="pax-selector__age-section-title">
|
|
861
861
|
Please specify the age :
|
|
862
862
|
</Text>
|
|
863
863
|
|
|
@@ -210,7 +210,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
210
210
|
<div className={`search-bar-transfer ${className}`}>
|
|
211
211
|
{/* Header with title and mode selector */}
|
|
212
212
|
<div className="search-bar-transfer__header">
|
|
213
|
-
<Heading level={5} variant="bold"
|
|
213
|
+
<Heading level={5} variant="bold" color="accent">
|
|
214
214
|
Select your transfer details
|
|
215
215
|
</Heading>
|
|
216
216
|
|
|
@@ -241,7 +241,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
241
241
|
<>
|
|
242
242
|
{/* Transfer type selector */}
|
|
243
243
|
<div className="search-bar-transfer__transfer-type">
|
|
244
|
-
<Text size="lg" variant="bold" as="div" className="search-bar-transfer__transfer-type-label">
|
|
244
|
+
<Text size="lg" variant="bold" color="subtle" as="div" className="search-bar-transfer__transfer-type-label">
|
|
245
245
|
Select a transfer type you want to add
|
|
246
246
|
</Text>
|
|
247
247
|
<div className="search-bar-transfer__add-buttons">
|
|
@@ -303,7 +303,7 @@ const SearchBarTransfer: React.FC<SearchBarTransferProps> = ({
|
|
|
303
303
|
{/* Category header */}
|
|
304
304
|
<div className="search-bar-transfer__category-header">
|
|
305
305
|
<Icon name={categoryInfo[type].icon} size="md" />
|
|
306
|
-
<Text size="md" variant="bold" as="span">
|
|
306
|
+
<Text size="md" variant="bold" color="default" as="span">
|
|
307
307
|
{categoryInfo[type].label}
|
|
308
308
|
</Text>
|
|
309
309
|
</div>
|