@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com's products.
134 lines (133 loc) • 5.38 kB
JavaScript
"use client";
import * as React from "react";
import cx from "clsx";
import HorizontalScroll from "../../../HorizontalScroll";
import ChevronUp from "../../../icons/ChevronUp";
import ChevronDown from "../../../icons/ChevronDown";
import Stack from "../../../Stack";
import ItineraryText from "../../ItineraryText";
import Text from "../../../Text";
import Slide from "../../../utils/Slide";
import useBoundingRect from "../../../hooks/useBoundingRect";
import { useRandomIdSeed } from "../../../hooks/useRandomId";
import { usePart } from "../context";
import { useItinerarySegmentMinimalColumnWidth } from "../../context";
import AirplaneDown from "../../../icons/AirplaneDown";
import ItineraryIcon from "../ItineraryIcon";
import useTheme from "../../../hooks/useTheme";
import { spaceAfterClasses } from "../../../common/tailwind";
const ItinerarySegmentDetail = ({
duration,
summary,
content,
icon = /*#__PURE__*/React.createElement(AirplaneDown, {
size: "small",
ariaHidden: true
})
}) => {
const {
opened
} = usePart();
const {
itinerarySegmentMinimalColumnWidth
} = useItinerarySegmentMinimalColumnWidth();
const theme = useTheme();
const [{
height: slideHeight
}, slideRef] = useBoundingRect({
height: opened ? null : 0
});
const randomId = useRandomIdSeed();
return /*#__PURE__*/React.createElement("div", {
className: "orbit-itinerary-segment-detail relative box-border w-full px-0 py-[10px]"
}, /*#__PURE__*/React.createElement("div", {
className: "px-300 py-0"
}, /*#__PURE__*/React.createElement(Stack, {
align: "center",
spacing: "300"
}, /*#__PURE__*/React.createElement("div", {
className: "flex justify-end",
style: {
minWidth: `${itinerarySegmentMinimalColumnWidth || 60}px`
}
}, /*#__PURE__*/React.createElement(ItineraryText, {
as: "div",
size: "small",
weight: "medium"
}, duration)), /*#__PURE__*/React.createElement("div", {
className: "z-default bg-transparent"
}, /*#__PURE__*/React.createElement(ItineraryIcon, null, icon)), /*#__PURE__*/React.createElement("div", {
className: "flex w-full items-center overflow-hidden"
}, /*#__PURE__*/React.createElement(HorizontalScroll, {
overflowElevation: true,
elevationColor: "paletteWhite",
scrollSnap: "mandatory"
}, summary)), content && (opened ? /*#__PURE__*/React.createElement(ChevronUp, {
color: "secondary",
ariaHidden: true
}) : /*#__PURE__*/React.createElement(ChevronDown, {
color: "secondary",
ariaHidden: true
})))), content && /*#__PURE__*/React.createElement(Slide, {
maxHeight: slideHeight || 0,
expanded: opened,
id: randomId("slide"),
ariaLabelledBy: randomId("slide"),
stopClickPropagation: false
}, /*#__PURE__*/React.createElement("div", {
className: "pt-300 cursor-pointer overflow-hidden",
ref: slideRef
}, /*#__PURE__*/React.createElement("div", {
className: "px-300 z-default relative py-0",
style: {
insetInlineStart: `${parseInt(theme.orbit.space200, 10) + itinerarySegmentMinimalColumnWidth}px`
}
}, content.map(({
title,
items
}, idx) => {
return /*#__PURE__*/React.createElement(React.Fragment, {
key: typeof title === "string" ? title : idx
}, /*#__PURE__*/React.createElement("div", {
className: "ms-800"
}, /*#__PURE__*/React.createElement(ItineraryText, {
as: "div",
size: "small",
weight: "medium",
spaceAfter: "small"
}, title)), /*#__PURE__*/React.createElement("div", {
className: cx("flex flex-col items-center", idx === content.length - 1 ? spaceAfterClasses.none : spaceAfterClasses.medium),
style: {
width: `calc(100% - ${parseInt(theme.orbit.space200, 10) + itinerarySegmentMinimalColumnWidth}px)`
}
}, items.map(({
icon: itemIcon,
name,
value
}, id) => {
const isFirst = id === 0;
const isLast = id === items.length - 1;
const key = typeof name === "string" && typeof value === "string" ? `${name}-${value}` : id;
return /*#__PURE__*/React.createElement(Stack, {
flex: true,
grow: false,
align: "center",
key: key
}, /*#__PURE__*/React.createElement("div", {
className: cx("px-100 relative z-[3] box-border flex items-center self-stretch", "after:-z-default after:bg-white-normal after:border-x-cloud-normal-active after:absolute after:left-0 after:box-border after:size-full after:border-x after:border-solid", isFirst || isLast ? "py-0" : "py-100", isFirst && "[&_svg]:mt-200 [&_svg]:mb-100 after:border-t-cloud-normal-active after:rounded-b-none after:rounded-t-full after:border after:border-b-0", isLast && "[&_svg]:mt-100 [&_svg]:mb-200 after:border-b-cloud-normal-active after:rounded-b-full after:rounded-t-none after:border after:border-t-0")
}, itemIcon), /*#__PURE__*/React.createElement("div", {
className: "flex-1 text-wrap break-words"
}, /*#__PURE__*/React.createElement(Text, {
size: "small"
}, name)), /*#__PURE__*/React.createElement("div", {
className: "grow-0 text-wrap break-all"
}, /*#__PURE__*/React.createElement(ItineraryText, {
as: "div",
size: "small",
weight: "medium",
align: "end"
}, value)));
})));
})))));
};
export default ItinerarySegmentDetail;