@qite/tide-booking-component 1.2.3 → 1.2.4

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 (47) hide show
  1. package/build/build-cjs/booking-product/components/footer.d.ts +1 -0
  2. package/build/build-cjs/booking-product/components/rooms.d.ts +2 -0
  3. package/build/build-cjs/booking-wizard/features/booking/selectors.d.ts +1 -1
  4. package/build/build-cjs/booking-wizard/types.d.ts +0 -1
  5. package/build/build-cjs/index.js +275 -44
  6. package/build/build-cjs/shared/utils/localization-util.d.ts +3 -0
  7. package/build/build-esm/booking-product/components/footer.d.ts +1 -0
  8. package/build/build-esm/booking-product/components/rooms.d.ts +2 -0
  9. package/build/build-esm/booking-wizard/features/booking/selectors.d.ts +1 -1
  10. package/build/build-esm/booking-wizard/types.d.ts +0 -1
  11. package/build/build-esm/index.js +276 -45
  12. package/build/build-esm/shared/utils/localization-util.d.ts +3 -0
  13. package/package.json +1 -1
  14. package/rollup.config.js +23 -23
  15. package/src/booking-product/components/footer.tsx +7 -1
  16. package/src/booking-product/components/product.tsx +4 -0
  17. package/src/booking-product/components/rating.tsx +21 -21
  18. package/src/booking-product/components/rooms.tsx +5 -2
  19. package/src/booking-wizard/components/icon.tsx +250 -1
  20. package/src/booking-wizard/components/labeled-input.tsx +64 -64
  21. package/src/booking-wizard/components/labeled-select.tsx +69 -69
  22. package/src/booking-wizard/features/booking/selectors.ts +12 -2
  23. package/src/booking-wizard/features/flight-options/flight-filter.tsx +16 -3
  24. package/src/booking-wizard/features/flight-options/flight-option-flight.tsx +8 -6
  25. package/src/booking-wizard/features/flight-options/flight-option.tsx +1 -1
  26. package/src/booking-wizard/features/product-options/option-pax-card.tsx +93 -22
  27. package/src/booking-wizard/features/product-options/option-units-card.tsx +93 -21
  28. package/src/booking-wizard/features/sidebar/sidebar-flight.tsx +2 -2
  29. package/src/booking-wizard/features/summary/summary.tsx +3 -1
  30. package/src/shared/utils/class-util.ts +9 -9
  31. package/styles/booking-wizard-variables.scss +530 -0
  32. package/styles/booking-wizard.scss +23 -1
  33. package/styles/components/_booking.scss +1409 -0
  34. package/styles/components/_checkbox.scss +215 -0
  35. package/styles/components/_cta.scss +80 -14
  36. package/styles/components/_date-range-picker.scss +1 -0
  37. package/styles/components/_flight-option.scss +1389 -0
  38. package/styles/components/_form.scss +258 -0
  39. package/styles/components/_list.scss +82 -0
  40. package/styles/components/_mixins.scss +17 -5
  41. package/styles/components/_placeholders.scss +2 -2
  42. package/styles/components/_pricing-summary.scss +117 -0
  43. package/styles/components/_select-wrapper.scss +66 -0
  44. package/styles/components/_step-indicators.scss +160 -0
  45. package/styles/components/_table.scss +81 -0
  46. package/styles/components/_tree.scss +540 -0
  47. package/tsconfig.json +24 -24
package/rollup.config.js CHANGED
@@ -1,23 +1,23 @@
1
- import commonjs from "@rollup/plugin-commonjs";
2
- import del from "rollup-plugin-delete";
3
- import json from "@rollup/plugin-json";
4
- import nodeResolve from "@rollup/plugin-node-resolve";
5
- import packageJson from "./package.json";
6
- import peerDepsExternal from "rollup-plugin-peer-deps-external";
7
- import typescript from "rollup-plugin-typescript2";
8
-
9
- export default {
10
- input: "src/index.ts",
11
- output: [
12
- { file: packageJson.main, format: "cjs", banner: "/* eslint-disable */" },
13
- { file: packageJson.module, format: "esm", banner: "/* eslint-disable */" },
14
- ],
15
- plugins: [
16
- peerDepsExternal(),
17
- json(),
18
- nodeResolve(),
19
- commonjs(),
20
- typescript(),
21
- del({ targets: ["build/*"] }),
22
- ],
23
- };
1
+ import commonjs from "@rollup/plugin-commonjs";
2
+ import del from "rollup-plugin-delete";
3
+ import json from "@rollup/plugin-json";
4
+ import nodeResolve from "@rollup/plugin-node-resolve";
5
+ import packageJson from "./package.json";
6
+ import peerDepsExternal from "rollup-plugin-peer-deps-external";
7
+ import typescript from "rollup-plugin-typescript2";
8
+
9
+ export default {
10
+ input: "src/index.ts",
11
+ output: [
12
+ { file: packageJson.main, format: "cjs", banner: "/* eslint-disable */" },
13
+ { file: packageJson.module, format: "esm", banner: "/* eslint-disable */" },
14
+ ],
15
+ plugins: [
16
+ peerDepsExternal(),
17
+ json(),
18
+ nodeResolve(),
19
+ commonjs(),
20
+ typescript(),
21
+ del({ targets: ["build/*"] }),
22
+ ],
23
+ };
@@ -2,11 +2,13 @@ import React, { useContext } from "react";
2
2
  import Loader from "../../shared/components/loader";
3
3
  import { getTranslations } from "../../shared/utils/localization-util";
4
4
  import SettingsContext from "../settings-context";
5
+ import { buildClassName } from "../../shared/utils/class-util";
5
6
 
6
7
  interface FooterProps {
7
8
  priceText: string | undefined;
8
9
  isLoading: boolean;
9
10
  isOffer: boolean | undefined;
11
+ roomsIsDisabled: boolean;
10
12
  handleBookClick: () => void;
11
13
  }
12
14
 
@@ -14,6 +16,7 @@ const Footer: React.FC<FooterProps> = ({
14
16
  priceText,
15
17
  isLoading,
16
18
  isOffer,
19
+ roomsIsDisabled,
17
20
  handleBookClick
18
21
  }) => {
19
22
  const {
@@ -41,7 +44,10 @@ const Footer: React.FC<FooterProps> = ({
41
44
  )}
42
45
  <div className="booking-product_footer-actions">
43
46
  {priceText ? (
44
- <button type="button" className="cta" onClick={handleBookClick}>
47
+ <button type="button" className={buildClassName([
48
+ "cta",
49
+ !roomsIsDisabled && "cta--disabled"
50
+ ])} onClick={handleBookClick} disabled={!roomsIsDisabled}>
45
51
  {isOffer ? translations.PRODUCT.TO_YOUR_OFFER : translations.PRODUCT.BOOK_NOW}
46
52
  </button>
47
53
  ) : ((alternativeActionText && alternativeAction)
@@ -45,6 +45,7 @@ const Product: React.FC<ProductProps> = ({
45
45
 
46
46
  const [loaded, setLoaded] = useState<boolean>(false);
47
47
  const [isLoading, setIsLoading] = useState<boolean>(false);
48
+ const [roomsIsDisabled, setRoomsIsDisabled] = useState<boolean>(true);
48
49
  const [price, setPrice] = useState<number>();
49
50
  const [hasFlight, setHasFlight] = useState<boolean>(false);
50
51
  const [hasTransfer, setHasTransfer] = useState<boolean>(false);
@@ -259,6 +260,8 @@ const Product: React.FC<ProductProps> = ({
259
260
  <div className="booking-product__body">
260
261
  <Rooms
261
262
  rooms={rooms}
263
+ isDisabled={roomsIsDisabled}
264
+ setIsDisabled={setRoomsIsDisabled}
262
265
  onChange={handleRoomChange} />
263
266
  <Dates
264
267
  value={dateRange}
@@ -269,6 +272,7 @@ const Product: React.FC<ProductProps> = ({
269
272
  priceText={priceText}
270
273
  isLoading={isLoading}
271
274
  isOffer={isOffer}
275
+ roomsIsDisabled={roomsIsDisabled}
272
276
  handleBookClick={handleBookClick} />
273
277
  </div>
274
278
  );
@@ -1,21 +1,21 @@
1
- import React from "react";
2
- import { clamp, range } from "lodash";
3
- import Icon from "./icon";
4
-
5
- interface RatingProps {
6
- rating: number;
7
- }
8
-
9
- const Rating: React.FC<RatingProps> = ({ rating }) => {
10
- const clampedRating = clamp(rating, 0, 5);
11
- return (
12
- <div className="rating">
13
- {range(0, Math.floor(clampedRating)).map((i) => (
14
- <Icon name="ui-star" key={`rating-star-${i}`} width={25} height={25} />
15
- ))}
16
- {rating % 1 > 0 && <Icon name="ui-halfstar" width={25} height={25} />}
17
- </div>
18
- );
19
- };
20
-
21
- export default Rating;
1
+ import React from "react";
2
+ import { clamp, range } from "lodash";
3
+ import Icon from "./icon";
4
+
5
+ interface RatingProps {
6
+ rating: number;
7
+ }
8
+
9
+ const Rating: React.FC<RatingProps> = ({ rating }) => {
10
+ const clampedRating = clamp(rating, 0, 5);
11
+ return (
12
+ <div className="rating">
13
+ {range(0, Math.floor(clampedRating)).map((i) => (
14
+ <Icon name="ui-star" key={`rating-star-${i}`} width={25} height={25} />
15
+ ))}
16
+ {rating % 1 > 0 && <Icon name="ui-halfstar" width={25} height={25} />}
17
+ </div>
18
+ );
19
+ };
20
+
21
+ export default Rating;
@@ -10,15 +10,18 @@ import Icon from "./icon";
10
10
 
11
11
  interface RoomsProps {
12
12
  rooms: ProductRoom[];
13
+ isDisabled: boolean,
14
+ setIsDisabled: (isOpen: boolean) => void;
13
15
  onChange: (rooms: ProductRoom[]) => void;
14
16
  }
15
17
 
16
18
  const Rooms: React.FC<RoomsProps> = ({
17
19
  rooms,
18
- onChange
20
+ isDisabled,
21
+ setIsDisabled,
22
+ onChange,
19
23
  }) => {
20
24
 
21
- const [isDisabled, setIsDisabled] = useState<boolean>(true);
22
25
  const [isTouched, setIsTouched] = useState<boolean>(false);
23
26
  const [currentRooms, setRoomState] = useState<ProductRoom[]>(rooms);
24
27
 
@@ -1,6 +1,7 @@
1
1
  import { isEmpty } from "lodash";
2
2
  import React, { useContext } from "react";
3
3
  import SettingsContext from "../settings-context";
4
+ import HTMLComment from "react-html-comment";
4
5
 
5
6
  interface IconProps {
6
7
  name: string;
@@ -32,25 +33,273 @@ const Icon: React.FC<IconProps> = ({
32
33
 
33
34
  switch (name) {
34
35
  case "ui-chevron":
36
+ return (<svg className={["icon", `icon--${name}`, className]
37
+ .filter((className) => !isEmpty(className))
38
+ .join(" ")}
39
+ width={width}
40
+ height={height}
41
+ viewBox="0 0 320 512"
42
+ >
43
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
44
+ {title && <title>{title}</title>}
45
+ <path d="M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z"/>
46
+ </svg>);
47
+
35
48
  case "ui-error":
49
+ return (<svg className={["icon", `icon--${name}`, className]
50
+ .filter((className) => !isEmpty(className))
51
+ .join(" ")}
52
+ width={width}
53
+ height={height}
54
+ viewBox="0 0 512 512"
55
+ >
56
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
57
+ {title && <title>{title}</title>}
58
+ <path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm0-384c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"/>
59
+ </svg>);
60
+
36
61
  case "ui-tel":
62
+ return (<svg className={["icon", `icon--${name}`, className]
63
+ .filter((className) => !isEmpty(className))
64
+ .join(" ")}
65
+ width={width}
66
+ height={height}
67
+ viewBox="0 0 512 512"
68
+ >
69
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
70
+ {title && <title>{title}</title>}
71
+ <path d="M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z"/>
72
+ </svg>);
73
+
37
74
  case "ui-mail":
75
+ return (<svg className={["icon", `icon--${name}`, className]
76
+ .filter((className) => !isEmpty(className))
77
+ .join(" ")}
78
+ width={width}
79
+ height={height}
80
+ viewBox="0 0 512 512"
81
+ >
82
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
83
+ {title && <title>{title}</title>}
84
+ <path d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48L48 64zM0 176L0 384c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-208L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z"/>
85
+ </svg>);
86
+
38
87
  case "ui-home":
88
+
39
89
  case "ui-filter":
90
+ return (<svg className={["icon", `icon--${name}`, className]
91
+ .filter((className) => !isEmpty(className))
92
+ .join(" ")}
93
+ width={width}
94
+ height={height}
95
+ viewBox="0 0 10.701 9.698"
96
+ >
97
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
98
+ {title && <title>{title}</title>}
99
+ <g id="filter-solid" transform="translate(-2.667 -5.333)">
100
+ <path id="Path_54" data-name="Path 54" d="M9.355,15.031V10.517l3.836-3.846a.605.605,0,0,0,.177-.435V5.668a.334.334,0,0,0-.334-.334H3a.334.334,0,0,0-.334.334v.558a.6.6,0,0,0,.177.425L6.68,10.544v3.411Z" transform="translate(0 0)" fill="#12aad8"/>
101
+ <path id="Path_55" data-name="Path 55" d="M13.194,5.333H2.827a.174.174,0,0,0-.161.174v.575A.445.445,0,0,0,2.8,6.4L6.81,10.413v3.344l2.425,1.207V10.406l4.013-4.013a.451.451,0,0,0,.12-.3V5.507a.174.174,0,0,0-.174-.174Z" />
102
+ </g>
103
+ </svg>);
104
+
40
105
  case "ui-close":
106
+ return (<svg className={["icon", `icon--${name}`, className]
107
+ .filter((className) => !isEmpty(className))
108
+ .join(" ")}
109
+ width={width}
110
+ height={height}
111
+ viewBox="0 0 384 512"
112
+ >
113
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
114
+ {title && <title>{title}</title>}
115
+ <path d="M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"/>
116
+ </svg>);
117
+
41
118
  case "ui-ticket":
119
+ return (<svg className={["icon", `icon--${name}`, className]
120
+ .filter((className) => !isEmpty(className))
121
+ .join(" ")}
122
+ width={width}
123
+ height={height}
124
+ viewBox="0 0 20 20"
125
+ >
126
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
127
+ {title && <title>{title}</title>}
128
+ <g id="ticket" transform="translate(0.439 1.629)">
129
+ <path id="Path_14" data-name="Path 14" d="M12.125,5.335l3.751,3.751L9.086,15.875,5.335,12.125Zm-2.5,11.62L16.955,9.62a.745.745,0,0,0,0-1.068l-4.3-4.3a.774.774,0,0,0-1.068,0L4.255,11.59a.745.745,0,0,0,0,1.068l4.3,4.3a.774.774,0,0,0,1.068,0ZM20.172,9.395,9.406,20.172a1.533,1.533,0,0,1-2.148,0l-1.5-1.5a2.293,2.293,0,0,0,0-3.228,2.2,2.2,0,0,0-1.614-.665,2.2,2.2,0,0,0-1.614.665l-1.484-1.5a1.533,1.533,0,0,1,0-2.148L11.816,1.05a1.533,1.533,0,0,1,2.148,0l1.484,1.484a2.2,2.2,0,0,0-.665,1.614,2.2,2.2,0,0,0,.665,1.614,2.293,2.293,0,0,0,3.228,0l1.5,1.484a1.533,1.533,0,0,1,0,2.148Z" transform="translate(-1.05 -2.24)"/>
130
+ </g>
131
+ </svg>);
132
+
42
133
  case "ui-payback":
134
+ return (<svg className={["icon", `icon--${name}`, className]
135
+ .filter((className) => !isEmpty(className))
136
+ .join(" ")}
137
+ width={width}
138
+ height={height}
139
+ viewBox="0 0 20 20.154"
140
+ >
141
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
142
+ {title && <title>{title}</title>}
143
+ <g id="layer1" transform="translate(-205.148 -293.014)">
144
+ <path id="path453469" d="M223.472,306.895a1.674,1.674,0,0,0-1.188.487l-1.971,1.972a1.67,1.67,0,0,0-.978-.726l-4.652-1.247a2.766,2.766,0,0,0-2.182.331l-2.9,1.832-.235-.408a1.089,1.089,0,0,0-1.471-.394l-2.209,1.274a1.089,1.089,0,0,0-.394,1.471l3.291,5.7a1.088,1.088,0,0,0,1.47.4l2.209-1.276a1.09,1.09,0,0,0,.395-1.471l-.043-.076,1.258-.85,4.63.911a1.742,1.742,0,0,0,1.653-.514c1.493-1.527,2.988-3.048,4.505-4.544l0,0a1.675,1.675,0,0,0-1.189-2.863Zm0,1.332a.336.336,0,0,1,.238.1.323.323,0,0,1,0,.476c-1.525,1.5-3.024,3.031-4.518,4.559a1.847,1.847,0,0,1-.433.134l-4.9-.963a.672.672,0,0,0-.507.1l-1.411.954-1.667-2.886,2.947-1.858a1.411,1.411,0,0,1,1.118-.171l4.652,1.247a.336.336,0,1,1-.175.65l-2.92-.782a.672.672,0,0,0-.348,1.3l2.92.782a1.693,1.693,0,0,0,1.741-.572.672.672,0,0,0,.177-.118l2.85-2.852A.336.336,0,0,1,223.472,308.226Zm-15.14,1.812.325.564a.615.615,0,0,0,.253.438l2.445,4.235-1.745,1.008-3.024-5.237Z" transform="translate(0 -4.554)" fill-rule="evenodd"/>
145
+ <path id="path453459" d="M223.672,301.014a.672.672,0,1,0,0,1.344h1.344a.672.672,0,1,0,0-1.344Z" transform="translate(-5.857 -2.625)" fill-rule="evenodd"/>
146
+ <path id="path453437" d="M223.672,297.014a.672.672,0,0,0,0,1.344h1.344a.672.672,0,0,0,0-1.344Z" transform="translate(-5.857 -1.312)" fill-rule="evenodd"/>
147
+ <path id="rect18334" d="M222.7,293.014a4.7,4.7,0,1,0,4.7,4.7A4.714,4.714,0,0,0,222.7,293.014Zm0,1.344a3.359,3.359,0,1,1-3.359,3.359A3.349,3.349,0,0,1,222.7,294.357Z" transform="translate(-4.217)" fill-rule="evenodd"/>
148
+ </g>
149
+ </svg>);
150
+
43
151
  case "ui-backpack":
152
+ return (<svg className={["icon", `icon--${name}`, className]
153
+ .filter((className) => !isEmpty(className))
154
+ .join(" ")}
155
+ width={width}
156
+ height={height}
157
+ viewBox="0 0 14.499 16.11"
158
+ >
159
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
160
+ {title && <title>{title}</title>}
161
+ <path id="Path_2" data-name="Path 2" d="M22.444,28.805A.805.805,0,0,0,21.639,28H16.806a.806.806,0,0,0-.806.806v1.611h6.444ZM16,32.027h6.444v2.417H16Z" transform="translate(-11.972 -18.334)" />
162
+ <path id="Path_3" data-name="Path 3" d="M20.5,12.055a4.837,4.837,0,0,0-4.028-4.761V6.417A2.419,2.419,0,0,0,14.055,4H12.444a2.419,2.419,0,0,0-2.417,2.417v.878A4.837,4.837,0,0,0,6,12.055V18.5A1.613,1.613,0,0,0,7.611,20.11h.806V14.472a2.419,2.419,0,0,1,2.417-2.417h4.833a2.419,2.419,0,0,1,2.417,2.417V20.11h.806A1.613,1.613,0,0,0,20.5,18.5ZM11.639,6.417a.806.806,0,0,1,.806-.806h1.611a.805.805,0,0,1,.805.806v.806H11.639Z" transform="translate(-6 -4)"/>
163
+ </svg>);
164
+
44
165
  case "ui-suitcase":
166
+ return (<svg className={["icon", `icon--${name}`, className]
167
+ .filter((className) => !isEmpty(className))
168
+ .join(" ")}
169
+ width={width}
170
+ height={height}
171
+ viewBox="0 0 15.992 13.708"
172
+ >
173
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
174
+ {title && <title>{title}</title>}
175
+ <path id="Path_21" data-name="Path 21" d="M5.712,2.285h4.569V1.142H5.712Zm-3.141,0V13.708H2a1.924,1.924,0,0,1-1.41-.589A1.924,1.924,0,0,1,0,11.709V4.284a1.924,1.924,0,0,1,.589-1.41A1.924,1.924,0,0,1,2,2.285Zm10,0V13.708H3.427V2.285H4.569V.857A.826.826,0,0,1,4.819.25.826.826,0,0,1,5.426,0h5.14a.826.826,0,0,1,.607.25.826.826,0,0,1,.25.607V2.285Zm3.427,2v7.425a2.011,2.011,0,0,1-2,2h-.571V2.285h.571a1.924,1.924,0,0,1,1.41.589A1.924,1.924,0,0,1,15.992,4.284Z" transform="translate(0 0)"/>
176
+ </svg>);
177
+
45
178
  case "ui-business-lounge":
179
+ return (<svg className={["icon", `icon--${name}`, className]
180
+ .filter((className) => !isEmpty(className))
181
+ .join(" ")}
182
+ width={width}
183
+ height={height}
184
+ viewBox="0 0 20 19.999"
185
+ >
186
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
187
+ {title && <title>{title}</title>}
188
+ <g id="waiting-room-svgrepo-com" transform="translate(0 -0.008)">
189
+ <g id="Group_46" data-name="Group 46" transform="translate(0 0.008)">
190
+ <g id="Group_45" data-name="Group 45" transform="translate(0)">
191
+ <path id="Path_33" data-name="Path 33" d="M65.683,110.007a1.667,1.667,0,1,0-1.667-1.667A1.666,1.666,0,0,0,65.683,110.007Z" transform="translate(-61.515 -102.507)" />
192
+ <path id="Path_34" data-name="Path 34" d="M6.25,242.2H2.418L.824,235.025a.417.417,0,1,0-.814.181l1.657,7.455v2.454a.417.417,0,1,0,.833,0v-2.083H5v2.083a.417.417,0,1,0,.833,0v-2.083h.417a.417.417,0,0,0,0-.833Z" transform="translate(0 -225.532)" />
193
+ <path id="Path_35" data-name="Path 35" d="M281.933.008a4.583,4.583,0,1,0,4.583,4.583A4.588,4.588,0,0,0,281.933.008Zm1.667,5h-1.667a.417.417,0,0,1-.417-.417v-2.5a.417.417,0,0,1,.833,0V4.175h1.25a.417.417,0,1,1,0,.833Z" transform="translate(-266.516 -0.008)" />
194
+ <path id="Path_36" data-name="Path 36" d="M70.265,218.341H67.348v-3.333a1.667,1.667,0,0,0-3.333,0v4.583a1.251,1.251,0,0,0,1.25,1.25h3.75v2.917a1.25,1.25,0,1,0,2.5,0v-4.167A1.251,1.251,0,0,0,70.265,218.341Z" transform="translate(-61.514 -205.008)" />
195
+ </g>
196
+ </g>
197
+ </g>
198
+ </svg>);
199
+
46
200
  case "ui-shopping-bag":
201
+ return (<svg className={["icon", `icon--${name}`, className]
202
+ .filter((className) => !isEmpty(className))
203
+ .join(" ")}
204
+ width={width}
205
+ height={height}
206
+ viewBox="0 0 13.299 14.65"
207
+ >
208
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
209
+ {title && <title>{title}</title>}
210
+ <path id="Path_22" data-name="Path 22" d="M9.135.6A3.523,3.523,0,0,0,5.612,4.123V5.691A2.455,2.455,0,0,0,5,5.869,2.967,2.967,0,0,0,3.842,6.8,6.951,6.951,0,0,0,3,9.393c-.452,2.056-.678,3.083-.392,3.885A2.967,2.967,0,0,0,3.835,14.8c.721.451,1.774.451,3.878.451h2.843c2.1,0,3.157,0,3.878-.451a2.967,2.967,0,0,0,1.223-1.521c.285-.8.059-1.829-.392-3.885a6.951,6.951,0,0,0-.837-2.59,2.967,2.967,0,0,0-1.162-.934,2.456,2.456,0,0,0-.608-.178V4.123A3.523,3.523,0,0,0,9.135.6Zm2.411,5.012V4.123a2.411,2.411,0,0,0-4.821,0V5.612c.287,0,.613,0,.989,0h2.843C10.933,5.607,11.259,5.607,11.546,5.612ZM6.168,8.574a.742.742,0,1,0-.742-.742A.742.742,0,0,0,6.168,8.574Zm6.676-.742A.742.742,0,1,1,12.1,7.09.742.742,0,0,1,12.844,7.832Z" transform="translate(-2.486 -0.6)" fill-rule="evenodd"/>
211
+ </svg>);
212
+
47
213
  case "ui-priority":
214
+ return (<svg className={["icon", `icon--${name}`, className]
215
+ .filter((className) => !isEmpty(className))
216
+ .join(" ")}
217
+ width={width}
218
+ height={height}
219
+ viewBox="0 0 20 17.533"
220
+ >
221
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
222
+ {title && <title>{title}</title>}
223
+ <g id="list-high-priority" transform="translate(-1.5 -2.552)">
224
+ <path id="Path_24" data-name="Path 24" d="M24,39H34v1.333H24Z" transform="translate(-12.5 -20.249)" />
225
+ <path id="Path_25" data-name="Path 25" d="M24,29H34v1.333H24Z" transform="translate(-12.5 -14.694)" />
226
+ <path id="Path_26" data-name="Path 26" d="M24,19H34v1.333H24Z" transform="translate(-12.5 -9.138)" />
227
+ <path id="Path_27" data-name="Path 27" d="M30.75,9h7v1.333h-7Z" transform="translate(-16.25 -3.583)" />
228
+ <path id="Path_28" data-name="Path 28" d="M13.417,6.043,7.8,2.551V5.418H7.551a5.544,5.544,0,0,0-4.326,2.2A8.164,8.164,0,0,0,1.5,12.751a8.164,8.164,0,0,0,1.725,5.133,5.544,5.544,0,0,0,4.326,2.2H9.833V18.751H7.551c-2.6,0-4.718-2.692-4.718-6s2.117-6,4.718-6H7.8V9.635ZM9.133,4.95l1.783,1.109L9.133,7.2Z" />
229
+ </g>
230
+ </svg>);
231
+
48
232
  case "ui-tooltip":
49
- case "ui-tooltip":
233
+ return (<svg className={["icon", `icon--${name}`, className]
234
+ .filter((className) => !isEmpty(className))
235
+ .join(" ")}
236
+ width={width}
237
+ height={height}
238
+ viewBox="0 0 512 512"
239
+ >
240
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
241
+ {title && <title>{title}</title>}
242
+ <path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/>
243
+ </svg>);
244
+
50
245
  case "ui-qsm-location":
246
+ return (<svg className={["icon", `icon--${name}`, className]
247
+ .filter((className) => !isEmpty(className))
248
+ .join(" ")}
249
+ width={width}
250
+ height={height}
251
+ viewBox="0 0 384 512"
252
+ >
253
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
254
+ {title && <title>{title}</title>}
255
+ <path d="M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"/>
256
+ </svg>);
257
+
51
258
  case "ui-plane-depart":
259
+ return (<svg className={["icon", `icon--${name}`, className]
260
+ .filter((className) => !isEmpty(className))
261
+ .join(" ")}
262
+ width={width}
263
+ height={height}
264
+ viewBox="0 0 640 512"
265
+ >
266
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
267
+ {title && <title>{title}</title>}
268
+ <path d="M381 114.9L186.1 41.8c-16.7-6.2-35.2-5.3-51.1 2.7L89.1 67.4C78 73 77.2 88.5 87.6 95.2l146.9 94.5L136 240 77.8 214.1c-8.7-3.9-18.8-3.7-27.3 .6L18.3 230.8c-9.3 4.7-11.8 16.8-5 24.7l73.1 85.3c6.1 7.1 15 11.2 24.3 11.2l137.7 0c5 0 9.9-1.2 14.3-3.4L535.6 212.2c46.5-23.3 82.5-63.3 100.8-112C645.9 75 627.2 48 600.2 48l-57.4 0c-20.2 0-40.2 4.8-58.2 14L381 114.9zM0 480c0 17.7 14.3 32 32 32l576 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L32 448c-17.7 0-32 14.3-32 32z"/>
269
+ </svg>);
270
+
52
271
  case "ui-plane-arrive":
272
+ return (<svg className={["icon", `icon--${name}`, className]
273
+ .filter((className) => !isEmpty(className))
274
+ .join(" ")}
275
+ width={width}
276
+ height={height}
277
+ viewBox="0 0 640 512"
278
+ >
279
+ <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." />
280
+ {title && <title>{title}</title>}
281
+ <path d="M.3 166.9L0 68C0 57.7 9.5 50.1 19.5 52.3l35.6 7.9c10.6 2.3 19.2 9.9 23 20L96 128l127.3 37.6L181.8 20.4C178.9 10.2 186.6 0 197.2 0l40.1 0c11.6 0 22.2 6.2 27.9 16.3l109 193.8 107.2 31.7c15.9 4.7 30.8 12.5 43.7 22.8l34.4 27.6c24 19.2 18.1 57.3-10.7 68.2c-41.2 15.6-86.2 18.1-128.8 7L121.7 289.8c-11.1-2.9-21.2-8.7-29.3-16.9L9.5 189.4c-5.9-6-9.3-14.1-9.3-22.5zM32 448l576 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 512c-17.7 0-32-14.3-32-32s14.3-32 32-32zm96-80a32 32 0 1 1 64 0 32 32 0 1 1 -64 0zm128-16a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/>
282
+ </svg>);
283
+
53
284
  case "ui-clock":
285
+ return (<svg className={["icon", `icon--${name}`, className]
286
+ .filter((className) => !isEmpty(className))
287
+ .join(" ")}
288
+ width={width}
289
+ height={height}
290
+ viewBox="0 0 19 19"
291
+ >
292
+ {/* <HTMLComment text="!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc." /> */}
293
+ {title && <title>{title}</title>}
294
+ <g id="Group_56" data-name="Group 56" transform="translate(-390 -665)">
295
+ <circle id="Ellipse_5" data-name="Ellipse 5" cx="9.5" cy="9.5" r="9.5" transform="translate(390 665)" fill="#fff"/>
296
+ <g id="time" transform="translate(391.211 666.211)">
297
+ <path id="Path_11" data-name="Path 11" d="M8.289,13.578a5.289,5.289,0,1,1,5.289-5.289A5.289,5.289,0,0,1,8.289,13.578Zm0-9.823a4.534,4.534,0,1,0,4.534,4.534A4.534,4.534,0,0,0,8.289,3.756Z" transform="translate(0 0)"/>
298
+ <path id="Path_12" data-name="Path 12" d="M24.612,16.167,22.5,14.055V10.5h.756v3.241l1.889,1.893Z" transform="translate(-14.589 -5.611)"/>
299
+ </g>
300
+ </g>
301
+ </svg>);
302
+
54
303
  default:
55
304
  return null;
56
305
  }
@@ -1,64 +1,64 @@
1
- import React from "react";
2
- import { buildClassName } from "../../shared/utils/class-util";
3
- import { compact } from "lodash";
4
-
5
- interface LabeledInputProps {
6
- name: string;
7
- type?: string;
8
- required?: boolean;
9
- value?: string | number;
10
- defaultValue?: string | number;
11
- min?: string | number;
12
- max?: string | number;
13
- label?: string;
14
- placeholder?: string;
15
- hasError?: boolean;
16
- extraClassName?: string;
17
- onChange?: React.ChangeEventHandler<HTMLInputElement>;
18
- onBlur?: React.FocusEventHandler<HTMLInputElement>;
19
- }
20
-
21
- const LabeledInput: React.FC<LabeledInputProps> = ({
22
- name,
23
- type,
24
- required,
25
- value,
26
- defaultValue,
27
- min,
28
- max,
29
- label,
30
- placeholder,
31
- extraClassName,
32
- hasError,
33
- onChange,
34
- onBlur,
35
- }) => {
36
- return (
37
- <label
38
- className={buildClassName([
39
- "form__group",
40
- extraClassName,
41
- hasError && "form__group--error",
42
- ])}
43
- >
44
- <span className="form__label">
45
- {compact([label, required && "*"]).join(" ")}
46
- </span>
47
- <input
48
- name={name}
49
- type={type ?? "text"}
50
- required={required}
51
- className="form__input"
52
- min={min}
53
- max={max}
54
- placeholder={placeholder}
55
- onChange={onChange}
56
- onBlur={onBlur}
57
- value={value}
58
- defaultValue={defaultValue}
59
- />
60
- </label>
61
- );
62
- };
63
-
64
- export default LabeledInput;
1
+ import React from "react";
2
+ import { buildClassName } from "../../shared/utils/class-util";
3
+ import { compact } from "lodash";
4
+
5
+ interface LabeledInputProps {
6
+ name: string;
7
+ type?: string;
8
+ required?: boolean;
9
+ value?: string | number;
10
+ defaultValue?: string | number;
11
+ min?: string | number;
12
+ max?: string | number;
13
+ label?: string;
14
+ placeholder?: string;
15
+ hasError?: boolean;
16
+ extraClassName?: string;
17
+ onChange?: React.ChangeEventHandler<HTMLInputElement>;
18
+ onBlur?: React.FocusEventHandler<HTMLInputElement>;
19
+ }
20
+
21
+ const LabeledInput: React.FC<LabeledInputProps> = ({
22
+ name,
23
+ type,
24
+ required,
25
+ value,
26
+ defaultValue,
27
+ min,
28
+ max,
29
+ label,
30
+ placeholder,
31
+ extraClassName,
32
+ hasError,
33
+ onChange,
34
+ onBlur,
35
+ }) => {
36
+ return (
37
+ <label
38
+ className={buildClassName([
39
+ "form__group",
40
+ extraClassName,
41
+ hasError && "form__group--error",
42
+ ])}
43
+ >
44
+ <span className="form__label">
45
+ {compact([label, required && "*"]).join(" ")}
46
+ </span>
47
+ <input
48
+ name={name}
49
+ type={type ?? "text"}
50
+ required={required}
51
+ className="form__input"
52
+ min={min}
53
+ max={max}
54
+ placeholder={placeholder}
55
+ onChange={onChange}
56
+ onBlur={onBlur}
57
+ value={value}
58
+ defaultValue={defaultValue}
59
+ />
60
+ </label>
61
+ );
62
+ };
63
+
64
+ export default LabeledInput;